android/swkbd: Fix rotation crash
Create a new DialogFragment to manage the dialog's state. Also replaced AlertDialog with the androidx one which arguably looks better.
This commit is contained in:
parent
0ffbc02b64
commit
75fe220843
@ -4,8 +4,10 @@
|
|||||||
|
|
||||||
package org.citra.citra_emu.applets;
|
package org.citra.citra_emu.applets;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.Activity;
|
||||||
|
import android.app.Dialog;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
|
import android.os.Bundle;
|
||||||
import android.text.InputFilter;
|
import android.text.InputFilter;
|
||||||
import android.text.Spanned;
|
import android.text.Spanned;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@ -18,7 +20,12 @@ 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.utils.Log;
|
import org.citra.citra_emu.utils.Log;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
import androidx.fragment.app.DialogFragment;
|
||||||
|
|
||||||
public final class SoftwareKeyboard {
|
public final class SoftwareKeyboard {
|
||||||
/// Corresponds to Frontend::ButtonConfig
|
/// Corresponds to Frontend::ButtonConfig
|
||||||
@ -48,7 +55,7 @@ public final class SoftwareKeyboard {
|
|||||||
EmptyInputNotAllowed,
|
EmptyInputNotAllowed,
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class KeyboardConfig {
|
public static class KeyboardConfig implements java.io.Serializable {
|
||||||
public int button_config;
|
public int button_config;
|
||||||
public int max_text_length;
|
public int max_text_length;
|
||||||
public boolean multiline_mode; /// True if the keyboard accepts multiple lines of input
|
public boolean multiline_mode; /// True if the keyboard accepts multiple lines of input
|
||||||
@ -81,13 +88,20 @@ public final class SoftwareKeyboard {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static KeyboardData data;
|
public static class KeyboardDialogFragment extends DialogFragment {
|
||||||
private static final Object finishLock = new Object();
|
static KeyboardDialogFragment newInstance(KeyboardConfig config) {
|
||||||
|
KeyboardDialogFragment frag = new KeyboardDialogFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putSerializable("config", config);
|
||||||
|
frag.setArguments(args);
|
||||||
|
return frag;
|
||||||
|
}
|
||||||
|
|
||||||
private static void ExecuteImpl(KeyboardConfig config) {
|
@NonNull
|
||||||
final EmulationActivity emulationActivity = NativeLibrary.sEmulationActivity.get();
|
@Override
|
||||||
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
data = new KeyboardData(0, "");
|
final Activity emulationActivity = getActivity();
|
||||||
|
assert emulationActivity != null;
|
||||||
|
|
||||||
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
|
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
|
||||||
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||||
@ -95,13 +109,16 @@ public final class SoftwareKeyboard {
|
|||||||
CitraApplication.getAppContext().getResources().getDimensionPixelSize(
|
CitraApplication.getAppContext().getResources().getDimensionPixelSize(
|
||||||
R.dimen.dialog_margin);
|
R.dimen.dialog_margin);
|
||||||
|
|
||||||
|
KeyboardConfig config = Objects.requireNonNull(
|
||||||
|
(KeyboardConfig)Objects.requireNonNull(getArguments()).getSerializable("config"));
|
||||||
|
|
||||||
// Set up the input
|
// Set up the input
|
||||||
EditText editText = new EditText(CitraApplication.getAppContext());
|
EditText editText = new EditText(CitraApplication.getAppContext());
|
||||||
editText.setHint(config.hint_text);
|
editText.setHint(config.hint_text);
|
||||||
editText.setSingleLine(!config.multiline_mode);
|
editText.setSingleLine(!config.multiline_mode);
|
||||||
editText.setLayoutParams(params);
|
editText.setLayoutParams(params);
|
||||||
editText.setFilters(
|
editText.setFilters(new InputFilter[] {
|
||||||
new InputFilter[] {new Filter(), new InputFilter.LengthFilter(config.max_text_length)});
|
new Filter(), new InputFilter.LengthFilter(config.max_text_length)});
|
||||||
|
|
||||||
FrameLayout container = new FrameLayout(emulationActivity);
|
FrameLayout container = new FrameLayout(emulationActivity);
|
||||||
container.addView(editText);
|
container.addView(editText);
|
||||||
@ -136,12 +153,11 @@ public final class SoftwareKeyboard {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final AlertDialog dialog = builder.create();
|
final AlertDialog dialog = builder.create();
|
||||||
dialog.show();
|
dialog.create();
|
||||||
if (dialog.getButton(DialogInterface.BUTTON_POSITIVE) != null) {
|
if (dialog.getButton(DialogInterface.BUTTON_POSITIVE) != null) {
|
||||||
dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener((view) -> {
|
dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener((view) -> {
|
||||||
data.button = config.button_config;
|
data.button = config.button_config;
|
||||||
data.text = editText.getText().toString();
|
data.text = editText.getText().toString();
|
||||||
|
|
||||||
final ValidationError error = ValidateInput(data.text);
|
final ValidationError error = ValidateInput(data.text);
|
||||||
if (error != ValidationError.None) {
|
if (error != ValidationError.None) {
|
||||||
HandleValidationError(config, error);
|
HandleValidationError(config, error);
|
||||||
@ -173,6 +189,21 @@ public final class SoftwareKeyboard {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return dialog;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static KeyboardData data;
|
||||||
|
private static final Object finishLock = new Object();
|
||||||
|
|
||||||
|
private static void ExecuteImpl(KeyboardConfig config) {
|
||||||
|
final EmulationActivity emulationActivity = NativeLibrary.sEmulationActivity.get();
|
||||||
|
|
||||||
|
data = new KeyboardData(0, "");
|
||||||
|
|
||||||
|
KeyboardDialogFragment fragment = KeyboardDialogFragment.newInstance(config);
|
||||||
|
fragment.show(emulationActivity.getSupportFragmentManager(), "keyboard");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void HandleValidationError(KeyboardConfig config, ValidationError error) {
|
private static void HandleValidationError(KeyboardConfig config, ValidationError error) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user