diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 1a0c3a1fd73..14fe92b4373 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -700,6 +700,7 @@
+
+
+
+
+
+
+
+
+
+
+
+ android:parentActivityName="Settings$ZenModeSettingsActivity">
@@ -834,7 +853,7 @@
android:name="Settings$ZenModeScheduleRuleSettingsActivity"
android:exported="true"
android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings">
+ android:parentActivityName="Settings$ZenModeAutomationSettingsActivity">
@@ -853,7 +872,7 @@
android:name="Settings$ZenModeEventRuleSettingsActivity"
android:exported="true"
android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings">
+ android:parentActivityName="Settings$ZenModeAutomationSettingsActivity">
diff --git a/res/drawable-nodpi/aab_brightness b/res/drawable-nodpi/aab_brightness
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/res/drawable-nodpi/gesture_prevent_ringing b/res/drawable-nodpi/gesture_prevent_ringing
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/res/layout/preference_app.xml b/res/layout/preference_app.xml
index 2e134dee207..66050410847 100644
--- a/res/layout/preference_app.xml
+++ b/res/layout/preference_app.xml
@@ -95,8 +95,8 @@
android:id="@android:id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:gravity="end|center_vertical"
- android:paddingStart="16dp"
+ android:gravity="center"
+ android:minWidth="64dp"
android:orientation="vertical" />
diff --git a/res/layout/preference_volume_slider.xml b/res/layout/preference_volume_slider.xml
index 4bed21850b7..7e146b88ba8 100644
--- a/res/layout/preference_volume_slider.xml
+++ b/res/layout/preference_volume_slider.xml
@@ -56,7 +56,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:paddingStart="16dp"
+ android:paddingStart="12dp"
android:singleLine="true"
android:textAppearance="@android:style/TextAppearance.Material.Subhead"
android:textColor="?android:attr/textColorPrimary"
@@ -68,7 +68,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="end|center_vertical"
- android:paddingStart="16dp"
+ android:paddingStart="12dp"
android:orientation="vertical"/>
@@ -80,6 +80,7 @@
@@ -87,7 +88,7 @@
android:id="@+id/suppression_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingStart="16dp"
+ android:paddingStart="12dp"
android:layout_gravity="center_vertical|start"
android:textAlignment="viewStart"
android:singleLine="true"
diff --git a/res/layout/zen_onboarding.xml b/res/layout/zen_onboarding.xml
new file mode 100644
index 00000000000..05b38f2acaf
--- /dev/null
+++ b/res/layout/zen_onboarding.xml
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/raw/aab_brightness.mp4 b/res/raw/aab_brightness.mp4
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/res/raw/gesture_prevent_ringing.mp4 b/res/raw/gesture_prevent_ringing.mp4
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 72b1a0ab340..43d55630d2e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1592,7 +1592,7 @@
Paired devices
- Available media devices
+ Available devices
No devices available
@@ -5924,10 +5924,6 @@
Removing this account will delete all of its messages, contacts, and other data from the device!
This change isn\'t allowed by your admin
-
- Push subscriptions
-
- %s
Can\u2019t manually sync
@@ -6668,6 +6664,8 @@
+
+
@@ -7325,6 +7323,16 @@
- %d rules can turn on automatically
+ Ok
+ Settings
+ You can further customize this in Settings.
+ Block when the screen is on
+ Block when the screen is off
+ Do Not Disturb can do more than block unwanted sounds - it can block visuals too. This may be helpful if you\'re trying to sleep, focus, or limit time spent on your phone.
+ Block sounds and visuals
+ Don\'t turn on the screen or show notifications in the ambient display
+ Don\'t show notifications at all, except for basic phone activity and status
+
Work profile sounds
@@ -7515,9 +7523,9 @@
Notification assistant
- ~%1$s sent daily
+ ~%1$s per day
- ~%1$s sent weekly
+ ~%1$s per week
Never
@@ -9835,6 +9843,9 @@
Play media to
+
+ This device
+
Phone
@@ -9866,6 +9877,8 @@
Prevent ringing
Press Power & Volume Up together
+
+ Shortcut to prevent ringing
Vibrate
@@ -9873,11 +9886,11 @@
Do nothing
- Vibrate all calls and notifications
+ On (vibrate)
- Mute all calls and notifications
+ On (mute)
- Do nothing
+ Off
Network details
diff --git a/res/xml/auto_brightness_detail.xml b/res/xml/auto_brightness_detail.xml
new file mode 100644
index 00000000000..aca9f141b72
--- /dev/null
+++ b/res/xml/auto_brightness_detail.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index eaa4a6b498c..90198ae70cf 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -39,15 +39,12 @@
settings:widgetLayout="@null"
settings:keywords="@string/keywords_display_night_display" />
-
-
+ android:fragment="com.android.settings.display.AutoBrightnessSettings"
+ settings:controller="com.android.settings.display.AutoBrightnessPreferenceController" />
+ android:fragment="com.android.settings.gestures.PreventRingingGestureSettings"
+ settings:controller="com.android.settings.gestures.PreventRingingPreferenceController" />
diff --git a/res/xml/prevent_ringing_gesture_settings.xml b/res/xml/prevent_ringing_gesture_settings.xml
index 10732fce884..08146e4fbfc 100644
--- a/res/xml/prevent_ringing_gesture_settings.xml
+++ b/res/xml/prevent_ringing_gesture_settings.xml
@@ -21,15 +21,17 @@
android:key="gesture_prevent_ringing_screen"
android:title="@string/gesture_prevent_ringing_screen_title">
-
+ android:key="gesture_prevent_ringing_video"
+ app:animation="@raw/gesture_prevent_ringing"
+ app:preview="@drawable/gesture_prevent_ringing" />
\ No newline at end of file
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
index 7fd3709e3df..9772fa2bd65 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -20,7 +20,7 @@
android:title="@string/sound_settings"
android:key="sound_settings"
settings:keywords="@string/keywords_sounds"
- settings:initialExpandedChildrenCount="7">
+ settings:initialExpandedChildrenCount="8">
+
+
getXmlResourcesToIndex(
+ Context context, boolean enabled) {
+ final SearchIndexableResource sir = new SearchIndexableResource(context);
+ sir.xmlResId = R.xml.auto_brightness_detail;
+ return Arrays.asList(sir);
+ }
+ };
+}
diff --git a/src/com/android/settings/display/ColorModePreferenceController.java b/src/com/android/settings/display/ColorModePreferenceController.java
index 7fa978209d7..31f53930a7e 100644
--- a/src/com/android/settings/display/ColorModePreferenceController.java
+++ b/src/com/android/settings/display/ColorModePreferenceController.java
@@ -41,7 +41,9 @@ public class ColorModePreferenceController extends BasePreferenceController {
@Override
public int getAvailabilityStatus() {
- return mConfigWrapper.isScreenWideColorGamut() ? AVAILABLE : DISABLED_FOR_USER;
+ return mConfigWrapper.isScreenWideColorGamut()
+ && !getColorDisplayController().getAccessibilityTransformActivated() ?
+ AVAILABLE : DISABLED_FOR_USER;
}
@Override
diff --git a/src/com/android/settings/display/ColorModePreferenceFragment.java b/src/com/android/settings/display/ColorModePreferenceFragment.java
index 089a5a608ba..9f947e9e97a 100644
--- a/src/com/android/settings/display/ColorModePreferenceFragment.java
+++ b/src/com/android/settings/display/ColorModePreferenceFragment.java
@@ -16,7 +16,6 @@ package com.android.settings.display;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.internal.app.ColorDisplayController;
@@ -25,7 +24,6 @@ import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.R;
import com.android.settings.widget.RadioButtonPickerFragment;
-import com.android.settings.widget.RadioButtonPreference;
import com.android.settingslib.widget.CandidateInfo;
import java.util.Arrays;
@@ -81,14 +79,13 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment
@Override
protected List extends CandidateInfo> getCandidates() {
Context c = getContext();
- final boolean enabled = !mController.getAccessibilityTransformActivated();
return Arrays.asList(
new ColorModeCandidateInfo(c.getText(R.string.color_mode_option_natural),
- KEY_COLOR_MODE_NATURAL, enabled),
+ KEY_COLOR_MODE_NATURAL, true /* enabled */),
new ColorModeCandidateInfo(c.getText(R.string.color_mode_option_boosted),
- KEY_COLOR_MODE_BOOSTED, enabled),
+ KEY_COLOR_MODE_BOOSTED, true /* enabled */),
new ColorModeCandidateInfo(c.getText(R.string.color_mode_option_saturated),
- KEY_COLOR_MODE_SATURATED, enabled)
+ KEY_COLOR_MODE_SATURATED, true /* enabled */)
);
}
@@ -153,16 +150,10 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment
@Override
public void onAccessibilityTransformChanged(boolean state) {
- // Disable controls when a11y transforms are enabled, and vice versa
- final PreferenceScreen screen = getPreferenceScreen();
- if (screen != null) {
- final int count = screen.getPreferenceCount();
- for (int i = 0; i < count; i++) {
- final Preference pref = screen.getPreference(i);
- if (pref instanceof RadioButtonPreference) {
- pref.setEnabled(!state);
- }
- }
+ // Color modes are no not configurable when Accessibility transforms are enabled. Close
+ // this fragment in that case.
+ if (state) {
+ getActivity().onBackPressed();
}
}
}
diff --git a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
index fce8a65e215..7fdf8294cb9 100644
--- a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
@@ -72,8 +72,8 @@ public class RestrictAppPreferenceController extends BasePreferenceController {
mAppInfos = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager, mUserManager);
final int num = mAppInfos.size();
- // Enable the preference if some apps already been restricted, otherwise disable it
- preference.setEnabled(num > 0);
+ // Don't show it if no app been restricted
+ preference.setVisible(num > 0);
preference.setSummary(
mContext.getResources().getQuantityString(R.plurals.restricted_app_summary, num,
num));
diff --git a/src/com/android/settings/fuelgauge/SmartBatterySettings.java b/src/com/android/settings/fuelgauge/SmartBatterySettings.java
index 43ac960679c..bcbac3f1c81 100644
--- a/src/com/android/settings/fuelgauge/SmartBatterySettings.java
+++ b/src/com/android/settings/fuelgauge/SmartBatterySettings.java
@@ -27,7 +27,6 @@ import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.widget.FooterPreferenceMixin;
import java.util.ArrayList;
import java.util.Arrays;
@@ -39,9 +38,6 @@ import java.util.List;
public class SmartBatterySettings extends DashboardFragment {
public static final String TAG = "SmartBatterySettings";
- private final FooterPreferenceMixin mFooterPreferenceMixin =
- new FooterPreferenceMixin(this, getLifecycle());
-
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -93,11 +89,6 @@ public class SmartBatterySettings extends DashboardFragment {
return Arrays.asList(sir);
}
- @Override
- public List getNonIndexableKeys(Context context) {
- return super.getNonIndexableKeys(context);
- }
-
@Override
public List createPreferenceControllers(
Context context) {
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
index 7720dcc12e2..8928efd3c4a 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
@@ -175,7 +175,7 @@ public class AnomalyDetectionJobService extends JobService {
metricsFeatureProvider.action(context,
MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
packageName,
- Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT,
+ Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE,
anomalyInfo.anomalyType));
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java
index 17284a0de26..5520bf3f3dd 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java
@@ -47,6 +47,10 @@ public class BatteryTipPolicy {
private static final String KEY_DATA_HISTORY_RETAIN_DAY = "data_history_retain_day";
private static final String KEY_EXCESSIVE_BG_DRAIN_PERCENTAGE = "excessive_bg_drain_percentage";
+ private static final String KEY_TEST_BATTERY_SAVER_TIP = "test_battery_saver_tip";
+ private static final String KEY_TEST_HIGH_USAGE_TIP = "test_high_usage_tip";
+ private static final String KEY_TEST_SMART_BATTERY_TIP = "test_smart_battery_tip";
+
/**
* {@code true} if general battery tip is enabled
*
@@ -164,6 +168,30 @@ public class BatteryTipPolicy {
*/
public final int excessiveBgDrainPercentage;
+ /**
+ * {@code true} if we want to test battery saver tip.
+ *
+ * @see Settings.Global#BATTERY_TIP_CONSTANTS
+ * @see #KEY_TEST_BATTERY_SAVER_TIP
+ */
+ public final boolean testBatterySaverTip;
+
+ /**
+ * {@code true} if we want to test high usage tip.
+ *
+ * @see Settings.Global#BATTERY_TIP_CONSTANTS
+ * @see #KEY_TEST_HIGH_USAGE_TIP
+ */
+ public final boolean testHighUsageTip;
+
+ /**
+ * {@code true} if we want to test smart battery tip.
+ *
+ * @see Settings.Global#BATTERY_TIP_CONSTANTS
+ * @see #KEY_TEST_SMART_BATTERY_TIP
+ */
+ public final boolean testSmartBatteryTip;
+
private final KeyValueListParser mParser;
public BatteryTipPolicy(Context context) {
@@ -197,6 +225,10 @@ public class BatteryTipPolicy {
lowBatteryHour = mParser.getInt(KEY_LOW_BATTERY_HOUR, 16);
dataHistoryRetainDay = mParser.getInt(KEY_DATA_HISTORY_RETAIN_DAY, 30);
excessiveBgDrainPercentage = mParser.getInt(KEY_EXCESSIVE_BG_DRAIN_PERCENTAGE, 10);
+
+ testBatterySaverTip = mParser.getBoolean(KEY_TEST_BATTERY_SAVER_TIP, false);
+ testHighUsageTip = mParser.getBoolean(KEY_TEST_HIGH_USAGE_TIP, false);
+ testSmartBatteryTip = mParser.getBoolean(KEY_TEST_SMART_BATTERY_TIP, false);
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/EarlyWarningDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/EarlyWarningDetector.java
index a10c8f1daf1..9b6b9b5d969 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/EarlyWarningDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/EarlyWarningDetector.java
@@ -53,7 +53,7 @@ public class EarlyWarningDetector implements BatteryTipDetector {
batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) == 0;
final boolean powerSaveModeOn = mPowerManager.isPowerSaveMode();
final boolean earlyWarning = mPowerUsageFeatureProvider.getEarlyWarningSignal(mContext,
- EarlyWarningDetector.class.getName());
+ EarlyWarningDetector.class.getName()) || mPolicy.testBatterySaverTip;
final int state = powerSaveModeOn
? BatteryTip.StateType.HANDLED
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java
index 1b6e2f03ae3..8435c52671d 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java
@@ -34,6 +34,7 @@ import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.concurrent.TimeUnit;
/**
* Detector whether to show summary tip. This detector should be executed as the last
@@ -65,7 +66,7 @@ public class HighUsageDetector implements BatteryTipDetector {
final long screenUsageTimeMs = mBatteryUtils.calculateScreenUsageTime(mBatteryStatsHelper);
if (mPolicy.highUsageEnabled) {
parseBatteryData();
- if (mDataParser.isDeviceHeavilyUsed()) {
+ if (mDataParser.isDeviceHeavilyUsed() || mPolicy.testHighUsageTip) {
final List batterySippers = mBatteryStatsHelper.getUsageList();
for (int i = 0, size = batterySippers.size(); i < size; i++) {
final BatterySipper batterySipper = batterySippers.get(i);
@@ -84,6 +85,14 @@ public class HighUsageDetector implements BatteryTipDetector {
}
}
+ // When in test mode, add an app if necessary
+ if (mPolicy.testHighUsageTip && mHighUsageAppList.isEmpty()) {
+ mHighUsageAppList.add(new AppInfo.Builder()
+ .setPackageName("com.android.settings")
+ .setScreenOnTimeMs(TimeUnit.HOURS.toMillis(3))
+ .build());
+ }
+
Collections.sort(mHighUsageAppList, Collections.reverseOrder());
mHighUsageAppList = mHighUsageAppList.subList(0,
Math.min(mPolicy.highUsageAppCount, mHighUsageAppList.size()));
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetector.java
index bff324d3633..ecd595e1ce6 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetector.java
@@ -38,10 +38,10 @@ public class SmartBatteryDetector implements BatteryTipDetector {
@Override
public BatteryTip detect() {
// Show it if there is no other tips shown
- final boolean smartBatteryOn = Settings.Global.getInt(mContentResolver,
- Settings.Global.APP_STANDBY_ENABLED, 1) != 0;
+ final boolean smartBatteryOff = Settings.Global.getInt(mContentResolver,
+ Settings.Global.APP_STANDBY_ENABLED, 1) == 0 || mPolicy.testSmartBatteryTip;
final int state =
- smartBatteryOn ? BatteryTip.StateType.INVISIBLE : BatteryTip.StateType.NEW;
+ smartBatteryOff ? BatteryTip.StateType.NEW : BatteryTip.StateType.INVISIBLE;
return new SmartBatteryTip(state);
}
}
diff --git a/src/com/android/settings/gestures/GestureSettings.java b/src/com/android/settings/gestures/GestureSettings.java
index f6fe82c0d54..439819ca971 100644
--- a/src/com/android/settings/gestures/GestureSettings.java
+++ b/src/com/android/settings/gestures/GestureSettings.java
@@ -63,19 +63,6 @@ public class GestureSettings extends DashboardFragment {
return R.xml.gestures;
}
- @Override
- protected List createPreferenceControllers(Context context) {
- return buildPreferenceControllers(context, getLifecycle());
- }
-
- static List buildPreferenceControllers(
- @NonNull Context context, @Nullable Lifecycle lifecycle) {
- final List controllers = new ArrayList<>();
- controllers.add(new PreventRingingPreferenceController(
- context, lifecycle, UserHandle.myUserId(), KEY_PREVENT_RINGING));
- return controllers;
- }
-
@Override
public void onAttach(Context context) {
super.onAttach(context);
@@ -101,12 +88,6 @@ public class GestureSettings extends DashboardFragment {
return Arrays.asList(sir);
}
- @Override
- public List createPreferenceControllers(
- Context context) {
- return buildPreferenceControllers(context, null);
- }
-
@Override
public List getNonIndexableKeys(Context context) {
List keys = super.getNonIndexableKeys(context);
@@ -117,6 +98,7 @@ public class GestureSettings extends DashboardFragment {
keys.add(KEY_DOUBLE_TWIST);
keys.add(KEY_DOUBLE_TAP_SCREEN);
keys.add(KEY_PICK_UP);
+ keys.add(KEY_PREVENT_RINGING);
return keys;
}
diff --git a/src/com/android/settings/gestures/GesturesSettingPreferenceController.java b/src/com/android/settings/gestures/GesturesSettingPreferenceController.java
index e4e24d85bb2..1eb188a6b0f 100644
--- a/src/com/android/settings/gestures/GesturesSettingPreferenceController.java
+++ b/src/com/android/settings/gestures/GesturesSettingPreferenceController.java
@@ -27,6 +27,7 @@ import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.AbstractPreferenceController;
+import java.util.ArrayList;
import java.util.List;
public class GesturesSettingPreferenceController extends BasePreferenceController {
@@ -63,8 +64,7 @@ public class GesturesSettingPreferenceController extends BasePreferenceControlle
@NonNull Context context) {
final AmbientDisplayConfiguration ambientDisplayConfiguration =
new AmbientDisplayConfiguration(context);
- final List controllers =
- GestureSettings.buildPreferenceControllers(context, null);
+ final List controllers = new ArrayList<>();
controllers.add(new AssistGestureSettingsPreferenceController(context, FAKE_PREF_KEY)
.setAssistOnly(false));
@@ -75,6 +75,7 @@ public class GesturesSettingPreferenceController extends BasePreferenceControlle
.setConfig(ambientDisplayConfiguration));
controllers.add(new DoubleTapScreenPreferenceController(context, FAKE_PREF_KEY)
.setConfig(ambientDisplayConfiguration));
+ controllers.add(new PreventRingingPreferenceController(context, FAKE_PREF_KEY));
return controllers;
}
diff --git a/src/com/android/settings/gestures/PreventRingingGestureSettings.java b/src/com/android/settings/gestures/PreventRingingGestureSettings.java
index 9897b48d126..09570dfb4f5 100644
--- a/src/com/android/settings/gestures/PreventRingingGestureSettings.java
+++ b/src/com/android/settings/gestures/PreventRingingGestureSettings.java
@@ -61,19 +61,6 @@ public class PreventRingingGestureSettings extends DashboardFragment {
return 0;
}
- @Override
- protected List createPreferenceControllers(Context context) {
- return buildPreferenceControllers(context, getLifecycle());
- }
-
- private static List buildPreferenceControllers(Context context,
- Lifecycle lifecycle) {
- final List 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
@@ -83,12 +70,6 @@ public class PreventRingingGestureSettings extends DashboardFragment {
sir.xmlResId = R.xml.prevent_ringing_gesture_settings;
return Arrays.asList(sir);
}
-
- @Override
- public List 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
index 3255c9262d9..493755f00ee 100644
--- a/src/com/android/settings/gestures/PreventRingingPreferenceController.java
+++ b/src/com/android/settings/gestures/PreventRingingPreferenceController.java
@@ -21,7 +21,6 @@ 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;
@@ -31,22 +30,20 @@ import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
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
+public class PreventRingingPreferenceController extends BasePreferenceController
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";
@@ -56,17 +53,15 @@ public class PreventRingingPreferenceController extends AbstractPreferenceContro
private final String SECURE_KEY = VOLUME_HUSH_GESTURE;
- @UserIdInt
- private final int mUserId;
+ public PreventRingingPreferenceController(Context context, String key) {
+ super(context, key);
+ }
- 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 int getAvailabilityStatus() {
+ return mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_volumeHushGestureEnabled)
+ ? AVAILABLE : DISABLED_UNSUPPORTED;
}
@Override
@@ -144,21 +139,10 @@ public class PreventRingingPreferenceController extends AbstractPreferenceContro
}
}
- @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);
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index d334b9217b7..c028298e0bd 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -167,9 +167,9 @@ public class AppNotificationSettings extends NotificationSettingsBase {
getPreferenceScreen().addPreference(groupCategory);
mDynamicPreferences.add(groupCategory);
if (group.getId() == null) {
- groupCategory.setTitle(mChannelGroupList.size() > 1
- ? R.string.notification_channels_other
- : R.string.notification_channels);
+ if (mChannelGroupList.size() > 1) {
+ groupCategory.setTitle(R.string.notification_channels_other);
+ }
groupCategory.setKey(KEY_GENERAL_CATEGORY);
} else {
groupCategory.setTitle(group.getName());
diff --git a/src/com/android/settings/notification/BadgePreferenceController.java b/src/com/android/settings/notification/BadgePreferenceController.java
index 8f0376c0627..e768ad18090 100644
--- a/src/com/android/settings/notification/BadgePreferenceController.java
+++ b/src/com/android/settings/notification/BadgePreferenceController.java
@@ -57,7 +57,7 @@ public class BadgePreferenceController extends NotificationPreferenceController
return false;
}
if (mChannel != null) {
- if (NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId())) {
+ if (isDefaultChannel()) {
return true;
} else {
return mAppRow.showBadge;
diff --git a/src/com/android/settings/notification/BlockPreferenceController.java b/src/com/android/settings/notification/BlockPreferenceController.java
index 9ea29feccca..7c6201eeedf 100644
--- a/src/com/android/settings/notification/BlockPreferenceController.java
+++ b/src/com/android/settings/notification/BlockPreferenceController.java
@@ -98,8 +98,7 @@ public class BlockPreferenceController extends NotificationPreferenceController
// it was blocked and we are unblocking it.
if (blocked || originalImportance == IMPORTANCE_NONE) {
final int importance = blocked ? IMPORTANCE_NONE
- : DEFAULT_CHANNEL_ID.equals(mChannel.getId())
- ? IMPORTANCE_UNSPECIFIED : IMPORTANCE_DEFAULT;
+ : isDefaultChannel() ? IMPORTANCE_UNSPECIFIED : IMPORTANCE_DEFAULT;
mChannel.setImportance(importance);
saveChannel();
}
diff --git a/src/com/android/settings/notification/HeaderPreferenceController.java b/src/com/android/settings/notification/HeaderPreferenceController.java
index ff687e8049f..d5e289b3173 100644
--- a/src/com/android/settings/notification/HeaderPreferenceController.java
+++ b/src/com/android/settings/notification/HeaderPreferenceController.java
@@ -31,6 +31,8 @@ import com.android.settings.applications.LayoutPreference;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.widget.EntityHeaderController;
+import java.util.Objects;
+
public class HeaderPreferenceController extends NotificationPreferenceController
implements PreferenceControllerMixin {
@@ -72,7 +74,7 @@ public class HeaderPreferenceController extends NotificationPreferenceController
}
CharSequence getLabel() {
- return mChannel != null ? mChannel.getName()
+ return (mChannel != null && !isDefaultChannel()) ? mChannel.getName()
: mChannelGroup != null
? mChannelGroup.getName()
: mAppRow.label;
@@ -80,7 +82,7 @@ public class HeaderPreferenceController extends NotificationPreferenceController
@Override
public CharSequence getSummary() {
- if (mChannel != null) {
+ if (mChannel != null && !isDefaultChannel()) {
if (mChannelGroup != null
&& !TextUtils.isEmpty(mChannelGroup.getName())) {
final SpannableStringBuilder summary = new SpannableStringBuilder();
diff --git a/src/com/android/settings/notification/ImportancePreferenceController.java b/src/com/android/settings/notification/ImportancePreferenceController.java
index f95c34ae6ae..60b2ebe0250 100644
--- a/src/com/android/settings/notification/ImportancePreferenceController.java
+++ b/src/com/android/settings/notification/ImportancePreferenceController.java
@@ -58,7 +58,7 @@ public class ImportancePreferenceController extends NotificationPreferenceContro
if (mChannel == null) {
return false;
}
- return !NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId());
+ return !isDefaultChannel();
}
@Override
diff --git a/src/com/android/settings/notification/LightsPreferenceController.java b/src/com/android/settings/notification/LightsPreferenceController.java
index 230c3e295d2..9d5a6c55d74 100644
--- a/src/com/android/settings/notification/LightsPreferenceController.java
+++ b/src/com/android/settings/notification/LightsPreferenceController.java
@@ -50,8 +50,9 @@ public class LightsPreferenceController extends NotificationPreferenceController
if (mChannel == null) {
return false;
}
- return checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT) && canPulseLight()
- && !NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId());
+ return checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT)
+ && canPulseLight()
+ && !isDefaultChannel();
}
public void updateState(Preference preference) {
diff --git a/src/com/android/settings/notification/NotificationPreferenceController.java b/src/com/android/settings/notification/NotificationPreferenceController.java
index c0bb7050045..1a65351659e 100644
--- a/src/com/android/settings/notification/NotificationPreferenceController.java
+++ b/src/com/android/settings/notification/NotificationPreferenceController.java
@@ -184,4 +184,11 @@ public abstract class NotificationPreferenceController extends AbstractPreferenc
protected boolean hasValidGroup() {
return mChannelGroup != null;
}
+
+ protected final boolean isDefaultChannel() {
+ if (mChannel == null) {
+ return false;
+ }
+ return Objects.equals(NotificationChannel.DEFAULT_CHANNEL_ID, mChannel.getId());
+ }
}
diff --git a/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java b/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java
index 3867640c86f..4079099f8ec 100644
--- a/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java
+++ b/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java
@@ -37,14 +37,13 @@ import android.util.Log;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.applications.AppInfoBase;
-import com.android.settings.applications.InstalledAppCounter;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.SubSettingLauncher;
+import com.android.settingslib.TwoTargetPreference;
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.utils.StringUtil;
-import com.android.settingslib.wrapper.PackageManagerWrapper;
import java.util.ArrayList;
import java.util.Arrays;
@@ -211,6 +210,7 @@ public class RecentNotifyingAppsPreferenceController extends AbstractPreferenceC
pref.setKey(pkgName);
pref.setTitle(appEntry.label);
pref.setIcon(mIconDrawableFactory.getBadgedIcon(appEntry.info));
+ pref.setIconSize(TwoTargetPreference.ICON_SIZE_SMALL);
pref.setSummary(StringUtil.formatRelativeTime(mContext,
System.currentTimeMillis() - app.getLastNotified(), true));
pref.setOrder(i);
diff --git a/src/com/android/settings/notification/SoundPreferenceController.java b/src/com/android/settings/notification/SoundPreferenceController.java
index e4414b6908a..4ae6ebe99c6 100644
--- a/src/com/android/settings/notification/SoundPreferenceController.java
+++ b/src/com/android/settings/notification/SoundPreferenceController.java
@@ -59,8 +59,7 @@ public class SoundPreferenceController extends NotificationPreferenceController
if (mChannel == null) {
return false;
}
- return checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT)
- && !NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId());
+ return checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT) && !isDefaultChannel();
}
@Override
diff --git a/src/com/android/settings/notification/VibrationPreferenceController.java b/src/com/android/settings/notification/VibrationPreferenceController.java
index f9b786dc2d8..9df8e04013f 100644
--- a/src/com/android/settings/notification/VibrationPreferenceController.java
+++ b/src/com/android/settings/notification/VibrationPreferenceController.java
@@ -47,7 +47,7 @@ public class VibrationPreferenceController extends NotificationPreferenceControl
return false;
}
return checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT)
- && !NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId())
+ && !isDefaultChannel()
&& mVibrator != null
&& mVibrator.hasVibrator();
}
diff --git a/src/com/android/settings/notification/ZenOnboardingActivity.java b/src/com/android/settings/notification/ZenOnboardingActivity.java
new file mode 100644
index 00000000000..b38bad67af3
--- /dev/null
+++ b/src/com/android/settings/notification/ZenOnboardingActivity.java
@@ -0,0 +1,106 @@
+/*
+ * 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.notification;
+
+import android.app.Activity;
+import android.app.NotificationManager;
+import android.content.Intent;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
+import android.view.View;
+import android.widget.CheckBox;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+
+public class ZenOnboardingActivity extends Activity {
+
+ private NotificationManager mNm;
+ private MetricsLogger mMetrics;
+ CheckBox mScreenOn;
+ CheckBox mScreenOff;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setNotificationManager(getSystemService(NotificationManager.class));
+ setMetricsLogger(new MetricsLogger());
+
+ setupUI();
+ }
+
+ @VisibleForTesting
+ protected void setupUI() {
+ setContentView(R.layout.zen_onboarding);
+ mScreenOn = findViewById(R.id.screen_on_option);
+ mScreenOff = findViewById(R.id.screen_off_option);
+ mScreenOn.setChecked(true);
+ mScreenOff.setChecked(true);
+
+ mMetrics.visible(MetricsEvent.SETTINGS_ZEN_ONBOARDING);
+ }
+
+ @VisibleForTesting
+ protected void setNotificationManager(NotificationManager nm) {
+ mNm = nm;
+ }
+
+ @VisibleForTesting
+ protected void setMetricsLogger(MetricsLogger ml) {
+ mMetrics = ml;
+ }
+
+ public void logClick(View view) {
+ CheckBox checkbox = (CheckBox) view;
+ switch (checkbox.getId()) {
+ case R.id.screen_on_option:
+ mMetrics.action(MetricsEvent.ACTION_ZEN_ONBOARDING_SCREEN_ON, checkbox.isChecked());
+ break;
+ case R.id.screen_off_option:
+ mMetrics.action(MetricsEvent.ACTION_ZEN_ONBOARDING_SCREEN_OFF,
+ checkbox.isChecked());
+ break;
+ }
+ }
+
+ public void launchSettings(View button) {
+ mMetrics.action(MetricsEvent.ACTION_ZEN_ONBOARDING_SETTINGS);
+ Intent settings = new Intent(Settings.ZEN_MODE_BLOCKED_EFFECTS_SETTINGS);
+ settings.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ startActivity(settings);
+ }
+
+ public void save(View button) {
+ mMetrics.action(MetricsEvent.ACTION_ZEN_ONBOARDING_OK);
+ NotificationManager.Policy policy = mNm.getNotificationPolicy();
+ int currentEffects = policy.suppressedVisualEffects;
+
+ currentEffects = NotificationManager.Policy.toggleScreenOnEffectsSuppressed(
+ currentEffects, mScreenOn != null && mScreenOn.isChecked());
+ currentEffects = NotificationManager.Policy.toggleScreenOffEffectsSuppressed(
+ currentEffects, mScreenOff != null && mScreenOff.isChecked());
+
+ NotificationManager.Policy newPolicy = new NotificationManager.Policy(
+ policy.priorityCategories, policy.priorityCallSenders,
+ policy.priorityMessageSenders, currentEffects);
+ mNm.setNotificationPolicy(newPolicy);
+
+ finishAndRemoveTask();
+ }
+}
diff --git a/src/com/android/settings/search/SearchIndexableResourcesImpl.java b/src/com/android/settings/search/SearchIndexableResourcesImpl.java
index 78b18a6bdd9..decfe330473 100644
--- a/src/com/android/settings/search/SearchIndexableResourcesImpl.java
+++ b/src/com/android/settings/search/SearchIndexableResourcesImpl.java
@@ -44,6 +44,7 @@ import com.android.settings.deviceinfo.DeviceInfoSettings;
import com.android.settings.deviceinfo.StorageDashboardFragment;
import com.android.settings.deviceinfo.StorageSettings;
import com.android.settings.display.AmbientDisplaySettings;
+import com.android.settings.display.AutoBrightnessSettings;
import com.android.settings.display.NightDisplaySettings;
import com.android.settings.display.ScreenZoomSettings;
import com.android.settings.dream.DreamSettings;
@@ -114,6 +115,7 @@ public class SearchIndexableResourcesImpl implements SearchIndexableResources {
addIndex(DataUsageSummaryLegacy.class);
addIndex(ScreenZoomSettings.class);
addIndex(DisplaySettings.class);
+ addIndex(AutoBrightnessSettings.class);
addIndex(AmbientDisplaySettings.class);
addIndex(WallpaperTypeSettings.class);
addIndex(AppAndNotificationDashboardFragment.class);
diff --git a/src/com/android/settings/slices/SliceBroadcastReceiver.java b/src/com/android/settings/slices/SliceBroadcastReceiver.java
index 2d6f83e0b62..80b7519430a 100644
--- a/src/com/android/settings/slices/SliceBroadcastReceiver.java
+++ b/src/com/android/settings/slices/SliceBroadcastReceiver.java
@@ -40,8 +40,6 @@ import com.android.settings.core.SliderPreferenceController;
import com.android.settings.core.TogglePreferenceController;
import com.android.settings.overlay.FeatureFactory;
-import androidx.slice.core.SliceHints;
-
/**
* Responds to actions performed on slices and notifies slices of updates in state changes.
*/
@@ -64,7 +62,7 @@ public class SliceBroadcastReceiver extends BroadcastReceiver {
handleToggleAction(context, key, isPlatformDefined);
break;
case ACTION_SLIDER_CHANGED:
- int newPosition = intent.getIntExtra(SliceHints.EXTRA_RANGE_VALUE, -1);
+ int newPosition = intent.getIntExtra(Slice.EXTRA_RANGE_VALUE, -1);
handleSliderAction(context, key, newPosition);
break;
case ACTION_WIFI_CHANGED:
diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java
index c54d138e942..05f0974f277 100644
--- a/src/com/android/settings/slices/SliceBuilderUtils.java
+++ b/src/com/android/settings/slices/SliceBuilderUtils.java
@@ -17,6 +17,8 @@
package com.android.settings.slices;
import static androidx.slice.builders.ListBuilder.ICON_IMAGE;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING;
import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER;
import static com.android.settings.core.BasePreferenceController.DISABLED_UNSUPPORTED;
@@ -47,7 +49,9 @@ import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settingslib.core.AbstractPreferenceController;
import android.support.v4.graphics.drawable.IconCompat;
+
import androidx.slice.Slice;
+import androidx.slice.SliceMetadata;
import androidx.slice.builders.ListBuilder;
import androidx.slice.builders.SliceAction;
@@ -75,7 +79,8 @@ public class SliceBuilderUtils {
// action name).
FeatureFactory.getFactory(context).getMetricsFeatureProvider()
.action(context, MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, sliceNamePair);
- if (!controller.isAvailable()) {
+
+ if (controller.getAvailabilityStatus() != AVAILABLE) {
return buildUnavailableSlice(context, sliceData, controller);
}
@@ -145,6 +150,60 @@ public class SliceBuilderUtils {
sliceData.getKey());
}
+ /**
+ * @return {@link PendingIntent} for a non-primary {@link SliceAction}.
+ */
+ public static PendingIntent getActionIntent(Context context, String action, SliceData data) {
+ Intent intent = new Intent(action);
+ intent.setClass(context, SliceBroadcastReceiver.class);
+ intent.putExtra(EXTRA_SLICE_KEY, data.getKey());
+ intent.putExtra(EXTRA_SLICE_PLATFORM_DEFINED, data.isPlatformDefined());
+ return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent,
+ PendingIntent.FLAG_CANCEL_CURRENT);
+ }
+
+ /**
+ * @return {@link PendingIntent} for the primary {@link SliceAction}.
+ */
+ public static PendingIntent getContentIntent(Context context, SliceData sliceData) {
+ Intent intent = DatabaseIndexingUtils.buildSearchResultPageIntent(context,
+ sliceData.getFragmentClassName(), sliceData.getKey(), sliceData.getScreenTitle(),
+ 0 /* TODO */);
+ intent.setClassName("com.android.settings", SubSettings.class.getName());
+ return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */);
+ }
+
+ /**
+ * @return {@link PendingIntent} to the Settings home page.
+ */
+ public static PendingIntent getSettingsIntent(Context context) {
+ final PackageManager manager = context.getPackageManager();
+ final Intent intent = manager.getLaunchIntentForPackage(context.getPackageName());
+ return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */);
+ }
+
+ /**
+ * @return the summary text for a {@link Slice} built for {@param sliceData}.
+ */
+ public static CharSequence getSubtitleText(Context context,
+ AbstractPreferenceController controller, SliceData sliceData) {
+ CharSequence summaryText;
+ if (controller != null) {
+ summaryText = controller.getSummary();
+
+ if (isValidSummary(context, summaryText)) {
+ return summaryText;
+ }
+ }
+
+ summaryText = sliceData.getSummary();
+ if (isValidSummary(context, summaryText)) {
+ return summaryText;
+ }
+
+ return "";
+ }
+
public static Uri getUri(String path, boolean isPlatformSlice) {
final String authority = isPlatformSlice
? SettingsSlicesContract.AUTHORITY
@@ -227,49 +286,6 @@ public class SliceBuilderUtils {
return getActionIntent(context, SettingsSliceProvider.ACTION_SLIDER_CHANGED, sliceData);
}
- private static PendingIntent getActionIntent(Context context, String action, SliceData data) {
- Intent intent = new Intent(action);
- intent.setClass(context, SliceBroadcastReceiver.class);
- intent.putExtra(EXTRA_SLICE_KEY, data.getKey());
- intent.putExtra(EXTRA_SLICE_PLATFORM_DEFINED, data.isPlatformDefined());
- return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent,
- PendingIntent.FLAG_CANCEL_CURRENT);
- }
-
- private static PendingIntent getContentIntent(Context context, SliceData sliceData) {
- Intent intent = DatabaseIndexingUtils.buildSearchResultPageIntent(context,
- sliceData.getFragmentClassName(), sliceData.getKey(), sliceData.getScreenTitle(),
- 0 /* TODO */);
- intent.setClassName("com.android.settings", SubSettings.class.getName());
- return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */);
- }
-
- private static PendingIntent getSettingsIntent(Context context) {
- final PackageManager manager = context.getPackageManager();
- final Intent intent = manager.getLaunchIntentForPackage(context.getPackageName());
- return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */);
- }
-
- @VisibleForTesting
- static CharSequence getSubtitleText(Context context, AbstractPreferenceController controller,
- SliceData sliceData) {
- CharSequence summaryText;
- if (controller != null) {
- summaryText = controller.getSummary();
-
- if (isValidSummary(context, summaryText)) {
- return summaryText;
- }
- }
-
- summaryText = sliceData.getSummary();
- if (isValidSummary(context, summaryText)) {
- return summaryText;
- }
-
- return "";
- }
-
private static boolean isValidSummary(Context context, CharSequence summary) {
if (summary == null || TextUtils.isEmpty(summary.toString().trim())) {
return false;
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java b/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java
index bdad9e6040b..ab08fdb6299 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java
@@ -102,7 +102,7 @@ public class WifiTetherSwitchBarController implements SwitchWidgetController.OnS
void startTether() {
mSwitchBar.setEnabled(false);
- mConnectivityManager.startTethering(TETHERING_WIFI, true /* showProvisioningUi */,
+ mConnectivityManager.startTethering(TETHERING_WIFI, false /* showProvisioningUi */,
mOnStartTetheringCallback, new Handler(Looper.getMainLooper()));
}
diff --git a/tests/robotests/src/com/android/settings/accounts/SyncStateSwitchPreferenceTest.java b/tests/robotests/src/com/android/settings/accounts/SyncStateSwitchPreferenceTest.java
new file mode 100644
index 00000000000..0d454181f7e
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accounts/SyncStateSwitchPreferenceTest.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.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.accounts.Account;
+import android.content.Context;
+import android.os.UserHandle;
+
+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 SyncStateSwitchPreferenceTest {
+
+ private Context mContext;
+ private SyncStateSwitchPreference mPreference;
+
+ @Before
+ public void setup() {
+ mContext = RuntimeEnvironment.application;
+ }
+
+ @Test
+ public void setup_validAuthority_shouldBeVisible() {
+ mPreference = new SyncStateSwitchPreference(mContext, null /* attrs */);
+
+ mPreference.setup(new Account("name", "type"), "authority", mContext.getPackageName(),
+ UserHandle.USER_CURRENT);
+
+ assertThat(mPreference.isVisible()).isTrue();
+ }
+
+ @Test
+ public void setup_emptyAuthority_shouldBeInvisible() {
+ mPreference = new SyncStateSwitchPreference(mContext, null /* attrs */);
+
+ mPreference.setup(new Account("name", "type"), null /* authority */,
+ mContext.getPackageName(), UserHandle.USER_CURRENT);
+
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java
index a9f4151d226..4264daa2835 100644
--- a/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java
@@ -16,7 +16,6 @@
package com.android.settings.display;
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
@@ -25,6 +24,7 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.Activity;
import android.os.Bundle;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
@@ -34,7 +34,6 @@ import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.widget.RadioButtonPreference;
import com.android.settingslib.widget.CandidateInfo;
import org.junit.Before;
@@ -46,7 +45,6 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.util.ReflectionHelpers;
-import java.util.ArrayList;
import java.util.List;
@RunWith(SettingsRobolectricTestRunner.class)
@@ -58,13 +56,13 @@ public class ColorModePreferenceFragmentTest {
private ColorDisplayController mController;
@Mock
- private PreferenceScreen mScreen;
+ private Activity mActivity;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- mFragment = spy(new ColorModePreferenceFragmentTestable(mScreen));
+ mFragment = spy(new ColorModePreferenceFragment());
ReflectionHelpers.setField(mFragment, "mController", mController);
}
@@ -159,50 +157,8 @@ public class ColorModePreferenceFragmentTest {
@Test
public void onAccessibilityTransformChanged_toggles() {
- final int radioPrefsCount = 3;
- List radioPrefs = new ArrayList<>();
- for (int i = 0; i < radioPrefsCount; i++) {
- radioPrefs.add(mock(RadioButtonPreference.class));
- }
-
- when(mScreen.getPreferenceCount()).thenReturn(radioPrefs.size());
- when(mScreen.getPreference(anyInt())).thenAnswer(invocation -> {
- final Object[] args = invocation.getArguments();
- return radioPrefs.get((int) args[0]);
- });
-
+ when(mFragment.getActivity()).thenReturn(mActivity);
mFragment.onAccessibilityTransformChanged(true /* state */);
- for (int i = 0; i < radioPrefsCount; i++) {
- verify(radioPrefs.get(i)).setEnabled(false);
- }
-
- mFragment.onAccessibilityTransformChanged(false /* state */);
- for (int i = 0; i < radioPrefsCount; i++) {
- verify(radioPrefs.get(i)).setEnabled(true);
- }
- }
-
- private static class ColorModePreferenceFragmentTestable
- extends ColorModePreferenceFragment {
-
- private final PreferenceScreen mPreferenceScreen;
-
- private ColorModePreferenceFragmentTestable(PreferenceScreen screen) {
- mPreferenceScreen = screen;
- }
-
- /**
- * A method to return a mock PreferenceScreen.
- * A real ColorModePreferenceFragment calls super.getPreferenceScreen() to get its
- * PreferenceScreen handle, which internally dereferenced a PreferenceManager. But in this
- * test scenario, the PreferenceManager object is uninitialized, so we need to supply the
- * PreferenceScreen directly.
- *
- * @return a mock PreferenceScreen
- */
- @Override
- public PreferenceScreen getPreferenceScreen() {
- return mPreferenceScreen;
- }
+ verify(mActivity).onBackPressed();
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
index 6a97fe187ff..7d26755deec 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
@@ -125,7 +125,7 @@ public class RestrictAppPreferenceControllerTest {
}
@Test
- public void testUpdateState_twoRestrictedAppsForPrimaryUser_showCorrectSummary() {
+ public void testUpdateState_twoRestrictedAppsForPrimaryUser_visibleAndShowCorrectSummary() {
mPackageOpsList.add(mRestrictedPackageOps);
mPackageOpsList.add(mRestrictedPackageOps);
mPackageOpsList.add(mAllowedPackageOps);
@@ -135,6 +135,7 @@ public class RestrictAppPreferenceControllerTest {
mRestrictAppPreferenceController.updateState(mPreference);
assertThat(mPreference.getSummary()).isEqualTo("Limiting battery usage for 2 apps");
+ assertThat(mPreference.isVisible()).isTrue();
}
@Test
@@ -155,13 +156,13 @@ public class RestrictAppPreferenceControllerTest {
}
@Test
- public void testUpdateState_zeroRestrictApp_disabled() {
+ public void testUpdateState_zeroRestrictApp_inVisible() {
mPackageOpsList.add(mAllowedPackageOps);
doReturn(mPackageOpsList).when(mAppOpsManager).getPackagesForOps(any());
mRestrictAppPreferenceController.updateState(mPreference);
- assertThat(mPreference.isEnabled()).isFalse();
+ assertThat(mPreference.isVisible()).isFalse();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
index 55a8f4ea08e..49567f6e458 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
@@ -192,7 +192,7 @@ public class AnomalyDetectionJobServiceTest {
verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
SYSTEM_PACKAGE,
- Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, ANOMALY_TYPE));
+ Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_TYPE));
}
@@ -217,7 +217,7 @@ public class AnomalyDetectionJobServiceTest {
verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
SYSTEM_PACKAGE,
- Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, ANOMALY_TYPE));
+ Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_TYPE));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java
index c52b73e2336..654b247d9df 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java
@@ -45,7 +45,10 @@ public class BatteryTipPolicyTest {
+ ",low_battery_enabled=false"
+ ",low_battery_hour=10"
+ ",data_history_retain_day=24"
- + ",excessive_bg_drain_percentage=25";
+ + ",excessive_bg_drain_percentage=25"
+ + ",test_battery_saver_tip=true"
+ + ",test_high_usage_tip=false"
+ + ",test_smart_battery_tip=true";
private Context mContext;
@Before
@@ -74,6 +77,9 @@ public class BatteryTipPolicyTest {
assertThat(batteryTipPolicy.lowBatteryHour).isEqualTo(10);
assertThat(batteryTipPolicy.dataHistoryRetainDay).isEqualTo(24);
assertThat(batteryTipPolicy.excessiveBgDrainPercentage).isEqualTo(25);
+ assertThat(batteryTipPolicy.testBatterySaverTip).isTrue();
+ assertThat(batteryTipPolicy.testHighUsageTip).isFalse();
+ assertThat(batteryTipPolicy.testSmartBatteryTip).isTrue();
}
@Test
@@ -97,5 +103,8 @@ public class BatteryTipPolicyTest {
assertThat(batteryTipPolicy.lowBatteryHour).isEqualTo(16);
assertThat(batteryTipPolicy.dataHistoryRetainDay).isEqualTo(30);
assertThat(batteryTipPolicy.excessiveBgDrainPercentage).isEqualTo(10);
+ assertThat(batteryTipPolicy.testBatterySaverTip).isFalse();
+ assertThat(batteryTipPolicy.testHighUsageTip).isFalse();
+ assertThat(batteryTipPolicy.testSmartBatteryTip).isFalse();
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/EarlyWarningDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/EarlyWarningDetectorTest.java
index 21ef8a358d1..c4c3d021b18 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/EarlyWarningDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/EarlyWarningDetectorTest.java
@@ -74,6 +74,16 @@ public class EarlyWarningDetectorTest {
assertThat(mEarlyWarningDetector.detect().isVisible()).isFalse();
}
+ @Test
+ public void testDetect_testFeatureOn_tipNew() {
+ doReturn(false).when(mFakeFeatureFactory.powerUsageFeatureProvider)
+ .getEarlyWarningSignal(any(), any());
+ ReflectionHelpers.setField(mPolicy, "testBatterySaverTip", true);
+
+ assertThat(mEarlyWarningDetector.detect().getState())
+ .isEqualTo(BatteryTip.StateType.NEW);
+ }
+
@Test
public void testDetect_batterySaverOn_tipHandled() {
doReturn(true).when(mPowerManager).isPowerSaveMode();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java
index d983dfc7eed..2a2420d7f0c 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java
@@ -34,6 +34,7 @@ import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.fuelgauge.batterytip.AppInfo;
import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
import com.android.settings.fuelgauge.batterytip.HighUsageDataParser;
+import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -108,6 +109,14 @@ public class HighUsageDetectorTest {
assertThat(mHighUsageDetector.detect().isVisible()).isFalse();
}
+ @Test
+ public void testDetect_testFeatureOn_tipNew() {
+ doReturn(false).when(mDataParser).isDeviceHeavilyUsed();
+ ReflectionHelpers.setField(mPolicy, "testHighUsageTip", true);
+
+ assertThat(mHighUsageDetector.detect().getState()).isEqualTo(BatteryTip.StateType.NEW);
+ }
+
@Test
public void testDetect_containsHighUsageApp_tipVisible() {
doReturn(true).when(mDataParser).isDeviceHeavilyUsed();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetectorTest.java
index 91343191e52..ad08a22cda5 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SmartBatteryDetectorTest.java
@@ -24,6 +24,7 @@ import android.content.Context;
import android.provider.Settings;
import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
+import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
@@ -31,6 +32,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.util.ReflectionHelpers;
@RunWith(SettingsRobolectricTestRunner.class)
public class SmartBatteryDetectorTest {
@@ -38,6 +40,7 @@ public class SmartBatteryDetectorTest {
private Context mContext;
private ContentResolver mContentResolver;
private SmartBatteryDetector mSmartBatteryDetector;
+ private BatteryTipPolicy mPolicy;
@Before
public void setUp() {
@@ -45,8 +48,15 @@ public class SmartBatteryDetectorTest {
mContext = RuntimeEnvironment.application;
mContentResolver = mContext.getContentResolver();
- final BatteryTipPolicy policy = spy(new BatteryTipPolicy(mContext));
- mSmartBatteryDetector = new SmartBatteryDetector(policy, mContentResolver);
+ mPolicy = spy(new BatteryTipPolicy(mContext));
+ mSmartBatteryDetector = new SmartBatteryDetector(mPolicy, mContentResolver);
+ }
+
+ @Test
+ public void testDetect_testFeatureOn_tipNew() {
+ ReflectionHelpers.setField(mPolicy, "testSmartBatteryTip", true);
+
+ assertThat(mSmartBatteryDetector.detect().getState()).isEqualTo(BatteryTip.StateType.NEW);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/gestures/PreventRingingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PreventRingingPreferenceControllerTest.java
index d92e0e05d1c..b687b46ea61 100644
--- a/tests/robotests/src/com/android/settings/gestures/PreventRingingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/PreventRingingPreferenceControllerTest.java
@@ -68,8 +68,7 @@ public class PreventRingingPreferenceControllerTest {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mController = new PreventRingingPreferenceController(
- mContext, null, 0, KEY_PICK_UP);
+ mController = new PreventRingingPreferenceController(mContext, KEY_PICK_UP);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/notification/HeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/HeaderPreferenceControllerTest.java
index 29773d2cc1a..9a766470836 100644
--- a/tests/robotests/src/com/android/settings/notification/HeaderPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/HeaderPreferenceControllerTest.java
@@ -109,6 +109,11 @@ public class HeaderPreferenceControllerTest {
NotificationChannel channel = new NotificationChannel("cid", "cname", IMPORTANCE_NONE);
mController.onResume(appRow, channel, group, null);
assertEquals(channel.getName(), mController.getLabel());
+
+ NotificationChannel defaultChannel = new NotificationChannel(
+ NotificationChannel.DEFAULT_CHANNEL_ID, "", IMPORTANCE_NONE);
+ mController.onResume(appRow, defaultChannel, null, null);
+ assertEquals(appRow.label, mController.getLabel());
}
@Test
@@ -130,5 +135,10 @@ public class HeaderPreferenceControllerTest {
mController.onResume(appRow, channel, null, null);
assertFalse(mController.getSummary().toString().contains(group.getName()));
assertTrue(mController.getSummary().toString().contains(appRow.label));
+
+ NotificationChannel defaultChannel = new NotificationChannel(
+ NotificationChannel.DEFAULT_CHANNEL_ID, "", IMPORTANCE_NONE);
+ mController.onResume(appRow, defaultChannel, null, null);
+ assertEquals("", mController.getSummary());
}
}
diff --git a/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java
index 3ead72a2f31..4fe384e981b 100644
--- a/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java
@@ -294,6 +294,30 @@ public class NotificationPreferenceControllerTest {
assertTrue(mController.isChannelGroupBlockable());
}
+ @Test
+ public void testIsDefaultChannel_noChannel() {
+ mController.onResume(mock(NotificationBackend.AppRow.class), null, null, null);
+
+ assertFalse(mController.isDefaultChannel());
+ }
+
+ @Test
+ public void testIsDefaultChannel_nonDefaultChannel() {
+ NotificationChannel channel = mock(NotificationChannel.class);
+ mController.onResume(mock(NotificationBackend.AppRow.class), channel, null, null);
+
+ assertFalse(mController.isDefaultChannel());
+ }
+
+ @Test
+ public void testIsDefaultChannel() {
+ NotificationChannel channel = mock(NotificationChannel.class);
+ when(channel.getId()).thenReturn(NotificationChannel.DEFAULT_CHANNEL_ID);
+ mController.onResume(mock(NotificationBackend.AppRow.class), channel, null, null);
+
+ assertTrue(mController.isDefaultChannel());
+ }
+
private final class TestPreferenceController extends NotificationPreferenceController {
private TestPreferenceController(Context context, NotificationBackend backend) {
diff --git a/tests/robotests/src/com/android/settings/notification/ZenOnboardingActivityTest.java b/tests/robotests/src/com/android/settings/notification/ZenOnboardingActivityTest.java
new file mode 100644
index 00000000000..3fd2239173b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/ZenOnboardingActivityTest.java
@@ -0,0 +1,222 @@
+/*
+ * 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.notification;
+
+import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_ALARMS;
+import static android.app.NotificationManager.Policy.PRIORITY_SENDERS_ANY;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_AMBIENT;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_BADGE;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_FULL_SCREEN_INTENT;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_LIGHTS;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_OFF;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_ON;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_STATUS_BAR;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.NotificationManager;
+import android.app.NotificationManager.Policy;
+import android.content.Context;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+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.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class ZenOnboardingActivityTest {
+
+ @Mock
+ MetricsLogger mMetricsLogger;
+ @Mock
+ NotificationManager mNm;
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private Context mContext;
+
+ ZenOnboardingActivity mActivity;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mActivity = Robolectric.buildActivity(ZenOnboardingActivity.class)
+ .create()
+ .get();
+ mActivity.setNotificationManager(mNm);
+ mActivity.setMetricsLogger(mMetricsLogger);
+
+ mActivity.setupUI();
+ }
+
+ @Test
+ public void loadUiRecordsEvent() {
+ verify(mMetricsLogger).visible(MetricsEvent.SETTINGS_ZEN_ONBOARDING);
+ }
+
+ @Test
+ public void toggleCheckBoxRecordsEvents_screenOn() {
+ mActivity.findViewById(R.id.screen_on_option).performClick();
+
+ verify(mMetricsLogger).action(MetricsEvent.ACTION_ZEN_ONBOARDING_SCREEN_ON, false);
+
+ mActivity.findViewById(R.id.screen_on_option).performClick();
+
+ verify(mMetricsLogger).action(MetricsEvent.ACTION_ZEN_ONBOARDING_SCREEN_ON, true);
+ }
+
+ @Test
+ public void toggleCheckBoxRecordsEvents_screenOff() {
+ mActivity.findViewById(R.id.screen_off_option).performClick();
+
+ verify(mMetricsLogger).action(MetricsEvent.ACTION_ZEN_ONBOARDING_SCREEN_OFF, false);
+
+ mActivity.findViewById(R.id.screen_off_option).performClick();
+
+ verify(mMetricsLogger).action(MetricsEvent.ACTION_ZEN_ONBOARDING_SCREEN_OFF, true);
+ }
+
+ @Test
+ public void save_screenOn() {
+ Policy policy = new Policy(
+ PRIORITY_CATEGORY_ALARMS, 0, 0,
+ SUPPRESSED_EFFECT_SCREEN_ON
+ | SUPPRESSED_EFFECT_SCREEN_OFF
+ | SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
+ | SUPPRESSED_EFFECT_LIGHTS
+ | SUPPRESSED_EFFECT_PEEK
+ | SUPPRESSED_EFFECT_STATUS_BAR
+ | SUPPRESSED_EFFECT_BADGE
+ | SUPPRESSED_EFFECT_AMBIENT
+ | SUPPRESSED_EFFECT_NOTIFICATION_LIST);
+ when(mNm.getNotificationPolicy()).thenReturn(policy);
+
+ mActivity.findViewById(R.id.screen_off_option).performClick();
+
+ mActivity.save(null);
+
+ verify(mMetricsLogger).action(MetricsEvent.ACTION_ZEN_ONBOARDING_OK);
+
+ ArgumentCaptor captor = ArgumentCaptor.forClass(Policy.class);
+ verify(mNm).setNotificationPolicy(captor.capture());
+
+ Policy actual = captor.getValue();
+ assertThat(actual.priorityCategories).isEqualTo(PRIORITY_CATEGORY_ALARMS);
+ assertThat(actual.suppressedVisualEffects).isEqualTo(
+ SUPPRESSED_EFFECT_SCREEN_ON | SUPPRESSED_EFFECT_NOTIFICATION_LIST
+ | SUPPRESSED_EFFECT_BADGE | SUPPRESSED_EFFECT_STATUS_BAR
+ | SUPPRESSED_EFFECT_PEEK);
+ }
+
+ @Test
+ public void save_screenOff() {
+ Policy policy = new Policy(
+ PRIORITY_CATEGORY_ALARMS, PRIORITY_SENDERS_ANY, 0,
+ SUPPRESSED_EFFECT_SCREEN_ON
+ | SUPPRESSED_EFFECT_SCREEN_OFF
+ | SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
+ | SUPPRESSED_EFFECT_LIGHTS
+ | SUPPRESSED_EFFECT_PEEK
+ | SUPPRESSED_EFFECT_STATUS_BAR
+ | SUPPRESSED_EFFECT_BADGE
+ | SUPPRESSED_EFFECT_AMBIENT
+ | SUPPRESSED_EFFECT_NOTIFICATION_LIST);
+ when(mNm.getNotificationPolicy()).thenReturn(policy);
+
+ mActivity.findViewById(R.id.screen_on_option).performClick();
+
+ mActivity.save(null);
+
+ verify(mMetricsLogger).action(MetricsEvent.ACTION_ZEN_ONBOARDING_OK);
+
+ ArgumentCaptor captor = ArgumentCaptor.forClass(Policy.class);
+ verify(mNm).setNotificationPolicy(captor.capture());
+
+ Policy actual = captor.getValue();
+ assertThat(actual.priorityCallSenders).isEqualTo(PRIORITY_SENDERS_ANY);
+ assertThat(actual.suppressedVisualEffects).isEqualTo(
+ SUPPRESSED_EFFECT_SCREEN_OFF | SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
+ | SUPPRESSED_EFFECT_LIGHTS | SUPPRESSED_EFFECT_AMBIENT);
+ }
+
+ @Test
+ public void save_none() {
+ Policy policy = new Policy(0, 0, 0,
+ SUPPRESSED_EFFECT_SCREEN_ON
+ | SUPPRESSED_EFFECT_SCREEN_OFF
+ | SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
+ | SUPPRESSED_EFFECT_LIGHTS
+ | SUPPRESSED_EFFECT_PEEK
+ | SUPPRESSED_EFFECT_STATUS_BAR
+ | SUPPRESSED_EFFECT_BADGE
+ | SUPPRESSED_EFFECT_AMBIENT
+ | SUPPRESSED_EFFECT_NOTIFICATION_LIST);
+ when(mNm.getNotificationPolicy()).thenReturn(policy);
+
+ mActivity.findViewById(R.id.screen_on_option).performClick();
+ mActivity.findViewById(R.id.screen_off_option).performClick();
+
+ mActivity.save(null);
+
+ verify(mMetricsLogger).action(MetricsEvent.ACTION_ZEN_ONBOARDING_OK);
+
+ ArgumentCaptor captor = ArgumentCaptor.forClass(Policy.class);
+ verify(mNm).setNotificationPolicy(captor.capture());
+
+ Policy actual = captor.getValue();
+ assertThat(actual.suppressedVisualEffects).isEqualTo(0);
+ }
+
+ @Test
+ public void save_all() {
+ Policy policy = new Policy(0, 0, 0, 0);
+ when(mNm.getNotificationPolicy()).thenReturn(policy);
+
+ mActivity.save(null);
+
+ verify(mMetricsLogger).action(MetricsEvent.ACTION_ZEN_ONBOARDING_OK);
+
+ ArgumentCaptor captor = ArgumentCaptor.forClass(Policy.class);
+ verify(mNm).setNotificationPolicy(captor.capture());
+
+ Policy actual = captor.getValue();
+ assertThat(actual.suppressedVisualEffects).isEqualTo(
+ SUPPRESSED_EFFECT_SCREEN_ON
+ | SUPPRESSED_EFFECT_SCREEN_OFF
+ | SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
+ | SUPPRESSED_EFFECT_LIGHTS
+ | SUPPRESSED_EFFECT_PEEK
+ | SUPPRESSED_EFFECT_STATUS_BAR
+ | SUPPRESSED_EFFECT_BADGE
+ | SUPPRESSED_EFFECT_AMBIENT
+ | SUPPRESSED_EFFECT_NOTIFICATION_LIST);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
index fdd77e86eb3..0cdb2f43d59 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
+import android.app.slice.Slice;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
@@ -44,8 +45,6 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.robolectric.RuntimeEnvironment;
-import androidx.slice.core.SliceHints;
-
@RunWith(SettingsRobolectricTestRunner.class)
public class SliceBroadcastReceiverTest {
@@ -129,7 +128,7 @@ public class SliceBroadcastReceiverTest {
fakeSliderController.setSliderPosition(oldPosition);
// Build action
Intent intent = new Intent(SettingsSliceProvider.ACTION_SLIDER_CHANGED);
- intent.putExtra(SliceHints.EXTRA_RANGE_VALUE, position);
+ intent.putExtra(Slice.EXTRA_RANGE_VALUE, position);
intent.putExtra(SettingsSliceProvider.EXTRA_SLICE_KEY, key);
assertThat(fakeSliderController.getSliderPosition()).isEqualTo(oldPosition);
@@ -163,7 +162,7 @@ public class SliceBroadcastReceiverTest {
// Build action
Intent intent = new Intent(SettingsSliceProvider.ACTION_SLIDER_CHANGED);
- intent.putExtra(SliceHints.EXTRA_RANGE_VALUE, position);
+ intent.putExtra(Slice.EXTRA_RANGE_VALUE, position);
intent.putExtra(SettingsSliceProvider.EXTRA_SLICE_KEY, key);
// Trigger the exception.
@@ -174,7 +173,7 @@ public class SliceBroadcastReceiverTest {
public void sliderOnReceive_noKey_throwsException() {
// Build action
final Intent intent = new Intent(SettingsSliceProvider.ACTION_SLIDER_CHANGED)
- .putExtra(SliceHints.EXTRA_RANGE_VALUE, 0);
+ .putExtra(Slice.EXTRA_RANGE_VALUE, 0);
// Trigger the exception.
mReceiver.onReceive(mContext, intent);
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
index 1f3f40ffb04..58ee9696dc4 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
@@ -17,6 +17,8 @@
package com.android.settings.slices;
import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
@@ -24,6 +26,7 @@ import static org.mockito.Mockito.verify;
import android.content.ContentResolver;
import android.content.Context;
+import android.content.res.Resources;
import android.net.Uri;
import android.provider.Settings;
import android.provider.SettingsSlicesContract;
@@ -36,6 +39,7 @@ import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.FakeSliderController;
import com.android.settings.testutils.FakeToggleController;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.SliceTester;
import org.junit.Before;
import org.junit.Test;
@@ -44,6 +48,8 @@ import org.mockito.ArgumentCaptor;
import org.robolectric.RuntimeEnvironment;
import androidx.slice.Slice;
+import androidx.slice.SliceProvider;
+import androidx.slice.widget.SliceLiveData;
@RunWith(SettingsRobolectricTestRunner.class)
public class SliceBuilderUtilsTest {
@@ -55,8 +61,9 @@ public class SliceBuilderUtilsTest {
private final String FRAGMENT_NAME = "fragment name";
private final int ICON = 1234; // I declare a thumb war
private final Uri URI = Uri.parse("content://com.android.settings.slices/test");
- private final Class PREF_CONTROLLER = FakeToggleController.class;
- private final Class PREF_CONTROLLER2 = FakeContextOnlyPreferenceController.class;
+ private final Class TOGGLE_CONTROLLER = FakeToggleController.class;
+ private final Class SLIDER_CONTROLLER = FakeSliderController.class;
+ private final Class CONTEXT_CONTROLLER = FakeContextOnlyPreferenceController.class;
private final String INTENT_PATH = SettingsSlicesContract.PATH_SETTING_INTENT + "/" + KEY;
private final String ACTION_PATH = SettingsSlicesContract.PATH_SETTING_ACTION + "/" + KEY;
@@ -67,23 +74,50 @@ public class SliceBuilderUtilsTest {
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
+ mContext = spy(RuntimeEnvironment.application);
mFeatureFactory = FakeFeatureFactory.setupForTest();
mLoggingArgumentCatpor = ArgumentCaptor.forClass(Pair.class);
+
+ // Prevent crash in SliceMetadata.
+ Resources resources = spy(mContext.getResources());
+ doReturn(60).when(resources).getDimensionPixelSize(anyInt());
+ doReturn(resources).when(mContext).getResources();
+
+ // Set-up specs for SliceMetadata.
+ SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
}
@Test
- public void testBuildSlice_returnsMatchingSlice() {
- Slice slice = SliceBuilderUtils.buildSlice(mContext, getDummyData());
+ public void buildIntentSlice_returnsMatchingSlice() {
+ final SliceData sliceData = getDummyData(CONTEXT_CONTROLLER, SliceData.SliceType.INTENT);
+ final Slice slice = SliceBuilderUtils.buildSlice(mContext, sliceData);
- assertThat(slice).isNotNull(); // TODO improve test for Slice content
+ SliceTester.testSettingsIntentSlice(mContext, slice, sliceData);
}
@Test
- public void testSliderSlice_returnsSeekBarSlice() {
- final SliceData data = getDummyData(FakeSliderController.class);
+ public void buildToggleSlice_returnsMatchingSlice() {
+ final SliceData dummyData = getDummyData(TOGGLE_CONTROLLER, SliceData.SliceType.SWITCH);
+
+ final Slice slice = SliceBuilderUtils.buildSlice(mContext, dummyData);
+ verify(mFeatureFactory.metricsFeatureProvider)
+ .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED),
+ mLoggingArgumentCatpor.capture());
+ final Pair capturedLoggingPair = mLoggingArgumentCatpor.getValue();
+
+ assertThat(capturedLoggingPair.first)
+ .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
+ assertThat(capturedLoggingPair.second)
+ .isEqualTo(dummyData.getKey());
+ SliceTester.testSettingsToggleSlice(mContext, slice, dummyData);
+ }
+
+ @Test
+ public void buildSliderSlice_returnsMatchingSlice() {
+ final SliceData data = getDummyData(SLIDER_CONTROLLER, SliceData.SliceType.SLIDER);
+
+
final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
-
verify(mFeatureFactory.metricsFeatureProvider)
.action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED),
mLoggingArgumentCatpor.capture());
@@ -93,7 +127,7 @@ public class SliceBuilderUtilsTest {
.isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
assertThat(capturedLoggingPair.second)
.isEqualTo(data.getKey());
- assertThat(slice).isNotNull();
+ SliceTester.testSettingsSliderSlice(mContext, slice, data);
}
@Test
@@ -159,7 +193,8 @@ public class SliceBuilderUtilsTest {
@Test
public void testGetPreferenceController_contextOnly_buildsMatchingController() {
final BasePreferenceController controller =
- SliceBuilderUtils.getPreferenceController(mContext, getDummyData(PREF_CONTROLLER2));
+ SliceBuilderUtils.getPreferenceController(mContext,
+ getDummyData(CONTEXT_CONTROLLER, 0));
assertThat(controller).isInstanceOf(FakeContextOnlyPreferenceController.class);
}
@@ -176,7 +211,7 @@ public class SliceBuilderUtilsTest {
@Test
public void testDynamicSummary_returnsFragmentSummary() {
- final SliceData data = getDummyData((String) null);
+ final SliceData data = getDummyData(null);
final FakePreferenceController controller = spy(
new FakePreferenceController(mContext, KEY));
final String controllerSummary = "new_Summary";
@@ -189,7 +224,7 @@ public class SliceBuilderUtilsTest {
@Test
public void testDynamicSummary_returnsSliceEmptyString() {
- final SliceData data = getDummyData((String) null);
+ final SliceData data = getDummyData(null);
final FakePreferenceController controller = new FakePreferenceController(mContext, KEY);
final CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data);
@@ -285,31 +320,34 @@ public class SliceBuilderUtilsTest {
@Test
public void testUnsupportedSlice_validTitleSummary() {
- final SliceData data = getDummyData(FakeUnavailablePreferenceController.class.getName());
+ final SliceData data = getDummyData(FakeUnavailablePreferenceController.class,
+ SliceData.SliceType.SWITCH);
Settings.System.putInt(mContext.getContentResolver(),
FakeUnavailablePreferenceController.AVAILABILITY_KEY,
BasePreferenceController.DISABLED_UNSUPPORTED);
final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
- assertThat(slice).isNotNull();
+ SliceTester.testSettingsUnavailableSlice(mContext, slice, data);
}
@Test
public void testDisabledForUserSlice_validTitleSummary() {
- final SliceData data = getDummyData(FakeUnavailablePreferenceController.class.getName());
+ final SliceData data = getDummyData(FakeUnavailablePreferenceController.class,
+ SliceData.SliceType.SWITCH);
Settings.System.putInt(mContext.getContentResolver(),
FakeUnavailablePreferenceController.AVAILABILITY_KEY,
BasePreferenceController.DISABLED_FOR_USER);
final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
- assertThat(slice).isNotNull();
+ SliceTester.testSettingsUnavailableSlice(mContext, slice, data);
}
@Test
- public void testDisabledDependententSettingSlice_validTitleSummary() {
- final SliceData data = getDummyData(FakeUnavailablePreferenceController.class.getName());
+ public void testDisabledDependentSettingSlice_validTitleSummary() {
+ final SliceData data = getDummyData(FakeUnavailablePreferenceController.class,
+ SliceData.SliceType.INTENT);
Settings.System.putInt(mContext.getContentResolver(),
FakeUnavailablePreferenceController.AVAILABILITY_KEY,
BasePreferenceController.DISABLED_DEPENDENT_SETTING);
@@ -325,12 +363,13 @@ public class SliceBuilderUtilsTest {
.isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
assertThat(capturedLoggingPair.second)
.isEqualTo(data.getKey());
- assertThat(slice).isNotNull();
+ SliceTester.testSettingsUnavailableSlice(mContext, slice, data);
}
@Test
public void testUnavailableUnknownSlice_validTitleSummary() {
- final SliceData data = getDummyData(FakeUnavailablePreferenceController.class.getName());
+ final SliceData data = getDummyData(FakeUnavailablePreferenceController.class,
+ SliceData.SliceType.SWITCH);
Settings.System.putInt(mContext.getContentResolver(),
FakeUnavailablePreferenceController.AVAILABILITY_KEY,
BasePreferenceController.UNAVAILABLE_UNKNOWN);
@@ -347,22 +386,22 @@ public class SliceBuilderUtilsTest {
.isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
assertThat(capturedLoggingPair.second)
.isEqualTo(data.getKey());
- assertThat(slice).isNotNull();
+ SliceTester.testSettingsUnavailableSlice(mContext, slice, data);
}
private SliceData getDummyData() {
- return getDummyData(PREF_CONTROLLER, SUMMARY);
+ return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH);
}
private SliceData getDummyData(String summary) {
- return getDummyData(PREF_CONTROLLER, summary);
+ return getDummyData(TOGGLE_CONTROLLER, summary, SliceData.SliceType.SWITCH);
}
- private SliceData getDummyData(Class prefController) {
- return getDummyData(prefController, SUMMARY);
+ private SliceData getDummyData(Class prefController, int sliceType) {
+ return getDummyData(prefController, SUMMARY, sliceType);
}
- private SliceData getDummyData(Class prefController, String summary) {
+ private SliceData getDummyData(Class prefController, String summary, int sliceType) {
return new SliceData.Builder()
.setKey(KEY)
.setTitle(TITLE)
@@ -372,6 +411,7 @@ public class SliceBuilderUtilsTest {
.setFragmentName(FRAGMENT_NAME)
.setUri(URI)
.setPreferenceControllerClassName(prefController.getName())
+ .setSliceType(sliceType)
.build();
}
}
diff --git a/tests/robotests/src/com/android/settings/testutils/SliceTester.java b/tests/robotests/src/com/android/settings/testutils/SliceTester.java
new file mode 100644
index 00000000000..ef62d77e27a
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/SliceTester.java
@@ -0,0 +1,170 @@
+/*
+ * 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 static android.app.slice.Slice.HINT_TITLE;
+import static android.app.slice.SliceItem.FORMAT_TEXT;
+
+import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING;
+import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER;
+import static com.android.settings.core.BasePreferenceController.DISABLED_UNSUPPORTED;
+import static com.android.settings.core.BasePreferenceController.UNAVAILABLE_UNKNOWN;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.PendingIntent;
+import android.content.Context;
+
+import java.util.List;
+
+import androidx.slice.Slice;
+import androidx.slice.SliceItem;
+import androidx.slice.SliceMetadata;
+import androidx.slice.core.SliceAction;
+import androidx.slice.core.SliceQuery;
+
+import android.support.v4.graphics.drawable.IconCompat;
+
+import com.android.settings.slices.SettingsSliceProvider;
+import com.android.settings.slices.SliceBuilderUtils;
+import com.android.settings.slices.SliceData;
+
+/**
+ * Testing utility class to verify the contents of the different Settings Slices.
+ *
+ * TODO (77712944) check Summary, range (metadata.getRange()), toggle icons.
+ */
+public class SliceTester {
+
+ /**
+ * Test the contents of an intent based slice, including:
+ * - No toggles
+ * - Correct intent
+ * - Correct title
+ */
+ public static void testSettingsIntentSlice(Context context, Slice slice, SliceData sliceData) {
+ final SliceMetadata metadata = SliceMetadata.from(context, slice);
+
+ final List toggles = metadata.getToggles();
+ assertThat(toggles).isEmpty();
+
+ final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
+ assertThat(primaryPendingIntent).isEqualTo(
+ SliceBuilderUtils.getContentIntent(context, sliceData));
+
+ final List sliceItems = slice.getItems();
+ assertTitle(sliceItems, sliceData.getTitle());
+ }
+
+ /**
+ * Test the contents of an toggle based slice, including:
+ * - Contains one toggle
+ * - Correct toggle intent
+ * - Correct content intent
+ * - Correct title
+ */
+ public static void testSettingsToggleSlice(Context context, Slice slice, SliceData sliceData) {
+ final SliceMetadata metadata = SliceMetadata.from(context, slice);
+
+ final List toggles = metadata.getToggles();
+ assertThat(toggles).hasSize(1);
+
+ final SliceAction mainToggleAction = toggles.get(0);
+
+ final IconCompat expectedToggleIcon = IconCompat.createWithResource(context,
+ sliceData.getIconResource());
+ assertThat(mainToggleAction.getIcon()).isNull();
+
+ // Check intent in Toggle Action
+ final PendingIntent togglePendingIntent = mainToggleAction.getAction();
+ assertThat(togglePendingIntent).isEqualTo(SliceBuilderUtils.getActionIntent(context,
+ SettingsSliceProvider.ACTION_TOGGLE_CHANGED, sliceData));
+
+ // Check primary intent
+ final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
+ assertThat(primaryPendingIntent).isEqualTo(
+ SliceBuilderUtils.getContentIntent(context, sliceData));
+
+ final List sliceItems = slice.getItems();
+ assertTitle(sliceItems, sliceData.getTitle());
+ }
+
+ /**
+ * Test the contents of an slider based slice, including:
+ * - No intent
+ * - Correct title
+ */
+ public static void testSettingsSliderSlice(Context context, Slice slice, SliceData sliceData) {
+ final SliceMetadata metadata = SliceMetadata.from(context, slice);
+
+ final IconCompat expectedToggleIcon = IconCompat.createWithResource(context,
+ sliceData.getIconResource());
+
+ // Check primary intent
+ final SliceAction primaryAction = metadata.getPrimaryAction();
+ assertThat(primaryAction).isNull();
+
+ final List sliceItems = slice.getItems();
+ assertTitle(sliceItems, sliceData.getTitle());
+ }
+
+ /**
+ * Test the contents of an unavailable slice, including:
+ * - No toggles
+ * - Correct title
+ * - Correct intent
+ */
+ public static void testSettingsUnavailableSlice(Context context, Slice slice,
+ SliceData sliceData) {
+ final SliceMetadata metadata = SliceMetadata.from(context, slice);
+
+ final List toggles = metadata.getToggles();
+ assertThat(toggles).isEmpty();
+
+ final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
+ final int availabilityStatus = SliceBuilderUtils.getPreferenceController(context,
+ sliceData).getAvailabilityStatus();
+ switch (availabilityStatus) {
+ case DISABLED_UNSUPPORTED:
+ case UNAVAILABLE_UNKNOWN:
+ assertThat(primaryPendingIntent).isEqualTo(
+ SliceBuilderUtils.getSettingsIntent(context));
+ break;
+ case DISABLED_FOR_USER:
+ case DISABLED_DEPENDENT_SETTING:
+ assertThat(primaryPendingIntent).isEqualTo(
+ SliceBuilderUtils.getContentIntent(context, sliceData));
+ break;
+ }
+
+ final List sliceItems = slice.getItems();
+ assertTitle(sliceItems, sliceData.getTitle());
+ }
+
+ private static void assertTitle(List sliceItems, String title) {
+ boolean hasTitle = false;
+ for (SliceItem item : sliceItems) {
+ List titles = SliceQuery.findAll(item, FORMAT_TEXT, HINT_TITLE,
+ null /* non-hints */);
+ if (titles != null & titles.size() == 1) {
+ assertThat(titles.get(0).getText()).isEqualTo(title);
+ hasTitle = true;
+ }
+ }
+ assertThat(hasTitle).isTrue();
+ }
+}
\ No newline at end of file