Wake screen gesture

Settings page for gesture that allows the display to wake up.
Can be configured via overlays using config_dozeWakeScreenSensorType

Bug: 111414690
Test: manual
Test: make RunSettingsRoboTests ROBOTEST_FILTER=WakeScreenGesturePreferenceControllerTest
Test: make RunSettingsRoboTests ROBOTEST_FILTER=WakeScreenGestureSettingsTest
Change-Id: Ic44f0ee9e781bda3b06cf4896217b324b9e3606c
This commit is contained in:
Lucas Dupin
2018-08-28 17:26:38 -07:00
parent 02fe52963a
commit 8e57afb2cb
11 changed files with 365 additions and 0 deletions

View File

View File

@@ -9578,6 +9578,11 @@
<!-- Preference and settings suggestion title text for ambient display pick up (device) [CHAR LIMIT=60]--> <!-- Preference and settings suggestion title text for ambient display pick up (device) [CHAR LIMIT=60]-->
<string name="ambient_display_pickup_title" product="device">Lift to check device</string> <string name="ambient_display_pickup_title" product="device">Lift to check device</string>
<!-- Preference and settings suggestion title text for display wake-up gesture [CHAR LIMIT=60]-->
<string name="ambient_display_wake_screen_title">Wake up display</string>
<!-- Summary text for ambient display wake-up gesture [CHAR LIMIT=NONE]-->
<string name="ambient_display_wake_screen_summary"></string>
<!-- Summary text for ambient display (phone) [CHAR LIMIT=NONE]--> <!-- Summary text for ambient display (phone) [CHAR LIMIT=NONE]-->
<string name="ambient_display_pickup_summary" product="default">To check time, notifications, and other info, pick up your phone.</string> <string name="ambient_display_pickup_summary" product="default">To check time, notifications, and other info, pick up your phone.</string>
<!-- Summary text for ambient display (tablet) [CHAR LIMIT=NONE]--> <!-- Summary text for ambient display (tablet) [CHAR LIMIT=NONE]-->

View File

@@ -27,6 +27,12 @@
android:fragment="com.android.settings.gestures.AssistGestureSettings" android:fragment="com.android.settings.gestures.AssistGestureSettings"
settings:controller="com.android.settings.gestures.AssistGestureSettingsPreferenceController" /> settings:controller="com.android.settings.gestures.AssistGestureSettingsPreferenceController" />
<Preference
android:key="gesture_wake_screen_input_summary"
android:title="@string/ambient_display_wake_screen_title"
android:fragment="com.android.settings.gestures.WakeScreenGestureSettings"
settings:controller="com.android.settings.gestures.WakeScreenGesturePreferenceController" />
<Preference <Preference
android:key="gesture_wake_lock_screen_summary" android:key="gesture_wake_lock_screen_summary"
android:title="@string/ambient_display_wake_lock_screen_title" android:title="@string/ambient_display_wake_lock_screen_title"

View File

@@ -70,6 +70,12 @@
android:fragment="com.android.settings.gestures.PickupGestureSettings" android:fragment="com.android.settings.gestures.PickupGestureSettings"
settings:controller="com.android.settings.gestures.PickupGesturePreferenceController" /> settings:controller="com.android.settings.gestures.PickupGesturePreferenceController" />
<Preference
android:key="ambient_display_wake_screen"
android:title="@string/ambient_display_wake_screen_title"
android:fragment="com.android.settings.gestures.WakeScreenGestureSettings"
settings:controller="com.android.settings.gestures.WakeScreenGesturePreferenceController" />
<SwitchPreference <SwitchPreference
android:key="ambient_display_notification" android:key="ambient_display_notification"
android:title="@string/doze_title" android:title="@string/doze_title"

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2018 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.
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:key="gesture_wake_screen_screen"
android:title="@string/ambient_display_wake_screen_title">
<com.android.settings.widget.VideoPreference
android:key="gesture_wake_screen_video"
app:animation="@raw/gesture_ambient_wake_screen"
app:preview="@drawable/gesture_ambient_wake_screen" />
<SwitchPreference
android:key="gesture_wake_screen"
android:title="@string/ambient_display_wake_screen_title"
android:summary="@string/ambient_display_wake_screen_summary"
app:keywords="@string/keywords_gesture"
app:controller="com.android.settings.gestures.WakeScreenGesturePreferenceController"
app:allowDividerAbove="true" />
</PreferenceScreen>

View File

@@ -0,0 +1,89 @@
/*
* Copyright (C) 2018 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.provider.Settings.Secure.DOZE_WAKE_SCREEN_GESTURE;
import android.annotation.UserIdInt;
import android.content.Context;
import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.hardware.AmbientDisplayConfiguration;
public class WakeScreenGesturePreferenceController extends GesturePreferenceController {
private static final int ON = 1;
private static final int OFF = 0;
private static final String PREF_KEY_VIDEO = "gesture_wake_screen_video";
private AmbientDisplayConfiguration mAmbientConfig;
@UserIdInt
private final int mUserId;
public WakeScreenGesturePreferenceController(Context context, String key) {
super(context, key);
mUserId = UserHandle.myUserId();
}
@Override
public int getAvailabilityStatus() {
// No hardware support for Wake Screen Gesture
if (!getAmbientConfig().wakeScreenGestureAvailable()) {
return UNSUPPORTED_ON_DEVICE;
}
return AVAILABLE;
}
@Override
public boolean isSliceable() {
return TextUtils.equals(getPreferenceKey(), "gesture_wake_screen");
}
@Override
protected String getVideoPrefKey() {
return PREF_KEY_VIDEO;
}
@Override
public boolean isChecked() {
return getAmbientConfig().wakeScreenGestureEnabled(mUserId);
}
@Override
public boolean setChecked(boolean isChecked) {
return Settings.Secure.putInt(mContext.getContentResolver(), DOZE_WAKE_SCREEN_GESTURE,
isChecked ? ON : OFF);
}
private AmbientDisplayConfiguration getAmbientConfig() {
if (mAmbientConfig == null) {
mAmbientConfig = new AmbientDisplayConfiguration(mContext);
}
return mAmbientConfig;
}
@VisibleForTesting
public void setConfig(AmbientDisplayConfiguration config) {
mAmbientConfig = config;
}
}

View File

@@ -0,0 +1,69 @@
/*
* Copyright (C) 2018 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.content.SharedPreferences;
import android.provider.SearchIndexableResource;
import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
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.search.SearchIndexable;
import java.util.Arrays;
import java.util.List;
@SearchIndexable
public class WakeScreenGestureSettings extends DashboardFragment {
private static final String TAG = "WakeScreenGestureSettings";
public static final String PREF_KEY_SUGGESTION_COMPLETE =
"pref_wake_screen_gesture_suggestion_complete";
@Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.SETTINGS_GESTURE_WAKE_SCREEN;
}
@Override
protected String getLogTag() {
return TAG;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.wake_screen_gesture_settings;
}
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(
Context context, boolean enabled) {
final SearchIndexableResource sir = new SearchIndexableResource(context);
sir.xmlResId = R.xml.wake_screen_gesture_settings;
return Arrays.asList(sir);
}
};
}

View File

@@ -29,6 +29,7 @@ import com.android.settings.display.AmbientDisplayAlwaysOnPreferenceController;
import com.android.settings.display.AmbientDisplayNotificationsPreferenceController; import com.android.settings.display.AmbientDisplayNotificationsPreferenceController;
import com.android.settings.gestures.DoubleTapScreenPreferenceController; import com.android.settings.gestures.DoubleTapScreenPreferenceController;
import com.android.settings.gestures.PickupGesturePreferenceController; import com.android.settings.gestures.PickupGesturePreferenceController;
import com.android.settings.gestures.WakeScreenGesturePreferenceController;
import com.android.settings.notification.LockScreenNotificationPreferenceController; import com.android.settings.notification.LockScreenNotificationPreferenceController;
import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.security.screenlock.LockScreenPreferenceController; import com.android.settings.security.screenlock.LockScreenPreferenceController;

View File

@@ -0,0 +1,101 @@
/*
* Copyright (C) 2018 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 com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.when;
import android.content.Context;
import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
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;
@RunWith(SettingsRobolectricTestRunner.class)
public class WakeScreenGesturePreferenceControllerTest {
private static final String KEY_WAKE_SCREEN = "gesture_wake_screen";
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
@Mock
private AmbientDisplayConfiguration mAmbientDisplayConfiguration;
private WakeScreenGesturePreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mController = new WakeScreenGesturePreferenceController(mContext, KEY_WAKE_SCREEN);
mController.setConfig(mAmbientDisplayConfiguration);
}
@Test
public void testIsChecked_configIsSet_shouldReturnTrue() {
// Set the setting to be enabled.
when(mAmbientDisplayConfiguration.wakeScreenGestureEnabled(anyInt())).thenReturn(true);
assertThat(mController.isChecked()).isTrue();
}
@Test
public void testIsChecked_configIsNotSet_shouldReturnFalse() {
// Set the setting to be disabled.
when(mAmbientDisplayConfiguration.wakeScreenGestureEnabled(anyInt())).thenReturn(false);
assertThat(mController.isChecked()).isFalse();
}
@Test
public void getAvailabilityStatus_gestureNotSupported_UNSUPPORTED_ON_DEVICE() {
when(mAmbientDisplayConfiguration.wakeScreenGestureAvailable()).thenReturn(false);
final int availabilityStatus = mController.getAvailabilityStatus();
assertThat(availabilityStatus).isEqualTo(UNSUPPORTED_ON_DEVICE);
}
@Test
public void getAvailabilityStatus_gestureSupported_AVAILABLE() {
when(mAmbientDisplayConfiguration.wakeScreenGestureAvailable()).thenReturn(true);
final int availabilityStatus = mController.getAvailabilityStatus();
assertThat(availabilityStatus).isEqualTo(AVAILABLE);
}
@Test
public void isSliceableCorrectKey_returnsTrue() {
final WakeScreenGesturePreferenceController controller =
new WakeScreenGesturePreferenceController(mContext, "gesture_wake_screen");
assertThat(controller.isSliceable()).isTrue();
}
@Test
public void isSliceableIncorrectKey_returnsFalse() {
final WakeScreenGesturePreferenceController controller =
new WakeScreenGesturePreferenceController(mContext, "bad_key");
assertThat(controller.isSliceable()).isFalse();
}
}

View File

@@ -0,0 +1,51 @@
/*
* Copyright (C) 2018 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 com.google.common.truth.Truth.assertThat;
import android.provider.SearchIndexableResource;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
import java.util.List;
@RunWith(SettingsRobolectricTestRunner.class)
public class WakeScreenGestureSettingsTest {
private WakeScreenGestureSettings mSettings;
@Before
public void setUp() {
mSettings = new WakeScreenGestureSettings();
}
@Test
public void testSearchIndexProvider_shouldIndexResource() {
final List<SearchIndexableResource> indexRes =
WakeScreenGestureSettings.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(
RuntimeEnvironment.application, true /* enabled */);
assertThat(indexRes).isNotNull();
assertThat(indexRes.get(0).xmlResId).isEqualTo(mSettings.getPreferenceScreenResId());
}
}