diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 6ee6a876fe0..a4803a984f1 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3244,6 +3244,24 @@ android:value="com.android.settings.gestures.GlobalActionsPanelSettings" /> + + + + + + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 206c704d483..38ce0c769c8 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10237,6 +10237,9 @@ Gesture Settings + + gesture navigation, back sensitivity, back gesture + Double-tap to check phone diff --git a/res/xml/gesture_navigation_settings.xml b/res/xml/gesture_navigation_settings.xml new file mode 100644 index 00000000000..2751f883329 --- /dev/null +++ b/res/xml/gesture_navigation_settings.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 46992ef68d9..50caf32f1f8 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -131,6 +131,7 @@ public class Settings extends SettingsActivity { public static class PhotosStorageActivity extends SettingsActivity { /* empty */ } + public static class GestureNavigationSettingsActivity extends SettingsActivity { /* empty */ } public static class ApnSettingsActivity extends SettingsActivity { /* empty */ } public static class WifiCallingSettingsActivity extends SettingsActivity { /* empty */ } diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java index 01b15983f45..1e97bdb6ffd 100644 --- a/src/com/android/settings/core/gateway/SettingsGateway.java +++ b/src/com/android/settings/core/gateway/SettingsGateway.java @@ -87,6 +87,7 @@ import com.android.settings.gestures.AssistGestureSettings; import com.android.settings.gestures.DoubleTapPowerSettings; import com.android.settings.gestures.DoubleTapScreenSettings; import com.android.settings.gestures.DoubleTwistGestureSettings; +import com.android.settings.gestures.GestureNavigationSettingsFragment; import com.android.settings.gestures.GlobalActionsPanelSettings; import com.android.settings.gestures.PickupGestureSettings; import com.android.settings.gestures.SwipeToNotificationSettings; @@ -289,7 +290,8 @@ public class SettingsGateway { MobileNetworkListFragment.class.getName(), GlobalActionsPanelSettings.class.getName(), DarkModeSettingsFragment.class.getName(), - BugReportHandlerPicker.class.getName() + BugReportHandlerPicker.class.getName(), + GestureNavigationSettingsFragment.class.getName() }; public static final String[] SETTINGS_FOR_RESTRICTED = { diff --git a/src/com/android/settings/gestures/GestureNavigationSettingsFragment.java b/src/com/android/settings/gestures/GestureNavigationSettingsFragment.java new file mode 100644 index 00000000000..c209c81a6ff --- /dev/null +++ b/src/com/android/settings/gestures/GestureNavigationSettingsFragment.java @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2019 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.app.settings.SettingsEnums; +import android.content.Context; +import android.os.Bundle; +import android.provider.Settings; +import android.view.WindowManager; + +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 to include all the settings related to Gesture Navigation mode. + */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) +public class GestureNavigationSettingsFragment extends DashboardFragment { + + public static final String TAG = "GestureNavigationSettingsFragment"; + + public static final String GESTURE_NAVIGATION_SETTINGS = + "com.android.settings.GESTURE_NAVIGATION_SETTINGS"; + + private static final String LEFT_EDGE_SEEKBAR_KEY = "gesture_left_back_sensitivity"; + private static final String RIGHT_EDGE_SEEKBAR_KEY = "gesture_right_back_sensitivity"; + + private WindowManager mWindowManager; + private BackGestureIndicatorView mIndicatorView; + + private static final float[] BACK_GESTURE_INSET_SCALES = {0.75f, 1.0f, 1.33f, 1.66f}; + + private float mDefaultBackGestureInset; + + public GestureNavigationSettingsFragment() { + super(); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mIndicatorView = new BackGestureIndicatorView(getActivity()); + mWindowManager = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE); + + mDefaultBackGestureInset = getActivity().getResources().getDimensionPixelSize( + com.android.internal.R.dimen.config_backGestureInset); + } + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + super.onCreatePreferences(savedInstanceState, rootKey); + + initSeekBarPreference(LEFT_EDGE_SEEKBAR_KEY); + initSeekBarPreference(RIGHT_EDGE_SEEKBAR_KEY); + } + + @Override + public void onResume() { + super.onResume(); + + mWindowManager.addView(mIndicatorView, mIndicatorView.getLayoutParams( + getActivity().getWindow().getAttributes())); + } + + @Override + public void onPause() { + super.onPause(); + + mWindowManager.removeView(mIndicatorView); + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.gesture_navigation_settings; + } + + @Override + public int getHelpResource() { + // TODO(b/146001201): Replace with gesture navigation help page when ready. + return R.string.help_uri_default; + } + + @Override + protected String getLogTag() { + return TAG; + } + + @Override + public int getMetricsCategory() { + return SettingsEnums.SETTINGS_GESTURE_NAV_BACK_SENSITIVITY_DLG; + } + + private void initSeekBarPreference(final String key) { + final GestureNavigationSeekBarPreference pref = getPreferenceScreen().findPreference(key); + pref.setContinuousUpdates(true); + + final String settingsKey = key == LEFT_EDGE_SEEKBAR_KEY + ? Settings.Secure.BACK_GESTURE_INSET_SCALE_LEFT + : Settings.Secure.BACK_GESTURE_INSET_SCALE_RIGHT; + final float initScale = Settings.Secure.getFloat( + getContext().getContentResolver(), settingsKey, 1.0f); + + // Find the closest value to initScale + float minDistance = Float.MAX_VALUE; + int minDistanceIndex = -1; + for (int i = 0; i < BACK_GESTURE_INSET_SCALES.length; i++) { + float d = Math.abs(BACK_GESTURE_INSET_SCALES[i] - initScale); + if (d < minDistance) { + minDistance = d; + minDistanceIndex = i; + } + } + pref.setProgress(minDistanceIndex); + + pref.setOnPreferenceChangeListener((p, v) -> { + final int width = (int) (mDefaultBackGestureInset * BACK_GESTURE_INSET_SCALES[(int) v]); + mIndicatorView.setIndicatorWidth(width, key == LEFT_EDGE_SEEKBAR_KEY); + return true; + }); + + pref.setOnPreferenceChangeStopListener((p, v) -> { + mIndicatorView.setIndicatorWidth(0, key == LEFT_EDGE_SEEKBAR_KEY); + final float scale = BACK_GESTURE_INSET_SCALES[(int) v]; + Settings.Secure.putFloat(getContext().getContentResolver(), settingsKey, scale); + return true; + }); + } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.gesture_navigation_settings); +}