Add setting to allow configuration of long press home gesture

This allows configuration of long press home gesture on 2-/3-button navigation configurations. It allows the user to enable and disable the invocation of assistant app using said gesture.

Bug: 191888710
Test: Unit tests and on a physical device.
Change-Id: I18cb290058ac5c2a748d40802b942404f548b868
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 231a149..4de795c 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -243,6 +243,8 @@
     public static class AutomaticStorageManagerSettingsActivity extends SettingsActivity { /* empty */ }
     public static class GamesStorageActivity extends SettingsActivity { /* empty */ }
     public static class GestureNavigationSettingsActivity extends SettingsActivity { /* empty */ }
+    /** Activity to manage 2-/3-button navigation configuration. */
+    public static class ButtonNavigationSettingsActivity extends SettingsActivity { /* empty */ }
     public static class InteractAcrossProfilesSettingsActivity extends SettingsActivity {
         /* empty */
     }
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 1adf199..3c594a7 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -94,6 +94,7 @@
 import com.android.settings.fuelgauge.batterysaver.BatterySaverScheduleSettings;
 import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings;
 import com.android.settings.gestures.AssistGestureSettings;
+import com.android.settings.gestures.ButtonNavigationSettingsFragment;
 import com.android.settings.gestures.DoubleTapPowerSettings;
 import com.android.settings.gestures.DoubleTapScreenSettings;
 import com.android.settings.gestures.DoubleTwistGestureSettings;
@@ -312,6 +313,7 @@
             DarkModeSettingsFragment.class.getName(),
             BugReportHandlerPicker.class.getName(),
             GestureNavigationSettingsFragment.class.getName(),
+            ButtonNavigationSettingsFragment.class.getName(),
             InteractAcrossProfilesSettings.class.getName(),
             InteractAcrossProfilesDetails.class.getName(),
             MediaControlsSettings.class.getName(),
diff --git a/src/com/android/settings/gestures/ButtonNavigationSettingsAssistController.java b/src/com/android/settings/gestures/ButtonNavigationSettingsAssistController.java
new file mode 100644
index 0000000..6ecf7b1
--- /dev/null
+++ b/src/com/android/settings/gestures/ButtonNavigationSettingsAssistController.java
@@ -0,0 +1,61 @@
+/*
+ * 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 android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON_OVERLAY;
+import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import com.android.settings.core.TogglePreferenceController;
+
+/**
+ * Configures behaviour of long press home button to invoke assistant app gesture.
+ */
+public class ButtonNavigationSettingsAssistController extends TogglePreferenceController {
+
+    public ButtonNavigationSettingsAssistController(Context context, String key) {
+        super(context, key);
+    }
+
+    @Override
+    public boolean isChecked() {
+        boolean onByDefault = mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_assistLongPressHomeEnabledDefault);
+        return Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_LONG_PRESS_HOME_ENABLED, onByDefault ? 1 : 0) == 1;
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        return Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_LONG_PRESS_HOME_ENABLED, isChecked ? 1 : 0);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        if (SystemNavigationPreferenceController.isOverlayPackageAvailable(mContext,
+                NAV_BAR_MODE_2BUTTON_OVERLAY)
+                || SystemNavigationPreferenceController.isOverlayPackageAvailable(mContext,
+                NAV_BAR_MODE_3BUTTON_OVERLAY)) {
+            return AVAILABLE;
+        }
+
+        return UNSUPPORTED_ON_DEVICE;
+    }
+}
diff --git a/src/com/android/settings/gestures/ButtonNavigationSettingsFragment.java b/src/com/android/settings/gestures/ButtonNavigationSettingsFragment.java
new file mode 100644
index 0000000..af75e78
--- /dev/null
+++ b/src/com/android/settings/gestures/ButtonNavigationSettingsFragment.java
@@ -0,0 +1,69 @@
+/*
+ * 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 android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON_OVERLAY;
+import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settingslib.search.SearchIndexable;
+
+/**
+ * A fragment that includes settings for 2- and 3-button navigation modes.
+ */
+@SearchIndexable(forTarget = SearchIndexable.MOBILE)
+public class ButtonNavigationSettingsFragment extends DashboardFragment {
+
+    private static final String TAG = "ButtonNavigationSettingsFragment";
+
+    public static final String BUTTON_NAVIGATION_SETTINGS =
+            "com.android.settings.BUTTON_NAVIGATION_SETTINGS";
+
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.SETTINGS_BUTTON_NAV_DLG;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.button_navigation_settings;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new BaseSearchIndexProvider(R.xml.button_navigation_settings) {
+
+                @Override
+                protected boolean isPageSearchEnabled(Context context) {
+                    return SystemNavigationPreferenceController.isOverlayPackageAvailable(context,
+                            NAV_BAR_MODE_2BUTTON_OVERLAY)
+                            || SystemNavigationPreferenceController.isOverlayPackageAvailable(
+                            context,
+                            NAV_BAR_MODE_3BUTTON_OVERLAY);
+                }
+            };
+}
diff --git a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
index 1ef8dec..7f0d7c3 100644
--- a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
+++ b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
@@ -41,6 +41,7 @@
 
 import com.android.settings.R;
 import com.android.settings.accessibility.AccessibilityGestureNavigationTutorial;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -150,10 +151,19 @@
 
         pref.setSummary(((CandidateInfoExtra) info).loadSummary());
 
-        if (info.getKey() == KEY_SYSTEM_NAV_GESTURAL) {
+        if (KEY_SYSTEM_NAV_GESTURAL.equals(info.getKey())) {
             pref.setExtraWidgetOnClickListener((v) -> startActivity(new Intent(
                     GestureNavigationSettingsFragment.GESTURE_NAVIGATION_SETTINGS)));
         }
+
+        if (KEY_SYSTEM_NAV_2BUTTONS.equals(info.getKey()) || KEY_SYSTEM_NAV_3BUTTONS.equals(
+                info.getKey())) {
+            pref.setExtraWidgetOnClickListener((v) ->
+                    new SubSettingLauncher(getContext())
+                            .setDestination(ButtonNavigationSettingsFragment.class.getName())
+                            .setSourceMetricsCategory(SettingsEnums.SETTINGS_GESTURE_SWIPE_UP)
+                            .launch());
+        }
     }
 
     @Override