diff options
| author | 2023-10-26 09:00:40 -0700 | |
|---|---|---|
| committer | 2023-10-26 09:09:46 -0700 | |
| commit | 475d1d0fd9f042dcdc085e2ba095e8164dfd1c15 (patch) | |
| tree | 90d1e5783589e3f9d2bacd94dcdf6ec772c03ed1 /java | |
| parent | 6e1337987eb2c062ba2cc7959333a3e6355afaee (diff) | |
Use CoroutineScope as a depenency instead of Lifecycle
In content preview classes, Lifecycele was used as coroutine provider.
This change makes CoroutineScope as a depenedency for all those classes.
Test: atest IntentResolverUnitTests
Change-Id: I2d9f07a54d9bb5b56b20c19a821e4626c86da472
Diffstat (limited to 'java')
12 files changed, 58 insertions, 68 deletions
diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java index 3a11bee2..707c64b7 100644 --- a/java/src/com/android/intentresolver/ChooserActivity.java +++ b/java/src/com/android/intentresolver/ChooserActivity.java @@ -303,7 +303,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements new ViewModelProvider(this, createPreviewViewModelFactory()) .get(BasePreviewViewModel.class); mChooserContentPreviewUi = new ChooserContentPreviewUi( - getLifecycle(), + getCoroutineScope(getLifecycle()), previewViewModel.createOrReuseProvider(mChooserRequest), mChooserRequest.getTargetIntent(), previewViewModel.createOrReuseImageLoader(), diff --git a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java index 7226ae4a..a015147d 100644 --- a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java @@ -16,8 +16,6 @@ package com.android.intentresolver.contentpreview; -import static androidx.lifecycle.LifecycleKt.getCoroutineScope; - import static com.android.intentresolver.contentpreview.ContentPreviewType.CONTENT_PREVIEW_FILE; import static com.android.intentresolver.contentpreview.ContentPreviewType.CONTENT_PREVIEW_IMAGE; import static com.android.intentresolver.contentpreview.ContentPreviewType.CONTENT_PREVIEW_TEXT; @@ -33,7 +31,6 @@ import android.view.ViewGroup; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; -import androidx.lifecycle.Lifecycle; import com.android.intentresolver.widget.ActionRow; import com.android.intentresolver.widget.ImagePreviewView.TransitionElementStatusCallback; @@ -41,6 +38,8 @@ import com.android.intentresolver.widget.ImagePreviewView.TransitionElementStatu import java.util.List; import java.util.function.Consumer; +import kotlinx.coroutines.CoroutineScope; + /** * Collection of helpers for building the content preview UI displayed in * {@link com.android.intentresolver.ChooserActivity}. @@ -48,7 +47,7 @@ import java.util.function.Consumer; */ public final class ChooserContentPreviewUi { - private final Lifecycle mLifecycle; + private final CoroutineScope mScope; /** * Delegate to build the default system action buttons to display in the preview layout, if/when @@ -93,14 +92,14 @@ public final class ChooserContentPreviewUi { final ContentPreviewUi mContentPreviewUi; public ChooserContentPreviewUi( - Lifecycle lifecycle, + CoroutineScope scope, PreviewDataProvider previewData, Intent targetIntent, ImageLoader imageLoader, ActionFactory actionFactory, TransitionElementStatusCallback transitionElementStatusCallback, HeadlineGenerator headlineGenerator) { - mLifecycle = lifecycle; + mScope = scope; mContentPreviewUi = createContentPreview( previewData, targetIntent, @@ -126,7 +125,7 @@ public final class ChooserContentPreviewUi { int previewType = previewData.getPreviewType(); if (previewType == CONTENT_PREVIEW_TEXT) { return createTextPreview( - mLifecycle, + mScope, targetIntent, actionFactory, imageLoader, @@ -138,8 +137,7 @@ public final class ChooserContentPreviewUi { actionFactory, headlineGenerator); if (previewData.getUriCount() > 0) { - previewData.getFirstFileName( - mLifecycle, fileContentPreviewUi::setFirstFileName); + previewData.getFirstFileName(mScope, fileContentPreviewUi::setFirstFileName); } return fileContentPreviewUi; } @@ -149,7 +147,7 @@ public final class ChooserContentPreviewUi { if (!TextUtils.isEmpty(text)) { FilesPlusTextContentPreviewUi previewUi = new FilesPlusTextContentPreviewUi( - mLifecycle, + mScope, isSingleImageShare, previewData.getUriCount(), targetIntent.getCharSequenceExtra(Intent.EXTRA_TEXT), @@ -160,7 +158,7 @@ public final class ChooserContentPreviewUi { headlineGenerator); if (previewData.getUriCount() > 0) { JavaFlowHelper.collectToList( - getCoroutineScope(mLifecycle), + mScope, previewData.getImagePreviewFileInfoFlow(), previewUi::updatePreviewMetadata); } @@ -168,7 +166,7 @@ public final class ChooserContentPreviewUi { } return new UnifiedContentPreviewUi( - getCoroutineScope(mLifecycle), + mScope, isSingleImageShare, targetIntent.getType(), actionFactory, @@ -198,7 +196,7 @@ public final class ChooserContentPreviewUi { } private static TextContentPreviewUi createTextPreview( - Lifecycle lifecycle, + CoroutineScope scope, Intent targetIntent, ChooserContentPreviewUi.ActionFactory actionFactory, ImageLoader imageLoader, @@ -214,7 +212,7 @@ public final class ChooserContentPreviewUi { } } return new TextContentPreviewUi( - lifecycle, + scope, sharingText, previewTitle, previewThumbnail, diff --git a/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java index 1f84b348..78fc6586 100644 --- a/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java @@ -31,7 +31,6 @@ import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.Nullable; -import androidx.lifecycle.Lifecycle; import com.android.intentresolver.R; import com.android.intentresolver.widget.ActionRow; @@ -41,6 +40,8 @@ import java.util.HashMap; import java.util.List; import java.util.function.Consumer; +import kotlinx.coroutines.CoroutineScope; + /** * FilesPlusTextContentPreviewUi is shown when the user is sending 1 or more files along with * non-empty EXTRA_TEXT. The text can be toggled with a checkbox. If a single image file is being @@ -48,7 +49,7 @@ import java.util.function.Consumer; * file content). */ class FilesPlusTextContentPreviewUi extends ContentPreviewUi { - private final Lifecycle mLifecycle; + private final CoroutineScope mScope; @Nullable private final String mIntentMimeType; private final CharSequence mText; @@ -69,7 +70,7 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi { private static final boolean SHOW_TOGGLE_CHECKMARK = false; FilesPlusTextContentPreviewUi( - Lifecycle lifecycle, + CoroutineScope scope, boolean isSingleImage, int fileCount, CharSequence text, @@ -82,7 +83,7 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi { throw new IllegalArgumentException( "fileCount = " + fileCount + " and isSingleImage = true"); } - mLifecycle = lifecycle; + mScope = scope; mIntentMimeType = intentMimeType; mFileCount = fileCount; mIsSingleImage = isSingleImage; @@ -166,7 +167,7 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi { ImageView imagePreview = mContentPreviewView.requireViewById(R.id.image_view); if (mIsSingleImage && mFirstFilePreviewUri != null) { mImageLoader.loadImage( - mLifecycle, + mScope, mFirstFilePreviewUri, bitmap -> { if (bitmap == null) { diff --git a/java/src/com/android/intentresolver/contentpreview/ImageLoader.kt b/java/src/com/android/intentresolver/contentpreview/ImageLoader.kt index 8d0fb84b..629651a3 100644 --- a/java/src/com/android/intentresolver/contentpreview/ImageLoader.kt +++ b/java/src/com/android/intentresolver/contentpreview/ImageLoader.kt @@ -18,8 +18,8 @@ package com.android.intentresolver.contentpreview import android.graphics.Bitmap import android.net.Uri -import androidx.lifecycle.Lifecycle import java.util.function.Consumer +import kotlinx.coroutines.CoroutineScope /** A content preview image loader. */ interface ImageLoader : suspend (Uri) -> Bitmap?, suspend (Uri, Boolean) -> Bitmap? { @@ -30,7 +30,7 @@ interface ImageLoader : suspend (Uri) -> Bitmap?, suspend (Uri, Boolean) -> Bitm * @param callback a callback that will be invoked with the loaded image or null if loading has * failed. */ - fun loadImage(callerLifecycle: Lifecycle, uri: Uri, callback: Consumer<Bitmap?>) + fun loadImage(callerScope: CoroutineScope, uri: Uri, callback: Consumer<Bitmap?>) /** Prepopulate the image loader cache. */ fun prePopulate(uris: List<Uri>) diff --git a/java/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoader.kt b/java/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoader.kt index 22dd1125..572ccf0b 100644 --- a/java/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoader.kt +++ b/java/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoader.kt @@ -24,8 +24,6 @@ import android.util.Size import androidx.annotation.GuardedBy import androidx.annotation.VisibleForTesting import androidx.collection.LruCache -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.coroutineScope import java.util.function.Consumer import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CompletableDeferred @@ -70,8 +68,8 @@ constructor( override suspend fun invoke(uri: Uri, caching: Boolean): Bitmap? = loadImageAsync(uri, caching) - override fun loadImage(callerLifecycle: Lifecycle, uri: Uri, callback: Consumer<Bitmap?>) { - callerLifecycle.coroutineScope.launch { + override fun loadImage(callerScope: CoroutineScope, uri: Uri, callback: Consumer<Bitmap?>) { + callerScope.launch { val image = loadImageAsync(uri, caching = true) if (isActive) { callback.accept(image) diff --git a/java/src/com/android/intentresolver/contentpreview/PreviewDataProvider.kt b/java/src/com/android/intentresolver/contentpreview/PreviewDataProvider.kt index bb303c7b..38918d79 100644 --- a/java/src/com/android/intentresolver/contentpreview/PreviewDataProvider.kt +++ b/java/src/com/android/intentresolver/contentpreview/PreviewDataProvider.kt @@ -29,8 +29,6 @@ import android.text.TextUtils import android.util.Log import androidx.annotation.OpenForTesting import androidx.annotation.VisibleForTesting -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.coroutineScope import com.android.intentresolver.contentpreview.ContentPreviewType.CONTENT_PREVIEW_FILE import com.android.intentresolver.contentpreview.ContentPreviewType.CONTENT_PREVIEW_IMAGE import com.android.intentresolver.contentpreview.ContentPreviewType.CONTENT_PREVIEW_TEXT @@ -185,11 +183,11 @@ constructor( * is not provided, derived from the URI. */ @Throws(IndexOutOfBoundsException::class) - fun getFirstFileName(callerLifecycle: Lifecycle, callback: Consumer<String>) { + fun getFirstFileName(callerScope: CoroutineScope, callback: Consumer<String>) { if (records.isEmpty()) { throw IndexOutOfBoundsException("There are no shared URIs") } - callerLifecycle.coroutineScope.launch { + callerScope.launch { val result = scope.async { getFirstFileName() }.await() callback.accept(result) } diff --git a/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java index db7b261e..b0dc3c58 100644 --- a/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java @@ -29,13 +29,14 @@ import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.Nullable; -import androidx.lifecycle.Lifecycle; import com.android.intentresolver.R; import com.android.intentresolver.widget.ActionRow; +import kotlinx.coroutines.CoroutineScope; + class TextContentPreviewUi extends ContentPreviewUi { - private final Lifecycle mLifecycle; + private final CoroutineScope mScope; @Nullable private final CharSequence mSharingText; @Nullable @@ -47,14 +48,14 @@ class TextContentPreviewUi extends ContentPreviewUi { private final HeadlineGenerator mHeadlineGenerator; TextContentPreviewUi( - Lifecycle lifecycle, + CoroutineScope scope, @Nullable CharSequence sharingText, @Nullable CharSequence previewTitle, @Nullable Uri previewThumbnail, ChooserContentPreviewUi.ActionFactory actionFactory, ImageLoader imageLoader, HeadlineGenerator headlineGenerator) { - mLifecycle = lifecycle; + mScope = scope; mSharingText = sharingText; mPreviewTitle = previewTitle; mPreviewThumbnail = previewThumbnail; @@ -122,7 +123,7 @@ class TextContentPreviewUi extends ContentPreviewUi { previewThumbnailView.setVisibility(View.GONE); } else { mImageLoader.loadImage( - mLifecycle, + mScope, mPreviewThumbnail, (bitmap) -> updateViewWithImage( contentPreviewLayout.findViewById( diff --git a/java/src/com/android/intentresolver/v2/ChooserActivity.java b/java/src/com/android/intentresolver/v2/ChooserActivity.java index a3177028..c1d73e69 100644 --- a/java/src/com/android/intentresolver/v2/ChooserActivity.java +++ b/java/src/com/android/intentresolver/v2/ChooserActivity.java @@ -316,7 +316,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements new ViewModelProvider(this, createPreviewViewModelFactory()) .get(BasePreviewViewModel.class); mChooserContentPreviewUi = new ChooserContentPreviewUi( - getLifecycle(), + getCoroutineScope(getLifecycle()), previewViewModel.createOrReuseProvider(mChooserRequest), mChooserRequest.getTargetIntent(), previewViewModel.createOrReuseImageLoader(), diff --git a/java/tests/src/com/android/intentresolver/TestPreviewImageLoader.kt b/java/tests/src/com/android/intentresolver/TestPreviewImageLoader.kt index bf87ed8a..9c4d6187 100644 --- a/java/tests/src/com/android/intentresolver/TestPreviewImageLoader.kt +++ b/java/tests/src/com/android/intentresolver/TestPreviewImageLoader.kt @@ -18,12 +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 +import kotlinx.coroutines.CoroutineScope internal class TestPreviewImageLoader(private val bitmaps: Map<Uri, Bitmap>) : ImageLoader { - override fun loadImage(callerLifecycle: Lifecycle, uri: Uri, callback: Consumer<Bitmap?>) { + override fun loadImage(callerScope: CoroutineScope, 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 dab1a956..55cde497 100644 --- a/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt +++ b/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt @@ -17,10 +17,8 @@ package com.android.intentresolver.contentpreview import android.content.Intent -import android.graphics.Bitmap import android.net.Uri -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.testing.TestLifecycleOwner +import com.android.intentresolver.TestPreviewImageLoader import com.android.intentresolver.contentpreview.ChooserContentPreviewUi.ActionFactory import com.android.intentresolver.mock import com.android.intentresolver.whenever @@ -28,28 +26,20 @@ import com.android.intentresolver.widget.ActionRow import com.android.intentresolver.widget.ImagePreviewView import com.google.common.truth.Truth.assertThat import java.util.function.Consumer +import kotlin.coroutines.EmptyCoroutineContext import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.UnconfinedTestDispatcher import org.junit.Test import org.mockito.Mockito.never import org.mockito.Mockito.times import org.mockito.Mockito.verify class ChooserContentPreviewUiTest { - private val lifecycleOwner = TestLifecycleOwner() + private val testScope = TestScope(EmptyCoroutineContext + UnconfinedTestDispatcher()) private val previewData = mock<PreviewDataProvider>() private val headlineGenerator = mock<HeadlineGenerator>() - private val imageLoader = - object : ImageLoader { - override fun loadImage( - callerLifecycle: Lifecycle, - uri: Uri, - callback: Consumer<Bitmap?>, - ) { - callback.accept(null) - } - override fun prePopulate(uris: List<Uri>) = Unit - override suspend fun invoke(uri: Uri, caching: Boolean): Bitmap? = null - } + private val imageLoader = TestPreviewImageLoader(emptyMap()) private val actionFactory = object : ActionFactory { override fun getCopyButtonRunnable(): Runnable? = null @@ -65,7 +55,7 @@ class ChooserContentPreviewUiTest { whenever(previewData.previewType).thenReturn(ContentPreviewType.CONTENT_PREVIEW_TEXT) val testSubject = ChooserContentPreviewUi( - lifecycleOwner.lifecycle, + testScope, previewData, Intent(Intent.ACTION_VIEW), imageLoader, @@ -84,7 +74,7 @@ class ChooserContentPreviewUiTest { whenever(previewData.previewType).thenReturn(ContentPreviewType.CONTENT_PREVIEW_FILE) val testSubject = ChooserContentPreviewUi( - lifecycleOwner.lifecycle, + testScope, previewData, Intent(Intent.ACTION_SEND), imageLoader, @@ -108,7 +98,7 @@ class ChooserContentPreviewUiTest { whenever(previewData.imagePreviewFileInfoFlow).thenReturn(MutableSharedFlow()) val testSubject = ChooserContentPreviewUi( - lifecycleOwner.lifecycle, + testScope, previewData, Intent(Intent.ACTION_SEND).apply { putExtra(Intent.EXTRA_TEXT, "Shared text") }, imageLoader, @@ -132,7 +122,7 @@ class ChooserContentPreviewUiTest { whenever(previewData.imagePreviewFileInfoFlow).thenReturn(MutableSharedFlow()) val testSubject = ChooserContentPreviewUi( - lifecycleOwner.lifecycle, + testScope, previewData, Intent(Intent.ACTION_SEND), imageLoader, diff --git a/java/tests/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUiTest.kt b/java/tests/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUiTest.kt index 0976dbf1..7cc0b4b2 100644 --- a/java/tests/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUiTest.kt +++ b/java/tests/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUiTest.kt @@ -21,7 +21,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView -import androidx.lifecycle.testing.TestLifecycleOwner import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation import com.android.intentresolver.R @@ -31,6 +30,9 @@ import com.android.intentresolver.widget.ActionRow import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertWithMessage import java.util.function.Consumer +import kotlin.coroutines.EmptyCoroutineContext +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.UnconfinedTestDispatcher import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.anyInt @@ -45,7 +47,7 @@ private const val SHARED_TEXT = "Some text to share" @RunWith(AndroidJUnit4::class) class FilesPlusTextContentPreviewUiTest { - private val lifecycleOwner = TestLifecycleOwner() + private val testScope = TestScope(EmptyCoroutineContext + UnconfinedTestDispatcher()) private val actionFactory = object : ChooserContentPreviewUi.ActionFactory { override fun getEditButtonRunnable(): Runnable? = null @@ -63,7 +65,7 @@ class FilesPlusTextContentPreviewUiTest { } private val context - get() = getInstrumentation().getContext() + get() = getInstrumentation().context @Test fun test_displayImagesPlusTextWithoutUriMetadata_showImagesHeadline() { @@ -252,7 +254,7 @@ class FilesPlusTextContentPreviewUiTest { val sharedFileCount = 2 val testSubject = FilesPlusTextContentPreviewUi( - lifecycleOwner.lifecycle, + testScope, /*isSingleImage=*/ false, sharedFileCount, SHARED_TEXT, @@ -284,7 +286,7 @@ class FilesPlusTextContentPreviewUiTest { val sharedFileCount = 2 val testSubject = FilesPlusTextContentPreviewUi( - lifecycleOwner.lifecycle, + testScope, /*isSingleImage=*/ false, sharedFileCount, SHARED_TEXT, @@ -332,7 +334,7 @@ class FilesPlusTextContentPreviewUiTest { ): ViewGroup? { val testSubject = FilesPlusTextContentPreviewUi( - lifecycleOwner.lifecycle, + testScope, /*isSingleImage=*/ false, sharedFileCount, SHARED_TEXT, @@ -361,7 +363,7 @@ class FilesPlusTextContentPreviewUiTest { ): Pair<ViewGroup?, View> { val testSubject = FilesPlusTextContentPreviewUi( - lifecycleOwner.lifecycle, + testScope, /*isSingleImage=*/ false, sharedFileCount, SHARED_TEXT, diff --git a/java/tests/src/com/android/intentresolver/contentpreview/TextContentPreviewUiTest.kt b/java/tests/src/com/android/intentresolver/contentpreview/TextContentPreviewUiTest.kt index b91ed436..35362401 100644 --- a/java/tests/src/com/android/intentresolver/contentpreview/TextContentPreviewUiTest.kt +++ b/java/tests/src/com/android/intentresolver/contentpreview/TextContentPreviewUiTest.kt @@ -20,7 +20,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView -import androidx.lifecycle.testing.TestLifecycleOwner import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import com.android.intentresolver.R @@ -29,6 +28,9 @@ import com.android.intentresolver.whenever import com.android.intentresolver.widget.ActionRow import com.google.common.truth.Truth.assertThat import java.util.function.Consumer +import kotlin.coroutines.EmptyCoroutineContext +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.UnconfinedTestDispatcher import org.junit.Test import org.junit.runner.RunWith @@ -36,7 +38,7 @@ import org.junit.runner.RunWith class TextContentPreviewUiTest { private val text = "Shared Text" private val title = "Preview Title" - private val lifecycleOwner = TestLifecycleOwner() + private val testScope = TestScope(EmptyCoroutineContext + UnconfinedTestDispatcher()) private val actionFactory = object : ChooserContentPreviewUi.ActionFactory { override fun getEditButtonRunnable(): Runnable? = null @@ -54,7 +56,7 @@ class TextContentPreviewUiTest { private val testSubject = TextContentPreviewUi( - lifecycleOwner.lifecycle, + testScope, text, title, /*previewThumbnail=*/ null, |