Loading packages/SystemUI/aconfig/systemui.aconfig +10 −0 Original line number Original line Diff line number Diff line Loading @@ -588,6 +588,16 @@ flag { } } } } flag { name: "clipboard_use_description_mimetype" namespace: "systemui" description: "Read item mimetype from description rather than checking URI" bug: "357197236" metadata { purpose: PURPOSE_BUGFIX } } flag { flag { name: "screenshot_action_dismiss_system_windows" name: "screenshot_action_dismiss_system_windows" namespace: "systemui" namespace: "systemui" Loading packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardModel.kt +17 −8 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.text.TextUtils import android.util.Log import android.util.Log import android.util.Size import android.util.Size import android.view.textclassifier.TextLinks import android.view.textclassifier.TextLinks import com.android.systemui.Flags.clipboardUseDescriptionMimetype import com.android.systemui.res.R import com.android.systemui.res.R import java.io.IOException import java.io.IOException Loading Loading @@ -70,11 +71,11 @@ data class ClipboardModel( context: Context, context: Context, utils: ClipboardOverlayUtils, utils: ClipboardOverlayUtils, clipData: ClipData, clipData: ClipData, source: String source: String, ): ClipboardModel { ): ClipboardModel { val sensitive = clipData.description?.extras?.getBoolean(EXTRA_IS_SENSITIVE) ?: false val sensitive = clipData.description?.extras?.getBoolean(EXTRA_IS_SENSITIVE) ?: false val item = clipData.getItemAt(0)!! val item = clipData.getItemAt(0)!! val type = getType(context, item) val type = getType(context, item, clipData.description.getMimeType(0)) val remote = utils.isRemoteCopy(context, clipData, source) val remote = utils.isRemoteCopy(context, clipData, source) return ClipboardModel( return ClipboardModel( clipData, clipData, Loading @@ -84,19 +85,27 @@ data class ClipboardModel( item.textLinks, item.textLinks, item.uri, item.uri, sensitive, sensitive, remote remote, ) ) } } private fun getType(context: Context, item: ClipData.Item): Type { private fun getType(context: Context, item: ClipData.Item, mimeType: String): Type { return if (!TextUtils.isEmpty(item.text)) { return if (!TextUtils.isEmpty(item.text)) { Type.TEXT Type.TEXT } else if (item.uri != null) { } else if (item.uri != null) { if (clipboardUseDescriptionMimetype()) { if (mimeType.startsWith("image")) { Type.IMAGE } else { Type.URI } } else { if (context.contentResolver.getType(item.uri)?.startsWith("image") == true) { if (context.contentResolver.getType(item.uri)?.startsWith("image") == true) { Type.IMAGE Type.IMAGE } else { } else { Type.URI Type.URI } } } } else { } else { Type.OTHER Type.OTHER } } Loading @@ -107,6 +116,6 @@ data class ClipboardModel( TEXT, TEXT, IMAGE, IMAGE, URI, URI, OTHER OTHER, } } } } packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardModelTest.kt +21 −2 Original line number Original line Diff line number Diff line Loading @@ -22,10 +22,12 @@ import android.content.Context import android.graphics.Bitmap import android.graphics.Bitmap import android.net.Uri import android.net.Uri import android.os.PersistableBundle import android.os.PersistableBundle import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest import com.android.systemui.Flags.FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase import com.android.systemui.util.mockito.whenever import java.io.IOException import java.io.IOException import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse Loading @@ -37,6 +39,7 @@ import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.any import org.mockito.ArgumentMatchers.any import org.mockito.Mock import org.mockito.Mock import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations import org.mockito.kotlin.whenever @SmallTest @SmallTest @RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class) Loading Loading @@ -88,7 +91,8 @@ class ClipboardModelTest : SysuiTestCase() { @Test @Test @Throws(IOException::class) @Throws(IOException::class) fun test_imageClipData() { @DisableFlags(FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE) fun test_imageClipData_legacy() { val testBitmap = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888) val testBitmap = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888) whenever(mMockContext.contentResolver).thenReturn(mMockContentResolver) whenever(mMockContext.contentResolver).thenReturn(mMockContentResolver) whenever(mMockContext.resources).thenReturn(mContext.resources) whenever(mMockContext.resources).thenReturn(mContext.resources) Loading @@ -101,6 +105,21 @@ class ClipboardModelTest : SysuiTestCase() { assertEquals(testBitmap, model.loadThumbnail(mMockContext)) assertEquals(testBitmap, model.loadThumbnail(mMockContext)) } } @Test @Throws(IOException::class) @EnableFlags(FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE) fun test_imageClipData() { val testBitmap = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888) whenever(mMockContext.contentResolver).thenReturn(mMockContentResolver) whenever(mMockContext.resources).thenReturn(mContext.resources) whenever(mMockContentResolver.loadThumbnail(any(), any(), any())).thenReturn(testBitmap) whenever(mMockContentResolver.getType(any())).thenReturn("text") val imageClipData = ClipData("Test", arrayOf("image/png"), ClipData.Item(Uri.parse("test"))) val model = ClipboardModel.fromClipData(mMockContext, mClipboardUtils, imageClipData, "") assertEquals(ClipboardModel.Type.IMAGE, model.type) assertEquals(testBitmap, model.loadThumbnail(mMockContext)) } @Test @Test @Throws(IOException::class) @Throws(IOException::class) fun test_imageClipData_loadFailure() { fun test_imageClipData_loadFailure() { Loading Loading
packages/SystemUI/aconfig/systemui.aconfig +10 −0 Original line number Original line Diff line number Diff line Loading @@ -588,6 +588,16 @@ flag { } } } } flag { name: "clipboard_use_description_mimetype" namespace: "systemui" description: "Read item mimetype from description rather than checking URI" bug: "357197236" metadata { purpose: PURPOSE_BUGFIX } } flag { flag { name: "screenshot_action_dismiss_system_windows" name: "screenshot_action_dismiss_system_windows" namespace: "systemui" namespace: "systemui" Loading
packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardModel.kt +17 −8 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.text.TextUtils import android.util.Log import android.util.Log import android.util.Size import android.util.Size import android.view.textclassifier.TextLinks import android.view.textclassifier.TextLinks import com.android.systemui.Flags.clipboardUseDescriptionMimetype import com.android.systemui.res.R import com.android.systemui.res.R import java.io.IOException import java.io.IOException Loading Loading @@ -70,11 +71,11 @@ data class ClipboardModel( context: Context, context: Context, utils: ClipboardOverlayUtils, utils: ClipboardOverlayUtils, clipData: ClipData, clipData: ClipData, source: String source: String, ): ClipboardModel { ): ClipboardModel { val sensitive = clipData.description?.extras?.getBoolean(EXTRA_IS_SENSITIVE) ?: false val sensitive = clipData.description?.extras?.getBoolean(EXTRA_IS_SENSITIVE) ?: false val item = clipData.getItemAt(0)!! val item = clipData.getItemAt(0)!! val type = getType(context, item) val type = getType(context, item, clipData.description.getMimeType(0)) val remote = utils.isRemoteCopy(context, clipData, source) val remote = utils.isRemoteCopy(context, clipData, source) return ClipboardModel( return ClipboardModel( clipData, clipData, Loading @@ -84,19 +85,27 @@ data class ClipboardModel( item.textLinks, item.textLinks, item.uri, item.uri, sensitive, sensitive, remote remote, ) ) } } private fun getType(context: Context, item: ClipData.Item): Type { private fun getType(context: Context, item: ClipData.Item, mimeType: String): Type { return if (!TextUtils.isEmpty(item.text)) { return if (!TextUtils.isEmpty(item.text)) { Type.TEXT Type.TEXT } else if (item.uri != null) { } else if (item.uri != null) { if (clipboardUseDescriptionMimetype()) { if (mimeType.startsWith("image")) { Type.IMAGE } else { Type.URI } } else { if (context.contentResolver.getType(item.uri)?.startsWith("image") == true) { if (context.contentResolver.getType(item.uri)?.startsWith("image") == true) { Type.IMAGE Type.IMAGE } else { } else { Type.URI Type.URI } } } } else { } else { Type.OTHER Type.OTHER } } Loading @@ -107,6 +116,6 @@ data class ClipboardModel( TEXT, TEXT, IMAGE, IMAGE, URI, URI, OTHER OTHER, } } } }
packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardModelTest.kt +21 −2 Original line number Original line Diff line number Diff line Loading @@ -22,10 +22,12 @@ import android.content.Context import android.graphics.Bitmap import android.graphics.Bitmap import android.net.Uri import android.net.Uri import android.os.PersistableBundle import android.os.PersistableBundle import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest import com.android.systemui.Flags.FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase import com.android.systemui.util.mockito.whenever import java.io.IOException import java.io.IOException import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse Loading @@ -37,6 +39,7 @@ import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.any import org.mockito.ArgumentMatchers.any import org.mockito.Mock import org.mockito.Mock import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations import org.mockito.kotlin.whenever @SmallTest @SmallTest @RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class) Loading Loading @@ -88,7 +91,8 @@ class ClipboardModelTest : SysuiTestCase() { @Test @Test @Throws(IOException::class) @Throws(IOException::class) fun test_imageClipData() { @DisableFlags(FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE) fun test_imageClipData_legacy() { val testBitmap = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888) val testBitmap = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888) whenever(mMockContext.contentResolver).thenReturn(mMockContentResolver) whenever(mMockContext.contentResolver).thenReturn(mMockContentResolver) whenever(mMockContext.resources).thenReturn(mContext.resources) whenever(mMockContext.resources).thenReturn(mContext.resources) Loading @@ -101,6 +105,21 @@ class ClipboardModelTest : SysuiTestCase() { assertEquals(testBitmap, model.loadThumbnail(mMockContext)) assertEquals(testBitmap, model.loadThumbnail(mMockContext)) } } @Test @Throws(IOException::class) @EnableFlags(FLAG_CLIPBOARD_USE_DESCRIPTION_MIMETYPE) fun test_imageClipData() { val testBitmap = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888) whenever(mMockContext.contentResolver).thenReturn(mMockContentResolver) whenever(mMockContext.resources).thenReturn(mContext.resources) whenever(mMockContentResolver.loadThumbnail(any(), any(), any())).thenReturn(testBitmap) whenever(mMockContentResolver.getType(any())).thenReturn("text") val imageClipData = ClipData("Test", arrayOf("image/png"), ClipData.Item(Uri.parse("test"))) val model = ClipboardModel.fromClipData(mMockContext, mClipboardUtils, imageClipData, "") assertEquals(ClipboardModel.Type.IMAGE, model.type) assertEquals(testBitmap, model.loadThumbnail(mMockContext)) } @Test @Test @Throws(IOException::class) @Throws(IOException::class) fun test_imageClipData_loadFailure() { fun test_imageClipData_loadFailure() { Loading