From 90bddf71b63f5082c4ec9e697b0baaacb5f81ecd Mon Sep 17 00:00:00 2001 From: Andrey Epin Date: Thu, 9 May 2024 12:08:06 -0700 Subject: Add support for preview size columns in the additional content query. Add support for MediaStore WIDTH and HEIGHT columns in the additional content query reponse. Parse those columns if they are present but do not actually use the values (yet). Bug: 339679442 Test: atest IntentResolver-tests-unit Test: atest IntentResolver-tests-activity Change-Id: I2a3ebc2c166d1cb9203824b2ac1bf0f9c4ec76da --- .../domain/cursor/CursorResolverKosmos.kt | 4 +- .../contentpreview/CursorReadSizeTest.kt | 71 ++++++++++++++ .../cursor/PayloadToggleCursorResolverTest.kt | 106 +++++++++++++++++++++ .../interactor/CursorPreviewsInteractorTest.kt | 6 +- .../interactor/FetchPreviewsInteractorTest.kt | 7 +- 5 files changed, 187 insertions(+), 7 deletions(-) create mode 100644 tests/unit/src/com/android/intentresolver/contentpreview/CursorReadSizeTest.kt create mode 100644 tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/cursor/PayloadToggleCursorResolverTest.kt (limited to 'tests') diff --git a/tests/shared/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/cursor/CursorResolverKosmos.kt b/tests/shared/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/cursor/CursorResolverKosmos.kt index 10b89c71..d53210bd 100644 --- a/tests/shared/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/cursor/CursorResolverKosmos.kt +++ b/tests/shared/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/cursor/CursorResolverKosmos.kt @@ -16,13 +16,13 @@ package com.android.intentresolver.contentpreview.payloadtoggle.domain.cursor -import android.net.Uri import com.android.intentresolver.contentResolver +import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.CursorRow import com.android.intentresolver.inject.additionalContentUri import com.android.intentresolver.inject.chooserIntent import com.android.systemui.kosmos.Kosmos -var Kosmos.payloadToggleCursorResolver: CursorResolver by +var Kosmos.payloadToggleCursorResolver: CursorResolver by Kosmos.Fixture { payloadToggleCursorResolverImpl } val Kosmos.payloadToggleCursorResolverImpl get() = diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/CursorReadSizeTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/CursorReadSizeTest.kt new file mode 100644 index 00000000..0c346095 --- /dev/null +++ b/tests/unit/src/com/android/intentresolver/contentpreview/CursorReadSizeTest.kt @@ -0,0 +1,71 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.intentresolver.contentpreview + +import android.database.MatrixCursor +import android.provider.MediaStore.MediaColumns.HEIGHT +import android.provider.MediaStore.MediaColumns.WIDTH +import android.util.Size +import com.google.common.truth.Truth.assertThat +import com.google.common.truth.Truth.assertWithMessage +import kotlinx.coroutines.test.runTest +import org.junit.Test + +class CursorReadSizeTest { + @Test + fun missingSizeColumns() { + val cursor = MatrixCursor(arrayOf("column")).apply { addRow(arrayOf("abc")) } + cursor.moveToFirst() + + assertThat(cursor.readSize()).isNull() + } + + @Test + fun testIncorrectSizeValues() = runTest { + val cursor = + MatrixCursor(arrayOf(WIDTH, HEIGHT)).apply { + addRow(arrayOf(null, null)) + addRow(arrayOf("100", null)) + addRow(arrayOf(null, "100")) + addRow(arrayOf("-100", "100")) + addRow(arrayOf("100", "-100")) + addRow(arrayOf("100", "abc")) + addRow(arrayOf("abc", "100")) + } + + var i = 0 + while (cursor.moveToNext()) { + i++ + assertWithMessage("Row $i").that(cursor.readSize()).isNull() + } + } + + @Test + fun testCorrectSizeValues() = runTest { + val cursor = + MatrixCursor(arrayOf(HEIGHT, WIDTH)).apply { + addRow(arrayOf("100", 0)) + addRow(arrayOf("100", "50")) + } + + cursor.moveToNext() + assertThat(cursor.readSize()).isEqualTo(Size(0, 100)) + + cursor.moveToNext() + assertThat(cursor.readSize()).isEqualTo(Size(50, 100)) + } +} diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/cursor/PayloadToggleCursorResolverTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/cursor/PayloadToggleCursorResolverTest.kt new file mode 100644 index 00000000..9eaee233 --- /dev/null +++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/cursor/PayloadToggleCursorResolverTest.kt @@ -0,0 +1,106 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.intentresolver.contentpreview.payloadtoggle.domain.cursor + +import android.content.ContentInterface +import android.content.Intent +import android.database.MatrixCursor +import android.net.Uri +import android.provider.MediaStore.MediaColumns.HEIGHT +import android.provider.MediaStore.MediaColumns.WIDTH +import android.service.chooser.AdditionalContentContract.Columns.URI +import android.util.Size +import com.android.intentresolver.util.cursor.get +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.eq +import org.mockito.kotlin.mock + +class PayloadToggleCursorResolverTest { + private val cursorUri = Uri.parse("content://org.pkg.app.extra") + private val chooserIntent = Intent() + + @Test + fun missingSizeColumns() = runTest { + val uri = createUri(1) + val sourceCursor = + MatrixCursor(arrayOf(URI)).apply { + addRow(arrayOf(uri.toString())) + addRow( + arrayOf( + cursorUri.buildUpon().appendPath("should-be-ignored.png").build().toString() + ) + ) + addRow(arrayOf(null)) + } + val fakeContentProvider = + mock { + on { query(eq(cursorUri), any(), any(), any()) } doReturn sourceCursor + } + val testSubject = + PayloadToggleCursorResolver( + fakeContentProvider, + cursorUri, + chooserIntent, + ) + + val cursor = testSubject.getCursor() + assertThat(cursor).isNotNull() + assertThat(cursor!!.count).isEqualTo(3) + cursor[0].let { row -> + assertThat(row).isNotNull() + assertThat(row!!.uri).isEqualTo(uri) + assertThat(row.previewSize).isNull() + } + assertThat(cursor[1]).isNull() + assertThat(cursor[2]).isNull() + } + + @Test + fun testCorrectSizeValues() = runTest { + val uri = createUri(1) + val sourceCursor = + MatrixCursor(arrayOf(URI, WIDTH, HEIGHT)).apply { + addRow(arrayOf(uri.toString(), "100", "50")) + } + val fakeContentProvider = + mock { + on { query(eq(cursorUri), any(), any(), any()) } doReturn sourceCursor + } + val testSubject = + PayloadToggleCursorResolver( + fakeContentProvider, + cursorUri, + chooserIntent, + ) + + val cursor = testSubject.getCursor() + assertThat(cursor).isNotNull() + assertThat(cursor!!.count).isEqualTo(1) + + cursor[0].let { row -> + assertThat(row).isNotNull() + assertThat(row!!.uri).isEqualTo(uri) + assertThat(row.previewSize).isEqualTo(Size(100, 50)) + } + } +} + +private fun createUri(id: Int) = Uri.parse("content://org.pkg/app/img-$id.png") diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractorTest.kt index af6de833..81e6b77d 100644 --- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractorTest.kt +++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractorTest.kt @@ -24,9 +24,11 @@ import androidx.core.os.bundleOf import com.android.intentresolver.contentpreview.FileInfo import com.android.intentresolver.contentpreview.UriMetadataReader import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.cursorPreviewsRepository +import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.CursorRow import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewModel import com.android.intentresolver.contentpreview.uriMetadataReader import com.android.intentresolver.util.KosmosTestScope +import com.android.intentresolver.util.cursor.CursorView import com.android.intentresolver.util.cursor.viewBy import com.android.intentresolver.util.runTest import com.android.systemui.kosmos.Kosmos @@ -70,7 +72,7 @@ class CursorPreviewsInteractorTest { private val cursorRange: Iterable, private val cursorStartPosition: Int, ) { - val cursor = + val cursor: CursorView = MatrixCursor(arrayOf("uri")) .apply { extras = bundleOf("position" to cursorStartPosition) @@ -78,7 +80,7 @@ class CursorPreviewsInteractorTest { newRow().add("uri", uri(i).toString()) } } - .viewBy { getString(0)?.let(Uri::parse) } + .viewBy { getString(0)?.let { uriStr -> CursorRow(Uri.parse(uriStr), null) } } val initialPreviews: List = initialSelectionRange.map { i -> PreviewModel(uri = uri(i), mimeType = "image/bitmap") } diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractorTest.kt index f012fcc6..da73f4cf 100644 --- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractorTest.kt +++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractorTest.kt @@ -26,6 +26,7 @@ import com.android.intentresolver.contentpreview.UriMetadataReader import com.android.intentresolver.contentpreview.payloadtoggle.data.repository.cursorPreviewsRepository import com.android.intentresolver.contentpreview.payloadtoggle.domain.cursor.CursorResolver import com.android.intentresolver.contentpreview.payloadtoggle.domain.cursor.payloadToggleCursorResolver +import com.android.intentresolver.contentpreview.payloadtoggle.domain.model.CursorRow import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewModel import com.android.intentresolver.contentpreview.payloadtoggle.shared.model.PreviewsModel import com.android.intentresolver.contentpreview.uriMetadataReader @@ -74,12 +75,12 @@ class FetchPreviewsInteractorTest { private class FakeCursorResolver( private val cursorRange: Iterable, private val cursorStartPosition: Int, - ) : CursorResolver { + ) : CursorResolver { private val mutex = Mutex(locked = true) fun complete() = mutex.unlock() - override suspend fun getCursor(): CursorView = + override suspend fun getCursor(): CursorView = mutex.withLock { MatrixCursor(arrayOf("uri")) .apply { @@ -88,7 +89,7 @@ class FetchPreviewsInteractorTest { newRow().add("uri", uri(i).toString()) } } - .viewBy { getString(0)?.let(Uri::parse) } + .viewBy { getString(0)?.let(Uri::parse)?.let { CursorRow(it, null) } } } } -- cgit v1.2.3-59-g8ed1b