1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.systemui.clipboardoverlay 17 18 import android.content.ClipData 19 import android.content.ClipDescription 20 import android.content.ContentResolver 21 import android.content.Context 22 import android.graphics.Bitmap 23 import android.net.Uri 24 import android.os.PersistableBundle 25 import android.platform.test.annotations.DisableFlags 26 import android.platform.test.annotations.EnableFlags 27 import androidx.test.ext.junit.runners.AndroidJUnit4 28 import androidx.test.filters.SmallTest 29 import com.android.systemui.Flags.FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE 30 import com.android.systemui.SysuiTestCase 31 import java.io.IOException 32 import org.junit.Assert.assertEquals 33 import org.junit.Assert.assertFalse 34 import org.junit.Assert.assertNull 35 import org.junit.Assert.assertTrue 36 import org.junit.Before 37 import org.junit.Test 38 import org.junit.runner.RunWith 39 import org.mockito.ArgumentMatchers.any 40 import org.mockito.Mock 41 import org.mockito.MockitoAnnotations 42 import org.mockito.kotlin.whenever 43 44 @SmallTest 45 @RunWith(AndroidJUnit4::class) 46 class ClipboardModelTest : SysuiTestCase() { 47 @Mock private lateinit var mClipboardUtils: ClipboardOverlayUtils 48 @Mock private lateinit var mMockContext: Context 49 @Mock private lateinit var mMockContentResolver: ContentResolver 50 private lateinit var mSampleClipData: ClipData 51 52 @Before setupnull53 fun setup() { 54 MockitoAnnotations.initMocks(this) 55 mSampleClipData = ClipData("Test", arrayOf("text/plain"), ClipData.Item("Test Item")) 56 } 57 58 @Test test_textClipDatanull59 fun test_textClipData() { 60 val source = "test source" 61 val model = ClipboardModel.fromClipData(mContext, mClipboardUtils, mSampleClipData, source) 62 assertEquals(mSampleClipData, model.clipData) 63 assertEquals(source, model.source) 64 assertEquals(ClipboardModel.Type.TEXT, model.type) 65 assertEquals(mSampleClipData.getItemAt(0).text, model.text) 66 assertEquals(mSampleClipData.getItemAt(0).textLinks, model.textLinks) 67 assertEquals(mSampleClipData.getItemAt(0).uri, model.uri) 68 assertFalse(model.isSensitive) 69 assertFalse(model.isRemote) 70 assertNull(model.loadThumbnail(mContext)) 71 } 72 73 @Test test_sensitiveExtranull74 fun test_sensitiveExtra() { 75 val description = mSampleClipData.description 76 val b = PersistableBundle() 77 b.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true) 78 description.extras = b 79 val data = ClipData(description, mSampleClipData.getItemAt(0)) 80 val (_, _, _, _, _, _, sensitive) = 81 ClipboardModel.fromClipData(mContext, mClipboardUtils, data, "") 82 assertTrue(sensitive) 83 } 84 85 @Test test_remoteExtranull86 fun test_remoteExtra() { 87 whenever(mClipboardUtils.isRemoteCopy(any(), any(), any())).thenReturn(true) 88 val model = ClipboardModel.fromClipData(mContext, mClipboardUtils, mSampleClipData, "") 89 assertTrue(model.isRemote) 90 } 91 92 @Test 93 @Throws(IOException::class) 94 @DisableFlags(FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE) test_imageClipData_legacynull95 fun test_imageClipData_legacy() { 96 val testBitmap = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888) 97 whenever(mMockContext.contentResolver).thenReturn(mMockContentResolver) 98 whenever(mMockContext.resources).thenReturn(mContext.resources) 99 whenever(mMockContentResolver.loadThumbnail(any(), any(), any())).thenReturn(testBitmap) 100 whenever(mMockContentResolver.getType(any())).thenReturn("image") 101 val imageClipData = 102 ClipData("Test", arrayOf("text/plain"), ClipData.Item(Uri.parse("test"))) 103 val model = ClipboardModel.fromClipData(mMockContext, mClipboardUtils, imageClipData, "") 104 assertEquals(ClipboardModel.Type.IMAGE, model.type) 105 assertEquals(testBitmap, model.loadThumbnail(mMockContext)) 106 } 107 108 @Test 109 @Throws(IOException::class) 110 @EnableFlags(FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE) test_imageClipDatanull111 fun test_imageClipData() { 112 val testBitmap = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888) 113 whenever(mMockContext.contentResolver).thenReturn(mMockContentResolver) 114 whenever(mMockContext.resources).thenReturn(mContext.resources) 115 whenever(mMockContentResolver.loadThumbnail(any(), any(), any())).thenReturn(testBitmap) 116 whenever(mMockContentResolver.getType(any())).thenReturn("text") 117 val imageClipData = ClipData("Test", arrayOf("image/png"), ClipData.Item(Uri.parse("test"))) 118 val model = ClipboardModel.fromClipData(mMockContext, mClipboardUtils, imageClipData, "") 119 assertEquals(ClipboardModel.Type.IMAGE, model.type) 120 assertEquals(testBitmap, model.loadThumbnail(mMockContext)) 121 } 122 123 @Test 124 @Throws(IOException::class) 125 @DisableFlags(FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE) test_imageClipData_loadFailurenull126 fun test_imageClipData_loadFailure() { 127 whenever(mMockContext.contentResolver).thenReturn(mMockContentResolver) 128 whenever(mMockContext.resources).thenReturn(mContext.resources) 129 whenever(mMockContentResolver.loadThumbnail(any(), any(), any())).thenThrow(IOException()) 130 whenever(mMockContentResolver.getType(any())).thenReturn("image") 131 val imageClipData = 132 ClipData("Test", arrayOf("text/plain"), ClipData.Item(Uri.parse("test"))) 133 val model = ClipboardModel.fromClipData(mMockContext, mClipboardUtils, imageClipData, "") 134 assertEquals(ClipboardModel.Type.IMAGE, model.type) 135 assertNull(model.loadThumbnail(mMockContext)) 136 } 137 } 138