Revert "Revert "Add sensitivity configuration to long press power dialog""

This reverts commit c4084d41414af8fdcbd797daedfcdff99eb87d06.

Reason for revert: Dependant change has now successfully been propagated to sc-v2-dev child graphs

Change-Id: I1f6126a423c72540d219b99e20b464b51ef65923
diff --git a/res/layout/preference_labeled_slider.xml b/res/layout/preference_labeled_slider.xml
index 75902cf..f120a44 100644
--- a/res/layout/preference_labeled_slider.xml
+++ b/res/layout/preference_labeled_slider.xml
@@ -37,9 +37,18 @@
         android:textAppearance="?android:attr/textAppearanceListItem"
         android:textColor="?android:attr/textColorPrimary" />
 
+    <TextView
+        android:id="@android:id/summary"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@android:id/title"
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textAlignment="viewStart"
+        android:textColor="?android:attr/textColorSecondary" />
+
     <SeekBar
         android:id="@*android:id/seekbar"
-        android:layout_below="@android:id/title"
+        android:layout_below="@android:id/summary"
         android:layout_gravity="center_vertical"
         android:layout_width="match_parent"
         android:layout_height="48dp"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 044d30f..6ca7f93 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -13220,6 +13220,15 @@
     <!-- Power menu explanation where to find prevent ringing option. [CHAR LIMIT=NONE] -->
     <string name="power_menu_power_prevent_ringing_hint">Prevent ringing:\nShortcut available in the volume menu.</string>
 
+    <!-- Power menu title of the seekbar setting controlling duration of how long the power button must be held to invoke assistant. [CHAR LIMIT=NONE]-->
+    <string name="power_menu_long_press_for_assist_sensitivity_title">Press &amp; hold duration</string>
+    <!-- Power menu summary of the seekbar setting controlling duration of how long the power button must be held to invoke assistant. [CHAR LIMIT=NONE]-->
+    <string name="power_menu_long_press_for_assist_sensitivity_summary">Adjust sensitivity by choosing how long to press &amp; hold the power button</string>
+    <!-- Label at the lowest end of duration slider for long press power invocation of assistant. [CHAR LIMIT=30] -->
+    <string name="power_menu_long_press_for_assist_sensitivity_low_label">Short</string>
+    <!-- Label at the highest end of duration slider for long press power invocation of assistant. [CHAR LIMIT=30] -->
+    <string name="power_menu_long_press_for_assist_sensitivity_high_label">Long</string>
+
     <!-- Wallet (formerly Cards and passes) toggle name [CHAR LIMIT=60] -->
     <string name="lockscreen_privacy_wallet_setting_toggle">Show wallet</string>
     <!-- Wallet (formerly Cards and passes) summary [CHAR LIMIT=NONE] -->
diff --git a/res/xml/power_menu_settings.xml b/res/xml/power_menu_settings.xml
index caaeb97..121a2da 100644
--- a/res/xml/power_menu_settings.xml
+++ b/res/xml/power_menu_settings.xml
@@ -22,11 +22,21 @@
         android:title="@string/power_menu_long_press_for_assist"
         android:summary="@string/power_menu_long_press_for_assist_summary"
         settings:controller="com.android.settings.gestures.LongPressPowerButtonPreferenceController"
-        />
+    />
+
+    <com.android.settings.widget.LabeledSeekBarPreference
+        android:key="gesture_power_menu_long_press_for_assist_sensitivity"
+        android:title="@string/power_menu_long_press_for_assist_sensitivity_title"
+        android:summary="@string/power_menu_long_press_for_assist_sensitivity_summary"
+        android:selectable="true"
+        settings:textStart="@string/power_menu_long_press_for_assist_sensitivity_low_label"
+        settings:textEnd="@string/power_menu_long_press_for_assist_sensitivity_high_label"
+        settings:controller="com.android.settings.gestures.LongPressPowerSensitivityPreferenceController"
+    />
 
     <com.android.settingslib.widget.FooterPreference
         android:key="power_menu_power_volume_up_hint"
         android:title="@string/power_menu_power_volume_up_hint"
         android:selectable="false"
-        settings:searchable="false" />
+        settings:searchable="false"/>
 </PreferenceScreen>
diff --git a/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java b/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java
index a52be15..44494ee 100644
--- a/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java
+++ b/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java
@@ -16,6 +16,11 @@
 
 package com.android.settings.gestures;
 
+import static com.android.settings.gestures.PowerMenuSettingsUtils.LONG_PRESS_POWER_ASSISTANT_VALUE;
+import static com.android.settings.gestures.PowerMenuSettingsUtils.LONG_PRESS_POWER_GLOBAL_ACTIONS;
+import static com.android.settings.gestures.PowerMenuSettingsUtils.POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE;
+import static com.android.settings.gestures.PowerMenuSettingsUtils.POWER_BUTTON_LONG_PRESS_SETTING;
+
 import android.content.Context;
 import android.provider.Settings;
 
@@ -33,8 +38,6 @@
  */
 public class LongPressPowerButtonPreferenceController extends TogglePreferenceController {
 
-    private static final String POWER_BUTTON_LONG_PRESS_SETTING =
-            Settings.Global.POWER_BUTTON_LONG_PRESS;
     private static final String KEY_CHORD_POWER_VOLUME_UP_SETTING =
             Settings.Global.KEY_CHORD_POWER_VOLUME_UP;
 
@@ -42,19 +45,6 @@
     private static final String ASSIST_SWITCH_KEY = "gesture_power_menu_long_press_for_assist";
 
     /**
-     * Values used for long press power button behaviour when Assist setting is enabled.
-     *
-     * {@link com.android.server.policy.PhoneWindowManager#LONG_PRESS_POWER_GLOBAL_ACTIONS} for
-     * source of the value.
-     */
-    @VisibleForTesting
-    static final int LONG_PRESS_POWER_NO_ACTION = 0;
-    @VisibleForTesting
-    static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
-    @VisibleForTesting
-    static final int LONG_PRESS_POWER_ASSISTANT_VALUE = 5; // Settings.Secure.ASSISTANT
-
-    /**
      * Values used for volume key chord behaviour when Assist setting is enabled.
      *
      * Values based on config_keyChordPowerVolumeUp in
@@ -67,15 +57,6 @@
     @VisibleForTesting
     static final int KEY_CHORD_POWER_VOLUME_UP_GLOBAL_ACTIONS = 2;
 
-    /**
-     * Value used for long press power button behaviour when the Assist setting is disabled.
-     *
-     * If this value matches Assist setting, then it falls back to Global Actions panel or
-     * power menu, depending on their respective settings.
-     */
-    private static final int POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE =
-            com.android.internal.R.integer.config_longPressOnPowerBehavior;
-
     private static final int KEY_CHORD_POWER_VOLUME_UP_DEFAULT_VALUE_RESOURCE =
             com.android.internal.R.integer.config_keyChordPowerVolumeUp;
 
@@ -101,7 +82,7 @@
 
     @Override
     public CharSequence getSummary() {
-        final int powerButtonValue = getPowerButtonValue();
+        final int powerButtonValue = PowerMenuSettingsUtils.getPowerButtonSettingValue(mContext);
         if (powerButtonValue == LONG_PRESS_POWER_ASSISTANT_VALUE) {
             return mContext.getString(R.string.power_menu_summary_long_press_for_assist_enabled);
         } else if (powerButtonValue == LONG_PRESS_POWER_GLOBAL_ACTIONS) {
@@ -122,7 +103,7 @@
 
     @Override
     public boolean isChecked() {
-        return getPowerButtonValue() == LONG_PRESS_POWER_ASSISTANT_VALUE;
+        return PowerMenuSettingsUtils.isLongPressPowerForAssistEnabled(mContext);
     }
 
     @Override
@@ -159,12 +140,6 @@
         }
     }
 
-    private int getPowerButtonValue() {
-        return Settings.Global.getInt(mContext.getContentResolver(),
-                POWER_BUTTON_LONG_PRESS_SETTING,
-                mContext.getResources().getInteger(POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE));
-    }
-
     private static boolean isPowerMenuKeyChordEnabled(Context context) {
         return Settings.Global.getInt(context.getContentResolver(),
                 KEY_CHORD_POWER_VOLUME_UP_SETTING,
diff --git a/src/com/android/settings/gestures/LongPressPowerSensitivityPreferenceController.java b/src/com/android/settings/gestures/LongPressPowerSensitivityPreferenceController.java
new file mode 100644
index 0000000..a1d681c
--- /dev/null
+++ b/src/com/android/settings/gestures/LongPressPowerSensitivityPreferenceController.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.gestures;
+
+import android.content.Context;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.provider.Settings;
+
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.SliderPreferenceController;
+import com.android.settings.widget.LabeledSeekBarPreference;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
+
+/** Handles changes to the long press power button sensitivity slider. */
+public class LongPressPowerSensitivityPreferenceController extends
+        SliderPreferenceController implements
+        LifecycleObserver, OnStart, OnStop {
+
+    private final ContentObserver mPowerButtonObserver = new ContentObserver(Handler.getMain()) {
+        @Override
+        public void onChange(boolean selfChange) {
+            if (mPreference != null) {
+                updateState(mPreference);
+            }
+        }
+    };
+
+    @Nullable
+    private final int[] mSensitivityValues;
+
+    @Nullable
+    private LabeledSeekBarPreference mPreference;
+
+    public LongPressPowerSensitivityPreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
+        mSensitivityValues = context.getResources().getIntArray(
+                com.android.internal.R.array.config_longPressOnPowerDurationSettings);
+    }
+
+    @Override
+    public void onStart() {
+        mContext.getContentResolver().registerContentObserver(
+                Settings.Global.getUriFor(PowerMenuSettingsUtils.POWER_BUTTON_LONG_PRESS_SETTING),
+                false, mPowerButtonObserver);
+    }
+
+    @Override
+    public void onStop() {
+        mContext.getContentResolver().unregisterContentObserver(mPowerButtonObserver);
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPreference = screen.findPreference(getPreferenceKey());
+        if (mPreference != null) {
+            mPreference.setContinuousUpdates(false);
+            mPreference.setHapticFeedbackMode(
+                    LabeledSeekBarPreference.HAPTIC_FEEDBACK_MODE_ON_TICKS);
+            mPreference.setMin(getMin());
+            mPreference.setMax(getMax());
+        }
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        super.updateState(preference);
+        final LabeledSeekBarPreference pref = (LabeledSeekBarPreference) preference;
+        pref.setEnabled(
+                isAvailable() && PowerMenuSettingsUtils.isLongPressPowerForAssistEnabled(mContext));
+        pref.setProgress(getSliderPosition());
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        if (mSensitivityValues == null || mSensitivityValues.length < 2) {
+            return UNSUPPORTED_ON_DEVICE;
+        }
+
+        if (!PowerMenuSettingsUtils.isLongPressPowerForAssistEnabled(mContext)) {
+            return DISABLED_DEPENDENT_SETTING;
+        }
+
+        return AVAILABLE;
+    }
+
+    @Override
+    public int getSliderPosition() {
+        return mSensitivityValues == null ? 0 : closestValueIndex(mSensitivityValues,
+                getCurrentSensitivityValue());
+    }
+
+    @Override
+    public boolean setSliderPosition(int position) {
+        if (mSensitivityValues == null || position < 0 || position >= mSensitivityValues.length) {
+            return false;
+        }
+        return Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.POWER_BUTTON_LONG_PRESS_DURATION_MS,
+                mSensitivityValues[position]);
+    }
+
+    @Override
+    public int getMax() {
+        if (mSensitivityValues == null || mSensitivityValues.length == 0) {
+            return 0;
+        }
+        return mSensitivityValues.length - 1;
+    }
+
+    @Override
+    public int getMin() {
+        return 0;
+    }
+
+    private int getCurrentSensitivityValue() {
+        return Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.POWER_BUTTON_LONG_PRESS_DURATION_MS,
+                mContext.getResources().getInteger(
+                        com.android.internal.R.integer.config_longPressOnPowerDurationMs));
+    }
+
+    private static int closestValueIndex(int[] values, int needle) {
+        int minDistance = Integer.MAX_VALUE;
+        int valueIndex = 0;
+        for (int i = 0; i < values.length; i++) {
+            int diff = Math.abs(values[i] - needle);
+            if (diff < minDistance) {
+                minDistance = diff;
+                valueIndex = i;
+            }
+        }
+        return valueIndex;
+    }
+}
diff --git a/src/com/android/settings/gestures/PowerMenuPreferenceController.java b/src/com/android/settings/gestures/PowerMenuPreferenceController.java
index 0d5f810..b4f97aa 100644
--- a/src/com/android/settings/gestures/PowerMenuPreferenceController.java
+++ b/src/com/android/settings/gestures/PowerMenuPreferenceController.java
@@ -16,30 +16,23 @@
 
 package com.android.settings.gestures;
 
-import android.content.Context;
-import android.provider.Settings;
+import static com.android.settings.gestures.PowerMenuSettingsUtils.LONG_PRESS_POWER_ASSISTANT_VALUE;
+import static com.android.settings.gestures.PowerMenuSettingsUtils.LONG_PRESS_POWER_GLOBAL_ACTIONS;
 
-import com.android.internal.annotations.VisibleForTesting;
+import android.content.Context;
+
 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
 
 public class PowerMenuPreferenceController extends BasePreferenceController {
 
-    private static final String POWER_BUTTON_LONG_PRESS_SETTING =
-            Settings.Global.POWER_BUTTON_LONG_PRESS;
-
-    @VisibleForTesting
-    static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
-    @VisibleForTesting
-    static final int LONG_PRESS_POWER_ASSISTANT_VALUE = 5;
-
     public PowerMenuPreferenceController(Context context, String key) {
         super(context, key);
     }
 
     @Override
     public CharSequence getSummary() {
-        final int powerButtonValue = getPowerButtonLongPressValue(mContext);
+        final int powerButtonValue = PowerMenuSettingsUtils.getPowerButtonSettingValue(mContext);
         if (powerButtonValue == LONG_PRESS_POWER_ASSISTANT_VALUE) {
             return mContext.getText(R.string.power_menu_summary_long_press_for_assist_enabled);
         } else if (powerButtonValue == LONG_PRESS_POWER_GLOBAL_ACTIONS) {
@@ -60,11 +53,4 @@
         return mContext.getResources().getBoolean(
                 com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable);
     }
-
-    private static int getPowerButtonLongPressValue(Context context) {
-        return Settings.Global.getInt(context.getContentResolver(),
-                POWER_BUTTON_LONG_PRESS_SETTING,
-                context.getResources().getInteger(
-                        com.android.internal.R.integer.config_longPressOnPowerBehavior));
-    }
 }
diff --git a/src/com/android/settings/gestures/PowerMenuSettingsUtils.java b/src/com/android/settings/gestures/PowerMenuSettingsUtils.java
new file mode 100644
index 0000000..444b7c1
--- /dev/null
+++ b/src/com/android/settings/gestures/PowerMenuSettingsUtils.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.gestures;
+
+import android.content.Context;
+import android.provider.Settings;
+
+/** Common code for long press power settings shared between controllers. */
+final class PowerMenuSettingsUtils {
+
+    /**
+     * Setting storing the current behaviour of long press power.
+     */
+    public static final String POWER_BUTTON_LONG_PRESS_SETTING =
+            Settings.Global.POWER_BUTTON_LONG_PRESS;
+
+    /**
+     * Value used for long press power button behaviour when the Assist setting is disabled.
+     *
+     * If this value matches Assist setting, then it falls back to Global Actions panel or
+     * power menu, depending on their respective settings.
+     */
+    public static final int POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE =
+            com.android.internal.R.integer.config_longPressOnPowerBehavior;
+
+    /**
+     * Values used for long press power button behaviour when Assist setting is enabled.
+     *
+     * {@link com.android.server.policy.PhoneWindowManager#LONG_PRESS_POWER_GLOBAL_ACTIONS} for
+     * source of the value.
+     */
+    static final int LONG_PRESS_POWER_NO_ACTION = 0;
+    static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
+    static final int LONG_PRESS_POWER_ASSISTANT_VALUE = 5; // Settings.Secure.ASSISTANT
+
+    /**
+     * @return current value of power button behaviour.
+     */
+    public static int getPowerButtonSettingValue(Context context) {
+        return Settings.Global.getInt(context.getContentResolver(),
+                POWER_BUTTON_LONG_PRESS_SETTING,
+                context.getResources().getInteger(POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE));
+    }
+
+    /**
+     * @return true if long press power for assist is currently enabled.
+     */
+    public static boolean isLongPressPowerForAssistEnabled(Context context) {
+        return getPowerButtonSettingValue(context) == LONG_PRESS_POWER_ASSISTANT_VALUE;
+    }
+
+    private PowerMenuSettingsUtils() {
+    }
+}
diff --git a/src/com/android/settings/widget/LabeledSeekBarPreference.java b/src/com/android/settings/widget/LabeledSeekBarPreference.java
index 3a9ac18..b34ea19 100644
--- a/src/com/android/settings/widget/LabeledSeekBarPreference.java
+++ b/src/com/android/settings/widget/LabeledSeekBarPreference.java
@@ -20,9 +20,11 @@
 import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
+import android.view.View;
 import android.widget.SeekBar;
 import android.widget.TextView;
 
+import androidx.annotation.Nullable;
 import androidx.core.content.res.TypedArrayUtils;
 import androidx.preference.PreferenceViewHolder;
 
@@ -35,6 +37,8 @@
     private final int mTextEndId;
     private final int mTickMarkId;
     private OnPreferenceChangeListener mStopListener;
+    @Nullable
+    private CharSequence mSummary;
 
     public LabeledSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr,
             int defStyleRes) {
@@ -52,6 +56,7 @@
                 R.string.summary_placeholder);
         mTickMarkId = styledAttrs.getResourceId(
                 R.styleable.LabeledSeekBarPreference_tickMark, /* defValue= */ 0);
+        mSummary = styledAttrs.getText(R.styleable.Preference_android_summary);
         styledAttrs.recycle();
     }
 
@@ -76,6 +81,15 @@
                     com.android.internal.R.id.seekbar);
             seekBar.setTickMark(tickMark);
         }
+
+        final TextView summary = (TextView) holder.findViewById(android.R.id.summary);
+        if (mSummary != null) {
+            summary.setText(mSummary);
+            summary.setVisibility(View.VISIBLE);
+        } else {
+            summary.setText(null);
+            summary.setVisibility(View.GONE);
+        }
     }
 
     public void setOnPreferenceChangeStopListener(OnPreferenceChangeListener listener) {
@@ -90,5 +104,24 @@
             mStopListener.onPreferenceChange(this, seekBar.getProgress());
         }
     }
+
+    @Override
+    public void setSummary(CharSequence summary) {
+        super.setSummary(summary);
+        mSummary = summary;
+        notifyChanged();
+    }
+
+    @Override
+    public void setSummary(int summaryResId) {
+        super.setSummary(summaryResId);
+        mSummary = getContext().getText(summaryResId);
+        notifyChanged();
+    }
+
+    @Override
+    public CharSequence getSummary() {
+        return mSummary;
+    }
 }
 
diff --git a/tests/robotests/src/com/android/settings/gestures/LabeledSeekBarPreferenceTest.java b/tests/robotests/src/com/android/settings/gestures/LabeledSeekBarPreferenceTest.java
index 4fb94f8..3d83d58 100644
--- a/tests/robotests/src/com/android/settings/gestures/LabeledSeekBarPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/LabeledSeekBarPreferenceTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.gestures;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
@@ -24,9 +26,12 @@
 import android.view.View;
 import android.widget.LinearLayout;
 import android.widget.SeekBar;
+import android.widget.TextView;
 
 import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
 
+import com.android.internal.R;
 import com.android.settings.widget.LabeledSeekBarPreference;
 
 import org.junit.Before;
@@ -41,7 +46,9 @@
 public class LabeledSeekBarPreferenceTest {
 
     private Context mContext;
+    private PreferenceViewHolder mViewHolder;
     private SeekBar mSeekBar;
+    private TextView mSummary;
     private LabeledSeekBarPreference mSeekBarPreference;
 
     @Mock
@@ -57,7 +64,9 @@
         final View view =
                 inflater.inflate(mSeekBarPreference.getLayoutResource(),
                         new LinearLayout(mContext), false);
-        mSeekBar = view.findViewById(com.android.internal.R.id.seekbar);
+        mViewHolder = PreferenceViewHolder.createInstanceForTests(view);
+        mSeekBar = (SeekBar) mViewHolder.findViewById(R.id.seekbar);
+        mSummary = (TextView) mViewHolder.findViewById(R.id.summary);
     }
 
     @Test
@@ -69,4 +78,23 @@
 
         verify(mListener, times(1)).onPreferenceChange(mSeekBarPreference, 2);
     }
+
+    @Test
+    public void seekBarPreferenceSummarySet_returnsValue() {
+        final String summary = "this is a summary";
+        mSeekBarPreference.setSummary(summary);
+        mSeekBarPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(mSeekBarPreference.getSummary()).isEqualTo(summary);
+        assertThat(mSummary.getText()).isEqualTo(summary);
+    }
+
+    @Test
+    public void seekBarPreferenceSummaryNull_hidesView() {
+        mSeekBarPreference.setSummary(null);
+        mSeekBarPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(mSummary.getText()).isEqualTo("");
+        assertThat(mSummary.getVisibility()).isEqualTo(View.GONE);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java
index 8ff50ab..fa97754 100644
--- a/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java
@@ -137,7 +137,7 @@
         when(mResources.getInteger(
                 com.android.internal.R.integer.config_keyChordPowerVolumeUp))
                 .thenReturn(
-                      LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
+                     LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
 
         verify(mController.mFooterHint).setVisible(false);
     }
@@ -148,7 +148,7 @@
 
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(
-                LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_ASSISTANT_VALUE);
+                PowerMenuSettingsUtils.LONG_PRESS_POWER_ASSISTANT_VALUE);
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
                 LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_GLOBAL_ACTIONS);
@@ -162,19 +162,19 @@
         when(mResources.getInteger(
                 com.android.internal.R.integer.config_longPressOnPowerBehavior))
                 .thenReturn(
-                        LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_GLOBAL_ACTIONS);
+                        PowerMenuSettingsUtils.LONG_PRESS_POWER_GLOBAL_ACTIONS);
 
         mController.onPreferenceChange(null, false);
 
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(
-                LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_GLOBAL_ACTIONS);
+                PowerMenuSettingsUtils.LONG_PRESS_POWER_GLOBAL_ACTIONS);
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
                 LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
         verify(mController.mAssistSwitch).setSummary(
                 getString(
-                       R.string.power_menu_summary_long_press_for_assist_disabled_with_power_menu));
+                      R.string.power_menu_summary_long_press_for_assist_disabled_with_power_menu));
     }
 
     @Test
@@ -203,13 +203,13 @@
         when(mResources.getInteger(
                 com.android.internal.R.integer.config_longPressOnPowerBehavior))
                 .thenReturn(
-                        LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_ASSISTANT_VALUE);
+                        PowerMenuSettingsUtils.LONG_PRESS_POWER_ASSISTANT_VALUE);
 
         mController.onPreferenceChange(null, false);
 
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(
-                LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_GLOBAL_ACTIONS);
+                PowerMenuSettingsUtils.LONG_PRESS_POWER_GLOBAL_ACTIONS);
         assertThat(Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
                 LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
diff --git a/tests/robotests/src/com/android/settings/gestures/LongPressPowerSensitivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/LongPressPowerSensitivityPreferenceControllerTest.java
new file mode 100644
index 0000000..9c99092
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/gestures/LongPressPowerSensitivityPreferenceControllerTest.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.gestures;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.app.Application;
+import android.content.res.Resources;
+import android.provider.Settings;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class LongPressPowerSensitivityPreferenceControllerTest {
+
+    private static final String KEY_LONG_PRESS_SENSITIVITY =
+            "gesture_power_menu_long_press_for_assist_sensitivity";
+
+    private static final int[] SENSITIVITY_VALUES = {250, 350, 500, 750, 850};
+
+    private Application mContext;
+    private Resources mResources;
+    private LongPressPowerSensitivityPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        mResources = mock(Resources.class);
+        when(mContext.getResources()).thenReturn(mResources);
+
+        when(mResources.getIntArray(
+                com.android.internal.R.array.config_longPressOnPowerDurationSettings))
+                .thenReturn(SENSITIVITY_VALUES);
+
+        mController = new LongPressPowerSensitivityPreferenceController(mContext,
+                KEY_LONG_PRESS_SENSITIVITY);
+    }
+
+    @Test
+    public void getSliderPosition_returnsDefaultValue() {
+        when(mResources.getInteger(
+                com.android.internal.R.integer.config_longPressOnPowerDurationMs))
+                .thenReturn(750);
+        assertThat(mController.getSliderPosition()).isEqualTo(3);
+    }
+
+    @Test
+    public void getSliderPosition_returnsSetValue() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.POWER_BUTTON_LONG_PRESS_DURATION_MS, 350);
+        assertThat(mController.getSliderPosition()).isEqualTo(1);
+    }
+
+    @Test
+    public void setSliderPosition_setsValue() {
+        mController.setSliderPosition(4);
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.POWER_BUTTON_LONG_PRESS_DURATION_MS, 0)).isEqualTo(850);
+    }
+
+    @Test
+    public void setSliderPositionOutOfBounds_returnsFalse() {
+        assertThat(mController.setSliderPosition(-1)).isFalse();
+        assertThat(mController.setSliderPosition(10)).isFalse();
+    }
+
+    @Test
+    public void getMin_isZero() {
+        assertThat(mController.getMin()).isEqualTo(0);
+    }
+
+    @Test
+    public void getMax_isEqualToLastValueIndex() {
+        assertThat(mController.getMax()).isEqualTo(4);
+    }
+
+    @Test
+    public void longPressForAssistEnabled_isAvailable() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.POWER_BUTTON_LONG_PRESS,
+                PowerMenuSettingsUtils.LONG_PRESS_POWER_ASSISTANT_VALUE);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                LongPressPowerSensitivityPreferenceController.AVAILABLE);
+    }
+
+    @Test
+    public void longPressForAssistDisabled_isNotAvailableDueToDependentSetting() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.POWER_BUTTON_LONG_PRESS,
+                PowerMenuSettingsUtils.LONG_PRESS_POWER_NO_ACTION);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                LongPressPowerSensitivityPreferenceController.DISABLED_DEPENDENT_SETTING);
+    }
+
+    @Test
+    public void sensitivityValuesAreNull_notAvailable() {
+        when(mResources.getIntArray(
+                com.android.internal.R.array.config_longPressOnPowerDurationSettings))
+                .thenReturn(null);
+        mController = new LongPressPowerSensitivityPreferenceController(mContext,
+                KEY_LONG_PRESS_SENSITIVITY);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                LongPressPowerSensitivityPreferenceController.UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void sensitivityValuesArrayTooShort_notAvailable() {
+        when(mResources.getIntArray(
+                com.android.internal.R.array.config_longPressOnPowerDurationSettings))
+                .thenReturn(new int[]{200});
+        mController = new LongPressPowerSensitivityPreferenceController(mContext,
+                KEY_LONG_PRESS_SENSITIVITY);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                LongPressPowerSensitivityPreferenceController.UNSUPPORTED_ON_DEVICE);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/gestures/PowerMenuSettingsUtilsTest.java b/tests/robotests/src/com/android/settings/gestures/PowerMenuSettingsUtilsTest.java
new file mode 100644
index 0000000..25f0320
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/gestures/PowerMenuSettingsUtilsTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.gestures;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.provider.Settings;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class PowerMenuSettingsUtilsTest {
+
+    private Context mContext;
+    private Resources mResources;
+
+    @Before
+    public void setUp() {
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        mResources = mock(Resources.class);
+        when(mContext.getResources()).thenReturn(mResources);
+    }
+
+    @Test
+    public void longPressBehaviourValuePresent_returnsValue() {
+        when(mResources.getInteger(
+                com.android.internal.R.integer.config_longPressOnPowerBehavior))
+                .thenReturn(0);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.POWER_BUTTON_LONG_PRESS, 1);
+
+        assertThat(PowerMenuSettingsUtils.getPowerButtonSettingValue(mContext)).isEqualTo(1);
+    }
+
+    @Test
+    public void longPressBehaviourValueNotPresent_returnsDefault() {
+        when(mResources.getInteger(
+                com.android.internal.R.integer.config_longPressOnPowerBehavior))
+                .thenReturn(2);
+
+        assertThat(PowerMenuSettingsUtils.getPowerButtonSettingValue(mContext)).isEqualTo(2);
+    }
+
+    @Test
+    public void longPressBehaviourValueSetToAssistant_isAssistEnabledReturnsTrue() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.POWER_BUTTON_LONG_PRESS, 5);
+        assertThat(PowerMenuSettingsUtils.isLongPressPowerForAssistEnabled(mContext)).isTrue();
+    }
+
+    @Test
+    public void longPressBehaviourValueNotSetToAssistant_isAssistEnabledReturnsFalse() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.POWER_BUTTON_LONG_PRESS, 3);
+        assertThat(PowerMenuSettingsUtils.isLongPressPowerForAssistEnabled(mContext)).isFalse();
+    }
+
+    @Test
+    public void longPressBehaviourDefaultSetToAssistant_isAssistEnabledReturnsFalse() {
+        when(mResources.getInteger(
+                com.android.internal.R.integer.config_longPressOnPowerBehavior))
+                .thenReturn(3);
+
+        assertThat(PowerMenuSettingsUtils.isLongPressPowerForAssistEnabled(mContext)).isFalse();
+    }
+}