优化
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user