From 22be5d5b1274cc2edb82b51acd52773291be6417 Mon Sep 17 00:00:00 2001 From: SeniorZhai Date: Wed, 18 Mar 2026 11:46:58 +0800 Subject: [PATCH 1/4] Move battery optimization reminder into bottom sheet --- app/src/main/AndroidManifest.xml | 4 - .../android/extension/ContextExtension.kt | 80 +++++++++---- .../mixin/android/job/BlazeMessageService.kt | 18 +-- .../BatteryOptimizationDialogActivity.kt | 106 ------------------ .../one/mixin/android/ui/home/MainActivity.kt | 28 ----- .../ReminderBottomSheetDialogFragment.kt | 67 ++++++++++- .../android/ui/home/reminder/ReminderPage.kt | 14 ++- ...MobileReminderBottomSheetDialogFragment.kt | 3 +- app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 14 files changed, 139 insertions(+), 187 deletions(-) delete mode 100644 app/src/main/java/one/mixin/android/ui/common/BatteryOptimizationDialogActivity.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4884b4df10..5613a376d6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -348,10 +348,6 @@ android:windowSoftInputMode="adjustResize|stateAlwaysHidden" android:launchMode="singleTop" android:theme="@style/AppTheme.Blur" /> - = Build.VERSION_CODES.P && !RomUtil.isEmui) { + getSystemService()?.isBackgroundRestricted == true } else { - openIgnoreBatteryOptimizationSetting(newTask) + getSystemService()?.isIgnoringBatteryOptimizations(packageName) == false } } -fun Context.requestIgnoreBatteryOptimization(newTask: Boolean = false) { - Intent().apply { - action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS - data = Uri.parse("package:$packageName") - if (newTask) { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) +private fun Context.hasCustomRomBackgroundRestriction(): Boolean { + return when (RomPermissionUtil.getCurrentRomType()) { + RomPermissionUtil.RomType.MIUI, + RomPermissionUtil.RomType.OPPO, + RomPermissionUtil.RomType.VIVO, + RomPermissionUtil.RomType.HUAWEI, + RomPermissionUtil.RomType.HONOR + -> !RomPermissionUtil.checkBackgroundStartPermission(this) + else -> false + } +} + +@SuppressLint("BatteryLife") +fun Context.openBatteryOptimizationSetting() { + val appDetailsIntent = + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { + data = Uri.parse("package:$packageName") } - try { - startActivity(this) - } catch (e: ActivityNotFoundException) { - Timber.w("Battery optimization activity not found") + val requestIntent = + Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { + data = Uri.parse("package:$packageName") + } + val intents = + if (RomUtil.isOneUi) { + listOf(appDetailsIntent, requestIntent) + } else if (Build.MANUFACTURER.equals("google", ignoreCase = true) || Build.MANUFACTURER.equals("samsung", ignoreCase = true)) { + listOf(requestIntent, appDetailsIntent) + } else { + listOf(appDetailsIntent, requestIntent) } + + if (!intents.any(::tryStartActivity)) { + Timber.w("Battery optimization page activity not found") } } -fun Context.openIgnoreBatteryOptimizationSetting(newTask: Boolean = false) { - Intent().apply { - action = Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS - if (newTask) { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - } - try { - startActivity(this) - } catch (e: ActivityNotFoundException) { - Timber.w("Power setting activity not found") +private fun Context.tryStartActivity(intent: Intent): Boolean { + val launchIntent = + Intent(intent).apply { + if (this@tryStartActivity !is Activity) { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } } + if (launchIntent.resolveActivity(packageManager) == null) { + return false + } + return try { + startActivity(launchIntent) + true + } catch (e: ActivityNotFoundException) { + false + } catch (e: SecurityException) { + false } } diff --git a/app/src/main/java/one/mixin/android/job/BlazeMessageService.kt b/app/src/main/java/one/mixin/android/job/BlazeMessageService.kt index 0669d7edf6..1f3773288d 100644 --- a/app/src/main/java/one/mixin/android/job/BlazeMessageService.kt +++ b/app/src/main/java/one/mixin/android/job/BlazeMessageService.kt @@ -1,18 +1,14 @@ package one.mixin.android.job import android.annotation.SuppressLint -import android.app.ActivityManager import android.app.PendingIntent import android.content.Context import android.content.Intent import android.content.pm.ServiceInfo -import android.os.Build import android.os.IBinder -import android.os.PowerManager import androidx.core.app.NotificationCompat import androidx.core.app.ServiceCompat import androidx.core.content.ContextCompat -import androidx.core.content.getSystemService import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleService import androidx.lifecycle.lifecycleScope @@ -53,6 +49,7 @@ import one.mixin.android.db.pending.PendingDatabase import one.mixin.android.event.ExpiredEvent import one.mixin.android.extension.base64Encode import one.mixin.android.extension.currentTimeSeconds +import one.mixin.android.extension.isBatteryOptimizationRestricted import one.mixin.android.extension.networkConnected import one.mixin.android.extension.notificationManager import one.mixin.android.extension.supportsOreo @@ -65,11 +62,9 @@ import one.mixin.android.messenger.Hedwig import one.mixin.android.messenger.HedwigImp import one.mixin.android.receiver.ExitBroadcastReceiver import one.mixin.android.session.Session -import one.mixin.android.ui.common.BatteryOptimizationDialogActivity import one.mixin.android.ui.home.MainActivity import one.mixin.android.util.ChannelManager.Companion.createNodeChannel import one.mixin.android.util.GsonHelper -import one.mixin.android.util.RomUtil import one.mixin.android.util.reportException import one.mixin.android.vo.CallStateLiveData import one.mixin.android.vo.MessageStatus @@ -170,8 +165,6 @@ class BlazeMessageService : LifecycleService(), NetworkEventProvider.Listener, C private val accountId = Session.getAccountId() private val gson = GsonHelper.customGson - private val powerManager by lazy { getSystemService() } - private val activityManager by lazy { getSystemService() } private var isIgnoringBatteryOptimizations = false private var disposable: Disposable? = null private val destroyScope = scope(Lifecycle.Event.ON_DESTROY) @@ -241,9 +234,6 @@ class BlazeMessageService : LifecycleService(), NetworkEventProvider.Listener, C if (intent.action == ACTION_TO_BACKGROUND) { stopForeground(STOP_FOREGROUND_REMOVE) - if (!isIgnoringBatteryOptimizations) { - BatteryOptimizationDialogActivity.show(this, true) - } return START_STICKY } @@ -288,11 +278,7 @@ class BlazeMessageService : LifecycleService(), NetworkEventProvider.Listener, C } private fun updateIgnoringBatteryOptimizations() { - isIgnoringBatteryOptimizations = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !RomUtil.isEmui) { - activityManager?.isBackgroundRestricted?.not() - } else { - powerManager?.isIgnoringBatteryOptimizations(packageName) - } ?: false + isIgnoringBatteryOptimizations = !applicationContext.isBatteryOptimizationRestricted() } @SuppressLint("NewApi") diff --git a/app/src/main/java/one/mixin/android/ui/common/BatteryOptimizationDialogActivity.kt b/app/src/main/java/one/mixin/android/ui/common/BatteryOptimizationDialogActivity.kt deleted file mode 100644 index 103388159a..0000000000 --- a/app/src/main/java/one/mixin/android/ui/common/BatteryOptimizationDialogActivity.kt +++ /dev/null @@ -1,106 +0,0 @@ -package one.mixin.android.ui.common - -import android.content.Context -import android.content.Intent -import android.content.Intent.FLAG_ACTIVITY_NEW_TASK -import android.graphics.Typeface -import android.os.Build -import android.os.Bundle -import android.text.Spannable -import android.text.SpannableStringBuilder -import android.text.style.StyleSpan -import one.mixin.android.R -import one.mixin.android.extension.alertDialogBuilder -import one.mixin.android.extension.handleIgnoreBatteryOptimization -import one.mixin.android.session.Session -import one.mixin.android.util.RomUtil -import timber.log.Timber - -class BatteryOptimizationDialogActivity : BaseActivity() { - companion object { - const val ARGS_NEW_TASK = "args_new_task" - - fun show( - context: Context, - newTask: Boolean = false, - ) { - if (!Session.hasSafe()) return - Intent(context, BatteryOptimizationDialogActivity::class.java).apply { - putExtra(ARGS_NEW_TASK, newTask) - if (newTask) { - addFlags(FLAG_ACTIVITY_NEW_TASK) - } - context.startActivity(this) - } - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val newTask = intent.getBooleanExtra(ARGS_NEW_TASK, false) - alertDialogBuilder() - .setMessage( - replaceTags( - getString( - if (RomUtil.isOneUi) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - R.string.setting_battery_optimize_title_one_ui_above_s - } else { - R.string.setting_battery_optimize_title_one_ui_below_s - } - } else { - R.string.setting_battery_optimize_title - }, - ), - ), - ) - .setCancelable(false) - .setNegativeButton(R.string.Cancel) { dialog, _ -> - dialog.dismiss() - finish() - } - .setPositiveButton(R.string.Go_settings) { dialog, _ -> - handleIgnoreBatteryOptimization(newTask) - dialog.dismiss() - finish() - } - .show() - } - - private fun replaceTags(str: String): SpannableStringBuilder { - try { - var start: Int - var end: Int - val stringBuilder = StringBuilder(str) - val bolds: ArrayList = ArrayList() - while (stringBuilder.indexOf("").also { start = it } != -1) { - stringBuilder.replace(start, start + 3, "") - end = stringBuilder.indexOf("") - if (end == -1) { - end = stringBuilder.indexOf("") - } - stringBuilder.replace(end, end + 4, "") - bolds.add(start) - bolds.add(end) - } - while (stringBuilder.indexOf("**").also { start = it } != -1) { - stringBuilder.replace(start, start + 2, "") - end = stringBuilder.indexOf("**") - if (end >= 0) { - stringBuilder.replace(end, end + 2, "") - bolds.add(start) - bolds.add(end) - } - } - - val spannableStringBuilder = SpannableStringBuilder(stringBuilder) - for (a in 0 until bolds.count() / 2) { - spannableStringBuilder.setSpan(StyleSpan(Typeface.BOLD), bolds[a * 2], bolds[a * 2 + 1], Spannable.SPAN_INCLUSIVE_EXCLUSIVE) - } - return spannableStringBuilder - } catch (e: Exception) { - Timber.e(e) - } - return SpannableStringBuilder(str) - } -} diff --git a/app/src/main/java/one/mixin/android/ui/home/MainActivity.kt b/app/src/main/java/one/mixin/android/ui/home/MainActivity.kt index 891f842f65..a6793f2dc7 100644 --- a/app/src/main/java/one/mixin/android/ui/home/MainActivity.kt +++ b/app/src/main/java/one/mixin/android/ui/home/MainActivity.kt @@ -3,7 +3,6 @@ package one.mixin.android.ui.home import android.Manifest import android.annotation.SuppressLint import android.app.Activity -import android.app.ActivityManager import android.app.Dialog import android.app.NotificationManager import android.content.Context @@ -12,7 +11,6 @@ import android.content.IntentSender import android.graphics.Color import android.os.Build import android.os.Bundle -import android.os.PowerManager import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.getSystemService import androidx.fragment.app.DialogFragment @@ -51,7 +49,6 @@ import one.mixin.android.Constants import one.mixin.android.Constants.APP_VERSION import one.mixin.android.Constants.Account import one.mixin.android.Constants.Account.PREF_BACKUP -import one.mixin.android.Constants.Account.PREF_BATTERY_OPTIMIZE import one.mixin.android.Constants.Account.PREF_CHECK_STORAGE import one.mixin.android.Constants.Account.PREF_DEVICE_SDK import one.mixin.android.Constants.Account.PREF_LOGIN_OR_SIGN_UP @@ -131,7 +128,6 @@ import one.mixin.android.tip.wc.WCEvent import one.mixin.android.tip.wc.WalletConnect import one.mixin.android.tip.wc.WalletConnectV2 import one.mixin.android.ui.common.BaseFragment -import one.mixin.android.ui.common.BatteryOptimizationDialogActivity import one.mixin.android.ui.common.BlazeBaseActivity import one.mixin.android.ui.common.LoginVerifyBottomSheetDialogFragment import one.mixin.android.ui.common.NavigationController @@ -174,7 +170,6 @@ import one.mixin.android.util.BiometricUtil import one.mixin.android.util.ErrorHandler import one.mixin.android.util.ErrorHandler.Companion.SERVER import one.mixin.android.util.GsonHelper -import one.mixin.android.util.RomUtil import one.mixin.android.util.RootUtil import one.mixin.android.util.analytics.AnalyticsTracker import one.mixin.android.util.reportException @@ -486,7 +481,6 @@ class MainActivity : BlazeBaseActivity(), WalletMissingBtcAddressFragment.Callba refreshStickerAlbum() refreshExternalSchemes() cleanCache() - checkBatteryOptimization() if (!defaultSharedPreferences.getBoolean(PREF_SYNC_CIRCLE, false)) { jobManager.addJobInBackground(RefreshCircleJob()) @@ -628,28 +622,6 @@ class MainActivity : BlazeBaseActivity(), WalletMissingBtcAddressFragment.Callba return currentVersion > MINI_VERSION && CURRENT_VERSION != currentVersion } - @SuppressLint("BatteryLife") - private fun checkBatteryOptimization() { - val batteryOptimize = defaultSharedPreferences.getLong(PREF_BATTERY_OPTIMIZE, 0) - val cur = System.currentTimeMillis() - if (cur - batteryOptimize > INTERVAL_24_HOURS) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !RomUtil.isEmui) { - getSystemService()?.let { am -> - if (am.isBackgroundRestricted) { - BatteryOptimizationDialogActivity.show(this) - } - } - } else { - getSystemService()?.let { pm -> - if (!pm.isIgnoringBatteryOptimizations(packageName)) { - BatteryOptimizationDialogActivity.show(this) - } - } - } - defaultSharedPreferences.putLong(PREF_BATTERY_OPTIMIZE, cur) - } - } - private fun delayShowModifyMobile() = lifecycleScope.launch { delay(2000) diff --git a/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderBottomSheetDialogFragment.kt b/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderBottomSheetDialogFragment.kt index 719589526c..5ddfe06741 100644 --- a/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderBottomSheetDialogFragment.kt +++ b/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderBottomSheetDialogFragment.kt @@ -3,13 +3,17 @@ package one.mixin.android.ui.home.reminder import android.annotation.SuppressLint import android.app.Dialog import android.content.Context +import android.os.Build import android.view.Gravity import android.view.View import android.view.ViewGroup +import androidx.annotation.StringRes import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource import androidx.core.app.NotificationManagerCompat import dagger.hilt.android.AndroidEntryPoint import one.mixin.android.BuildConfig +import one.mixin.android.Constants.Account.PREF_BATTERY_OPTIMIZE import one.mixin.android.Constants.INTERVAL_24_HOURS import one.mixin.android.Constants.INTERVAL_48_HOURS import one.mixin.android.Constants.INTERVAL_7_DAYS @@ -19,7 +23,9 @@ import one.mixin.android.compose.theme.languageBasedImage import one.mixin.android.extension.booleanFromAttribute import one.mixin.android.extension.defaultSharedPreferences import one.mixin.android.extension.getSafeAreaInsetsTop +import one.mixin.android.extension.isBatteryOptimizationRestricted import one.mixin.android.extension.isNightMode +import one.mixin.android.extension.openBatteryOptimizationSetting import one.mixin.android.extension.openNotificationSetting import one.mixin.android.extension.putLong import one.mixin.android.extension.screenHeight @@ -28,6 +34,7 @@ import one.mixin.android.session.Session import one.mixin.android.ui.common.MixinComposeBottomSheetDialogFragment import one.mixin.android.ui.home.MainActivity import one.mixin.android.ui.setting.SettingActivity +import one.mixin.android.util.RomUtil import one.mixin.android.util.SystemUIManager @AndroidEntryPoint @@ -74,6 +81,13 @@ class ReminderBottomSheetDialogFragment : MixinComposeBottomSheetDialogFragment( return PopupType.NotificationPermissionReminder } + val lastBatteryOptimizationReminderTime = sharedPreferences.getLong(PREF_BATTERY_OPTIMIZE, 0) + if (System.currentTimeMillis() - lastBatteryOptimizationReminderTime > INTERVAL_24_HOURS && + context.isBatteryOptimizationRestricted() + ) { + return PopupType.BatteryOptimizationReminder + } + val lastEmergencyContactReminderTime = sharedPreferences.getLong(PREF_EMERGENCY_CONTACT, 0) if (System.currentTimeMillis() - lastEmergencyContactReminderTime > INTERVAL_7_DAYS && totalUsd >= 100 && Session.hasPhone() && @@ -100,6 +114,15 @@ class ReminderBottomSheetDialogFragment : MixinComposeBottomSheetDialogFragment( } return 0 } + + @StringRes + private fun getBatteryOptimizationContentResId(): Int { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + R.string.setting_battery_optimize_title_one_ui_above_s + } else { + R.string.setting_battery_optimize_title_one_ui_below_s + } + } } private val popupType by lazy { @@ -108,6 +131,7 @@ class ReminderBottomSheetDialogFragment : MixinComposeBottomSheetDialogFragment( PopupType.NewVersionReminder::class.java.simpleName -> PopupType.NewVersionReminder PopupType.BackupMnemonicReminder::class.java.simpleName -> PopupType.BackupMnemonicReminder PopupType.NotificationPermissionReminder::class.java.simpleName -> PopupType.NotificationPermissionReminder + PopupType.BatteryOptimizationReminder::class.java.simpleName -> PopupType.BatteryOptimizationReminder PopupType.RestoreContactReminder::class.java.simpleName -> PopupType.RestoreContactReminder else -> throw IllegalArgumentException("Unknown PopupType") } @@ -148,7 +172,7 @@ class ReminderBottomSheetDialogFragment : MixinComposeBottomSheetDialogFragment( MixinAppTheme { when (popupType) { is PopupType.NewVersionReminder -> { - ReminderPage(R.drawable.bg_reminber_version, R.string.New_Update_Available, R.string.New_Update_Available_desc, R.string.Update_Now, action = { + ReminderPage(R.drawable.bg_reminber_version, R.string.New_Update_Available, stringResource(R.string.New_Update_Available_desc), R.string.Update_Now, action = { Session.getAccount()?.system?.messenger?.let { it -> (requireActivity() as? MainActivity)?.showUpdate(it.releaseUrl) } dismissAllowingStateLoss() }, dismiss = { @@ -161,7 +185,7 @@ class ReminderBottomSheetDialogFragment : MixinComposeBottomSheetDialogFragment( } is PopupType.BackupMnemonicReminder -> { - ReminderPage(R.drawable.bg_reminber_mnemonic, R.string.Backup_Mnemonic_Phrase, R.string.Backup_Mnemonic_Phrase_desc, R.string.Backup_Now, action = { + ReminderPage(R.drawable.bg_reminber_mnemonic, R.string.Backup_Mnemonic_Phrase, stringResource(R.string.Backup_Mnemonic_Phrase_desc), R.string.Backup_Now, action = { SettingActivity.showMnemonicPhrase(requireContext()) dismissAllowingStateLoss() }, dismiss = { @@ -178,7 +202,7 @@ class ReminderBottomSheetDialogFragment : MixinComposeBottomSheetDialogFragment( languageBasedImage( R.drawable.bg_reminder_notifaction, R.drawable.bg_reminder_notifaction_cn - ), R.string.Turn_On_Notifications, R.string.notification_content, R.string.Enable_Notifications, action = { + ), R.string.Turn_On_Notifications, stringResource(R.string.notification_content), R.string.Enable_Notifications, action = { requireContext().openNotificationSetting() dismissAllowingStateLoss() }, dismiss = { @@ -190,8 +214,35 @@ class ReminderBottomSheetDialogFragment : MixinComposeBottomSheetDialogFragment( }) } + is PopupType.BatteryOptimizationReminder -> { + ReminderPage( + languageBasedImage( + R.drawable.bg_reminder_notifaction, + R.drawable.bg_reminder_notifaction_cn + ), + R.string.Battery_Optimization, + batteryOptimizationContent(), + R.string.Go_settings, + action = { + requireContext().defaultSharedPreferences.putLong( + PREF_BATTERY_OPTIMIZE, + System.currentTimeMillis(), + ) + requireContext().openBatteryOptimizationSetting() + dismissAllowingStateLoss() + }, + dismiss = { + requireContext().defaultSharedPreferences.putLong( + PREF_BATTERY_OPTIMIZE, + System.currentTimeMillis(), + ) + dismissAllowingStateLoss() + }, + ) + } + is PopupType.RestoreContactReminder -> { - ReminderPage(R.drawable.bg_reminber_recovery_contact, R.string.Emergency_Contact, R.string.setting_emergency_content, R.string.Continue, action = { + ReminderPage(R.drawable.bg_reminber_recovery_contact, R.string.Emergency_Contact, stringResource(R.string.setting_emergency_content), R.string.Continue, action = { SettingActivity.showEmergencyContact(requireContext()) dismissAllowingStateLoss() }, dismiss = { @@ -214,10 +265,18 @@ class ReminderBottomSheetDialogFragment : MixinComposeBottomSheetDialogFragment( override fun showError(error: String) { } + private fun batteryOptimizationContent(): String { + return getString(getBatteryOptimizationContentResId()) + .replace("", "") + .replace("", "") + .replace("**", "") + } + sealed class PopupType { object NewVersionReminder : PopupType() object BackupMnemonicReminder : PopupType() object NotificationPermissionReminder : PopupType() + object BatteryOptimizationReminder : PopupType() object RestoreContactReminder : PopupType() } } diff --git a/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderPage.kt b/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderPage.kt index b8baa4dd12..4b5a32e16e 100644 --- a/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderPage.kt +++ b/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderPage.kt @@ -29,11 +29,17 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import one.mixin.android.R - import one.mixin.android.compose.theme.MixinAppTheme @Composable -fun ReminderPage(@DrawableRes contentImage: Int, @StringRes title: Int, @StringRes content: Int, @StringRes actionStr: Int, action: () -> Unit, dismiss: () -> Unit) { +fun ReminderPage( + @DrawableRes contentImage: Int, + @StringRes title: Int, + content: String, + @StringRes actionStr: Int, + action: () -> Unit, + dismiss: () -> Unit, +) { Column( horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier .clip(RoundedCornerShape(topEnd = 12.dp, topStart = 12.dp)) @@ -73,7 +79,7 @@ fun ReminderPage(@DrawableRes contentImage: Int, @StringRes title: Int, @StringR ) Spacer(modifier = Modifier.height(10.dp)) Text( - text = stringResource(content), + text = content, color = MixinAppTheme.colors.textAssist, modifier = Modifier.fillMaxWidth(), textAlign = androidx.compose.ui.text.style.TextAlign.Center @@ -116,4 +122,4 @@ fun ReminderPage(@DrawableRes contentImage: Int, @StringRes title: Int, @StringR Spacer(modifier = Modifier.height(20.dp)) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/one/mixin/android/ui/home/reminder/VerifyMobileReminderBottomSheetDialogFragment.kt b/app/src/main/java/one/mixin/android/ui/home/reminder/VerifyMobileReminderBottomSheetDialogFragment.kt index 730678b45a..c5fd496502 100644 --- a/app/src/main/java/one/mixin/android/ui/home/reminder/VerifyMobileReminderBottomSheetDialogFragment.kt +++ b/app/src/main/java/one/mixin/android/ui/home/reminder/VerifyMobileReminderBottomSheetDialogFragment.kt @@ -7,6 +7,7 @@ import android.view.Gravity import android.view.View import android.view.ViewGroup import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource import dagger.hilt.android.AndroidEntryPoint import one.mixin.android.Constants import one.mixin.android.R @@ -165,7 +166,7 @@ class VerifyMobileReminderBottomSheetDialogFragment : MixinComposeBottomSheetDia ReminderPage( R.drawable.bg_reminder_verify_mobile, R.string.Verify_Mobile_Number, - subtitleResId, + stringResource(subtitleResId), R.string.Verify_Now, action = { dismissAllowingStateLoss() diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 2020654b0f..fdf0d6cad8 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -839,6 +839,7 @@ Se ha establecido el PIN con éxito Aprobado: %1$s, último acceso: %2$s ID de Mixin, nombre + Optimización de batería Esto mejorará la confiabilidad de las notificaciones entrantes y las llamadas de Mixin. Esto mejorará la confiabilidad de las notificaciones entrantes y las llamadas de Mixin. Selecciona **Optimizado** o **Sin restricciones** en Configuración > Batería. Esto mejorará la confiabilidad de las notificaciones entrantes y las llamadas de Mixin. Pulsa Configuración -> Batería y activa **Permitir actividad en segundo plano**. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 5cef39beeb..889ab7229c 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -787,6 +787,7 @@ PINコードの設定が完了しました。 許可: %1$s, 最終アクセス: %2$s Mixin ID, 名前 + バッテリー最適化 これにより、通知の受信や Mixinの呼び出しに対する確実性が向上します これにより、通知の受信やMixinの呼び出しに対する確実性が向上します。「設定」→「バッテリー」をタップしてください。そして**「最適化」** もしくは **「制限なし」**を選択してください。 これにより、通知の受信やMixinの呼び出しに対する確実性が向上します。「設定」→「バッテリー」をタップしてください。そして**「バックグラウンドでの活動を許可」**をオンにしてください。 diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 82de20581a..ddecec7345 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -808,6 +808,7 @@ ПИН-код успешно установлен Одобрено: %1$s, последнее обращение: %2$s Mixin ID, имя + Оптимизация батареи Это повысит надежность входящих уведомлений и вызовов Mixin. Это повысит надежность входящих уведомлений и вызовов Mixin. Выберите **Оптимизированный** или **Неограниченный** в меню «Настройки» > «Аккумулятор». Это повысит надежность входящих уведомлений и вызовов Mixin. Нажмите «Настройки» -> «Аккумулятор» и включите **Разрешить фоновую активность**. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 3dce5a2f84..933415b354 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -974,6 +974,7 @@ PIN 设置成功 授权时间:%1$s, 上次访问:%2$s Mixin ID, 昵称 + 电池优化 这将提高 Mixin 通知和呼叫的可靠性。 这将提高 Mixin 通知和呼叫的可靠性. 请在设置 > 电池中选择 **已优化** 或者 **不受限制**。 这将提高 Mixin 通知和呼叫的可靠性。点击设置 -> 电池,开启**允许后台活动**。 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 31cf205f08..4ddee0857e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -794,6 +794,7 @@ PIN 設定成功 授權時間:%1$s, 上次訪問:%2$s Mixin ID, 暱稱 + 電池最佳化 這將提高 Mixin 通知和呼叫的可靠性。 這將提高 Mixin 通知和呼叫的可靠性. 請在設定 > 電池中選擇 **已最佳化** 或者 **不受限制**。 這將提高 Mixin 通知和呼叫的可靠性。點選設定 -> 電池,開啟**允許後臺活動**。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 03e7bed8c4..88236bfdbd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1004,6 +1004,7 @@ Set PIN successfully Approved: %1$s, Last Accessed: %2$s Mixin ID, Name + Battery Optimization This will improve reliability for incoming notifications and Mixin calls This will improve reliability for incoming notifications and Mixin calls. Please select **Optimised** or **Unrestricted** in Settings > Battery. This will improve reliability for incoming notifications and Mixin calls. Tap Settings -> Battery and turn **Allow background activity** on. From a82ab29258e67f6613c151a8412158167b4437e3 Mon Sep 17 00:00:00 2001 From: SeniorZhai Date: Mon, 23 Mar 2026 12:16:02 +0800 Subject: [PATCH 2/4] Replace image --- .../ReminderBottomSheetDialogFragment.kt | 5 +---- .../bg_reminder_battery_optimization.png | Bin 0 -> 41539 bytes 2 files changed, 1 insertion(+), 4 deletions(-) create mode 100644 app/src/main/res/drawable-xxhdpi/bg_reminder_battery_optimization.png diff --git a/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderBottomSheetDialogFragment.kt b/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderBottomSheetDialogFragment.kt index 5ddfe06741..057d4a50dc 100644 --- a/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderBottomSheetDialogFragment.kt +++ b/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderBottomSheetDialogFragment.kt @@ -216,10 +216,7 @@ class ReminderBottomSheetDialogFragment : MixinComposeBottomSheetDialogFragment( is PopupType.BatteryOptimizationReminder -> { ReminderPage( - languageBasedImage( - R.drawable.bg_reminder_notifaction, - R.drawable.bg_reminder_notifaction_cn - ), + R.drawable.bg_reminder_battery_optimization, R.string.Battery_Optimization, batteryOptimizationContent(), R.string.Go_settings, diff --git a/app/src/main/res/drawable-xxhdpi/bg_reminder_battery_optimization.png b/app/src/main/res/drawable-xxhdpi/bg_reminder_battery_optimization.png new file mode 100644 index 0000000000000000000000000000000000000000..511aecc65f8a4a38dfa4d3db5660ddd7fc3dc04a GIT binary patch literal 41539 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 F{{xm+BU=Cf literal 0 HcmV?d00001 From 0b0e53ee496f28c143b7acfc8bf7d1c3fd7b621c Mon Sep 17 00:00:00 2001 From: SeniorZhai Date: Mon, 23 Mar 2026 12:51:17 +0800 Subject: [PATCH 3/4] Use system battery optimization checks only --- .../android/extension/ContextExtension.kt | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/one/mixin/android/extension/ContextExtension.kt b/app/src/main/java/one/mixin/android/extension/ContextExtension.kt index 430132d443..38f829e366 100644 --- a/app/src/main/java/one/mixin/android/extension/ContextExtension.kt +++ b/app/src/main/java/one/mixin/android/extension/ContextExtension.kt @@ -1280,7 +1280,7 @@ fun Context.getStringDeviceId(): String { } fun Context.isBatteryOptimizationRestricted(): Boolean { - return isSystemBatteryOptimizationRestricted() || hasCustomRomBackgroundRestriction() + return isSystemBatteryOptimizationRestricted() } private fun Context.isSystemBatteryOptimizationRestricted(): Boolean { @@ -1291,18 +1291,6 @@ private fun Context.isSystemBatteryOptimizationRestricted(): Boolean { } } -private fun Context.hasCustomRomBackgroundRestriction(): Boolean { - return when (RomPermissionUtil.getCurrentRomType()) { - RomPermissionUtil.RomType.MIUI, - RomPermissionUtil.RomType.OPPO, - RomPermissionUtil.RomType.VIVO, - RomPermissionUtil.RomType.HUAWEI, - RomPermissionUtil.RomType.HONOR - -> !RomPermissionUtil.checkBackgroundStartPermission(this) - else -> false - } -} - @SuppressLint("BatteryLife") fun Context.openBatteryOptimizationSetting() { val appDetailsIntent = @@ -1316,7 +1304,12 @@ fun Context.openBatteryOptimizationSetting() { val intents = if (RomUtil.isOneUi) { listOf(appDetailsIntent, requestIntent) - } else if (Build.MANUFACTURER.equals("google", ignoreCase = true) || Build.MANUFACTURER.equals("samsung", ignoreCase = true)) { + } else if ( + Build.MANUFACTURER.equals("google", ignoreCase = true) || + Build.MANUFACTURER.equals("samsung", ignoreCase = true) || + Build.MANUFACTURER.equals("huawei", ignoreCase = true) || + Build.MANUFACTURER.equals("honor", ignoreCase = true) + ) { listOf(requestIntent, appDetailsIntent) } else { listOf(appDetailsIntent, requestIntent) From add20b68c441be2042bfe3ab727939f58353216f Mon Sep 17 00:00:00 2001 From: SeniorZhai Date: Wed, 22 Apr 2026 09:38:38 +0800 Subject: [PATCH 4/4] Update app/src/main/java/one/mixin/android/ui/home/reminder/ReminderBottomSheetDialogFragment.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../home/reminder/ReminderBottomSheetDialogFragment.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderBottomSheetDialogFragment.kt b/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderBottomSheetDialogFragment.kt index 68b473e13b..ffba334ca2 100644 --- a/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderBottomSheetDialogFragment.kt +++ b/app/src/main/java/one/mixin/android/ui/home/reminder/ReminderBottomSheetDialogFragment.kt @@ -102,10 +102,14 @@ class ReminderBottomSheetDialogFragment : MixinComposeBottomSheetDialogFragment( @StringRes private fun getBatteryOptimizationContentResId(): Int { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - R.string.setting_battery_optimize_title_one_ui_above_s + return if (one.mixin.android.util.RomUtil.isOneUi) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + R.string.setting_battery_optimize_title_one_ui_above_s + } else { + R.string.setting_battery_optimize_title_one_ui_below_s + } } else { - R.string.setting_battery_optimize_title_one_ui_below_s + R.string.setting_battery_optimize_title } } }