This commit is contained in:
kunfei
2023-02-03 20:34:00 +08:00
parent 56587c53a3
commit 08a06bc1fe
3 changed files with 91 additions and 53 deletions
@@ -74,7 +74,6 @@ class PermissionsCompat private constructor() {
fun request(): PermissionsCompat { fun request(): PermissionsCompat {
val compat = build() val compat = build()
compat.request = request
compat.request() compat.request()
return compat return compat
} }
@@ -77,25 +77,25 @@ internal class Request : OnRequestPermissionsResultCallback {
onPermissionsGranted() onPermissionsGranted()
return return
} }
if (rationale == null) {
onPermissionsDenied(deniedPermissions)
return
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
if (rationale != null) { showSettingDialog(deniedPermissions, rationale) {
showSettingDialog(rationale) { toSetting()
onPermissionsDenied(deniedPermissions)
}
} else {
onPermissionsDenied(deniedPermissions)
} }
} else { } else {
if (deniedPermissions.contains(Permissions.MANAGE_EXTERNAL_STORAGE)) { if (deniedPermissions.contains(Permissions.MANAGE_EXTERNAL_STORAGE)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (rationale != null) { showSettingDialog(deniedPermissions, rationale) {
showManageFileDialog(rationale) { toManageFileSetting()
onPermissionsDenied(deniedPermissions)
}
} else {
onPermissionsDenied(deniedPermissions)
} }
} }
} else if (deniedPermissions.contains(Permissions.POST_NOTIFICATIONS)) {
showSettingDialog(deniedPermissions, rationale) {
toNotificationSetting()
}
} else if (deniedPermissions.size > 1) { } else if (deniedPermissions.size > 1) {
source?.context?.startActivity<PermissionActivity> { source?.context?.startActivity<PermissionActivity> {
putExtra(PermissionActivity.KEY_INPUT_REQUEST_TYPE, TYPE_REQUEST_PERMISSION) putExtra(PermissionActivity.KEY_INPUT_REQUEST_TYPE, TYPE_REQUEST_PERMISSION)
@@ -147,7 +147,11 @@ internal class Request : OnRequestPermissionsResultCallback {
return null return null
} }
private fun showSettingDialog(rationale: CharSequence, cancel: () -> Unit) { private fun showSettingDialog(
permissions: Array<String>,
rationale: CharSequence,
onOk: () -> Unit
) {
rationaleDialog?.dismiss() rationaleDialog?.dismiss()
source?.context?.let { source?.context?.let {
runCatching { runCatching {
@@ -155,39 +159,41 @@ internal class Request : OnRequestPermissionsResultCallback {
.setTitle(R.string.dialog_title) .setTitle(R.string.dialog_title)
.setMessage(rationale) .setMessage(rationale)
.setPositiveButton(R.string.dialog_setting) { _, _ -> .setPositiveButton(R.string.dialog_setting) { _, _ ->
it.startActivity<PermissionActivity> { onOk.invoke()
putExtra( }
PermissionActivity.KEY_INPUT_REQUEST_TYPE, .setNegativeButton(R.string.dialog_cancel) { _, _ ->
TYPE_REQUEST_SETTING onPermissionsDenied(permissions)
)
}
} }
.setNegativeButton(R.string.dialog_cancel) { _, _ -> cancel() }
.show() .show()
} }
} }
} }
private fun showManageFileDialog(rationale: CharSequence, cancel: () -> Unit) { private fun toSetting() {
rationaleDialog?.dismiss() source?.context?.startActivity<PermissionActivity> {
source?.context?.let { putExtra(
runCatching { PermissionActivity.KEY_INPUT_REQUEST_TYPE,
rationaleDialog = AlertDialog.Builder(it) TYPE_REQUEST_SETTING
.setTitle(R.string.dialog_title) )
.setMessage(rationale) }
.setPositiveButton(R.string.dialog_setting) { _, _ -> }
it.startActivity<PermissionActivity> {
putExtra( private fun toManageFileSetting() {
PermissionActivity.KEY_INPUT_REQUEST_TYPE, source?.context?.startActivity<PermissionActivity> {
TYPE_MANAGE_ALL_FILES_ACCESS_PERMISSION putExtra(
) PermissionActivity.KEY_INPUT_REQUEST_TYPE,
putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS_CODE, requestCode) TYPE_MANAGE_ALL_FILES_ACCESS_PERMISSION
putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS, deniedPermissions) )
} putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS_CODE, requestCode)
} putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS, deniedPermissions)
.setNegativeButton(R.string.dialog_cancel) { _, _ -> cancel() } }
.show() }
}
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) { if (deniedPermissions != null) {
val rationale = this.rationale val rationale = this.rationale
if (rationale != null) { if (rationale != null) {
showSettingDialog(rationale) { onPermissionsDenied(deniedPermissions) } showSettingDialog(deniedPermissions, rationale) {
}
} else { } else {
onPermissionsDenied(deniedPermissions) onPermissionsDenied(deniedPermissions)
} }
@@ -28,6 +28,8 @@ import io.legado.app.help.config.LocalConfig
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.storage.Backup import io.legado.app.help.storage.Backup
import io.legado.app.lib.dialogs.alert 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.elevation
import io.legado.app.lib.theme.primaryColor import io.legado.app.lib.theme.primaryColor
import io.legado.app.service.BaseReadAloudService import io.legado.app.service.BaseReadAloudService
@@ -92,6 +94,10 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
if (!privacyPolicy()) return@launch if (!privacyPolicy()) return@launch
//版本更新 //版本更新
upVersion() upVersion()
//检测通知权限
checkNotificationPermission()
//备份同步
backupSync()
//自动更新书籍 //自动更新书籍
val isAutoRefreshedBook = savedInstanceState?.getBoolean("isAutoRefreshedBook") ?: false val isAutoRefreshedBook = savedInstanceState?.getBoolean("isAutoRefreshedBook") ?: false
if (AppConfig.autoRefreshBook && !isAutoRefreshedBook) { if (AppConfig.autoRefreshBook && !isAutoRefreshedBook) {
@@ -102,7 +108,6 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
binding.viewPagerMain.postDelayed(3000) { binding.viewPagerMain.postDelayed(3000) {
viewModel.postLoad() 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 { private suspend fun backupSync() = suspendCoroutine { block ->
val lastBackupFile = withContext(IO) { AppWebDav.lastBackUp().getOrNull() } launch {
?: return@launch val lastBackupFile = withContext(IO) { AppWebDav.lastBackUp().getOrNull() }
if (lastBackupFile.lastModify - LocalConfig.lastBackup > DateUtils.MINUTE_IN_MILLIS) { if (lastBackupFile == null) {
LocalConfig.lastBackup = lastBackupFile.lastModify block.resume(null)
alert("恢复", "webDav书源比本地新,是否恢复") { return@launch
cancelButton() }
okButton { if (lastBackupFile.lastModify - LocalConfig.lastBackup > DateUtils.MINUTE_IN_MILLIS) {
viewModel.restoreWebDav(lastBackupFile.displayName) LocalConfig.lastBackup = lastBackupFile.lastModify
alert("恢复", "webDav书源比本地新,是否恢复") {
cancelButton()
okButton {
viewModel.restoreWebDav(lastBackupFile.displayName)
}
onDismiss {
block.resume(null)
}
} }
} else {
block.resume(null)
} }
} }
} }