From 259661ddf8d8125aae8f32688766ac7eb8d5b563 Mon Sep 17 00:00:00 2001 From: IndusAryan Date: Wed, 6 Mar 2024 17:50:30 +0530 Subject: [PATCH] some refinement and improvisation --- .../ui/result/ResultFragmentPhone.kt | 4 ++ .../ui/settings/SettingsGeneral.kt | 7 +- .../cloudstream3/utils/PowerManagerAPI.kt | 67 ++++++++++++------- app/src/main/res/drawable/ic_battery.xml | 12 ++++ app/src/main/res/values/strings.xml | 6 +- app/src/main/res/xml/settings_general.xml | 22 ++++-- 6 files changed, 87 insertions(+), 31 deletions(-) create mode 100644 app/src/main/res/drawable/ic_battery.xml 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 8adb7c33..33421a87 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 @@ -25,6 +25,7 @@ import androidx.core.view.isVisible import androidx.core.widget.NestedScrollView import androidx.core.widget.doOnTextChanged import androidx.lifecycle.ViewModelProvider +import androidx.preference.PreferenceManager import com.discord.panels.OverlappingPanelsLayout import com.discord.panels.PanelsChildGestureRegionObserver import com.google.android.gms.cast.framework.CastButtonFactory @@ -33,6 +34,8 @@ import com.google.android.gms.cast.framework.CastState import com.google.android.material.bottomsheet.BottomSheetDialog import com.lagradost.cloudstream3.APIHolder import com.lagradost.cloudstream3.APIHolder.updateHasTrailers +import com.lagradost.cloudstream3.AcraApplication +import com.lagradost.cloudstream3.AcraApplication.Companion.getKey import com.lagradost.cloudstream3.CommonActivity import com.lagradost.cloudstream3.CommonActivity.showToast import com.lagradost.cloudstream3.DubStatus @@ -67,6 +70,7 @@ 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.DataStore.getKey import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialogInstant diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt index abd7fb9a..08dc3729 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt @@ -31,6 +31,7 @@ import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar +import com.lagradost.cloudstream3.utils.BatteryOptimizationChecker.intentOpenAppInfo import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showMultiDialog @@ -44,7 +45,6 @@ import com.lagradost.safefile.SafeFile // Change local language settings in the app. fun getCurrentLocale(context: Context): String { - // val dm = res.displayMetrics val res = context.resources val conf = res.configuration @@ -203,6 +203,11 @@ class SettingsGeneral : PreferenceFragmentCompat() { return@setOnPreferenceClickListener true } + getPref(R.string.battery_optimisation_key)?.setOnPreferenceClickListener { + intentOpenAppInfo(requireContext()) + return@setOnPreferenceClickListener true + } + fun showAdd() { val providers = synchronized(allProviders) { allProviders.distinctBy { it.javaClass }.sortedBy { it.name } } activity?.showDialog( diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/PowerManagerAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/PowerManagerAPI.kt index 87db2e2d..2c476562 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/PowerManagerAPI.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/PowerManagerAPI.kt @@ -9,49 +9,70 @@ 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 androidx.preference.PreferenceManager import com.lagradost.cloudstream3.BuildConfig import com.lagradost.cloudstream3.R -import com.lagradost.cloudstream3.ui.settings.SettingsFragment + +const val packageName = BuildConfig.APPLICATION_ID +const val TAG = "PowerManagerAPI" 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 + return false // below Marshmallow, it's always unrestricted when app is in background } fun openBatteryOptimizationSettings(context: Context) { - if (isPhoneAndRestricted()) { - try { - showBatteryOptimizationDialog(context) - } catch (e: Exception) { - Log.e("PowerManagerAPI", "Error showing battery optimization dialog", e) - } + if (shouldShowBatteryOptimizationDialog(context)) { + showBatteryOptimizationDialog(context) } } 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()) + val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) + + try { + context.let { + AlertDialog.Builder(it) + .setTitle(R.string.battery_dialog_title) + .setIcon(R.drawable.ic_battery) + .setMessage(R.string.battery_dialog_message) + .setCancelable(false) + .setPositiveButton(R.string.ok) { _, _ -> + intentOpenAppInfo(it) + } + .setNegativeButton(R.string.cancel) { _, _ -> + settingsManager.edit() + .putBoolean(context.getString(R.string.battery_optimisation_key), false) + .apply() + } + .show() } - .setNegativeButton(R.string.cancel, null) - .show() + } catch (e: Exception) { + Log.e(TAG, "Error showing battery optimization dialog") + } } - private fun isPhoneAndRestricted(): Boolean { - return SettingsFragment.isTruePhone() && isAppRestricted(context) + private fun shouldShowBatteryOptimizationDialog(context: Context): Boolean { + val isRestricted = isAppRestricted(context) + val isOptimizedShown = PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.battery_optimisation_key), true) + return isRestricted && isOptimizedShown + } + + fun intentOpenAppInfo(context: Context) { + try { + val intent = Intent() + .setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + .setData(Uri.fromParts("package", packageName, null)) + context.startActivity(intent, Bundle()) + } catch (t: Throwable) { + Log.e(TAG, "Unable to invoke intent for App info.") + } } } diff --git a/app/src/main/res/drawable/ic_battery.xml b/app/src/main/res/drawable/ic_battery.xml new file mode 100644 index 00000000..24d0a77f --- /dev/null +++ b/app/src/main/res/drawable/ic_battery.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 779c733e..6eab790d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -651,8 +651,10 @@ Yes No OK - ◉ Disable Battery optimization - \nTo ensure proper Downloads and Notifications, please set battery optimization for CloudStream app to UNRESTRICTED. + Disable Battery optimization + To ensure proper downloads and notifications, please set battery optimization for CloudStream app to Unrestricted. You can change this later from General Settings. + battery_optimisation + App is already set to unrestricted Downloading app update… Installing app update… Could not install the new version of the app diff --git a/app/src/main/res/xml/settings_general.xml b/app/src/main/res/xml/settings_general.xml index c4900bca..cdda6d85 100644 --- a/app/src/main/res/xml/settings_general.xml +++ b/app/src/main/res/xml/settings_general.xml @@ -6,10 +6,7 @@ android:title="@string/app_language" android:icon="@drawable/ic_baseline_language_24" /> - + + android:title="@string/title_downloads"> + + + + + + + +