mirror of
https://github.com/Ishan09811/pine.git
synced 2025-04-24 08:55:10 +00:00
Refix theme changing logic (#43)
This commit is contained in:
parent
4fc489c62a
commit
26cfd98296
@ -28,6 +28,9 @@ import androidx.documentfile.provider.DocumentFile
|
||||
import androidx.preference.PreferenceManager
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.repeatOnLifecycle
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import com.google.android.material.R as MaterialR
|
||||
import com.google.android.material.color.MaterialColors
|
||||
@ -48,6 +51,7 @@ import emu.skyline.utils.WindowInsetsHelper
|
||||
import emu.skyline.SkylineApplication
|
||||
import javax.inject.Inject
|
||||
import kotlin.math.ceil
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
@AndroidEntryPoint
|
||||
class MainActivity : AppCompatActivity() {
|
||||
@ -174,6 +178,16 @@ class MainActivity : AppCompatActivity() {
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// we collect the themeChanges and apply
|
||||
lifecycleScope.launch {
|
||||
repeatOnLifecycle(Lifecycle.State.CREATED) {
|
||||
SkylineApplication.themeChangeFlow.collect { themeId ->
|
||||
setTheme(themeId)
|
||||
recreate()
|
||||
}
|
||||
}
|
||||
}
|
||||
setInsets()
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,7 @@ package emu.skyline
|
||||
import android.app.Application
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.content.res.Resources.Theme
|
||||
import androidx.annotation.ColorInt
|
||||
import com.google.android.material.color.DynamicColors
|
||||
import com.google.android.material.color.DynamicColorsOptions
|
||||
@ -15,6 +16,8 @@ import dagger.hilt.android.HiltAndroidApp
|
||||
import emu.skyline.di.getSettings
|
||||
import java.io.File
|
||||
import kotlin.math.roundToInt
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.asSharedFlow
|
||||
|
||||
/**
|
||||
* @return The optimal directory for putting public files inside, this may return a private directory if a public directory cannot be retrieved
|
||||
@ -33,6 +36,8 @@ class SkylineApplication : Application() {
|
||||
|
||||
val context : Context get() = instance.applicationContext
|
||||
|
||||
private val _themeChangeFlow = MutableSharedFlow<Int>(replay = 1)
|
||||
val themeChangeFlow = _themeChangeFlow.asSharedFlow()
|
||||
|
||||
const val NAV_TYPE_THREE_BUTTON = 0
|
||||
const val NAV_TYPE_TWO_BUTTON = 1
|
||||
@ -83,9 +88,11 @@ class SkylineApplication : Application() {
|
||||
}
|
||||
|
||||
fun setTheme(newValue: Boolean) {
|
||||
val dynamicColorsOptions = DynamicColorsOptions.Builder().setPrecondition { _, _ -> newValue }.build()
|
||||
DynamicColors.applyToActivitiesIfAvailable(instance, dynamicColorsOptions)
|
||||
if (newValue == false) { instance.setTheme(R.style.AppTheme) }
|
||||
if (newValue) {
|
||||
_themeChangeFlow.tryEmit(R.style.AppTheme_MaterialYou)
|
||||
} else {
|
||||
_themeChangeFlow.tryEmit(R.style.AppTheme)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -93,8 +100,6 @@ class SkylineApplication : Application() {
|
||||
super.onCreate()
|
||||
instance = this
|
||||
System.loadLibrary("skyline")
|
||||
|
||||
val dynamicColorsOptions = DynamicColorsOptions.Builder().setPrecondition { _, _ -> getSettings().useMaterialYou }.build()
|
||||
DynamicColors.applyToActivitiesIfAvailable(this, dynamicColorsOptions)
|
||||
setTheme(getSettings().useMaterialYou)
|
||||
}
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ package emu.skyline.settings
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.os.Build
|
||||
import android.view.View
|
||||
import androidx.preference.Preference
|
||||
import androidx.preference.PreferenceCategory
|
||||
@ -49,7 +50,6 @@ class GlobalSettingsFragment : PreferenceFragmentCompat() {
|
||||
findPreference<Preference>("use_material_you")?.setOnPreferenceChangeListener { _, newValue ->
|
||||
val isMaterialYouEnabled = newValue as Boolean
|
||||
SkylineApplication.setTheme(isMaterialYouEnabled)
|
||||
requireActivity().recreate()
|
||||
true
|
||||
}
|
||||
|
||||
@ -74,17 +74,28 @@ class GlobalSettingsFragment : PreferenceFragmentCompat() {
|
||||
if (BuildConfig.BUILD_TYPE != "release")
|
||||
findPreference<Preference>("validation_layer")?.isVisible = true
|
||||
|
||||
if (!GpuDriverHelper.supportsForceMaxGpuClocks()) {
|
||||
val forceMaxGpuClocksPref = findPreference<TwoStatePreference>("force_max_gpu_clocks")!!
|
||||
forceMaxGpuClocksPref.isSelectable = false
|
||||
forceMaxGpuClocksPref.isChecked = false
|
||||
forceMaxGpuClocksPref.summary = context!!.getString(R.string.force_max_gpu_clocks_desc_unsupported)
|
||||
}
|
||||
|
||||
disablePreference("use_material_you", Build.VERSION.SDK_INT < Build.VERSION_CODES.S, null)
|
||||
disablePreference("force_max_gpu_clocks", !GpuDriverHelper.supportsForceMaxGpuClocks(), context!!.getString(R.string.force_max_gpu_clocks_desc_unsupported))
|
||||
resources.getStringArray(R.array.credits_entries).asIterable().shuffled().forEach {
|
||||
findPreference<PreferenceCategory>("category_credits")?.addPreference(Preference(context!!).apply {
|
||||
title = it
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
fun disablePreference(
|
||||
preferenceId: String,
|
||||
isDisabled: Boolean,
|
||||
disabledSummary: String? = null
|
||||
) {
|
||||
val preference = findPreference<Preference>(preferenceId)!!
|
||||
preference.isSelectable = !isDisabled
|
||||
preference.isEnabled = !isDisabled
|
||||
if (preference is TwoStatePreference && isDisabled) {
|
||||
preference.isChecked = false
|
||||
}
|
||||
if (isDisabled && disabledSummary != null) {
|
||||
preference.summary = disabledSummary
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,6 +26,9 @@ import androidx.preference.Preference
|
||||
import androidx.preference.PreferenceCategory
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import androidx.preference.forEach
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.repeatOnLifecycle
|
||||
import com.google.android.material.appbar.AppBarLayout
|
||||
import com.google.android.material.internal.ToolbarUtils
|
||||
import com.google.android.material.R as MaterialR
|
||||
@ -40,6 +43,7 @@ import emu.skyline.preference.dialog.IntegerListPreferenceMaterialDialogFragment
|
||||
import emu.skyline.preference.dialog.ListPreferenceMaterialDialogFragmentCompat
|
||||
import emu.skyline.utils.WindowInsetsHelper
|
||||
import emu.skyline.SkylineApplication
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
private const val PREFERENCE_DIALOG_FRAGMENT_TAG = "androidx.preference.PreferenceFragment.DIALOG"
|
||||
|
||||
@ -152,6 +156,16 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// we collect the themeChanges and apply
|
||||
lifecycleScope.launch {
|
||||
repeatOnLifecycle(Lifecycle.State.CREATED) {
|
||||
SkylineApplication.themeChangeFlow.collect { themeId ->
|
||||
setTheme(themeId)
|
||||
recreate()
|
||||
}
|
||||
}
|
||||
}
|
||||
setInsets()
|
||||
}
|
||||
|
||||
|
63
app/src/main/res/values-night-v31/themes.xml
Normal file
63
app/src/main/res/values-night-v31/themes.xml
Normal file
@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<style name="AppTheme.MaterialYou" parent="AppTheme">
|
||||
<item name="colorPrimary">@color/m3_sys_color_dynamic_dark_primary</item>
|
||||
<item name="colorOnPrimary">@color/m3_sys_color_dynamic_dark_on_primary</item>
|
||||
<item name="colorPrimaryInverse">@color/m3_sys_color_dynamic_dark_inverse_primary</item>
|
||||
<item name="colorPrimaryContainer">@color/m3_sys_color_dynamic_dark_primary_container</item>
|
||||
<item name="colorOnPrimaryContainer">@color/m3_sys_color_dynamic_dark_on_primary_container</item>
|
||||
<item name="colorPrimaryFixed">@color/m3_sys_color_dynamic_primary_fixed</item>
|
||||
<item name="colorPrimaryFixedDim">@color/m3_sys_color_dynamic_primary_fixed_dim</item>
|
||||
<item name="colorOnPrimaryFixed">@color/m3_sys_color_dynamic_on_primary_fixed</item>
|
||||
<item name="colorOnPrimaryFixedVariant">@color/m3_sys_color_dynamic_on_primary_fixed_variant</item>
|
||||
<item name="colorSecondary">@color/m3_sys_color_dynamic_dark_secondary</item>
|
||||
<item name="colorOnSecondary">@color/m3_sys_color_dynamic_dark_on_secondary</item>
|
||||
<item name="colorSecondaryContainer">@color/m3_sys_color_dynamic_dark_secondary_container</item>
|
||||
<item name="colorOnSecondaryContainer">@color/m3_sys_color_dynamic_dark_on_secondary_container</item>
|
||||
<item name="colorSecondaryFixed">@color/m3_sys_color_dynamic_secondary_fixed</item>
|
||||
<item name="colorSecondaryFixedDim">@color/m3_sys_color_dynamic_secondary_fixed_dim</item>
|
||||
<item name="colorOnSecondaryFixed">@color/m3_sys_color_dynamic_on_secondary_fixed</item>
|
||||
<item name="colorOnSecondaryFixedVariant">@color/m3_sys_color_dynamic_on_secondary_fixed_variant</item>
|
||||
<item name="colorTertiary">@color/m3_sys_color_dynamic_dark_tertiary</item>
|
||||
<item name="colorOnTertiary">@color/m3_sys_color_dynamic_dark_on_tertiary</item>
|
||||
<item name="colorTertiaryContainer">@color/m3_sys_color_dynamic_dark_tertiary_container</item>
|
||||
<item name="colorOnTertiaryContainer">@color/m3_sys_color_dynamic_dark_on_tertiary_container</item>
|
||||
<item name="colorTertiaryFixed">@color/m3_sys_color_dynamic_tertiary_fixed</item>
|
||||
<item name="colorTertiaryFixedDim">@color/m3_sys_color_dynamic_tertiary_fixed_dim</item>
|
||||
<item name="colorOnTertiaryFixed">@color/m3_sys_color_dynamic_on_tertiary_fixed</item>
|
||||
<item name="colorOnTertiaryFixedVariant">@color/m3_sys_color_dynamic_on_tertiary_fixed_variant</item>
|
||||
<item name="android:colorBackground">@color/m3_sys_color_dynamic_dark_background</item>
|
||||
<item name="colorOnBackground">@color/m3_sys_color_dynamic_dark_on_background</item>
|
||||
<item name="colorSurface">@color/m3_sys_color_dynamic_dark_surface</item>
|
||||
<item name="colorOnSurface">@color/m3_sys_color_dynamic_dark_on_surface</item>
|
||||
<item name="colorSurfaceVariant">@color/m3_sys_color_dynamic_dark_surface_variant</item>
|
||||
<item name="colorOnSurfaceVariant">@color/m3_sys_color_dynamic_dark_on_surface_variant</item>
|
||||
<item name="colorSurfaceInverse">@color/m3_sys_color_dynamic_dark_inverse_surface</item>
|
||||
<item name="colorOnSurfaceInverse">@color/m3_sys_color_dynamic_dark_inverse_on_surface</item>
|
||||
<item name="colorSurfaceBright">@color/m3_sys_color_dynamic_dark_surface_bright</item>
|
||||
<item name="colorSurfaceDim">@color/m3_sys_color_dynamic_dark_surface_dim</item>
|
||||
<item name="colorSurfaceContainer">@color/m3_sys_color_dynamic_dark_surface_container</item>
|
||||
<item name="colorSurfaceContainerLow">@color/m3_sys_color_dynamic_dark_surface_container_low</item>
|
||||
<item name="colorSurfaceContainerHigh">@color/m3_sys_color_dynamic_dark_surface_container_high</item>
|
||||
<item name="colorSurfaceContainerLowest">@color/m3_sys_color_dynamic_dark_surface_container_lowest</item>
|
||||
<item name="colorSurfaceContainerHighest">@color/m3_sys_color_dynamic_dark_surface_container_highest</item>
|
||||
<item name="colorOutline">@color/m3_sys_color_dynamic_dark_outline</item>
|
||||
<item name="colorError">@color/m3_sys_color_dark_error</item>
|
||||
<item name="colorOnError">@color/m3_sys_color_dark_on_error</item>
|
||||
<item name="colorErrorContainer">@color/m3_sys_color_dark_error_container</item>
|
||||
<item name="colorOnErrorContainer">@color/m3_sys_color_dark_on_error_container</item>
|
||||
<item name="android:textColorPrimary">@color/m3_dynamic_dark_default_color_primary_text</item>
|
||||
<item name="android:textColorPrimaryInverse">@color/m3_dynamic_default_color_primary_text</item>
|
||||
<item name="android:textColorSecondary">@color/m3_dynamic_dark_default_color_secondary_text</item>
|
||||
<item name="android:textColorSecondaryInverse">@color/m3_dynamic_default_color_secondary_text</item>
|
||||
<item name="android:textColorTertiary">@color/m3_dynamic_dark_default_color_secondary_text</item>
|
||||
<item name="android:textColorTertiaryInverse">@color/m3_dynamic_default_color_secondary_text</item>
|
||||
<item name="android:textColorPrimaryDisableOnly">@color/m3_dynamic_dark_primary_text_disable_only</item>
|
||||
<item name="android:textColorPrimaryInverseDisableOnly">@color/m3_dynamic_primary_text_disable_only</item>
|
||||
<item name="android:textColorHint">@color/m3_dynamic_dark_hint_foreground</item>
|
||||
<item name="android:textColorHintInverse">@color/m3_dynamic_hint_foreground</item>
|
||||
<item name="android:textColorHighlight">@color/m3_dynamic_dark_highlighted_text</item>
|
||||
<item name="android:textColorHighlightInverse">@color/m3_dynamic_highlighted_text</item>
|
||||
<item name="android:textColorAlertDialogListItem">@color/m3_dynamic_dark_default_color_primary_text</item>
|
||||
</style>
|
||||
</resources>
|
63
app/src/main/res/values-v31/themes.xml
Normal file
63
app/src/main/res/values-v31/themes.xml
Normal file
@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<style name="AppTheme.MaterialYou" parent="AppTheme">
|
||||
<item name="colorPrimary">@color/m3_sys_color_dynamic_light_primary</item>
|
||||
<item name="colorOnPrimary">@color/m3_sys_color_dynamic_light_on_primary</item>
|
||||
<item name="colorPrimaryInverse">@color/m3_sys_color_dynamic_light_inverse_primary</item>
|
||||
<item name="colorPrimaryContainer">@color/m3_sys_color_dynamic_light_primary_container</item>
|
||||
<item name="colorOnPrimaryContainer">@color/m3_sys_color_dynamic_light_on_primary_container</item>
|
||||
<item name="colorPrimaryFixed">@color/m3_sys_color_dynamic_primary_fixed</item>
|
||||
<item name="colorPrimaryFixedDim">@color/m3_sys_color_dynamic_primary_fixed_dim</item>
|
||||
<item name="colorOnPrimaryFixed">@color/m3_sys_color_dynamic_on_primary_fixed</item>
|
||||
<item name="colorOnPrimaryFixedVariant">@color/m3_sys_color_dynamic_on_primary_fixed_variant</item>
|
||||
<item name="colorSecondary">@color/m3_sys_color_dynamic_light_secondary</item>
|
||||
<item name="colorOnSecondary">@color/m3_sys_color_dynamic_light_on_secondary</item>
|
||||
<item name="colorSecondaryContainer">@color/m3_sys_color_dynamic_light_secondary_container</item>
|
||||
<item name="colorOnSecondaryContainer">@color/m3_sys_color_dynamic_light_on_secondary_container</item>
|
||||
<item name="colorSecondaryFixed">@color/m3_sys_color_dynamic_secondary_fixed</item>
|
||||
<item name="colorSecondaryFixedDim">@color/m3_sys_color_dynamic_secondary_fixed_dim</item>
|
||||
<item name="colorOnSecondaryFixed">@color/m3_sys_color_dynamic_on_secondary_fixed</item>
|
||||
<item name="colorOnSecondaryFixedVariant">@color/m3_sys_color_dynamic_on_secondary_fixed_variant</item>
|
||||
<item name="colorTertiary">@color/m3_sys_color_dynamic_light_tertiary</item>
|
||||
<item name="colorOnTertiary">@color/m3_sys_color_dynamic_light_on_tertiary</item>
|
||||
<item name="colorTertiaryContainer">@color/m3_sys_color_dynamic_light_tertiary_container</item>
|
||||
<item name="colorOnTertiaryContainer">@color/m3_sys_color_dynamic_light_on_tertiary_container</item>
|
||||
<item name="colorTertiaryFixed">@color/m3_sys_color_dynamic_tertiary_fixed</item>
|
||||
<item name="colorTertiaryFixedDim">@color/m3_sys_color_dynamic_tertiary_fixed_dim</item>
|
||||
<item name="colorOnTertiaryFixed">@color/m3_sys_color_dynamic_on_tertiary_fixed</item>
|
||||
<item name="colorOnTertiaryFixedVariant">@color/m3_sys_color_dynamic_on_tertiary_fixed_variant</item>
|
||||
<item name="android:colorBackground">@color/m3_sys_color_dynamic_light_background</item>
|
||||
<item name="colorOnBackground">@color/m3_sys_color_dynamic_light_on_background</item>
|
||||
<item name="colorSurface">@color/m3_sys_color_dynamic_light_surface</item>
|
||||
<item name="colorOnSurface">@color/m3_sys_color_dynamic_light_on_surface</item>
|
||||
<item name="colorSurfaceVariant">@color/m3_sys_color_dynamic_light_surface_variant</item>
|
||||
<item name="colorOnSurfaceVariant">@color/m3_sys_color_dynamic_light_on_surface_variant</item>
|
||||
<item name="colorSurfaceInverse">@color/m3_sys_color_dynamic_light_inverse_surface</item>
|
||||
<item name="colorOnSurfaceInverse">@color/m3_sys_color_dynamic_light_inverse_on_surface</item>
|
||||
<item name="colorSurfaceBright">@color/m3_sys_color_dynamic_light_surface_bright</item>
|
||||
<item name="colorSurfaceDim">@color/m3_sys_color_dynamic_light_surface_dim</item>
|
||||
<item name="colorSurfaceContainer">@color/m3_sys_color_dynamic_light_surface_container</item>
|
||||
<item name="colorSurfaceContainerLow">@color/m3_sys_color_dynamic_light_surface_container_low</item>
|
||||
<item name="colorSurfaceContainerHigh">@color/m3_sys_color_dynamic_light_surface_container_high</item>
|
||||
<item name="colorSurfaceContainerLowest">@color/m3_sys_color_dynamic_light_surface_container_lowest</item>
|
||||
<item name="colorSurfaceContainerHighest">@color/m3_sys_color_dynamic_light_surface_container_highest</item>
|
||||
<item name="colorOutline">@color/m3_sys_color_dynamic_light_outline</item>
|
||||
<item name="colorError">@color/m3_sys_color_light_error</item>
|
||||
<item name="colorOnError">@color/m3_sys_color_light_on_error</item>
|
||||
<item name="colorErrorContainer">@color/m3_sys_color_light_error_container</item>
|
||||
<item name="colorOnErrorContainer">@color/m3_sys_color_light_on_error_container</item>
|
||||
<item name="android:textColorPrimary">@color/m3_dynamic_default_color_primary_text</item>
|
||||
<item name="android:textColorPrimaryInverse">@color/m3_dynamic_dark_default_color_primary_text</item>
|
||||
<item name="android:textColorSecondary">@color/m3_dynamic_default_color_secondary_text</item>
|
||||
<item name="android:textColorSecondaryInverse">@color/m3_dynamic_dark_default_color_secondary_text</item>
|
||||
<item name="android:textColorTertiary">@color/m3_dynamic_default_color_secondary_text</item>
|
||||
<item name="android:textColorTertiaryInverse">@color/m3_dynamic_dark_default_color_secondary_text</item>
|
||||
<item name="android:textColorPrimaryDisableOnly">@color/m3_dynamic_primary_text_disable_only</item>
|
||||
<item name="android:textColorPrimaryInverseDisableOnly">@color/m3_dynamic_dark_primary_text_disable_only</item>
|
||||
<item name="android:textColorHint">@color/m3_dynamic_hint_foreground</item>
|
||||
<item name="android:textColorHintInverse">@color/m3_dynamic_dark_hint_foreground</item>
|
||||
<item name="android:textColorHighlight">@color/m3_dynamic_highlighted_text</item>
|
||||
<item name="android:textColorHighlightInverse">@color/m3_dynamic_dark_highlighted_text</item>
|
||||
<item name="android:textColorAlertDialogListItem">@color/m3_dynamic_default_color_primary_text</item>
|
||||
</style>
|
||||
</resources>
|
Loading…
x
Reference in New Issue
Block a user