Add 'Reach to check' to lock screen settings

Also added to Gestures page to make sure we're following the
same structure for all gestures.

Change-Id: Iaa9e53e870165801decfa427441d01ee69bcce6d
Note: using dummy video. dependency on b/112442049
Bug: 111414690
Test: make RunSettingsRoboTests ROBOTEST_FILTER=ReachGesturePreferenceControllerTest
Test: make RunSettingsRoboTests ROBOTEST_FILTER=ReachGestureSettings
This commit is contained in:
Lucas Dupin
2018-08-13 10:39:52 -07:00
parent 5aa8e3c661
commit 1dfb9421b4
8 changed files with 386 additions and 3 deletions

View File

@@ -9584,6 +9584,20 @@
<!-- Summary text for ambient display (device) [CHAR LIMIT=NONE]-->
<string name="ambient_display_pickup_summary" product="device">To check time, notifications, and other info, pick up your device.</string>
<!-- Preference and settings suggestion title text for reach gesture (phone) [CHAR LIMIT=60]-->
<string name="ambient_display_reach_title" product="default">Reach to check phone</string>
<!-- Preference and settings suggestion title text for reach gesture (tablet) [CHAR LIMIT=60]-->
<string name="ambient_display_reach_title" product="tablet">Reach to check tablet</string>
<!-- Preference and settings suggestion title text for reach gesture (device) [CHAR LIMIT=60]-->
<string name="ambient_display_reach_title" product="device">Reach to check device</string>
<!-- Summary text for ambient display (phone) [CHAR LIMIT=NONE]-->
<string name="ambient_display_reach_summary" product="default">To check time, notifications, and other info, reach for your phone.</string>
<!-- Summary text for ambient display (tablet) [CHAR LIMIT=NONE]-->
<string name="ambient_display_reach_summary" product="tablet">To check time, notifications, and other info, reach for your tablet.</string>
<!-- Summary text for ambient display (device) [CHAR LIMIT=NONE]-->
<string name="ambient_display_reach_summary" product="device">To check time, notifications, and other info, reach for your device.</string>
<!-- Title text for swiping downwards on fingerprint sensor for notifications [CHAR LIMIT=80]-->
<string name="fingerprint_swipe_for_notifications_title">Swipe fingerprint for notifications</string>
<!-- Title text for fingerprint gesture preference screen [CHAR LIMIT=25] -->

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_reach_screen"
android:title="@string/ambient_display_reach_title">
<com.android.settings.widget.VideoPreference
android:key="gesture_reach_video"
app:animation="@raw/gesture_ambient_lift"
app:preview="@drawable/gesture_ambient_lift" />
<SwitchPreference
android:key="gesture_reach"
android:title="@string/ambient_display_reach_title"
android:summary="@string/ambient_display_reach_summary"
app:keywords="@string/keywords_gesture"
app:controller="com.android.settings.gestures.ReachGesturePreferenceController"
app:allowDividerAbove="true" />
</PreferenceScreen>

View File

@@ -31,8 +31,8 @@ import androidx.annotation.VisibleForTesting;
public class PickupGesturePreferenceController extends GesturePreferenceController {
private final int ON = 1;
private final int OFF = 0;
private static final int ON = 1;
private static final int OFF = 0;
private static final String PREF_KEY_VIDEO = "gesture_pick_up_video";
private final String mPickUpPrefKey;

View File

@@ -0,0 +1,96 @@
/*
* 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_REACH_GESTURE;
import android.annotation.UserIdInt;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
import com.android.internal.hardware.AmbientDisplayConfiguration;
public class ReachGesturePreferenceController extends GesturePreferenceController {
private static final int ON = 1;
private static final int OFF = 0;
private static final String PREF_KEY_VIDEO = "gesture_reach_video";
private final String mReachUpPrefKey;
private AmbientDisplayConfiguration mAmbientConfig;
@UserIdInt
private final int mUserId;
public ReachGesturePreferenceController(Context context, String key) {
super(context, key);
mUserId = UserHandle.myUserId();
mReachUpPrefKey = key;
}
public ReachGesturePreferenceController setConfig(AmbientDisplayConfiguration config) {
mAmbientConfig = config;
return this;
}
@Override
public int getAvailabilityStatus() {
// No hardware support for Reach Gesture
if (!getAmbientConfig().reachGestureAvailable()) {
return UNSUPPORTED_ON_DEVICE;
}
return AVAILABLE;
}
@Override
public boolean isSliceable() {
return TextUtils.equals(getPreferenceKey(), "gesture_reach");
}
@Override
protected String getVideoPrefKey() {
return PREF_KEY_VIDEO;
}
@Override
public boolean isChecked() {
return getAmbientConfig().reachGestureEnabled(mUserId);
}
@Override
public String getPreferenceKey() {
return mReachUpPrefKey;
}
@Override
public boolean setChecked(boolean isChecked) {
return Settings.Secure.putInt(mContext.getContentResolver(), DOZE_REACH_GESTURE,
isChecked ? ON : OFF);
}
private AmbientDisplayConfiguration getAmbientConfig() {
if (mAmbientConfig == null) {
mAmbientConfig = new AmbientDisplayConfiguration(mContext);
}
return mAmbientConfig;
}
}

View File

@@ -0,0 +1,81 @@
/*
* 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 ReachGestureSettings extends DashboardFragment {
private static final String TAG = "ReachGestureSettings";
public static final String PREF_KEY_SUGGESTION_COMPLETE =
"pref_reach_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();
use(ReachGesturePreferenceController.class)
.setConfig(new AmbientDisplayConfiguration(context));
}
@Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.SETTINGS_GESTURE_REACH;
}
@Override
protected String getLogTag() {
return TAG;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.reach_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.reach_gesture_settings;
return Arrays.asList(sir);
}
};
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2016 The Android Open Source Project
* 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.

View File

@@ -0,0 +1,104 @@
/*
* 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 android.content.SharedPreferences;
import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl;
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;
import org.robolectric.RuntimeEnvironment;
@RunWith(SettingsRobolectricTestRunner.class)
public class ReachGesturePreferenceControllerTest {
private static final String KEY_REACH = "gesture_reach";
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
@Mock
private AmbientDisplayConfiguration mAmbientDisplayConfiguration;
private ReachGesturePreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mController = new ReachGesturePreferenceController(mContext, KEY_REACH);
mController.setConfig(mAmbientDisplayConfiguration);
}
@Test
public void testIsChecked_configIsSet_shouldReturnTrue() {
// Set the setting to be enabled.
when(mAmbientDisplayConfiguration.reachGestureEnabled(anyInt())).thenReturn(true);
assertThat(mController.isChecked()).isTrue();
}
@Test
public void testIsChecked_configIsNotSet_shouldReturnFalse() {
// Set the setting to be disabled.
when(mAmbientDisplayConfiguration.reachGestureEnabled(anyInt())).thenReturn(false);
assertThat(mController.isChecked()).isFalse();
}
@Test
public void getAvailabilityStatus_gestureNotSupported_UNSUPPORTED_ON_DEVICE() {
when(mAmbientDisplayConfiguration.reachGestureAvailable()).thenReturn(false);
final int availabilityStatus = mController.getAvailabilityStatus();
assertThat(availabilityStatus).isEqualTo(UNSUPPORTED_ON_DEVICE);
}
@Test
public void getAvailabilityStatus_gestureSupported_AVAILABLE() {
when(mAmbientDisplayConfiguration.reachGestureAvailable()).thenReturn(true);
final int availabilityStatus = mController.getAvailabilityStatus();
assertThat(availabilityStatus).isEqualTo(AVAILABLE);
}
@Test
public void isSliceableCorrectKey_returnsTrue() {
final ReachGesturePreferenceController controller =
new ReachGesturePreferenceController(mContext, "gesture_reach");
assertThat(controller.isSliceable()).isTrue();
}
@Test
public void isSliceableIncorrectKey_returnsFalse() {
final ReachGesturePreferenceController controller =
new ReachGesturePreferenceController(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 ReachGestureSettingsTest {
private ReachGestureSettings mSettings;
@Before
public void setUp() {
mSettings = new ReachGestureSettings();
}
@Test
public void testSearchIndexProvider_shouldIndexResource() {
final List<SearchIndexableResource> indexRes =
ReachGestureSettings.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(
RuntimeEnvironment.application, true /* enabled */);
assertThat(indexRes).isNotNull();
assertThat(indexRes.get(0).xmlResId).isEqualTo(mSettings.getPreferenceScreenResId());
}
}