summaryrefslogtreecommitdiff
path: root/java/tests
diff options
context:
space:
mode:
author Andrey Epin <ayepin@google.com> 2023-08-08 20:43:32 -0700
committer Andrey Epin <ayepin@google.com> 2023-08-15 21:31:27 +0000
commit3864b3fb003144dad57924ae0143fa5a4df6c849 (patch)
treee469bb9fbba2e1dbecc1f44c657e80a1d174114f /java/tests
parente3360fa4f978bdea5a974189b72949a79c148d22 (diff)
Add loading state to the image preview UI
Preview headline loading label is based on the target intent's mime type. Circular indeterminated indicator gets shown for loading previews. Bug: 292157413 Test: manual testing with ShareTest app; unit tests. Change-Id: I55ec1036a65720fa73c18828fc7a7686de70fa57
Diffstat (limited to 'java/tests')
-rw-r--r--java/tests/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUiTest.kt152
-rw-r--r--java/tests/src/com/android/intentresolver/widget/BatchPreviewLoaderTest.kt19
2 files changed, 155 insertions, 16 deletions
diff --git a/java/tests/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUiTest.kt b/java/tests/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUiTest.kt
new file mode 100644
index 00000000..08331209
--- /dev/null
+++ b/java/tests/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUiTest.kt
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2023 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.net.Uri
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
+import com.android.intentresolver.R.layout.chooser_grid
+import com.android.intentresolver.mock
+import com.android.intentresolver.whenever
+import com.android.intentresolver.widget.ImagePreviewView.TransitionElementStatusCallback
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.anyInt
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+
+@RunWith(AndroidJUnit4::class)
+class UnifiedContentPreviewUiTest {
+ private val actionFactory =
+ mock<ChooserContentPreviewUi.ActionFactory> {
+ whenever(createCustomActions()).thenReturn(emptyList())
+ }
+ private val imageLoader = mock<ImageLoader>()
+ private val headlineGenerator =
+ mock<HeadlineGenerator> {
+ whenever(getImagesHeadline(anyInt())).thenReturn("Image Headline")
+ whenever(getVideosHeadline(anyInt())).thenReturn("Video Headline")
+ whenever(getFilesHeadline(anyInt())).thenReturn("Files Headline")
+ }
+
+ private val context
+ get() = getInstrumentation().getContext()
+
+ @Test
+ fun test_displayImagesWithoutUriMetadata_showImagesHeadline() {
+ testLoadingHeadline("image/*", files = null)
+
+ verify(headlineGenerator, times(1)).getImagesHeadline(2)
+ }
+
+ @Test
+ fun test_displayVideosWithoutUriMetadata_showImagesHeadline() {
+ testLoadingHeadline("video/*", files = null)
+
+ verify(headlineGenerator, times(1)).getVideosHeadline(2)
+ }
+
+ @Test
+ fun test_displayDocumentsWithoutUriMetadata_showImagesHeadline() {
+ testLoadingHeadline("application/pdf", files = null)
+
+ verify(headlineGenerator, times(1)).getFilesHeadline(2)
+ }
+
+ @Test
+ fun test_displayMixedContentWithoutUriMetadata_showImagesHeadline() {
+ testLoadingHeadline("*/*", files = null)
+
+ verify(headlineGenerator, times(1)).getFilesHeadline(2)
+ }
+
+ @Test
+ fun test_displayImagesWithUriMetadataSet_showImagesHeadline() {
+ val uri = Uri.parse("content://pkg.app/image.png")
+ val files =
+ listOf(
+ FileInfo.Builder(uri).withMimeType("image/png").build(),
+ FileInfo.Builder(uri).withMimeType("image/jpeg").build(),
+ )
+ testLoadingHeadline("image/*", files)
+
+ verify(headlineGenerator, times(1)).getImagesHeadline(2)
+ }
+
+ @Test
+ fun test_displayVideosWithUriMetadataSet_showImagesHeadline() {
+ val uri = Uri.parse("content://pkg.app/image.png")
+ val files =
+ listOf(
+ FileInfo.Builder(uri).withMimeType("video/mp4").build(),
+ FileInfo.Builder(uri).withMimeType("video/mp4").build(),
+ )
+ testLoadingHeadline("video/*", files)
+
+ verify(headlineGenerator, times(1)).getVideosHeadline(2)
+ }
+
+ @Test
+ fun test_displayImagesAndVideosWithUriMetadataSet_showImagesHeadline() {
+ val uri = Uri.parse("content://pkg.app/image.png")
+ val files =
+ listOf(
+ FileInfo.Builder(uri).withMimeType("image/png").build(),
+ FileInfo.Builder(uri).withMimeType("video/mp4").build(),
+ )
+ testLoadingHeadline("*/*", files)
+
+ verify(headlineGenerator, times(1)).getFilesHeadline(2)
+ }
+
+ @Test
+ fun test_displayDocumentsWithUriMetadataSet_showImagesHeadline() {
+ val uri = Uri.parse("content://pkg.app/image.png")
+ val files =
+ listOf(
+ FileInfo.Builder(uri).withMimeType("application/pdf").build(),
+ FileInfo.Builder(uri).withMimeType("application/pdf").build(),
+ )
+ testLoadingHeadline("application/pdf", files)
+
+ verify(headlineGenerator, times(1)).getFilesHeadline(2)
+ }
+
+ private fun testLoadingHeadline(intentMimeType: String, files: List<FileInfo>?) {
+ val testSubject =
+ UnifiedContentPreviewUi(
+ /*isSingleImage=*/ false,
+ intentMimeType,
+ actionFactory,
+ imageLoader,
+ DefaultMimeTypeClassifier,
+ object : TransitionElementStatusCallback {
+ override fun onTransitionElementReady(name: String) = Unit
+ override fun onAllTransitionElementsReady() = Unit
+ },
+ /*itemCount=*/ 2,
+ headlineGenerator
+ )
+ val layoutInflater = LayoutInflater.from(context)
+ val gridLayout = layoutInflater.inflate(chooser_grid, null, false) as ViewGroup
+
+ files?.let(testSubject::setFiles)
+ testSubject.display(context.resources, LayoutInflater.from(context), gridLayout)
+ }
+}
diff --git a/java/tests/src/com/android/intentresolver/widget/BatchPreviewLoaderTest.kt b/java/tests/src/com/android/intentresolver/widget/BatchPreviewLoaderTest.kt
index e65cba5f..a0211308 100644
--- a/java/tests/src/com/android/intentresolver/widget/BatchPreviewLoaderTest.kt
+++ b/java/tests/src/com/android/intentresolver/widget/BatchPreviewLoaderTest.kt
@@ -47,7 +47,6 @@ class BatchPreviewLoaderTest {
private val dispatcher = UnconfinedTestDispatcher()
private val testScope = CoroutineScope(dispatcher)
private val onCompletion = mock<() -> Unit>()
- private val onReset = mock<(Int) -> Unit>()
private val onUpdate = mock<(List<Preview>) -> Unit>()
@Before
@@ -68,19 +67,11 @@ class BatchPreviewLoaderTest {
val uriTwo = createUri(2)
imageLoader.setUriLoadingOrder(succeed(uriTwo), succeed(uriOne))
val testSubject =
- BatchPreviewLoader(
- imageLoader,
- previews(uriOne, uriTwo),
- 0,
- onReset,
- onUpdate,
- onCompletion
- )
+ BatchPreviewLoader(imageLoader, previews(uriOne, uriTwo), 0, onUpdate, onCompletion)
testSubject.loadAspectRatios(200) { _, _, _ -> 100 }
dispatcher.scheduler.advanceUntilIdle()
verify(onCompletion, times(1)).invoke()
- verify(onReset, times(1)).invoke(2)
val list = withArgCaptor { verify(onUpdate, times(1)).invoke(capture()) }.map { it.uri }
assertThat(list).containsExactly(uriOne, uriTwo).inOrder()
}
@@ -97,7 +88,6 @@ class BatchPreviewLoaderTest {
imageLoader,
previews(uriOne, uriTwo, uriThree),
0,
- onReset,
onUpdate,
onCompletion
)
@@ -105,7 +95,6 @@ class BatchPreviewLoaderTest {
dispatcher.scheduler.advanceUntilIdle()
verify(onCompletion, times(1)).invoke()
- verify(onReset, times(1)).invoke(3)
val list = withArgCaptor { verify(onUpdate, times(1)).invoke(capture()) }.map { it.uri }
assertThat(list).containsExactly(uriOne, uriThree).inOrder()
}
@@ -126,12 +115,11 @@ class BatchPreviewLoaderTest {
}
imageLoader.setUriLoadingOrder(*loadingOrder)
val testSubject =
- BatchPreviewLoader(imageLoader, previews(*uris), 0, onReset, onUpdate, onCompletion)
+ BatchPreviewLoader(imageLoader, previews(*uris), 0, onUpdate, onCompletion)
testSubject.loadAspectRatios(200) { _, _, _ -> 100 }
dispatcher.scheduler.advanceUntilIdle()
verify(onCompletion, times(1)).invoke()
- verify(onReset, times(1)).invoke(uris.size)
val list =
captureMany { verify(onUpdate, atLeast(1)).invoke(capture()) }
.fold(ArrayList<Preview>()) { acc, update -> acc.apply { addAll(update) } }
@@ -156,12 +144,11 @@ class BatchPreviewLoaderTest {
val expectedUris = Array(uris.size / 2) { createUri(it * 2 + 1) }
imageLoader.setUriLoadingOrder(*loadingOrder)
val testSubject =
- BatchPreviewLoader(imageLoader, previews(*uris), 0, onReset, onUpdate, onCompletion)
+ BatchPreviewLoader(imageLoader, previews(*uris), 0, onUpdate, onCompletion)
testSubject.loadAspectRatios(200) { _, _, _ -> 100 }
dispatcher.scheduler.advanceUntilIdle()
verify(onCompletion, times(1)).invoke()
- verify(onReset, times(1)).invoke(uris.size)
val list =
captureMany { verify(onUpdate, atLeast(1)).invoke(capture()) }
.fold(ArrayList<Preview>()) { acc, update -> acc.apply { addAll(update) } }