citra_android: Start material 3 migration (#6335)
|
@ -34,7 +34,7 @@
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.citra.citra_emu.ui.main.MainActivity"
|
android:name="org.citra.citra_emu.ui.main.MainActivity"
|
||||||
android:theme="@style/CitraBase"
|
android:theme="@style/Theme.Citra.Main"
|
||||||
android:resizeableActivity="false">
|
android:resizeableActivity="false">
|
||||||
|
|
||||||
<!-- This intentfilter marks this Activity as the one that gets launched from Home screen. -->
|
<!-- This intentfilter marks this Activity as the one that gets launched from Home screen. -->
|
||||||
|
@ -48,13 +48,13 @@
|
||||||
<activity
|
<activity
|
||||||
android:name="org.citra.citra_emu.features.settings.ui.SettingsActivity"
|
android:name="org.citra.citra_emu.features.settings.ui.SettingsActivity"
|
||||||
android:configChanges="orientation|screenSize|uiMode"
|
android:configChanges="orientation|screenSize|uiMode"
|
||||||
android:theme="@style/CitraSettingsBase"
|
android:theme="@style/Theme.Citra.Main"
|
||||||
android:label="@string/preferences_settings"/>
|
android:label="@string/preferences_settings"/>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.citra.citra_emu.activities.EmulationActivity"
|
android:name="org.citra.citra_emu.activities.EmulationActivity"
|
||||||
android:resizeableActivity="false"
|
android:resizeableActivity="false"
|
||||||
android:theme="@style/CitraEmulationBase"
|
android:theme="@style/Theme.Citra.Main"
|
||||||
android:launchMode="singleTop"/>
|
android:launchMode="singleTop"/>
|
||||||
|
|
||||||
<service android:name="org.citra.citra_emu.utils.ForegroundService"/>
|
<service android:name="org.citra.citra_emu.utils.ForegroundService"/>
|
||||||
|
@ -72,7 +72,7 @@
|
||||||
<activity
|
<activity
|
||||||
android:name="org.citra.citra_emu.features.cheats.ui.CheatsActivity"
|
android:name="org.citra.citra_emu.features.cheats.ui.CheatsActivity"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:theme="@style/CitraSettingsBase"
|
android:theme="@style/Theme.Citra.Main"
|
||||||
android:label="@string/cheats"/>
|
android:label="@string/cheats"/>
|
||||||
|
|
||||||
<service android:name="org.citra.citra_emu.utils.DirectoryInitialization"/>
|
<service android:name="org.citra.citra_emu.utils.DirectoryInitialization"/>
|
||||||
|
|
|
@ -38,6 +38,8 @@ import java.util.Objects;
|
||||||
import static android.Manifest.permission.CAMERA;
|
import static android.Manifest.permission.CAMERA;
|
||||||
import static android.Manifest.permission.RECORD_AUDIO;
|
import static android.Manifest.permission.RECORD_AUDIO;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class which contains methods that interact
|
* Class which contains methods that interact
|
||||||
* with the native side of the Citra code.
|
* 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 title = Objects.requireNonNull(Objects.requireNonNull(getArguments()).getString("title"));
|
||||||
final String message = Objects.requireNonNull(Objects.requireNonNull(getArguments()).getString("message"));
|
final String message = Objects.requireNonNull(Objects.requireNonNull(getArguments()).getString("message"));
|
||||||
|
|
||||||
return new AlertDialog.Builder(emulationActivity)
|
return new MaterialAlertDialogBuilder(emulationActivity)
|
||||||
.setTitle(title)
|
.setTitle(title)
|
||||||
.setMessage(message)
|
.setMessage(message)
|
||||||
.setPositiveButton(R.string.continue_button, (dialog, which) -> {
|
.setPositiveButton(R.string.continue_button, (dialog, which) -> {
|
||||||
|
@ -345,7 +347,7 @@ public final class NativeLibrary {
|
||||||
} else {
|
} else {
|
||||||
// Create object used for waiting.
|
// Create object used for waiting.
|
||||||
final Object lock = new Object();
|
final Object lock = new Object();
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(emulationActivity)
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(emulationActivity)
|
||||||
.setTitle(caption)
|
.setTitle(caption)
|
||||||
.setMessage(text);
|
.setMessage(text);
|
||||||
|
|
||||||
|
@ -427,7 +429,7 @@ public final class NativeLibrary {
|
||||||
return alertPromptResult;
|
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();
|
final EmulationActivity emulationActivity = sEmulationActivity.get();
|
||||||
alertPromptResult = "";
|
alertPromptResult = "";
|
||||||
alertPromptButton = 0;
|
alertPromptButton = 0;
|
||||||
|
@ -444,7 +446,7 @@ public final class NativeLibrary {
|
||||||
FrameLayout container = new FrameLayout(emulationActivity);
|
FrameLayout container = new FrameLayout(emulationActivity);
|
||||||
container.addView(alertPromptEditText);
|
container.addView(alertPromptEditText);
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(emulationActivity)
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(emulationActivity)
|
||||||
.setTitle(caption)
|
.setTitle(caption)
|
||||||
.setView(container)
|
.setView(container)
|
||||||
.setPositiveButton(android.R.string.ok, (dialogInterface, i) ->
|
.setPositiveButton(android.R.string.ok, (dialogInterface, i) ->
|
||||||
|
@ -506,7 +508,7 @@ public final class NativeLibrary {
|
||||||
captionId = R.string.loader_error_encrypted;
|
captionId = R.string.loader_error_encrypted;
|
||||||
}
|
}
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(emulationActivity)
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(emulationActivity)
|
||||||
.setTitle(captionId)
|
.setTitle(captionId)
|
||||||
.setMessage(Html.fromHtml("Please follow the guides to redump your <a href=\"https://citra-emu.org/wiki/dumping-game-cartridges/\">game cartidges</a> or <a href=\"https://citra-emu.org/wiki/dumping-installed-titles/\">installed titles</a>.", Html.FROM_HTML_MODE_LEGACY))
|
.setMessage(Html.fromHtml("Please follow the guides to redump your <a href=\"https://citra-emu.org/wiki/dumping-game-cartridges/\">game cartidges</a> or <a href=\"https://citra-emu.org/wiki/dumping-installed-titles/\">installed titles</a>.", Html.FROM_HTML_MODE_LEGACY))
|
||||||
.setPositiveButton(android.R.string.ok, (dialog, whichButton) -> emulationActivity.finish())
|
.setPositiveButton(android.R.string.ok, (dialog, whichButton) -> emulationActivity.finish())
|
||||||
|
|
|
@ -18,13 +18,11 @@ import android.view.MotionEvent;
|
||||||
import android.view.SubMenu;
|
import android.view.SubMenu;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.SeekBar;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.annotation.IntDef;
|
import androidx.annotation.IntDef;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.appcompat.widget.PopupMenu;
|
import androidx.appcompat.widget.PopupMenu;
|
||||||
import androidx.core.app.NotificationManagerCompat;
|
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.FileBrowserHelper;
|
||||||
import org.citra.citra_emu.utils.FileUtil;
|
import org.citra.citra_emu.utils.FileUtil;
|
||||||
import org.citra.citra_emu.utils.ForegroundService;
|
import org.citra.citra_emu.utils.ForegroundService;
|
||||||
|
import org.citra.citra_emu.utils.ThemeUtil;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -56,6 +55,9 @@ import static android.Manifest.permission.CAMERA;
|
||||||
import static android.Manifest.permission.RECORD_AUDIO;
|
import static android.Manifest.permission.RECORD_AUDIO;
|
||||||
import static java.lang.annotation.RetentionPolicy.SOURCE;
|
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 final class EmulationActivity extends AppCompatActivity {
|
||||||
public static final String EXTRA_SELECTED_GAME = "SelectedGame";
|
public static final String EXTRA_SELECTED_GAME = "SelectedGame";
|
||||||
public static final String EXTRA_SELECTED_TITLE = "SelectedTitle";
|
public static final String EXTRA_SELECTED_TITLE = "SelectedTitle";
|
||||||
|
@ -151,6 +153,8 @@ public final class EmulationActivity extends AppCompatActivity {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
ThemeUtil.applyTheme(this);
|
||||||
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
if (savedInstanceState == null) {
|
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.
|
// Set these options now so that the SurfaceView the game renders into is the right size.
|
||||||
enableFullscreenImmersive();
|
enableFullscreenImmersive();
|
||||||
|
|
||||||
setTheme(R.style.CitraEmulationBase);
|
|
||||||
|
|
||||||
setContentView(R.layout.activity_emulation);
|
setContentView(R.layout.activity_emulation);
|
||||||
|
|
||||||
// Find or create the EmulationFragment
|
// Find or create the EmulationFragment
|
||||||
|
@ -243,7 +245,7 @@ public final class EmulationActivity extends AppCompatActivity {
|
||||||
case NativeLibrary.REQUEST_CODE_NATIVE_CAMERA:
|
case NativeLibrary.REQUEST_CODE_NATIVE_CAMERA:
|
||||||
if (grantResults[0] != PackageManager.PERMISSION_GRANTED &&
|
if (grantResults[0] != PackageManager.PERMISSION_GRANTED &&
|
||||||
shouldShowRequestPermissionRationale(CAMERA)) {
|
shouldShowRequestPermissionRationale(CAMERA)) {
|
||||||
new AlertDialog.Builder(this)
|
new MaterialAlertDialogBuilder(this)
|
||||||
.setTitle(R.string.camera)
|
.setTitle(R.string.camera)
|
||||||
.setMessage(R.string.camera_permission_needed)
|
.setMessage(R.string.camera_permission_needed)
|
||||||
.setPositiveButton(android.R.string.ok, null)
|
.setPositiveButton(android.R.string.ok, null)
|
||||||
|
@ -254,7 +256,7 @@ public final class EmulationActivity extends AppCompatActivity {
|
||||||
case NativeLibrary.REQUEST_CODE_NATIVE_MIC:
|
case NativeLibrary.REQUEST_CODE_NATIVE_MIC:
|
||||||
if (grantResults[0] != PackageManager.PERMISSION_GRANTED &&
|
if (grantResults[0] != PackageManager.PERMISSION_GRANTED &&
|
||||||
shouldShowRequestPermissionRationale(RECORD_AUDIO)) {
|
shouldShowRequestPermissionRationale(RECORD_AUDIO)) {
|
||||||
new AlertDialog.Builder(this)
|
new MaterialAlertDialogBuilder(this)
|
||||||
.setTitle(R.string.microphone)
|
.setTitle(R.string.microphone)
|
||||||
.setMessage(R.string.microphone_permission_needed)
|
.setMessage(R.string.microphone_permission_needed)
|
||||||
.setPositiveButton(android.R.string.ok, null)
|
.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);
|
View view = inflater.inflate(R.layout.dialog_checkbox, null);
|
||||||
CheckBox checkBox = view.findViewById(R.id.checkBox);
|
CheckBox checkBox = view.findViewById(R.id.checkBox);
|
||||||
|
|
||||||
new AlertDialog.Builder(this)
|
new MaterialAlertDialogBuilder(this)
|
||||||
.setTitle(R.string.savestate_warning_title)
|
.setTitle(R.string.savestate_warning_title)
|
||||||
.setMessage(R.string.savestate_warning_message)
|
.setMessage(R.string.savestate_warning_message)
|
||||||
.setView(view)
|
.setView(view)
|
||||||
|
@ -490,7 +492,7 @@ public final class EmulationActivity extends AppCompatActivity {
|
||||||
|
|
||||||
case MENU_ACTION_CLOSE_GAME:
|
case MENU_ACTION_CLOSE_GAME:
|
||||||
NativeLibrary.PauseEmulation();
|
NativeLibrary.PauseEmulation();
|
||||||
new AlertDialog.Builder(this)
|
new MaterialAlertDialogBuilder(this)
|
||||||
.setTitle(R.string.emulation_close_game)
|
.setTitle(R.string.emulation_close_game)
|
||||||
.setMessage(R.string.emulation_close_game_message)
|
.setMessage(R.string.emulation_close_game_message)
|
||||||
.setPositiveButton(android.R.string.yes, (dialogInterface, i) ->
|
.setPositiveButton(android.R.string.yes, (dialogInterface, i) ->
|
||||||
|
@ -498,11 +500,8 @@ public final class EmulationActivity extends AppCompatActivity {
|
||||||
mEmulationFragment.stopEmulation();
|
mEmulationFragment.stopEmulation();
|
||||||
finish();
|
finish();
|
||||||
})
|
})
|
||||||
.setNegativeButton(android.R.string.cancel, (dialogInterface, i) ->
|
.setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> NativeLibrary.UnPauseEmulation())
|
||||||
NativeLibrary.UnPauseEmulation())
|
.setOnCancelListener(dialogInterface -> NativeLibrary.UnPauseEmulation())
|
||||||
.setOnCancelListener(dialogInterface ->
|
|
||||||
NativeLibrary.UnPauseEmulation())
|
|
||||||
.create()
|
|
||||||
.show();
|
.show();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -589,11 +588,10 @@ public final class EmulationActivity extends AppCompatActivity {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!success) {
|
if (!success) {
|
||||||
new AlertDialog.Builder(this)
|
new MaterialAlertDialogBuilder(this)
|
||||||
.setTitle(R.string.amiibo_load_error)
|
.setTitle(R.string.amiibo_load_error)
|
||||||
.setMessage(R.string.amiibo_load_error_message)
|
.setMessage(R.string.amiibo_load_error_message)
|
||||||
.setPositiveButton(android.R.string.ok, null)
|
.setPositiveButton(android.R.string.ok, null)
|
||||||
.create()
|
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -605,8 +603,6 @@ public final class EmulationActivity extends AppCompatActivity {
|
||||||
private void toggleControls() {
|
private void toggleControls() {
|
||||||
final SharedPreferences.Editor editor = mPreferences.edit();
|
final SharedPreferences.Editor editor = mPreferences.edit();
|
||||||
boolean[] enabledButtons = new boolean[14];
|
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++) {
|
for (int i = 0; i < enabledButtons.length; i++) {
|
||||||
// Buttons that are disabled by default
|
// Buttons that are disabled by default
|
||||||
|
@ -621,63 +617,47 @@ public final class EmulationActivity extends AppCompatActivity {
|
||||||
|
|
||||||
enabledButtons[i] = mPreferences.getBoolean("buttonToggle" + i, defaultValue);
|
enabledButtons[i] = mPreferences.getBoolean("buttonToggle" + i, defaultValue);
|
||||||
}
|
}
|
||||||
builder.setMultiChoiceItems(R.array.n3dsButtons, enabledButtons,
|
|
||||||
|
new MaterialAlertDialogBuilder(this)
|
||||||
|
.setTitle(R.string.emulation_toggle_controls)
|
||||||
|
.setMultiChoiceItems(R.array.n3dsButtons, enabledButtons,
|
||||||
(dialog, indexSelected, isChecked) -> editor
|
(dialog, indexSelected, isChecked) -> editor
|
||||||
.putBoolean("buttonToggle" + indexSelected, isChecked));
|
.putBoolean("buttonToggle" + indexSelected, isChecked))
|
||||||
builder.setPositiveButton(android.R.string.ok, (dialogInterface, i) ->
|
.setPositiveButton(android.R.string.ok, (dialogInterface, i) ->
|
||||||
{
|
{
|
||||||
editor.apply();
|
editor.apply();
|
||||||
|
|
||||||
mEmulationFragment.refreshInputOverlay();
|
mEmulationFragment.refreshInputOverlay();
|
||||||
});
|
})
|
||||||
|
.show();
|
||||||
AlertDialog alertDialog = builder.create();
|
|
||||||
alertDialog.show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void adjustScale() {
|
private void adjustScale() {
|
||||||
LayoutInflater inflater = LayoutInflater.from(this);
|
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 Slider slider = view.findViewById(R.id.slider);
|
||||||
final TextView value = view.findViewById(R.id.text_value);
|
final TextView textValue = view.findViewById(R.id.text_value);
|
||||||
final TextView units = view.findViewById(R.id.text_units);
|
final TextView units = view.findViewById(R.id.text_units);
|
||||||
|
|
||||||
seekbar.setMax(150);
|
slider.setValueTo(150);
|
||||||
seekbar.setProgress(mPreferences.getInt("controlScale", 50));
|
slider.setValue(mPreferences.getInt("controlScale", 50));
|
||||||
seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
slider.addOnChangeListener((slider1, progress, fromUser) -> {
|
||||||
public void onStartTrackingTouch(SeekBar seekBar) {
|
textValue.setText(String.valueOf((int) progress + 50));
|
||||||
}
|
setControlScale((int) slider1.getValue());
|
||||||
|
|
||||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
|
||||||
value.setText(String.valueOf(progress + 50));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onStopTrackingTouch(SeekBar seekBar) {
|
|
||||||
setControlScale(seekbar.getProgress());
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
value.setText(String.valueOf(seekbar.getProgress() + 50));
|
textValue.setText(String.valueOf((int) slider.getValue() + 50));
|
||||||
units.setText("%");
|
units.setText("%");
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
final int previousProgress = (int) slider.getValue();
|
||||||
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);
|
|
||||||
});
|
|
||||||
|
|
||||||
AlertDialog alertDialog = builder.create();
|
new MaterialAlertDialogBuilder(this)
|
||||||
alertDialog.show();
|
.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) {
|
private void setControlScale(int scale) {
|
||||||
|
@ -688,12 +668,10 @@ public final class EmulationActivity extends AppCompatActivity {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resetOverlay() {
|
private void resetOverlay() {
|
||||||
new AlertDialog.Builder(this)
|
new MaterialAlertDialogBuilder(this)
|
||||||
.setTitle(getString(R.string.emulation_touch_overlay_reset))
|
.setTitle(getString(R.string.emulation_touch_overlay_reset))
|
||||||
.setPositiveButton(android.R.string.yes, (dialogInterface, i) -> mEmulationFragment.resetInputOverlay())
|
.setPositiveButton(android.R.string.yes, (dialogInterface, i) -> mEmulationFragment.resetInputOverlay())
|
||||||
.setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> {
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
})
|
|
||||||
.create()
|
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,6 @@ package org.citra.citra_emu.adapters;
|
||||||
|
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.DataSetObserver;
|
import android.database.DataSetObserver;
|
||||||
import android.graphics.Rect;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
@ -12,14 +10,14 @@ import android.view.ViewGroup;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
import androidx.core.content.ContextCompat;
|
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.google.android.material.color.MaterialColors;
|
||||||
|
|
||||||
import org.citra.citra_emu.R;
|
import org.citra.citra_emu.R;
|
||||||
import org.citra.citra_emu.activities.EmulationActivity;
|
import org.citra.citra_emu.activities.EmulationActivity;
|
||||||
import org.citra.citra_emu.model.GameDatabase;
|
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.Log;
|
||||||
import org.citra.citra_emu.utils.PicassoUtils;
|
import org.citra.citra_emu.utils.PicassoUtils;
|
||||||
import org.citra.citra_emu.viewholders.GameViewHolder;
|
import org.citra.citra_emu.viewholders.GameViewHolder;
|
||||||
|
@ -99,9 +97,9 @@ public final class GameAdapter extends RecyclerView.Adapter<GameViewHolder> impl
|
||||||
holder.regions = mCursor.getString(GameDatabase.GAME_COLUMN_REGIONS);
|
holder.regions = mCursor.getString(GameDatabase.GAME_COLUMN_REGIONS);
|
||||||
holder.company = mCursor.getString(GameDatabase.GAME_COLUMN_COMPANY);
|
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();
|
View itemView = holder.getItemView();
|
||||||
itemView.setBackgroundColor(ContextCompat.getColor(itemView.getContext(), backgroundColorId));
|
itemView.setBackgroundColor(MaterialColors.getColor(itemView, backgroundColorId));
|
||||||
} else {
|
} else {
|
||||||
Log.error("[GameAdapter] Can't bind view; Cursor is not valid.");
|
Log.error("[GameAdapter] Can't bind view; Cursor is not valid.");
|
||||||
}
|
}
|
||||||
|
@ -204,24 +202,6 @@ public final class GameAdapter extends RecyclerView.Adapter<GameViewHolder> impl
|
||||||
EmulationActivity.launch((FragmentActivity) view.getContext(), holder.path, holder.title);
|
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) {
|
private boolean isValidGame(String path) {
|
||||||
return Stream.of(
|
return Stream.of(
|
||||||
".rar", ".zip", ".7z", ".torrent", ".tar", ".gz").noneMatch(suffix -> path.toLowerCase().endsWith(suffix));
|
".rar", ".zip", ".7z", ".torrent", ".tar", ".gz").noneMatch(suffix -> path.toLowerCase().endsWith(suffix));
|
||||||
|
|
|
@ -22,6 +22,8 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
public final class MiiSelector {
|
public final class MiiSelector {
|
||||||
public static class MiiSelectorConfig implements java.io.Serializable {
|
public static class MiiSelectorConfig implements java.io.Serializable {
|
||||||
public boolean enable_cancel_button;
|
public boolean enable_cancel_button;
|
||||||
|
@ -69,8 +71,8 @@ public final class MiiSelector {
|
||||||
? (int) config.initially_selected_mii_index
|
? (int) config.initially_selected_mii_index
|
||||||
: 0;
|
: 0;
|
||||||
data.index = initialIndex;
|
data.index = initialIndex;
|
||||||
AlertDialog.Builder builder =
|
MaterialAlertDialogBuilder builder =
|
||||||
new AlertDialog.Builder(emulationActivity)
|
new MaterialAlertDialogBuilder(emulationActivity)
|
||||||
.setTitle(config.title.isEmpty()
|
.setTitle(config.title.isEmpty()
|
||||||
? emulationActivity.getString(R.string.mii_selector)
|
? emulationActivity.getString(R.string.mii_selector)
|
||||||
: config.title)
|
: config.title)
|
||||||
|
|
|
@ -19,6 +19,8 @@ import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.citra.citra_emu.CitraApplication;
|
import org.citra.citra_emu.CitraApplication;
|
||||||
import org.citra.citra_emu.NativeLibrary;
|
import org.citra.citra_emu.NativeLibrary;
|
||||||
import org.citra.citra_emu.R;
|
import org.citra.citra_emu.R;
|
||||||
|
@ -124,7 +126,7 @@ public final class SoftwareKeyboard {
|
||||||
FrameLayout container = new FrameLayout(emulationActivity);
|
FrameLayout container = new FrameLayout(emulationActivity);
|
||||||
container.addView(editText);
|
container.addView(editText);
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(emulationActivity)
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(emulationActivity)
|
||||||
.setTitle(R.string.software_keyboard)
|
.setTitle(R.string.software_keyboard)
|
||||||
.setView(container);
|
.setView(container);
|
||||||
setCancelable(false);
|
setCancelable(false);
|
||||||
|
@ -227,7 +229,7 @@ public final class SoftwareKeyboard {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
new AlertDialog.Builder(emulationActivity)
|
new MaterialAlertDialogBuilder(emulationActivity)
|
||||||
.setTitle(R.string.software_keyboard)
|
.setTitle(R.string.software_keyboard)
|
||||||
.setMessage(message)
|
.setMessage(message)
|
||||||
.setPositiveButton(android.R.string.ok, null)
|
.setPositiveButton(android.R.string.ok, null)
|
||||||
|
|
|
@ -8,7 +8,6 @@ import android.app.Activity;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
|
@ -18,6 +17,8 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.citra.citra_emu.NativeLibrary;
|
import org.citra.citra_emu.NativeLibrary;
|
||||||
import org.citra.citra_emu.R;
|
import org.citra.citra_emu.R;
|
||||||
import org.citra.citra_emu.activities.EmulationActivity;
|
import org.citra.citra_emu.activities.EmulationActivity;
|
||||||
|
@ -70,22 +71,15 @@ public class DiskShaderCacheProgress {
|
||||||
setCancelable(false);
|
setCancelable(false);
|
||||||
setRetainInstance(true);
|
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) {
|
synchronized (finishLock) {
|
||||||
finishLock.notifyAll();
|
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) {
|
private void onUpdateProgress(String msg, int progress, int max) {
|
||||||
|
|
|
@ -15,6 +15,8 @@ import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.citra.citra_emu.R;
|
import org.citra.citra_emu.R;
|
||||||
import org.citra.citra_emu.features.cheats.model.Cheat;
|
import org.citra.citra_emu.features.cheats.model.Cheat;
|
||||||
import org.citra.citra_emu.features.cheats.model.CheatsViewModel;
|
import org.citra.citra_emu.features.cheats.model.CheatsViewModel;
|
||||||
|
@ -80,12 +82,12 @@ public class CheatDetailsFragment extends Fragment {
|
||||||
private void onDeleteClicked(View view) {
|
private void onDeleteClicked(View view) {
|
||||||
String name = mEditName.getText().toString();
|
String name = mEditName.getText().toString();
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
|
new MaterialAlertDialogBuilder(requireContext())
|
||||||
builder.setMessage(getString(R.string.cheats_delete_confirmation, name));
|
.setMessage(getString(R.string.cheats_delete_confirmation, name))
|
||||||
builder.setPositiveButton(android.R.string.yes,
|
.setPositiveButton(android.R.string.yes,
|
||||||
(dialog, i) -> mViewModel.deleteSelectedCheat());
|
(dialog, i) -> mViewModel.deleteSelectedCheat())
|
||||||
builder.setNegativeButton(android.R.string.no, null);
|
.setNegativeButton(android.R.string.no, null)
|
||||||
builder.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onEditClicked(View view) {
|
private void onEditClicked(View view) {
|
||||||
|
|
|
@ -14,10 +14,13 @@ import androidx.core.view.ViewCompat;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
import androidx.slidingpanelayout.widget.SlidingPaneLayout;
|
import androidx.slidingpanelayout.widget.SlidingPaneLayout;
|
||||||
|
|
||||||
|
import com.google.android.material.appbar.MaterialToolbar;
|
||||||
|
|
||||||
import org.citra.citra_emu.R;
|
import org.citra.citra_emu.R;
|
||||||
import org.citra.citra_emu.features.cheats.model.Cheat;
|
import org.citra.citra_emu.features.cheats.model.Cheat;
|
||||||
import org.citra.citra_emu.features.cheats.model.CheatsViewModel;
|
import org.citra.citra_emu.features.cheats.model.CheatsViewModel;
|
||||||
import org.citra.citra_emu.ui.TwoPaneOnBackPressedCallback;
|
import org.citra.citra_emu.ui.TwoPaneOnBackPressedCallback;
|
||||||
|
import org.citra.citra_emu.utils.ThemeUtil;
|
||||||
|
|
||||||
public class CheatsActivity extends AppCompatActivity
|
public class CheatsActivity extends AppCompatActivity
|
||||||
implements SlidingPaneLayout.PanelSlideListener {
|
implements SlidingPaneLayout.PanelSlideListener {
|
||||||
|
@ -37,6 +40,8 @@ public class CheatsActivity extends AppCompatActivity
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
ThemeUtil.applyTheme(this);
|
||||||
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
mViewModel = new ViewModelProvider(this).get(CheatsViewModel.class);
|
mViewModel = new ViewModelProvider(this).get(CheatsViewModel.class);
|
||||||
|
@ -63,6 +68,8 @@ public class CheatsActivity extends AppCompatActivity
|
||||||
mViewModel.getOpenDetailsViewEvent().observe(this, this::openDetailsView);
|
mViewModel.getOpenDetailsViewEvent().observe(this, this::openDetailsView);
|
||||||
|
|
||||||
// Show "Up" button in the action bar for navigation
|
// Show "Up" button in the action bar for navigation
|
||||||
|
MaterialToolbar toolbar = findViewById(R.id.toolbar_cheats);
|
||||||
|
setSupportActionBar(toolbar);
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,14 @@ import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.fragment.app.FragmentTransaction;
|
import androidx.fragment.app.FragmentTransaction;
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||||
|
|
||||||
|
import com.google.android.material.appbar.MaterialToolbar;
|
||||||
|
|
||||||
import org.citra.citra_emu.NativeLibrary;
|
import org.citra.citra_emu.NativeLibrary;
|
||||||
import org.citra.citra_emu.R;
|
import org.citra.citra_emu.R;
|
||||||
import org.citra.citra_emu.utils.DirectoryInitialization;
|
import org.citra.citra_emu.utils.DirectoryInitialization;
|
||||||
import org.citra.citra_emu.utils.DirectoryStateReceiver;
|
import org.citra.citra_emu.utils.DirectoryStateReceiver;
|
||||||
import org.citra.citra_emu.utils.EmulationMenuSettings;
|
import org.citra.citra_emu.utils.EmulationMenuSettings;
|
||||||
|
import org.citra.citra_emu.utils.ThemeUtil;
|
||||||
|
|
||||||
public final class SettingsActivity extends AppCompatActivity implements SettingsActivityView {
|
public final class SettingsActivity extends AppCompatActivity implements SettingsActivityView {
|
||||||
private static final String ARG_MENU_TAG = "menu_tag";
|
private static final String ARG_MENU_TAG = "menu_tag";
|
||||||
|
@ -38,6 +41,8 @@ public final class SettingsActivity extends AppCompatActivity implements Setting
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
ThemeUtil.applyTheme(this);
|
||||||
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
setContentView(R.layout.activity_settings);
|
setContentView(R.layout.activity_settings);
|
||||||
|
@ -49,6 +54,8 @@ public final class SettingsActivity extends AppCompatActivity implements Setting
|
||||||
mPresenter.onCreate(savedInstanceState, menuTag, gameID);
|
mPresenter.onCreate(savedInstanceState, menuTag, gameID);
|
||||||
|
|
||||||
// Show "Back" button in the action bar for navigation
|
// Show "Back" button in the action bar for navigation
|
||||||
|
MaterialToolbar toolbar = findViewById(R.id.toolbar_settings);
|
||||||
|
setSupportActionBar(toolbar);
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,8 @@ import android.content.IntentFilter;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
import org.citra.citra_emu.NativeLibrary;
|
import org.citra.citra_emu.NativeLibrary;
|
||||||
import org.citra.citra_emu.features.settings.model.Settings;
|
import org.citra.citra_emu.features.settings.model.Settings;
|
||||||
import org.citra.citra_emu.features.settings.utils.SettingsFile;
|
import org.citra.citra_emu.features.settings.utils.SettingsFile;
|
||||||
|
@ -109,8 +111,6 @@ public final class SettingsActivityPresenter {
|
||||||
mSettings.saveSettings(mView);
|
mSettings.saveSettings(mView);
|
||||||
}
|
}
|
||||||
|
|
||||||
ThemeUtil.applyTheme();
|
|
||||||
|
|
||||||
NativeLibrary.ReloadSettings();
|
NativeLibrary.ReloadSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,13 +6,16 @@ import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.DatePicker;
|
import android.widget.DatePicker;
|
||||||
import android.widget.SeekBar;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.TimePicker;
|
import android.widget.TimePicker;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
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.R;
|
||||||
import org.citra.citra_emu.dialogs.MotionAlertDialog;
|
import org.citra.citra_emu.dialogs.MotionAlertDialog;
|
||||||
import org.citra.citra_emu.features.settings.model.FloatSetting;
|
import org.citra.citra_emu.features.settings.model.FloatSetting;
|
||||||
|
@ -41,15 +44,14 @@ import org.citra.citra_emu.utils.Log;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolder>
|
public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolder> implements DialogInterface.OnClickListener, Slider.OnChangeListener {
|
||||||
implements DialogInterface.OnClickListener, SeekBar.OnSeekBarChangeListener {
|
|
||||||
private SettingsFragmentView mView;
|
private SettingsFragmentView mView;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private ArrayList<SettingsItem> mSettings;
|
private ArrayList<SettingsItem> mSettings;
|
||||||
|
|
||||||
private SettingsItem mClickedItem;
|
private SettingsItem mClickedItem;
|
||||||
private int mClickedPosition;
|
private int mClickedPosition;
|
||||||
private int mSeekbarProgress;
|
private int mSliderProgress;
|
||||||
|
|
||||||
private AlertDialog mDialog;
|
private AlertDialog mDialog;
|
||||||
private TextView mTextSliderValue;
|
private TextView mTextSliderValue;
|
||||||
|
@ -149,11 +151,9 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
|
||||||
|
|
||||||
int value = getSelectionForSingleChoiceValue(item);
|
int value = getSelectionForSingleChoiceValue(item);
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity());
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(mView.getActivity())
|
||||||
|
.setTitle(item.getNameId())
|
||||||
builder.setTitle(item.getNameId());
|
.setSingleChoiceItems(item.getChoicesId(), value, this);
|
||||||
builder.setSingleChoiceItems(item.getChoicesId(), value, this);
|
|
||||||
|
|
||||||
mDialog = builder.show();
|
mDialog = builder.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,11 +162,9 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
|
||||||
|
|
||||||
int value = getSelectionForSingleChoiceValue(item);
|
int value = getSelectionForSingleChoiceValue(item);
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity());
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(mView.getActivity())
|
||||||
|
.setTitle(item.getNameId())
|
||||||
builder.setTitle(item.getNameId());
|
.setSingleChoiceItems(item.getChoicesId(), value, this);
|
||||||
builder.setSingleChoiceItems(item.getChoicesId(), value, this);
|
|
||||||
|
|
||||||
mDialog = builder.show();
|
mDialog = builder.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,11 +197,9 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
|
||||||
public void onStringSingleChoiceClick(StringSingleChoiceSetting item) {
|
public void onStringSingleChoiceClick(StringSingleChoiceSetting item) {
|
||||||
mClickedItem = item;
|
mClickedItem = item;
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity());
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(mView.getActivity())
|
||||||
|
.setTitle(item.getNameId())
|
||||||
builder.setTitle(item.getNameId());
|
.setSingleChoiceItems(item.getChoicesId(), item.getSelectValueIndex(), this);
|
||||||
builder.setSingleChoiceItems(item.getChoicesId(), item.getSelectValueIndex(), this);
|
|
||||||
|
|
||||||
mDialog = builder.show();
|
mDialog = builder.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,8 +222,6 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
|
||||||
mClickedItem = item;
|
mClickedItem = item;
|
||||||
mClickedPosition = position;
|
mClickedPosition = position;
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity());
|
|
||||||
|
|
||||||
LayoutInflater inflater = LayoutInflater.from(mView.getActivity());
|
LayoutInflater inflater = LayoutInflater.from(mView.getActivity());
|
||||||
View view = inflater.inflate(R.layout.sysclock_datetime_picker, null);
|
View view = inflater.inflate(R.layout.sysclock_datetime_picker, null);
|
||||||
|
|
||||||
|
@ -265,44 +259,45 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
|
||||||
closeDialog();
|
closeDialog();
|
||||||
};
|
};
|
||||||
|
|
||||||
builder.setView(view);
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(mView.getActivity())
|
||||||
builder.setPositiveButton(android.R.string.ok, ok);
|
.setView(view)
|
||||||
builder.setNegativeButton(android.R.string.cancel, defaultCancelListener);
|
.setPositiveButton(android.R.string.ok, ok)
|
||||||
|
.setNegativeButton(android.R.string.cancel, defaultCancelListener);
|
||||||
mDialog = builder.show();
|
mDialog = builder.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onSliderClick(SliderSetting item, int position) {
|
public void onSliderClick(SliderSetting item, int position) {
|
||||||
mClickedItem = item;
|
mClickedItem = item;
|
||||||
mClickedPosition = position;
|
mClickedPosition = position;
|
||||||
mSeekbarProgress = item.getSelectedValue();
|
mSliderProgress = item.getSelectedValue();
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity());
|
|
||||||
|
|
||||||
LayoutInflater inflater = LayoutInflater.from(mView.getActivity());
|
LayoutInflater inflater = LayoutInflater.from(mView.getActivity());
|
||||||
View view = inflater.inflate(R.layout.dialog_seekbar, null);
|
View view = inflater.inflate(R.layout.dialog_slider, null);
|
||||||
|
|
||||||
SeekBar seekbar = view.findViewById(R.id.seekbar);
|
Slider slider = view.findViewById(R.id.slider);
|
||||||
|
|
||||||
builder.setTitle(item.getNameId());
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(mView.getActivity())
|
||||||
builder.setView(view);
|
.setTitle(item.getNameId())
|
||||||
builder.setPositiveButton(android.R.string.ok, this);
|
.setView(view)
|
||||||
builder.setNegativeButton(android.R.string.cancel, defaultCancelListener);
|
.setPositiveButton(android.R.string.ok, this)
|
||||||
builder.setNeutralButton(R.string.slider_default, (DialogInterface dialog, int which) -> {
|
.setNegativeButton(android.R.string.cancel, defaultCancelListener)
|
||||||
seekbar.setProgress(item.getDefaultValue());
|
.setNeutralButton(R.string.slider_default, (DialogInterface dialog, int which) -> {
|
||||||
|
slider.setValue(item.getDefaultValue());
|
||||||
onClick(dialog, which);
|
onClick(dialog, which);
|
||||||
});
|
});
|
||||||
mDialog = builder.show();
|
mDialog = builder.show();
|
||||||
|
|
||||||
mTextSliderValue = view.findViewById(R.id.text_value);
|
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);
|
TextView units = view.findViewById(R.id.text_units);
|
||||||
units.setText(item.getUnits());
|
units.setText(item.getUnits());
|
||||||
|
|
||||||
seekbar.setMin(item.getMin());
|
slider.setValueFrom(item.getMin());
|
||||||
seekbar.setMax(item.getMax());
|
slider.setValueTo(item.getMax());
|
||||||
seekbar.setProgress(mSeekbarProgress);
|
slider.setValue(mSliderProgress);
|
||||||
|
|
||||||
seekbar.setOnSeekBarChangeListener(this);
|
slider.addOnChangeListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onSubmenuClick(SubmenuSetting item) {
|
public void onSubmenuClick(SubmenuSetting item) {
|
||||||
|
@ -375,19 +370,19 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
|
||||||
closeDialog();
|
closeDialog();
|
||||||
} else if (mClickedItem instanceof SliderSetting) {
|
} else if (mClickedItem instanceof SliderSetting) {
|
||||||
SliderSetting sliderSetting = (SliderSetting) mClickedItem;
|
SliderSetting sliderSetting = (SliderSetting) mClickedItem;
|
||||||
if (sliderSetting.getSelectedValue() != mSeekbarProgress) {
|
if (sliderSetting.getSelectedValue() != mSliderProgress) {
|
||||||
mView.onSettingChanged();
|
mView.onSettingChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sliderSetting.getSetting() instanceof FloatSetting) {
|
if (sliderSetting.getSetting() instanceof FloatSetting) {
|
||||||
float value = (float) mSeekbarProgress;
|
float value = (float) mSliderProgress;
|
||||||
|
|
||||||
FloatSetting setting = sliderSetting.setSelectedValue(value);
|
FloatSetting setting = sliderSetting.setSelectedValue(value);
|
||||||
if (setting != null) {
|
if (setting != null) {
|
||||||
mView.putSetting(setting);
|
mView.putSetting(setting);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IntSetting setting = sliderSetting.setSelectedValue(mSeekbarProgress);
|
IntSetting setting = sliderSetting.setSelectedValue(mSliderProgress);
|
||||||
if (setting != null) {
|
if (setting != null) {
|
||||||
mView.putSetting(setting);
|
mView.putSetting(setting);
|
||||||
}
|
}
|
||||||
|
@ -397,7 +392,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
|
||||||
}
|
}
|
||||||
|
|
||||||
mClickedItem = null;
|
mClickedItem = null;
|
||||||
mSeekbarProgress = -1;
|
mSliderProgress = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void closeDialog() {
|
public void closeDialog() {
|
||||||
|
@ -411,20 +406,6 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
|
||||||
mSeekbarProgress = progress;
|
|
||||||
mTextSliderValue.setText(String.valueOf(mSeekbarProgress));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStartTrackingTouch(SeekBar seekBar) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStopTrackingTouch(SeekBar seekBar) {
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getValueForSingleChoiceSelection(SingleChoiceSetting item, int which) {
|
private int getValueForSingleChoiceSelection(SingleChoiceSetting item, int which) {
|
||||||
int valuesId = item.getValuesId();
|
int valuesId = item.getValuesId();
|
||||||
|
|
||||||
|
@ -484,4 +465,10 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) {
|
||||||
|
mSliderProgress = (int) value;
|
||||||
|
mTextSliderValue.setText(String.valueOf(mSliderProgress));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ public final class MainActivity extends AppCompatActivity implements MainView {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
ThemeUtil.applyTheme();
|
ThemeUtil.applyTheme(this);
|
||||||
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_main);
|
setContentView(R.layout.activity_main);
|
||||||
|
|
|
@ -10,9 +10,13 @@ import android.widget.TextView;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.recyclerview.widget.GridLayoutManager;
|
import androidx.recyclerview.widget.GridLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||||
|
|
||||||
|
import com.google.android.material.color.MaterialColors;
|
||||||
|
import com.google.android.material.divider.MaterialDividerItemDecoration;
|
||||||
|
|
||||||
import org.citra.citra_emu.CitraApplication;
|
import org.citra.citra_emu.CitraApplication;
|
||||||
import org.citra.citra_emu.R;
|
import org.citra.citra_emu.R;
|
||||||
import org.citra.citra_emu.adapters.GameAdapter;
|
import org.citra.citra_emu.adapters.GameAdapter;
|
||||||
|
@ -49,7 +53,9 @@ public final class PlatformGamesFragment extends Fragment implements PlatformGam
|
||||||
|
|
||||||
mRecyclerView.setLayoutManager(layoutManager);
|
mRecyclerView.setLayoutManager(layoutManager);
|
||||||
mRecyclerView.setAdapter(mAdapter);
|
mRecyclerView.setAdapter(mAdapter);
|
||||||
mRecyclerView.addItemDecoration(new GameAdapter.SpacesItemDecoration(ContextCompat.getDrawable(getActivity(), R.drawable.gamelist_divider), 1));
|
MaterialDividerItemDecoration divider = new MaterialDividerItemDecoration(requireContext(), LinearLayoutManager.VERTICAL);
|
||||||
|
divider.setLastItemDecorated(false);
|
||||||
|
mRecyclerView.addItemDecoration(divider);
|
||||||
|
|
||||||
// Add swipe down to refresh gesture
|
// Add swipe down to refresh gesture
|
||||||
final SwipeRefreshLayout pullToRefresh = view.findViewById(R.id.refresh_grid_games);
|
final SwipeRefreshLayout pullToRefresh = view.findViewById(R.id.refresh_grid_games);
|
||||||
|
@ -59,6 +65,9 @@ public final class PlatformGamesFragment extends Fragment implements PlatformGam
|
||||||
refresh();
|
refresh();
|
||||||
pullToRefresh.setRefreshing(false);
|
pullToRefresh.setRefreshing(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
pullToRefresh.setProgressBackgroundColorSchemeColor(MaterialColors.getColor(pullToRefresh, R.attr.colorPrimary));
|
||||||
|
pullToRefresh.setColorSchemeColors(MaterialColors.getColor(pullToRefresh, R.attr.colorOnPrimary));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -7,6 +7,8 @@ import android.text.TextUtils;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
|
||||||
import org.citra.citra_emu.R;
|
import org.citra.citra_emu.R;
|
||||||
import org.citra.citra_emu.activities.EmulationActivity;
|
import org.citra.citra_emu.activities.EmulationActivity;
|
||||||
|
|
||||||
|
@ -33,7 +35,7 @@ public final class StartupHandler {
|
||||||
public static void HandleInit(FragmentActivity parent) {
|
public static void HandleInit(FragmentActivity parent) {
|
||||||
if (PermissionsHandler.isFirstBoot(parent)) {
|
if (PermissionsHandler.isFirstBoot(parent)) {
|
||||||
// Prompt user with standard first boot disclaimer
|
// Prompt user with standard first boot disclaimer
|
||||||
new AlertDialog.Builder(parent)
|
new MaterialAlertDialogBuilder(parent)
|
||||||
.setTitle(R.string.app_name)
|
.setTitle(R.string.app_name)
|
||||||
.setIcon(R.mipmap.ic_launcher)
|
.setIcon(R.mipmap.ic_launcher)
|
||||||
.setMessage(parent.getResources().getString(R.string.app_disclaimer))
|
.setMessage(parent.getResources().getString(R.string.app_disclaimer))
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
package org.citra.citra_emu.utils;
|
package org.citra.citra_emu.utils;
|
||||||
|
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.res.Configuration;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.appcompat.app.AppCompatDelegate;
|
import androidx.appcompat.app.AppCompatDelegate;
|
||||||
|
import androidx.core.view.WindowCompat;
|
||||||
|
import androidx.core.view.WindowInsetsControllerCompat;
|
||||||
|
|
||||||
import org.citra.citra_emu.CitraApplication;
|
import org.citra.citra_emu.CitraApplication;
|
||||||
import org.citra.citra_emu.features.settings.utils.SettingsFile;
|
import org.citra.citra_emu.features.settings.utils.SettingsFile;
|
||||||
|
@ -12,7 +16,7 @@ import org.citra.citra_emu.features.settings.utils.SettingsFile;
|
||||||
public class ThemeUtil {
|
public class ThemeUtil {
|
||||||
private static SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext());
|
private static SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext());
|
||||||
|
|
||||||
private static void applyTheme(int designValue) {
|
private static void applyTheme(int designValue, AppCompatActivity activity) {
|
||||||
switch (designValue) {
|
switch (designValue) {
|
||||||
case 0:
|
case 0:
|
||||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
|
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
|
||||||
|
@ -26,9 +30,13 @@ public class ThemeUtil {
|
||||||
AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);
|
AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int systemReportedThemeMode = activity.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||||
|
WindowInsetsControllerCompat windowController = WindowCompat.getInsetsController(activity.getWindow(), activity.getWindow().getDecorView());
|
||||||
|
windowController.setAppearanceLightStatusBars(systemReportedThemeMode == Configuration.UI_MODE_NIGHT_NO);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void applyTheme() {
|
public static void applyTheme(AppCompatActivity activity) {
|
||||||
applyTheme(mPreferences.getInt(SettingsFile.KEY_DESIGN, 0));
|
applyTheme(mPreferences.getInt(SettingsFile.KEY_DESIGN, 0), activity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Before Width: | Height: | Size: 514 B |
Before Width: | Height: | Size: 275 B |
Before Width: | Height: | Size: 961 B |
Before Width: | Height: | Size: 793 B |
Before Width: | Height: | Size: 364 B |
Before Width: | Height: | Size: 214 B |
Before Width: | Height: | Size: 605 B |
Before Width: | Height: | Size: 556 B |
Before Width: | Height: | Size: 289 B |
Before Width: | Height: | Size: 955 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 405 B |
Before Width: | Height: | Size: 227 B |
Before Width: | Height: | Size: 595 B |
Before Width: | Height: | Size: 729 B |
Before Width: | Height: | Size: 347 B |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 555 B |
Before Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 657 B |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 656 B |
Before Width: | Height: | Size: 325 B |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 967 B |
Before Width: | Height: | Size: 487 B |
Before Width: | Height: | Size: 2 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 591 B |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 2 KiB |
|
@ -6,6 +6,6 @@
|
||||||
android:width="1dp"
|
android:width="1dp"
|
||||||
android:height="1dp" />
|
android:height="1dp" />
|
||||||
|
|
||||||
<solid android:color="@color/gamelist_divider" />
|
<solid android:color="@color/citra_outlineVariant" />
|
||||||
|
|
||||||
</shape>
|
</shape>
|
||||||
|
|
|
@ -4,6 +4,6 @@
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24">
|
||||||
<path
|
<path
|
||||||
android:fillColor="@android:color/white"
|
android:fillColor="?attr/colorControlNormal"
|
||||||
android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
|
android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
|
||||||
</vector>
|
</vector>
|
||||||
|
|
10
src/android/app/src/main/res/drawable/ic_back.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:autoMirrored="true"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z" />
|
||||||
|
</vector>
|
9
src/android/app/src/main/res/drawable/ic_folder.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<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/colorControlNormal"
|
||||||
|
android:pathData="M10,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2h-8l-2,-2z" />
|
||||||
|
</vector>
|
9
src/android/app/src/main/res/drawable/ic_heart.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<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/colorControlNormal"
|
||||||
|
android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z" />
|
||||||
|
</vector>
|
9
src/android/app/src/main/res/drawable/ic_install.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<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/colorControlNormal"
|
||||||
|
android:pathData="M19,12v7L5,19v-7L3,12v7c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2zM13,12.67l2.59,-2.58L17,11.5l-5,5 -5,-5 1.41,-1.41L11,12.67L11,3h2z" />
|
||||||
|
</vector>
|
9
src/android/app/src/main/res/drawable/ic_settings.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<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/colorControlNormal"
|
||||||
|
android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z" />
|
||||||
|
</vector>
|
|
@ -0,0 +1,4 @@
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<solid android:color="?attr/colorSurface"/>
|
||||||
|
<corners android:radius="4dp" />
|
||||||
|
</shape>
|
|
@ -13,7 +13,6 @@
|
||||||
android:id="@+id/text_name"
|
android:id="@+id/text_name"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textColor="@color/header_text"
|
|
||||||
android:textSize="16sp"
|
android:textSize="16sp"
|
||||||
android:layout_margin="@dimen/spacing_large"
|
android:layout_margin="@dimen/spacing_large"
|
||||||
style="@style/TextAppearance.AppCompat.Headline"
|
style="@style/TextAppearance.AppCompat.Headline"
|
||||||
|
|
|
@ -1,10 +1,44 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.slidingpanelayout.widget.SlidingPaneLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:id="@+id/sliding_pane_layout"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
|
android:id="@+id/coordinator_cheats"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:id="@+id/appbar_cheats"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:elevation="0dp"
|
||||||
|
app:liftOnScroll="false">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
android:id="@+id/toolbar_cheats"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/colorSurface" />
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
|
|
||||||
|
<androidx.slidingpanelayout.widget.SlidingPaneLayout
|
||||||
|
android:id="@+id/sliding_pane_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/coordinator_cheats">
|
||||||
|
|
||||||
<androidx.fragment.app.FragmentContainerView
|
<androidx.fragment.app.FragmentContainerView
|
||||||
android:layout_width="320dp"
|
android:layout_width="320dp"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
@ -20,3 +54,5 @@
|
||||||
android:name="org.citra.citra_emu.features.cheats.ui.CheatDetailsFragment" />
|
android:name="org.citra.citra_emu.features.cheats.ui.CheatDetailsFragment" />
|
||||||
|
|
||||||
</androidx.slidingpanelayout.widget.SlidingPaneLayout>
|
</androidx.slidingpanelayout.widget.SlidingPaneLayout>
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
|
@ -1,27 +1,30 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:id="@+id/coordinator_main"
|
android:id="@+id/coordinator_main"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:id="@+id/appbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
android:id="@+id/toolbar_main"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:background="?attr/colorSurface"
|
||||||
|
app:subtitleTextColor="?attr/colorOnSurface"
|
||||||
|
app:titleTextColor="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:id="@+id/games_platform_frame"
|
android:id="@+id/games_platform_frame"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
||||||
|
|
||||||
<com.google.android.material.appbar.AppBarLayout
|
|
||||||
android:id="@+id/appbar"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<androidx.appcompat.widget.Toolbar
|
|
||||||
android:id="@+id/toolbar_main"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="?attr/actionBarSize"
|
|
||||||
android:background="?colorPrimary"/>
|
|
||||||
|
|
||||||
</com.google.android.material.appbar.AppBarLayout>
|
|
||||||
|
|
||||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
|
|
|
@ -1,5 +1,27 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/coordinator_settings"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:id="@+id/appbar_settings"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
android:id="@+id/toolbar_settings"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:background="?attr/colorSurface" />
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/frame_content"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:id="@+id/frame_content" />
|
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
||||||
|
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
|
|
|
@ -36,15 +36,13 @@
|
||||||
android:layout_marginStart="8dp"
|
android:layout_marginStart="8dp"
|
||||||
android:baselineAligned="false"
|
android:baselineAligned="false"
|
||||||
android:ellipsize="end"
|
android:ellipsize="end"
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:lines="1"
|
android:lines="1"
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
android:textAlignment="viewStart"
|
android:textAlignment="viewStart"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toEndOf="@+id/image_game_screen"
|
app:layout_constraintStart_toEndOf="@+id/image_game_screen"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
tools:text="The Legend of Zelda\nOcarina of Time 3D"
|
tools:text="The Legend of Zelda\nOcarina of Time 3D" />
|
||||||
android:textColor="@color/header_text" />
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/text_company"
|
android:id="@+id/text_company"
|
||||||
|
@ -58,8 +56,7 @@
|
||||||
app:layout_constraintStart_toStartOf="@+id/text_game_title"
|
app:layout_constraintStart_toStartOf="@+id/text_game_title"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/text_game_title"
|
app:layout_constraintTop_toBottomOf="@+id/text_game_title"
|
||||||
app:layout_constraintVertical_bias="0.842"
|
app:layout_constraintVertical_bias="0.842"
|
||||||
tools:text="Nintendo"
|
tools:text="Nintendo" />
|
||||||
android:textColor="@color/header_subtext" />
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/text_filename"
|
android:id="@+id/text_filename"
|
||||||
|
@ -73,10 +70,8 @@
|
||||||
app:layout_constraintStart_toStartOf="@+id/text_game_title"
|
app:layout_constraintStart_toStartOf="@+id/text_game_title"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/text_game_title"
|
app:layout_constraintTop_toBottomOf="@+id/text_game_title"
|
||||||
app:layout_constraintVertical_bias="0.0"
|
app:layout_constraintVertical_bias="0.0"
|
||||||
tools:text="Pilotwings_Resort.cxi"
|
tools:text="Pilotwings_Resort.cxi" />
|
||||||
android:textColor="@color/header_subtext" />
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
</androidx.cardview.widget.CardView>
|
</androidx.cardview.widget.CardView>
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
<SeekBar
|
<com.google.android.material.slider.Slider
|
||||||
android:id="@+id/seekbar"
|
android:id="@+id/slider"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="@dimen/spacing_large"
|
android:layout_marginLeft="@dimen/spacing_large"
|
|
@ -40,7 +40,6 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:padding="@dimen/spacing_small"
|
android:padding="@dimen/spacing_small"
|
||||||
android:background="@color/citra_orange"
|
|
||||||
android:text="@string/emulation_done"
|
android:text="@string/emulation_done"
|
||||||
android:visibility="gone" />
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
|
|
@ -17,17 +17,19 @@
|
||||||
android:id="@+id/gamelist_empty_text"
|
android:id="@+id/gamelist_empty_text"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:gravity="center"
|
||||||
android:text="@string/empty_gamelist"
|
android:text="@string/empty_gamelist"
|
||||||
android:visibility="gone"
|
|
||||||
android:textSize="18sp"
|
android:textSize="18sp"
|
||||||
android:gravity="center" />
|
android:visibility="gone" />
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/grid_games"
|
android:id="@+id/grid_games"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:listitem="@layout/card_game" />
|
tools:listitem="@layout/card_game" />
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
|
@ -1,12 +1,13 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<org.citra.citra_emu.features.settings.ui.SettingsFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<org.citra.citra_emu.features.settings.ui.SettingsFrameLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent"
|
||||||
|
android:background="?attr/colorSurface">
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/list_settings"
|
android:id="@+id/list_settings"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent" />
|
||||||
android:background="@color/card_view_background" />
|
|
||||||
|
|
||||||
</org.citra.citra_emu.features.settings.ui.SettingsFrameLayout>
|
</org.citra.citra_emu.features.settings.ui.SettingsFrameLayout>
|
|
@ -13,7 +13,6 @@
|
||||||
android:id="@+id/text_name"
|
android:id="@+id/text_name"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textColor="@color/header_text"
|
|
||||||
android:textSize="16sp"
|
android:textSize="16sp"
|
||||||
android:layout_margin="@dimen/spacing_large"
|
android:layout_margin="@dimen/spacing_large"
|
||||||
style="@style/TextAppearance.AppCompat.Headline"
|
style="@style/TextAppearance.AppCompat.Headline"
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_alignParentEnd="true"
|
||||||
android:layout_marginStart="@dimen/spacing_large"
|
android:layout_marginStart="@dimen/spacing_large"
|
||||||
android:layout_marginEnd="@dimen/spacing_large"
|
android:layout_marginEnd="@dimen/spacing_large"
|
||||||
android:textColor="@color/header_text"
|
|
||||||
android:textSize="16sp"
|
android:textSize="16sp"
|
||||||
tools:text="Setting Name" />
|
tools:text="Setting Name" />
|
||||||
|
|
||||||
|
@ -37,7 +36,6 @@
|
||||||
android:layout_marginTop="@dimen/spacing_small"
|
android:layout_marginTop="@dimen/spacing_small"
|
||||||
android:layout_marginEnd="@dimen/spacing_large"
|
android:layout_marginEnd="@dimen/spacing_large"
|
||||||
android:visibility="visible"
|
android:visibility="visible"
|
||||||
tools:text="@string/app_disclaimer"
|
tools:text="@string/app_disclaimer" />
|
||||||
android:textColor="@color/header_subtext" />
|
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
|
@ -19,7 +19,6 @@
|
||||||
android:layout_marginStart="@dimen/spacing_large"
|
android:layout_marginStart="@dimen/spacing_large"
|
||||||
android:layout_marginTop="@dimen/spacing_large"
|
android:layout_marginTop="@dimen/spacing_large"
|
||||||
android:layout_toStartOf="@+id/checkbox"
|
android:layout_toStartOf="@+id/checkbox"
|
||||||
android:textColor="@color/header_text"
|
|
||||||
android:textSize="16sp"
|
android:textSize="16sp"
|
||||||
tools:text="@string/frame_limit_enable" />
|
tools:text="@string/frame_limit_enable" />
|
||||||
|
|
||||||
|
@ -36,7 +35,6 @@
|
||||||
android:layout_marginTop="@dimen/spacing_small"
|
android:layout_marginTop="@dimen/spacing_small"
|
||||||
android:layout_toStartOf="@+id/checkbox"
|
android:layout_toStartOf="@+id/checkbox"
|
||||||
android:textAlignment="textStart"
|
android:textAlignment="textStart"
|
||||||
android:textColor="@color/header_subtext"
|
|
||||||
tools:text="@string/frame_limit_enable_description" />
|
tools:text="@string/frame_limit_enable_description" />
|
||||||
|
|
||||||
<CheckBox
|
<CheckBox
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
android:layout_marginStart="@dimen/spacing_large"
|
android:layout_marginStart="@dimen/spacing_large"
|
||||||
android:layout_marginBottom="@dimen/spacing_small"
|
android:layout_marginBottom="@dimen/spacing_small"
|
||||||
android:layout_marginTop="@dimen/spacing_small"
|
android:layout_marginTop="@dimen/spacing_small"
|
||||||
android:textColor="?android:colorAccent"
|
android:textColor="?attr/colorPrimary"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
tools:text="CPU Settings" />
|
tools:text="CPU Settings" />
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_alignParentEnd="true"
|
||||||
android:layout_marginStart="@dimen/spacing_large"
|
android:layout_marginStart="@dimen/spacing_large"
|
||||||
android:layout_marginEnd="@dimen/spacing_large"
|
android:layout_marginEnd="@dimen/spacing_large"
|
||||||
android:textColor="?android:colorAccent"
|
android:textColor="?attr/colorPrimary"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
tools:text="Setting Name" />
|
tools:text="Setting Name" />
|
||||||
|
|
||||||
|
@ -37,7 +37,6 @@
|
||||||
android:layout_marginTop="@dimen/spacing_small"
|
android:layout_marginTop="@dimen/spacing_small"
|
||||||
android:layout_marginEnd="@dimen/spacing_large"
|
android:layout_marginEnd="@dimen/spacing_large"
|
||||||
android:visibility="visible"
|
android:visibility="visible"
|
||||||
tools:text="@string/app_disclaimer"
|
tools:text="@string/app_disclaimer" />
|
||||||
android:textColor="@color/header_subtext" />
|
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/button_premium"
|
android:id="@+id/button_premium"
|
||||||
android:icon="@drawable/ic_premium"
|
android:icon="@drawable/ic_heart"
|
||||||
android:title="@string/premium_text"
|
android:title="@string/premium_text"
|
||||||
app:showAsAction="ifRoom" />
|
app:showAsAction="ifRoom" />
|
||||||
<item
|
<item
|
||||||
|
@ -20,14 +20,14 @@
|
||||||
app:showAsAction="ifRoom" />
|
app:showAsAction="ifRoom" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/button_install_cia"
|
android:id="@+id/button_install_cia"
|
||||||
android:icon="@drawable/ic_cia_install"
|
android:icon="@drawable/ic_install"
|
||||||
android:title="@string/install_cia_title"
|
android:title="@string/install_cia_title"
|
||||||
app:showAsAction="ifRoom" />
|
app:showAsAction="ifRoom" />
|
||||||
</menu>
|
</menu>
|
||||||
</item>
|
</item>
|
||||||
<item
|
<item
|
||||||
android:id="@+id/menu_settings_core"
|
android:id="@+id/menu_settings_core"
|
||||||
android:icon="@drawable/ic_settings_core"
|
android:icon="@drawable/ic_settings"
|
||||||
android:title="@string/grid_menu_core_settings"
|
android:title="@string/grid_menu_core_settings"
|
||||||
app:showAsAction="ifRoom" />
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
|
|
33
src/android/app/src/main/res/values-night/citra_colors.xml
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<color name="citra_primary">#F8BE00</color>
|
||||||
|
<color name="citra_onPrimary">#3F2E00</color>
|
||||||
|
<color name="citra_primaryContainer">#451C00</color>
|
||||||
|
<color name="citra_onPrimaryContainer">#FFDF9A</color>
|
||||||
|
<color name="citra_secondary">#D7C4A0</color>
|
||||||
|
<color name="citra_onSecondary">#3A2F15</color>
|
||||||
|
<color name="citra_secondaryContainer">#52452A</color>
|
||||||
|
<color name="citra_onSecondaryContainer">#F4E0BB</color>
|
||||||
|
<color name="citra_tertiary">#FFB2BC</color>
|
||||||
|
<color name="citra_onTertiary">#5F1126</color>
|
||||||
|
<color name="citra_tertiaryContainer">#7D293B</color>
|
||||||
|
<color name="citra_onTertiaryContainer">#FFD9DD</color>
|
||||||
|
<color name="citra_error">#FFB4AB</color>
|
||||||
|
<color name="citra_errorContainer">#93000A</color>
|
||||||
|
<color name="citra_onError">#690005</color>
|
||||||
|
<color name="citra_onErrorContainer">#FFDAD6</color>
|
||||||
|
<color name="citra_background">#1E1B16</color>
|
||||||
|
<color name="citra_onBackground">#E9E1D9</color>
|
||||||
|
<color name="citra_surface">#1E1B16</color>
|
||||||
|
<color name="citra_onSurface">#E9E1D9</color>
|
||||||
|
<color name="citra_surfaceVariant">#4D4639</color>
|
||||||
|
<color name="citra_onSurfaceVariant">#D0C5B4</color>
|
||||||
|
<color name="citra_outline">#999080</color>
|
||||||
|
<color name="citra_inverseOnSurface">#1E1B16</color>
|
||||||
|
<color name="citra_inverseSurface">#E9E1D9</color>
|
||||||
|
<color name="citra_inversePrimary">#785A00</color>
|
||||||
|
<color name="citra_surfaceTint">#F8BE00</color>
|
||||||
|
<color name="citra_outlineVariant">#4D4639</color>
|
||||||
|
|
||||||
|
</resources>
|
|
@ -1,17 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
|
|
||||||
<color name="citra_orange">#272727</color>
|
|
||||||
<color name="citra_orange_dark">#121212</color>
|
|
||||||
<color name="citra_accent">#FEC303</color>
|
|
||||||
|
|
||||||
<color name="card_view_background">#121212</color>
|
|
||||||
<color name="card_view_disabled">#3D3D3D</color>
|
|
||||||
|
|
||||||
<color name="gamelist_divider">#404040</color>
|
|
||||||
|
|
||||||
<color name="header_text">#E0E0E0</color>
|
|
||||||
<color name="header_subtext">#A0A0A0</color>
|
|
||||||
|
|
||||||
<color name="citra_logo_text_color">@color/citra_accent</color>
|
|
||||||
</resources>
|
|
35
src/android/app/src/main/res/values/citra_colors.xml
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<color name="citra_primary">#FFAB03</color>
|
||||||
|
<color name="citra_onPrimary">#FFFFFF</color>
|
||||||
|
<color name="citra_primaryContainer">#FFDF9A</color>
|
||||||
|
<color name="citra_onPrimaryContainer">#251A00</color>
|
||||||
|
<color name="citra_secondary">#6B5D3F</color>
|
||||||
|
<color name="citra_onSecondary">#FFFFFF</color>
|
||||||
|
<color name="citra_secondaryContainer">#F4E0BB</color>
|
||||||
|
<color name="citra_onSecondaryContainer">#241A04</color>
|
||||||
|
<color name="citra_tertiary">#9B4052</color>
|
||||||
|
<color name="citra_onTertiary">#FFFFFF</color>
|
||||||
|
<color name="citra_tertiaryContainer">#FFD9DD</color>
|
||||||
|
<color name="citra_onTertiaryContainer">#400013</color>
|
||||||
|
<color name="citra_error">#BA1A1A</color>
|
||||||
|
<color name="citra_errorContainer">#FFDAD6</color>
|
||||||
|
<color name="citra_onError">#FFFFFF</color>
|
||||||
|
<color name="citra_onErrorContainer">#410002</color>
|
||||||
|
<color name="citra_background">#FFFBFF</color>
|
||||||
|
<color name="citra_onBackground">#1E1B16</color>
|
||||||
|
<color name="citra_surface">#FFFBFF</color>
|
||||||
|
<color name="citra_onSurface">#1E1B16</color>
|
||||||
|
<color name="citra_surfaceVariant">#EDE1CF</color>
|
||||||
|
<color name="citra_onSurfaceVariant">#4D4639</color>
|
||||||
|
<color name="citra_outline">#7F7667</color>
|
||||||
|
<color name="citra_inverseOnSurface">#F7F0E7</color>
|
||||||
|
<color name="citra_inverseSurface">#33302A</color>
|
||||||
|
<color name="citra_inversePrimary">#F8BE00</color>
|
||||||
|
<color name="citra_shadow">#000000</color>
|
||||||
|
<color name="citra_surfaceTint">#783E00</color>
|
||||||
|
<color name="citra_outlineVariant">#D0C5B4</color>
|
||||||
|
<color name="citra_scrim">#000000</color>
|
||||||
|
|
||||||
|
</resources>
|
|
@ -1,17 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
|
|
||||||
<color name="citra_orange">#FFC303</color>
|
|
||||||
<color name="citra_orange_dark">#FF8D03</color>
|
|
||||||
<color name="citra_accent">#CC7102</color>
|
|
||||||
|
|
||||||
<color name="card_view_background">#ffffff</color>
|
|
||||||
<color name="card_view_disabled">#D5D5D5</color>
|
|
||||||
|
|
||||||
<color name="gamelist_divider">#ffffff</color>
|
|
||||||
|
|
||||||
<color name="header_text">#1C1424</color>
|
|
||||||
<color name="header_subtext">#5C5661</color>
|
|
||||||
|
|
||||||
<color name="citra_logo_text_color">@color/header_text</color>
|
|
||||||
</resources>
|
|
|
@ -1,65 +1,37 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<!-- Inherit from the material theme -->
|
|
||||||
<style name="CitraBase" parent="Theme.AppCompat.DayNight.NoActionBar">
|
|
||||||
<!-- Main theme colors -->
|
|
||||||
<!-- Branding color for the app bar -->
|
|
||||||
<item name="colorPrimary">@color/citra_orange</item>
|
|
||||||
<!-- Darker variant for the status bar and contextual app bars -->
|
|
||||||
<item name="colorPrimaryDark">@color/citra_orange_dark</item>
|
|
||||||
<item name="colorAccent">@color/citra_accent</item>
|
|
||||||
|
|
||||||
<item name="titleTextColor">@color/citra_logo_text_color</item>
|
|
||||||
|
|
||||||
<!-- Enable window content transitions -->
|
|
||||||
<item name="android:windowContentTransitions">true</item>
|
|
||||||
<item name="android:windowAllowEnterTransitionOverlap">true</item>
|
|
||||||
<item name="android:windowAllowReturnTransitionOverlap">true</item>
|
|
||||||
|
|
||||||
<item name="android:colorControlHighlight">?attr/colorAccent</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<!-- Same as above, but use default action bar, and mandate margins. -->
|
|
||||||
<style name="CitraSettingsBase" parent="Theme.AppCompat.DayNight">
|
|
||||||
<item name="colorPrimary">@color/citra_orange</item>
|
|
||||||
<item name="colorPrimaryDark">@color/citra_orange_dark</item>
|
|
||||||
<item name="colorAccent">@color/citra_accent</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<!-- Inherit from the Base Citra Dialog Theme -->
|
|
||||||
<style name="CitraEmulationBase" parent="Theme.AppCompat.DayNight">
|
|
||||||
<item name="colorPrimary">@color/citra_orange</item>
|
|
||||||
<item name="colorPrimaryDark">@color/citra_orange_dark</item>
|
|
||||||
<item name="colorAccent">@color/citra_accent</item>
|
|
||||||
<item name="android:windowTranslucentNavigation">true</item>
|
|
||||||
|
|
||||||
<item name="android:windowBackground">@android:color/black</item>
|
|
||||||
|
|
||||||
<!-- Enable window content transitions -->
|
|
||||||
<item name="android:windowContentTransitions">true</item>
|
|
||||||
<item name="android:windowAllowEnterTransitionOverlap">true</item>
|
|
||||||
<item name="android:windowAllowReturnTransitionOverlap">true</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<!-- Inherit from a base file picker theme that handles day/night -->
|
|
||||||
<style name="FilePickerTheme" parent="FilePickerBaseTheme">
|
|
||||||
<item name="colorPrimary">@color/citra_orange</item>
|
|
||||||
<item name="colorPrimaryDark">@color/citra_orange_dark</item>
|
|
||||||
<item name="colorAccent">@color/citra_accent</item>
|
|
||||||
<item name="android:windowBackground">@color/card_view_background</item>
|
|
||||||
|
|
||||||
<!-- Need to set this also to style create folder dialog -->
|
|
||||||
<item name="alertDialogTheme">@style/FilePickerAlertDialogTheme</item>
|
|
||||||
|
|
||||||
<item name="nnf_list_item_divider">@drawable/gamelist_divider</item>
|
|
||||||
<item name="nnf_toolbarTheme">@style/ThemeOverlay.AppCompat.DayNight.ActionBar</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="FilePickerAlertDialogTheme" parent="Theme.AppCompat.DayNight.Dialog.Alert">
|
<style name="FilePickerAlertDialogTheme" parent="Theme.AppCompat.DayNight.Dialog.Alert">
|
||||||
<item name="colorPrimary">@color/citra_orange</item>
|
<item name="colorPrimary">@color/citra_primary</item>
|
||||||
<item name="colorPrimaryDark">@color/citra_orange_dark</item>
|
<item name="colorPrimaryDark">@color/citra_secondary</item>
|
||||||
<item name="colorAccent">@color/citra_accent</item>
|
<item name="colorAccent">@color/citra_primaryContainer</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="CitraMaterialDialog" parent="ThemeOverlay.Material3.MaterialAlertDialog">
|
||||||
|
<item name="colorPrimary">@color/citra_surface</item>
|
||||||
|
<item name="colorSurface">@color/citra_surface</item>
|
||||||
|
<item name="colorSecondary">@color/citra_primary</item>
|
||||||
|
<item name="buttonBarPositiveButtonStyle">@style/CitraButton</item>
|
||||||
|
<item name="buttonBarNegativeButtonStyle">@style/CitraButton</item>
|
||||||
|
<item name="buttonBarNeutralButtonStyle">@style/CitraButton</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="CitraButton" parent="Widget.Material3.Button.TextButton.Dialog">
|
||||||
|
<item name="android:textColor">@color/citra_primary</item>
|
||||||
|
<item name="rippleColor">@color/citra_secondaryContainer</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="CitraShapedPopup" parent="Widget.Material3.PopupMenu">
|
||||||
|
<item name="android:popupBackground">@drawable/popup_background</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="CitraPopup" parent="ThemeOverlay.Material3">
|
||||||
|
<item name="colorPrimary">@color/citra_surface</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="CitraSlider" parent="Widget.Material3.Slider">
|
||||||
|
<item name="tickVisible">false</item>
|
||||||
|
<item name="labelBehavior">gone</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
55
src/android/app/src/main/res/values/themes.xml
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<style name="Theme.Citra.Main" parent="Theme.Material3.DayNight.NoActionBar">
|
||||||
|
<!-- Main theme colors -->
|
||||||
|
<item name="colorPrimary">@color/citra_primary</item>
|
||||||
|
<item name="colorOnPrimary">@color/citra_onPrimary</item>
|
||||||
|
<item name="colorPrimaryContainer">@color/citra_primaryContainer</item>
|
||||||
|
<item name="colorOnPrimaryContainer">@color/citra_onPrimaryContainer</item>
|
||||||
|
<item name="colorSecondary">@color/citra_secondary</item>
|
||||||
|
<item name="colorOnSecondary">@color/citra_onSecondary</item>
|
||||||
|
<item name="colorSecondaryContainer">@color/citra_secondaryContainer</item>
|
||||||
|
<item name="colorOnSecondaryContainer">@color/citra_onSecondaryContainer</item>
|
||||||
|
<item name="colorTertiary">@color/citra_tertiary</item>
|
||||||
|
<item name="colorOnTertiary">@color/citra_onTertiary</item>
|
||||||
|
<item name="colorTertiaryContainer">@color/citra_tertiaryContainer</item>
|
||||||
|
<item name="colorOnTertiaryContainer">@color/citra_onTertiaryContainer</item>
|
||||||
|
<item name="colorError">@color/citra_error</item>
|
||||||
|
<item name="colorErrorContainer">@color/citra_errorContainer</item>
|
||||||
|
<item name="colorOnError">@color/citra_onError</item>
|
||||||
|
<item name="colorOnErrorContainer">@color/citra_onErrorContainer</item>
|
||||||
|
<item name="android:colorBackground">@color/citra_background</item>
|
||||||
|
<item name="colorOnBackground">@color/citra_onBackground</item>
|
||||||
|
<item name="colorSurface">@color/citra_surface</item>
|
||||||
|
<item name="colorOnSurface">@color/citra_onSurface</item>
|
||||||
|
<item name="colorSurfaceVariant">@color/citra_surfaceVariant</item>
|
||||||
|
<item name="colorOnSurfaceVariant">@color/citra_onSurfaceVariant</item>
|
||||||
|
<item name="colorOutline">@color/citra_outline</item>
|
||||||
|
<item name="colorOnSurfaceInverse">@color/citra_inverseOnSurface</item>
|
||||||
|
<item name="colorSurfaceInverse">@color/citra_inverseSurface</item>
|
||||||
|
<item name="colorPrimaryInverse">@color/citra_inversePrimary</item>
|
||||||
|
|
||||||
|
<item name="homeAsUpIndicator">@drawable/ic_back</item>
|
||||||
|
<item name="android:statusBarColor">@color/citra_surface</item>
|
||||||
|
<item name="android:textColorLink">@color/citra_primary</item>
|
||||||
|
<item name="materialAlertDialogTheme">@style/CitraMaterialDialog</item>
|
||||||
|
<item name="popupMenuStyle">@style/CitraShapedPopup</item>
|
||||||
|
<item name="popupTheme">@style/CitraPopup</item>
|
||||||
|
<item name="sliderStyle">@style/CitraSlider</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- Inherit from a base file picker theme that handles day/night -->
|
||||||
|
<style name="FilePickerTheme" parent="FilePickerBaseTheme">
|
||||||
|
<item name="colorPrimary">@color/citra_primary</item>
|
||||||
|
<item name="colorPrimaryDark">@color/citra_primary</item>
|
||||||
|
<item name="colorAccent">@color/citra_primary</item>
|
||||||
|
|
||||||
|
<!-- Need to set this also to style create folder dialog -->
|
||||||
|
<item name="alertDialogTheme">@style/FilePickerAlertDialogTheme</item>
|
||||||
|
|
||||||
|
<item name="nnf_list_item_divider">@drawable/gamelist_divider</item>
|
||||||
|
<item name="nnf_toolbarTheme">@style/ThemeOverlay.AppCompat.DayNight.ActionBar</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|