diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt
index 41a8abe7f..9b86bb674 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt
@@ -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
*
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreService.kt
index 234c10ac6..3bd2998bb 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreService.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreService.kt
@@ -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)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt
index 9a8d4ae40..0fbbdf4a2 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt
@@ -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)
+ }
}
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt
index de820dac8..6b25a19c8 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt
@@ -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
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/backup/BackupNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/backup/BackupNotifier.kt
index bf57becfd..acb4daef9 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/backup/BackupNotifier.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/backup/BackupNotifier.kt
@@ -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))
}
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b50074408..477c2ead5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -315,7 +315,6 @@
Service
Backup frequency
Max automatic backups
- Restoring backup\n%1$s added to library
Source not found
Restoring backup\n%1$s source not found
Backup created
@@ -330,6 +329,7 @@
Restore is already in progress
Restoring backup
Restoring backup failed
+ Canceled restore
Clear chapter cache