diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a23ba7b5..8c05dc43 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -14,7 +14,6 @@
-
diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt
index 1bae25cd..d18cd90e 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt
@@ -10,7 +10,6 @@ import android.graphics.Rect
import android.net.Uri
import android.os.Build
import android.os.Bundle
-import android.provider.Settings
import android.util.AttributeSet
import android.util.Log
import android.view.KeyEvent
@@ -24,7 +23,6 @@ import androidx.activity.OnBackPressedCallback
import androidx.activity.result.ActivityResultLauncher
import androidx.annotation.IdRes
import androidx.annotation.MainThread
-import androidx.annotation.RequiresApi
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
@@ -1205,13 +1203,8 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
showToast(txt(R.string.unable_to_inflate, t.message ?: ""), Toast.LENGTH_LONG)
null
}
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !isAppOptimised && !isTrueTvSettings()
- && !isTvSettings() && !isEmulatorSettings()) {
- showBatteryOptimizationDialog()
- }
-
changeStatusBarState(isEmulatorSettings())
+
// Automatically enable jsdelivr if cant connect to raw.githubusercontent.com
if (this.getKey(getString(R.string.jsdelivr_proxy_key)) == null && isNetworkAvailable()) {
main {
@@ -1783,20 +1776,4 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
false
}
}
-
- @RequiresApi(Build.VERSION_CODES.M)
- private fun showBatteryOptimizationDialog() {
- AlertDialog.Builder(this)
- .setTitle(R.string.battery_dialog_title)
- .setMessage(R.string.battery_dialog_message)
- .setPositiveButton(R.string.ok) { _, _ ->
- isAppOptimised = true
- val intent = Intent()
- intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
- intent.data = Uri.fromParts("package", packageName, null)
- startActivity(intent)
- }
- .setNegativeButton(R.string.cancel, null)
- .show()
- }
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt
index e7e50b9d..89bde945 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt
@@ -66,6 +66,7 @@ import com.lagradost.cloudstream3.utils.AppUtils.html
import com.lagradost.cloudstream3.utils.AppUtils.isCastApiAvailable
import com.lagradost.cloudstream3.utils.AppUtils.loadCache
import com.lagradost.cloudstream3.utils.AppUtils.openBrowser
+import com.lagradost.cloudstream3.utils.BatteryOptimizationChecker
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialogInstant
@@ -645,6 +646,8 @@ open class ResultFragmentPhone : FullScreenPlayer() {
),
null
) { click ->
+ BatteryOptimizationChecker.openBatteryOptimizationSettings(requireContext())
+
when (click.action) {
DOWNLOAD_ACTION_DOWNLOAD -> {
viewModel.handleAction(
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt
index 37c71134..8dedd896 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt
@@ -19,6 +19,7 @@ import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager
import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.appbar.MaterialToolbar
+import com.lagradost.cloudstream3.AcraApplication.Companion.context
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.databinding.MainSettingsBinding
import com.lagradost.cloudstream3.mvvm.logError
@@ -155,6 +156,11 @@ class SettingsFragment : Fragment() {
return getLayoutInt() == 2
}
+ // phone exclusive
+ fun isTruePhone(): Boolean {
+ return !isTrueTvSettings() && !isTvSettings() && context?.isEmulatorSettings() != true
+ }
+
private fun Context.isAutoTv(): Boolean {
val uiModeManager = getSystemService(Context.UI_MODE_SERVICE) as UiModeManager?
// AFT = Fire TV
diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/PowerManagerAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/PowerManagerAPI.kt
new file mode 100644
index 00000000..87db2e2d
--- /dev/null
+++ b/app/src/main/java/com/lagradost/cloudstream3/utils/PowerManagerAPI.kt
@@ -0,0 +1,57 @@
+package com.lagradost.cloudstream3.utils
+
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.os.Build
+import android.os.Bundle
+import android.os.PowerManager
+import android.provider.Settings
+import android.util.Log
+import androidx.appcompat.app.AlertDialog
+import com.lagradost.cloudstream3.AcraApplication.Companion.context
+import com.lagradost.cloudstream3.BuildConfig
+import com.lagradost.cloudstream3.R
+import com.lagradost.cloudstream3.ui.settings.SettingsFragment
+
+object BatteryOptimizationChecker {
+
+ private const val packageName = BuildConfig.APPLICATION_ID
+
+ private fun isAppRestricted(context: Context?): Boolean {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null) {
+ val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
+ return !powerManager.isIgnoringBatteryOptimizations(context.packageName)
+ }
+
+ return false // below Marshmallow, it's always unrestricted
+ }
+
+ fun openBatteryOptimizationSettings(context: Context) {
+ if (isPhoneAndRestricted()) {
+ try {
+ showBatteryOptimizationDialog(context)
+ } catch (e: Exception) {
+ Log.e("PowerManagerAPI", "Error showing battery optimization dialog", e)
+ }
+ }
+ }
+
+ private fun showBatteryOptimizationDialog(context: Context) {
+ AlertDialog.Builder(context)
+ .setTitle(R.string.battery_dialog_title)
+ .setMessage(R.string.battery_dialog_message)
+ .setPositiveButton(R.string.ok) { _, _ ->
+ val intent = Intent()
+ intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
+ intent.data = Uri.fromParts("package", packageName, null)
+ context.startActivity(intent, Bundle())
+ }
+ .setNegativeButton(R.string.cancel, null)
+ .show()
+ }
+
+ private fun isPhoneAndRestricted(): Boolean {
+ return SettingsFragment.isTruePhone() && isAppRestricted(context)
+ }
+}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt
index 76142f72..49fa3618 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt
@@ -59,7 +59,6 @@ import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipDrawable
import com.google.android.material.chip.ChipGroup
import com.lagradost.cloudstream3.CommonActivity.activity
-import com.lagradost.cloudstream3.MainActivity
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.ui.result.UiImage
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 4725ecb9..e5edd710 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -650,8 +650,8 @@
Yes
No
OK
- Battery Optimization
- To ensure proper Downloads and Notifications, please set Battery Optimization for CloudStream app to Unrestricted.
+ ◉ Disable Battery optimization
+ \nTo ensure proper Downloads and Notifications, please set battery optimization for CloudStream app to UNRESTRICTED.
Downloading app update…
Installing app update…
Could not install the new version of the app