From 51454056dbcfd3c80cc7981612374c9899f9eebb Mon Sep 17 00:00:00 2001 From: PiX <69745008+pixincreate@users.noreply.github.com> Date: Fri, 2 May 2025 23:27:40 +0530 Subject: [PATCH 1/5] feat: throw a pop-up asking user to enable `WRITE_SECURE_SETTINGS` permission inspired from https://github.com/pixincreate/Shizuku/commit/6f3b26e6325eeb3868677afd9ddadeb5e6a0bb07 --- .../moe/shizuku/manager/ShizukuSettings.java | 1 + .../manager/settings/SettingsFragment.kt | 207 ++++++++++++++++-- manager/src/main/res/values/strings.xml | 9 +- 3 files changed, 197 insertions(+), 20 deletions(-) diff --git a/manager/src/main/java/moe/shizuku/manager/ShizukuSettings.java b/manager/src/main/java/moe/shizuku/manager/ShizukuSettings.java index 5006068aa..790c5285d 100644 --- a/manager/src/main/java/moe/shizuku/manager/ShizukuSettings.java +++ b/manager/src/main/java/moe/shizuku/manager/ShizukuSettings.java @@ -26,6 +26,7 @@ public class ShizukuSettings { public static final String KEEP_START_ON_BOOT = "start_on_boot"; public static final String KEEP_START_ON_BOOT_WIRELESS = "start_on_boot_wireless"; public static final String ADB_ROOT = "adb_root"; + public static final String PENDING_SECURE_SETTINGS_GRANT = "pending_secure_settings_grant"; private static SharedPreferences sPreferences; diff --git a/manager/src/main/java/moe/shizuku/manager/settings/SettingsFragment.kt b/manager/src/main/java/moe/shizuku/manager/settings/SettingsFragment.kt index 3614e07e0..bcd3c25b8 100644 --- a/manager/src/main/java/moe/shizuku/manager/settings/SettingsFragment.kt +++ b/manager/src/main/java/moe/shizuku/manager/settings/SettingsFragment.kt @@ -3,6 +3,7 @@ package moe.shizuku.manager.settings import android.Manifest import android.content.ComponentName import android.content.Context +import android.content.Intent import android.content.pm.PackageManager import android.os.Build import android.os.Bundle @@ -40,8 +41,15 @@ import java.util.* import moe.shizuku.manager.ShizukuSettings.LANGUAGE as KEY_LANGUAGE import moe.shizuku.manager.ShizukuSettings.NIGHT_MODE as KEY_NIGHT_MODE import androidx.core.content.edit +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import moe.shizuku.manager.BuildConfig import moe.shizuku.manager.ShizukuSettings.ADB_ROOT +import moe.shizuku.manager.ShizukuSettings.PENDING_SECURE_SETTINGS_GRANT import moe.shizuku.manager.ktx.TAG +import moe.shizuku.manager.utils.ShizukuSystemApis +import rikka.core.util.ClipboardUtils +import rikka.html.text.HtmlCompat +import rikka.shizuku.Shizuku class SettingsFragment : PreferenceFragmentCompat() { @@ -98,40 +106,70 @@ class SettingsFragment : PreferenceFragmentCompat() { toggleBootComponent( componentName, KEEP_START_ON_BOOT, - newValue || startOnBootPreference.isChecked + newValue ) } else false } startOnBootWirelessPreference.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> - val hasSecurePermission = ContextCompat.checkSelfPermission( - requireContext(), Manifest.permission.WRITE_SECURE_SETTINGS - ) == PackageManager.PERMISSION_GRANTED if (newValue is Boolean) { if (newValue) { // Check for permission - if (!hasSecurePermission) { - Toast.makeText( - context, - R.string.permission_write_secure_settings_required, - Toast.LENGTH_SHORT - ).show() + if (!hasSecureSettingsPermission()) { + Log.d(TAG, "WRITE_SECURE_SETTINGS permission not granted") + + // Check if the user previously chose automatic granting + val pendingGrant = ShizukuSettings.getPreferences() + .getBoolean(PENDING_SECURE_SETTINGS_GRANT, false) + if (pendingGrant && Shizuku.pingBinder()) { + try { + grantSecureSettingsWithShizuku() + + if (hasSecureSettingsPermission()) { + ShizukuSettings.getPreferences().edit() { + putBoolean(PENDING_SECURE_SETTINGS_GRANT, false) + } + + Toast.makeText( + requireContext(), + R.string.permission_granted, + Toast.LENGTH_SHORT + ).show() + + // Disable the root option because of mutual exclusivity + startOnBootPreference.isChecked = false + savePreference(KEEP_START_ON_BOOT, false) + + return@OnPreferenceChangeListener toggleBootComponent( + ComponentName( + requireContext().packageName, + BootCompleteReceiver::class.java.name + ), KEEP_START_ON_BOOT_WIRELESS, true + ) + } + } catch (e: Exception) { + Log.e(TAG, "Error auto-granting permission", e) + } + } + showSecureSettingsPermissionDialog() return@OnPreferenceChangeListener false } - - // Disable the root option because, mutual exclusivity + // Disable the root option because of mutual exclusivity startOnBootPreference.isChecked = false savePreference(KEEP_START_ON_BOOT, false) } toggleBootComponent( - componentName, + ComponentName( + requireContext().packageName, BootCompleteReceiver::class.java.name + ), KEEP_START_ON_BOOT_WIRELESS, - newValue || startOnBootPreference.isChecked + newValue ) } else false } + adbRoot.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> if (newValue is Boolean) true @@ -227,6 +265,31 @@ class SettingsFragment : PreferenceFragmentCompat() { return recyclerView } + override fun onResume() { + super.onResume() + + val pendingGrant = + ShizukuSettings.getPreferences().getBoolean(PENDING_SECURE_SETTINGS_GRANT, false) + + if (pendingGrant && Shizuku.pingBinder()) { + try { + grantSecureSettingsWithShizuku() + + if (hasSecureSettingsPermission()) { + ShizukuSettings.getPreferences().edit() { + putBoolean(PENDING_SECURE_SETTINGS_GRANT, false) + } + + Toast.makeText( + requireContext(), R.string.permission_granted, Toast.LENGTH_SHORT + ).show() + } + } catch (e: Exception) { + Log.e(TAG, "Failed to grant permission on resume", e) + } + } + } + private fun setupLocalePreference() { val localeTags = ShizukuLocales.LOCALES val displayLocaleTags = ShizukuLocales.DISPLAY_LOCALES @@ -293,13 +356,10 @@ class SettingsFragment : PreferenceFragmentCompat() { val isComponentEnabled = context?.packageManager?.isComponentEnabled(componentName) == true val isWirelessBootEnabled = ShizukuSettings.getPreferences().getBoolean(KEEP_START_ON_BOOT_WIRELESS, false) - val hasSecurePermission = ContextCompat.checkSelfPermission( - requireContext(), Manifest.permission.WRITE_SECURE_SETTINGS - ) == PackageManager.PERMISSION_GRANTED startOnBootPreference.isChecked = isComponentEnabled && !isWirelessBootEnabled startOnBootWirelessPreference.isChecked = - isComponentEnabled && isWirelessBootEnabled && hasSecurePermission + isComponentEnabled && isWirelessBootEnabled && hasSecureSettingsPermission() } private fun toggleBootComponent( @@ -323,4 +383,115 @@ class SettingsFragment : PreferenceFragmentCompat() { return true } + + private fun showSecureSettingsPermissionDialog() { + val context = requireContext() + + MaterialAlertDialogBuilder(context).setTitle(R.string.permission_required).setMessage( + HtmlCompat.fromHtml( + """ +
${getString(R.string.permission_write_secure_settings_grant_info)}
+ """.trimIndent() + ) + ).setPositiveButton(R.string.permission_grant_automatically) { _, _ -> + ShizukuSettings.getPreferences().edit() { + putBoolean( + PENDING_SECURE_SETTINGS_GRANT, true + ) + } + + if (!Shizuku.pingBinder()) { + Toast.makeText( + context, R.string.start_shizuku_first, Toast.LENGTH_LONG + ).show() + + // Return to main screen + activity?.onBackPressedDispatcher?.onBackPressed() + return@setPositiveButton + } + + try { + grantSecureSettingsWithShizuku() + + if (hasSecureSettingsPermission()) { + ShizukuSettings.getPreferences().edit() { + putBoolean( + PENDING_SECURE_SETTINGS_GRANT, false + ) + } + + Toast.makeText( + context, R.string.permission_granted, Toast.LENGTH_SHORT + ).show() + } else { + Toast.makeText( + context, R.string.permission_grant_failed, Toast.LENGTH_SHORT + ).show() + } + } catch (e: Exception) { + Log.e(TAG, "Failed to grant permission", e) + Toast.makeText( + context, R.string.permission_grant_failed, Toast.LENGTH_SHORT + ).show() + } + }.setNegativeButton(R.string.permission_grant_manually) { _, _ -> + showAdbInstructionsDialog() + }.setNeutralButton(android.R.string.cancel, null).show() + } + + private fun showAdbInstructionsDialog() { + val context = requireContext() + val command = + "adb shell pm grant ${BuildConfig.APPLICATION_ID} android.permission.WRITE_SECURE_SETTINGS" + + MaterialAlertDialogBuilder(context).setTitle(R.string.home_adb_button_view_command) + .setMessage( + HtmlCompat.fromHtml( + getString(R.string.home_adb_dialog_view_command_message, command) + ) + ).setPositiveButton(R.string.home_adb_dialog_view_command_copy_button) { _, _ -> + ClipboardUtils.put(context, command) + Toast.makeText( + context, + getString(R.string.toast_copied_to_clipboard, command), + Toast.LENGTH_SHORT + ).show() + }.setNegativeButton(android.R.string.cancel, null) + .setNeutralButton(R.string.home_adb_dialog_view_command_button_send) { _, _ -> + val intent = Intent(Intent.ACTION_SEND).apply { + type = "text/plain" + putExtra(Intent.EXTRA_TEXT, command) + } + context.startActivity( + Intent.createChooser( + intent, getString(R.string.home_adb_dialog_view_command_button_send) + ) + ) + }.show() + } + + private fun hasSecureSettingsPermission(): Boolean { + return ContextCompat.checkSelfPermission( + requireContext(), Manifest.permission.WRITE_SECURE_SETTINGS + ) == PackageManager.PERMISSION_GRANTED + } + + private fun grantSecureSettingsWithShizuku() { + try { + if (!Shizuku.pingBinder()) { + Log.w(TAG, "Shizuku service not available") + return + } + + ShizukuSystemApis.grantRuntimePermission( + BuildConfig.APPLICATION_ID, Manifest.permission.WRITE_SECURE_SETTINGS, 0 + ) + + Thread.sleep(100) + } catch (e: Exception) { + Log.e(TAG, "Error granting permission via Shizuku", e) + throw e + } + } } diff --git a/manager/src/main/res/values/strings.xml b/manager/src/main/res/values/strings.xml index 2b61ea96e..518f3a552 100644 --- a/manager/src/main/res/values/strings.xml +++ b/manager/src/main/res/values/strings.xml @@ -159,10 +159,15 @@ With %1$s, in any terminal app, you can connect to and interact with the shell r${getString(R.string.permission_write_secure_settings_grant_info)}
+${getString(R.string.permission_write_secure_settings_required)}
+WRITE_SECURE_SETTINGS is a very sensitive permission and enable it only if you know what you're doing as the permission allows the application to read or write the secure system settings.
""".trimIndent() ) ).setPositiveButton(R.string.permission_grant_automatically) { _, _ -> From 20177f6ddfe6d07801735409ab22a46057e209fa Mon Sep 17 00:00:00 2001 From: PiX <69745008+pixincreate@users.noreply.github.com> Date: Sat, 3 May 2025 21:51:42 +0530 Subject: [PATCH 3/5] refactor: clean up and reduce duplication --- .../manager/settings/SettingsFragment.kt | 209 ++++++++++-------- 1 file changed, 112 insertions(+), 97 deletions(-) diff --git a/manager/src/main/java/moe/shizuku/manager/settings/SettingsFragment.kt b/manager/src/main/java/moe/shizuku/manager/settings/SettingsFragment.kt index d2c5c2bf4..39ab60d7e 100644 --- a/manager/src/main/java/moe/shizuku/manager/settings/SettingsFragment.kt +++ b/manager/src/main/java/moe/shizuku/manager/settings/SettingsFragment.kt @@ -1,13 +1,17 @@ package moe.shizuku.manager.settings +import android.os.Process import android.Manifest import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.pm.PackageManager +import android.content.pm.UserInfo import android.os.Build import android.os.Bundle import android.os.SystemProperties +import android.os.UserHandle +import android.os.UserManager import android.text.TextUtils import android.util.TypedValue import android.view.LayoutInflater @@ -48,8 +52,10 @@ import moe.shizuku.manager.ShizukuSettings.PENDING_SECURE_SETTINGS_GRANT import moe.shizuku.manager.ktx.TAG import moe.shizuku.manager.utils.ShizukuSystemApis import rikka.core.util.ClipboardUtils +import rikka.hidden.compat.UserManagerApis import rikka.html.text.HtmlCompat import rikka.shizuku.Shizuku +import kotlin.reflect.typeOf class SettingsFragment : PreferenceFragmentCompat() { @@ -104,9 +110,7 @@ class SettingsFragment : PreferenceFragmentCompat() { savePreference(KEEP_START_ON_BOOT_WIRELESS, false) } toggleBootComponent( - componentName, - KEEP_START_ON_BOOT, - newValue + componentName, KEEP_START_ON_BOOT, newValue ) } else false } @@ -119,39 +123,22 @@ class SettingsFragment : PreferenceFragmentCompat() { if (!hasSecureSettingsPermission()) { Log.d(TAG, "WRITE_SECURE_SETTINGS permission not granted") - // Check if the user previously chose automatic granting - val pendingGrant = ShizukuSettings.getPreferences() - .getBoolean(PENDING_SECURE_SETTINGS_GRANT, false) - if (pendingGrant && Shizuku.pingBinder()) { - try { - grantSecureSettingsWithShizuku() - - if (hasSecureSettingsPermission()) { - ShizukuSettings.getPreferences().edit() { - putBoolean(PENDING_SECURE_SETTINGS_GRANT, false) - } - - Toast.makeText( - requireContext(), - R.string.permission_granted, - Toast.LENGTH_SHORT - ).show() - - // Disable the root option because of mutual exclusivity - startOnBootPreference.isChecked = false - savePreference(KEEP_START_ON_BOOT, false) - - return@OnPreferenceChangeListener toggleBootComponent( - ComponentName( - requireContext().packageName, - BootCompleteReceiver::class.java.name - ), KEEP_START_ON_BOOT_WIRELESS, true - ) - } - } catch (e: Exception) { - Log.e(TAG, "Error auto-granting permission", e) - } + val grantPermission = tryToGrantSecureSettingsPermission() + + + if (grantPermission) { + // Disable the root option because of mutual exclusivity + startOnBootPreference.isChecked = false + savePreference(KEEP_START_ON_BOOT, false) + + return@OnPreferenceChangeListener toggleBootComponent( + ComponentName( + requireContext().packageName, + BootCompleteReceiver::class.java.name + ), KEEP_START_ON_BOOT_WIRELESS, true + ) } + showSecureSettingsPermissionDialog() return@OnPreferenceChangeListener false } @@ -162,9 +149,7 @@ class SettingsFragment : PreferenceFragmentCompat() { toggleBootComponent( ComponentName( requireContext().packageName, BootCompleteReceiver::class.java.name - ), - KEEP_START_ON_BOOT_WIRELESS, - newValue + ), KEEP_START_ON_BOOT_WIRELESS, newValue ) } else false } @@ -268,26 +253,13 @@ class SettingsFragment : PreferenceFragmentCompat() { override fun onResume() { super.onResume() - val pendingGrant = - ShizukuSettings.getPreferences().getBoolean(PENDING_SECURE_SETTINGS_GRANT, false) - - if (pendingGrant && Shizuku.pingBinder()) { - try { - grantSecureSettingsWithShizuku() - - if (hasSecureSettingsPermission()) { - ShizukuSettings.getPreferences().edit() { - putBoolean(PENDING_SECURE_SETTINGS_GRANT, false) - } + tryToGrantSecureSettingsPermission() - Toast.makeText( - requireContext(), R.string.permission_granted, Toast.LENGTH_SHORT - ).show() - } - } catch (e: Exception) { - Log.e(TAG, "Failed to grant permission on resume", e) - } - } + updatePreferenceStates( + ComponentName( + requireContext().packageName, BootCompleteReceiver::class.java.name + ) + ) } private fun setupLocalePreference() { @@ -388,57 +360,57 @@ class SettingsFragment : PreferenceFragmentCompat() { val context = requireContext() MaterialAlertDialogBuilder(context).setTitle(R.string.permission_required).setMessage( - HtmlCompat.fromHtml( - """ + HtmlCompat.fromHtml( + """${getString(R.string.permission_write_secure_settings_required)}
WRITE_SECURE_SETTINGS is a very sensitive permission and enable it only if you know what you're doing as the permission allows the application to read or write the secure system settings.
""".trimIndent() + ) + ).setPositiveButton(R.string.permission_grant_automatically) { _, _ -> + ShizukuSettings.getPreferences().edit() { + putBoolean( + PENDING_SECURE_SETTINGS_GRANT, true ) - ).setPositiveButton(R.string.permission_grant_automatically) { _, _ -> - ShizukuSettings.getPreferences().edit() { - putBoolean( - PENDING_SECURE_SETTINGS_GRANT, true - ) - } - - if (!Shizuku.pingBinder()) { - Toast.makeText( - context, R.string.start_shizuku_first, Toast.LENGTH_LONG - ).show() + } - // Return to main screen - activity?.onBackPressedDispatcher?.onBackPressed() - return@setPositiveButton - } + if (!Shizuku.pingBinder()) { + Toast.makeText( + context, R.string.start_shizuku_first, Toast.LENGTH_LONG + ).show() - try { - grantSecureSettingsWithShizuku() + // Return to main screen + activity?.onBackPressedDispatcher?.onBackPressed() + return@setPositiveButton + } - if (hasSecureSettingsPermission()) { - ShizukuSettings.getPreferences().edit() { - putBoolean( - PENDING_SECURE_SETTINGS_GRANT, false - ) - } + try { + grantSecureSettingsWithShizuku() - Toast.makeText( - context, R.string.permission_granted, Toast.LENGTH_SHORT - ).show() - } else { - Toast.makeText( - context, R.string.permission_grant_failed, Toast.LENGTH_SHORT - ).show() + if (hasSecureSettingsPermission()) { + ShizukuSettings.getPreferences().edit() { + putBoolean( + PENDING_SECURE_SETTINGS_GRANT, false + ) } - } catch (e: Exception) { - Log.e(TAG, "Failed to grant permission", e) + + Toast.makeText( + context, R.string.permission_granted, Toast.LENGTH_SHORT + ).show() + } else { Toast.makeText( context, R.string.permission_grant_failed, Toast.LENGTH_SHORT ).show() } - }.setNegativeButton(R.string.permission_grant_manually) { _, _ -> - showAdbInstructionsDialog() - }.setNeutralButton(android.R.string.cancel, null).show() + } catch (e: Exception) { + Log.e(TAG, "Failed to grant permission", e) + Toast.makeText( + context, R.string.permission_grant_failed, Toast.LENGTH_SHORT + ).show() + } + }.setNegativeButton(R.string.permission_grant_manually) { _, _ -> + showAdbInstructionsDialog() + }.setNeutralButton(android.R.string.cancel, null).show() } private fun showAdbInstructionsDialog() { @@ -478,18 +450,61 @@ class SettingsFragment : PreferenceFragmentCompat() { ) == PackageManager.PERMISSION_GRANTED } + private fun tryToGrantSecureSettingsPermission(): Boolean { + if (hasSecureSettingsPermission()) { + return true + } + + val pendingGrant = + ShizukuSettings.getPreferences().getBoolean(PENDING_SECURE_SETTINGS_GRANT, false) + if (pendingGrant && Shizuku.pingBinder()) { + try { + val success = kotlin.runCatching { + grantSecureSettingsWithShizuku() + Thread.sleep(100) + hasSecureSettingsPermission() + }.getOrElse { e -> + Log.e(TAG, "Error auto-granting permission", e) + false + } + + if (success) { + ShizukuSettings.getPreferences().edit { + putBoolean(PENDING_SECURE_SETTINGS_GRANT, false) + } + + activity?.runOnUiThread { + Toast.makeText( + requireContext(), R.string.permission_granted, Toast.LENGTH_SHORT + ).show() + } + return true + } + } catch (e: Exception) { + Log.e(TAG, "Failed to grant permission", e) + } + } + return false + } + private fun grantSecureSettingsWithShizuku() { try { if (!Shizuku.pingBinder()) { Log.w(TAG, "Shizuku service not available") - return + throw IllegalStateException("Shizuku service not available") } + val uid = Process.myUid() + val userHandle = UserHandle.getUserHandleForUid(uid) + val userId = userHandle.toString().replace("UserHandle{", "").replace("}", "").toInt() + + Log.i(TAG, "Attempting to grant WRITE_SECURE_SETTINGS for user ID: $userId (UID: $uid)") + ShizukuSystemApis.grantRuntimePermission( - BuildConfig.APPLICATION_ID, Manifest.permission.WRITE_SECURE_SETTINGS, 0 + BuildConfig.APPLICATION_ID, Manifest.permission.WRITE_SECURE_SETTINGS, userId ) - Thread.sleep(100) + Log.i(TAG, "Requested WRITE_SECURE_SETTINGS grant via Shizuku for user $userId") } catch (e: Exception) { Log.e(TAG, "Error granting permission via Shizuku", e) throw e From f69136f6db09d4ea9089ceb032583b13dc81586c Mon Sep 17 00:00:00 2001 From: PiX <69745008+pixincreate@users.noreply.github.com> Date: Sat, 3 May 2025 22:45:39 +0530 Subject: [PATCH 4/5] chore: clean up --- .../manager/settings/SettingsFragment.kt | 82 +++++++++++-------- 1 file changed, 46 insertions(+), 36 deletions(-) diff --git a/manager/src/main/java/moe/shizuku/manager/settings/SettingsFragment.kt b/manager/src/main/java/moe/shizuku/manager/settings/SettingsFragment.kt index 39ab60d7e..7c00d0a0d 100644 --- a/manager/src/main/java/moe/shizuku/manager/settings/SettingsFragment.kt +++ b/manager/src/main/java/moe/shizuku/manager/settings/SettingsFragment.kt @@ -69,6 +69,7 @@ class SettingsFragment : PreferenceFragmentCompat() { private lateinit var translationPreference: Preference private lateinit var translationContributorsPreference: Preference private lateinit var useSystemColorPreference: TwoStatePreference + private lateinit var bootComponentName: ComponentName override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { val context = requireContext() @@ -78,6 +79,8 @@ class SettingsFragment : PreferenceFragmentCompat() { preferenceManager.sharedPreferencesMode = Context.MODE_PRIVATE setPreferencesFromResource(R.xml.settings, null) + bootComponentName = + ComponentName(context.packageName, BootCompleteReceiver::class.java.name) languagePreference = findPreference(KEY_LANGUAGE)!! nightModePreference = findPreference(KEY_NIGHT_MODE)!! blackNightThemePreference = findPreference(KEY_BLACK_NIGHT_THEME)!! @@ -96,10 +99,8 @@ class SettingsFragment : PreferenceFragmentCompat() { ) || SystemProperties.getBoolean("ro.debuggable", false) adbRoot.isVisible = isUserDebugBuild - val componentName = - ComponentName(context.packageName, BootCompleteReceiver::class.java.name) // Initialize toggles based on saved preferences - updatePreferenceStates(componentName) + updatePreferenceStates() startOnBootPreference.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> @@ -110,7 +111,7 @@ class SettingsFragment : PreferenceFragmentCompat() { savePreference(KEEP_START_ON_BOOT_WIRELESS, false) } toggleBootComponent( - componentName, KEEP_START_ON_BOOT, newValue + KEEP_START_ON_BOOT, newValue ) } else false } @@ -132,10 +133,7 @@ class SettingsFragment : PreferenceFragmentCompat() { savePreference(KEEP_START_ON_BOOT, false) return@OnPreferenceChangeListener toggleBootComponent( - ComponentName( - requireContext().packageName, - BootCompleteReceiver::class.java.name - ), KEEP_START_ON_BOOT_WIRELESS, true + KEEP_START_ON_BOOT_WIRELESS, true ) } @@ -147,19 +145,16 @@ class SettingsFragment : PreferenceFragmentCompat() { savePreference(KEEP_START_ON_BOOT, false) } toggleBootComponent( - ComponentName( - requireContext().packageName, BootCompleteReceiver::class.java.name - ), KEEP_START_ON_BOOT_WIRELESS, newValue + KEEP_START_ON_BOOT_WIRELESS, newValue ) } else false } - adbRoot.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - if (newValue is Boolean) true - else false - } + adbRoot.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + if (newValue is Boolean) true + else false + } languagePreference.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> @@ -255,11 +250,7 @@ class SettingsFragment : PreferenceFragmentCompat() { tryToGrantSecureSettingsPermission() - updatePreferenceStates( - ComponentName( - requireContext().packageName, BootCompleteReceiver::class.java.name - ) - ) + updatePreferenceStates() } private fun setupLocalePreference() { @@ -290,7 +281,7 @@ class SettingsFragment : PreferenceFragmentCompat() { localizedLocales.add( if (index != currentLocaleIndex) { - "$localeName