summaryrefslogtreecommitdiff
path: root/java/tests/src
diff options
context:
space:
mode:
author Andrey Epin <ayepin@google.com> 2023-05-12 16:17:15 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-05-12 16:17:15 +0000
commit6df7212d1017517efd372845411eebee3d8c8580 (patch)
tree9343496ee3caa03403abee19e43416c58f9250a4 /java/tests/src
parent45246ffd7da029d0a875f5f6950d8e730e1c2fc2 (diff)
parenta418a7e57a4856efae1bc5511ad24944a640da63 (diff)
Merge "Retain the image loader through configuration change" into udc-dev
Diffstat (limited to 'java/tests/src')
-rw-r--r--java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java11
-rw-r--r--java/tests/src/com/android/intentresolver/TestContentPreviewViewModel.kt56
-rw-r--r--java/tests/src/com/android/intentresolver/TestPreviewImageLoader.kt7
-rw-r--r--java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt6
-rw-r--r--java/tests/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoaderTest.kt (renamed from java/tests/src/com/android/intentresolver/ImagePreviewImageLoaderTest.kt)85
5 files changed, 118 insertions, 47 deletions
diff --git a/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java b/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java
index 82ba8d4d..fa934f87 100644
--- a/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java
+++ b/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java
@@ -32,10 +32,11 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.UserHandle;
+import androidx.lifecycle.ViewModelProvider;
+
import com.android.intentresolver.AbstractMultiProfilePagerAdapter.CrossProfileIntentsChecker;
import com.android.intentresolver.chooser.DisplayResolveInfo;
import com.android.intentresolver.chooser.TargetInfo;
-import com.android.intentresolver.contentpreview.ImageLoader;
import com.android.intentresolver.flags.FeatureFlagRepository;
import com.android.intentresolver.grid.ChooserGridAdapter;
import com.android.intentresolver.shortcuts.ShortcutLoader;
@@ -194,10 +195,10 @@ public class ChooserWrapperActivity
}
@Override
- protected ImageLoader createPreviewImageLoader() {
- return sOverrides.imageLoader == null
- ? super.createPreviewImageLoader()
- : sOverrides.imageLoader;
+ protected ViewModelProvider.Factory createPreviewViewModelFactory() {
+ return TestContentPreviewViewModel.Companion.wrap(
+ super.createPreviewViewModelFactory(),
+ sOverrides.imageLoader);
}
@Override
diff --git a/java/tests/src/com/android/intentresolver/TestContentPreviewViewModel.kt b/java/tests/src/com/android/intentresolver/TestContentPreviewViewModel.kt
new file mode 100644
index 00000000..d239f612
--- /dev/null
+++ b/java/tests/src/com/android/intentresolver/TestContentPreviewViewModel.kt
@@ -0,0 +1,56 @@
+/*
+ * 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
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.viewmodel.CreationExtras
+import com.android.intentresolver.contentpreview.BasePreviewViewModel
+import com.android.intentresolver.contentpreview.ImageLoader
+import com.android.intentresolver.contentpreview.PreviewDataProvider
+
+/** A test content preview model that supports image loader override. */
+class TestContentPreviewViewModel(
+ private val viewModel: BasePreviewViewModel,
+ private val imageLoader: ImageLoader? = null,
+) : BasePreviewViewModel() {
+ override fun createOrReuseProvider(
+ chooserRequest: ChooserRequestParameters
+ ): PreviewDataProvider = viewModel.createOrReuseProvider(chooserRequest)
+
+ override fun createOrReuseImageLoader(): ImageLoader =
+ imageLoader ?: viewModel.createOrReuseImageLoader()
+
+ companion object {
+ fun wrap(
+ factory: ViewModelProvider.Factory,
+ imageLoader: ImageLoader?,
+ ): ViewModelProvider.Factory =
+ object : ViewModelProvider.Factory {
+ @Suppress("UNCHECKED_CAST")
+ override fun <T : ViewModel> create(
+ modelClass: Class<T>,
+ extras: CreationExtras
+ ): T {
+ return TestContentPreviewViewModel(
+ factory.create(modelClass, extras) as BasePreviewViewModel,
+ imageLoader,
+ ) as T
+ }
+ }
+ }
+}
diff --git a/java/tests/src/com/android/intentresolver/TestPreviewImageLoader.kt b/java/tests/src/com/android/intentresolver/TestPreviewImageLoader.kt
index 74a253b8..bf87ed8a 100644
--- a/java/tests/src/com/android/intentresolver/TestPreviewImageLoader.kt
+++ b/java/tests/src/com/android/intentresolver/TestPreviewImageLoader.kt
@@ -18,13 +18,12 @@ package com.android.intentresolver
import android.graphics.Bitmap
import android.net.Uri
+import androidx.lifecycle.Lifecycle
import com.android.intentresolver.contentpreview.ImageLoader
import java.util.function.Consumer
-internal class TestPreviewImageLoader(
- private val bitmaps: Map<Uri, Bitmap>
-) : ImageLoader {
- override fun loadImage(uri: Uri, callback: Consumer<Bitmap?>) {
+internal class TestPreviewImageLoader(private val bitmaps: Map<Uri, Bitmap>) : ImageLoader {
+ override fun loadImage(callerLifecycle: Lifecycle, uri: Uri, callback: Consumer<Bitmap?>) {
callback.accept(bitmaps[uri])
}
diff --git a/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt b/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt
index 0bcd8423..c62f36ce 100644
--- a/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt
+++ b/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt
@@ -39,7 +39,11 @@ class ChooserContentPreviewUiTest {
private val headlineGenerator = mock<HeadlineGenerator>()
private val imageLoader =
object : ImageLoader {
- override fun loadImage(uri: Uri, callback: Consumer<Bitmap?>) {
+ override fun loadImage(
+ callerLifecycle: Lifecycle,
+ uri: Uri,
+ callback: Consumer<Bitmap?>,
+ ) {
callback.accept(null)
}
override fun prePopulate(uris: List<Uri>) = Unit
diff --git a/java/tests/src/com/android/intentresolver/ImagePreviewImageLoaderTest.kt b/java/tests/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoaderTest.kt
index 3c399cc4..184401a0 100644
--- a/java/tests/src/com/android/intentresolver/ImagePreviewImageLoaderTest.kt
+++ b/java/tests/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoaderTest.kt
@@ -14,15 +14,19 @@
* limitations under the License.
*/
-package com.android.intentresolver
+package com.android.intentresolver.contentpreview
import android.content.ContentResolver
-import android.content.Context
-import android.content.res.Resources
import android.graphics.Bitmap
import android.net.Uri
import android.util.Size
import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.coroutineScope
+import com.android.intentresolver.TestLifecycleOwner
+import com.android.intentresolver.any
+import com.android.intentresolver.anyOrNull
+import com.android.intentresolver.mock
+import com.android.intentresolver.whenever
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineStart.UNDISPATCHED
import kotlinx.coroutines.Dispatchers
@@ -30,6 +34,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
+import kotlinx.coroutines.plus
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestCoroutineScheduler
import kotlinx.coroutines.test.UnconfinedTestDispatcher
@@ -49,28 +54,26 @@ class ImagePreviewImageLoaderTest {
private val uriOne = Uri.parse("content://org.package.app/image-1.png")
private val uriTwo = Uri.parse("content://org.package.app/image-2.png")
private val bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
- private val contentResolver = mock<ContentResolver> {
- whenever(loadThumbnail(any(), any(), anyOrNull())).thenReturn(bitmap)
- }
- private val resources = mock<Resources> {
- whenever(getDimensionPixelSize(R.dimen.chooser_preview_image_max_dimen))
- .thenReturn(imageSize.width)
- }
- private val context = mock<Context> {
- whenever(this.resources).thenReturn(this@ImagePreviewImageLoaderTest.resources)
- whenever(this.contentResolver).thenReturn(this@ImagePreviewImageLoaderTest.contentResolver)
- }
- private val scheduler = TestCoroutineScheduler()
+ private val contentResolver =
+ mock<ContentResolver> {
+ whenever(loadThumbnail(any(), any(), anyOrNull())).thenReturn(bitmap)
+ }
private val lifecycleOwner = TestLifecycleOwner()
- private val dispatcher = UnconfinedTestDispatcher(scheduler)
- private val testSubject = ImagePreviewImageLoader(
- context, lifecycleOwner.lifecycle, 1, dispatcher
- )
+ private val dispatcher = UnconfinedTestDispatcher()
+ private lateinit var testSubject: ImagePreviewImageLoader
@Before
fun setup() {
Dispatchers.setMain(dispatcher)
lifecycleOwner.state = Lifecycle.State.CREATED
+ // create test subject after we've updated the lifecycle dispatcher
+ testSubject =
+ ImagePreviewImageLoader(
+ lifecycleOwner.lifecycle.coroutineScope + dispatcher,
+ imageSize.width,
+ contentResolver,
+ 1,
+ )
}
@After
@@ -110,14 +113,16 @@ class ImagePreviewImageLoaderTest {
fun invoke_overlappedRequests_Deduplicate() = runTest {
val scheduler = TestCoroutineScheduler()
val dispatcher = StandardTestDispatcher(scheduler)
- val testSubject = ImagePreviewImageLoader(context, lifecycleOwner.lifecycle, 1, dispatcher)
+ val testSubject =
+ ImagePreviewImageLoader(
+ lifecycleOwner.lifecycle.coroutineScope + dispatcher,
+ imageSize.width,
+ contentResolver,
+ 1,
+ )
coroutineScope {
- launch(start = UNDISPATCHED) {
- testSubject(uriOne, false)
- }
- launch(start = UNDISPATCHED) {
- testSubject(uriOne, false)
- }
+ launch(start = UNDISPATCHED) { testSubject(uriOne, false) }
+ launch(start = UNDISPATCHED) { testSubject(uriOne, false) }
scheduler.advanceUntilIdle()
}
@@ -154,11 +159,15 @@ class ImagePreviewImageLoaderTest {
fun invoke_imageLoaderScopeClosedMidflight_throwsCancellationException() = runTest {
val scheduler = TestCoroutineScheduler()
val dispatcher = StandardTestDispatcher(scheduler)
- val testSubject = ImagePreviewImageLoader(context, lifecycleOwner.lifecycle, 1, dispatcher)
+ val testSubject =
+ ImagePreviewImageLoader(
+ lifecycleOwner.lifecycle.coroutineScope + dispatcher,
+ imageSize.width,
+ contentResolver,
+ 1
+ )
coroutineScope {
- val deferred = async(start = UNDISPATCHED) {
- testSubject(uriOne, false)
- }
+ val deferred = async(start = UNDISPATCHED) { testSubject(uriOne, false) }
lifecycleOwner.state = Lifecycle.State.DESTROYED
scheduler.advanceUntilIdle()
deferred.await()
@@ -169,14 +178,16 @@ class ImagePreviewImageLoaderTest {
fun invoke_multipleCallsWithDifferentCacheInstructions_cachingPrevails() = runTest {
val scheduler = TestCoroutineScheduler()
val dispatcher = StandardTestDispatcher(scheduler)
- val testSubject = ImagePreviewImageLoader(context, lifecycleOwner.lifecycle, 1, dispatcher)
+ val testSubject =
+ ImagePreviewImageLoader(
+ lifecycleOwner.lifecycle.coroutineScope + dispatcher,
+ imageSize.width,
+ contentResolver,
+ 1
+ )
coroutineScope {
- launch(start = UNDISPATCHED) {
- testSubject(uriOne, false)
- }
- launch(start = UNDISPATCHED) {
- testSubject(uriOne, true)
- }
+ launch(start = UNDISPATCHED) { testSubject(uriOne, false) }
+ launch(start = UNDISPATCHED) { testSubject(uriOne, true) }
scheduler.advanceUntilIdle()
}
testSubject(uriOne, true)