diff --git a/src/android/app/src/main/cpp/NativeSettings.cpp b/src/android/app/src/main/cpp/NativeSettings.cpp index fe68d2e4..8b5073dc 100644 --- a/src/android/app/src/main/cpp/NativeSettings.cpp +++ b/src/android/app/src/main/cpp/NativeSettings.cpp @@ -346,4 +346,17 @@ Java_info_cemu_Cemu_nativeinterface_NativeSettings_setAudioLatency([[maybe_unuse { g_config.data().audio_delay = latency; g_config.Save(); +} + +extern "C" [[maybe_unused]] JNIEXPORT jint JNICALL +Java_info_cemu_Cemu_nativeinterface_NativeSettings_getConsoleLanguage([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz) +{ + return static_cast(g_config.data().console_language.GetValue()); +} + +extern "C" [[maybe_unused]] JNIEXPORT void JNICALL +Java_info_cemu_Cemu_nativeinterface_NativeSettings_setConsoleLanguage([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jint console_language) +{ + g_config.data().console_language = static_cast(console_language); + g_config.Save(); } \ No newline at end of file diff --git a/src/android/app/src/main/java/info/cemu/Cemu/nativeinterface/NativeSettings.java b/src/android/app/src/main/java/info/cemu/Cemu/nativeinterface/NativeSettings.java index 511275cf..b70bfa7c 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/nativeinterface/NativeSettings.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/nativeinterface/NativeSettings.java @@ -133,4 +133,21 @@ public class NativeSettings { public static native boolean isNotificationFriendListEnabled(); public static native void setNotificationFriendListEnabled(boolean enabled); + + public static final int CONSOLE_LANGUAGE_JAPANESE = 0; + public static final int CONSOLE_LANGUAGE_ENGLISH = 1; + public static final int CONSOLE_LANGUAGE_FRENCH = 2; + public static final int CONSOLE_LANGUAGE_GERMAN = 3; + public static final int CONSOLE_LANGUAGE_ITALIAN = 4; + public static final int CONSOLE_LANGUAGE_SPANISH = 5; + public static final int CONSOLE_LANGUAGE_CHINESE = 6; + public static final int CONSOLE_LANGUAGE_KOREAN = 7; + public static final int CONSOLE_LANGUAGE_DUTCH = 8; + public static final int CONSOLE_LANGUAGE_PORTUGUESE = 9; + public static final int CONSOLE_LANGUAGE_RUSSIAN = 10; + public static final int CONSOLE_LANGUAGE_TAIWANESE = 11; + + public static native int getConsoleLanguage(); + + public static native void setConsoleLanguage(int consoleLanguage); } diff --git a/src/android/app/src/main/java/info/cemu/Cemu/settings/SettingsFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/SettingsFragment.java index ca8a697c..e4bc9e1f 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/settings/SettingsFragment.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/SettingsFragment.java @@ -16,7 +16,6 @@ import androidx.navigation.fragment.NavHostFragment; import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.LayoutGenericRecyclerViewBinding; import info.cemu.Cemu.features.DocumentsProvider; -import info.cemu.Cemu.guibasecomponents.ButtonRecyclerViewItem; import info.cemu.Cemu.guibasecomponents.GenericRecyclerViewAdapter; import info.cemu.Cemu.guibasecomponents.SimpleButtonRecyclerViewItem; @@ -27,12 +26,13 @@ public class SettingsFragment extends Fragment { GenericRecyclerViewAdapter genericRecyclerViewAdapter = new GenericRecyclerViewAdapter(); genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.open_cemu_folder), this::openCemuFolder)); - genericRecyclerViewAdapter.addRecyclerViewItem(new ButtonRecyclerViewItem(getString(R.string.add_game_path), getString(R.string.games_folder_description), () -> NavHostFragment.findNavController(SettingsFragment.this).navigate(R.id.action_settingsFragment_to_gamePathsFragment))); - genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.input_settings), () -> NavHostFragment.findNavController(SettingsFragment.this).navigate(R.id.action_settingsFragment_to_inputSettingsFragment))); - genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.graphics_settings), () -> NavHostFragment.findNavController(SettingsFragment.this).navigate(R.id.action_settingsFragment_to_graphicSettingsFragment))); - genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.audio_settings), () -> NavHostFragment.findNavController(SettingsFragment.this).navigate(R.id.action_settingsFragment_to_audioSettingsFragment))); - genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.graphic_packs), () -> NavHostFragment.findNavController(SettingsFragment.this).navigate(R.id.action_settingsFragment_to_graphicPacksRootFragment))); - genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.overlay), () -> NavHostFragment.findNavController(SettingsFragment.this).navigate(R.id.action_settingsFragment_to_overlaySettingsFragment))); + var navController = NavHostFragment.findNavController(this); + genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.general_settings), () -> navController.navigate(R.id.action_settingsFragment_to_generalSettingsFragment))); + genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.input_settings), () -> navController.navigate(R.id.action_settingsFragment_to_inputSettingsFragment))); + genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.graphics_settings), () -> navController.navigate(R.id.action_settingsFragment_to_graphicSettingsFragment))); + genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.audio_settings), () -> navController.navigate(R.id.action_settingsFragment_to_audioSettingsFragment))); + genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.graphic_packs), () -> navController.navigate(R.id.action_settingsFragment_to_graphicPacksRootFragment))); + genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.overlay), () -> navController.navigate(R.id.action_settingsFragment_to_overlaySettingsFragment))); binding.recyclerView.setAdapter(genericRecyclerViewAdapter); return binding.getRoot(); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/settings/general/GeneralSettingsFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/general/GeneralSettingsFragment.java new file mode 100644 index 00000000..5115ca3f --- /dev/null +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/general/GeneralSettingsFragment.java @@ -0,0 +1,79 @@ +package info.cemu.Cemu.settings.general; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; +import androidx.fragment.app.Fragment; +import androidx.navigation.fragment.NavHostFragment; + +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import info.cemu.Cemu.R; +import info.cemu.Cemu.databinding.LayoutGenericRecyclerViewBinding; +import info.cemu.Cemu.guibasecomponents.ButtonRecyclerViewItem; +import info.cemu.Cemu.guibasecomponents.GenericRecyclerViewAdapter; +import info.cemu.Cemu.guibasecomponents.SelectionAdapter; +import info.cemu.Cemu.guibasecomponents.SingleSelectionRecyclerViewItem; +import info.cemu.Cemu.nativeinterface.NativeSettings; + +public class GeneralSettingsFragment extends Fragment { + private static @StringRes() int consoleLanguageToResourceNameId(int channels) { + return switch (channels) { + case NativeSettings.CONSOLE_LANGUAGE_JAPANESE -> R.string.console_language_japanese; + case NativeSettings.CONSOLE_LANGUAGE_ENGLISH -> R.string.console_language_english; + case NativeSettings.CONSOLE_LANGUAGE_FRENCH -> R.string.console_language_french; + case NativeSettings.CONSOLE_LANGUAGE_GERMAN -> R.string.console_language_german; + case NativeSettings.CONSOLE_LANGUAGE_ITALIAN -> R.string.console_language_italian; + case NativeSettings.CONSOLE_LANGUAGE_SPANISH -> R.string.console_language_spanish; + case NativeSettings.CONSOLE_LANGUAGE_CHINESE -> R.string.console_language_chinese; + case NativeSettings.CONSOLE_LANGUAGE_KOREAN -> R.string.console_language_korean; + case NativeSettings.CONSOLE_LANGUAGE_DUTCH -> R.string.console_language_dutch; + case NativeSettings.CONSOLE_LANGUAGE_PORTUGUESE -> R.string.console_language_portuguese; + case NativeSettings.CONSOLE_LANGUAGE_RUSSIAN -> R.string.console_language_russian; + case NativeSettings.CONSOLE_LANGUAGE_TAIWANESE -> R.string.console_language_taiwanese; + default -> throw new IllegalArgumentException("Invalid console language: " + channels); + }; + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + var binding = LayoutGenericRecyclerViewBinding.inflate(inflater, container, false); + + GenericRecyclerViewAdapter genericRecyclerViewAdapter = new GenericRecyclerViewAdapter(); + + genericRecyclerViewAdapter.addRecyclerViewItem(new ButtonRecyclerViewItem(getString(R.string.add_game_path), getString(R.string.games_folder_description), () -> NavHostFragment.findNavController(GeneralSettingsFragment.this).navigate(R.id.action_generalSettingsFragment_to_gamePathsFragment))); + + var consoleLanguageChoices = Stream.of(NativeSettings.CONSOLE_LANGUAGE_JAPANESE, + NativeSettings.CONSOLE_LANGUAGE_ENGLISH, + NativeSettings.CONSOLE_LANGUAGE_FRENCH, + NativeSettings.CONSOLE_LANGUAGE_GERMAN, + NativeSettings.CONSOLE_LANGUAGE_ITALIAN, + NativeSettings.CONSOLE_LANGUAGE_SPANISH, + NativeSettings.CONSOLE_LANGUAGE_CHINESE, + NativeSettings.CONSOLE_LANGUAGE_KOREAN, + NativeSettings.CONSOLE_LANGUAGE_DUTCH, + NativeSettings.CONSOLE_LANGUAGE_PORTUGUESE, + NativeSettings.CONSOLE_LANGUAGE_RUSSIAN, + NativeSettings.CONSOLE_LANGUAGE_TAIWANESE) + .map(channels -> new SelectionAdapter.ChoiceItem<>(t -> t.setText(consoleLanguageToResourceNameId(channels)), channels)) + .collect(Collectors.toList()); + int currentConsoleLanguage = NativeSettings.getConsoleLanguage(); + SelectionAdapter consoleLanguageAdapter = new SelectionAdapter<>(consoleLanguageChoices, currentConsoleLanguage); + SingleSelectionRecyclerViewItem consoleLanguageSelection = new SingleSelectionRecyclerViewItem<>(getString(R.string.console_language), + getString(consoleLanguageToResourceNameId(currentConsoleLanguage)), consoleLanguageAdapter, + (consoleLanguage, selectionRecyclerViewItem) -> { + NativeSettings.setConsoleLanguage(consoleLanguage); + selectionRecyclerViewItem.setDescription(getString(consoleLanguageToResourceNameId(consoleLanguage))); + }); + genericRecyclerViewAdapter.addRecyclerViewItem(consoleLanguageSelection); + + binding.recyclerView.setAdapter(genericRecyclerViewAdapter); + + return binding.getRoot(); + } +} \ No newline at end of file diff --git a/src/android/app/src/main/java/info/cemu/Cemu/settings/graphics/GraphicsSettingsFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/graphics/GraphicsSettingsFragment.java index 8ae8c129..194e685b 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/settings/graphics/GraphicsSettingsFragment.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/graphics/GraphicsSettingsFragment.java @@ -38,14 +38,14 @@ public class GraphicsSettingsFragment extends Fragment { }; } - private static int scalingFilterToResourceNameId(int fullscreenScaling) { - return switch (fullscreenScaling) { + private static int scalingFilterToResourceNameId(int scalingFilter) { + return switch (scalingFilter) { case NativeSettings.SCALING_FILTER_BILINEAR_FILTER -> R.string.bilinear; case NativeSettings.SCALING_FILTER_BICUBIC_FILTER -> R.string.bicubic; case NativeSettings.SCALING_FILTER_BICUBIC_HERMITE_FILTER -> R.string.hermite; case NativeSettings.SCALING_FILTER_NEAREST_NEIGHBOR_FILTER -> R.string.nearest_neighbor; default -> - throw new IllegalArgumentException("Invalid fullscreen scaling mode: " + fullscreenScaling); + throw new IllegalArgumentException("Invalid scaling filter: " + scalingFilter); }; } diff --git a/src/android/app/src/main/res/navigation/nav_settings_graph.xml b/src/android/app/src/main/res/navigation/nav_settings_graph.xml index 3be2b5d2..519cacfc 100644 --- a/src/android/app/src/main/res/navigation/nav_settings_graph.xml +++ b/src/android/app/src/main/res/navigation/nav_settings_graph.xml @@ -59,8 +59,8 @@ android:id="@+id/action_settingsFragment_to_overlaySettingsFragment" app:destination="@id/overlaySettingsFragment" /> + android:id="@+id/action_settingsFragment_to_generalSettingsFragment" + app:destination="@id/generalSettingsFragment" /> + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 92d519e4..98ba4a0a 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -224,4 +224,18 @@ Thread quantum Latency Favorite + General settings + Japanese + English + French + German + Italian + Spanish + Chinese + Korean + Dutch + Portuguese + Russian + Taiwanese + Console language \ No newline at end of file