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