@@ -130,13 +130,14 @@ import com.ichi2.anki.dialogs.EmptyCardsDialogFragment
130130import com.ichi2.anki.dialogs.ImportDialog.ImportDialogListener
131131import com.ichi2.anki.dialogs.ImportFileSelectionFragment.ApkgImportResultLauncherProvider
132132import com.ichi2.anki.dialogs.ImportFileSelectionFragment.CsvImportResultLauncherProvider
133- import com.ichi2.anki.dialogs.MediaCheckDialog
134- import com.ichi2.anki.dialogs.MediaCheckDialog.MediaCheckDialogListener
135133import com.ichi2.anki.dialogs.SyncErrorDialog
136134import com.ichi2.anki.dialogs.SyncErrorDialog.Companion.newInstance
137135import com.ichi2.anki.dialogs.SyncErrorDialog.SyncErrorDialogListener
138136import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog
139137import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog.CustomStudyAction
138+ import com.ichi2.anki.dialogs.mediacheck.ConfirmMediaCheckDialog
139+ import com.ichi2.anki.dialogs.mediacheck.MediaCheckResultDialog
140+ import com.ichi2.anki.dialogs.viewmodel.MediaCheckViewModel
140141import com.ichi2.anki.export.ActivityExportingDelegate
141142import com.ichi2.anki.export.ExportDialogFragment
142143import com.ichi2.anki.export.ExportDialogsFactory
@@ -153,7 +154,6 @@ import com.ichi2.anki.preferences.PreferencesActivity
153154import com.ichi2.anki.preferences.sharedPrefs
154155import com.ichi2.anki.receiver.SdCardReceiver
155156import com.ichi2.anki.servicelayer.ScopedStorageService
156- import com.ichi2.anki.servicelayer.checkMedia
157157import com.ichi2.anki.settings.Prefs
158158import com.ichi2.anki.snackbar.BaseSnackbarBuilderProvider
159159import com.ichi2.anki.snackbar.SnackbarBuilder
@@ -165,13 +165,11 @@ import com.ichi2.anki.worker.SyncMediaWorker
165165import com.ichi2.anki.worker.SyncWorker
166166import com.ichi2.anki.worker.UniqueWorkNames
167167import com.ichi2.annotations.NeedsTest
168- import com.ichi2.async.deleteMedia
169168import com.ichi2.compat.CompatHelper.Companion.getSerializableCompat
170169import com.ichi2.compat.CompatHelper.Companion.sdkVersion
171170import com.ichi2.libanki.ChangeManager
172171import com.ichi2.libanki.DeckId
173172import com.ichi2.libanki.Decks
174- import com.ichi2.libanki.MediaCheckResult
175173import com.ichi2.libanki.exception.ConfirmModSchemaException
176174import com.ichi2.libanki.sched.DeckNode
177175import com.ichi2.libanki.utils.TimeManager
@@ -244,7 +242,6 @@ open class DeckPicker :
244242 StudyOptionsListener ,
245243 SyncErrorDialogListener ,
246244 ImportDialogListener ,
247- MediaCheckDialogListener ,
248245 OnRequestPermissionsResultCallback ,
249246 ChangeManager .Subscriber ,
250247 SyncCompletionListener ,
@@ -256,6 +253,8 @@ open class DeckPicker :
256253 ExportDialogsFactoryProvider {
257254 val viewModel: DeckPickerViewModel by viewModels()
258255
256+ private val mediaCheckViewModel: MediaCheckViewModel by viewModels()
257+
259258 // Short animation duration from system
260259 private var shortAnimDuration = 0
261260 private lateinit var deckPickerContent: RelativeLayout
@@ -679,6 +678,10 @@ open class DeckPicker :
679678 viewModel.deckDeletedNotification.launchCollectionInLifecycleScope(::onDeckDeleted)
680679 viewModel.emptyCardsNotification.launchCollectionInLifecycleScope(::onCardsEmptied)
681680 viewModel.flowOfDeckCountsChanged.launchCollectionInLifecycleScope(::onDeckCountsChanged)
681+
682+ mediaCheckViewModel.startMediaCheck.launchCollectionInLifecycleScope { startMediaCheck() }
683+ mediaCheckViewModel.tagMissing.launchCollectionInLifecycleScope { tagMissing() }
684+ mediaCheckViewModel.deleteUnused.launchCollectionInLifecycleScope { deleteUnused() }
682685 }
683686
684687 private val onReceiveContentListener =
@@ -1181,7 +1184,7 @@ open class DeckPicker :
11811184 }
11821185 R .id.action_check_media -> {
11831186 Timber .i(" DeckPicker:: Check media button pressed" )
1184- showMediaCheckDialog( MediaCheckDialog . Type . DIALOG_CONFIRM_MEDIA_CHECK )
1187+ ConfirmMediaCheckDialog ().show(supportFragmentManager, " ConfirmMediaCheckDialog " )
11851188 return true
11861189 }
11871190 R .id.action_empty_cards -> {
@@ -1495,7 +1498,7 @@ open class DeckPicker :
14951498 }
14961499 KeyEvent .KEYCODE_M -> {
14971500 Timber .i(" Check media from keypress" )
1498- showMediaCheckDialog( MediaCheckDialog . Type . DIALOG_CONFIRM_MEDIA_CHECK )
1501+ ConfirmMediaCheckDialog ().show(supportFragmentManager, " ConfirmMediaCheckDialog " )
14991502 return true
15001503 }
15011504 KeyEvent .KEYCODE_E -> {
@@ -1812,17 +1815,6 @@ open class DeckPicker :
18121815 }
18131816 }
18141817
1815- override fun showMediaCheckDialog (dialogType : MediaCheckDialog .Type ) {
1816- showAsyncDialogFragment(MediaCheckDialog .newInstance(dialogType))
1817- }
1818-
1819- override fun showMediaCheckDialog (
1820- dialogType : MediaCheckDialog .Type ,
1821- checkList : MediaCheckResult ,
1822- ) {
1823- showAsyncDialogFragment(MediaCheckDialog .newInstance(dialogType, checkList))
1824- }
1825-
18261818 /* *
18271819 * Show a specific sync error dialog
18281820 * @param dialogType id of dialog to show
@@ -1895,41 +1887,47 @@ open class DeckPicker :
18951887 handleDatabaseCheck()
18961888 }
18971889
1898- /* *
1899- * Schedules a background job to find missing, unused and invalid media files.
1900- * Shows a progress dialog while operation is running.
1901- * When check is finished a dialog box shows number of missing, unused and invalid media files.
1902- *
1903- * If has the storage permission, job is scheduled, otherwise storage permission is asked first.
1904- */
1905- override fun mediaCheck () {
1890+ private fun startMediaCheck () {
19061891 launchCatchingTask {
1907- val mediaCheckResult = checkMedia()
1908- showMediaCheckDialog(MediaCheckDialog .Type .DIALOG_MEDIA_CHECK_RESULTS , mediaCheckResult)
1892+ withProgress(R .string.check_media_message) {
1893+ mediaCheckViewModel.checkMedia().join()
1894+ }
1895+
1896+ MediaCheckResultDialog ().show(
1897+ supportFragmentManager,
1898+ " MediaCheckResultDialog" ,
1899+ )
19091900 }
19101901 }
19111902
1912- override fun deleteUnused (unused : List <String >) {
1903+ override fun mediaCheck () {
1904+ ConfirmMediaCheckDialog ().show(supportFragmentManager, " ConfirmMediaCheckDialog" )
1905+ }
1906+
1907+ private fun deleteUnused () {
1908+ Timber .d(" DeckPicker:: Deleting unused media" )
19131909 launchCatchingTask {
1914- // Number of deleted files
1915- val noOfDeletedFiles =
1916- withProgress(resources.getString(R .string.delete_media_message)) {
1917- withCol { deleteMedia(this @withCol, unused) }
1918- }
1919- showSimpleMessageDialog(
1920- title = resources.getString(R .string.delete_media_result_title),
1921- message = resources.getQuantityString(R .plurals.delete_media_result_message, noOfDeletedFiles, noOfDeletedFiles),
1922- )
1910+ withProgress(resources.getString(R .string.delete_media_message)) {
1911+ mediaCheckViewModel.deleteUnusedMedia().join()
1912+
1913+ showSimpleMessageDialog(
1914+ title = resources.getString(R .string.delete_media_result_title),
1915+ message =
1916+ resources.getQuantityString(
1917+ R .plurals.delete_media_result_message,
1918+ mediaCheckViewModel.deletedFiles,
1919+ mediaCheckViewModel.deletedFiles,
1920+ ),
1921+ )
1922+ }
19231923 }
19241924 }
19251925
1926- override fun tagMissing (missingMediaNotes : List <Long >? ) {
1927- if (missingMediaNotes == null ) return
1928-
1926+ private fun tagMissing () {
19291927 Timber .d(" DeckPicker:: Adding missing media tag" )
19301928 launchCatchingTask {
1931- withCol {
1932- tags.bulkAdd(missingMediaNotes, TR .mediaCheckMissingMediaTag())
1929+ withProgress(getString( R .string.adding_missing_tag)) {
1930+ mediaCheckViewModel.tagMissing( TR .mediaCheckMissingMediaTag()).join( )
19331931 }
19341932 }
19351933 }
0 commit comments