diff --git a/res/xml/assist_gesture_settings.xml b/res/xml/assist_gesture_settings.xml index d941c80fb38..cf84e8aba1e 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"/> - - diff --git a/src/com/android/settings/gestures/AssistGestureFeatureProvider.java b/src/com/android/settings/gestures/AssistGestureFeatureProvider.java index f06f6c15422..890239314c2 100644 --- a/src/com/android/settings/gestures/AssistGestureFeatureProvider.java +++ b/src/com/android/settings/gestures/AssistGestureFeatureProvider.java @@ -18,10 +18,24 @@ package com.android.settings.gestures; 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 getControllers(Context context, Lifecycle lifecycle); + } diff --git a/src/com/android/settings/gestures/AssistGestureFeatureProviderImpl.java b/src/com/android/settings/gestures/AssistGestureFeatureProviderImpl.java index b17d892206e..a2579acaf7c 100644 --- a/src/com/android/settings/gestures/AssistGestureFeatureProviderImpl.java +++ b/src/com/android/settings/gestures/AssistGestureFeatureProviderImpl.java @@ -18,6 +18,13 @@ package com.android.settings.gestures; 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 @@ public class AssistGestureFeatureProviderImpl implements AssistGestureFeaturePro return false; } + @Override + public boolean isSensorAvailable(Context context) { + return false; + } + + @Override + public int getPreferenceResourceId() { + return R.xml.assist_gesture_settings; + } + + @Override + public List 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 0f428033fc5..00000000000 --- 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 64187a3c3d1..93d3a392335 100644 --- a/src/com/android/settings/gestures/AssistGestureSettings.java +++ b/src/com/android/settings/gestures/AssistGestureSettings.java @@ -23,6 +23,7 @@ import com.android.internal.logging.nano.MetricsProto; 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 @@ public class AssistGestureSettings extends DashboardFragment { @Override protected int getPreferenceScreenResId() { - return R.xml.assist_gesture_settings; + return FeatureFactory.getFactory(getContext()) + .getAssistGestureFeatureProvider().getPreferenceResourceId(); } @Override @@ -60,7 +62,9 @@ public class AssistGestureSettings extends DashboardFragment { Lifecycle lifecycle) { final List 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 349ca4fa080..00000000000 --- 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 ba0a90a20cb..17fa17b27a4 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.content.Context; 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 org.robolectric.shadows.ShadowApplication; 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 @@ public class AssistGestureSettingsTest { 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()); }