kunfei před 3 roky
rodič
revize
08a06bc1fe

+ 0 - 1
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
         }

+ 49 - 41
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<PermissionActivity> {
                     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<String>,
+        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<PermissionActivity> {
-                            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<PermissionActivity> {
-                            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<PermissionActivity> {
+            putExtra(
+                PermissionActivity.KEY_INPUT_REQUEST_TYPE,
+                TYPE_REQUEST_SETTING
+            )
+        }
+    }
+
+    private fun toManageFileSetting() {
+        source?.context?.startActivity<PermissionActivity> {
+            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<PermissionActivity> {
+            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)
             }

+ 42 - 11
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<ActivityMainBinding, MainViewModel>(),
             if (!privacyPolicy()) return@launch
             //版本更新
             upVersion()
+            //检测通知权限
+            checkNotificationPermission()
+            //备份同步
+            backupSync()
             //自动更新书籍
             val isAutoRefreshedBook = savedInstanceState?.getBoolean("isAutoRefreshedBook") ?: false
             if (AppConfig.autoRefreshBook && !isAutoRefreshedBook) {
@@ -102,7 +108,6 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
             binding.viewPagerMain.postDelayed(3000) {
                 viewModel.postLoad()
             }
-            syncAlert()
         }
     }
 
@@ -193,19 +198,45 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
         }
     }
 
+    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)
             }
         }
     }