diff --git a/res/layout/dialog_a11y_bounce_key.xml b/res/layout/dialog_a11y_bounce_key.xml
index 7e23692..da3ebde 100644
--- a/res/layout/dialog_a11y_bounce_key.xml
+++ b/res/layout/dialog_a11y_bounce_key.xml
@@ -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="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"/>
+
+        <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: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
diff --git a/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysController.java b/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysController.java
index 559b2e4..1652f00 100644
--- a/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysController.java
+++ b/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysController.java
@@ -21,7 +21,11 @@
 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;
@@ -33,9 +37,13 @@
 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;
@@ -62,7 +70,7 @@
     }
 
     @Override
-    public boolean handlePreferenceTreeClick(Preference preference) {
+    public boolean handlePreferenceTreeClick(@NonNull Preference preference) {
         if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
             return false;
         }
@@ -105,23 +113,87 @@
                         (dialog, which) -> {
                             RadioGroup radioGroup =
                                     mAlertDialog.findViewById(R.id.bounce_key_value_group);
-                            int checkedRadioButtonId = radioGroup.getCheckedRadioButtonId();
-                            int 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;
+                            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();
+                                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);
+            }
+        }
+    }
 }
