diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt index 4f6b93bd2e..9aa8eeed13 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt @@ -1,5 +1,6 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + package org.yuzu.yuzu_emu.features.settings.model @@ -91,6 +92,7 @@ object Settings { const val PREF_THEME = "Theme" const val PREF_THEME_MODE = "ThemeMode" const val PREF_BLACK_BACKGROUNDS = "BlackBackgrounds" + const val PREF_STATIC_THEME_COLOR = "StaticThemeColor" enum class EmulationOrientation(val int: Int) { Unspecified(0), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 3ea5f50081..7fa22b272f 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -1,11 +1,12 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.features.settings.ui import android.annotation.SuppressLint import android.os.Build import android.widget.Toast +import androidx.preference.PreferenceManager import org.yuzu.yuzu_emu.NativeLibrary import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.YuzuApplication @@ -27,6 +28,7 @@ import org.yuzu.yuzu_emu.features.settings.model.StringSetting import org.yuzu.yuzu_emu.features.settings.model.view.* import org.yuzu.yuzu_emu.utils.InputHandler import org.yuzu.yuzu_emu.utils.NativeConfig +import androidx.core.content.edit class SettingsFragmentPresenter( private val settingsViewModel: SettingsViewModel, @@ -916,6 +918,26 @@ class SettingsFragmentPresenter( } } + val staticThemeColor: AbstractIntSetting = object : AbstractIntSetting { + val preferences = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) + override fun getInt(needsGlobal: Boolean): Int = + preferences.getInt(Settings.PREF_STATIC_THEME_COLOR, 0) + override fun setInt(value: Int) { + preferences.edit() { putInt(Settings.PREF_STATIC_THEME_COLOR, value) } + settingsViewModel.setShouldRecreate(true) + } + + override val key: String = Settings.PREF_STATIC_THEME_COLOR + override val isRuntimeModifiable: Boolean = true + override fun getValueAsString(needsGlobal: Boolean): String = + preferences.getInt(Settings.PREF_STATIC_THEME_COLOR, 0).toString() + override val defaultValue: Any = 0 + override fun reset() { + preferences.edit() { putInt(Settings.PREF_STATIC_THEME_COLOR, 0) } + settingsViewModel.setShouldRecreate(true) + } + } + add( SingleChoiceSetting( themeMode, @@ -925,6 +947,15 @@ class SettingsFragmentPresenter( ) ) + add( + SingleChoiceSetting( + staticThemeColor, + titleId = R.string.static_theme_color, + choicesId = R.array.staticThemeNames, + valuesId = R.array.staticThemeValues + ) + ) + val blackBackgrounds: AbstractBooleanSetting = object : AbstractBooleanSetting { override fun getBoolean(needsGlobal: Boolean): Boolean = BooleanSetting.BLACK_BACKGROUNDS.getBoolean() diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt index 757463a0b5..a0de1bbd8b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.ui.main @@ -67,6 +67,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider { val splashScreen = installSplashScreen() splashScreen.setKeepOnScreenCondition { !DirectoryInitialization.areDirectoriesReady } + ThemeHelper.ThemeChangeListener(this) ThemeHelper.setTheme(this) super.onCreate(savedInstanceState) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ThemeHelper.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ThemeHelper.kt index 6f7f40e436..89ec3672ca 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ThemeHelper.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ThemeHelper.kt @@ -1,8 +1,9 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.utils +import android.content.SharedPreferences import android.content.res.Configuration import android.graphics.Color import android.os.Build @@ -16,19 +17,26 @@ import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting import org.yuzu.yuzu_emu.features.settings.model.IntSetting import org.yuzu.yuzu_emu.ui.main.ThemeProvider +import androidx.preference.PreferenceManager +import org.yuzu.yuzu_emu.YuzuApplication +import org.yuzu.yuzu_emu.features.settings.model.Settings object ThemeHelper { const val SYSTEM_BAR_ALPHA = 0.9f + // Listener that detects if the theme keys are being changed from the setting menu and recreates the activity + private var listener: SharedPreferences.OnSharedPreferenceChangeListener? = null + private val preferences = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) + fun setTheme(activity: AppCompatActivity) { setThemeMode(activity) when (Theme.from(IntSetting.THEME.getInt())) { - Theme.Default -> activity.setTheme(R.style.Theme_Yuzu_Main) + Theme.Default -> activity.setTheme(getSelectedStaticThemeColor()) Theme.MaterialYou -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { activity.setTheme(R.style.Theme_Yuzu_Main_MaterialYou) } else { - activity.setTheme(R.style.Theme_Yuzu_Main) + activity.setTheme(getSelectedStaticThemeColor()) } } } @@ -41,6 +49,22 @@ object ThemeHelper { } } + private fun getSelectedStaticThemeColor(): Int { + val themeIndex = preferences.getInt(Settings.PREF_STATIC_THEME_COLOR, 0) + val themes = arrayOf( + R.style.Theme_Yuzu_Main_Violet, + R.style.Theme_Yuzu_Main_Blue, + R.style.Theme_Yuzu_Main_Cyan, + R.style.Theme_Yuzu_Main_Red, + R.style.Theme_Yuzu_Main_Green, + R.style.Theme_Yuzu_Main_Yellow, + R.style.Theme_Yuzu_Main_Orange, + R.style.Theme_Yuzu_Main_Pink, + R.style.Theme_Yuzu_Main_Gray + ) + return themes[themeIndex] + } + @ColorInt fun getColorWithOpacity(@ColorInt color: Int, alphaFactor: Float): Int { return Color.argb( @@ -93,6 +117,16 @@ object ThemeHelper { windowController.isAppearanceLightStatusBars = false windowController.isAppearanceLightNavigationBars = false } + + fun ThemeChangeListener(activity: AppCompatActivity) { + listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key -> + val relevantKeys = listOf(Settings.PREF_STATIC_THEME_COLOR, Settings.PREF_THEME_MODE, Settings.PREF_BLACK_BACKGROUNDS) + if (key in relevantKeys) { + activity.recreate() + } + } + preferences.registerOnSharedPreferenceChangeListener(listener) + } } enum class Theme(val int: Int) { diff --git a/src/android/app/src/main/res/drawable/premium_background.xml b/src/android/app/src/main/res/drawable/premium_background.xml deleted file mode 100644 index c9c41ddbe0..0000000000 --- a/src/android/app/src/main/res/drawable/premium_background.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - diff --git a/src/android/app/src/main/res/layout/activity_main.xml b/src/android/app/src/main/res/layout/activity_main.xml index ad426457f6..5f59138607 100644 --- a/src/android/app/src/main/res/layout/activity_main.xml +++ b/src/android/app/src/main/res/layout/activity_main.xml @@ -23,6 +23,7 @@ + app:cardElevation="0dp"> diff --git a/src/android/app/src/main/res/layout/fragment_settings.xml b/src/android/app/src/main/res/layout/fragment_settings.xml index 110c70eef6..66cfebe96d 100644 --- a/src/android/app/src/main/res/layout/fragment_settings.xml +++ b/src/android/app/src/main/res/layout/fragment_settings.xml @@ -19,7 +19,9 @@ style="?attr/collapsingToolbarLayoutMediumStyle" android:layout_width="match_parent" android:layout_height="?attr/collapsingToolbarLayoutMediumSize" - app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"> + app:layout_scrollFlags="scroll|exitUntilCollapsed|snap" + app:contentScrim="?attr/colorOnSurfaceInverse" + app:scrimVisibleHeightTrigger="100dp"> - #A7DDEC - #003399 - #31323F - #D1E4FF - #BAC8DB - #253140 - #3B4858 - #D6E4F7 - #D6BEE5 - #3A2948 - #524060 - #F2DAFF + + #B7C4FF + #002681 + #0039B5 + #DCE1FF + #C2C5DD + #2B3042 + #424659 + #DEE1F9 + #E4BADA + #43273F + #5C3D56 + #FFD7F5 + #1B1B1F + #E4E1E6 + #1B1B1F + #E4E1E6 + #45464F + #C6C5D0 + #90909A + #1B1B1F + #E4E1E6 + #154FE2 + #B7C4FF + + + #B7FFF7 + #007D81 + #00A0B5 + #DCFFFB + #C2DDDB + #2B3F42 + #425659 + #DEF9F7 + #BAE1E4 + #274341 + #3D5C5C + #D7FFFE + #1B1F1E + #E1E6E5 + #1B1F1F + #E1E6E5 + #454F4D + #C5D0CF + #909A98 + #1B1F1F + #E1E6E5 + #15E2D1 + #B7C4FF + + + #FFB7B7 + #810000 + #B50000 + #FFDCDC + #DDC2C2 + #422B2B + #594242 + #F9DEDE + #E4BABA + #432727 + #5C3D3D + #FFD7D7 + #1F1B1B + #E6E1E1 + #1F1B1B + #E6E1E1 + #4F4545 + #D0C5C5 + #9A9090 + #1F1B1B + #E6E1E1 + #E21515 + #FFB7B7 + + + #D0FFB7 + #368100 + #1BB500 + #E5FFDC + #CDDDC2 + #32422B + #4B5942 + #E9F9DE + #CAE4BA + #2F4327 + #455C3D + #E8FFD7 + #1C1F1B + #E2E6E1 + #1C1F1B + #E2E6E1 + #494F45 + #C9D0C5 + #959A90 + #1D1F1B + #E2E6E1 + #82E215 + #CDFFB7 + + + #FFEDB7 + #817F00 + #B5A300 + #FFFDDC + #DDDDC2 + #42422B + #595942 + #F7F9DE + #E0E4BA + #424327 + #5C583D + #FFFBD7 + #1F1F1B + #E6E6E1 + #1F1F1B + #E6E5E1 + #4F4E45 + #D0D0C5 + #9A9990 + #1B1B1F + #E6E6E1 + #DBE215 + #FFFBB7 + + + #FFCBB7 + #812500 + #B55400 + #FFEBDC + #DDCDC2 + #42342B + #594A42 + #F9E6DE + #E4CCBA + #433127 + #5C463D + #FFEFD7 + #1F1D1B + #E6E3E1 + #1F1D1B + #E6E3E1 + #4F4A45 + #D0CAC5 + #9A9490 + #1F1D1B + #E6E3E1 + #E26E15 + #FFD4B7 + + + #DAB7FF + #350068 + #5A00B5 + #F4DCFF + #D2C2DD + #342B42 + #594265 + #E9DEF9 + #DACCE4 + #402743 + #5C4E5C + #FFD7FF + #1F1B1F + #E6E4E6 + #1F1B1F + #E6E4E6 + #4F454F + #D0C6D0 + #9A909A + #1F1B1F + #E6E4E6 + #B154E2 + #DAB7FF + + + #FFB7C5 + #81001E + #B50033 + #FFDCE6 + #DDC2C7 + #422B34 + #594249 + #FCF9DEE6 + #E4BAC4 + #432730 + #5C3D49 + #FFD7DF + #1F1B1C + #E6E1E2 + #1F1B1C + #E6E1E2 + #4F4547 + #D0C5C8 + #9A9093 + #1F1B1C + #E6E1E2 + #E21556 + #FFB7D6 + + + #B7B7B7 + #2B2B2B + #424242 + #E1E1E1 + #C2C2C2 + #424242 + #656565 + #EDEDED + #DADADA + #3F3F3F + #565656 + #F5F5F5 + #1B1B1B + #E4E4E4 + #1B1B1B + #E4E4E4 + #454545 + #C6C6C6 + #909090 + #1B1B1B + #E4E4E4 + #B7B7B7 + #B7B7B7 + + + #C6C5D0 #FFB4AB #93000A #690005 #FFDAD6 - #1A1C1E - #E2E2E6 - #1B1B1D - #E2E2E6 - #26282C - #C3C7CF - #8C9199 - #1A1C1E - #E2E2E6 - #0062A2 #000000 - #9DCAFF - #42474E + #000000 - #840099 - #005AE1 - - + \ No newline at end of file diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 1bd6455b4c..99013e0485 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -275,6 +275,29 @@ 3 + + Violet (Default) + Blue + Cyan + Red + Green + Yellow + Orange + Pink + Gray + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + + @string/auto @string/slider_default diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 02683f37e4..7ff8929a36 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -644,6 +644,9 @@ Black backgrounds When using the dark theme, apply black backgrounds. + + Theme Color + Picture in Picture Minimize window when placed in the background diff --git a/src/android/app/src/main/res/values/styles.xml b/src/android/app/src/main/res/values/styles.xml index 4f5de73609..be49a1b348 100644 --- a/src/android/app/src/main/res/values/styles.xml +++ b/src/android/app/src/main/res/values/styles.xml @@ -18,19 +18,148 @@ gone - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/android/app/src/main/res/values/themes.xml b/src/android/app/src/main/res/values/themes.xml index 60388b71e2..20b789ec45 100644 --- a/src/android/app/src/main/res/values/themes.xml +++ b/src/android/app/src/main/res/values/themes.xml @@ -2,45 +2,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/android/app/src/main/res/values/yuzu_colors.xml b/src/android/app/src/main/res/values/yuzu_colors.xml index 5b7d189dc9..a45b95f85c 100644 --- a/src/android/app/src/main/res/values/yuzu_colors.xml +++ b/src/android/app/src/main/res/values/yuzu_colors.xml @@ -1,37 +1,264 @@ - #990E00 - #FFFFFF - #EEDEDD - #400200 - #775650 - #FFFFFF - #FFDAD4 - #2C1511 - #6F5C2E - #FFFFFF - #FAE0A6 - #251A00 + + #154FE2 + #DCE1FF + #001551 + #595D72 + #DEE1F9 + #161B2C + #75546F + #FFD7F5 + #2C1229 + #FEFBFF + #1B1B1F + #FEFBFF + #1B1B1F + #E2E1EC + #45464F + #767680 + #F2F0F4 + #303034 + #B7C4FF + #154FE2 + + + #E21515 + #FFDCDC + #510000 + #725959 + #F9DEDE + #2C1616 + #755454 + #FFD7D7 + #2C1212 + #FFFBFB + #1F1B1B + #FFFBFB + #1F1B1B + #ECE1E1 + #4F4545 + #807676 + #F4F0F0 + #343030 + #FFB7B7 + #E21515 + + + #1FAA59 + #C6F6D5 + #012D12 + #4D8066 + #D4EDE1 + #1A3328 + #3D7267 + #BCECE0 + #1C4039 + #FBFFFC + #1B1F1B + #FBFFFC + #1B1F1B + #E1ECE1 + #454F46 + #768077 + #F0F4F0 + #303430 + #B7FFB8 + #1FAA59 + + + #15E2D1 + #DCFFFE + #005148 + #595D72 + #DEF8F9 + #162C2C + #75546F + #D7FCFF + #122C2C + #FBFFFF + #1B1F1F + #FBFFFF + #1B1F1F + #E1ECEB + #454F4F + #76807F + #F0F4F4 + #303434 + #B7FFF7 + #15E2C3 + + + #5DE215 + #E9FFDC + #185100 + #595D72 + #E9F9DE + #1F2C16 + #547564 + #D7FFEA + #122C20 + #FBFFFB + #1C1F1B + #FBFFFB + #1B1F1B + #E2ECE1 + #464F45 + #778076 + #F0F4F0 + #313430 + #BCFFB7 + #41E215 + + + #CDE2C015 + #FEFFDC + #4C5100 + #717259 + #F8F9DE + #2C2C16 + #757254 + #FFFDD7 + #2C2B12 + #FFFFFB + #1F1F1B + #FFFFFB + #1F1F1B + #ECEBE1 + #4E4F45 + #7F8076 + #F4F4F0 + #343430 + #FFFEB7 + #E2CE15 + + + #E26E15 + #FFECDC + #512600 + #726759 + #F9EADE + #2C1E16 + #756354 + #FFF0D7 + #2C2012 + #FFFDFB + #1F1D1B + #FFFDFB + #1F1D1B + #ECE6E1 + #4F4A45 + #807B76 + #F4F2F0 + #343230 + #FFD9B7 + #E27F15 + + + #DB15E2 + #FDDCFF + #4E0051 + #6B5972 + #F6DEF9 + #26162C + #6E5475 + #F6D7FF + #29122C + #FEFBFF + #1E1B1F + #FEFBFF + #1D1B1F + #E7E1EC + #4B454F + #7A7680 + #F2F0F4 + #323034 + #E3B7FF + #8215E2 + + + #E21556 + #FF73A4 + #510023 + #725962 + #F9DEE9 + #2C1620 + #755463 + #FFD7E7 + #2C121A + #FF9CB5 + #1F1B1C + #FFFBFC + #1F1B1C + #ECE1E4 + #4F4547 + #807679 + #F4F0F1 + #343031 + #FFB7D0 + #E21545 + + + #9E9E9E + #F5F5F5 + #1E1E1E + #BDBDBD + #E0E0E0 + #424242 + #757575 + #BDBDBD + #1E1E1E + #FAFAFA + #1E1E1E + #FAFAFA + #1E1E1E + #E0E0E0 + #424242 + #424242 + #FAFAFA + #1E1E1E + #BDBDBD + #9E9E9E + + + #C6C5D0 #BA1A1A #FFDAD6 #FFFFFF #410002 - #FFFBFF - #201A19 - #FFFBFF - #201A19 - #F5DDD9 - #534340 - #857370 - #FBEEEB - #362F2D - #FFB4A6 #000000 - #B52612 - #D8C2BE - - #99FFE1 - #76C5FF + #000000 + + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF