mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 06:17:57 +01:00 
			
		
		
		
	Move restore progress dialog to notification
This commit is contained in:
		| @@ -58,20 +58,10 @@ import uy.kohesive.injekt.injectLazy | ||||
|  | ||||
| class BackupManager(val context: Context, version: Int = CURRENT_VERSION) { | ||||
|  | ||||
|     /** | ||||
|      * Database. | ||||
|      */ | ||||
|     internal val databaseHelper: DatabaseHelper by injectLazy() | ||||
|  | ||||
|     /** | ||||
|      * Source manager. | ||||
|      */ | ||||
|     internal val sourceManager: SourceManager by injectLazy() | ||||
|  | ||||
|     /** | ||||
|      * Tracking manager | ||||
|      */ | ||||
|     internal val trackManager: TrackManager by injectLazy() | ||||
|     private val preferences: PreferencesHelper by injectLazy() | ||||
|  | ||||
|     /** | ||||
|      * Version of parser | ||||
| @@ -84,11 +74,6 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) { | ||||
|      */ | ||||
|     var parser: Gson = initParser() | ||||
|  | ||||
|     /** | ||||
|      * Preferences | ||||
|      */ | ||||
|     private val preferences: PreferencesHelper by injectLazy() | ||||
|  | ||||
|     /** | ||||
|      * Set version of parser | ||||
|      * | ||||
|   | ||||
| @@ -81,6 +81,12 @@ class BackupRestoreService : Service() { | ||||
|          */ | ||||
|         fun stop(context: Context) { | ||||
|             context.stopService(Intent(context, BackupRestoreService::class.java)) | ||||
|  | ||||
|             val errorIntent = Intent(BackupConst.INTENT_FILTER).apply { | ||||
|                 putExtra(BackupConst.ACTION, BackupConst.ACTION_RESTORE_ERROR) | ||||
|                 putExtra(BackupConst.EXTRA_ERROR_MESSAGE, context.getString(R.string.restoring_backup_canceled)) | ||||
|             } | ||||
|             context.sendLocalBroadcast(errorIntent) | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -456,7 +462,7 @@ class BackupRestoreService : Service() { | ||||
|         amount: Int, | ||||
|         title: String, | ||||
|         errors: Int, | ||||
|         content: String = getString(R.string.dialog_restoring_backup, title.chop(15)) | ||||
|         content: String = title.chop(30) | ||||
|     ) { | ||||
|         val intent = Intent(BackupConst.INTENT_FILTER).apply { | ||||
|             putExtra(BackupConst.EXTRA_PROGRESS, progress) | ||||
|   | ||||
| @@ -9,6 +9,7 @@ import android.os.Build | ||||
| import android.os.Handler | ||||
| import eu.kanade.tachiyomi.BuildConfig.APPLICATION_ID as ID | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.backup.BackupRestoreService | ||||
| import eu.kanade.tachiyomi.data.database.DatabaseHelper | ||||
| import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| @@ -61,6 +62,8 @@ class NotificationReceiver : BroadcastReceiver() { | ||||
|             // Share backup file | ||||
|             ACTION_SHARE_BACKUP -> shareBackup(context, intent.getParcelableExtra(EXTRA_URI), | ||||
|                     intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1)) | ||||
|             ACTION_CANCEL_RESTORE -> cancelRestore(context, | ||||
|                     intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1)) | ||||
|             // Cancel library update and dismiss notification | ||||
|             ACTION_CANCEL_LIBRARY_UPDATE -> cancelLibraryUpdate(context, Notifications.ID_LIBRARY_PROGRESS) | ||||
|             // Open reader activity | ||||
| @@ -170,6 +173,17 @@ class NotificationReceiver : BroadcastReceiver() { | ||||
|         DiskUtil.scanMedia(context, file) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Method called when user wants to stop a backup restore job. | ||||
|      * | ||||
|      * @param context context of application | ||||
|      * @param notificationId id of notification | ||||
|      */ | ||||
|     private fun cancelRestore(context: Context, notificationId: Int) { | ||||
|         BackupRestoreService.stop(context) | ||||
|         Handler().post { dismissNotification(context, notificationId) } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Method called when user wants to stop a library update | ||||
|      * | ||||
| @@ -222,6 +236,9 @@ class NotificationReceiver : BroadcastReceiver() { | ||||
|         // Called to launch send intent. | ||||
|         private const val ACTION_SHARE_BACKUP = "$ID.$NAME.SEND_BACKUP" | ||||
|  | ||||
|         // Called to cancel backup restore job. | ||||
|         private const val ACTION_CANCEL_RESTORE = "$ID.$NAME.CANCEL_RESTORE" | ||||
|  | ||||
|         // Called to cancel library update. | ||||
|         private const val ACTION_CANCEL_LIBRARY_UPDATE = "$ID.$NAME.CANCEL_LIBRARY_UPDATE" | ||||
|  | ||||
| @@ -475,7 +492,7 @@ class NotificationReceiver : BroadcastReceiver() { | ||||
|          * @param notificationId id of notification | ||||
|          * @return [PendingIntent] | ||||
|          */ | ||||
|         internal fun shareBackup(context: Context, uri: Uri, notificationId: Int): PendingIntent { | ||||
|         internal fun shareBackupPendingBroadcast(context: Context, uri: Uri, notificationId: Int): PendingIntent { | ||||
|             val intent = Intent(context, NotificationReceiver::class.java).apply { | ||||
|                 action = ACTION_SHARE_BACKUP | ||||
|                 putExtra(EXTRA_URI, uri) | ||||
| @@ -491,7 +508,7 @@ class NotificationReceiver : BroadcastReceiver() { | ||||
|          * @param uri uri of error log file | ||||
|          * @return [PendingIntent] | ||||
|          */ | ||||
|         internal fun openErrorLog(context: Context, uri: Uri): PendingIntent { | ||||
|         internal fun openErrorLogPendingActivity(context: Context, uri: Uri): PendingIntent { | ||||
|             val intent = Intent().apply { | ||||
|                 action = Intent.ACTION_VIEW | ||||
|                 setDataAndType(uri, "text/plain") | ||||
| @@ -499,5 +516,20 @@ class NotificationReceiver : BroadcastReceiver() { | ||||
|             } | ||||
|             return PendingIntent.getActivity(context, 0, intent, 0) | ||||
|         } | ||||
|  | ||||
|         /** | ||||
|          * Returns [PendingIntent] that cancels a backup restore job. | ||||
|          * | ||||
|          * @param context context of application | ||||
|          * @param notificationId id of notification | ||||
|          * @return [PendingIntent] | ||||
|          */ | ||||
|         internal fun cancelRestorePendingBroadcast(context: Context, notificationId: Int): PendingIntent { | ||||
|             val intent = Intent(context, NotificationReceiver::class.java).apply { | ||||
|                 action = ACTION_CANCEL_RESTORE | ||||
|                 putExtra(EXTRA_NOTIFICATION_ID, notificationId) | ||||
|             } | ||||
|             return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -23,7 +23,6 @@ import eu.kanade.tachiyomi.data.backup.models.Backup | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.data.preference.getOrDefault | ||||
| import eu.kanade.tachiyomi.ui.base.controller.DialogController | ||||
| import eu.kanade.tachiyomi.ui.base.controller.popControllerWithTag | ||||
| import eu.kanade.tachiyomi.ui.base.controller.requestPermissionsSafe | ||||
| import eu.kanade.tachiyomi.ui.setting.backup.BackupNotifier | ||||
| import eu.kanade.tachiyomi.util.preference.defaultValue | ||||
| @@ -197,7 +196,9 @@ class SettingsBackupController : SettingsController() { | ||||
|             CODE_BACKUP_RESTORE -> if (data != null && resultCode == Activity.RESULT_OK) { | ||||
|                 val uri = data.data | ||||
|                 if (uri != null) { | ||||
|                     RestoreBackupDialog(uri).showDialog(router) | ||||
|                     val ctrl = RestoreBackupDialog(uri) | ||||
|                     ctrl.targetController = this@SettingsBackupController | ||||
|                     ctrl.showDialog(router) | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| @@ -268,9 +269,8 @@ class SettingsBackupController : SettingsController() { | ||||
|                     .onPositive { _, _ -> | ||||
|                         val context = applicationContext | ||||
|                         if (context != null) { | ||||
|                             RestoringBackupDialog().showDialog(router, TAG_RESTORING_BACKUP_DIALOG) | ||||
|                             (targetController as SettingsBackupController).notifier.showRestoreProgress() | ||||
|                             BackupRestoreService.start(context, args.getParcelable(KEY_URI)!!) | ||||
|  | ||||
|                             isRestoreStarted = true | ||||
|                         } | ||||
|                     } | ||||
| @@ -282,41 +282,6 @@ class SettingsBackupController : SettingsController() { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     class RestoringBackupDialog : DialogController() { | ||||
|         private var materialDialog: MaterialDialog? = null | ||||
|  | ||||
|         override fun onCreateDialog(savedViewState: Bundle?): Dialog { | ||||
|             return MaterialDialog.Builder(activity!!) | ||||
|                     .title(R.string.backup) | ||||
|                     .content(R.string.restoring_backup) | ||||
|                     .progress(false, 100, true) | ||||
|                     .cancelable(false) | ||||
|                     .negativeText(R.string.action_stop) | ||||
|                     .onNegative { _, _ -> | ||||
|                         applicationContext?.let { BackupRestoreService.stop(it) } | ||||
|                     } | ||||
|                     .build() | ||||
|                     .also { materialDialog = it } | ||||
|         } | ||||
|  | ||||
|         override fun onDestroyView(view: View) { | ||||
|             super.onDestroyView(view) | ||||
|             materialDialog = null | ||||
|         } | ||||
|  | ||||
|         override fun onRestoreInstanceState(savedInstanceState: Bundle) { | ||||
|             super.onRestoreInstanceState(savedInstanceState) | ||||
|             router.popController(this) | ||||
|         } | ||||
|  | ||||
|         fun updateProgress(content: String?, progress: Int, amount: Int) { | ||||
|             val dialog = materialDialog ?: return | ||||
|             dialog.setContent(content) | ||||
|             dialog.setProgress(progress) | ||||
|             dialog.maxProgress = amount | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     inner class BackupBroadcastReceiver : BroadcastReceiver() { | ||||
|         override fun onReceive(context: Context, intent: Intent) { | ||||
|             when (intent.getStringExtra(BackupConst.ACTION)) { | ||||
| @@ -336,13 +301,11 @@ class SettingsBackupController : SettingsController() { | ||||
|                     val progress = intent.getIntExtra(BackupConst.EXTRA_PROGRESS, 0) | ||||
|                     val amount = intent.getIntExtra(BackupConst.EXTRA_AMOUNT, 0) | ||||
|                     val content = intent.getStringExtra(BackupConst.EXTRA_CONTENT) | ||||
|                     (router.getControllerWithTag(TAG_RESTORING_BACKUP_DIALOG) | ||||
|                             as? RestoringBackupDialog)?.updateProgress(content, progress, amount) | ||||
|                     notifier.showRestoreProgress(content, progress, amount) | ||||
|                 } | ||||
|                 BackupConst.ACTION_RESTORE_COMPLETED -> { | ||||
|                     isRestoreStarted = false | ||||
|  | ||||
|                     router.popControllerWithTag(TAG_RESTORING_BACKUP_DIALOG) | ||||
|                     val time = intent.getLongExtra(BackupConst.EXTRA_TIME, 0) | ||||
|                     val errorCount = intent.getIntExtra(BackupConst.EXTRA_ERRORS, 0) | ||||
|                     val path = intent.getStringExtra(BackupConst.EXTRA_ERROR_FILE_PATH) | ||||
| @@ -352,7 +315,6 @@ class SettingsBackupController : SettingsController() { | ||||
|                 BackupConst.ACTION_RESTORE_ERROR -> { | ||||
|                     isRestoreStarted = false | ||||
|  | ||||
|                     router.popControllerWithTag(TAG_RESTORING_BACKUP_DIALOG) | ||||
|                     notifier.showRestoreError(intent.getStringExtra(BackupConst.EXTRA_ERROR_MESSAGE)) | ||||
|                 } | ||||
|             } | ||||
| @@ -364,8 +326,6 @@ class SettingsBackupController : SettingsController() { | ||||
|         const val CODE_BACKUP_RESTORE = 502 | ||||
|         const val CODE_BACKUP_DIR = 503 | ||||
|  | ||||
|         const val TAG_RESTORING_BACKUP_DIALOG = "RestoringBackupDialog" | ||||
|  | ||||
|         var isBackupStarted = false | ||||
|         var isRestoreStarted = false | ||||
|     } | ||||
|   | ||||
| @@ -66,14 +66,30 @@ internal class BackupNotifier(private val context: Context) { | ||||
|  | ||||
|             addAction(R.drawable.ic_share_24dp, | ||||
|                 context.getString(R.string.action_share), | ||||
|                 NotificationReceiver.shareBackup(context, unifile.uri, Notifications.ID_BACKUP)) | ||||
|                 NotificationReceiver.shareBackupPendingBroadcast(context, unifile.uri, Notifications.ID_BACKUP)) | ||||
|         } | ||||
|  | ||||
|         notificationBuilder.show(Notifications.ID_BACKUP) | ||||
|     } | ||||
|  | ||||
|     fun showRestoreProgress() { | ||||
|         // TODO | ||||
|     fun showRestoreProgress(content: String = "", progress: Int = 0, maxAmount: Int = 100) { | ||||
|         with(notificationBuilder) { | ||||
|             setContentTitle(context.getString(R.string.restoring_backup)) | ||||
|             setContentText(content) | ||||
|  | ||||
|             setProgress(maxAmount, progress, false) | ||||
|  | ||||
|             // Clear old actions if they exist | ||||
|             if (mActions.isNotEmpty()) { | ||||
|                 mActions.clear() | ||||
|             } | ||||
|  | ||||
|             addAction(R.drawable.ic_close_24dp, | ||||
|                 context.getString(R.string.action_stop), | ||||
|                 NotificationReceiver.cancelRestorePendingBroadcast(context, Notifications.ID_RESTORE)) | ||||
|         } | ||||
|  | ||||
|         notificationBuilder.show(Notifications.ID_RESTORE) | ||||
|     } | ||||
|  | ||||
|     fun showRestoreError(error: String?) { | ||||
| @@ -116,7 +132,7 @@ internal class BackupNotifier(private val context: Context) { | ||||
|  | ||||
|                 addAction(R.drawable.nnf_ic_file_folder, | ||||
|                     context.getString(R.string.action_open_log), | ||||
|                     NotificationReceiver.openErrorLog(context, uri)) | ||||
|                     NotificationReceiver.openErrorLogPendingActivity(context, uri)) | ||||
|             } | ||||
|         } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user