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