From ec0c339e4ef16b92cb1327950d4af368fe4276f7 Mon Sep 17 00:00:00 2001 From: DrDisagree Date: Mon, 19 Aug 2024 15:47:13 +0600 Subject: [PATCH] Add prompt to disable battery optimization --- app/src/main/AndroidManifest.xml | 1 + .../ui/fragments/OnboardingFragment.kt | 1 + .../ui/fragments/OnboardingItem3Fragment.kt | 108 ++++++++++++++++-- .../ui/fragments/OnboardingItem4Fragment.kt | 34 ++++++ .../ui/widgets/SelectableViewWidget.kt | 8 +- .../res/drawable/ic_battery_landscape_bg.xml | 18 +++ .../res/drawable/ic_battery_landscape_fg.xml | 18 +++ .../layout-land/fragment_onboarding_item3.xml | 23 ++-- .../layout-land/fragment_onboarding_item4.xml | 95 +++++++++++++++ .../res/layout/fragment_onboarding_item3.xml | 30 +++-- .../res/layout/fragment_onboarding_item4.xml | 87 ++++++++++++++ app/src/main/res/values/strings.xml | 4 + 12 files changed, 395 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/com/drdisagree/colorblendr/ui/fragments/OnboardingItem4Fragment.kt create mode 100644 app/src/main/res/drawable/ic_battery_landscape_bg.xml create mode 100644 app/src/main/res/drawable/ic_battery_landscape_fg.xml create mode 100644 app/src/main/res/layout-land/fragment_onboarding_item4.xml create mode 100644 app/src/main/res/layout/fragment_onboarding_item4.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e7b66aed..fc1f3e02 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,6 +22,7 @@ + diff --git a/app/src/main/java/com/drdisagree/colorblendr/ui/fragments/OnboardingFragment.kt b/app/src/main/java/com/drdisagree/colorblendr/ui/fragments/OnboardingFragment.kt index 8aaa479a..c5db9548 100644 --- a/app/src/main/java/com/drdisagree/colorblendr/ui/fragments/OnboardingFragment.kt +++ b/app/src/main/java/com/drdisagree/colorblendr/ui/fragments/OnboardingFragment.kt @@ -52,6 +52,7 @@ class OnboardingFragment : Fragment() { adapter.addFragment(OnboardingItem1Fragment()) adapter.addFragment(OnboardingItem2Fragment()) adapter.addFragment(OnboardingItem3Fragment()) + adapter.addFragment(OnboardingItem4Fragment()) binding.viewPager.adapter = adapter binding.viewPager.offscreenPageLimit = adapter.itemCount diff --git a/app/src/main/java/com/drdisagree/colorblendr/ui/fragments/OnboardingItem3Fragment.kt b/app/src/main/java/com/drdisagree/colorblendr/ui/fragments/OnboardingItem3Fragment.kt index 2f98903b..3528639d 100644 --- a/app/src/main/java/com/drdisagree/colorblendr/ui/fragments/OnboardingItem3Fragment.kt +++ b/app/src/main/java/com/drdisagree/colorblendr/ui/fragments/OnboardingItem3Fragment.kt @@ -1,11 +1,23 @@ package com.drdisagree.colorblendr.ui.fragments +import android.annotation.SuppressLint +import android.content.Context +import android.content.Intent +import android.content.res.ColorStateList +import android.content.res.Configuration +import android.graphics.PorterDuff +import android.net.Uri import android.os.Bundle +import android.os.PowerManager +import android.provider.Settings +import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageView +import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.ColorInt import androidx.fragment.app.Fragment -import com.drdisagree.colorblendr.common.Const import com.drdisagree.colorblendr.databinding.FragmentOnboardingItem3Binding class OnboardingItem3Fragment : Fragment() { @@ -19,16 +31,96 @@ class OnboardingItem3Fragment : Fragment() { ): View { binding = FragmentOnboardingItem3Binding.inflate(inflater, container, false) - binding.root.setOnClickListener { - Const.WORKING_METHOD = Const.WorkMethod.ROOT - binding.shizuku.isSelected = false - } + binding.batteryOptimization.setOnClickListener { + binding.batteryOptimization.isSelected = false - binding.shizuku.setOnClickListener { - Const.WORKING_METHOD = Const.WorkMethod.SHIZUKU - binding.root.isSelected = false + if (!isBatteryOptimizationDisabled()) { + requestDisableBatteryOptimization() + } } + updateUI() + return binding.getRoot() } + + override fun onResume() { + super.onResume() + + updateUI() + } + + private fun isBatteryOptimizationDisabled(): Boolean { + return (requireContext() + .getSystemService(Context.POWER_SERVICE) as PowerManager) + .isIgnoringBatteryOptimizations(requireContext().packageName) + } + + @SuppressLint("BatteryLife") + private fun requestDisableBatteryOptimization() { + batteryOptimizationLauncher.launch( + Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { + data = Uri.parse("package:" + requireContext().packageName) + } + ) + } + + private val batteryOptimizationLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { _ -> + updateUI() + } + + private fun updateUI() { + val batteryOptimizationDisabled = isBatteryOptimizationDisabled() + binding.batteryOptimization.isSelected = batteryOptimizationDisabled + binding.batteryView.setBatteryImageViewColor(batteryOptimizationDisabled) + } + + private fun ImageView.setBatteryImageViewColor(selected: Boolean) { + val context = requireContext() + val typedValue = TypedValue() + val theme = context.theme + @ColorInt val backgroundColor: Int + @ColorInt val foregroundColor: Int + val isDarkMode = (context.resources.configuration.uiMode and + Configuration.UI_MODE_NIGHT_YES) == Configuration.UI_MODE_NIGHT_YES + + if (selected) { + theme.resolveAttribute( + if (isDarkMode) { + com.google.android.material.R.attr.colorSurfaceContainerHigh + } else { + com.google.android.material.R.attr.colorSurfaceContainerHighest + }, + typedValue, + true + ) + backgroundColor = typedValue.data + + theme.resolveAttribute( + com.google.android.material.R.attr.colorPrimary, + typedValue, + true + ) + foregroundColor = typedValue.data + } else { + theme.resolveAttribute( + com.google.android.material.R.attr.colorErrorContainer, + typedValue, + true + ) + backgroundColor = typedValue.data + + theme.resolveAttribute( + com.google.android.material.R.attr.colorError, + typedValue, + true + ) + foregroundColor = typedValue.data + } + + setColorFilter(backgroundColor, PorterDuff.Mode.SRC_IN) + foreground.setTintList(ColorStateList.valueOf(foregroundColor)) + } } \ No newline at end of file diff --git a/app/src/main/java/com/drdisagree/colorblendr/ui/fragments/OnboardingItem4Fragment.kt b/app/src/main/java/com/drdisagree/colorblendr/ui/fragments/OnboardingItem4Fragment.kt new file mode 100644 index 00000000..662cd66e --- /dev/null +++ b/app/src/main/java/com/drdisagree/colorblendr/ui/fragments/OnboardingItem4Fragment.kt @@ -0,0 +1,34 @@ +package com.drdisagree.colorblendr.ui.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.drdisagree.colorblendr.common.Const +import com.drdisagree.colorblendr.databinding.FragmentOnboardingItem4Binding + +class OnboardingItem4Fragment : Fragment() { + + private lateinit var binding: FragmentOnboardingItem4Binding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentOnboardingItem4Binding.inflate(inflater, container, false) + + binding.root.setOnClickListener { + Const.WORKING_METHOD = Const.WorkMethod.ROOT + binding.shizuku.isSelected = false + } + + binding.shizuku.setOnClickListener { + Const.WORKING_METHOD = Const.WorkMethod.SHIZUKU + binding.root.isSelected = false + } + + return binding.getRoot() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/drdisagree/colorblendr/ui/widgets/SelectableViewWidget.kt b/app/src/main/java/com/drdisagree/colorblendr/ui/widgets/SelectableViewWidget.kt index 99da796c..41fc2bc9 100644 --- a/app/src/main/java/com/drdisagree/colorblendr/ui/widgets/SelectableViewWidget.kt +++ b/app/src/main/java/com/drdisagree/colorblendr/ui/widgets/SelectableViewWidget.kt @@ -23,7 +23,6 @@ import com.google.android.material.color.MaterialColors class SelectableViewWidget : RelativeLayout { - private var context: Context? = null private var container: MaterialCardView? = null private var titleTextView: TextView? = null private var descriptionTextView: TextView? = null @@ -47,7 +46,6 @@ class SelectableViewWidget : RelativeLayout { } private fun init(context: Context, attrs: AttributeSet?) { - this.context = context inflate(context, R.layout.view_widget_selectable, this) initializeId() @@ -108,7 +106,7 @@ class SelectableViewWidget : RelativeLayout { if (enabled) { val typedValue: TypedValue = TypedValue() - val a: TypedArray = getContext().obtainStyledAttributes( + val a: TypedArray = context.obtainStyledAttributes( typedValue.data, intArrayOf(com.google.android.material.R.attr.colorPrimary) ) @@ -188,8 +186,8 @@ class SelectableViewWidget : RelativeLayout { val isLandscape: Boolean = config.orientation == Configuration.ORIENTATION_LANDSCAPE if (isLandscape) { - val screenWidth: Int = context!!.resources.displayMetrics.widthPixels - val screenHeight: Int = context!!.resources.displayMetrics.heightPixels + val screenWidth: Int = resources.displayMetrics.widthPixels + val screenHeight: Int = resources.displayMetrics.heightPixels val isSmallHeightDevice: Boolean = screenWidth >= screenHeight * 1.8 diff --git a/app/src/main/res/drawable/ic_battery_landscape_bg.xml b/app/src/main/res/drawable/ic_battery_landscape_bg.xml new file mode 100644 index 00000000..4c53ab11 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_landscape_bg.xml @@ -0,0 +1,18 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_battery_landscape_fg.xml b/app/src/main/res/drawable/ic_battery_landscape_fg.xml new file mode 100644 index 00000000..4cc99e8e --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_landscape_fg.xml @@ -0,0 +1,18 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_onboarding_item3.xml b/app/src/main/res/layout-land/fragment_onboarding_item3.xml index bdaedb8e..f90a4bc3 100644 --- a/app/src/main/res/layout-land/fragment_onboarding_item3.xml +++ b/app/src/main/res/layout-land/fragment_onboarding_item3.xml @@ -11,7 +11,7 @@ style="@style/TextAppearance.Material3.HeadlineLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/choose_method" + android:text="@string/optimization" app:layout_constraintBottom_toBottomOf="@id/guidelineBottom" app:layout_constraintEnd_toEndOf="@id/guidelineMiddle" app:layout_constraintStart_toStartOf="@id/guidelineLeft" @@ -39,20 +39,23 @@ android:gravity="center" android:orientation="vertical"> - + android:adjustViewBounds="true" + android:foreground="@drawable/ic_battery_landscape_fg" + android:importantForAccessibility="no" + android:src="@drawable/ic_battery_landscape_bg" /> + android:layout_marginBottom="16dp" + app:descriptionText="@string/perm_four_desc" + app:titleText="@string/perm_four_title" /> diff --git a/app/src/main/res/layout-land/fragment_onboarding_item4.xml b/app/src/main/res/layout-land/fragment_onboarding_item4.xml new file mode 100644 index 00000000..82c5a0d4 --- /dev/null +++ b/app/src/main/res/layout-land/fragment_onboarding_item4.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_onboarding_item3.xml b/app/src/main/res/layout/fragment_onboarding_item3.xml index 3acfc013..2717c2b3 100644 --- a/app/src/main/res/layout/fragment_onboarding_item3.xml +++ b/app/src/main/res/layout/fragment_onboarding_item3.xml @@ -4,14 +4,14 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".ui.fragments.OnboardingItem3Fragment"> + tools:context=".ui.fragments.OnboardingItem2Fragment"> @@ -38,20 +38,32 @@ android:gravity="center" android:orientation="vertical"> - + + + android:alpha="0.5" + android:text="@string/disable_battery_optimization_hint" + android:textAlignment="center" /> + app:descriptionText="@string/perm_four_desc" + app:titleText="@string/perm_four_title" /> diff --git a/app/src/main/res/layout/fragment_onboarding_item4.xml b/app/src/main/res/layout/fragment_onboarding_item4.xml new file mode 100644 index 00000000..ddc7014b --- /dev/null +++ b/app/src/main/res/layout/fragment_onboarding_item4.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f7ed9cc3..607d79fd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -101,6 +101,8 @@ This permission is required to retrieve home and lockscreen wallpaper. All Files Access This permission is required to retrieve home and lockscreen wallpaper. + Battery Optimization + Unrestricted battery optimization is required to allow running in background. Start Continue Lively and refreshing color palette inspired by the effervescence of spritz beverages. @@ -124,6 +126,7 @@ Apply custom colors to specific apps which do not follow system monet Back Permissions + Optimization Choose method Auto startup Start service on boot @@ -159,4 +162,5 @@ User apps Launchable apps All apps + It\'s not mandatory but recommended to disable the battery optimization \ No newline at end of file