mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-03 23:58:55 +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))
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -315,7 +315,6 @@
 | 
			
		||||
    <string name="pref_backup_service_category">Service</string>
 | 
			
		||||
    <string name="pref_backup_interval">Backup frequency</string>
 | 
			
		||||
    <string name="pref_backup_slots">Max automatic backups</string>
 | 
			
		||||
    <string name="dialog_restoring_backup">Restoring backup\n%1$s added to library</string>
 | 
			
		||||
    <string name="source_not_found">Source not found</string>
 | 
			
		||||
    <string name="dialog_restoring_source_not_found">Restoring backup\n%1$s source not found</string>
 | 
			
		||||
    <string name="backup_created">Backup created</string>
 | 
			
		||||
@@ -330,6 +329,7 @@
 | 
			
		||||
    <string name="restore_in_progress">Restore is already in progress</string>
 | 
			
		||||
    <string name="restoring_backup">Restoring backup</string>
 | 
			
		||||
    <string name="restoring_backup_error">Restoring backup failed</string>
 | 
			
		||||
    <string name="restoring_backup_canceled">Canceled restore</string>
 | 
			
		||||
 | 
			
		||||
      <!-- Advanced section -->
 | 
			
		||||
    <string name="pref_clear_chapter_cache">Clear chapter cache</string>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user