Horis hace 2 años
padre
commit
ae83de8b59

+ 6 - 3
app/src/main/java/io/legado/app/base/BaseService.kt

@@ -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()

+ 12 - 0
app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt

@@ -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) {
 

+ 3 - 0
app/src/main/java/io/legado/app/lib/permission/Permissions.kt

@@ -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)

+ 28 - 0
app/src/main/java/io/legado/app/lib/permission/Request.kt

@@ -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
     }
 }

+ 1 - 1
app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt

@@ -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)
         }
     }

+ 1 - 0
app/src/main/res/values-es-rES/strings.xml

@@ -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>

+ 1 - 0
app/src/main/res/values-ja-rJP/strings.xml

@@ -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>

+ 1 - 0
app/src/main/res/values-pt-rBR/strings.xml

@@ -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>

+ 1 - 0
app/src/main/res/values-vi/strings.xml

@@ -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>

+ 1 - 0
app/src/main/res/values-zh-rHK/strings.xml

@@ -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>

+ 1 - 0
app/src/main/res/values-zh-rTW/strings.xml

@@ -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>

+ 1 - 0
app/src/main/res/values-zh/strings.xml

@@ -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>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -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>