summaryrefslogtreecommitdiff
path: root/Source/Android/app/src
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Android/app/src')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java2
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java61
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java11
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ThemeHelper.java91
-rw-r--r--Source/Android/app/src/main/res/drawable/ic_back.xml9
-rw-r--r--Source/Android/app/src/main/res/drawable/tv_card_background.xml2
-rw-r--r--Source/Android/app/src/main/res/values-night/bools.xml4
-rw-r--r--Source/Android/app/src/main/res/values-v27/themes.xml8
-rw-r--r--Source/Android/app/src/main/res/values-v29/themes.xml2
-rw-r--r--Source/Android/app/src/main/res/values/arrays.xml11
-rw-r--r--Source/Android/app/src/main/res/values/bools.xml4
-rw-r--r--Source/Android/app/src/main/res/values/strings.xml1
-rw-r--r--Source/Android/app/src/main/res/values/styles.xml2
-rw-r--r--Source/Android/app/src/main/res/values/themes.xml5
14 files changed, 163 insertions, 50 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java
index 11fc2a0046..c7f2b0c54c 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java
@@ -34,6 +34,8 @@ public enum IntSetting implements AbstractIntSetting
MAIN_EMULATION_ORIENTATION(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID,
"EmulationOrientation", ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE),
MAIN_INTERFACE_THEME(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID, "InterfaceTheme", 0),
+ MAIN_INTERFACE_THEME_MODE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID,
+ "InterfaceThemeMode", -1),
MAIN_LAST_PLATFORM_TAB(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID, "LastPlatformTab", 0),
MAIN_MOTION_CONTROLS(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID, "MotionControls", 1),
MAIN_IR_MODE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID, "IRMode",
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java
index 1f073ace20..3c0838029b 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java
@@ -8,6 +8,8 @@ import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
+import androidx.appcompat.app.AppCompatActivity;
+
import org.dolphinemu.dolphinemu.NativeLibrary;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.activities.UserDataActivity;
@@ -328,33 +330,37 @@ public final class SettingsFragmentPresenter
AbstractIntSetting appTheme = new AbstractIntSetting()
{
- @Override public boolean isOverridden(Settings settings)
+ @Override
+ public boolean isOverridden(Settings settings)
{
return IntSetting.MAIN_INTERFACE_THEME.isOverridden(settings);
}
- @Override public boolean isRuntimeEditable()
+ @Override
+ public boolean isRuntimeEditable()
{
// This only affects app UI
return true;
}
- @Override public boolean delete(Settings settings)
+ @Override
+ public boolean delete(Settings settings)
{
- ThemeHelper.deleteThemeKey(mView.getActivity());
+ ThemeHelper.deleteThemeKey((AppCompatActivity) mView.getActivity());
return IntSetting.MAIN_INTERFACE_THEME.delete(settings);
}
- @Override public int getInt(Settings settings)
+ @Override
+ public int getInt(Settings settings)
{
return IntSetting.MAIN_INTERFACE_THEME.getInt(settings);
}
- @Override public void setInt(Settings settings, int newValue)
+ @Override
+ public void setInt(Settings settings, int newValue)
{
- ThemeHelper.saveTheme(mView.getActivity(), newValue);
IntSetting.MAIN_INTERFACE_THEME.setInt(settings, newValue);
- mView.getActivity().recreate();
+ ThemeHelper.saveTheme((AppCompatActivity) mView.getActivity(), newValue);
}
};
@@ -369,6 +375,45 @@ public final class SettingsFragmentPresenter
sl.add(new SingleChoiceSetting(mContext, appTheme, R.string.change_theme, 0,
R.array.themeEntries, R.array.themeValues));
}
+
+ AbstractIntSetting themeMode = new AbstractIntSetting()
+ {
+ @Override
+ public boolean isOverridden(Settings settings)
+ {
+ return IntSetting.MAIN_INTERFACE_THEME_MODE.isOverridden(settings);
+ }
+
+ @Override
+ public boolean isRuntimeEditable()
+ {
+ // This only affects app UI
+ return true;
+ }
+
+ @Override
+ public boolean delete(Settings settings)
+ {
+ ThemeHelper.deleteThemeModeKey((AppCompatActivity) mView.getActivity());
+ return IntSetting.MAIN_INTERFACE_THEME_MODE.delete(settings);
+ }
+
+ @Override
+ public int getInt(Settings settings)
+ {
+ return IntSetting.MAIN_INTERFACE_THEME_MODE.getInt(settings);
+ }
+
+ @Override
+ public void setInt(Settings settings, int newValue)
+ {
+ IntSetting.MAIN_INTERFACE_THEME_MODE.setInt(settings, newValue);
+ ThemeHelper.saveThemeMode((AppCompatActivity) mView.getActivity(), newValue);
+ }
+ };
+
+ sl.add(new SingleChoiceSetting(mContext, themeMode, R.string.change_theme_mode, 0,
+ R.array.themeModeEntries, R.array.themeModeValues));
}
private void addAudioSettings(ArrayList<SettingsItem> sl)
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java
index f872802a9f..15cf635615 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java
@@ -13,6 +13,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatDelegate;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.preference.PreferenceManager;
@@ -87,6 +88,16 @@ public final class DirectoryInitialization
.apply();
}
+ if (IntSetting.MAIN_INTERFACE_THEME_MODE.getIntGlobal() !=
+ preferences.getInt(ThemeHelper.CURRENT_THEME_MODE,
+ AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM))
+ {
+ preferences.edit()
+ .putInt(ThemeHelper.CURRENT_THEME_MODE,
+ IntSetting.MAIN_INTERFACE_THEME_MODE.getIntGlobal())
+ .apply();
+ }
+
if (wiimoteIniWritten)
{
// This has to be done after calling NativeLibrary.Initialize(),
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ThemeHelper.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ThemeHelper.java
index ff96e033c0..040e20990a 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ThemeHelper.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ThemeHelper.java
@@ -10,7 +10,10 @@ import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.content.ContextCompat;
+import androidx.core.view.WindowCompat;
+import androidx.core.view.WindowInsetsControllerCompat;
import androidx.preference.PreferenceManager;
import com.google.android.material.appbar.AppBarLayout;
@@ -23,6 +26,7 @@ import org.dolphinemu.dolphinemu.ui.main.ThemeProvider;
public class ThemeHelper
{
public static final String CURRENT_THEME = "current_theme";
+ public static final String CURRENT_THEME_MODE = "current_theme_mode";
public static final int DEFAULT = 0;
public static final int MONET = 1;
@@ -38,6 +42,7 @@ public class ThemeHelper
// requested theme id is ready before the onCreate method of any given Activity.
SharedPreferences preferences =
PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext());
+ setThemeMode(activity);
switch (preferences.getInt(CURRENT_THEME, DEFAULT))
{
case DEFAULT:
@@ -70,22 +75,88 @@ public class ThemeHelper
}
}
- public static void saveTheme(@NonNull Activity activity, int themeValue)
+ private static void setThemeMode(@NonNull AppCompatActivity activity)
{
- SharedPreferences preferences =
- PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext());
- preferences.edit().putInt(CURRENT_THEME, themeValue).apply();
+ int themeMode = PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext())
+ .getInt(CURRENT_THEME_MODE, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
+ activity.getDelegate().setLocalNightMode(themeMode);
+
+ WindowInsetsControllerCompat windowController =
+ WindowCompat.getInsetsController(activity.getWindow(),
+ activity.getWindow().getDecorView());
+ int systemReportedThemeMode =
+ activity.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
+
+ switch (themeMode)
+ {
+ case AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM:
+ switch (systemReportedThemeMode)
+ {
+ case Configuration.UI_MODE_NIGHT_NO:
+ setLightModeSystemBars(windowController);
+ break;
+ case Configuration.UI_MODE_NIGHT_YES:
+ setDarkModeSystemBars(windowController);
+ break;
+ }
+ break;
+ case AppCompatDelegate.MODE_NIGHT_NO:
+ setLightModeSystemBars(windowController);
+ break;
+ case AppCompatDelegate.MODE_NIGHT_YES:
+ setDarkModeSystemBars(windowController);
+ break;
+ }
}
- public static void deleteThemeKey(@NonNull Activity activity)
+ private static void setLightModeSystemBars(@NonNull WindowInsetsControllerCompat windowController)
{
- SharedPreferences preferences =
- PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext());
- preferences.edit().remove(CURRENT_THEME).apply();
- activity.setTheme(R.style.Theme_Dolphin_Main);
+ windowController.setAppearanceLightStatusBars(true);
+ windowController.setAppearanceLightNavigationBars(true);
+ }
+
+ private static void setDarkModeSystemBars(@NonNull WindowInsetsControllerCompat windowController)
+ {
+ windowController.setAppearanceLightStatusBars(false);
+ windowController.setAppearanceLightNavigationBars(false);
+ }
+
+ public static void saveTheme(@NonNull AppCompatActivity activity, int themeValue)
+ {
+ PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext())
+ .edit()
+ .putInt(CURRENT_THEME, themeValue)
+ .apply();
+ activity.recreate();
+ }
+
+ public static void deleteThemeKey(@NonNull AppCompatActivity activity)
+ {
+ PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext())
+ .edit()
+ .remove(CURRENT_THEME)
+ .apply();
activity.recreate();
}
+ public static void saveThemeMode(@NonNull AppCompatActivity activity, int themeModeValue)
+ {
+ PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext())
+ .edit()
+ .putInt(CURRENT_THEME_MODE, themeModeValue)
+ .apply();
+ setThemeMode(activity);
+ }
+
+ public static void deleteThemeModeKey(@NonNull AppCompatActivity activity)
+ {
+ PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext())
+ .edit()
+ .remove(CURRENT_THEME_MODE)
+ .apply();
+ setThemeMode(activity);
+ }
+
public static void setCorrectTheme(AppCompatActivity activity)
{
int currentTheme = ((ThemeProvider) activity).getThemeId();
@@ -110,7 +181,7 @@ public class ThemeHelper
}
}
- public static void setNavigationBarColor(Activity activity, @ColorInt int color)
+ public static void setNavigationBarColor(@NonNull Activity activity, @ColorInt int color)
{
int gestureType = InsetsHelper.getSystemGestureType(activity.getApplicationContext());
int orientation = activity.getResources().getConfiguration().orientation;
diff --git a/Source/Android/app/src/main/res/drawable/ic_back.xml b/Source/Android/app/src/main/res/drawable/ic_back.xml
deleted file mode 100644
index 344d5e6974..0000000000
--- a/Source/Android/app/src/main/res/drawable/ic_back.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:fillColor="?attr/colorOnSurface"
- android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
-</vector>
diff --git a/Source/Android/app/src/main/res/drawable/tv_card_background.xml b/Source/Android/app/src/main/res/drawable/tv_card_background.xml
index ee4320d5b3..58ae5f09a8 100644
--- a/Source/Android/app/src/main/res/drawable/tv_card_background.xml
+++ b/Source/Android/app/src/main/res/drawable/tv_card_background.xml
@@ -2,7 +2,7 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_selected="true"
- android:drawable="@color/dolphin_primary"/>
+ android:drawable="@color/dolphin_blue"/>
<item
android:drawable="@color/tv_card_unselected"/>
</selector>
diff --git a/Source/Android/app/src/main/res/values-night/bools.xml b/Source/Android/app/src/main/res/values-night/bools.xml
deleted file mode 100644
index 85800a2f2c..0000000000
--- a/Source/Android/app/src/main/res/values-night/bools.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <bool name="lightSystemBars">false</bool>
-</resources>
diff --git a/Source/Android/app/src/main/res/values-v27/themes.xml b/Source/Android/app/src/main/res/values-v27/themes.xml
deleted file mode 100644
index ec8f103c8d..0000000000
--- a/Source/Android/app/src/main/res/values-v27/themes.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <style name="Theme.V27.Dolphin" parent="Theme.Dolphin">
- <item name="android:windowLightNavigationBar">@bool/lightSystemBars</item>
- </style>
-
- <style name="Theme.Dolphin.Main" parent="Theme.V27.Dolphin" />
-</resources>
diff --git a/Source/Android/app/src/main/res/values-v29/themes.xml b/Source/Android/app/src/main/res/values-v29/themes.xml
index 232c5aeefa..ac6105b3bb 100644
--- a/Source/Android/app/src/main/res/values-v29/themes.xml
+++ b/Source/Android/app/src/main/res/values-v29/themes.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <style name="Theme.V29.Dolphin" parent="Theme.V27.Dolphin">
+ <style name="Theme.V29.Dolphin" parent="Theme.Dolphin">
<item name="android:enforceStatusBarContrast">false</item>
<item name="android:enforceNavigationBarContrast">false</item>
</style>
diff --git a/Source/Android/app/src/main/res/values/arrays.xml b/Source/Android/app/src/main/res/values/arrays.xml
index 0089d6eef6..4b789407b3 100644
--- a/Source/Android/app/src/main/res/values/arrays.xml
+++ b/Source/Android/app/src/main/res/values/arrays.xml
@@ -507,6 +507,17 @@
<item>4</item>
</integer-array>
+ <string-array name="themeModeEntries">
+ <item>Follow System</item>
+ <item>Light</item>
+ <item>Dark</item>
+ </string-array>
+ <integer-array name="themeModeValues">
+ <item>-1</item>
+ <item>1</item>
+ <item>2</item>
+ </integer-array>
+
<string-array name="synchronizeGpuThreadEntries">
<item>Never</item>
<item>On Idle Skipping</item>
diff --git a/Source/Android/app/src/main/res/values/bools.xml b/Source/Android/app/src/main/res/values/bools.xml
deleted file mode 100644
index fbc2def833..0000000000
--- a/Source/Android/app/src/main/res/values/bools.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <bool name="lightSystemBars">true</bool>
-</resources>
diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml
index f35b5adb60..e262eb65c5 100644
--- a/Source/Android/app/src/main/res/values/strings.xml
+++ b/Source/Android/app/src/main/res/values/strings.xml
@@ -196,6 +196,7 @@
<string name="show_titles_in_game_list">Show Titles in Game List</string>
<string name="show_titles_in_game_list_description">Show the title and creator below each game cover.</string>
<string name="change_theme">Change App Theme</string>
+ <string name="change_theme_mode">Change Theme Mode</string>
<!-- Online Update Region Select Fragment -->
<string name="region_select_title">Please select a region</string>
diff --git a/Source/Android/app/src/main/res/values/styles.xml b/Source/Android/app/src/main/res/values/styles.xml
index 9c71db19ee..c5d03d9e5c 100644
--- a/Source/Android/app/src/main/res/values/styles.xml
+++ b/Source/Android/app/src/main/res/values/styles.xml
@@ -42,7 +42,7 @@
<style name="DolphinTVDialog" parent="Theme.Material3.DayNight.Dialog.Alert">
<item name="colorSurface">@color/dolphin_inverseOnSurface</item>
- <item name="colorPrimary">@color/dolphin_primary</item>
+ <item name="colorPrimary">@color/dolphin_blue</item>
</style>
<style name="DolphinButton" parent="Widget.Material3.Button.TextButton.Dialog">
diff --git a/Source/Android/app/src/main/res/values/themes.xml b/Source/Android/app/src/main/res/values/themes.xml
index f9c1727adf..177febe54b 100644
--- a/Source/Android/app/src/main/res/values/themes.xml
+++ b/Source/Android/app/src/main/res/values/themes.xml
@@ -47,9 +47,6 @@
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
- <item name="homeAsUpIndicator">@drawable/ic_back</item>
-
- <item name="android:windowLightStatusBar" tools:targetApi="m">@bool/lightSystemBars</item>
<item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="o_mr1">default</item>
<item name="materialAlertDialogTheme">@style/DolphinMaterialDialog</item>
@@ -58,7 +55,7 @@
<item name="materialDividerStyle">@style/DolphinDivider</item>
</style>
- <!-- Trick for API >= 27 specific changes -->
+ <!-- Trick for API >= 29 specific changes -->
<style name="Theme.Dolphin.Main" parent="Theme.Dolphin" />
<style name="Theme.Dolphin.Main.Material" parent="Theme.Dolphin.Main">