diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/managespace/ManageSpaceFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/managespace/ManageSpaceFragment.kt index f9eeaebcb09c..9e3e8cca2648 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/managespace/ManageSpaceFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/managespace/ManageSpaceFragment.kt @@ -12,7 +12,6 @@ import androidx.annotation.StringRes import androidx.core.content.ContextCompat.getSystemService import androidx.fragment.app.viewModels import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewModelScope import androidx.preference.Preference import com.ichi2.anki.BackupManager @@ -32,6 +31,7 @@ import com.ichi2.anki.snackbar.showSnackbar import com.ichi2.anki.ui.dialogs.tools.AsyncDialogBuilder.CheckedItems import com.ichi2.anki.ui.dialogs.tools.DialogResult import com.ichi2.anki.ui.dialogs.tools.awaitDialog +import com.ichi2.anki.utils.ext.launchCollectionInViewLifecycleScope import com.ichi2.anki.utils.getUserFriendlyErrorText import com.ichi2.preferences.TextWidgetPreference import kotlinx.coroutines.CoroutineScope @@ -233,15 +233,6 @@ class ManageSpaceFragment : SettingsFragment() { adjustDeleteEverythingStringsDependingOnCollectionLocation(deleteEverythingPreference) - listOf( - viewModel.flowOfDeleteUnusedMediaSize to deleteUnusedMediaPreference, - viewModel.flowOfDeleteCollectionSize to deleteCollectionPreference, - viewModel.flowOfDeleteEverythingSize to deleteEverythingPreference, - viewModel.flowOfDeleteBackupsSize to deleteBackupsPreference, - ).forEach { (flowOfSize, preference) -> - lifecycleScope.launch { flowOfSize.collect { size -> preference.setWidgetTextBy(size) } } - } - observeProgress(viewModel) { progress -> getString(progress.messageRes) } } @@ -253,6 +244,16 @@ class ManageSpaceFragment : SettingsFragment() { binding.toolbar.apply { title = getString(CommonString.pref__manage_space__screen_title) } + + listOf( + viewModel.flowOfDeleteUnusedMediaSize to R.string.pref_delete_media_key, + viewModel.flowOfDeleteCollectionSize to R.string.pref_delete_collection_key, + viewModel.flowOfDeleteEverythingSize to R.string.pref_delete_everything_key, + viewModel.flowOfDeleteBackupsSize to R.string.pref_delete_backups_key, + ).forEach { (flowOfSize, key) -> + val preference = requirePreference(key) + flowOfSize.launchCollectionInViewLifecycleScope { size -> preference.setWidgetTextBy(size) } + } } /************************************ Delete unused media *************************************/ diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/FragmentCoroutineLifecycleTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/FragmentCoroutineLifecycleTest.kt index 7d78a6fd3a68..a034a695999c 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/FragmentCoroutineLifecycleTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/FragmentCoroutineLifecycleTest.kt @@ -15,7 +15,6 @@ import com.ichi2.anki.FragmentLifecycleFixture.Transition.REMOVE import com.ichi2.testutils.FragmentCoroutineTracker import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher -import org.junit.Assume.assumeFalse import org.junit.Assume.assumeTrue import org.junit.Test import org.junit.runner.RunWith @@ -111,7 +110,6 @@ class FragmentCoroutineLifecycleTest( if (transition != REMOVE) { assumeTrue("$fixture has no fragment view", fixture.hasFragmentView) } - assumeFalse("Known startup failure: $fixture during $transition (Issue 22065)", transition in fixture.knownFailures) withHost { activity, fragment -> // Main.immediate queues nested launches until this outer coroutine finishes. // This lets the test destroy the fragment/view before its startup work runs. diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/FragmentLifecycleFixture.kt b/AnkiDroid/src/test/java/com/ichi2/anki/FragmentLifecycleFixture.kt index 3b9165bb225b..62377a2f8e7b 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/FragmentLifecycleFixture.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/FragmentLifecycleFixture.kt @@ -3,7 +3,6 @@ package com.ichi2.anki import androidx.fragment.app.Fragment -import com.ichi2.anki.FragmentLifecycleFixture.Transition.REMOVE import com.ichi2.anki.browser.BrowserColumnSelectionFragment import com.ichi2.anki.cardviewer.SingleCardSide import com.ichi2.anki.dialogs.ChangeNoteTypeDialog @@ -31,8 +30,6 @@ class FragmentLifecycleFixture( private val name: String, val host: Class = AnkiActivity::class.java, val hasFragmentView: Boolean = true, - // Confirmed failures in the startup stress test. Remove each entry when its failure is fixed. - val knownFailures: Set = emptySet(), val create: RobolectricTest.() -> Fragment, ) { enum class Transition { REMOVE, DESTROY_VIEW, RECREATE_VIEW } @@ -56,7 +53,7 @@ fun fragmentLifecycleFixtures(): List = FilteredDeckOptionsFragment() }, FragmentLifecycleFixture("MediaCheck") { MediaCheckFragment() }, - FragmentLifecycleFixture("ManageSpace", knownFailures = setOf(REMOVE)) { ManageSpaceFragment() }, + FragmentLifecycleFixture("ManageSpace") { ManageSpaceFragment() }, FragmentLifecycleFixture("ChangeNoteType") { ChangeNoteTypeDialog.newInstance(listOf(addBasicNote().id)) },