This commit is contained in:
Horis 2024-05-27 10:38:04 +08:00
parent 4c6ec35d95
commit 065ac7e119
13 changed files with 58 additions and 4 deletions

View File

@ -71,12 +71,15 @@ abstract class BaseService : LifecycleService() {
}
/**
* 检测通知权限
* 检测通知权限和后台权限
*/
private fun checkNotificationPermission() {
PermissionsCompat.Builder()
.addPermissions(Permissions.POST_NOTIFICATIONS)
.rationale(R.string.notification_permission_rationale)
.addPermissions(
Permissions.POST_NOTIFICATIONS,
Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
)
.rationale(R.string.service_permission_rationale)
.onGranted {
if (lifecycleScope.isActive) {
startForegroundNotification()

View File

@ -1,5 +1,6 @@
package io.legado.app.lib.permission
import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
import android.os.Build
@ -24,6 +25,7 @@ class PermissionActivity : AppCompatActivity() {
finish()
}
@SuppressLint("BatteryLife")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val rationale = intent.getStringExtra(KEY_RATIONALE)
@ -72,6 +74,16 @@ class PermissionActivity : AppCompatActivity() {
}
}
}
Request.TYPE_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS -> showSettingDialog(
permissions, rationale
) {
kotlin.runCatching {
val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
intent.setData(Uri.parse("package:$packageName"))
settingActivityResult.launch(intent)
}
}
}
onBackPressedDispatcher.addCallback(this) {

View File

@ -43,6 +43,9 @@ object Permissions {
const val ACCESS_MEDIA_LOCATION = "android.permission.ACCESS_MEDIA_LOCATION"
const val REQUEST_IGNORE_BATTERY_OPTIMIZATIONS =
"android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"
object Group {
val STORAGE = if (isManageExternalStorage()) {
arrayOf(MANAGE_EXTERNAL_STORAGE)

View File

@ -9,6 +9,7 @@ import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat
import io.legado.app.utils.startActivity
import splitties.init.appCtx
import splitties.systemservices.powerManager
@Suppress("MemberVisibilityCanBePrivate")
internal class Request : OnRequestPermissionsResultCallback {
@ -73,6 +74,10 @@ internal class Request : OnRequestPermissionsResultCallback {
}
} else if (deniedPermissions.contains(Permissions.POST_NOTIFICATIONS)) {
toNotificationSetting()
} else if (deniedPermissions.contains(Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
toIgnoreBatterySetting()
}
} else if (deniedPermissions.size > 1) {
appCtx.startActivity<PermissionActivity> {
putExtra(PermissionActivity.KEY_RATIONALE, rationale)
@ -98,6 +103,7 @@ internal class Request : OnRequestPermissionsResultCallback {
deniedPermissionList.add(permission)
}
}
Permissions.MANAGE_EXTERNAL_STORAGE -> {
if (Permissions.isManageExternalStorage()) {
if (!Environment.isExternalStorageManager()) {
@ -105,6 +111,15 @@ 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)
}
}
}
else -> {
if (
ContextCompat.checkSelfPermission(appCtx, permission)
@ -165,6 +180,18 @@ internal class Request : OnRequestPermissionsResultCallback {
}
}
private fun toIgnoreBatterySetting() {
appCtx.startActivity<PermissionActivity> {
putExtra(PermissionActivity.KEY_RATIONALE, rationale)
putExtra(
PermissionActivity.KEY_INPUT_REQUEST_TYPE,
TYPE_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
)
putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS_CODE, requestCode)
putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS, deniedPermissions)
}
}
override fun onRequestPermissionsResult(
permissions: Array<String>,
grantResults: IntArray
@ -196,5 +223,6 @@ internal class Request : OnRequestPermissionsResultCallback {
const val TYPE_REQUEST_SETTING = 2
const val TYPE_MANAGE_ALL_FILES_ACCESS = 3
const val TYPE_REQUEST_NOTIFICATIONS = 4
const val TYPE_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = 5
}
}

View File

@ -538,7 +538,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
override fun onCleared() {
super.onCleared()
if (BaseReadAloudService.pause) {
if (BaseReadAloudService.isRun && BaseReadAloudService.pause) {
ReadAloud.stop(context)
}
}

View File

@ -1147,4 +1147,5 @@
<string name="font_weight_text">中/粗/细</string>
<string name="keep_swipe_tip">继续滑动以加载下一章…</string>
<string name="enable_optimize_render">启用绘制优化</string>
<string name="service_permission_rationale">阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行</string>
</resources>

View File

@ -1150,4 +1150,5 @@
<string name="font_weight_text">中/粗/细</string>
<string name="keep_swipe_tip">继续滑动以加载下一章…</string>
<string name="enable_optimize_render">启用绘制优化</string>
<string name="service_permission_rationale">阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行</string>
</resources>

View File

@ -1150,4 +1150,5 @@
<string name="font_weight_text">中/粗/细</string>
<string name="keep_swipe_tip">继续滑动以加载下一章…</string>
<string name="enable_optimize_render">启用绘制优化</string>
<string name="service_permission_rationale">阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行</string>
</resources>

View File

@ -1146,4 +1146,5 @@ Còn </string>
<string name="font_weight_text">中/粗/细</string>
<string name="keep_swipe_tip">继续滑动以加载下一章…</string>
<string name="enable_optimize_render">启用绘制优化</string>
<string name="service_permission_rationale">阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行</string>
</resources>

View File

@ -1147,4 +1147,5 @@
<string name="font_weight_text">中/粗/细</string>
<string name="keep_swipe_tip">继续滑动以加载下一章…</string>
<string name="enable_optimize_render">启用绘制优化</string>
<string name="service_permission_rationale">阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行</string>
</resources>

View File

@ -1149,4 +1149,5 @@
<string name="font_weight_text">中/粗/细</string>
<string name="keep_swipe_tip">继续滑动以加载下一章…</string>
<string name="enable_optimize_render">启用绘制优化</string>
<string name="service_permission_rationale">阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行</string>
</resources>

View File

@ -1149,4 +1149,5 @@
<string name="font_weight_text">中/粗/细</string>
<string name="keep_swipe_tip">继续滑动以加载下一章…</string>
<string name="enable_optimize_render">启用绘制优化</string>
<string name="service_permission_rationale">阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行</string>
</resources>

View File

@ -1150,4 +1150,5 @@
<string name="font_weight_text">N/B/L</string>
<string name="keep_swipe_tip">Keep swiping to load the next chapter…</string>
<string name="enable_optimize_render">启用绘制优化</string>
<string name="service_permission_rationale">阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行</string>
</resources>