ThemeEngine: Rework theme configuration

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2023-08-25 13:10:22 +05:30
parent 2a9771c953
commit cfcccf811a
13 changed files with 112 additions and 106 deletions

View File

@@ -37,6 +37,10 @@ fun isOAndAbove(): Boolean {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
} }
fun isOMR1AndAbove(): Boolean {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1
}
fun isPAndAbove(): Boolean { fun isPAndAbove(): Boolean {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
} }

View File

@@ -19,106 +19,70 @@
package com.aurora.extensions package com.aurora.extensions
import android.content.res.Configuration import android.app.UiModeManager
import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.os.Build
import android.view.View
import android.view.WindowInsetsController
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
import androidx.fragment.app.Fragment import androidx.core.view.WindowInsetsControllerCompat
import com.aurora.store.util.CommonUtil import com.aurora.store.util.CommonUtil
import com.aurora.store.util.Preferences
fun Fragment.applyTheme(themeId: Int) { fun AppCompatActivity.applyThemeAccent() {
val themeStyle = CommonUtil.getThemeStyleById(themeId) val themeId = Preferences.getInteger(this, Preferences.PREFERENCE_THEME_TYPE)
val accentId = Preferences.getInteger(this, Preferences.PREFERENCE_THEME_ACCENT)
val uiModeManager = getSystemService(Context.UI_MODE_SERVICE) as UiModeManager
if (themeId == 0) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
(requireActivity() as AppCompatActivity).applyDayNightMask()
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}
/*Apply Theme*/
requireContext().theme.applyStyle(themeStyle, true)
(requireActivity() as AppCompatActivity).recreate()
if (themeId == 1) {
(requireActivity() as AppCompatActivity).setLightConfiguration()
}
}
fun AppCompatActivity.applyTheme(themeId: Int, accentId: Int = 1) {
val themeStyle = CommonUtil.getThemeStyleById(themeId) val themeStyle = CommonUtil.getThemeStyleById(themeId)
val accentStyle = CommonUtil.getAccentStyleById(accentId) val accentStyle = CommonUtil.getAccentStyleById(accentId)
if (themeId == 0) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
applyDayNightMask()
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}
/*Apply Theme*/ /*Apply Theme*/
setTheme(themeStyle) setTheme(themeStyle)
/*Apply Accent*/
theme.applyStyle(accentStyle, true) theme.applyStyle(accentStyle, true)
/*Apply Light Configuration*/ when (themeId) {
if (themeId == 1) { 0 -> {
setLightConfiguration() if (isSAndAbove()) {
uiModeManager.setApplicationNightMode(UiModeManager.MODE_NIGHT_CUSTOM)
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
}
}
1 -> {
setSystemBarConfiguration(light = true)
if (isSAndAbove()) {
uiModeManager.setApplicationNightMode(UiModeManager.MODE_NIGHT_NO)
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
}
}
else -> {
setSystemBarConfiguration(light = false)
if (isSAndAbove()) {
uiModeManager.setApplicationNightMode(UiModeManager.MODE_NIGHT_YES)
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}
}
} }
} }
fun AppCompatActivity.applyDayNightMask() { private fun AppCompatActivity.setSystemBarConfiguration(light: Boolean) {
val currentNightMode = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK WindowInsetsControllerCompat(this.window, this.window.decorView.rootView).apply {
if (currentNightMode == Configuration.UI_MODE_NIGHT_NO) { // Status bar color
setLightConfiguration() if (isMAndAbove()) {
isAppearanceLightStatusBars = light
} else {
window.statusBarColor = ColorUtils.setAlphaComponent(Color.BLACK, 120)
}
// Navigation bar color
if (isOMR1AndAbove()) {
isAppearanceLightNavigationBars = light
window.navigationBarColor = getStyledAttributeColor(android.R.attr.colorBackground)
}
} }
} }
fun AppCompatActivity.setLightConfiguration() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
setLightConfigurationO()
} else {
setLightConfigurationO()
}
}
@RequiresApi(Build.VERSION_CODES.R)
private fun AppCompatActivity.setLightConfigurationR() {
window?.insetsController?.setSystemBarsAppearance(
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
or WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS,
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
)
}
private fun AppCompatActivity.setLightConfigurationO() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
setLightStatusBar()
setLightNavigationBar()
} else {
window.statusBarColor = ColorUtils.setAlphaComponent(Color.BLACK, 120)
}
}
private fun AppCompatActivity.setLightStatusBar() {
var flags = window.decorView.systemUiVisibility
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
flags = flags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}
window.decorView.systemUiVisibility = flags
}
private fun AppCompatActivity.setLightNavigationBar() {
var flags = window.decorView.systemUiVisibility
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
window.navigationBarColor = getStyledAttributeColor(android.R.attr.colorBackground)
flags = flags or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
}
window.decorView.systemUiVisibility = flags
}

View File

@@ -48,7 +48,7 @@ import coil.load
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import com.aurora.Constants import com.aurora.Constants
import com.aurora.extensions.accentColor import com.aurora.extensions.accentColor
import com.aurora.extensions.applyTheme import com.aurora.extensions.applyThemeAccent
import com.aurora.extensions.isRAndAbove import com.aurora.extensions.isRAndAbove
import com.aurora.extensions.toast import com.aurora.extensions.toast
import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.AuthData
@@ -89,9 +89,7 @@ class MainActivity : AppCompatActivity() {
) )
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
val themeId = Preferences.getInteger(this, Preferences.PREFERENCE_THEME_TYPE) applyThemeAccent()
val accentId = Preferences.getInteger(this, Preferences.PREFERENCE_THEME_ACCENT)
applyTheme(themeId, accentId)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
B = ActivityMainBinding.inflate(layoutInflater) B = ActivityMainBinding.inflate(layoutInflater)

View File

@@ -29,7 +29,6 @@ import android.view.View
import android.view.ViewAnimationUtils import android.view.ViewAnimationUtils
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.StaggeredGridLayoutManager import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.aurora.extensions.applyTheme
import com.aurora.extensions.hide import com.aurora.extensions.hide
import com.aurora.extensions.isSAndAbove import com.aurora.extensions.isSAndAbove
import com.aurora.extensions.isVisible import com.aurora.extensions.isVisible
@@ -124,7 +123,7 @@ class AccentFragment : BaseFragment() {
} }
private fun updateAccent(accentId: Int) { private fun updateAccent(accentId: Int) {
applyTheme(themeId) requireActivity().recreate()
save(PREFERENCE_THEME_ACCENT, accentId) save(PREFERENCE_THEME_ACCENT, accentId)
} }

View File

@@ -28,7 +28,6 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewAnimationUtils import android.view.ViewAnimationUtils
import android.view.ViewGroup import android.view.ViewGroup
import com.aurora.extensions.applyTheme
import com.aurora.extensions.hide import com.aurora.extensions.hide
import com.aurora.extensions.isVisible import com.aurora.extensions.isVisible
import com.aurora.extensions.show import com.aurora.extensions.show
@@ -110,7 +109,7 @@ class ThemeFragment : BaseFragment() {
} }
private fun update(themeId: Int) { private fun update(themeId: Int) {
applyTheme(themeId) requireActivity().recreate()
save(PREFERENCE_THEME_TYPE, themeId) save(PREFERENCE_THEME_TYPE, themeId)
} }

View File

@@ -29,7 +29,6 @@ import androidx.navigation.fragment.findNavController
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import com.aurora.extensions.applyTheme
import com.aurora.extensions.isTAndAbove import com.aurora.extensions.isTAndAbove
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
@@ -71,7 +70,7 @@ class UIPreference : PreferenceFragmentCompat() {
val themeId = Integer.parseInt(newValue.toString()) val themeId = Integer.parseInt(newValue.toString())
save(Preferences.PREFERENCE_THEME_TYPE, themeId) save(Preferences.PREFERENCE_THEME_TYPE, themeId)
applyTheme(themeId) requireActivity().recreate()
true true
} }
} }
@@ -79,14 +78,10 @@ class UIPreference : PreferenceFragmentCompat() {
val accentPreference: ListPreference? = findPreference(Preferences.PREFERENCE_THEME_ACCENT) val accentPreference: ListPreference? = findPreference(Preferences.PREFERENCE_THEME_ACCENT)
accentPreference?.let { accentPreference?.let {
it.setOnPreferenceChangeListener { _, newValue -> it.setOnPreferenceChangeListener { _, newValue ->
val themeId = Preferences.getInteger(
requireContext(),
Preferences.PREFERENCE_THEME_TYPE
)
val accentId = Integer.parseInt(newValue.toString()) val accentId = Integer.parseInt(newValue.toString())
save(Preferences.PREFERENCE_THEME_ACCENT, accentId) save(Preferences.PREFERENCE_THEME_ACCENT, accentId)
applyTheme(themeId) requireActivity().recreate()
true true
} }
} }

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="BaseTheme">
<item name="android:windowLightStatusBar">false</item>
</style>
</resources>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="BaseTheme">
<item name="android:windowLightStatusBar">false</item>
<item name="android:statusBarColor">?android:colorBackground</item>
<item name="android:windowLightNavigationBar">false</item>
<item name="android:navigationBarColor">?android:colorBackground</item>
</style>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="BaseTheme" />
</resources>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="BaseTheme">
<item name="android:statusBarColor">@color/colorTransparent</item>
</style>
</resources>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="BaseTheme">
<item name="android:statusBarColor">?android:colorBackground</item>
<item name="android:windowLightStatusBar">true</item>
</style>
</resources>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="BaseTheme">
<item name="android:windowLightStatusBar">true</item>
<item name="android:statusBarColor">?android:colorBackground</item>
<item name="android:windowLightNavigationBar">true</item>
<item name="android:navigationBarColor">?android:colorBackground</item>
</style>
</resources>

View File

@@ -19,10 +19,11 @@
<resources> <resources>
<style name="AppTheme" parent="Theme.Material3.DayNight.NoActionBar"> <!-- Base application theme. -->
<style name="BaseTheme" parent="Theme.Material3.DayNight.NoActionBar">
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
<item name="colorPrimary">@color/colorAccent</item> <item name="colorPrimary">@color/colorAccent</item>
<item name="colorPrimaryDark">?android:colorBackground</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="scrim">@color/colorScrim</item> <item name="scrim">@color/colorScrim</item>
<item name="scrimAccent">@color/colorScrimAccent</item> <item name="scrimAccent">@color/colorScrimAccent</item>
<item name="scrimAlt">@color/colorScrimAlt</item> <item name="scrimAlt">@color/colorScrimAlt</item>
@@ -33,13 +34,15 @@
<item name="preferenceTheme">@style/AppTheme.PreferenceThemeOverlay</item> <item name="preferenceTheme">@style/AppTheme.PreferenceThemeOverlay</item>
</style> </style>
<style name="AppTheme" parent="BaseTheme" />
<!-- Custom Themes -->
<style name="AppTheme.Light" parent="Theme.Material3.Light.NoActionBar"> <style name="AppTheme.Light" parent="Theme.Material3.Light.NoActionBar">
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
<item name="colorPrimary">@color/colorAccent</item> <item name="colorPrimary">@color/colorAccent</item>
<item name="colorPrimaryDark">@color/colorWhite</item> <item name="colorPrimaryDark">@color/colorWhite</item>
<item name="android:windowBackground">@color/colorWhite</item> <item name="android:windowBackground">@color/colorWhite</item>
<item name="android:colorBackground">@color/colorWhite</item> <item name="android:colorBackground">@color/colorWhite</item>
<item name="android:windowLightNavigationBar">true</item>
<item name="android:navigationBarColor">@color/colorWhite</item> <item name="android:navigationBarColor">@color/colorWhite</item>
<item name="scrim">@color/colorScrim</item> <item name="scrim">@color/colorScrim</item>
<item name="scrimAccent">@color/colorScrimAccent</item> <item name="scrimAccent">@color/colorScrimAccent</item>
@@ -58,7 +61,6 @@
<item name="colorBackgroundFloating">@color/colorDarkBackground</item> <item name="colorBackgroundFloating">@color/colorDarkBackground</item>
<item name="android:windowBackground">@color/colorDarkWindowBackground</item> <item name="android:windowBackground">@color/colorDarkWindowBackground</item>
<item name="android:colorBackground">@color/colorDarkBackground</item> <item name="android:colorBackground">@color/colorDarkBackground</item>
<item name="android:windowLightNavigationBar">false</item>
<item name="android:navigationBarColor">@color/colorDarkPrimaryDark</item> <item name="android:navigationBarColor">@color/colorDarkPrimaryDark</item>
<item name="scrim">@color/colorScrim</item> <item name="scrim">@color/colorScrim</item>
<item name="scrimAccent">@color/colorScrimAccent</item> <item name="scrimAccent">@color/colorScrimAccent</item>
@@ -78,7 +80,6 @@
<item name="android:navigationBarColor">@color/colorDarkXPrimaryDark</item> <item name="android:navigationBarColor">@color/colorDarkXPrimaryDark</item>
<item name="colorShimmer">@color/colorShimmerDarkX</item> <item name="colorShimmer">@color/colorShimmerDarkX</item>
<item name="colorStroke">@color/colorStrokeDarkX</item> <item name="colorStroke">@color/colorStrokeDarkX</item>
<item name="preferenceTheme">@style/AppTheme.PreferenceThemeOverlay</item>
</style> </style>
<style name="AppTheme.Darkord" parent="AppTheme.Dark"> <style name="AppTheme.Darkord" parent="AppTheme.Dark">
@@ -89,7 +90,6 @@
<item name="android:navigationBarColor">@color/colorDarkordPrimaryDark</item> <item name="android:navigationBarColor">@color/colorDarkordPrimaryDark</item>
<item name="colorShimmer">@color/colorShimmerDarkord</item> <item name="colorShimmer">@color/colorShimmerDarkord</item>
<item name="colorStroke">@color/colorStrokeDarkord</item> <item name="colorStroke">@color/colorStrokeDarkord</item>
<item name="preferenceTheme">@style/AppTheme.PreferenceThemeOverlay</item>
</style> </style>
<style name="AppTheme.Black" parent="AppTheme.Dark"> <style name="AppTheme.Black" parent="AppTheme.Dark">
@@ -100,7 +100,6 @@
<item name="android:navigationBarColor">@color/colorBlack</item> <item name="android:navigationBarColor">@color/colorBlack</item>
<item name="colorShimmer">@color/colorShimmerBlack</item> <item name="colorShimmer">@color/colorShimmerBlack</item>
<item name="colorStroke">@color/colorStrokeBlack</item> <item name="colorStroke">@color/colorStrokeBlack</item>
<item name="preferenceTheme">@style/AppTheme.PreferenceThemeOverlay</item>
</style> </style>
<style name="AppTheme.PreferenceThemeOverlay" parent="@style/PreferenceThemeOverlay"> <style name="AppTheme.PreferenceThemeOverlay" parent="@style/PreferenceThemeOverlay">