Merge "Add manage notifications screen" into pi-dev
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index 1cf6b20..3b2cb81 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -1276,7 +1276,7 @@
errorLine1=" android:background="@color/lock_pattern_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="res/layout-land/confirm_lock_pattern_internal.xml"
+ file="res/layout-land/confirm_lock_pattern_normal.xml"
line="111"
column="17"/>
</issue>
diff --git a/res/layout-land/confirm_lock_pattern_internal.xml b/res/layout-land/confirm_lock_pattern_normal.xml
similarity index 100%
rename from res/layout-land/confirm_lock_pattern_internal.xml
rename to res/layout-land/confirm_lock_pattern_normal.xml
diff --git a/res/layout/choose_lock_pattern_common.xml b/res/layout/choose_lock_pattern_common.xml
index b3006a6..c4a9381 100644
--- a/res/layout/choose_lock_pattern_common.xml
+++ b/res/layout/choose_lock_pattern_common.xml
@@ -82,7 +82,7 @@
android:minLines="2"
android:gravity="center"
android:paddingHorizontal="?attr/suwMarginSides"
- android:textSize="18sp" />
+ android:textSize="12sp" />
<com.android.setupwizardlib.view.FillContentLayout
style="@style/LockPatternContainerStyle"
diff --git a/res/layout/confirm_lock_password_internal.xml b/res/layout/confirm_lock_password_normal.xml
similarity index 100%
rename from res/layout/confirm_lock_password_internal.xml
rename to res/layout/confirm_lock_password_normal.xml
diff --git a/res/layout/confirm_lock_pattern_internal_base.xml b/res/layout/confirm_lock_pattern_normal_base.xml
similarity index 100%
rename from res/layout/confirm_lock_pattern_internal_base.xml
rename to res/layout/confirm_lock_pattern_normal_base.xml
diff --git a/res/values-sw600dp/aliases.xml b/res/values-sw600dp/aliases.xml
index 86f2da5..e281d37 100644
--- a/res/values-sw600dp/aliases.xml
+++ b/res/values-sw600dp/aliases.xml
@@ -20,6 +20,6 @@
<item name="fingerprint_enroll_enrolling" type="layout">@layout/fingerprint_enroll_enrolling_base</item>
<item name="fingerprint_enroll_finish" type="layout">@layout/fingerprint_enroll_finish_base</item>
<item name="choose_lock_pattern" type="layout">@layout/choose_lock_pattern_common</item>
- <item name="confirm_lock_pattern_internal" type="layout">@layout/confirm_lock_pattern_internal_base</item>
+ <item name="confirm_lock_pattern_normal" type="layout">@layout/confirm_lock_pattern_normal_base</item>
</resources>
diff --git a/res/values/aliases.xml b/res/values/aliases.xml
index 8c4858d..060ba1d 100644
--- a/res/values/aliases.xml
+++ b/res/values/aliases.xml
@@ -17,7 +17,7 @@
<resources>
<item name="notification_app_section" type="layout">@*android:layout/preference_category_material</item>
<item name="confirm_lock_pattern" type="layout">@layout/confirm_lock_pattern_base</item>
- <item name="confirm_lock_pattern_internal" type="layout">@layout/confirm_lock_pattern_internal_base</item>
+ <item name="confirm_lock_pattern_normal" type="layout">@layout/confirm_lock_pattern_normal_base</item>
<item name="confirm_lock_password" type="layout">@layout/confirm_lock_password_base</item>
<item name="fingerprint_enroll_find_sensor" type="layout">@layout/fingerprint_enroll_find_sensor_base</item>
<item name="fingerprint_enroll_enrolling" type="layout">@layout/fingerprint_enroll_enrolling_base</item>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 5c3dc8f..4efd4e0 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1095,4 +1095,17 @@
<item>no</item>
</string-array>
+ <string-array name="gesture_prevent_ringing_entries" translatable="false">
+ <item>@string/prevent_ringing_option_vibrate</item>
+ <item>@string/prevent_ringing_option_mute</item>
+ <item>@string/prevent_ringing_option_none</item>
+ </string-array>
+
+ <!-- Keep in sync with Settings.Secure.VOLUME_HUSH_* -->
+ <string-array name="gesture_prevent_ringing_values" translatable="false">
+ <item>1</item>
+ <item>2</item>
+ <item>0</item>
+ </string-array>
+
</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 2fb96ec..53d631c 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -128,5 +128,7 @@
<color name="homepage_generic_icon_background">#1A73E8</color>
<!-- End of dashboard/homepage icon background colors -->
+ <color name="glif_error_color">@*android:color/material_red_A700</color>
+
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 20f3400..cab4a72 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3531,6 +3531,8 @@
<string name="lockpassword_confirm_passwords_dont_match">Passwords don\u2019t match</string>
<!-- Header on pin confirm screen if second pin doesn't match the first. [CHAR LIMIT=30]-->
<string name="lockpassword_confirm_pins_dont_match">PINs don\u2019t match</string>
+ <!-- Header on pattern confirm screen [CHAR LIMIT=40] -->
+ <string name="lockpassword_draw_your_pattern_again_header">Draw your pattern again</string>
<!-- Header shown to ask the user to select an unlock method [CHAR LIMIT=30] -->
<string name="lockpassword_choose_lock_generic_header">Unlock selection</string>
<!-- Toast shown if setting password was successful -->
@@ -6303,7 +6305,7 @@
<!-- Title for add user confirmation dialog [CHAR LIMIT=30] -->
<string name="user_add_user_title">Add new user?</string>
<!-- Message for add user confirmation dialog - long version. [CHAR LIMIT=none] -->
- <string name="user_add_user_message_long">You can share this device with other people by creating additional users. Each user has their own space, which they can customize with apps, wallpaper, and so on. Users can also adjust device settings like Wi\u2011Fi that affect everyone.\n\nWhen you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users.</string>
+ <string name="user_add_user_message_long">You can share this device with other people by creating additional users. Each user has their own space, which they can customize with apps, wallpaper, and so on. Users can also adjust device settings like Wi\u2011Fi that affect everyone.\n\nWhen you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users. Accessibility settings and services may not transfer to the new user.</string>
<!-- Message for add user confirmation dialog - short version. [CHAR LIMIT=none] -->
<string name="user_add_user_message_short">When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users. </string>
<!-- Title of dialog to setup a new user [CHAR LIMIT=30] -->
@@ -8648,6 +8650,27 @@
<!-- Summary of condition that work mode is off [CHAR LIMIT=NONE] -->
<string name="condition_work_summary">Apps, background sync, and other features related to your work profile are turned off.</string>
+ <!-- Title of condition that indicates device is muted [CHAR LIMIT=50] -->
+ <string name="condition_device_muted_title" product="tablet">Device is muted</string>
+
+ <!-- Title of condition that indicates device is muted [CHAR LIMIT=50] -->
+ <string name="condition_device_muted_title" product="default">Phone is muted</string>
+
+ <!-- Summary of condition that indicates device is muted -->
+ <string name="condition_device_muted_summary">Calls and notifications will be muted</string>
+
+ <!-- Title of condition that indicates device is set to vibrate [CHAR LIMIT=50] -->
+ <string name="condition_device_vibrate_title" product="tablet">Device is set to vibrate</string>
+
+ <!-- Title of condition that indicates device is muted [CHAR LIMIT=50] -->
+ <string name="condition_device_vibrate_title" product="default">Phone is set to vibrate</string>
+
+ <!-- Summary of condition that indicates device is set to vibrate -->
+ <string name="condition_device_vibrate_summary" product="tablet">Calls and notifications will vibrate device</string>
+
+ <!-- Summary of condition that indicates device is set to vibrate -->
+ <string name="condition_device_vibrate_summary" product="default">Calls and notifications will vibrate phone</string>
+
<!-- Night display: Title for the night display option Suggestion (renamed "Night Light" with title caps). [CHAR LIMIT=46] -->
<string name="night_display_suggestion_title">Set Night Light schedule</string>
@@ -9589,6 +9612,23 @@
<!-- Summary for battery Suggestion. [CHAR LIMIT=55] -->
<string name="battery_suggestion_summary"></string>
+ <!-- Title for prevent ringing gesture screen -->
+ <string name="gesture_prevent_ringing_screen_title">Prevent ringing</string>
+ <!-- Title for prevent ringing setting -->
+ <string name="gesture_prevent_ringing_title">Press Power & Volume Up together</string>
+ <!-- Option for prevent ringing setting -->
+ <string name="prevent_ringing_option_vibrate">Vibrate</string>
+ <!-- Option for prevent ringing setting -->
+ <string name="prevent_ringing_option_mute">Mute</string>
+ <!-- Option for prevent ringing setting -->
+ <string name="prevent_ringing_option_none">Do nothing</string>
+ <!-- Summary for prevent ringing setting -->
+ <string name="prevent_ringing_option_vibrate_summary">Vibrate all calls and notifications</string>
+ <!-- Summary for prevent ringing setting -->
+ <string name="prevent_ringing_option_mute_summary">Mute all calls and notifications</string>
+ <!-- Summary for prevent ringing setting -->
+ <string name="prevent_ringing_option_none_summary">Do nothing</string>
+
<!-- Title for detail page of wifi network [CHAR LIMIT=30] -->
<string name="pref_title_network_details">Network details</string>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index a8ceca3..742cbcf 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -53,6 +53,7 @@
<item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
<item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
+ <item name="*android:colorError">@color/glif_error_color</item>
</style>
<style name="GlifV2Theme" parent="SuwThemeGlifV2">
@@ -88,6 +89,7 @@
<item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
<item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
+ <item name="*android:colorError">@color/glif_error_color</item>
</style>
<style name="GlifV3Theme" parent="SuwThemeGlifV3">
@@ -123,6 +125,7 @@
<item name="preferenceTheme">@style/PreferenceTheme.SetupWizard</item>
<item name="*android:lockPatternStyle">@style/LockPatternStyle.Setup</item>
+ <item name="*android:colorError">@color/glif_error_color</item>
</style>
<style name="SetupWizardTheme.Transparent" parent="GlifTheme">
diff --git a/res/xml/gestures.xml b/res/xml/gestures.xml
index f136ec7..7083a31 100644
--- a/res/xml/gestures.xml
+++ b/res/xml/gestures.xml
@@ -50,4 +50,9 @@
android:title="@string/ambient_display_pickup_title"
android:fragment="com.android.settings.gestures.PickupGestureSettings" />
+ <Preference
+ android:key="gesture_prevent_ringing_summary"
+ android:title="@string/gesture_prevent_ringing_screen_title"
+ android:fragment="com.android.settings.gestures.PreventRingingGestureSettings" />
+
</PreferenceScreen>
diff --git a/res/xml/prevent_ringing_gesture_settings.xml b/res/xml/prevent_ringing_gesture_settings.xml
new file mode 100644
index 0000000..10732fc
--- /dev/null
+++ b/res/xml/prevent_ringing_gesture_settings.xml
@@ -0,0 +1,35 @@
+<?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_prevent_ringing_screen"
+ android:title="@string/gesture_prevent_ringing_screen_title">
+
+ <!-- TODO: Add video preference when it exists -->
+ <com.android.settings.widget.VideoPreference
+ android:key="gesture_prevent_ringing_video" />
+
+ <ListPreference
+ android:key="gesture_prevent_ringing"
+ android:title="@string/gesture_prevent_ringing_title"
+ android:entries="@array/gesture_prevent_ringing_entries"
+ android:entryValues="@array/gesture_prevent_ringing_values"
+ app:keywords="@string/keywords_gesture" />
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 15b3c66..83bb082 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -63,6 +63,7 @@
import com.android.settings.core.gateway.SettingsGateway;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.DashboardSummary;
+import com.android.settings.development.DevelopmentSettingsDashboardFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wfd.WifiDisplaySettings;
import com.android.settings.widget.SwitchBar;
@@ -686,10 +687,10 @@
final boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this)
&& !Utils.isMonkeyRunning();
-
+ final boolean isAdminOrDemo = um.isAdminUser() || um.isDemoUser();
somethingChanged = setTileEnabled(new ComponentName(packageName,
Settings.DevelopmentSettingsDashboardActivity.class.getName()),
- showDev, isAdmin)
+ showDev, isAdminOrDemo)
|| somethingChanged;
// Enable/disable backup settings depending on whether the user is admin.
@@ -724,10 +725,11 @@
final int tileCount = category.getTilesCount();
for (int i = 0; i < tileCount; i++) {
final ComponentName component = category.getTile(i).intent.getComponent();
-
final String name = component.getClassName();
final boolean isEnabledForRestricted = ArrayUtils.contains(
- SettingsGateway.SETTINGS_FOR_RESTRICTED, name);
+ SettingsGateway.SETTINGS_FOR_RESTRICTED, name) || (isAdminOrDemo
+ && Settings.DevelopmentSettingsDashboardActivity.class.getName()
+ .equals(name));
if (packageName.equals(component.getPackageName())
&& !isEnabledForRestricted) {
somethingChanged = setTileEnabled(component, false, isAdmin)
diff --git a/src/com/android/settings/core/SliderPreferenceController.java b/src/com/android/settings/core/SliderPreferenceController.java
new file mode 100644
index 0000000..0baa868
--- /dev/null
+++ b/src/com/android/settings/core/SliderPreferenceController.java
@@ -0,0 +1,62 @@
+/*
+ * 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.core;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.SeekBarPreference;
+
+import com.android.settings.slices.SliceData;
+
+public abstract class SliderPreferenceController extends BasePreferenceController implements
+ Preference.OnPreferenceChangeListener {
+
+ public SliderPreferenceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ return setSliderPosition((int) newValue);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ ((SeekBarPreference) preference).setValue(getSliderPosition());
+ }
+
+ /**
+ * @return the value of the Slider's position based on the range: [0, maxSteps).
+ */
+ public abstract int getSliderPosition();
+
+ /**
+ * Set the slider to a new value.
+ *
+ * @param position of the slider.
+ * @return {@code true} if the position is successfully set.
+ */
+ public abstract boolean setSliderPosition(int position);
+
+ /**
+ * @return the number of steps supported by the slider.
+ */
+ public abstract int getMaxSteps();
+
+ @Override
+ public int getSliceType() {
+ return SliceData.SliceType.SLIDER;
+ }
+}
diff --git a/src/com/android/settings/core/TogglePreferenceController.java b/src/com/android/settings/core/TogglePreferenceController.java
index cd4131d..779775b 100644
--- a/src/com/android/settings/core/TogglePreferenceController.java
+++ b/src/com/android/settings/core/TogglePreferenceController.java
@@ -58,7 +58,7 @@
@Override
public final boolean onPreferenceChange(Preference preference, Object newValue) {
- return setChecked((Boolean) newValue);
+ return setChecked((boolean) newValue);
}
@Override
diff --git a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
index 0f3bfb8..46bc120 100644
--- a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
@@ -18,8 +18,10 @@
import android.app.Activity;
import android.app.Fragment;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.ResolveInfo;
import android.os.Build;
import android.os.UserHandle;
import android.os.UserManager;
@@ -118,8 +120,8 @@
if (Utils.isMonkeyRunning()) {
return false;
}
- // Don't enable developer options for secondary users.
- if (!mUm.isAdminUser()) {
+ // Don't enable developer options for secondary non-demo users.
+ if (!(mUm.isAdminUser() || mUm.isDemoUser())) {
mMetricsFeatureProvider.action(
mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF);
return false;
@@ -133,6 +135,21 @@
}
if (mUm.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) {
+ if (mUm.isDemoUser()) {
+ // Route to demo device owner to lift the debugging restriction.
+ final ComponentName componentName = Utils.getDeviceOwnerComponent(mContext);
+ if (componentName != null) {
+ final Intent requestDebugFeatures = new Intent()
+ .setPackage(componentName.getPackageName())
+ .setAction("com.android.settings.action.REQUEST_DEBUG_FEATURES");
+ final ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(
+ requestDebugFeatures, 0);
+ if (resolveInfo != null) {
+ mContext.startActivity(requestDebugFeatures);
+ return false;
+ }
+ }
+ }
if (mDebuggingFeaturesDisallowedAdmin != null &&
!mDebuggingFeaturesDisallowedBySystem) {
RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mContext,
diff --git a/src/com/android/settings/gestures/GestureSettings.java b/src/com/android/settings/gestures/GestureSettings.java
index 1efac5b..b3f8b79 100644
--- a/src/com/android/settings/gestures/GestureSettings.java
+++ b/src/com/android/settings/gestures/GestureSettings.java
@@ -44,6 +44,7 @@
private static final String KEY_DOUBLE_TWIST = "gesture_double_twist_input_summary";
private static final String KEY_DOUBLE_TAP_SCREEN = "gesture_double_tap_screen_input_summary";
private static final String KEY_PICK_UP = "gesture_pick_up_input_summary";
+ private static final String KEY_PREVENT_RINGING = "gesture_prevent_ringing_summary";
private AmbientDisplayConfiguration mAmbientDisplayConfig;
@@ -86,6 +87,8 @@
ambientDisplayConfiguration, UserHandle.myUserId(), KEY_PICK_UP));
controllers.add(new DoubleTapScreenPreferenceController(context, lifecycle,
ambientDisplayConfiguration, UserHandle.myUserId(), KEY_DOUBLE_TAP_SCREEN));
+ controllers.add(new PreventRingingPreferenceController(
+ context, lifecycle, UserHandle.myUserId(), KEY_PREVENT_RINGING));
return controllers;
}
diff --git a/src/com/android/settings/gestures/PreventRingingGestureSettings.java b/src/com/android/settings/gestures/PreventRingingGestureSettings.java
new file mode 100644
index 0000000..9897b48
--- /dev/null
+++ b/src/com/android/settings/gestures/PreventRingingGestureSettings.java
@@ -0,0 +1,94 @@
+/*
+ * 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.os.UserHandle;
+import android.provider.SearchIndexableResource;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class PreventRingingGestureSettings extends DashboardFragment {
+
+ private static final String TAG = "RingingGestureSettings";
+ private static final String KEY_PREVENT_RINGING = "gesture_prevent_ringing";
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return MetricsProto.MetricsEvent.SETTINGS_PREVENT_RINGING;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.prevent_ringing_gesture_settings;
+ }
+
+ @Override
+ public int getHelpResource() {
+ return 0;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+ return buildPreferenceControllers(context, getLifecycle());
+ }
+
+ private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
+ Lifecycle lifecycle) {
+ final List<AbstractPreferenceController> controllers = new ArrayList<>();
+ controllers.add(new PreventRingingPreferenceController(context, lifecycle,
+ UserHandle.myUserId(), KEY_PREVENT_RINGING));
+ return controllers;
+ }
+
+ 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.prevent_ringing_gesture_settings;
+ return Arrays.asList(sir);
+ }
+
+ @Override
+ public List<AbstractPreferenceController> createPreferenceControllers(
+ Context context) {
+ return buildPreferenceControllers(context, null /* lifecycle */);
+ }
+ };
+
+}
diff --git a/src/com/android/settings/gestures/PreventRingingPreferenceController.java b/src/com/android/settings/gestures/PreventRingingPreferenceController.java
new file mode 100644
index 0000000..3255c92
--- /dev/null
+++ b/src/com/android/settings/gestures/PreventRingingPreferenceController.java
@@ -0,0 +1,169 @@
+/*
+ * 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.VOLUME_HUSH_GESTURE;
+import static android.provider.Settings.Secure.VOLUME_HUSH_MUTE;
+import static android.provider.Settings.Secure.VOLUME_HUSH_OFF;
+import static android.provider.Settings.Secure.VOLUME_HUSH_VIBRATE;
+
+import android.annotation.UserIdInt;
+import android.content.Context;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.widget.VideoPreference;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnCreate;
+import com.android.settingslib.core.lifecycle.events.OnPause;
+import com.android.settingslib.core.lifecycle.events.OnResume;
+import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
+
+public class PreventRingingPreferenceController extends AbstractPreferenceController
+ implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener,
+ LifecycleObserver, OnResume, OnPause, OnCreate, OnSaveInstanceState {
+
+ private static final String PREF_KEY_VIDEO = "gesture_prevent_ringing_video";
+ private final String mPrefKey;
+ @VisibleForTesting
+ static final String KEY_VIDEO_PAUSED = "key_video_paused";
+
+ private VideoPreference mVideoPreference;
+ @VisibleForTesting
+ boolean mVideoPaused;
+
+ private final String SECURE_KEY = VOLUME_HUSH_GESTURE;
+
+ @UserIdInt
+ private final int mUserId;
+
+ public PreventRingingPreferenceController(Context context, Lifecycle lifecycle,
+ @UserIdInt int userId, String key) {
+ super(context);
+ if (lifecycle != null) {
+ lifecycle.addObserver(this);
+ }
+ mUserId = userId;
+ mPrefKey = key;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ if (isAvailable()) {
+ mVideoPreference = (VideoPreference) screen.findPreference(getVideoPrefKey());
+ }
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ super.updateState(preference);
+ if (preference != null) {
+ if (preference instanceof ListPreference) {
+ ListPreference pref = (ListPreference) preference;
+ int value = Settings.Secure.getInt(
+ mContext.getContentResolver(), SECURE_KEY, VOLUME_HUSH_VIBRATE);
+ switch (value) {
+ case VOLUME_HUSH_VIBRATE:
+ pref.setValue(String.valueOf(value));
+ break;
+ case VOLUME_HUSH_MUTE:
+ pref.setValue(String.valueOf(value));
+ break;
+ default:
+ pref.setValue(String.valueOf(VOLUME_HUSH_OFF));
+ }
+ }
+ }
+ }
+
+ @Override
+ public CharSequence getSummary() {
+ int value = Settings.Secure.getInt(
+ mContext.getContentResolver(), SECURE_KEY, VOLUME_HUSH_VIBRATE);
+ int summary;
+ switch (value) {
+ case VOLUME_HUSH_VIBRATE:
+ summary = R.string.prevent_ringing_option_vibrate_summary;
+ break;
+ case VOLUME_HUSH_MUTE:
+ summary = R.string.prevent_ringing_option_mute_summary;
+ break;
+ default:
+ summary = R.string.prevent_ringing_option_none_summary;
+ }
+ return mContext.getString(summary);
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ if (savedInstanceState != null) {
+ mVideoPaused = savedInstanceState.getBoolean(KEY_VIDEO_PAUSED, false);
+ }
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ outState.putBoolean(KEY_VIDEO_PAUSED, mVideoPaused);
+ }
+
+ @Override
+ public void onPause() {
+ if (mVideoPreference != null) {
+ mVideoPaused = mVideoPreference.isVideoPaused();
+ mVideoPreference.onViewInvisible();
+ }
+ }
+
+ @Override
+ public void onResume() {
+ if (mVideoPreference != null) {
+ mVideoPreference.onViewVisible(mVideoPaused);
+ }
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return mContext.getResources()
+ .getBoolean(com.android.internal.R.bool.config_volumeHushGestureEnabled);
+ }
+
+ protected String getVideoPrefKey() {
+ return PREF_KEY_VIDEO;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return mPrefKey;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ int value = Integer.parseInt((String) newValue);
+ Settings.Secure.putInt(mContext.getContentResolver(), SECURE_KEY, value);
+ preference.setSummary(getSummary());
+ return true;
+ }
+}
diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java
index 75a78f8..2d7d9c0 100644
--- a/src/com/android/settings/password/ChooseLockPattern.java
+++ b/src/com/android/settings/password/ChooseLockPattern.java
@@ -20,9 +20,11 @@
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
+import android.content.res.ColorStateList;
import android.content.res.Resources.Theme;
import android.os.Bundle;
import android.util.Log;
+import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
@@ -171,6 +173,7 @@
private String mCurrentPattern;
private boolean mHasChallenge;
private long mChallenge;
+ protected TextView mTitleText;
protected TextView mHeaderText;
protected TextView mMessageText;
protected LockPatternView mLockPatternView;
@@ -179,6 +182,7 @@
private TextView mFooterRightButton;
protected List<LockPatternView.Cell> mChosenPattern = null;
private boolean mHideDrawer = false;
+ private ColorStateList mDefaultHeaderColorList;
// ScrollView that contains title and header, only exist in land mode
private ScrollView mTitleHeaderScrollView;
@@ -265,6 +269,9 @@
private void patternInProgress() {
mHeaderText.setText(R.string.lockpattern_recording_inprogress);
+ if (mDefaultHeaderColorList != null) {
+ mHeaderText.setTextColor(mDefaultHeaderColorList);
+ }
mFooterText.setText("");
mFooterLeftButton.setEnabled(false);
mFooterRightButton.setEnabled(false);
@@ -465,10 +472,13 @@
return layout;
}
+
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
+ mTitleText = view.findViewById(R.id.suw_layout_title);
mHeaderText = (TextView) view.findViewById(R.id.headerText);
+ mDefaultHeaderColorList = mHeaderText.getTextColors();
mMessageText = view.findViewById(R.id.message);
mLockPatternView = (LockPatternView) view.findViewById(R.id.lockPattern);
mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener);
@@ -664,6 +674,23 @@
mFooterText.setText(stage.footerMessage);
}
+ if (stage == Stage.ConfirmWrong || stage == Stage.ChoiceTooShort) {
+ TypedValue typedValue = new TypedValue();
+ Theme theme = getActivity().getTheme();
+ theme.resolveAttribute(R.attr.colorError, typedValue, true);
+ mHeaderText.setTextColor(typedValue.data);
+
+ } else {
+ if (mDefaultHeaderColorList != null) {
+ mHeaderText.setTextColor(mDefaultHeaderColorList);
+ }
+
+ if (stage == Stage.NeedToConfirm && mForFingerprint) {
+ mHeaderText.setText("");
+ mTitleText.setText(R.string.lockpassword_draw_your_pattern_again_header);
+ }
+ }
+
updateFooterLeftButton(stage, mFooterLeftButton);
setRightButtonText(stage.rightMode.text);
diff --git a/src/com/android/settings/password/ChooseLockSettingsHelper.java b/src/com/android/settings/password/ChooseLockSettingsHelper.java
index 11d40a3..cfc0ce8 100644
--- a/src/com/android/settings/password/ChooseLockSettingsHelper.java
+++ b/src/com/android/settings/password/ChooseLockSettingsHelper.java
@@ -279,13 +279,12 @@
CharSequence message, Class<?> activityClass, boolean returnCredentials,
boolean external, boolean hasChallenge, long challenge,
int userId, @Nullable CharSequence alternateButton, Bundle extras) {
- final boolean frp = (userId == LockPatternUtils.USER_FRP);
final Intent intent = new Intent();
intent.putExtra(ConfirmDeviceCredentialBaseFragment.TITLE_TEXT, title);
intent.putExtra(ConfirmDeviceCredentialBaseFragment.HEADER_TEXT, header);
intent.putExtra(ConfirmDeviceCredentialBaseFragment.DETAILS_TEXT, message);
intent.putExtra(ConfirmDeviceCredentialBaseFragment.ALLOW_FP_AUTHENTICATION, external);
- intent.putExtra(ConfirmDeviceCredentialBaseFragment.DARK_THEME, external && !frp);
+ intent.putExtra(ConfirmDeviceCredentialBaseFragment.DARK_THEME, false);
intent.putExtra(ConfirmDeviceCredentialBaseFragment.SHOW_CANCEL_BUTTON, external);
intent.putExtra(ConfirmDeviceCredentialBaseFragment.SHOW_WHEN_LOCKED, external);
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_RETURN_CREDENTIALS, returnCredentials);
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java
index ab8c3dc..1775394 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java
@@ -34,8 +34,8 @@
private static final String STATE_IS_KEYGUARD_LOCKED = "STATE_IS_KEYGUARD_LOCKED";
enum ConfirmCredentialTheme {
- INTERNAL,
- DARK,
+ NORMAL,
+ DARK, // TODO(yukl): Clean up DARK theme, as it should no longer be used
WORK
}
@@ -63,11 +63,11 @@
mConfirmCredentialTheme = ConfirmCredentialTheme.DARK;
} else {
setTheme(SetupWizardUtils.getTheme(getIntent()));
- mConfirmCredentialTheme = ConfirmCredentialTheme.INTERNAL;
+ mConfirmCredentialTheme = ConfirmCredentialTheme.NORMAL;
}
super.onCreate(savedState);
- if (mConfirmCredentialTheme == ConfirmCredentialTheme.INTERNAL) {
+ if (mConfirmCredentialTheme == ConfirmCredentialTheme.NORMAL) {
// Prevent the content parent from consuming the window insets because GlifLayout uses
// it to show the status bar background.
LinearLayout layout = (LinearLayout) findViewById(R.id.content_parent);
diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java
index dbca2fc..a7059da 100644
--- a/src/com/android/settings/password/ConfirmLockPassword.java
+++ b/src/com/android/settings/password/ConfirmLockPassword.java
@@ -121,8 +121,8 @@
ConfirmLockPassword activity = (ConfirmLockPassword) getActivity();
View view = inflater.inflate(
- activity.getConfirmCredentialTheme() == ConfirmCredentialTheme.INTERNAL
- ? R.layout.confirm_lock_password_internal
+ activity.getConfirmCredentialTheme() == ConfirmCredentialTheme.NORMAL
+ ? R.layout.confirm_lock_password_normal
: R.layout.confirm_lock_password,
container,
false);
diff --git a/src/com/android/settings/password/ConfirmLockPattern.java b/src/com/android/settings/password/ConfirmLockPattern.java
index c87ff43..84db540 100644
--- a/src/com/android/settings/password/ConfirmLockPattern.java
+++ b/src/com/android/settings/password/ConfirmLockPattern.java
@@ -109,8 +109,8 @@
Bundle savedInstanceState) {
ConfirmLockPattern activity = (ConfirmLockPattern) getActivity();
View view = inflater.inflate(
- activity.getConfirmCredentialTheme() == ConfirmCredentialTheme.INTERNAL
- ? R.layout.confirm_lock_pattern_internal
+ activity.getConfirmCredentialTheme() == ConfirmCredentialTheme.NORMAL
+ ? R.layout.confirm_lock_pattern_normal
: R.layout.confirm_lock_pattern,
container,
false);
diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java
index ddda5d8..802f1e4 100644
--- a/src/com/android/settings/slices/SettingsSliceProvider.java
+++ b/src/com/android/settings/slices/SettingsSliceProvider.java
@@ -74,9 +74,21 @@
public static final String ACTION_WIFI_CHANGED =
"com.android.settings.slice.action.WIFI_CHANGED";
+ /**
+ * Action passed for changes to Toggle Slices.
+ */
public static final String ACTION_TOGGLE_CHANGED =
"com.android.settings.slice.action.TOGGLE_CHANGED";
+ /**
+ * Action passed for changes to Slider Slices.
+ */
+ public static final String ACTION_SLIDER_CHANGED =
+ "com.android.settings.slice.action.SLIDER_CHANGED";
+
+ /**
+ * Intent Extra passed for the key identifying the Setting Slice.
+ */
public static final String EXTRA_SLICE_KEY = "com.android.settings.slice.extra.key";
// TODO -- Associate slice URI with search result instead of separate hardcoded thing
diff --git a/src/com/android/settings/slices/SliceBroadcastReceiver.java b/src/com/android/settings/slices/SliceBroadcastReceiver.java
index 4124df7..c455640 100644
--- a/src/com/android/settings/slices/SliceBroadcastReceiver.java
+++ b/src/com/android/settings/slices/SliceBroadcastReceiver.java
@@ -16,11 +16,11 @@
package com.android.settings.slices;
+import static com.android.settings.slices.SettingsSliceProvider.ACTION_SLIDER_CHANGED;
import static com.android.settings.slices.SettingsSliceProvider.ACTION_TOGGLE_CHANGED;
import static com.android.settings.slices.SettingsSliceProvider.ACTION_WIFI_CHANGED;
import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_KEY;
-import android.app.slice.Slice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -30,8 +30,13 @@
import android.text.TextUtils;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.SliderPreferenceController;
import com.android.settings.core.TogglePreferenceController;
+import android.app.slice.Slice;
+
+import androidx.slice.core.SliceHints;
+
/**
* Responds to actions performed on slices and notifies slices of updates in state changes.
*/
@@ -51,6 +56,10 @@
case ACTION_TOGGLE_CHANGED:
handleToggleAction(context, key);
break;
+ case ACTION_SLIDER_CHANGED:
+ int newPosition = intent.getIntExtra(SliceHints.EXTRA_RANGE_VALUE, -1);
+ handleSliderAction(context, key, newPosition);
+ break;
case ACTION_WIFI_CHANGED:
WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
boolean newState = intent.getBooleanExtra(Slice.EXTRA_TOGGLE_STATE,
@@ -85,6 +94,33 @@
toggleController.setChecked(!currentValue);
}
+ private void handleSliderAction(Context context, String key, int newPosition) {
+ if (TextUtils.isEmpty(key)) {
+ throw new IllegalArgumentException(
+ "No key passed to Intent for slider controller. Use extra: " + EXTRA_SLICE_KEY);
+ }
+
+ if (newPosition == -1) {
+ throw new IllegalArgumentException("Invalid position passed to Slider controller");
+ }
+
+ final BasePreferenceController controller = getPreferenceController(context, key);
+
+ if (!(controller instanceof SliderPreferenceController)) {
+ throw new IllegalArgumentException("Slider action passed for a non-slider key: " + key);
+ }
+
+ final SliderPreferenceController sliderController = (SliderPreferenceController) controller;
+ final int maxSteps = sliderController.getMaxSteps();
+ if (newPosition < 0 || newPosition > maxSteps) {
+ throw new IllegalArgumentException(
+ "Invalid position passed to Slider controller. Expected between 0 and "
+ + maxSteps + " but found " + newPosition);
+ }
+
+ sliderController.setSliderPosition(newPosition);
+ }
+
private BasePreferenceController getPreferenceController(Context context, String key) {
final SlicesDatabaseAccessor accessor = new SlicesDatabaseAccessor(context);
final SliceData sliceData = accessor.getSliceDataFromKey(key);
diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java
index 49972a8..43cba73 100644
--- a/src/com/android/settings/slices/SliceBuilderUtils.java
+++ b/src/com/android/settings/slices/SliceBuilderUtils.java
@@ -18,6 +18,8 @@
import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_KEY;
+import static androidx.slice.builders.ListBuilder.ICON_IMAGE;
+
import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.Context;
@@ -32,6 +34,7 @@
import com.android.settings.R;
import com.android.settings.SubSettings;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.SliderPreferenceController;
import com.android.settings.core.TogglePreferenceController;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -41,6 +44,7 @@
import androidx.slice.builders.ListBuilder;
import androidx.slice.builders.ListBuilder.RowBuilder;
+
/**
* Utility class to build Slices objects and Preference Controllers based on the Database managed
* by {@link SlicesDatabaseHelper}
@@ -57,28 +61,19 @@
* {@param sliceData} is an inline controller.
*/
public static Slice buildSlice(Context context, SliceData sliceData) {
- final PendingIntent contentIntent = getContentIntent(context, sliceData);
- final Icon icon = Icon.createWithResource(context, sliceData.getIconResource());
- final BasePreferenceController controller = getPreferenceController(context, sliceData);
-
- final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
-
- final RowBuilder builder = new RowBuilder(context, sliceData.getUri())
- .setTitle(sliceData.getTitle())
- .setTitleItem(icon)
- .setSubtitle(subtitleText)
- .setPrimaryAction(new SliceAction(contentIntent, null, null));
-
// TODO (b/71640747) Respect setting availability.
-
- if (sliceData.getSliceType() == SliceData.SliceType.SWITCH) {
- addToggleAction(context, builder, ((TogglePreferenceController) controller).isChecked(),
- sliceData.getKey());
+ final BasePreferenceController controller = getPreferenceController(context, sliceData);
+ switch (sliceData.getSliceType()) {
+ case SliceData.SliceType.INTENT:
+ return buildIntentSlice(context, sliceData, controller);
+ case SliceData.SliceType.SWITCH:
+ return buildToggleSlice(context, sliceData, controller);
+ case SliceData.SliceType.SLIDER:
+ return buildSliderSlice(context, sliceData, controller);
+ default:
+ throw new IllegalArgumentException(
+ "Slice type passed was invalid: " + sliceData.getSliceType());
}
-
- return new ListBuilder(context, sliceData.getUri())
- .addRow(builder)
- .build();
}
/**
@@ -145,6 +140,55 @@
.build();
}
+ private static Slice buildToggleSlice(Context context, SliceData sliceData,
+ BasePreferenceController controller) {
+ final PendingIntent contentIntent = getContentIntent(context, sliceData);
+ final Icon icon = Icon.createWithResource(context, sliceData.getIconResource());
+ final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
+ final TogglePreferenceController toggleController =
+ (TogglePreferenceController) controller;
+ final SliceAction sliceAction = getToggleAction(context, sliceData.getKey(),
+ toggleController.isChecked());
+
+ return new ListBuilder(context, sliceData.getUri())
+ .addRow(rowBuilder -> rowBuilder
+ .setTitle(sliceData.getTitle())
+ .setTitleItem(icon, ICON_IMAGE)
+ .setSubtitle(subtitleText)
+ .setPrimaryAction(new SliceAction(contentIntent, null, null))
+ .addEndItem(sliceAction))
+ .build();
+ }
+
+ private static Slice buildIntentSlice(Context context, SliceData sliceData,
+ BasePreferenceController controller) {
+ final PendingIntent contentIntent = getContentIntent(context, sliceData);
+ final Icon icon = Icon.createWithResource(context, sliceData.getIconResource());
+ final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
+
+ return new ListBuilder(context, sliceData.getUri())
+ .addRow(rowBuilder -> rowBuilder
+ .setTitle(sliceData.getTitle())
+ .setTitleItem(icon, ICON_IMAGE)
+ .setSubtitle(subtitleText)
+ .setPrimaryAction(new SliceAction(contentIntent, null, null)))
+ .build();
+ }
+
+ private static Slice buildSliderSlice(Context context, SliceData sliceData,
+ BasePreferenceController controller) {
+ final SliderPreferenceController sliderController =
+ (SliderPreferenceController) controller;
+ final PendingIntent actionIntent = getSliderAction(context, sliceData.getKey());
+ return new ListBuilder(context, sliceData.getUri())
+ .addInputRange(builder -> builder
+ .setTitle(sliceData.getTitle())
+ .setMax(sliderController.getMaxSteps())
+ .setValue(sliderController.getSliderPosition())
+ .setAction(actionIntent))
+ .build();
+ }
+
private static BasePreferenceController getPreferenceController(Context context,
String controllerClassName, String controllerKey) {
try {
@@ -156,11 +200,14 @@
return BasePreferenceController.createInstance(context, controllerClassName, controllerKey);
}
- private static void addToggleAction(Context context, RowBuilder builder, boolean isChecked,
- String key) {
+ private static SliceAction getToggleAction(Context context, String key, boolean isChecked) {
PendingIntent actionIntent = getActionIntent(context,
SettingsSliceProvider.ACTION_TOGGLE_CHANGED, key);
- builder.addEndItem(new SliceAction(actionIntent, null, isChecked));
+ return new SliceAction(actionIntent, null, isChecked);
+ }
+
+ private static PendingIntent getSliderAction(Context context, String key) {
+ return getActionIntent(context, SettingsSliceProvider.ACTION_SLIDER_CHANGED, key);
}
private static PendingIntent getActionIntent(Context context, String action, String key) {
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java b/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java
index 699e5ae..dc6c6c9 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java
@@ -59,6 +59,7 @@
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
mSwitchBar.setChecked(mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_ENABLED);
mSwitchBar.setListener(this);
+ updateWifiSwitch();
}
@Override
@@ -103,7 +104,7 @@
WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED);
handleWifiApStateChanged(state);
} else if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) {
- enableWifiSwitch();
+ updateWifiSwitch();
}
}
};
@@ -117,7 +118,7 @@
if (!mSwitchBar.isChecked()) {
mSwitchBar.setChecked(true);
}
- enableWifiSwitch();
+ updateWifiSwitch();
break;
case WifiManager.WIFI_AP_STATE_DISABLING:
if (mSwitchBar.isChecked()) {
@@ -127,16 +128,16 @@
break;
case WifiManager.WIFI_AP_STATE_DISABLED:
mSwitchBar.setChecked(false);
- enableWifiSwitch();
+ updateWifiSwitch();
break;
default:
mSwitchBar.setChecked(false);
- enableWifiSwitch();
+ updateWifiSwitch();
break;
}
}
- private void enableWifiSwitch() {
+ private void updateWifiSwitch() {
boolean isAirplaneMode = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
if (!isAirplaneMode) {
diff --git a/tests/robotests/src/com/android/settings/core/SliderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/core/SliderPreferenceControllerTest.java
new file mode 100644
index 0000000..f9f656e
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/core/SliderPreferenceControllerTest.java
@@ -0,0 +1,100 @@
+/*
+ * 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.core;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.support.v7.preference.SeekBarPreference;
+
+import com.android.settings.slices.SliceData;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class SliderPreferenceControllerTest {
+
+ FakeSlider mSliderController;
+
+ Context mContext;
+ SeekBarPreference mPreference;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ mPreference = new SeekBarPreference(mContext);
+ mSliderController = new FakeSlider(mContext, "key");
+ }
+
+ @Test
+ public void onPreferenceChange_updatesPosition() {
+ final int newValue = 28;
+
+ mSliderController.onPreferenceChange(mPreference, newValue);
+
+ assertThat(mSliderController.getSliderPosition()).isEqualTo(newValue);
+ }
+
+ @Test
+ public void updateState_setsPreferenceToCurrentValue() {
+ final int newValue = 28;
+ mSliderController.setSliderPosition(newValue);
+
+ mSliderController.updateState(mPreference);
+
+ assertThat(mPreference.getValue()).isEqualTo(newValue);
+ }
+
+ @Test
+ public void testSliceType_returnsSliceType() {
+ assertThat(mSliderController.getSliceType()).isEqualTo(
+ SliceData.SliceType.SLIDER);
+ }
+
+ private class FakeSlider extends SliderPreferenceController {
+
+ private final int MAX_STEPS = 2112;
+ private int mPosition;
+
+ public FakeSlider(Context context, String key) {
+ super(context, key);
+ }
+
+ @Override
+ public int getSliderPosition() {
+ return mPosition;
+ }
+
+ @Override
+ public boolean setSliderPosition(int position) {
+ mPosition = position;
+ return true;
+ }
+
+ @Override
+ public int getMaxSteps() {
+ return MAX_STEPS;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
index 7c49a06..9272b46 100644
--- a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
@@ -118,6 +118,7 @@
final Context appContext = RuntimeEnvironment.application;
DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(appContext, true);
mShadowUserManager.setIsAdminUser(false);
+ mShadowUserManager.setIsDemoUser(false);
final List<String> nonIndexableKeys =
DevelopmentSettingsDashboardFragment.SEARCH_INDEX_DATA_PROVIDER
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
index 37b85ea..09fa019 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
@@ -22,7 +22,6 @@
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -57,7 +56,6 @@
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowUserManager;
-import org.robolectric.util.ReflectionHelpers;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(shadows = ShadowUtils.class)
@@ -84,24 +82,27 @@
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
final UserManager userManager =
- (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ (UserManager) mContext.getSystemService(Context.USER_SERVICE);
mShadowUserManager = Shadows.shadowOf(userManager);
mShadowUserManager.setIsAdminUser(true);
mFactory = FakeFeatureFactory.setupForTest();
mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner);
mController =
- new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle);
+ new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle);
mPreference = new Preference(mContext);
mPreference.setKey(mController.getPreferenceKey());
DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(mContext, false);
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.DEVICE_PROVISIONED, 1);
}
@After
public void tearDown() {
ShadowUtils.reset();
mShadowUserManager.setIsAdminUser(false);
+ mShadowUserManager.setIsDemoUser(false);
}
@Test
@@ -119,20 +120,36 @@
}
@Test
- public void handlePrefTreeClick_notAdminUser_doNothing() {
+ public void handlePrefTreeClick_notAdminUser_notDemoUser_doNothing() {
mShadowUserManager.setIsAdminUser(false);
+ mShadowUserManager.setIsDemoUser(false);
assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
}
@Test
- public void handlePrefTreeClick_deviceNotProvisioned_doNothing() {
- final Context context = RuntimeEnvironment.application;
- Settings.Global.putInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0);
+ public void handlePrefTreeClick_isAdminUser_notDemoUser_handleBuildNumberPref() {
+ mShadowUserManager.setIsAdminUser(true);
+ mShadowUserManager.setIsDemoUser(false);
- mController =
- new BuildNumberPreferenceController(context, mActivity, mFragment, mLifecycle);
- ReflectionHelpers.setField(mController, "mContext", context);
+ assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
+ }
+
+ @Test
+ public void handlePrefTreeClick_notAdminUser_isDemoUser_handleBuildNumberPref() {
+ mShadowUserManager.setIsAdminUser(false);
+ mShadowUserManager.setIsDemoUser(true);
+
+ assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
+ }
+
+ @Test
+ public void handlePrefTreeClick_deviceNotProvisioned_doNothing() {
+ mShadowUserManager.setIsAdminUser(true);
+ mShadowUserManager.setIsDemoUser(false);
+
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,
+ 0);
assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
verify(mFactory.metricsFeatureProvider).action(
@@ -142,26 +159,17 @@
@Test
public void handlePrefTreeClick_isMonkeyRun_doNothing() {
- final Context context = spy(RuntimeEnvironment.application);
- Settings.Global.putInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
ShadowUtils.setIsUserAMonkey(true);
- mController =
- new BuildNumberPreferenceController(context, mActivity, mFragment, mLifecycle);
-
assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
}
@Test
public void handlePrefTreeClick_userHasRestriction_doNothing() {
- final Context context = spy(RuntimeEnvironment.application);
- Settings.Global.putInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
+ mShadowUserManager.setIsAdminUser(true);
+ mShadowUserManager.setIsDemoUser(false);
mShadowUserManager.setUserRestriction(Process.myUserHandle(),
- UserManager.DISALLOW_DEBUGGING_FEATURES, true);
-
- mController =
- new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle);
- ReflectionHelpers.setField(mController, "mContext", context);
+ UserManager.DISALLOW_DEBUGGING_FEATURES, true);
assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
verify(mFactory.metricsFeatureProvider).action(
@@ -197,7 +205,7 @@
.thenReturn(mock(DatabaseIndexingManager.class));
mController =
- new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle);
+ new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle);
final boolean activityResultHandled = mController.onActivityResult(
BuildNumberPreferenceController.REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF,
diff --git a/tests/robotests/src/com/android/settings/gestures/PreventRingingGestureSettingsTest.java b/tests/robotests/src/com/android/settings/gestures/PreventRingingGestureSettingsTest.java
new file mode 100644
index 0000000..47bb470
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/gestures/PreventRingingGestureSettingsTest.java
@@ -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 PreventRingingGestureSettingsTest {
+
+ private PreventRingingGestureSettings mSettings;
+
+ @Before
+ public void setUp() {
+ mSettings = new PreventRingingGestureSettings();
+ }
+
+ @Test
+ public void testSearchIndexProvider_shouldIndexResource() {
+ final List<SearchIndexableResource> indexRes =
+ PreventRingingGestureSettings.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(
+ RuntimeEnvironment.application, true /* enabled */);
+
+ assertThat(indexRes).isNotNull();
+ assertThat(indexRes.get(0).xmlResId).isEqualTo(mSettings.getPreferenceScreenResId());
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/gestures/PreventRingingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PreventRingingPreferenceControllerTest.java
new file mode 100644
index 0000000..d92e0e0
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/gestures/PreventRingingPreferenceControllerTest.java
@@ -0,0 +1,158 @@
+/*
+ * 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.VOLUME_HUSH_GESTURE;
+import static android.provider.Settings.Secure.VOLUME_HUSH_MUTE;
+import static android.provider.Settings.Secure.VOLUME_HUSH_OFF;
+import static android.provider.Settings.Secure.VOLUME_HUSH_VIBRATE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static junit.framework.Assert.assertEquals;
+
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.provider.Settings;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+
+import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.settings.R;
+import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl;
+import com.android.settings.search.InlinePayload;
+import com.android.settings.search.InlineSwitchPayload;
+import com.android.settings.search.ResultPayload;
+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 PreventRingingPreferenceControllerTest {
+
+ private static final String KEY_PICK_UP = "gesture_prevent_ringing";
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private Context mContext;
+
+ private PreventRingingPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mController = new PreventRingingPreferenceController(
+ mContext, null, 0, KEY_PICK_UP);
+ }
+
+ @Test
+ public void testIsAvailable_configIsTrue_shouldReturnTrue() {
+ when(mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_volumeHushGestureEnabled)).thenReturn(true);
+
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void testIsAvailable_configIsFalse_shouldReturnFalse() {
+ when(mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_volumeHushGestureEnabled)).thenReturn(false);
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void testGetSummary_mute() {
+ Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
+ Settings.Secure.VOLUME_HUSH_MUTE);
+ assertEquals(mContext.getString(R.string.prevent_ringing_option_mute_summary),
+ mController.getSummary());
+ }
+
+ @Test
+ public void testGetSummary_vibrate() {
+ Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
+ Settings.Secure.VOLUME_HUSH_VIBRATE);
+ assertEquals(mContext.getString(R.string.prevent_ringing_option_vibrate_summary),
+ mController.getSummary());
+ }
+ @Test
+ public void testGetSummary_other() {
+ Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
+ 7);
+ assertEquals(mContext.getString(R.string.prevent_ringing_option_none_summary),
+ mController.getSummary());
+ }
+
+ @Test
+ public void testUpdateState_mute() {
+ ListPreference pref = mock(ListPreference.class);
+ Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
+ Settings.Secure.VOLUME_HUSH_MUTE);
+ mController.updateState(pref);
+ verify(pref).setValue(String.valueOf(Settings.Secure.VOLUME_HUSH_MUTE));
+ }
+
+ @Test
+ public void testUpdateState_vibrate() {
+ ListPreference pref = mock(ListPreference.class);
+ Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
+ Settings.Secure.VOLUME_HUSH_VIBRATE);
+ mController.updateState(pref);
+ verify(pref).setValue(String.valueOf(Settings.Secure.VOLUME_HUSH_VIBRATE));
+ }
+
+ @Test
+ public void testUpdateState_other() {
+ ListPreference pref = mock(ListPreference.class);
+ Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
+ 7);
+ mController.updateState(pref);
+ verify(pref).setValue(String.valueOf(Settings.Secure.VOLUME_HUSH_OFF));
+ }
+
+ @Test
+ public void testUpdateState_parentPage() {
+ Preference pref = mock(Preference.class);
+ // verify no exception
+ mController.updateState(pref);
+ }
+
+ @Test
+ public void testOnPreferenceChange() {
+ Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
+ 7);
+
+ mController.onPreferenceChange(mock(Preference.class), String.valueOf(VOLUME_HUSH_MUTE));
+
+ assertEquals(VOLUME_HUSH_MUTE, Settings.Secure.getInt(mContext.getContentResolver(),
+ VOLUME_HUSH_GESTURE, VOLUME_HUSH_OFF));
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java
index f1c8a54..bcb154c 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java
@@ -63,7 +63,7 @@
(startedIntent.getFlags() & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0);
assertEquals(true, startedIntent.getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.ALLOW_FP_AUTHENTICATION, false));
- assertEquals(true, startedIntent.getBooleanExtra(
+ assertFalse(startedIntent.getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.DARK_THEME, false));
assertEquals(true, startedIntent.getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.SHOW_CANCEL_BUTTON, false));
@@ -101,7 +101,7 @@
(startedIntent.getFlags() & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0);
assertEquals(false, startedIntent.getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.ALLOW_FP_AUTHENTICATION, false));
- assertEquals(false, startedIntent.getBooleanExtra(
+ assertFalse(startedIntent.getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.DARK_THEME, false));
assertEquals(false, startedIntent.getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.SHOW_CANCEL_BUTTON, false));
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
index 965bec3..525ecc7 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
@@ -18,7 +18,6 @@
package com.android.settings.slices;
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.mock;
import android.content.ContentValues;
import android.content.Context;
@@ -28,7 +27,9 @@
import com.android.settings.search.FakeIndexProvider;
import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl;
+import com.android.settings.testutils.DatabaseTestUtils;
import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.FakeSliderController;
import com.android.settings.testutils.FakeToggleController;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -38,6 +39,8 @@
import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
+import androidx.slice.core.SliceHints;
+
@RunWith(SettingsRobolectricTestRunner.class)
public class SliceBroadcastReceiverTest {
@@ -46,7 +49,7 @@
private final String fakeScreenTitle = "screen_title";
private final int fakeIcon = 1234;
private final String fakeFragmentClassName = FakeIndexProvider.class.getName();
- private final String fakeControllerName = FakeToggleController.class.getName();
+ private final Class fakeControllerName = FakeToggleController.class;
private Context mContext;
private SQLiteDatabase mDb;
@@ -68,7 +71,7 @@
@After
public void cleanUp() {
- mFakeFeatureFactory.searchFeatureProvider = mock(SearchFeatureProvider.class);
+ DatabaseTestUtils.clearDb(mContext);
}
@Test
@@ -90,20 +93,74 @@
assertThat(fakeToggleController.isChecked()).isFalse();
}
+ @Test
+ public void testOnReceive_sliderChanged() {
+ String key = "key";
+ final int position = FakeSliderController.MAX_STEPS - 1;
+ final int oldPosition = FakeSliderController.MAX_STEPS;
+ mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear();
+ insertSpecialCase(FakeSliderController.class, key);
+
+ // Set slider setting
+ FakeSliderController fakeSliderController = new FakeSliderController(mContext, key);
+ fakeSliderController.setSliderPosition(oldPosition);
+ // Build action
+ Intent intent = new Intent(SettingsSliceProvider.ACTION_SLIDER_CHANGED);
+ intent.putExtra(SliceHints.EXTRA_RANGE_VALUE, position);
+ intent.putExtra(SettingsSliceProvider.EXTRA_SLICE_KEY, key);
+
+ assertThat(fakeSliderController.getSliderPosition()).isEqualTo(oldPosition);
+
+ // Update the setting.
+ mReceiver.onReceive(mContext, intent);
+
+ assertThat(fakeSliderController.getSliderPosition()).isEqualTo(position);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testOnReceive_invalidController_throwsException() {
+ String key = "key";
+ final int position = 0;
+ mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear();
+ insertSpecialCase(FakeToggleController.class, key);
+
+ // Build action
+ Intent intent = new Intent(SettingsSliceProvider.ACTION_SLIDER_CHANGED);
+ intent.putExtra(SliceHints.EXTRA_RANGE_VALUE, position);
+ intent.putExtra(SettingsSliceProvider.EXTRA_SLICE_KEY, key);
+
+ // Trigger the exception.
+ mReceiver.onReceive(mContext, intent);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void sliderOnReceive_noKey_throwsException() {
+ // Build action
+ Intent intent = new Intent(SettingsSliceProvider.ACTION_SLIDER_CHANGED);
+ intent.putExtra(SliceHints.EXTRA_RANGE_VALUE, 0);
+
+ // Trigger the exception.
+ mReceiver.onReceive(mContext, intent);
+ }
+
@Test(expected = IllegalStateException.class)
- public void testOnReceive_noExtra_illegalSatetException() {
+ public void toggleOnReceive_noExtra_illegalStateException() {
Intent intent = new Intent(SettingsSliceProvider.ACTION_TOGGLE_CHANGED);
mReceiver.onReceive(mContext, intent);
}
@Test(expected = IllegalStateException.class)
- public void testOnReceive_emptyKey_throwsIllegalStateException() {
+ public void toggleOnReceive_emptyKey_throwsIllegalStateException() {
Intent intent = new Intent(SettingsSliceProvider.ACTION_TOGGLE_CHANGED);
intent.putExtra(SettingsSliceProvider.EXTRA_SLICE_KEY, (String) null);
mReceiver.onReceive(mContext, intent);
}
private void insertSpecialCase(String key) {
+ insertSpecialCase(fakeControllerName, key);
+ }
+
+ private void insertSpecialCase(Class controllerClass, String key) {
ContentValues values = new ContentValues();
values.put(SlicesDatabaseHelper.IndexColumns.KEY, key);
values.put(SlicesDatabaseHelper.IndexColumns.TITLE, fakeTitle);
@@ -111,8 +168,7 @@
values.put(SlicesDatabaseHelper.IndexColumns.SCREENTITLE, fakeScreenTitle);
values.put(SlicesDatabaseHelper.IndexColumns.ICON_RESOURCE, fakeIcon);
values.put(SlicesDatabaseHelper.IndexColumns.FRAGMENT, fakeFragmentClassName);
- values.put(SlicesDatabaseHelper.IndexColumns.CONTROLLER, fakeControllerName);
-
+ values.put(SlicesDatabaseHelper.IndexColumns.CONTROLLER, controllerClass.getName());
mDb.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values);
}
}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
index 869ba48..d0c0326 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
@@ -28,6 +28,7 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.FakeSliderController;
import com.android.settings.testutils.FakeToggleController;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -69,6 +70,14 @@
}
@Test
+ public void testSliderSlice_returnsSeekBarSlice() {
+ final Slice slice = SliceBuilderUtils.buildSlice(mContext, getDummyData(
+ FakeSliderController.class));
+
+ assertThat(slice).isNotNull();
+ }
+
+ @Test
public void testUriBuilder_oemAuthority_intentPath_returnsValidSliceUri() {
Uri expectedUri = new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
diff --git a/tests/robotests/src/com/android/settings/testutils/FakeSliderController.java b/tests/robotests/src/com/android/settings/testutils/FakeSliderController.java
new file mode 100644
index 0000000..f4f91ed
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/FakeSliderController.java
@@ -0,0 +1,54 @@
+/*
+ * 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.testutils;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.SliderPreferenceController;
+
+public class FakeSliderController extends SliderPreferenceController {
+
+ private final String settingKey = "fake_slider_key";
+
+ public static final int MAX_STEPS = 9;
+
+ public FakeSliderController(Context context, String key) {
+ super(context, key);
+ }
+
+ @Override
+ public int getSliderPosition() {
+ return Settings.System.getInt(mContext.getContentResolver(), settingKey, 0);
+ }
+
+ @Override
+ public boolean setSliderPosition(int position) {
+ return Settings.System.putInt(mContext.getContentResolver(), settingKey, position);
+ }
+
+ @Override
+ public int getMaxSteps() {
+ return MAX_STEPS;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return BasePreferenceController.AVAILABLE;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSwitchBarControllerTest.java
new file mode 100644
index 0000000..660f335
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSwitchBarControllerTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.wifi.tether;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.wifi.WifiManager;
+import android.provider.Settings;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.widget.SwitchBar;
+import com.android.settings.widget.SwitchBarController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class WifiTetherSwitchBarControllerTest {
+ @Mock
+ private WifiManager mWifiManager;
+
+ private Context mContext;
+ private SwitchBar mSwitchBar;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mContext = spy(RuntimeEnvironment.application);
+ mSwitchBar = new SwitchBar(mContext);
+ when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager);
+ }
+
+ @Test
+ public void testConstructor_airplaneModeOn_switchBarDisabled() {
+ Settings.Global.putInt(RuntimeEnvironment.application.getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_ON, 1);
+
+ final WifiTetherSwitchBarController controller = new WifiTetherSwitchBarController(
+ mContext, new SwitchBarController(mSwitchBar));
+
+ assertThat(mSwitchBar.isEnabled()).isFalse();
+ }
+}