From f7c459c9e5e27e77fecee2d42856576c401e4243 Mon Sep 17 00:00:00 2001 From: Daniel Sheng Date: Thu, 8 Jun 2017 09:24:30 -0700 Subject: [PATCH] Added suggestions for gestures. Bug: 30986021 Test: manual + make RunSettingsRoboTests + adb shell am instrument -w com.android.settings.tests.unit /android.support.test.runner.AndroidJUnitRunner Change-Id: I7337a141cb21e5a1399aaca05ec1facd8629577b Merged-In: I7aed110c81ca2fb6b90e2f359b4bb941c02bc1c3 --- AndroidManifest.xml | 115 +++++++++- res/drawable/ic_suggestion_gesture.xml | 28 +++ src/com/android/settings/Settings.java | 7 + .../SuggestionFeatureProviderImpl.java | 30 +++ .../suggestions/SuggestionsChecks.java | 3 +- .../DoubleTapPowerPreferenceController.java | 15 +- .../gestures/DoubleTapPowerSettings.java | 15 ++ .../DoubleTapScreenPreferenceController.java | 8 + .../gestures/DoubleTapScreenSettings.java | 15 ++ .../gestures/DoubleTwistGestureSettings.java | 15 ++ .../DoubleTwistPreferenceController.java | 42 ++-- .../PickupGesturePreferenceController.java | 8 + .../gestures/PickupGestureSettings.java | 15 ++ ...ipeToNotificationPreferenceController.java | 16 +- .../gestures/SwipeToNotificationSettings.java | 15 ++ .../SuggestionFeatureProviderImplTest.java | 202 ++++++++++++++++-- 16 files changed, 501 insertions(+), 48 deletions(-) create mode 100644 res/drawable/ic_suggestion_gesture.xml diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 485a23365f5..1b995663943 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3149,7 +3149,7 @@ @@ -3160,7 +3160,7 @@ + android:value="4,8,30" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 6b8570cd4eb..c059ff19c8f 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -147,6 +147,13 @@ public class Settings extends SettingsActivity { } public static class ScreenLockSuggestionActivity extends ChooseLockGeneric { /* empty */ } public static class CameraLiftTriggerSuggestionActivity extends SettingsActivity { /* empty */ } + public static class DoubleTapPowerSuggestionActivity extends SettingsActivity { /* empty */ } + public static class DoubleTwistSuggestionActivity extends SettingsActivity { /* empty */ } + public static class AmbientDisplaySuggestionActivity extends SettingsActivity { /* empty */ } + public static class AmbientDisplayPickupSuggestionActivity extends SettingsActivity { + /* empty */ } + public static class SwipeToNotificationSuggestionActivity extends SettingsActivity { + /* empty */ } public static class WallpaperSettingsActivity extends SettingsActivity { /* empty */ } public static class ManagedProfileSettingsActivity extends SettingsActivity { /* empty */ } public static class DeletionHelperActivity extends SettingsActivity { /* empty */ } diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java index 638f85f94f2..d9feae9d0b4 100644 --- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java @@ -20,11 +20,24 @@ import android.content.ComponentName; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.os.UserHandle; +import android.provider.Settings; import android.support.annotation.NonNull; import android.util.Log; +import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.Settings.AmbientDisplayPickupSuggestionActivity; +import com.android.settings.Settings.AmbientDisplaySuggestionActivity; +import com.android.settings.Settings.DoubleTapPowerSuggestionActivity; +import com.android.settings.Settings.DoubleTwistSuggestionActivity; +import com.android.settings.Settings.SwipeToNotificationSuggestionActivity; import com.android.settings.core.instrumentation.MetricsFeatureProvider; +import com.android.settings.gestures.DoubleTapPowerPreferenceController; +import com.android.settings.gestures.DoubleTapScreenPreferenceController; +import com.android.settings.gestures.DoubleTwistPreferenceController; +import com.android.settings.gestures.PickupGesturePreferenceController; +import com.android.settings.gestures.SwipeToNotificationPreferenceController; import com.android.settings.overlay.FeatureFactory; import com.android.settings.support.NewDeviceIntroSuggestionActivity; import com.android.settingslib.drawer.Tile; @@ -41,6 +54,7 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider private final SuggestionRanker mSuggestionRanker; private final MetricsFeatureProvider mMetricsFeatureProvider; + private final AmbientDisplayConfiguration mAmbientDisplayConfig; @Override public boolean isSmartSuggestionEnabled(Context context) { @@ -52,6 +66,21 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider final String className = component.getClassName(); if (className.equals(NewDeviceIntroSuggestionActivity.class.getName())) { return NewDeviceIntroSuggestionActivity.isSuggestionComplete(context); + } else if (className.equals(DoubleTapPowerSuggestionActivity.class.getName())) { + return DoubleTapPowerPreferenceController + .isSuggestionComplete(context, getSharedPrefs(context)); + } else if (className.equals(DoubleTwistSuggestionActivity.class.getName())) { + return DoubleTwistPreferenceController + .isSuggestionComplete(context, getSharedPrefs(context)); + } else if (className.equals(AmbientDisplaySuggestionActivity.class.getName())) { + return DoubleTapScreenPreferenceController + .isSuggestionComplete(context, getSharedPrefs(context)); + } else if (className.equals(AmbientDisplayPickupSuggestionActivity.class.getName())) { + return PickupGesturePreferenceController + .isSuggestionComplete(context, getSharedPrefs(context)); + } else if (className.equals(SwipeToNotificationSuggestionActivity.class.getName())) { + return SwipeToNotificationPreferenceController + .isSuggestionComplete(context, getSharedPrefs(context)); } return false; } @@ -67,6 +96,7 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider new SuggestionFeaturizer(new EventStore(appContext))); mMetricsFeatureProvider = FeatureFactory.getFactory(appContext) .getMetricsFeatureProvider(); + mAmbientDisplayConfig = new AmbientDisplayConfiguration(appContext); } @Override diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionsChecks.java b/src/com/android/settings/dashboard/suggestions/SuggestionsChecks.java index fa0da305ac8..ae8c0a68daf 100644 --- a/src/com/android/settings/dashboard/suggestions/SuggestionsChecks.java +++ b/src/com/android/settings/dashboard/suggestions/SuggestionsChecks.java @@ -130,7 +130,8 @@ public class SuggestionsChecks { private boolean isCameraLiftTriggerEnabled() { final int triggerEnabled = Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.CAMERA_LIFT_TRIGGER_ENABLED, 0); + Settings.Secure.CAMERA_LIFT_TRIGGER_ENABLED, + Settings.Secure.CAMERA_LIFT_TRIGGER_ENABLED_DEFAULT); return triggerEnabled == 1; } } diff --git a/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java b/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java index d36ecc47223..0cfa0077b0c 100644 --- a/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java +++ b/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java @@ -17,9 +17,11 @@ package com.android.settings.gestures; import android.content.Context; +import android.content.SharedPreferences; import android.provider.Settings; import android.support.v7.preference.Preference; +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.lifecycle.Lifecycle; public class DoubleTapPowerPreferenceController extends GesturePreferenceController { @@ -32,10 +34,19 @@ public class DoubleTapPowerPreferenceController extends GesturePreferenceControl mDoubleTapPowerKey = key; } + public static boolean isSuggestionComplete(Context context, SharedPreferences prefs) { + return !isGestureAvailable(context) + || prefs.getBoolean(DoubleTapPowerSettings.PREF_KEY_SUGGESTION_COMPLETE, false); + } + + private static boolean isGestureAvailable(Context context) { + return context.getResources() + .getBoolean(com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled); + } + @Override public boolean isAvailable() { - return mContext.getResources().getBoolean( - com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled); + return isGestureAvailable(mContext); } @Override diff --git a/src/com/android/settings/gestures/DoubleTapPowerSettings.java b/src/com/android/settings/gestures/DoubleTapPowerSettings.java index d38292d80b0..4efe3be52f6 100644 --- a/src/com/android/settings/gestures/DoubleTapPowerSettings.java +++ b/src/com/android/settings/gestures/DoubleTapPowerSettings.java @@ -17,12 +17,15 @@ package com.android.settings.gestures; import android.content.Context; +import android.content.SharedPreferences; import android.provider.SearchIndexableResource; 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.dashboard.suggestions.SuggestionFeatureProvider; +import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.lifecycle.Lifecycle; @@ -35,6 +38,18 @@ public class DoubleTapPowerSettings extends DashboardFragment { private static final String TAG = "DoubleTapPower"; private static final String KEY_DOUBLE_TAP_POWER = "gesture_double_tap_power"; + public static final String PREF_KEY_SUGGESTION_COMPLETE = + "pref_double_tap_power_suggestion_complete"; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + SuggestionFeatureProvider suggestionFeatureProvider = FeatureFactory.getFactory(context) + .getSuggestionFeatureProvider(context); + SharedPreferences prefs = suggestionFeatureProvider.getSharedPrefs(context); + prefs.edit().putBoolean(PREF_KEY_SUGGESTION_COMPLETE, true).apply(); + } + @Override public int getMetricsCategory() { return MetricsProto.MetricsEvent.SETTINGS_GESTURE_DOUBLE_TAP_POWER; diff --git a/src/com/android/settings/gestures/DoubleTapScreenPreferenceController.java b/src/com/android/settings/gestures/DoubleTapScreenPreferenceController.java index a38e4b67209..e671f60912d 100644 --- a/src/com/android/settings/gestures/DoubleTapScreenPreferenceController.java +++ b/src/com/android/settings/gestures/DoubleTapScreenPreferenceController.java @@ -18,10 +18,12 @@ package com.android.settings.gestures; import android.annotation.UserIdInt; import android.content.Context; +import android.content.SharedPreferences; import android.provider.Settings; import android.support.v7.preference.Preference; import com.android.internal.hardware.AmbientDisplayConfiguration; +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.lifecycle.Lifecycle; public class DoubleTapScreenPreferenceController extends GesturePreferenceController { @@ -41,6 +43,12 @@ public class DoubleTapScreenPreferenceController extends GesturePreferenceContro mDoubleTapScreenPrefKey = key; } + public static boolean isSuggestionComplete(Context context, SharedPreferences prefs) { + AmbientDisplayConfiguration ambientConfig = new AmbientDisplayConfiguration(context); + return !ambientConfig.pulseOnDoubleTapAvailable() + || prefs.getBoolean(DoubleTapScreenSettings.PREF_KEY_SUGGESTION_COMPLETE, false); + } + @Override public boolean isAvailable() { return mAmbientConfig.pulseOnDoubleTapAvailable(); diff --git a/src/com/android/settings/gestures/DoubleTapScreenSettings.java b/src/com/android/settings/gestures/DoubleTapScreenSettings.java index 4690eadaec7..0cc0365d9f4 100644 --- a/src/com/android/settings/gestures/DoubleTapScreenSettings.java +++ b/src/com/android/settings/gestures/DoubleTapScreenSettings.java @@ -17,6 +17,7 @@ package com.android.settings.gestures; import android.content.Context; +import android.content.SharedPreferences; import android.os.UserHandle; import android.provider.SearchIndexableResource; @@ -25,6 +26,8 @@ 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.dashboard.suggestions.SuggestionFeatureProvider; +import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.lifecycle.Lifecycle; @@ -37,6 +40,18 @@ public class DoubleTapScreenSettings extends DashboardFragment { private static final String TAG = "DoubleTapScreen"; private static final String KEY_DOUBLE_TAP_SCREEN = "gesture_double_tap_screen"; + public static final String PREF_KEY_SUGGESTION_COMPLETE = + "pref_double_tap_screen_suggestion_complete"; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + SuggestionFeatureProvider suggestionFeatureProvider = FeatureFactory.getFactory(context) + .getSuggestionFeatureProvider(context); + SharedPreferences prefs = suggestionFeatureProvider.getSharedPrefs(context); + prefs.edit().putBoolean(PREF_KEY_SUGGESTION_COMPLETE, true).apply(); + } + @Override public int getMetricsCategory() { return MetricsProto.MetricsEvent.SETTINGS_GESTURE_DOUBLE_TAP_SCREEN; diff --git a/src/com/android/settings/gestures/DoubleTwistGestureSettings.java b/src/com/android/settings/gestures/DoubleTwistGestureSettings.java index 2b46cce564b..e5fb9a0fc83 100644 --- a/src/com/android/settings/gestures/DoubleTwistGestureSettings.java +++ b/src/com/android/settings/gestures/DoubleTwistGestureSettings.java @@ -17,12 +17,15 @@ package com.android.settings.gestures; import android.content.Context; +import android.content.SharedPreferences; import android.provider.SearchIndexableResource; 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.dashboard.suggestions.SuggestionFeatureProvider; +import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.lifecycle.Lifecycle; @@ -35,6 +38,18 @@ public class DoubleTwistGestureSettings extends DashboardFragment { private static final String TAG = "DoubleTwistGesture"; private static final String KEY_DOUBLE_TWIST = "gesture_double_twist"; + public static final String PREF_KEY_SUGGESTION_COMPLETE = + "pref_double_twist_suggestion_complete"; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + SuggestionFeatureProvider suggestionFeatureProvider = FeatureFactory.getFactory(context) + .getSuggestionFeatureProvider(context); + SharedPreferences prefs = suggestionFeatureProvider.getSharedPrefs(context); + prefs.edit().putBoolean(PREF_KEY_SUGGESTION_COMPLETE, true).apply(); + } + @Override public int getMetricsCategory() { return MetricsProto.MetricsEvent.SETTINGS_GESTURE_DOUBLE_TWIST; diff --git a/src/com/android/settings/gestures/DoubleTwistPreferenceController.java b/src/com/android/settings/gestures/DoubleTwistPreferenceController.java index baf2d317f4a..c07a37b7e1b 100644 --- a/src/com/android/settings/gestures/DoubleTwistPreferenceController.java +++ b/src/com/android/settings/gestures/DoubleTwistPreferenceController.java @@ -17,6 +17,7 @@ package com.android.settings.gestures; import android.content.Context; +import android.content.SharedPreferences; import android.content.res.Resources; import android.hardware.Sensor; import android.hardware.SensorManager; @@ -29,6 +30,7 @@ import android.text.TextUtils; import com.android.settings.R; import com.android.settings.Utils; +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.lifecycle.Lifecycle; public class DoubleTwistPreferenceController extends GesturePreferenceController { @@ -43,10 +45,30 @@ public class DoubleTwistPreferenceController extends GesturePreferenceController mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); } + public static boolean isSuggestionComplete(Context context, SharedPreferences prefs) { + return !isGestureAvailable(context) + || prefs.getBoolean(DoubleTwistGestureSettings.PREF_KEY_SUGGESTION_COMPLETE, false); + } + + private static boolean isGestureAvailable(Context context) { + final Resources resources = context.getResources(); + final String name = resources.getString(R.string.gesture_double_twist_sensor_name); + final String vendor = resources.getString(R.string.gesture_double_twist_sensor_vendor); + if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(vendor)) { + final SensorManager sensorManager = + (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); + for (Sensor s : sensorManager.getSensorList(Sensor.TYPE_ALL)) { + if (name.equals(s.getName()) && vendor.equals(s.getVendor())) { + return true; + } + } + } + return false; + } + @Override public boolean isAvailable() { - return hasSensor(R.string.gesture_double_twist_sensor_name, - R.string.gesture_double_twist_sensor_vendor); + return isGestureAvailable(mContext); } @Override @@ -83,20 +105,4 @@ public class DoubleTwistPreferenceController extends GesturePreferenceController int getManagedProfileUserId() { return Utils.getManagedProfileId(mUserManager, UserHandle.myUserId()); } - - private boolean hasSensor(int nameResId, int vendorResId) { - final Resources resources = mContext.getResources(); - final String name = resources.getString(nameResId); - final String vendor = resources.getString(vendorResId); - if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(vendor)) { - final SensorManager sensorManager = - (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE); - for (Sensor s : sensorManager.getSensorList(Sensor.TYPE_ALL)) { - if (name.equals(s.getName()) && vendor.equals(s.getVendor())) { - return true; - } - } - } - return false; - } } diff --git a/src/com/android/settings/gestures/PickupGesturePreferenceController.java b/src/com/android/settings/gestures/PickupGesturePreferenceController.java index a6ce1a159f0..6308b37b64c 100644 --- a/src/com/android/settings/gestures/PickupGesturePreferenceController.java +++ b/src/com/android/settings/gestures/PickupGesturePreferenceController.java @@ -18,10 +18,12 @@ package com.android.settings.gestures; import android.annotation.UserIdInt; import android.content.Context; +import android.content.SharedPreferences; import android.provider.Settings; import android.support.v7.preference.Preference; import com.android.internal.hardware.AmbientDisplayConfiguration; +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.lifecycle.Lifecycle; public class PickupGesturePreferenceController extends GesturePreferenceController { @@ -41,6 +43,12 @@ public class PickupGesturePreferenceController extends GesturePreferenceControll mPickUpPrefKey = key; } + public static boolean isSuggestionComplete(Context context, SharedPreferences prefs) { + AmbientDisplayConfiguration ambientConfig = new AmbientDisplayConfiguration(context); + return !ambientConfig.pulseOnPickupAvailable() + || prefs.getBoolean(PickupGestureSettings.PREF_KEY_SUGGESTION_COMPLETE, false); + } + @Override public boolean isAvailable() { return mAmbientConfig.pulseOnPickupAvailable(); diff --git a/src/com/android/settings/gestures/PickupGestureSettings.java b/src/com/android/settings/gestures/PickupGestureSettings.java index 17d930f5a4f..7cc264c181d 100644 --- a/src/com/android/settings/gestures/PickupGestureSettings.java +++ b/src/com/android/settings/gestures/PickupGestureSettings.java @@ -17,6 +17,7 @@ package com.android.settings.gestures; import android.content.Context; +import android.content.SharedPreferences; import android.os.UserHandle; import android.provider.SearchIndexableResource; @@ -25,6 +26,8 @@ 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.dashboard.suggestions.SuggestionFeatureProvider; +import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.lifecycle.Lifecycle; @@ -37,6 +40,18 @@ public class PickupGestureSettings extends DashboardFragment { private static final String TAG = "PickupGestureSettings"; private static final String KEY_PICK_UP = "gesture_pick_up"; + public static final String PREF_KEY_SUGGESTION_COMPLETE = + "pref_pickup_gesture_suggestion_complete"; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + SuggestionFeatureProvider suggestionFeatureProvider = FeatureFactory.getFactory(context) + .getSuggestionFeatureProvider(context); + SharedPreferences prefs = suggestionFeatureProvider.getSharedPrefs(context); + prefs.edit().putBoolean(PREF_KEY_SUGGESTION_COMPLETE, true).apply(); + } + @Override public int getMetricsCategory() { return MetricsProto.MetricsEvent.SETTINGS_GESTURE_PICKUP; diff --git a/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java b/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java index b760c2520a3..d71c0765611 100644 --- a/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java +++ b/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java @@ -17,9 +17,11 @@ package com.android.settings.gestures; import android.content.Context; +import android.content.SharedPreferences; import android.provider.Settings; import android.support.v7.preference.Preference; +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.lifecycle.Lifecycle; public class SwipeToNotificationPreferenceController extends GesturePreferenceController { @@ -33,6 +35,17 @@ public class SwipeToNotificationPreferenceController extends GesturePreferenceCo mSwipeDownFingerPrefKey = key; } + public static boolean isSuggestionComplete(Context context, SharedPreferences prefs) { + return !isGestureAvailable(context) + || prefs.getBoolean(SwipeToNotificationSettings.PREF_KEY_SUGGESTION_COMPLETE, + false); + } + + private static boolean isGestureAvailable(Context context) { + return context.getResources() + .getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys); + } + @Override public String getPreferenceKey() { return mSwipeDownFingerPrefKey; @@ -45,8 +58,7 @@ public class SwipeToNotificationPreferenceController extends GesturePreferenceCo @Override public boolean isAvailable() { - return mContext.getResources().getBoolean( - com.android.internal.R.bool.config_supportSystemNavigationKeys); + return isGestureAvailable(mContext); } @Override diff --git a/src/com/android/settings/gestures/SwipeToNotificationSettings.java b/src/com/android/settings/gestures/SwipeToNotificationSettings.java index 00d4700ae86..05a1202a05d 100644 --- a/src/com/android/settings/gestures/SwipeToNotificationSettings.java +++ b/src/com/android/settings/gestures/SwipeToNotificationSettings.java @@ -17,12 +17,15 @@ package com.android.settings.gestures; import android.content.Context; +import android.content.SharedPreferences; import android.provider.SearchIndexableResource; 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.dashboard.suggestions.SuggestionFeatureProvider; +import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.lifecycle.Lifecycle; @@ -36,6 +39,18 @@ public class SwipeToNotificationSettings extends DashboardFragment { private static final String KEY = "gesture_swipe_down_fingerprint"; + public static final String PREF_KEY_SUGGESTION_COMPLETE = + "pref_swipe_to_notification_suggestion_complete"; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + SuggestionFeatureProvider suggestionFeatureProvider = FeatureFactory.getFactory(context) + .getSuggestionFeatureProvider(context); + SharedPreferences prefs = suggestionFeatureProvider.getSharedPrefs(context); + prefs.edit().putBoolean(PREF_KEY_SUGGESTION_COMPLETE, true).apply(); + } + @Override public int getMetricsCategory() { return MetricsProto.MetricsEvent.SETTINGS_GESTURE_SWIPE_TO_NOTIFICATION; diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java index d5d87b1b34f..78c1d1ad36e 100644 --- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java @@ -16,29 +16,6 @@ package com.android.settings.dashboard.suggestions; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; - -import com.android.internal.logging.nano.MetricsProto; -import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.settings.TestConfig; -import com.android.settings.testutils.FakeFeatureFactory; -import com.android.settingslib.drawer.Tile; -import com.android.settingslib.suggestions.SuggestionParser; - -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.RuntimeEnvironment; -import org.robolectric.annotation.Config; - -import java.util.ArrayList; -import java.util.List; - import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; @@ -49,10 +26,46 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.Settings.AmbientDisplaySuggestionActivity; +import com.android.settings.Settings.AmbientDisplayPickupSuggestionActivity; +import com.android.settings.Settings.DoubleTapPowerSuggestionActivity; +import com.android.settings.Settings.DoubleTwistSuggestionActivity; +import com.android.settings.Settings.SwipeToNotificationSuggestionActivity; +import com.android.settings.TestConfig; +import com.android.settings.gestures.DoubleTapPowerSettings; +import com.android.settings.gestures.DoubleTapScreenSettings; +import com.android.settings.gestures.PickupGestureSettings; +import com.android.settings.gestures.SwipeToNotificationSettings; +import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResources; +import com.android.settingslib.drawer.Tile; +import com.android.settingslib.suggestions.SuggestionParser; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +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.RuntimeEnvironment; +import org.robolectric.annotation.Config; + @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class SuggestionFeatureProviderImplTest { + private static final String DOUBLE_TWIST_SENSOR_NAME = "double_twist_sensor_name"; + private static final String DOUBLE_TWIST_SENSOR_VENDOR = "double_twist_sensor_vendor"; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mContext; @Mock @@ -75,6 +88,149 @@ public class SuggestionFeatureProviderImplTest { mProvider = new SuggestionFeatureProviderImpl(mContext); } + @Test + @Config(shadows = SettingsShadowResources.class) + public void isSuggestionCompleted_doubleTapPower_trueWhenNotAvailable() { + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, false); + + assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application, + new ComponentName(RuntimeEnvironment.application, + DoubleTapPowerSuggestionActivity.class))).isTrue(); + } + + @Test + @Config(shadows = SettingsShadowResources.class) + public void isSuggestionCompleted_doubleTapPower_falseWhenNotVisited() { + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, true); + // No stored value in shared preferences if not visited yet. + + assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application, + new ComponentName(RuntimeEnvironment.application, + DoubleTapPowerSuggestionActivity.class))).isFalse(); + } + + @Test + @Config(shadows = SettingsShadowResources.class) + public void isSuggestionCompleted_doubleTapPower_trueWhenVisited() { + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, true); + mProvider.getSharedPrefs(RuntimeEnvironment.application).edit().putBoolean( + DoubleTapPowerSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit(); + + assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application, + new ComponentName(RuntimeEnvironment.application, + DoubleTapPowerSuggestionActivity.class))).isTrue(); + } + + @Test + @Config(shadows = SettingsShadowResources.class) + public void isSuggestionCompleted_doubleTwist_trueWhenNotAvailable() { + SettingsShadowResources.overrideResource( + R.string.gesture_double_twist_sensor_name, "nonexistant name"); + SettingsShadowResources.overrideResource( + R.string.gesture_double_twist_sensor_vendor, "nonexistant vendor"); + + assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application, + new ComponentName(RuntimeEnvironment.application, + DoubleTwistSuggestionActivity.class))).isTrue(); + } + + @Test + @Config(shadows = SettingsShadowResources.class) + public void isSuggestionCompleted_ambientDisplay_falseWhenNotVisited() { + SettingsShadowResources.overrideResource( + com.android.internal.R.string.config_dozeComponent, "foo"); + SettingsShadowResources.overrideResource( + com.android.internal.R.string.config_dozeDoubleTapSensorType, "bar"); + // No stored value in shared preferences if not visited yet. + + assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application, + new ComponentName(RuntimeEnvironment.application, + AmbientDisplaySuggestionActivity.class))).isFalse(); + } + + @Test + @Config(shadows = SettingsShadowResources.class) + public void isSuggestionCompleted_ambientDisplay_trueWhenVisited() { + SettingsShadowResources.overrideResource( + com.android.internal.R.string.config_dozeComponent, "foo"); + SettingsShadowResources.overrideResource( + com.android.internal.R.string.config_dozeDoubleTapSensorType, "bar"); + mProvider.getSharedPrefs(RuntimeEnvironment.application).edit().putBoolean( + DoubleTapScreenSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit(); + + assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application, + new ComponentName(RuntimeEnvironment.application, + AmbientDisplaySuggestionActivity.class))).isTrue(); + } + + @Test + @Config(shadows = SettingsShadowResources.class) + public void isSuggestionCompleted_ambientDisplayPickup_falseWhenNotVisited() { + SettingsShadowResources.overrideResource( + com.android.internal.R.string.config_dozeComponent, "foo"); + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_dozePulsePickup, true); + // No stored value in shared preferences if not visited yet. + + assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application, + new ComponentName(RuntimeEnvironment.application, + AmbientDisplaySuggestionActivity.class))).isFalse(); + } + + @Test + @Config(shadows = SettingsShadowResources.class) + public void isSuggestionCompleted_ambientDisplayPickup_trueWhenVisited() { + SettingsShadowResources.overrideResource( + com.android.internal.R.string.config_dozeComponent, "foo"); + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_dozePulsePickup, true); + mProvider.getSharedPrefs(RuntimeEnvironment.application).edit().putBoolean( + PickupGestureSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit(); + + assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application, + new ComponentName(RuntimeEnvironment.application, + AmbientDisplayPickupSuggestionActivity.class))).isTrue(); + } + + @Test + @Config(shadows = SettingsShadowResources.class) + public void isSuggestionCompleted_swipeToNotification_trueWhenNotAvailable() { + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_supportSystemNavigationKeys, false); + + assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application, + new ComponentName(RuntimeEnvironment.application, + SwipeToNotificationSuggestionActivity.class))).isTrue(); + } + + @Test + @Config(shadows = SettingsShadowResources.class) + public void isSuggestionCompleted_swipeToNotification_falseWhenNotVisited() { + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_supportSystemNavigationKeys, true); + // No stored value in shared preferences if not visited yet. + + assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application, + new ComponentName(RuntimeEnvironment.application, + SwipeToNotificationSuggestionActivity.class))).isFalse(); + } + + @Test + @Config(shadows = SettingsShadowResources.class) + public void isSuggestionCompleted_swipeToNotification_trueWhenVisited() { + SettingsShadowResources.overrideResource( + com.android.internal.R.bool.config_supportSystemNavigationKeys, true); + mProvider.getSharedPrefs(RuntimeEnvironment.application).edit().putBoolean( + SwipeToNotificationSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit(); + + assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application, + new ComponentName(RuntimeEnvironment.application, + SwipeToNotificationSuggestionActivity.class))).isTrue(); + } + @Test public void dismissSuggestion_noParserOrSuggestion_noop() { mProvider.dismissSuggestion(mContext, null, null);