[Physical Keyboard] Move Dialog to DialogFragment

Move Bounce key and Slow key Dialog to DialogFragment, dialog will not
be dismissed when screen rotate.

Bug: 390243451
Bug: 374037603
Flag: com.android.settings.keyboard.keyboard_and_touchpad_a11y_new_page_enabled
Test: atest
packages/apps/Settings/tests/robotests/src/com/android/settings/inputmethod/

Change-Id: Ide87dbf8214f411941114281e7a5e8c81f75bdd4
This commit is contained in:
shaoweishen
2025-01-20 08:27:54 +00:00
parent cb071420a6
commit 120b2d46f7
11 changed files with 555 additions and 200 deletions

View File

@@ -25,36 +25,29 @@ import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
import android.view.View;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.SeekBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
import com.android.settings.keyboard.Flags;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.text.NumberFormat;
import java.util.concurrent.TimeUnit;
/**
* Abstract class for toggle controllers of Keyboard input setting related function.
*/
public abstract class InputSettingPreferenceController extends TogglePreferenceController implements
LifecycleObserver {
private static final int CUSTOM_PROGRESS_INTERVAL = 100;
private static final long MILLISECOND_IN_SECONDS = TimeUnit.SECONDS.toMillis(1);
private final ContentResolver mContentResolver;
protected final MetricsFeatureProvider mMetricsFeatureProvider;
protected FragmentManager mFragmentManager;
private final ContentObserver mContentObserver = new ContentObserver(new Handler(true)) {
@Override
public void onChange(boolean selfChange, Uri uri) {
@@ -72,13 +65,6 @@ public abstract class InputSettingPreferenceController extends TogglePreferenceC
protected void updateInputSettingKeysValue(int thresholdTimeMillis) {
}
protected int getInputSettingKeysValue() {
return 0;
}
protected void onCustomValueUpdated(int thresholdTimeMillis) {
}
public InputSettingPreferenceController(@NonNull Context context,
@NonNull String preferenceKey) {
super(context, preferenceKey);
@@ -86,6 +72,10 @@ public abstract class InputSettingPreferenceController extends TogglePreferenceC
mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
}
public void setFragment(Fragment fragment) {
mFragmentManager = fragment.getParentFragmentManager();
}
@Override
public void updateState(@NonNull Preference preference) {
super.updateState(preference);
@@ -127,113 +117,4 @@ public abstract class InputSettingPreferenceController extends TogglePreferenceC
private void unregisterSettingsObserver() {
mContentResolver.unregisterContentObserver(mContentObserver);
}
protected void constructDialog(Context context, int titleRes, int subtitleRes) {
mAlertDialog = new AlertDialog.Builder(context)
.setView(R.layout.dialog_keyboard_a11y_input_setting_keys)
.setPositiveButton(android.R.string.ok,
(dialog, which) -> {
RadioGroup radioGroup =
mAlertDialog.findViewById(
R.id.input_setting_keys_value_group);
SeekBar seekbar = mAlertDialog.findViewById(
R.id.input_setting_keys_value_custom_slider);
RadioButton customRadioButton = mAlertDialog.findViewById(
R.id.input_setting_keys_value_custom);
int threshold;
if (customRadioButton.isChecked()) {
threshold = seekbar.getProgress() * CUSTOM_PROGRESS_INTERVAL;
} else {
int checkedRadioButtonId = radioGroup.getCheckedRadioButtonId();
if (checkedRadioButtonId == R.id.input_setting_keys_value_600) {
threshold = 600;
} else if (checkedRadioButtonId
== R.id.input_setting_keys_value_400) {
threshold = 400;
} else if (checkedRadioButtonId
== R.id.input_setting_keys_value_200) {
threshold = 200;
} else {
threshold = 0;
}
}
updateInputSettingKeysValue(threshold);
onCustomValueUpdated(threshold);
})
.setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
.create();
mAlertDialog.setOnShowListener(dialog -> {
RadioGroup cannedValueRadioGroup = mAlertDialog.findViewById(
R.id.input_setting_keys_value_group);
RadioButton customRadioButton = mAlertDialog.findViewById(
R.id.input_setting_keys_value_custom);
TextView customValueTextView = mAlertDialog.findViewById(
R.id.input_setting_keys_value_custom_value);
SeekBar customProgressBar = mAlertDialog.findViewById(
R.id.input_setting_keys_value_custom_slider);
TextView titleTextView = mAlertDialog.findViewById(
R.id.input_setting_keys_dialog_title);
TextView subTitleTextView = mAlertDialog.findViewById(
R.id.input_setting_keys_dialog_subtitle);
titleTextView.setText(titleRes);
subTitleTextView.setText(subtitleRes);
customProgressBar.incrementProgressBy(CUSTOM_PROGRESS_INTERVAL);
customProgressBar.setProgress(1);
View customValueView = mAlertDialog.findViewById(
R.id.input_setting_keys_custom_value_option);
customValueView.setOnClickListener(l -> customRadioButton.performClick());
customRadioButton.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
cannedValueRadioGroup.clearCheck();
}
customValueTextView.setVisibility(isChecked ? View.VISIBLE : View.GONE);
customValueTextView.setText(
progressToThresholdInSecond(customProgressBar.getProgress()));
customProgressBar.setVisibility(isChecked ? View.VISIBLE : View.GONE);
buttonView.setChecked(isChecked);
});
cannedValueRadioGroup.setOnCheckedChangeListener(
(group, checkedId) -> customRadioButton.setChecked(false));
customProgressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
customValueTextView.setText(progressToThresholdInSecond(progress));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
initStateBasedOnThreshold(cannedValueRadioGroup, customRadioButton, customValueTextView,
customProgressBar);
});
}
private static String progressToThresholdInSecond(int progress) {
return NumberFormat.getInstance().format((float) progress * CUSTOM_PROGRESS_INTERVAL
/ MILLISECOND_IN_SECONDS);
}
private void initStateBasedOnThreshold(RadioGroup cannedValueRadioGroup,
RadioButton customRadioButton, TextView customValueTextView,
SeekBar customProgressBar) {
int inputSettingKeysThreshold = getInputSettingKeysValue();
switch (inputSettingKeysThreshold) {
case 600 -> cannedValueRadioGroup.check(R.id.input_setting_keys_value_600);
case 400 -> cannedValueRadioGroup.check(R.id.input_setting_keys_value_400);
case 0, 200 -> cannedValueRadioGroup.check(R.id.input_setting_keys_value_200);
default -> {
customValueTextView.setText(
String.valueOf(
(double) inputSettingKeysThreshold / MILLISECOND_IN_SECONDS));
customProgressBar.setProgress(inputSettingKeysThreshold / CUSTOM_PROGRESS_INTERVAL);
customRadioButton.setChecked(true);
}
}
}
}