diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index cfc9a7474..dcae891e4 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml @@ -34,7 +34,7 @@ @@ -48,13 +48,13 @@ @@ -72,7 +72,7 @@ diff --git a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.java b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.java index 90d774f6c..5899d62a6 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.java @@ -38,6 +38,8 @@ import java.util.Objects; import static android.Manifest.permission.CAMERA; import static android.Manifest.permission.RECORD_AUDIO; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + /** * Class which contains methods that interact * with the native side of the Citra code. @@ -245,7 +247,7 @@ public final class NativeLibrary { final String title = Objects.requireNonNull(Objects.requireNonNull(getArguments()).getString("title")); final String message = Objects.requireNonNull(Objects.requireNonNull(getArguments()).getString("message")); - return new AlertDialog.Builder(emulationActivity) + return new MaterialAlertDialogBuilder(emulationActivity) .setTitle(title) .setMessage(message) .setPositiveButton(R.string.continue_button, (dialog, which) -> { @@ -345,7 +347,7 @@ public final class NativeLibrary { } else { // Create object used for waiting. final Object lock = new Object(); - AlertDialog.Builder builder = new AlertDialog.Builder(emulationActivity) + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(emulationActivity) .setTitle(caption) .setMessage(text); @@ -427,7 +429,7 @@ public final class NativeLibrary { return alertPromptResult; } - public static AlertDialog.Builder displayAlertPromptImpl(String caption, String text, int buttonConfig) { + public static MaterialAlertDialogBuilder displayAlertPromptImpl(String caption, String text, int buttonConfig) { final EmulationActivity emulationActivity = sEmulationActivity.get(); alertPromptResult = ""; alertPromptButton = 0; @@ -444,7 +446,7 @@ public final class NativeLibrary { FrameLayout container = new FrameLayout(emulationActivity); container.addView(alertPromptEditText); - AlertDialog.Builder builder = new AlertDialog.Builder(emulationActivity) + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(emulationActivity) .setTitle(caption) .setView(container) .setPositiveButton(android.R.string.ok, (dialogInterface, i) -> @@ -506,7 +508,7 @@ public final class NativeLibrary { captionId = R.string.loader_error_encrypted; } - AlertDialog.Builder builder = new AlertDialog.Builder(emulationActivity) + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(emulationActivity) .setTitle(captionId) .setMessage(Html.fromHtml("Please follow the guides to redump your game cartidges or installed titles.", Html.FROM_HTML_MODE_LEGACY)) .setPositiveButton(android.R.string.ok, (dialog, whichButton) -> emulationActivity.finish()) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.java b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.java index b5e547266..28659589e 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.java @@ -18,13 +18,11 @@ import android.view.MotionEvent; import android.view.SubMenu; import android.view.View; import android.widget.CheckBox; -import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.IntDef; import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.PopupMenu; import androidx.core.app.NotificationManagerCompat; @@ -45,6 +43,7 @@ import org.citra.citra_emu.utils.EmulationMenuSettings; import org.citra.citra_emu.utils.FileBrowserHelper; import org.citra.citra_emu.utils.FileUtil; import org.citra.citra_emu.utils.ForegroundService; +import org.citra.citra_emu.utils.ThemeUtil; import java.io.File; import java.io.IOException; @@ -56,6 +55,9 @@ import static android.Manifest.permission.CAMERA; import static android.Manifest.permission.RECORD_AUDIO; import static java.lang.annotation.RetentionPolicy.SOURCE; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import com.google.android.material.slider.Slider; + public final class EmulationActivity extends AppCompatActivity { public static final String EXTRA_SELECTED_GAME = "SelectedGame"; public static final String EXTRA_SELECTED_TITLE = "SelectedTitle"; @@ -151,6 +153,8 @@ public final class EmulationActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { + ThemeUtil.applyTheme(this); + super.onCreate(savedInstanceState); if (savedInstanceState == null) { @@ -179,8 +183,6 @@ public final class EmulationActivity extends AppCompatActivity { // Set these options now so that the SurfaceView the game renders into is the right size. enableFullscreenImmersive(); - setTheme(R.style.CitraEmulationBase); - setContentView(R.layout.activity_emulation); // Find or create the EmulationFragment @@ -243,7 +245,7 @@ public final class EmulationActivity extends AppCompatActivity { case NativeLibrary.REQUEST_CODE_NATIVE_CAMERA: if (grantResults[0] != PackageManager.PERMISSION_GRANTED && shouldShowRequestPermissionRationale(CAMERA)) { - new AlertDialog.Builder(this) + new MaterialAlertDialogBuilder(this) .setTitle(R.string.camera) .setMessage(R.string.camera_permission_needed) .setPositiveButton(android.R.string.ok, null) @@ -254,7 +256,7 @@ public final class EmulationActivity extends AppCompatActivity { case NativeLibrary.REQUEST_CODE_NATIVE_MIC: if (grantResults[0] != PackageManager.PERMISSION_GRANTED && shouldShowRequestPermissionRationale(RECORD_AUDIO)) { - new AlertDialog.Builder(this) + new MaterialAlertDialogBuilder(this) .setTitle(R.string.microphone) .setMessage(R.string.microphone_permission_needed) .setPositiveButton(android.R.string.ok, null) @@ -324,7 +326,7 @@ public final class EmulationActivity extends AppCompatActivity { View view = inflater.inflate(R.layout.dialog_checkbox, null); CheckBox checkBox = view.findViewById(R.id.checkBox); - new AlertDialog.Builder(this) + new MaterialAlertDialogBuilder(this) .setTitle(R.string.savestate_warning_title) .setMessage(R.string.savestate_warning_message) .setView(view) @@ -464,8 +466,8 @@ public final class EmulationActivity extends AppCompatActivity { case MENU_ACTION_LOAD_AMIIBO: FileBrowserHelper.openFilePicker(this, REQUEST_SELECT_AMIIBO, - R.string.select_amiibo, - Collections.singletonList("bin"), false); + R.string.select_amiibo, + Collections.singletonList("bin"), false); break; case MENU_ACTION_REMOVE_AMIIBO: @@ -490,7 +492,7 @@ public final class EmulationActivity extends AppCompatActivity { case MENU_ACTION_CLOSE_GAME: NativeLibrary.PauseEmulation(); - new AlertDialog.Builder(this) + new MaterialAlertDialogBuilder(this) .setTitle(R.string.emulation_close_game) .setMessage(R.string.emulation_close_game_message) .setPositiveButton(android.R.string.yes, (dialogInterface, i) -> @@ -498,11 +500,8 @@ public final class EmulationActivity extends AppCompatActivity { mEmulationFragment.stopEmulation(); finish(); }) - .setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> - NativeLibrary.UnPauseEmulation()) - .setOnCancelListener(dialogInterface -> - NativeLibrary.UnPauseEmulation()) - .create() + .setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> NativeLibrary.UnPauseEmulation()) + .setOnCancelListener(dialogInterface -> NativeLibrary.UnPauseEmulation()) .show(); break; } @@ -589,11 +588,10 @@ public final class EmulationActivity extends AppCompatActivity { } if (!success) { - new AlertDialog.Builder(this) + new MaterialAlertDialogBuilder(this) .setTitle(R.string.amiibo_load_error) .setMessage(R.string.amiibo_load_error_message) .setPositiveButton(android.R.string.ok, null) - .create() .show(); } } @@ -605,8 +603,6 @@ public final class EmulationActivity extends AppCompatActivity { private void toggleControls() { final SharedPreferences.Editor editor = mPreferences.edit(); boolean[] enabledButtons = new boolean[14]; - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.emulation_toggle_controls); for (int i = 0; i < enabledButtons.length; i++) { // Buttons that are disabled by default @@ -621,63 +617,47 @@ public final class EmulationActivity extends AppCompatActivity { enabledButtons[i] = mPreferences.getBoolean("buttonToggle" + i, defaultValue); } - builder.setMultiChoiceItems(R.array.n3dsButtons, enabledButtons, - (dialog, indexSelected, isChecked) -> editor - .putBoolean("buttonToggle" + indexSelected, isChecked)); - builder.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> - { - editor.apply(); - mEmulationFragment.refreshInputOverlay(); - }); - - AlertDialog alertDialog = builder.create(); - alertDialog.show(); + new MaterialAlertDialogBuilder(this) + .setTitle(R.string.emulation_toggle_controls) + .setMultiChoiceItems(R.array.n3dsButtons, enabledButtons, + (dialog, indexSelected, isChecked) -> editor + .putBoolean("buttonToggle" + indexSelected, isChecked)) + .setPositiveButton(android.R.string.ok, (dialogInterface, i) -> + { + editor.apply(); + mEmulationFragment.refreshInputOverlay(); + }) + .show(); } private void adjustScale() { LayoutInflater inflater = LayoutInflater.from(this); - View view = inflater.inflate(R.layout.dialog_seekbar, null); + View view = inflater.inflate(R.layout.dialog_slider, null); - final SeekBar seekbar = view.findViewById(R.id.seekbar); - final TextView value = view.findViewById(R.id.text_value); + final Slider slider = view.findViewById(R.id.slider); + final TextView textValue = view.findViewById(R.id.text_value); final TextView units = view.findViewById(R.id.text_units); - seekbar.setMax(150); - seekbar.setProgress(mPreferences.getInt("controlScale", 50)); - seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - public void onStartTrackingTouch(SeekBar seekBar) { - } - - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - value.setText(String.valueOf(progress + 50)); - } - - public void onStopTrackingTouch(SeekBar seekBar) { - setControlScale(seekbar.getProgress()); - } + slider.setValueTo(150); + slider.setValue(mPreferences.getInt("controlScale", 50)); + slider.addOnChangeListener((slider1, progress, fromUser) -> { + textValue.setText(String.valueOf((int) progress + 50)); + setControlScale((int) slider1.getValue()); }); - value.setText(String.valueOf(seekbar.getProgress() + 50)); + textValue.setText(String.valueOf((int) slider.getValue() + 50)); units.setText("%"); - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.emulation_control_scale); - builder.setView(view); - final int previousProgress = seekbar.getProgress(); - builder.setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> { - setControlScale(previousProgress); - }); - builder.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> - { - setControlScale(seekbar.getProgress()); - }); - builder.setNeutralButton(R.string.slider_default, (dialogInterface, i) -> { - setControlScale(50); - }); + final int previousProgress = (int) slider.getValue(); - AlertDialog alertDialog = builder.create(); - alertDialog.show(); + new MaterialAlertDialogBuilder(this) + .setTitle(R.string.emulation_control_scale) + .setView(view) + .setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> setControlScale(previousProgress)) + .setPositiveButton(android.R.string.ok, (dialogInterface, i) -> setControlScale((int) slider.getValue())) + .setNeutralButton(R.string.slider_default, (dialogInterface, i) -> setControlScale(50)) + .show(); } private void setControlScale(int scale) { @@ -688,12 +668,10 @@ public final class EmulationActivity extends AppCompatActivity { } private void resetOverlay() { - new AlertDialog.Builder(this) + new MaterialAlertDialogBuilder(this) .setTitle(getString(R.string.emulation_touch_overlay_reset)) .setPositiveButton(android.R.string.yes, (dialogInterface, i) -> mEmulationFragment.resetInputOverlay()) - .setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> { - }) - .create() + .setNegativeButton(android.R.string.cancel, null) .show(); } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/adapters/GameAdapter.java b/src/android/app/src/main/java/org/citra/citra_emu/adapters/GameAdapter.java index bc791638a..ca66c3b9b 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/adapters/GameAdapter.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/adapters/GameAdapter.java @@ -2,8 +2,6 @@ package org.citra.citra_emu.adapters; import android.database.Cursor; import android.database.DataSetObserver; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; import android.os.Build; import android.os.SystemClock; import android.view.LayoutInflater; @@ -12,14 +10,14 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; -import androidx.core.content.ContextCompat; import androidx.fragment.app.FragmentActivity; import androidx.recyclerview.widget.RecyclerView; +import com.google.android.material.color.MaterialColors; + import org.citra.citra_emu.R; import org.citra.citra_emu.activities.EmulationActivity; import org.citra.citra_emu.model.GameDatabase; -import org.citra.citra_emu.ui.DividerItemDecoration; import org.citra.citra_emu.utils.Log; import org.citra.citra_emu.utils.PicassoUtils; import org.citra.citra_emu.viewholders.GameViewHolder; @@ -99,9 +97,9 @@ public final class GameAdapter extends RecyclerView.Adapter impl holder.regions = mCursor.getString(GameDatabase.GAME_COLUMN_REGIONS); holder.company = mCursor.getString(GameDatabase.GAME_COLUMN_COMPANY); - final int backgroundColorId = isValidGame(holder.path) ? R.color.card_view_background : R.color.card_view_disabled; + final int backgroundColorId = isValidGame(holder.path) ? R.attr.colorSurface : R.attr.colorErrorContainer; View itemView = holder.getItemView(); - itemView.setBackgroundColor(ContextCompat.getColor(itemView.getContext(), backgroundColorId)); + itemView.setBackgroundColor(MaterialColors.getColor(itemView, backgroundColorId)); } else { Log.error("[GameAdapter] Can't bind view; Cursor is not valid."); } @@ -204,24 +202,6 @@ public final class GameAdapter extends RecyclerView.Adapter impl EmulationActivity.launch((FragmentActivity) view.getContext(), holder.path, holder.title); } - public static class SpacesItemDecoration extends DividerItemDecoration { - private int space; - - public SpacesItemDecoration(Drawable divider, int space) { - super(divider); - this.space = space; - } - - @Override - public void getItemOffsets(Rect outRect, @NonNull View view, @NonNull RecyclerView parent, - @NonNull RecyclerView.State state) { - outRect.left = 0; - outRect.right = 0; - outRect.bottom = space; - outRect.top = 0; - } - } - private boolean isValidGame(String path) { return Stream.of( ".rar", ".zip", ".7z", ".torrent", ".tar", ".gz").noneMatch(suffix -> path.toLowerCase().endsWith(suffix)); diff --git a/src/android/app/src/main/java/org/citra/citra_emu/applets/MiiSelector.java b/src/android/app/src/main/java/org/citra/citra_emu/applets/MiiSelector.java index 85b55b00d..d6fce6a30 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/applets/MiiSelector.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/applets/MiiSelector.java @@ -22,6 +22,8 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + public final class MiiSelector { public static class MiiSelectorConfig implements java.io.Serializable { public boolean enable_cancel_button; @@ -69,8 +71,8 @@ public final class MiiSelector { ? (int) config.initially_selected_mii_index : 0; data.index = initialIndex; - AlertDialog.Builder builder = - new AlertDialog.Builder(emulationActivity) + MaterialAlertDialogBuilder builder = + new MaterialAlertDialogBuilder(emulationActivity) .setTitle(config.title.isEmpty() ? emulationActivity.getString(R.string.mii_selector) : config.title) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/applets/SoftwareKeyboard.java b/src/android/app/src/main/java/org/citra/citra_emu/applets/SoftwareKeyboard.java index 7be5f6d97..800ecaf86 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/applets/SoftwareKeyboard.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/applets/SoftwareKeyboard.java @@ -19,6 +19,8 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + import org.citra.citra_emu.CitraApplication; import org.citra.citra_emu.NativeLibrary; import org.citra.citra_emu.R; @@ -124,7 +126,7 @@ public final class SoftwareKeyboard { FrameLayout container = new FrameLayout(emulationActivity); container.addView(editText); - AlertDialog.Builder builder = new AlertDialog.Builder(emulationActivity) + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(emulationActivity) .setTitle(R.string.software_keyboard) .setView(container); setCancelable(false); @@ -227,7 +229,7 @@ public final class SoftwareKeyboard { break; } - new AlertDialog.Builder(emulationActivity) + new MaterialAlertDialogBuilder(emulationActivity) .setTitle(R.string.software_keyboard) .setMessage(message) .setPositiveButton(android.R.string.ok, null) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress.java b/src/android/app/src/main/java/org/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress.java index e71c2cfc1..1e3111739 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress.java @@ -8,7 +8,6 @@ import android.app.Activity; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; -import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.widget.ProgressBar; @@ -18,6 +17,8 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + import org.citra.citra_emu.NativeLibrary; import org.citra.citra_emu.R; import org.citra.citra_emu.activities.EmulationActivity; @@ -70,22 +71,15 @@ public class DiskShaderCacheProgress { setCancelable(false); setRetainInstance(true); - AlertDialog.Builder builder = new AlertDialog.Builder(emulationActivity); - builder.setTitle(title); - builder.setMessage(message); - builder.setView(view); - builder.setNegativeButton(android.R.string.cancel, null); - - dialog = builder.create(); - dialog.create(); - - dialog.getButton(DialogInterface.BUTTON_NEGATIVE).setOnClickListener((v) -> emulationActivity.onBackPressed()); - synchronized (finishLock) { finishLock.notifyAll(); } - return dialog; + return new MaterialAlertDialogBuilder(emulationActivity) + .setTitle(title) + .setMessage(message) + .setNegativeButton(android.R.string.cancel, (dialog, which) -> emulationActivity.onBackPressed()) + .create(); } private void onUpdateProgress(String msg, int progress, int max) { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/cheats/ui/CheatDetailsFragment.java b/src/android/app/src/main/java/org/citra/citra_emu/features/cheats/ui/CheatDetailsFragment.java index 762cdb80e..f4833c0c5 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/cheats/ui/CheatDetailsFragment.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/cheats/ui/CheatDetailsFragment.java @@ -15,6 +15,8 @@ import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + import org.citra.citra_emu.R; import org.citra.citra_emu.features.cheats.model.Cheat; import org.citra.citra_emu.features.cheats.model.CheatsViewModel; @@ -80,12 +82,12 @@ public class CheatDetailsFragment extends Fragment { private void onDeleteClicked(View view) { String name = mEditName.getText().toString(); - AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); - builder.setMessage(getString(R.string.cheats_delete_confirmation, name)); - builder.setPositiveButton(android.R.string.yes, - (dialog, i) -> mViewModel.deleteSelectedCheat()); - builder.setNegativeButton(android.R.string.no, null); - builder.show(); + new MaterialAlertDialogBuilder(requireContext()) + .setMessage(getString(R.string.cheats_delete_confirmation, name)) + .setPositiveButton(android.R.string.yes, + (dialog, i) -> mViewModel.deleteSelectedCheat()) + .setNegativeButton(android.R.string.no, null) + .show(); } private void onEditClicked(View view) { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/cheats/ui/CheatsActivity.java b/src/android/app/src/main/java/org/citra/citra_emu/features/cheats/ui/CheatsActivity.java index a36bf427c..a6ab89429 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/cheats/ui/CheatsActivity.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/cheats/ui/CheatsActivity.java @@ -14,10 +14,13 @@ import androidx.core.view.ViewCompat; import androidx.lifecycle.ViewModelProvider; import androidx.slidingpanelayout.widget.SlidingPaneLayout; +import com.google.android.material.appbar.MaterialToolbar; + import org.citra.citra_emu.R; import org.citra.citra_emu.features.cheats.model.Cheat; import org.citra.citra_emu.features.cheats.model.CheatsViewModel; import org.citra.citra_emu.ui.TwoPaneOnBackPressedCallback; +import org.citra.citra_emu.utils.ThemeUtil; public class CheatsActivity extends AppCompatActivity implements SlidingPaneLayout.PanelSlideListener { @@ -37,6 +40,8 @@ public class CheatsActivity extends AppCompatActivity @Override protected void onCreate(Bundle savedInstanceState) { + ThemeUtil.applyTheme(this); + super.onCreate(savedInstanceState); mViewModel = new ViewModelProvider(this).get(CheatsViewModel.class); @@ -63,6 +68,8 @@ public class CheatsActivity extends AppCompatActivity mViewModel.getOpenDetailsViewEvent().observe(this, this::openDetailsView); // Show "Up" button in the action bar for navigation + MaterialToolbar toolbar = findViewById(R.id.toolbar_cheats); + setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.java index 91adf7dae..cfbcf5099 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.java @@ -15,11 +15,14 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentTransaction; import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import com.google.android.material.appbar.MaterialToolbar; + import org.citra.citra_emu.NativeLibrary; import org.citra.citra_emu.R; import org.citra.citra_emu.utils.DirectoryInitialization; import org.citra.citra_emu.utils.DirectoryStateReceiver; import org.citra.citra_emu.utils.EmulationMenuSettings; +import org.citra.citra_emu.utils.ThemeUtil; public final class SettingsActivity extends AppCompatActivity implements SettingsActivityView { private static final String ARG_MENU_TAG = "menu_tag"; @@ -38,6 +41,8 @@ public final class SettingsActivity extends AppCompatActivity implements Setting @Override protected void onCreate(Bundle savedInstanceState) { + ThemeUtil.applyTheme(this); + super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); @@ -49,6 +54,8 @@ public final class SettingsActivity extends AppCompatActivity implements Setting mPresenter.onCreate(savedInstanceState, menuTag, gameID); // Show "Back" button in the action bar for navigation + MaterialToolbar toolbar = findViewById(R.id.toolbar_settings); + setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } 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 0d63873bb..e288bf934 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 @@ -4,6 +4,8 @@ import android.content.IntentFilter; import android.os.Bundle; import android.text.TextUtils; +import androidx.appcompat.app.AppCompatActivity; + import org.citra.citra_emu.NativeLibrary; import org.citra.citra_emu.features.settings.model.Settings; import org.citra.citra_emu.features.settings.utils.SettingsFile; @@ -109,8 +111,6 @@ public final class SettingsActivityPresenter { mSettings.saveSettings(mView); } - ThemeUtil.applyTheme(); - NativeLibrary.ReloadSettings(); } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.java index bfd7c71a9..59c37394e 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.java +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.java @@ -6,13 +6,16 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.DatePicker; -import android.widget.SeekBar; import android.widget.TextView; import android.widget.TimePicker; +import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.RecyclerView; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import com.google.android.material.slider.Slider; + import org.citra.citra_emu.R; import org.citra.citra_emu.dialogs.MotionAlertDialog; import org.citra.citra_emu.features.settings.model.FloatSetting; @@ -41,15 +44,14 @@ import org.citra.citra_emu.utils.Log; import java.util.ArrayList; -public final class SettingsAdapter extends RecyclerView.Adapter - implements DialogInterface.OnClickListener, SeekBar.OnSeekBarChangeListener { +public final class SettingsAdapter extends RecyclerView.Adapter implements DialogInterface.OnClickListener, Slider.OnChangeListener { private SettingsFragmentView mView; private Context mContext; private ArrayList mSettings; private SettingsItem mClickedItem; private int mClickedPosition; - private int mSeekbarProgress; + private int mSliderProgress; private AlertDialog mDialog; private TextView mTextSliderValue; @@ -149,11 +151,9 @@ public final class SettingsAdapter extends RecyclerView.Adapter { - seekbar.setProgress(item.getDefaultValue()); - onClick(dialog, which); - }); + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(mView.getActivity()) + .setTitle(item.getNameId()) + .setView(view) + .setPositiveButton(android.R.string.ok, this) + .setNegativeButton(android.R.string.cancel, defaultCancelListener) + .setNeutralButton(R.string.slider_default, (DialogInterface dialog, int which) -> { + slider.setValue(item.getDefaultValue()); + onClick(dialog, which); + }); mDialog = builder.show(); mTextSliderValue = view.findViewById(R.id.text_value); - mTextSliderValue.setText(String.valueOf(mSeekbarProgress)); + mTextSliderValue.setText(String.valueOf(mSliderProgress)); TextView units = view.findViewById(R.id.text_units); units.setText(item.getUnits()); - seekbar.setMin(item.getMin()); - seekbar.setMax(item.getMax()); - seekbar.setProgress(mSeekbarProgress); + slider.setValueFrom(item.getMin()); + slider.setValueTo(item.getMax()); + slider.setValue(mSliderProgress); - seekbar.setOnSeekBarChangeListener(this); + slider.addOnChangeListener(this); } public void onSubmenuClick(SubmenuSetting item) { @@ -375,19 +370,19 @@ public final class SettingsAdapter extends RecyclerView.Adapter - + diff --git a/src/android/app/src/main/res/drawable/ic_add.xml b/src/android/app/src/main/res/drawable/ic_add.xml index bdd99f48d..64360e8d9 100644 --- a/src/android/app/src/main/res/drawable/ic_add.xml +++ b/src/android/app/src/main/res/drawable/ic_add.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/src/android/app/src/main/res/drawable/ic_back.xml b/src/android/app/src/main/res/drawable/ic_back.xml new file mode 100644 index 000000000..f99fea719 --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_back.xml @@ -0,0 +1,10 @@ + + + diff --git a/src/android/app/src/main/res/drawable/ic_folder.xml b/src/android/app/src/main/res/drawable/ic_folder.xml new file mode 100644 index 000000000..17d6c7927 --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_folder.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/android/app/src/main/res/drawable/ic_heart.xml b/src/android/app/src/main/res/drawable/ic_heart.xml new file mode 100644 index 000000000..6845a40e7 --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_heart.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/android/app/src/main/res/drawable/ic_install.xml b/src/android/app/src/main/res/drawable/ic_install.xml new file mode 100644 index 000000000..fe58acf84 --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_install.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/android/app/src/main/res/drawable/ic_settings.xml b/src/android/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 000000000..12ce6e231 --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/android/app/src/main/res/drawable/popup_background.xml b/src/android/app/src/main/res/drawable/popup_background.xml new file mode 100644 index 000000000..057f81c83 --- /dev/null +++ b/src/android/app/src/main/res/drawable/popup_background.xml @@ -0,0 +1,4 @@ + + + + diff --git a/src/android/app/src/main/res/layout-ldrtl/list_item_cheat.xml b/src/android/app/src/main/res/layout-ldrtl/list_item_cheat.xml index 9bcf883e1..ec9942cc5 100644 --- a/src/android/app/src/main/res/layout-ldrtl/list_item_cheat.xml +++ b/src/android/app/src/main/res/layout-ldrtl/list_item_cheat.xml @@ -13,7 +13,6 @@ android:id="@+id/text_name" android:layout_width="0dp" android:layout_height="wrap_content" - android:textColor="@color/header_text" android:textSize="16sp" android:layout_margin="@dimen/spacing_large" style="@style/TextAppearance.AppCompat.Headline" diff --git a/src/android/app/src/main/res/layout/activity_cheats.xml b/src/android/app/src/main/res/layout/activity_cheats.xml index b9414ab6d..0b6204b6d 100644 --- a/src/android/app/src/main/res/layout/activity_cheats.xml +++ b/src/android/app/src/main/res/layout/activity_cheats.xml @@ -1,22 +1,58 @@ - - + - + - + + + + + + + + + + + + + + + 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 cea0922a7..1f737c321 100644 --- a/src/android/app/src/main/res/layout/activity_main.xml +++ b/src/android/app/src/main/res/layout/activity_main.xml @@ -1,27 +1,30 @@ - + + + + + + - - - - - - diff --git a/src/android/app/src/main/res/layout/activity_settings.xml b/src/android/app/src/main/res/layout/activity_settings.xml index 11b91c45f..9da84faea 100644 --- a/src/android/app/src/main/res/layout/activity_settings.xml +++ b/src/android/app/src/main/res/layout/activity_settings.xml @@ -1,5 +1,27 @@ - - + android:layout_height="match_parent"> + + + + + + + + + + diff --git a/src/android/app/src/main/res/layout/card_game.xml b/src/android/app/src/main/res/layout/card_game.xml index 6e87490f9..84ca54abb 100644 --- a/src/android/app/src/main/res/layout/card_game.xml +++ b/src/android/app/src/main/res/layout/card_game.xml @@ -36,15 +36,13 @@ android:layout_marginStart="8dp" android:baselineAligned="false" android:ellipsize="end" - android:gravity="center_vertical" android:lines="1" android:maxLines="1" android:textAlignment="viewStart" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/image_game_screen" app:layout_constraintTop_toTopOf="parent" - tools:text="The Legend of Zelda\nOcarina of Time 3D" - android:textColor="@color/header_text" /> + tools:text="The Legend of Zelda\nOcarina of Time 3D" /> + tools:text="Nintendo" /> + tools:text="Pilotwings_Resort.cxi" /> - diff --git a/src/android/app/src/main/res/layout/dialog_seekbar.xml b/src/android/app/src/main/res/layout/dialog_slider.xml similarity index 93% rename from src/android/app/src/main/res/layout/dialog_seekbar.xml rename to src/android/app/src/main/res/layout/dialog_slider.xml index 35abecfcb..59719e013 100644 --- a/src/android/app/src/main/res/layout/dialog_seekbar.xml +++ b/src/android/app/src/main/res/layout/dialog_slider.xml @@ -5,8 +5,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - - \ No newline at end of file + diff --git a/src/android/app/src/main/res/layout/fragment_emulation.xml b/src/android/app/src/main/res/layout/fragment_emulation.xml index d6e47e1e4..bd64d5d16 100644 --- a/src/android/app/src/main/res/layout/fragment_emulation.xml +++ b/src/android/app/src/main/res/layout/fragment_emulation.xml @@ -40,7 +40,6 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:padding="@dimen/spacing_small" - android:background="@color/citra_orange" android:text="@string/emulation_done" android:visibility="gone" /> diff --git a/src/android/app/src/main/res/layout/fragment_grid.xml b/src/android/app/src/main/res/layout/fragment_grid.xml index f5b6c2e19..5978bf998 100644 --- a/src/android/app/src/main/res/layout/fragment_grid.xml +++ b/src/android/app/src/main/res/layout/fragment_grid.xml @@ -17,17 +17,19 @@ android:id="@+id/gamelist_empty_text" android:layout_width="match_parent" android:layout_height="match_parent" + android:gravity="center" android:text="@string/empty_gamelist" - android:visibility="gone" android:textSize="18sp" - android:gravity="center" /> + android:visibility="gone" /> + - \ No newline at end of file + + 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 4c5d597c1..f8724552c 100644 --- a/src/android/app/src/main/res/layout/fragment_settings.xml +++ b/src/android/app/src/main/res/layout/fragment_settings.xml @@ -1,12 +1,13 @@ - + android:layout_height="match_parent" + android:background="?attr/colorSurface"> + android:layout_height="match_parent" /> - \ No newline at end of file + diff --git a/src/android/app/src/main/res/layout/list_item_cheat.xml b/src/android/app/src/main/res/layout/list_item_cheat.xml index c0b5f982f..d31ae63f9 100644 --- a/src/android/app/src/main/res/layout/list_item_cheat.xml +++ b/src/android/app/src/main/res/layout/list_item_cheat.xml @@ -13,7 +13,6 @@ android:id="@+id/text_name" android:layout_width="0dp" android:layout_height="wrap_content" - android:textColor="@color/header_text" android:textSize="16sp" android:layout_margin="@dimen/spacing_large" style="@style/TextAppearance.AppCompat.Headline" diff --git a/src/android/app/src/main/res/layout/list_item_setting.xml b/src/android/app/src/main/res/layout/list_item_setting.xml index df83684f7..a2a07b381 100644 --- a/src/android/app/src/main/res/layout/list_item_setting.xml +++ b/src/android/app/src/main/res/layout/list_item_setting.xml @@ -21,7 +21,6 @@ android:layout_alignParentEnd="true" android:layout_marginStart="@dimen/spacing_large" android:layout_marginEnd="@dimen/spacing_large" - android:textColor="@color/header_text" android:textSize="16sp" tools:text="Setting Name" /> @@ -37,7 +36,6 @@ android:layout_marginTop="@dimen/spacing_small" android:layout_marginEnd="@dimen/spacing_large" android:visibility="visible" - tools:text="@string/app_disclaimer" - android:textColor="@color/header_subtext" /> + tools:text="@string/app_disclaimer" /> \ No newline at end of file diff --git a/src/android/app/src/main/res/layout/list_item_setting_checkbox.xml b/src/android/app/src/main/res/layout/list_item_setting_checkbox.xml index 86ba83f11..332b2e08f 100644 --- a/src/android/app/src/main/res/layout/list_item_setting_checkbox.xml +++ b/src/android/app/src/main/res/layout/list_item_setting_checkbox.xml @@ -19,7 +19,6 @@ android:layout_marginStart="@dimen/spacing_large" android:layout_marginTop="@dimen/spacing_large" android:layout_toStartOf="@+id/checkbox" - android:textColor="@color/header_text" android:textSize="16sp" tools:text="@string/frame_limit_enable" /> @@ -36,7 +35,6 @@ android:layout_marginTop="@dimen/spacing_small" android:layout_toStartOf="@+id/checkbox" android:textAlignment="textStart" - android:textColor="@color/header_subtext" tools:text="@string/frame_limit_enable_description" /> - \ No newline at end of file + diff --git a/src/android/app/src/main/res/layout/premium_item_setting.xml b/src/android/app/src/main/res/layout/premium_item_setting.xml index 17d5a13b2..1a606a458 100644 --- a/src/android/app/src/main/res/layout/premium_item_setting.xml +++ b/src/android/app/src/main/res/layout/premium_item_setting.xml @@ -21,7 +21,7 @@ android:layout_alignParentEnd="true" android:layout_marginStart="@dimen/spacing_large" android:layout_marginEnd="@dimen/spacing_large" - android:textColor="?android:colorAccent" + android:textColor="?attr/colorPrimary" android:textStyle="bold" tools:text="Setting Name" /> @@ -37,7 +37,6 @@ android:layout_marginTop="@dimen/spacing_small" android:layout_marginEnd="@dimen/spacing_large" android:visibility="visible" - tools:text="@string/app_disclaimer" - android:textColor="@color/header_subtext" /> + tools:text="@string/app_disclaimer" /> \ No newline at end of file diff --git a/src/android/app/src/main/res/menu/menu_game_grid.xml b/src/android/app/src/main/res/menu/menu_game_grid.xml index 9cdcc7f08..1a4bee6df 100644 --- a/src/android/app/src/main/res/menu/menu_game_grid.xml +++ b/src/android/app/src/main/res/menu/menu_game_grid.xml @@ -4,7 +4,7 @@ diff --git a/src/android/app/src/main/res/values-night/citra_colors.xml b/src/android/app/src/main/res/values-night/citra_colors.xml new file mode 100644 index 000000000..54e6a913a --- /dev/null +++ b/src/android/app/src/main/res/values-night/citra_colors.xml @@ -0,0 +1,33 @@ + + + + #F8BE00 + #3F2E00 + #451C00 + #FFDF9A + #D7C4A0 + #3A2F15 + #52452A + #F4E0BB + #FFB2BC + #5F1126 + #7D293B + #FFD9DD + #FFB4AB + #93000A + #690005 + #FFDAD6 + #1E1B16 + #E9E1D9 + #1E1B16 + #E9E1D9 + #4D4639 + #D0C5B4 + #999080 + #1E1B16 + #E9E1D9 + #785A00 + #F8BE00 + #4D4639 + + diff --git a/src/android/app/src/main/res/values-night/colors.xml b/src/android/app/src/main/res/values-night/colors.xml deleted file mode 100644 index 43b948021..000000000 --- a/src/android/app/src/main/res/values-night/colors.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - #272727 - #121212 - #FEC303 - - #121212 - #3D3D3D - - #404040 - - #E0E0E0 - #A0A0A0 - - @color/citra_accent - diff --git a/src/android/app/src/main/res/values/citra_colors.xml b/src/android/app/src/main/res/values/citra_colors.xml new file mode 100644 index 000000000..f0cfd3780 --- /dev/null +++ b/src/android/app/src/main/res/values/citra_colors.xml @@ -0,0 +1,35 @@ + + + + #FFAB03 + #FFFFFF + #FFDF9A + #251A00 + #6B5D3F + #FFFFFF + #F4E0BB + #241A04 + #9B4052 + #FFFFFF + #FFD9DD + #400013 + #BA1A1A + #FFDAD6 + #FFFFFF + #410002 + #FFFBFF + #1E1B16 + #FFFBFF + #1E1B16 + #EDE1CF + #4D4639 + #7F7667 + #F7F0E7 + #33302A + #F8BE00 + #000000 + #783E00 + #D0C5B4 + #000000 + + diff --git a/src/android/app/src/main/res/values/colors.xml b/src/android/app/src/main/res/values/colors.xml deleted file mode 100644 index 6668288a7..000000000 --- a/src/android/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - #FFC303 - #FF8D03 - #CC7102 - - #ffffff - #D5D5D5 - - #ffffff - - #1C1424 - #5C5661 - - @color/header_text - diff --git a/src/android/app/src/main/res/values/styles.xml b/src/android/app/src/main/res/values/styles.xml index 47fe6f6ea..b1d36498e 100644 --- a/src/android/app/src/main/res/values/styles.xml +++ b/src/android/app/src/main/res/values/styles.xml @@ -1,65 +1,37 @@ - - - - - - - - - - - - + + + + + + + + + + diff --git a/src/android/app/src/main/res/values/themes.xml b/src/android/app/src/main/res/values/themes.xml new file mode 100644 index 000000000..edff173fe --- /dev/null +++ b/src/android/app/src/main/res/values/themes.xml @@ -0,0 +1,55 @@ + + + + + + + + +