diff --git a/app/src/main/java/io/legado/app/lib/permission/PermissionsCompat.kt b/app/src/main/java/io/legado/app/lib/permission/PermissionsCompat.kt index c21176e34..7a97f14fc 100644 --- a/app/src/main/java/io/legado/app/lib/permission/PermissionsCompat.kt +++ b/app/src/main/java/io/legado/app/lib/permission/PermissionsCompat.kt @@ -74,7 +74,6 @@ class PermissionsCompat private constructor() { fun request(): PermissionsCompat { val compat = build() - compat.request = request compat.request() return compat } 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 4b965ea8d..68f0fc815 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 @@ -77,25 +77,25 @@ internal class Request : OnRequestPermissionsResultCallback { onPermissionsGranted() return } + if (rationale == null) { + onPermissionsDenied(deniedPermissions) + return + } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - if (rationale != null) { - showSettingDialog(rationale) { - onPermissionsDenied(deniedPermissions) - } - } else { - onPermissionsDenied(deniedPermissions) + showSettingDialog(deniedPermissions, rationale) { + toSetting() } } else { if (deniedPermissions.contains(Permissions.MANAGE_EXTERNAL_STORAGE)) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - if (rationale != null) { - showManageFileDialog(rationale) { - onPermissionsDenied(deniedPermissions) - } - } else { - onPermissionsDenied(deniedPermissions) + showSettingDialog(deniedPermissions, rationale) { + toManageFileSetting() } } + } else if (deniedPermissions.contains(Permissions.POST_NOTIFICATIONS)) { + showSettingDialog(deniedPermissions, rationale) { + toNotificationSetting() + } } else if (deniedPermissions.size > 1) { source?.context?.startActivity { putExtra(PermissionActivity.KEY_INPUT_REQUEST_TYPE, TYPE_REQUEST_PERMISSION) @@ -147,7 +147,11 @@ internal class Request : OnRequestPermissionsResultCallback { return null } - private fun showSettingDialog(rationale: CharSequence, cancel: () -> Unit) { + private fun showSettingDialog( + permissions: Array, + rationale: CharSequence, + onOk: () -> Unit + ) { rationaleDialog?.dismiss() source?.context?.let { runCatching { @@ -155,39 +159,41 @@ internal class Request : OnRequestPermissionsResultCallback { .setTitle(R.string.dialog_title) .setMessage(rationale) .setPositiveButton(R.string.dialog_setting) { _, _ -> - it.startActivity { - putExtra( - PermissionActivity.KEY_INPUT_REQUEST_TYPE, - TYPE_REQUEST_SETTING - ) - } + onOk.invoke() + } + .setNegativeButton(R.string.dialog_cancel) { _, _ -> + onPermissionsDenied(permissions) } - .setNegativeButton(R.string.dialog_cancel) { _, _ -> cancel() } .show() } } } - private fun showManageFileDialog(rationale: CharSequence, cancel: () -> Unit) { - rationaleDialog?.dismiss() - source?.context?.let { - runCatching { - rationaleDialog = AlertDialog.Builder(it) - .setTitle(R.string.dialog_title) - .setMessage(rationale) - .setPositiveButton(R.string.dialog_setting) { _, _ -> - it.startActivity { - putExtra( - PermissionActivity.KEY_INPUT_REQUEST_TYPE, - TYPE_MANAGE_ALL_FILES_ACCESS_PERMISSION - ) - putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS_CODE, requestCode) - putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS, deniedPermissions) - } - } - .setNegativeButton(R.string.dialog_cancel) { _, _ -> cancel() } - .show() - } + private fun toSetting() { + source?.context?.startActivity { + putExtra( + PermissionActivity.KEY_INPUT_REQUEST_TYPE, + TYPE_REQUEST_SETTING + ) + } + } + + private fun toManageFileSetting() { + source?.context?.startActivity { + putExtra( + PermissionActivity.KEY_INPUT_REQUEST_TYPE, + TYPE_MANAGE_ALL_FILES_ACCESS_PERMISSION + ) + putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS_CODE, requestCode) + putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS, deniedPermissions) + } + } + + private fun toNotificationSetting() { + source?.context?.startActivity { + putExtra(PermissionActivity.KEY_INPUT_REQUEST_TYPE, TYPE_REQUEST_NOTIFICATIONS) + putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS_CODE, requestCode) + putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS, deniedPermissions) } } @@ -217,7 +223,9 @@ internal class Request : OnRequestPermissionsResultCallback { if (deniedPermissions != null) { val rationale = this.rationale if (rationale != null) { - showSettingDialog(rationale) { onPermissionsDenied(deniedPermissions) } + showSettingDialog(deniedPermissions, rationale) { + + } } else { onPermissionsDenied(deniedPermissions) } diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index dfb6ea19b..09f3d17d0 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -28,6 +28,8 @@ import io.legado.app.help.config.LocalConfig import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.storage.Backup import io.legado.app.lib.dialogs.alert +import io.legado.app.lib.permission.Permissions +import io.legado.app.lib.permission.PermissionsCompat import io.legado.app.lib.theme.elevation import io.legado.app.lib.theme.primaryColor import io.legado.app.service.BaseReadAloudService @@ -92,6 +94,10 @@ class MainActivity : VMBaseActivity(), if (!privacyPolicy()) return@launch //版本更新 upVersion() + //检测通知权限 + checkNotificationPermission() + //备份同步 + backupSync() //自动更新书籍 val isAutoRefreshedBook = savedInstanceState?.getBoolean("isAutoRefreshedBook") ?: false if (AppConfig.autoRefreshBook && !isAutoRefreshedBook) { @@ -102,7 +108,6 @@ class MainActivity : VMBaseActivity(), binding.viewPagerMain.postDelayed(3000) { viewModel.postLoad() } - syncAlert() } } @@ -193,19 +198,45 @@ class MainActivity : VMBaseActivity(), } } + private suspend fun checkNotificationPermission() = suspendCoroutine { block -> + PermissionsCompat.Builder(this) + .addPermissions(Permissions.POST_NOTIFICATIONS) + .rationale("阅读需要发送通知来显示朗读控制和下载进度") + .onDenied { + block.resume(null) + } + .onGranted { + block.resume(null) + } + .onError { + block.resume(null) + } + .request() + } + /** - * 同步提示 + * 备份同步 */ - private fun syncAlert() = launch { - val lastBackupFile = withContext(IO) { AppWebDav.lastBackUp().getOrNull() } - ?: return@launch - if (lastBackupFile.lastModify - LocalConfig.lastBackup > DateUtils.MINUTE_IN_MILLIS) { - LocalConfig.lastBackup = lastBackupFile.lastModify - alert("恢复", "webDav书源比本地新,是否恢复") { - cancelButton() - okButton { - viewModel.restoreWebDav(lastBackupFile.displayName) + private suspend fun backupSync() = suspendCoroutine { block -> + launch { + val lastBackupFile = withContext(IO) { AppWebDav.lastBackUp().getOrNull() } + if (lastBackupFile == null) { + block.resume(null) + return@launch + } + if (lastBackupFile.lastModify - LocalConfig.lastBackup > DateUtils.MINUTE_IN_MILLIS) { + LocalConfig.lastBackup = lastBackupFile.lastModify + alert("恢复", "webDav书源比本地新,是否恢复") { + cancelButton() + okButton { + viewModel.restoreWebDav(lastBackupFile.displayName) + } + onDismiss { + block.resume(null) + } } + } else { + block.resume(null) } } }