Skip to content

Commit 337a7d4

Browse files
committed
refactor: Media check dialog
- use ViewModel to handle the result in the dialog
1 parent 555201c commit 337a7d4

File tree

9 files changed

+341
-414
lines changed

9 files changed

+341
-414
lines changed

AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt

Lines changed: 42 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,14 @@ import com.ichi2.anki.dialogs.EmptyCardsDialogFragment
130130
import com.ichi2.anki.dialogs.ImportDialog.ImportDialogListener
131131
import com.ichi2.anki.dialogs.ImportFileSelectionFragment.ApkgImportResultLauncherProvider
132132
import com.ichi2.anki.dialogs.ImportFileSelectionFragment.CsvImportResultLauncherProvider
133-
import com.ichi2.anki.dialogs.MediaCheckDialog
134-
import com.ichi2.anki.dialogs.MediaCheckDialog.MediaCheckDialogListener
135133
import com.ichi2.anki.dialogs.SyncErrorDialog
136134
import com.ichi2.anki.dialogs.SyncErrorDialog.Companion.newInstance
137135
import com.ichi2.anki.dialogs.SyncErrorDialog.SyncErrorDialogListener
138136
import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog
139137
import 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
140141
import com.ichi2.anki.export.ActivityExportingDelegate
141142
import com.ichi2.anki.export.ExportDialogFragment
142143
import com.ichi2.anki.export.ExportDialogsFactory
@@ -153,7 +154,6 @@ import com.ichi2.anki.preferences.PreferencesActivity
153154
import com.ichi2.anki.preferences.sharedPrefs
154155
import com.ichi2.anki.receiver.SdCardReceiver
155156
import com.ichi2.anki.servicelayer.ScopedStorageService
156-
import com.ichi2.anki.servicelayer.checkMedia
157157
import com.ichi2.anki.settings.Prefs
158158
import com.ichi2.anki.snackbar.BaseSnackbarBuilderProvider
159159
import com.ichi2.anki.snackbar.SnackbarBuilder
@@ -165,13 +165,11 @@ import com.ichi2.anki.worker.SyncMediaWorker
165165
import com.ichi2.anki.worker.SyncWorker
166166
import com.ichi2.anki.worker.UniqueWorkNames
167167
import com.ichi2.annotations.NeedsTest
168-
import com.ichi2.async.deleteMedia
169168
import com.ichi2.compat.CompatHelper.Companion.getSerializableCompat
170169
import com.ichi2.compat.CompatHelper.Companion.sdkVersion
171170
import com.ichi2.libanki.ChangeManager
172171
import com.ichi2.libanki.DeckId
173172
import com.ichi2.libanki.Decks
174-
import com.ichi2.libanki.MediaCheckResult
175173
import com.ichi2.libanki.exception.ConfirmModSchemaException
176174
import com.ichi2.libanki.sched.DeckNode
177175
import 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
}

AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DialogHandler.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ abstract class DialogHandlerMessage protected constructor(
119119
WhichDialogHandler.MSG_SHOW_COLLECTION_IMPORT_REPLACE_DIALOG -> ImportUtils.CollectionImportReplace.fromMessage(message)
120120
WhichDialogHandler.MSG_SHOW_COLLECTION_IMPORT_ADD_DIALOG -> ImportUtils.CollectionImportAdd.fromMessage(message)
121121
WhichDialogHandler.MSG_SHOW_SYNC_ERROR_DIALOG -> SyncErrorDialog.SyncErrorDialogMessageHandler.fromMessage(message)
122-
WhichDialogHandler.MSG_SHOW_MEDIA_CHECK_COMPLETE_DIALOG -> MediaCheckDialog.MediaCheckCompleteDialog.fromMessage(message)
123122
WhichDialogHandler.MSG_SHOW_DATABASE_ERROR_DIALOG -> DatabaseErrorDialog.ShowDatabaseErrorDialog.fromMessage(message)
124123
WhichDialogHandler.MSG_SHOW_ONE_WAY_SYNC_DIALOG -> OneWaySyncDialog.fromMessage(message)
125124
WhichDialogHandler.MSG_DO_SYNC -> IntentHandler.Companion.DoSync()
@@ -136,7 +135,6 @@ abstract class DialogHandlerMessage protected constructor(
136135
MSG_SHOW_COLLECTION_IMPORT_REPLACE_DIALOG(1),
137136
MSG_SHOW_COLLECTION_IMPORT_ADD_DIALOG(2),
138137
MSG_SHOW_SYNC_ERROR_DIALOG(3),
139-
MSG_SHOW_MEDIA_CHECK_COMPLETE_DIALOG(5),
140138
MSG_SHOW_DATABASE_ERROR_DIALOG(6),
141139
MSG_SHOW_ONE_WAY_SYNC_DIALOG(7),
142140
MSG_DO_SYNC(8),

0 commit comments

Comments
 (0)