diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.java index 0c70870bb..291574f0f 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.java @@ -14,6 +14,7 @@ import java.util.Map; import java.util.TreeMap; public class Settings { + public static final String SECTION_PREMIUM = "Premium"; public static final String SECTION_CORE = "Core"; public static final String SECTION_SYSTEM = "System"; public static final String SECTION_CONTROLS = "Controls"; @@ -26,7 +27,7 @@ public class Settings { private static final Map> configFileSectionsMap = new HashMap<>(); static { - configFileSectionsMap.put(SettingsFile.FILE_NAME_CONFIG, Arrays.asList(SECTION_CORE, SECTION_SYSTEM, SECTION_CONTROLS, SECTION_RENDERER, SECTION_AUDIO, SECTION_DEBUG)); + configFileSectionsMap.put(SettingsFile.FILE_NAME_CONFIG, Arrays.asList(SECTION_PREMIUM, SECTION_CORE, SECTION_SYSTEM, SECTION_CONTROLS, SECTION_RENDERER, SECTION_AUDIO, SECTION_DEBUG)); } /** diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityPresenter.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityPresenter.java index f2c547c14..daee05ca7 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityPresenter.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityPresenter.java @@ -11,6 +11,7 @@ import org.citra.citra_emu.utils.DirectoryInitialization; import org.citra.citra_emu.utils.DirectoryInitialization.DirectoryInitializationState; import org.citra.citra_emu.utils.DirectoryStateReceiver; import org.citra.citra_emu.utils.Log; +import org.citra.citra_emu.utils.ThemeUtil; import java.io.File; @@ -108,6 +109,7 @@ public final class SettingsActivityPresenter { if (mSettings != null && finishing && mShouldSave) { Log.debug("[SettingsActivity] Settings activity stopping. Saving settings to INI..."); mSettings.saveSettings(mView); + ThemeUtil.applyTheme(mSettings); } NativeLibrary.ReloadSettings(); diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.java index 266329ad1..be1e03bb7 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.java @@ -82,6 +82,9 @@ public final class SettingsFragmentPresenter { case SettingsFile.FILE_NAME_CONFIG: addConfigSettings(sl); break; + case Settings.SECTION_PREMIUM: + addPremiumSettings(sl); + break; case Settings.SECTION_CORE: addGeneralSettings(sl); break; @@ -112,6 +115,7 @@ public final class SettingsFragmentPresenter { private void addConfigSettings(ArrayList sl) { mView.getActivity().setTitle(R.string.preferences_settings); + sl.add(new SubmenuSetting(null, null, R.string.preferences_premium, 0, Settings.SECTION_PREMIUM)); sl.add(new SubmenuSetting(null, null, R.string.preferences_general, 0, Settings.SECTION_CORE)); sl.add(new SubmenuSetting(null, null, R.string.preferences_system, 0, Settings.SECTION_SYSTEM)); sl.add(new SubmenuSetting(null, null, R.string.preferences_controls, 0, Settings.SECTION_CONTROLS)); @@ -120,6 +124,15 @@ public final class SettingsFragmentPresenter { sl.add(new SubmenuSetting(null, null, R.string.preferences_debug, 0, Settings.SECTION_DEBUG)); } + private void addPremiumSettings(ArrayList sl) { + mView.getActivity().setTitle(R.string.preferences_premium); + + SettingSection premiumSection = mSettings.getSection(Settings.SECTION_PREMIUM); + Setting design = premiumSection.getSetting(SettingsFile.KEY_DESIGN); + + sl.add(new SingleChoiceSetting(SettingsFile.KEY_DESIGN, Settings.SECTION_PREMIUM, R.string.design, 0, R.array.designNames, R.array.designValues, 0, design)); + } + private void addGeneralSettings(ArrayList sl) { mView.getActivity().setTitle(R.string.preferences_general); diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java index 46ccea7b9..75cf0330e 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java @@ -35,6 +35,8 @@ public final class SettingsFile { public static final String KEY_CPU_JIT = "use_cpu_jit"; + public static final String KEY_DESIGN = "design"; + public static final String KEY_HW_RENDERER = "use_hw_renderer"; public static final String KEY_HW_SHADER = "use_hw_shader"; public static final String KEY_SHADERS_ACCURATE_MUL = "shaders_accurate_mul"; @@ -148,10 +150,12 @@ public final class SettingsFile { } } catch (FileNotFoundException e) { Log.error("[SettingsFile] File not found: " + ini.getAbsolutePath() + e.getMessage()); - view.onSettingsFileNotFound(); + if (view != null) + view.onSettingsFileNotFound(); } catch (IOException e) { Log.error("[SettingsFile] Error reading from: " + ini.getAbsolutePath() + e.getMessage()); - view.onSettingsFileNotFound(); + if (view != null) + view.onSettingsFileNotFound(); } finally { if (reader != null) { try { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java index 4794792d1..3e54ae620 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java @@ -22,6 +22,7 @@ import org.citra.citra_emu.utils.DirectoryInitialization; import org.citra.citra_emu.utils.FileBrowserHelper; import org.citra.citra_emu.utils.PermissionsHandler; import org.citra.citra_emu.utils.StartupHandler; +import org.citra.citra_emu.utils.ThemeUtil; /** * The main Activity of the Lollipop style UI. Manages several PlatformGamesFragments, which @@ -47,6 +48,7 @@ public final class MainActivity extends AppCompatActivity implements MainView { mPresenter.onCreate(); if (savedInstanceState == null) { + ThemeUtil.applyTheme(); StartupHandler.HandleInit(this); if (PermissionsHandler.hasWriteAccess(this)) { mPlatformGamesFragment = new PlatformGamesFragment(); diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/ThemeUtil.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/ThemeUtil.java new file mode 100644 index 000000000..1c0f3aa6d --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/ThemeUtil.java @@ -0,0 +1,42 @@ +package org.citra.citra_emu.utils; + +import android.os.Build; + +import androidx.appcompat.app.AppCompatDelegate; + +import org.citra.citra_emu.features.settings.model.Setting; +import org.citra.citra_emu.features.settings.model.Settings; +import org.citra.citra_emu.features.settings.utils.SettingsFile; + +public class ThemeUtil { + + public static void applyTheme() { + Settings settings = new Settings(); + settings.loadSettings(null); + applyTheme(settings); + } + + public static void applyTheme(Settings settings) { + Setting design = settings.getSection(Settings.SECTION_PREMIUM).getSetting((SettingsFile.KEY_DESIGN)); + if (design == null) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + return; + } + + int designValue = Integer.parseInt(design.getValueAsString()); + switch (designValue) { + case 0: + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + break; + case 1: + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + break; + case 2: + AppCompatDelegate.setDefaultNightMode(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ? + AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM : + AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY); + break; + } + } + +} diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h index e47b13c93..e86f39c7d 100644 --- a/src/android/app/src/main/jni/default_ini.h +++ b/src/android/app/src/main/jni/default_ini.h @@ -7,6 +7,11 @@ namespace DefaultINI { const char* sdl2_config_file = R"( +[Premium] +# What Android design to use +# 0 (default): Light, 1: Dark, 2: System default +design = + [Controls] # The input devices and parameters for each 3DS native input # It should be in the format of "engine:[engine_name],[param1]:[value1],[param2]:[value2]..." diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 6e44f9ea7..69b29e00f 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -12,6 +12,18 @@ 1 + + Light + Dark + System default + + + + 0 + 1 + 2 + + Auto-select Japan diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 3ba88a6b4..20feba40c 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -41,6 +41,7 @@ Uses the Just-in-Time (JIT) compiler for CPU emulation. When enabled, game performance will be significantly improved. System clock type Set the emulated 3DS clock to either reflect that of your device or start at a simulated date and time. + Design System clock starting time override @@ -92,6 +93,7 @@ Settings + Premium General System Gamepad