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:
zhupengfei 2020-04-04 01:18:30 +08:00 committed by bunnei
parent 0ffbc02b64
commit 75fe220843

View File

@ -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) {