From bbf4dd60e03e9841373334c9f39e860d1cf509a3 Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Tue, 11 Nov 2025 19:10:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=83=E9=99=90=E8=8E=B7=E5=8F=96=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=20#270?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/lib/permission/PermissionActivity.kt | 129 +++--------------- .../io/legado/app/lib/permission/Request.kt | 15 +- .../app/ui/config/OtherConfigFragment.kt | 32 +++-- 3 files changed, 48 insertions(+), 128 deletions(-) diff --git a/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt b/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt index 5595b968e..c0565f809 100644 --- a/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt +++ b/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt @@ -29,113 +29,28 @@ class PermissionActivity : AppCompatActivity() { registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { onRequestPermissionFinish() } - private val settingActivityResultAwait = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) - private val requestPermissionResult = - registerForActivityResult(ActivityResultContracts.RequestPermission()) private val requestPermissionsResult = - registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) + registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { result -> + if (result.values.all { it }) { + onRequestPermissionFinish() + } else { + openSettingsActivity() + } + } - @SuppressLint("BatteryLife") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val rationale = intent.getStringExtra(KEY_RATIONALE) - val requestCode = intent.getIntExtra(KEY_INPUT_PERMISSIONS_CODE, 1000) val permissions = intent.getStringArrayExtra(KEY_INPUT_PERMISSIONS)!! - when (intent.getIntExtra(KEY_INPUT_REQUEST_TYPE, Request.TYPE_REQUEST_PERMISSION)) { - //权限请求 - Request.TYPE_REQUEST_PERMISSION -> showSettingDialog(permissions, rationale) { - lifecycleScope.launch { - try { - val result = requestPermissionsResult.launch(permissions) - if (result.values.all { it }) { - onRequestPermissionFinish() - } else { - openSettingsActivity() - } - } catch (e: Exception) { - AppLog.put("请求权限出错\n$e", e, true) - RequestPlugins.sRequestCallback?.onError(e) - finish() - } - } - } - //跳转到设置界面 - Request.TYPE_REQUEST_SETTING -> showSettingDialog(permissions, rationale) { - openSettingsActivity() - } - //所有文件的管理权限 - Request.TYPE_MANAGE_ALL_FILES_ACCESS -> showSettingDialog(permissions, rationale) { - try { - if (Permissions.isManageExternalStorage()) { - val settingIntent = - Intent( - Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, - "package:$packageName".toUri() - ) - settingActivityResult.launch(settingIntent) - } else { - throw NoStackTraceException("no MANAGE_ALL_FILES_ACCESS_PERMISSION") - } - } catch (e: Exception) { - AppLog.put("请求所有文件的管理权限出错\n$e", e, true) - RequestPlugins.sRequestCallback?.onError(e) - finish() - } - } - Request.TYPE_REQUEST_NOTIFICATIONS -> showSettingDialog(permissions, rationale) { - lifecycleScope.launch { - try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU - && requestPermissionResult.launch(Permissions.POST_NOTIFICATIONS) - ) { - onRequestPermissionFinish() - } else - intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS - intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName) - intent.putExtra(Settings.EXTRA_CHANNEL_ID, applicationInfo.uid) - settingActivityResult.launch(intent) - } catch (e: Exception) { - AppLog.put("请求通知权限出错\n$e", e, true) - RequestPlugins.sRequestCallback?.onError(e) - finish() - } - } + showSettingDialog(permissions, rationale) { + try { + requestPermissionsResult.launch(permissions) + } catch (e: Exception) { + AppLog.put("请求权限出错\n$e", e, true) + RequestPlugins.sRequestCallback?.onError(e) + finish() } - - Request.TYPE_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS -> showSettingDialog( - permissions, rationale - ) { - lifecycleScope.launch { - try { - val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) - intent.setData("package:$packageName".toUri()) - val className = - "com.android.settings.fuelgauge.RequestIgnoreBatteryOptimizations" - val activities = packageManager.queryIntentActivities( - intent, - PackageManager.MATCH_DEFAULT_ONLY - ) - if (activities.any { it.activityInfo.name == className }) { - val component = intent.resolveActivity(packageManager) - if (component.className != className) { - intent.setClassName("com.android.settings", className) - settingActivityResultAwait.launch(intent) - } - } - intent.component = null - settingActivityResult.launch(intent) - } catch (e: Exception) { - AppLog.put("请求后台权限出错\n$e", e, true) - RequestPlugins.sRequestCallback?.onError(e) - finish() - } - } - } - } - onBackPressedDispatcher.addCallback(this) { - } } @@ -189,25 +104,23 @@ class PermissionActivity : AppCompatActivity() { ) { rationaleDialog?.dismiss() if (rationale.isNullOrEmpty()) { - finish() + onOk.invoke() return } + rationaleDialog = MaterialAlertDialogBuilder(this) .setTitle(R.string.dialog_title) .setMessage(rationale) - .setPositiveButton(R.string.dialog_setting) { _, _ -> - onOk.invoke() - } + .setPositiveButton(R.string.dialog_setting) { _, _ -> onOk() } .setNegativeButton(R.string.dialog_cancel) { _, _ -> RequestPlugins.sRequestCallback?.onRequestPermissionsResult( - permissions, - IntArray(0) + permissions, IntArray(0) ) finish() - }.setOnCancelListener { + } + .setOnCancelListener { RequestPlugins.sRequestCallback?.onRequestPermissionsResult( - permissions, - IntArray(0) + permissions, IntArray(0) ) finish() } diff --git a/app/src/main/java/io/legado/app/lib/permission/Request.kt b/app/src/main/java/io/legado/app/lib/permission/Request.kt index 4ac8fabc1..9e891730e 100644 --- a/app/src/main/java/io/legado/app/lib/permission/Request.kt +++ b/app/src/main/java/io/legado/app/lib/permission/Request.kt @@ -75,9 +75,7 @@ internal class Request : OnRequestPermissionsResultCallback { } else if (deniedPermissions.contains(Permissions.POST_NOTIFICATIONS)) { toNotificationSetting(deniedPermissions) } else if (deniedPermissions.contains(Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - toIgnoreBatterySetting(deniedPermissions) - } + toIgnoreBatterySetting(deniedPermissions) } else if (deniedPermissions.isNotEmpty()) { appCtx.startActivity { putExtra(PermissionActivity.KEY_RATIONALE, rationale) @@ -113,10 +111,8 @@ internal class Request : OnRequestPermissionsResultCallback { } Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS -> { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (!powerManager.isIgnoringBatteryOptimizations(appCtx.packageName)) { - deniedPermissionList.add(permission) - } + if (!powerManager.isIgnoringBatteryOptimizations(appCtx.packageName)) { + deniedPermissionList.add(permission) } } @@ -140,7 +136,7 @@ internal class Request : OnRequestPermissionsResultCallback { private fun onPermissionsGranted() { try { grantedCallback?.onPermissionsGranted() - } catch (ignore: Exception) { + } catch (_: Exception) { } RequestPlugins.sResultCallback?.onPermissionsGranted() @@ -149,7 +145,7 @@ internal class Request : OnRequestPermissionsResultCallback { private fun onPermissionsDenied(deniedPermissions: Array) { try { deniedCallback?.onPermissionsDenied(deniedPermissions) - } catch (ignore: Exception) { + } catch (_: Exception) { } RequestPlugins.sResultCallback?.onPermissionsDenied(deniedPermissions) @@ -225,4 +221,5 @@ internal class Request : OnRequestPermissionsResultCallback { const val TYPE_REQUEST_NOTIFICATIONS = 4 const val TYPE_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = 5 } + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt index b552f1bc4..a72ac23f9 100644 --- a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt @@ -90,6 +90,11 @@ class OtherConfigFragment : PreferenceFragment(), preferenceManager.sharedPreferences?.unregisterOnSharedPreferenceChangeListener(this) } + override fun onResume() { + super.onResume() + updatePermissionSummary() + } + override fun onPreferenceTreeClick(preference: Preference): Boolean { when (preference.key) { PreferKey.userAgent -> showUserAgentDialog() @@ -288,17 +293,22 @@ class OtherConfigFragment : PreferenceFragment(), } private fun checkPermission(int: Int) { - if (int == 1) { - PermissionsCompat.Builder() - .addPermissions(Permissions.POST_NOTIFICATIONS) - .rationale(R.string.notification_permission_rationale) - .request() - } - if (int == 2 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - PermissionsCompat.Builder() - .addPermissions(Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) - .rationale(R.string.ignore_battery_permission_rationale) - .request() + when (int) { + 1 -> { + PermissionsCompat.Builder() + .addPermissions(Permissions.POST_NOTIFICATIONS) + .rationale(R.string.notification_permission_rationale) + .onGranted { updatePermissionSummary() } + .request() + } + 2 -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + PermissionsCompat.Builder() + .addPermissions(Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) + .rationale(R.string.ignore_battery_permission_rationale) + .request() + } + } } }