Loading res/layout/dialog_a11y_bounce_key.xml +59 −8 Original line number Diff line number Diff line Loading @@ -56,28 +56,79 @@ android:id="@+id/bounce_key_value_200" android:text="@string/bounce_keys_dialog_option_200" android:paddingStart="12dp" android:layout_width="wrap_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_gravity="start|center_vertical" android:background="@null"/> <RadioButton android:id="@+id/bounce_key_value_400" android:text="@string/bounce_keys_dialog_option_400" android:paddingStart="12dp" android:layout_width="wrap_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="16dp" android:layout_gravity="start|center_vertical" android:layout_marginTop="12dp" android:background="@null"/> <RadioButton android:id="@+id/bounce_key_value_600" android:text="@string/bounce_keys_dialog_option_600" android:paddingStart="12dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="start|center_vertical" android:layout_marginTop="12dp" android:background="@null"/> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginVertical="12dp"> <RadioButton android:id="@+id/bounce_key_value_custom" android:paddingStart="12dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="16dp" android:background="@null"/> <LinearLayout android:id="@+id/custom_value_option" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:gravity="center_vertical" android:paddingEnd="16dp"> <TextView android:id="@+id/bounce_key_value_custom_title" android:text="Custom" android:textColor="?android:attr/textColorPrimary" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical"/> <TextView android:id="@+id/bounce_key_value_custom_value" android:text="custom value" android:textColor="?android:attr/textColorPrimary" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="8dp" android:visibility="gone"/> <SeekBar android:id="@+id/bounce_key_value_custom_slider" android:paddingStart="8dp" android:paddingEnd="36dp" android:min="1" android:max="50" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="8dp" android:visibility="gone" android:background="@null"/> </LinearLayout> </LinearLayout> </RadioGroup> </LinearLayout> No newline at end of file src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysController.java +85 −13 Original line number Diff line number Diff line Loading @@ -21,7 +21,11 @@ import android.hardware.input.InputSettings; import android.net.Uri; import android.provider.Settings; import android.text.TextUtils; 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.annotation.Nullable; Loading @@ -33,9 +37,13 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settingslib.PrimarySwitchPreference; import java.util.concurrent.TimeUnit; public class KeyboardAccessibilityBounceKeysController extends InputSettingPreferenceController implements LifecycleObserver { private static final int CUSTOM_PROGRESS_INTERVAL = 100; private static final long MILLISECOND_IN_SECONDS = TimeUnit.SECONDS.toMillis(1); public static final int BOUNCE_KEYS_THRESHOLD = 500; private AlertDialog mAlertDialog; Loading @@ -62,7 +70,7 @@ public class KeyboardAccessibilityBounceKeysController extends } @Override public boolean handlePreferenceTreeClick(Preference preference) { public boolean handlePreferenceTreeClick(@NonNull Preference preference) { if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) { return false; } Loading Loading @@ -105,23 +113,87 @@ public class KeyboardAccessibilityBounceKeysController extends (dialog, which) -> { RadioGroup radioGroup = mAlertDialog.findViewById(R.id.bounce_key_value_group); SeekBar seekbar = mAlertDialog.findViewById( R.id.bounce_key_value_custom_slider); RadioButton customRadioButton = mAlertDialog.findViewById( R.id.bounce_key_value_custom); int threshold; if (customRadioButton.isChecked()) { threshold = seekbar.getProgress() * CUSTOM_PROGRESS_INTERVAL; } else { int checkedRadioButtonId = radioGroup.getCheckedRadioButtonId(); int threshold = checkedRadioButtonId == R.id.bounce_key_value_600 ? 600 threshold = checkedRadioButtonId == R.id.bounce_key_value_600 ? 600 : checkedRadioButtonId == R.id.bounce_key_value_400 ? 400 : checkedRadioButtonId == R.id.bounce_key_value_200 ? 200 : 0; } InputSettings.setAccessibilityBounceKeysThreshold(context, threshold); }) .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss()) .create(); mAlertDialog.setOnShowListener(dialog -> { RadioGroup radioGroup = mAlertDialog.findViewById(R.id.bounce_key_value_group); int bounceKeysThreshold = InputSettings.getAccessibilityBounceKeysThreshold(context); switch (bounceKeysThreshold) { case 600 -> radioGroup.check(R.id.bounce_key_value_600); case 400 -> radioGroup.check(R.id.bounce_key_value_400); default -> radioGroup.check(R.id.bounce_key_value_200); RadioGroup cannedValueRadioGroup = mAlertDialog.findViewById( R.id.bounce_key_value_group); RadioButton customRadioButton = mAlertDialog.findViewById(R.id.bounce_key_value_custom); TextView customValueTextView = mAlertDialog.findViewById( R.id.bounce_key_value_custom_value); SeekBar customProgressBar = mAlertDialog.findViewById( R.id.bounce_key_value_custom_slider); customProgressBar.incrementProgressBy(CUSTOM_PROGRESS_INTERVAL); customProgressBar.setProgress(1); View customValueView = mAlertDialog.findViewById(R.id.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 String.valueOf((double) progress * CUSTOM_PROGRESS_INTERVAL / MILLISECOND_IN_SECONDS); } private void initStateBasedOnThreshold(RadioGroup cannedValueRadioGroup, RadioButton customRadioButton, TextView customValueTextView, SeekBar customProgressBar) { int bounceKeysThreshold = InputSettings.getAccessibilityBounceKeysThreshold(mContext); switch (bounceKeysThreshold) { case 600 -> cannedValueRadioGroup.check(R.id.bounce_key_value_600); case 400 -> cannedValueRadioGroup.check(R.id.bounce_key_value_400); case 0, 200 -> cannedValueRadioGroup.check(R.id.bounce_key_value_200); default -> { customValueTextView.setText( String.valueOf( (double) bounceKeysThreshold / MILLISECOND_IN_SECONDS)); customProgressBar.setProgress(bounceKeysThreshold / CUSTOM_PROGRESS_INTERVAL); customRadioButton.setChecked(true); } } } } Loading
res/layout/dialog_a11y_bounce_key.xml +59 −8 Original line number Diff line number Diff line Loading @@ -56,28 +56,79 @@ android:id="@+id/bounce_key_value_200" android:text="@string/bounce_keys_dialog_option_200" android:paddingStart="12dp" android:layout_width="wrap_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_gravity="start|center_vertical" android:background="@null"/> <RadioButton android:id="@+id/bounce_key_value_400" android:text="@string/bounce_keys_dialog_option_400" android:paddingStart="12dp" android:layout_width="wrap_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="16dp" android:layout_gravity="start|center_vertical" android:layout_marginTop="12dp" android:background="@null"/> <RadioButton android:id="@+id/bounce_key_value_600" android:text="@string/bounce_keys_dialog_option_600" android:paddingStart="12dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="start|center_vertical" android:layout_marginTop="12dp" android:background="@null"/> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginVertical="12dp"> <RadioButton android:id="@+id/bounce_key_value_custom" android:paddingStart="12dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="16dp" android:background="@null"/> <LinearLayout android:id="@+id/custom_value_option" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:gravity="center_vertical" android:paddingEnd="16dp"> <TextView android:id="@+id/bounce_key_value_custom_title" android:text="Custom" android:textColor="?android:attr/textColorPrimary" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical"/> <TextView android:id="@+id/bounce_key_value_custom_value" android:text="custom value" android:textColor="?android:attr/textColorPrimary" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="8dp" android:visibility="gone"/> <SeekBar android:id="@+id/bounce_key_value_custom_slider" android:paddingStart="8dp" android:paddingEnd="36dp" android:min="1" android:max="50" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="8dp" android:visibility="gone" android:background="@null"/> </LinearLayout> </LinearLayout> </RadioGroup> </LinearLayout> No newline at end of file
src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysController.java +85 −13 Original line number Diff line number Diff line Loading @@ -21,7 +21,11 @@ import android.hardware.input.InputSettings; import android.net.Uri; import android.provider.Settings; import android.text.TextUtils; 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.annotation.Nullable; Loading @@ -33,9 +37,13 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settingslib.PrimarySwitchPreference; import java.util.concurrent.TimeUnit; public class KeyboardAccessibilityBounceKeysController extends InputSettingPreferenceController implements LifecycleObserver { private static final int CUSTOM_PROGRESS_INTERVAL = 100; private static final long MILLISECOND_IN_SECONDS = TimeUnit.SECONDS.toMillis(1); public static final int BOUNCE_KEYS_THRESHOLD = 500; private AlertDialog mAlertDialog; Loading @@ -62,7 +70,7 @@ public class KeyboardAccessibilityBounceKeysController extends } @Override public boolean handlePreferenceTreeClick(Preference preference) { public boolean handlePreferenceTreeClick(@NonNull Preference preference) { if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) { return false; } Loading Loading @@ -105,23 +113,87 @@ public class KeyboardAccessibilityBounceKeysController extends (dialog, which) -> { RadioGroup radioGroup = mAlertDialog.findViewById(R.id.bounce_key_value_group); SeekBar seekbar = mAlertDialog.findViewById( R.id.bounce_key_value_custom_slider); RadioButton customRadioButton = mAlertDialog.findViewById( R.id.bounce_key_value_custom); int threshold; if (customRadioButton.isChecked()) { threshold = seekbar.getProgress() * CUSTOM_PROGRESS_INTERVAL; } else { int checkedRadioButtonId = radioGroup.getCheckedRadioButtonId(); int threshold = checkedRadioButtonId == R.id.bounce_key_value_600 ? 600 threshold = checkedRadioButtonId == R.id.bounce_key_value_600 ? 600 : checkedRadioButtonId == R.id.bounce_key_value_400 ? 400 : checkedRadioButtonId == R.id.bounce_key_value_200 ? 200 : 0; } InputSettings.setAccessibilityBounceKeysThreshold(context, threshold); }) .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss()) .create(); mAlertDialog.setOnShowListener(dialog -> { RadioGroup radioGroup = mAlertDialog.findViewById(R.id.bounce_key_value_group); int bounceKeysThreshold = InputSettings.getAccessibilityBounceKeysThreshold(context); switch (bounceKeysThreshold) { case 600 -> radioGroup.check(R.id.bounce_key_value_600); case 400 -> radioGroup.check(R.id.bounce_key_value_400); default -> radioGroup.check(R.id.bounce_key_value_200); RadioGroup cannedValueRadioGroup = mAlertDialog.findViewById( R.id.bounce_key_value_group); RadioButton customRadioButton = mAlertDialog.findViewById(R.id.bounce_key_value_custom); TextView customValueTextView = mAlertDialog.findViewById( R.id.bounce_key_value_custom_value); SeekBar customProgressBar = mAlertDialog.findViewById( R.id.bounce_key_value_custom_slider); customProgressBar.incrementProgressBy(CUSTOM_PROGRESS_INTERVAL); customProgressBar.setProgress(1); View customValueView = mAlertDialog.findViewById(R.id.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 String.valueOf((double) progress * CUSTOM_PROGRESS_INTERVAL / MILLISECOND_IN_SECONDS); } private void initStateBasedOnThreshold(RadioGroup cannedValueRadioGroup, RadioButton customRadioButton, TextView customValueTextView, SeekBar customProgressBar) { int bounceKeysThreshold = InputSettings.getAccessibilityBounceKeysThreshold(mContext); switch (bounceKeysThreshold) { case 600 -> cannedValueRadioGroup.check(R.id.bounce_key_value_600); case 400 -> cannedValueRadioGroup.check(R.id.bounce_key_value_400); case 0, 200 -> cannedValueRadioGroup.check(R.id.bounce_key_value_200); default -> { customValueTextView.setText( String.valueOf( (double) bounceKeysThreshold / MILLISECOND_IN_SECONDS)); customProgressBar.setProgress(bounceKeysThreshold / CUSTOM_PROGRESS_INTERVAL); customRadioButton.setChecked(true); } } } }