Move assist gestures settings to overlay

Bug: 37427306

Test: make -j RunSettingsRoboTests && manual testing of settings
Change-Id: If2b0ec9a966334a91f090051dee661011bfc0d70
diff --git a/res/xml/assist_gesture_settings.xml b/res/xml/assist_gesture_settings.xml
index d941c80..cf84e8a 100644
--- a/res/xml/assist_gesture_settings.xml
+++ b/res/xml/assist_gesture_settings.xml
@@ -31,10 +31,4 @@
         android:summary="@string/assist_gesture_summary"
         app:keywords="@string/keywords_squeeze_to_launch_gesture"/>
 
-    <com.android.settings.widget.SeekBarPreference
-        android:key="gesture_assist_sensitivity"
-        android:title="@string/assist_gesture_sensitivity_title"
-        android:defaultValue="5"
-        android:max="10" />
-
 </PreferenceScreen>
diff --git a/src/com/android/settings/gestures/AssistGestureFeatureProvider.java b/src/com/android/settings/gestures/AssistGestureFeatureProvider.java
index f06f6c1..8902393 100644
--- a/src/com/android/settings/gestures/AssistGestureFeatureProvider.java
+++ b/src/com/android/settings/gestures/AssistGestureFeatureProvider.java
@@ -18,10 +18,24 @@
 
 import android.content.Context;
 
+import com.android.settings.core.PreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import java.util.List;
+
 /** Feature provider for the assist gesture. */
 public interface AssistGestureFeatureProvider {
 
     /** Returns true if the assist gesture is supported. */
     boolean isSupported(Context context);
 
+    /** Returns true if the sensor is available. */
+    boolean isSensorAvailable(Context context);
+
+    /** Returns the resource */
+    int getPreferenceResourceId();
+
+    /** Returns a list of additional preference controllers */
+    List<PreferenceController> getControllers(Context context, Lifecycle lifecycle);
+
 }
diff --git a/src/com/android/settings/gestures/AssistGestureFeatureProviderImpl.java b/src/com/android/settings/gestures/AssistGestureFeatureProviderImpl.java
index b17d892..a2579ac 100644
--- a/src/com/android/settings/gestures/AssistGestureFeatureProviderImpl.java
+++ b/src/com/android/settings/gestures/AssistGestureFeatureProviderImpl.java
@@ -18,6 +18,13 @@
 
 import android.content.Context;
 
+import com.android.settings.R;
+import com.android.settings.core.PreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import java.util.ArrayList;
+import java.util.List;
+
 public class AssistGestureFeatureProviderImpl implements AssistGestureFeatureProvider {
 
     @Override
@@ -25,4 +32,19 @@
         return false;
     }
 
+    @Override
+    public boolean isSensorAvailable(Context context) {
+        return false;
+    }
+
+    @Override
+    public int getPreferenceResourceId() {
+        return R.xml.assist_gesture_settings;
+    }
+
+    @Override
+    public List<PreferenceController> getControllers(Context context, Lifecycle lifecycle) {
+        return new ArrayList<>();
+    }
+
 }
diff --git a/src/com/android/settings/gestures/AssistGestureSensitivityPreferenceController.java b/src/com/android/settings/gestures/AssistGestureSensitivityPreferenceController.java
deleted file mode 100644
index 0f42803..0000000
--- a/src/com/android/settings/gestures/AssistGestureSensitivityPreferenceController.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2017 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.ContentResolver;
-import android.content.Context;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.provider.Settings;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-
-import com.android.settings.widget.SeekBarPreference;
-import com.android.settings.core.PreferenceController;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnPause;
-import com.android.settingslib.core.lifecycle.events.OnResume;
-
-public class AssistGestureSensitivityPreferenceController extends PreferenceController
-        implements Preference.OnPreferenceChangeListener, LifecycleObserver, OnPause, OnResume {
-
-    private static final String PREF_KEY_ASSIST_GESTURE_SENSITIVITY = "gesture_assist_sensitivity";
-
-    private final AssistGestureFeatureProvider mFeatureProvider;
-    private final SettingObserver mSettingObserver;
-
-    private PreferenceScreen mScreen;
-    private SeekBarPreference mPreference;
-
-    public AssistGestureSensitivityPreferenceController(Context context, Lifecycle lifecycle) {
-        super(context);
-        mFeatureProvider = FeatureFactory.getFactory(context).getAssistGestureFeatureProvider();
-        mSettingObserver = new SettingObserver();
-
-        if (lifecycle != null) {
-            lifecycle.addObserver(this);
-        }
-    }
-
-    @Override
-    public void onResume() {
-        mSettingObserver.register(mContext.getContentResolver(), true /* register */);
-        updatePreference();
-    }
-
-    @Override
-    public void onPause() {
-        mSettingObserver.register(mContext.getContentResolver(), false /* register */);
-    }
-
-    @Override
-    public boolean isAvailable() {
-        // The sensitivity control is contingent on the assist gesture being supported and the
-        // gesture being enabled.
-        final int gestureEnabled = Settings.Secure.getInt(
-                mContext.getContentResolver(),
-                Settings.Secure.ASSIST_GESTURE_ENABLED,
-                1);
-        return (gestureEnabled == 1) && mFeatureProvider.isSupported(mContext);
-    }
-
-    @Override
-    public void displayPreference(PreferenceScreen screen) {
-        mScreen = screen;
-        mPreference = (SeekBarPreference) screen.findPreference(getPreferenceKey());
-        // Call super last or AbstractPreferenceController might remove the preference from the
-        // screen (if !isAvailable()) before we can save a reference to it.
-        super.displayPreference(screen);
-    }
-
-    @Override
-    public void updateState(Preference preference) {
-        super.updateState(preference);
-        updatePreference();
-    }
-
-    private void updatePreference() {
-        if (mPreference == null) {
-            return;
-        }
-
-        if (isAvailable()) {
-            if (mScreen.findPreference(getPreferenceKey()) == null) {
-                mScreen.addPreference(mPreference);
-            }
-        } else {
-            mScreen.removePreference(mPreference);
-        }
-
-        final int sensitivity = Settings.Secure.getInt(
-                mContext.getContentResolver(),
-                Settings.Secure.ASSIST_GESTURE_SENSITIVITY,
-                mPreference.getProgress());
-        mPreference.setProgress(sensitivity);
-    }
-
-    @Override
-    public boolean onPreferenceChange(Preference preference, Object newValue) {
-        final int sensitivity = (int) newValue;
-        Settings.Secure.putInt(mContext.getContentResolver(),
-                Settings.Secure.ASSIST_GESTURE_SENSITIVITY, sensitivity);
-        return true;
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return PREF_KEY_ASSIST_GESTURE_SENSITIVITY;
-    }
-
-    class SettingObserver extends ContentObserver {
-
-        private final Uri ASSIST_GESTURE_ENABLED_URI =
-                Settings.Secure.getUriFor(Settings.Secure.ASSIST_GESTURE_ENABLED);
-        private final Uri ASSIST_GESTURE_SENSITIVITY_URI =
-                Settings.Secure.getUriFor(Settings.Secure.ASSIST_GESTURE_SENSITIVITY);
-
-        public SettingObserver() {
-            super(null /* handler */);
-        }
-
-        public void register(ContentResolver cr, boolean register) {
-            if (register) {
-                cr.registerContentObserver(ASSIST_GESTURE_ENABLED_URI, false, this);
-                cr.registerContentObserver(ASSIST_GESTURE_SENSITIVITY_URI, false, this);
-            } else {
-                cr.unregisterContentObserver(this);
-            }
-        }
-
-        @Override
-        public void onChange(boolean selfChange) {
-            updatePreference();
-        }
-    }
-}
diff --git a/src/com/android/settings/gestures/AssistGestureSettings.java b/src/com/android/settings/gestures/AssistGestureSettings.java
index 64187a3..93d3a39 100644
--- a/src/com/android/settings/gestures/AssistGestureSettings.java
+++ b/src/com/android/settings/gestures/AssistGestureSettings.java
@@ -23,6 +23,7 @@
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
@@ -48,7 +49,8 @@
 
     @Override
     protected int getPreferenceScreenResId() {
-        return R.xml.assist_gesture_settings;
+        return FeatureFactory.getFactory(getContext())
+                .getAssistGestureFeatureProvider().getPreferenceResourceId();
     }
 
     @Override
@@ -60,7 +62,9 @@
             Lifecycle lifecycle) {
         final List<PreferenceController> controllers = new ArrayList<>();
         controllers.add(new AssistGesturePreferenceController(context, lifecycle, KEY_ASSIST));
-        controllers.add(new AssistGestureSensitivityPreferenceController(context, lifecycle));
+        controllers.addAll(FeatureFactory.getFactory(context).getAssistGestureFeatureProvider()
+                .getControllers(context, lifecycle));
+
         return controllers;
     }
 
diff --git a/tests/robotests/src/com/android/settings/gestures/AssistGestureSensitivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/AssistGestureSensitivityPreferenceControllerTest.java
deleted file mode 100644
index 349ca4f..0000000
--- a/tests/robotests/src/com/android/settings/gestures/AssistGestureSensitivityPreferenceControllerTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2017 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;
-
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.FakeFeatureFactory;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class AssistGestureSensitivityPreferenceControllerTest {
-
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private Context mContext;
-    private FakeFeatureFactory mFactory;
-    private AssistGestureSensitivityPreferenceController mController;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        FakeFeatureFactory.setupForTest(mContext);
-        mFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
-        mController = new AssistGestureSensitivityPreferenceController(mContext, null);
-    }
-
-    @Test
-    public void isAvailable_whenSupportedAndEnabled_shouldReturnTrue() {
-        Settings.Secure.putInt(mContext.getContentResolver(),
-                Settings.Secure.ASSIST_GESTURE_ENABLED, 1);
-        when(mFactory.assistGestureFeatureProvider.isSupported(mContext)).thenReturn(true);
-
-        assertThat(mController.isAvailable()).isTrue();
-    }
-
-    @Test
-    public void isAvailable_whenSupportedAndDisabled_shouldReturnFalse() {
-        Settings.Secure.putInt(mContext.getContentResolver(),
-                Settings.Secure.ASSIST_GESTURE_ENABLED, 0);
-        when(mFactory.assistGestureFeatureProvider.isSupported(mContext)).thenReturn(true);
-
-        assertThat(mController.isAvailable()).isFalse();
-    }
-
-    @Test
-    public void isAvailable_whenUnsupportedAndEnabled_shouldReturnFalse() {
-        Settings.Secure.putInt(mContext.getContentResolver(),
-                Settings.Secure.ASSIST_GESTURE_ENABLED, 1);
-        when(mFactory.assistGestureFeatureProvider.isSupported(mContext)).thenReturn(false);
-
-        assertThat(mController.isAvailable()).isFalse();
-    }
-
-    @Test
-    public void isAvailable_whenUnsupportedAndDisabled_shouldReturnFalse() {
-        Settings.Secure.putInt(mContext.getContentResolver(),
-                Settings.Secure.ASSIST_GESTURE_ENABLED, 0);
-        when(mFactory.assistGestureFeatureProvider.isSupported(mContext)).thenReturn(false);
-
-        assertThat(mController.isAvailable()).isFalse();
-    }
-}
-
diff --git a/tests/robotests/src/com/android/settings/gestures/AssistGestureSettingsTest.java b/tests/robotests/src/com/android/settings/gestures/AssistGestureSettingsTest.java
index ba0a90a..17fa17b 100644
--- a/tests/robotests/src/com/android/settings/gestures/AssistGestureSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/AssistGestureSettingsTest.java
@@ -20,6 +20,7 @@
 import android.provider.SearchIndexableResource;
 
 import com.android.settings.R;
+import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.core.PreferenceController;
@@ -35,22 +36,28 @@
 import java.util.List;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class AssistGestureSettingsTest {
     @Mock
     private Context mContext;
+    private FakeFeatureFactory mFakeFeatureFactory;
+    private AssistGestureFeatureProvider mFeatureProvider;
     private AssistGestureSettings mSettings;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+        mFakeFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
+        mFeatureProvider = mFakeFeatureFactory.getAssistGestureFeatureProvider();
         mSettings = new AssistGestureSettings();
     }
 
     @Test
     public void testGetPreferenceScreenResId() {
+        when(mFeatureProvider.getPreferenceResourceId()).thenReturn(R.xml.assist_gesture_settings);
         assertThat(mSettings.getPreferenceScreenResId())
                 .isEqualTo(R.xml.assist_gesture_settings);
     }
@@ -69,6 +76,7 @@
                         ShadowApplication.getInstance().getApplicationContext(),
                         true /* enabled */);
 
+        when(mFeatureProvider.getPreferenceResourceId()).thenReturn(R.xml.assist_gesture_settings);
         assertThat(indexRes).isNotNull();
         assertThat(indexRes.get(0).xmlResId).isEqualTo(mSettings.getPreferenceScreenResId());
     }