diff options
| author | 2023-08-08 20:43:32 -0700 | |
|---|---|---|
| committer | 2023-08-15 21:31:27 +0000 | |
| commit | 3864b3fb003144dad57924ae0143fa5a4df6c849 (patch) | |
| tree | e469bb9fbba2e1dbecc1f44c657e80a1d174114f /java/tests | |
| parent | e3360fa4f978bdea5a974189b72949a79c148d22 (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.kt | 152 | ||||
| -rw-r--r-- | java/tests/src/com/android/intentresolver/widget/BatchPreviewLoaderTest.kt | 19 |
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) } } |