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 6e1a90c6b0..929bb20d66 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
@@ -7,6 +7,7 @@ import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.View
+import android.widget.Toast
import androidx.core.net.toUri
import androidx.core.os.bundleOf
import androidx.documentfile.provider.DocumentFile
@@ -25,6 +26,7 @@ import eu.kanade.tachiyomi.data.backup.legacy.LegacyBackupRestoreValidator
import eu.kanade.tachiyomi.data.preference.asImmediateFlow
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.util.system.getFilePicker
+import eu.kanade.tachiyomi.util.system.MiuiUtil
import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.util.view.requestFilePermissionsSafe
import kotlinx.coroutines.flow.launchIn
@@ -67,6 +69,11 @@ class SettingsBackupController : SettingsController() {
summaryRes = R.string.restore_from_backup_file
onClick {
+ if (MiuiUtil.isMiui() && MiuiUtil.isMiuiOptimizationDisabled()) {
+ context.toast(R.string.restore_miui_warning, Toast.LENGTH_LONG)
+ return@onClick
+ }
+
if (!BackupRestoreService.isRunning(context)) {
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/MiuiUtil.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/MiuiUtil.kt
new file mode 100644
index 0000000000..fde9bd7725
--- /dev/null
+++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/MiuiUtil.kt
@@ -0,0 +1,38 @@
+package eu.kanade.tachiyomi.util.system
+
+import android.annotation.SuppressLint
+import timber.log.Timber
+
+object MiuiUtil {
+
+ fun isMiui(): Boolean {
+ return getSystemProperty("ro.miui.ui.version.name")?.isNotEmpty() ?: false
+ }
+
+ @SuppressLint("PrivateApi")
+ fun isMiuiOptimizationDisabled(): Boolean {
+ if ("0" == getSystemProperty("persist.sys.miui_optimization")) {
+ return true
+ }
+
+ return try {
+ Class.forName("android.miui.AppOpsUtils")
+ .getDeclaredMethod("isXOptMode")
+ .invoke(null) as Boolean
+ } catch (e: Exception) {
+ false
+ }
+ }
+
+ @SuppressLint("PrivateApi")
+ private fun getSystemProperty(key: String?): String? {
+ return try {
+ Class.forName("android.os.SystemProperties")
+ .getDeclaredMethod("get", String::class.java)
+ .invoke(null, key) as String
+ } catch (e: Exception) {
+ Timber.w(e, "Unable to use SystemProperties.get")
+ null
+ }
+ }
+}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1d2b097b77..dfe4071c8e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -680,6 +680,7 @@
What do you want to backup?
Restoring backup
%02d min, %02d sec
+ MIUI Optimization must be enabled for restore to work correctly.
Progress
Complete