Snap for 4713750 from b86e8cadd9 to pi-release

Change-Id: Ifb9e956ca35c905137d9811631bd06fbe14e1f60
This commit is contained in:
android-build-team Robot
2018-04-11 07:22:07 +00:00
61 changed files with 1234 additions and 291 deletions

View File

@@ -700,6 +700,7 @@
</activity>
<activity android:name=".inputmethod.UserDictionaryAddWordActivity"
android:visibleToInstantApps="true"
android:label="@string/user_dict_settings_title"
android:theme="@*android:style/Theme.DeviceDefault.Settings.Dialog.NoActionBar"
android:windowSoftInputMode="stateVisible"
@@ -742,12 +743,30 @@
android:exported="true"
android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.ZEN_MODE_BLOCKED_EFFECTS_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.notification.ZenModeBlockedEffectsSettings" />
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
android:value="true" />
</activity>
<activity
android:name=".notification.ZenOnboardingActivity"
android:label="@string/zen_onboarding_dnd_visual_disturbances_header"
android:icon="@drawable/ic_settings_notifications"
android:theme="@style/Theme.Settings.NoActionBar"
android:exported="true"
android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
<intent-filter android:priority="1">
<action android:name="android.settings.ZEN_MODE_ONBOARDING" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="Settings$ZenModeBehaviorSettingsActivity"
android:label="@string/zen_mode_behavior_settings_title"
@@ -771,7 +790,7 @@
android:icon="@drawable/ic_settings_notifications"
android:exported="true"
android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
android:parentActivityName="Settings$ZenModeSettingsActivity">
<intent-filter android:priority="1">
<action android:name="android.settings.ZEN_MODE_AUTOMATION_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -834,7 +853,7 @@
android:name="Settings$ZenModeScheduleRuleSettingsActivity"
android:exported="true"
android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
android:parentActivityName="Settings$ZenModeAutomationSettingsActivity">
<intent-filter android:priority="1">
<action android:name="android.settings.ZEN_MODE_SCHEDULE_RULE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -853,7 +872,7 @@
android:name="Settings$ZenModeEventRuleSettingsActivity"
android:exported="true"
android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
android:parentActivityName="Settings$ZenModeAutomationSettingsActivity">
<intent-filter android:priority="1">
<action android:name="android.settings.ZEN_MODE_EVENT_RULE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />

View File

View File

@@ -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" />
</LinearLayout>

View File

@@ -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"/>
</LinearLayout>
@@ -80,6 +80,7 @@
<SeekBar
android:id="@*android:id/seekbar"
android:layout_gravity="center_vertical"
android:paddingStart="12dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
@@ -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"

View File

@@ -0,0 +1,167 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp">
<ImageView
android:id="@+id/header_icon"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:src="@drawable/ic_zen"
android:tint="?android:attr/colorAccent"/>
<TextView
android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/header_icon"
android:layout_centerHorizontal="true"
android:layout_marginTop="12dp"
android:text="@string/zen_onboarding_dnd_visual_disturbances_header"
android:textAppearance="@android:style/TextAppearance.Material.Headline" />
<TextView
android:id="@+id/feature_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/header"
android:layout_centerHorizontal="true"
android:textAlignment="center"
android:layout_marginTop="14dp"
android:textAppearance="?android:attr/textAppearanceListItem"
android:text="@string/zen_onboarding_dnd_visual_disturbances_description" />
<LinearLayout
android:id="@+id/screen_off"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/feature_description"
android:layout_centerHorizontal="true"
android:layout_marginTop="35dp"
android:orientation="horizontal">
<CheckBox
android:id="@+id/screen_off_option"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="8dp"
android:onClick="logClick" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/screen_off_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/zen_onboarding_screen_off_title"
android:textAppearance="?android:attr/textAppearanceListItem" />
<TextView
android:id="@+id/screen_off_summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/zen_onboarding_screen_off_summary" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/screen_on"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/screen_off"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:orientation="horizontal">
<CheckBox
android:id="@+id/screen_on_option"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="8dp"
android:onClick="logClick" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/screen_on_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/zen_onboarding_screen_off_title"
android:textAppearance="?android:attr/textAppearanceListItem" />
<TextView
android:id="@+id/screen_on_summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/zen_onboarding_screen_on_summary" />
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/further_customize"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/screen_on"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:textAppearance="?android:attr/textAppearanceListItem"
android:text="@string/zen_onboarding_more_options" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/further_customize"
android:layout_marginTop="35dp"
android:id="@+id/buttons">
<TextView
android:id="@+id/settings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_weight="1"
android:layout_centerInParent="true"
android:text="@string/zen_onboarding_settings"
android:textAppearance="?android:attr/textAppearanceListItem"
android:textColor="?android:attr/colorControlActivated"
android:onClick="launchSettings" />
<Button
android:id="@+id/ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_weight="1"
android:layout_centerInParent="true"
android:text="@string/zen_onboarding_ok"
style="@style/ActionPrimaryButton"
android:onClick="save" />
</RelativeLayout>
</RelativeLayout>

View File

View File

View File

@@ -1592,7 +1592,7 @@
<!-- Bluetooth settings: The sub heading for devices which have already been paired with this device. [CHAR LIMIT=40] -->
<string name="bluetooth_preference_paired_devices">Paired devices</string>
<!-- Bluetooth settings: The sub heading for available devices during and after scanning. [CHAR LIMIT=40] -->
<string name="bluetooth_preference_found_media_devices">Available media devices</string>
<string name="bluetooth_preference_found_media_devices">Available devices</string>
<!-- Bluetooth settings: The message displayed if no Bluetooth devices were found. [CHAR LIMIT=40] -->
<string name="bluetooth_preference_no_found_devices">No devices available</string>
<!-- Bluetooth settings. Context menu item for a device. Action will connect to all profiles on the device. -->
@@ -5924,10 +5924,6 @@
<string name="really_remove_account_message" product="device">Removing this account will delete all of its messages, contacts, and other data from the device!</string>
<!-- This is shown if the autheticator for a given account fails to remove it. [CHAR LIMIT=NONE] -->
<string name="remove_account_failed">This change isn\'t allowed by your admin</string>
<!-- What to show in messaging that refers to this provider, e.g. AccountSyncSettings -->
<string name="provider_label">Push subscriptions</string>
<!-- Formatter in AccountSyncSettings for each application we wish to synchronize, e.g. "Sync Calendar" -->
<string name="sync_item_title"><xliff:g id="authority" example="Calendar">%s</xliff:g></string>
<!-- Title of dialog shown when you can't manually sync an item because it's disabled -->
<string name="cant_sync_dialog_title">Can\u2019t manually sync</string>
<!-- Messaage shown in dialog when you can't manually sync -->
@@ -6668,6 +6664,8 @@
<string name="help_url_font_size" translatable="false"></string>
<!-- Help URL, Display size [DO NOT TRANSLATE] -->
<string name="help_url_display_size" translatable="false"></string>
<!-- Help URL, Auto brightness [DO NOT TRANSLATE] -->
<string name="help_url_auto_brightness" translatable="false" />
<string name="help_url_network_dashboard" translatable="false"></string>
<string name="help_url_connected_devices" translatable="false"></string>
@@ -7325,6 +7323,16 @@
<item quantity="other"><xliff:g id="on_count" example="3">%d</xliff:g> rules can turn on automatically</item>
</plurals>
<string name="zen_onboarding_ok">Ok</string>
<string name="zen_onboarding_settings">Settings</string>
<string name="zen_onboarding_more_options">You can further customize this in Settings.</string>
<string name="zen_onboarding_screen_on_title">Block when the screen is on</string>
<string name="zen_onboarding_screen_off_title">Block when the screen is off</string>
<string name="zen_onboarding_dnd_visual_disturbances_description">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.</string>
<string name="zen_onboarding_dnd_visual_disturbances_header">Block sounds and visuals</string>
<string name="zen_onboarding_screen_off_summary">Don\'t turn on the screen or show notifications in the ambient display</string>
<string name="zen_onboarding_screen_on_summary">Don\'t show notifications at all, except for basic phone activity and status</string>
<!-- Work Sounds: Work sound settings section header. [CHAR LIMIT=50] -->
<string name="sound_work_settings">Work profile sounds</string>
@@ -7515,9 +7523,9 @@
<string name="default_notification_assistant">Notification assistant</string>
<!-- app summary of notification app list screen [CHAR LIMIT=100] -->
<string name="notifications_sent_daily">~<xliff:g id="number">%1$s</xliff:g> sent daily</string>
<string name="notifications_sent_daily">~<xliff:g id="number">%1$s</xliff:g> per day</string>
<!-- app summary of notification app list screen [CHAR LIMIT=100] -->
<string name="notifications_sent_weekly">~<xliff:g id="number">%1$s</xliff:g> sent weekly</string>
<string name="notifications_sent_weekly">~<xliff:g id="number">%1$s</xliff:g> per week</string>
<!-- app summary of notification app list screen [CHAR LIMIT=100] -->
<string name="notifications_sent_never">Never</string>
@@ -9835,6 +9843,9 @@
<!-- Title for media output settings -->
<string name="media_output_title">Play media to</string>
<!-- Summary for media output default settings. (this device) [CHAR LIMIT=30] -->
<string name="media_output_default_summary">This device</string>
<!-- Summary for media output settings. (phone) -->
<string name="media_output_summary" product="default">Phone</string>
@@ -9866,6 +9877,8 @@
<string name="gesture_prevent_ringing_screen_title">Prevent ringing</string>
<!-- Title for prevent ringing setting -->
<string name="gesture_prevent_ringing_title">Press Power &amp; Volume Up together</string>
<!-- Title for prevent ringing setting -->
<string name="gesture_prevent_ringing_sound_title">Shortcut to prevent ringing</string>
<!-- Option for prevent ringing setting -->
<string name="prevent_ringing_option_vibrate">Vibrate</string>
<!-- Option for prevent ringing setting -->
@@ -9873,11 +9886,11 @@
<!-- Option for prevent ringing setting -->
<string name="prevent_ringing_option_none">Do nothing</string>
<!-- Summary for prevent ringing setting -->
<string name="prevent_ringing_option_vibrate_summary">Vibrate all calls and notifications</string>
<string name="prevent_ringing_option_vibrate_summary">On (vibrate)</string>
<!-- Summary for prevent ringing setting -->
<string name="prevent_ringing_option_mute_summary">Mute all calls and notifications</string>
<string name="prevent_ringing_option_mute_summary">On (mute)</string>
<!-- Summary for prevent ringing setting -->
<string name="prevent_ringing_option_none_summary">Do nothing</string>
<string name="prevent_ringing_option_none_summary">Off</string>
<!-- Title for detail page of wifi network [CHAR LIMIT=30] -->
<string name="pref_title_network_details">Network details</string>

View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="auto_brightness_detail"
android:title="@string/auto_brightness_title"
settings:keywords="@string/keywords_display_auto_brightness">
<com.android.settings.widget.VideoPreference
android:key="auto_brightness_video"
settings:animation="@raw/aab_brightness"
settings:preview="@drawable/aab_brightness"/>
<!-- Cross-listed item, if you change this, also change it in power_usage_summary.xml -->
<com.android.settingslib.RestrictedSwitchPreference
android:key="auto_brightness"
android:title="@string/auto_brightness_title"
settings:controller="com.android.settings.display.AutoBrightnessPreferenceController"
settings:useAdminDisabledSummary="true"
settings:userRestriction="no_config_brightness" />
</PreferenceScreen>

View File

@@ -39,15 +39,12 @@
settings:widgetLayout="@null"
settings:keywords="@string/keywords_display_night_display" />
<!-- Cross-listed item, if you change this, also change it in power_usage_summary.xml -->
<com.android.settingslib.RestrictedSwitchPreference
android:key="auto_brightness"
<Preference
android:key="auto_brightness_entry"
android:title="@string/auto_brightness_title"
android:summary="@string/auto_brightness_summary"
settings:keywords="@string/keywords_display_auto_brightness"
settings:controller="com.android.settings.display.AutoBrightnessPreferenceController"
settings:useAdminDisabledSummary="true"
settings:userRestriction="no_config_brightness" />
android:fragment="com.android.settings.display.AutoBrightnessSettings"
settings:controller="com.android.settings.display.AutoBrightnessPreferenceController" />
<com.android.settingslib.RestrictedPreference
android:key="wallpaper"

View File

@@ -60,6 +60,7 @@
<Preference
android:key="gesture_prevent_ringing_summary"
android:title="@string/gesture_prevent_ringing_screen_title"
android:fragment="com.android.settings.gestures.PreventRingingGestureSettings" />
android:fragment="com.android.settings.gestures.PreventRingingGestureSettings"
settings:controller="com.android.settings.gestures.PreventRingingPreferenceController" />
</PreferenceScreen>

View File

@@ -21,15 +21,17 @@
android:key="gesture_prevent_ringing_screen"
android:title="@string/gesture_prevent_ringing_screen_title">
<!-- TODO: Add video preference when it exists -->
<com.android.settings.widget.VideoPreference
android:key="gesture_prevent_ringing_video" />
android:key="gesture_prevent_ringing_video"
app:animation="@raw/gesture_prevent_ringing"
app:preview="@drawable/gesture_prevent_ringing" />
<ListPreference
android:key="gesture_prevent_ringing"
android:title="@string/gesture_prevent_ringing_title"
android:entries="@array/gesture_prevent_ringing_entries"
android:entryValues="@array/gesture_prevent_ringing_values"
app:controller="com.android.settings.gestures.PreventRingingPreferenceController"
app:keywords="@string/keywords_gesture" />
</PreferenceScreen>

View File

@@ -20,7 +20,7 @@
android:title="@string/sound_settings"
android:key="sound_settings"
settings:keywords="@string/keywords_sounds"
settings:initialExpandedChildrenCount="7">
settings:initialExpandedChildrenCount="8">
<!-- Media volume -->
<com.android.settings.notification.VolumeSeekBarPreference
@@ -70,6 +70,14 @@
settings:allowDividerAbove="true"
android:order="-120"/>
<Preference
android:key="gesture_prevent_ringing_sound"
android:title="@string/gesture_prevent_ringing_sound_title"
settings:allowDividerAbove="true"
android:order="-110"
android:fragment="com.android.settings.gestures.PreventRingingGestureSettings"
settings:controller="com.android.settings.gestures.PreventRingingPreferenceController" />
<!-- Phone ringtone -->
<com.android.settings.DefaultRingtonePreference
android:key="ringtone"

View File

@@ -23,7 +23,6 @@ import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.display.AmbientDisplayPreferenceController;
import com.android.settings.display.AutoRotatePreferenceController;
import com.android.settings.display.BrightnessLevelPreferenceController;
import com.android.settings.display.CameraGesturePreferenceController;
import com.android.settings.display.ColorModePreferenceController;
@@ -52,7 +51,7 @@ public class DisplaySettings extends DashboardFragment {
private static final String KEY_SCREEN_TIMEOUT = "screen_timeout";
private static final String KEY_AMBIENT_DISPLAY = "ambient_display";
private static final String KEY_AUTO_BRIGHTNESS = "auto_brightness_entry";
private static final String KEY_NIGHT_DISPLAY = "night_display";
@Override
@@ -122,6 +121,7 @@ public class DisplaySettings extends DashboardFragment {
keys.add(KEY_DISPLAY_SIZE);
keys.add(WallpaperPreferenceController.KEY_WALLPAPER);
keys.add(KEY_NIGHT_DISPLAY);
keys.add(KEY_AUTO_BRIGHTNESS);
return keys;
}

View File

@@ -194,25 +194,24 @@ public class AccountSyncSettings extends AccountPreferenceBase {
} else {
item.setup(account, authority, packageName, uid);
}
final PackageManager packageManager = getPackageManager();
item.setPersistent(false);
final ProviderInfo providerInfo = getPackageManager().resolveContentProviderAsUser(
final ProviderInfo providerInfo = packageManager.resolveContentProviderAsUser(
authority, 0, mUserHandle.getIdentifier());
if (providerInfo == null) {
return;
}
CharSequence providerLabel = providerInfo.loadLabel(getPackageManager());
final CharSequence providerLabel = providerInfo.loadLabel(packageManager);
if (TextUtils.isEmpty(providerLabel)) {
Log.e(TAG, "Provider needs a label for authority '" + authority + "'");
return;
}
String title = getString(R.string.sync_item_title, providerLabel);
item.setTitle(title);
item.setTitle(providerLabel);
item.setKey(authority);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuItem syncNow = menu.add(0, MENU_SYNC_NOW_ID, 0,
getString(R.string.sync_menu_sync_now))
.setIcon(R.drawable.ic_menu_refresh_holo_dark);

View File

@@ -21,6 +21,7 @@ import android.app.ActivityManager;
import android.content.Context;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.PreferenceViewHolder;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
@@ -64,6 +65,7 @@ public class SyncStateSwitchPreference extends SwitchPreference {
mAuthority = authority;
mPackageName = packageName;
mUid = uid;
setVisible(!TextUtils.isEmpty(mAuthority));
notifyChanged();
}

View File

@@ -0,0 +1,72 @@
/*
* 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.display;
import android.content.Context;
import android.os.Bundle;
import android.provider.SearchIndexableResource;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import java.util.Arrays;
import java.util.List;
public class AutoBrightnessSettings extends DashboardFragment {
private static final String TAG = "AutoBrightnessSettings";
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
mFooterPreferenceMixin.createFooterPreference()
.setTitle(R.string.auto_brightness_description);
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.auto_brightness_detail;
}
@Override
protected String getLogTag() {
return TAG;
}
@Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.SETTINGS_AUTO_BRIGHTNESS;
}
@Override
public int getHelpResource() {
return R.string.help_url_auto_brightness;
}
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(
Context context, boolean enabled) {
final SearchIndexableResource sir = new SearchIndexableResource(context);
sir.xmlResId = R.xml.auto_brightness_detail;
return Arrays.asList(sir);
}
};
}

View File

@@ -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

View File

@@ -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();
}
}
}

View File

@@ -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));

View File

@@ -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<String> getNonIndexableKeys(Context context) {
return super.getNonIndexableKeys(context);
}
@Override
public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {

View File

@@ -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));
}
}

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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<BatterySipper> 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()));

View File

@@ -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);
}
}

View File

@@ -63,19 +63,6 @@ public class GestureSettings extends DashboardFragment {
return R.xml.gestures;
}
@Override
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
static List<AbstractPreferenceController> buildPreferenceControllers(
@NonNull Context context, @Nullable Lifecycle lifecycle) {
final List<AbstractPreferenceController> 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<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null);
}
@Override
public List<String> getNonIndexableKeys(Context context) {
List<String> 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;
}

View File

@@ -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<AbstractPreferenceController> controllers =
GestureSettings.buildPreferenceControllers(context, null);
final List<AbstractPreferenceController> 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;
}

View File

@@ -61,19 +61,6 @@ public class PreventRingingGestureSettings extends DashboardFragment {
return 0;
}
@Override
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new PreventRingingPreferenceController(context, lifecycle,
UserHandle.myUserId(), KEY_PREVENT_RINGING));
return controllers;
}
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
@@ -83,12 +70,6 @@ public class PreventRingingGestureSettings extends DashboardFragment {
sir.xmlResId = R.xml.prevent_ringing_gesture_settings;
return Arrays.asList(sir);
}
@Override
public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null /* lifecycle */);
}
};
}

View File

@@ -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);

View File

@@ -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());

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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

View File

@@ -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) {

View File

@@ -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());
}
}

View File

@@ -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);

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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();
}
}

View File

@@ -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);

View File

@@ -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:

View File

@@ -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;

View File

@@ -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()));
}

View File

@@ -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();
}
}

View File

@@ -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<RadioButtonPreference> 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();
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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();
}
}

View File

@@ -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();

View File

@@ -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();

View File

@@ -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

View File

@@ -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

View File

@@ -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());
}
}

View File

@@ -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) {

View File

@@ -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<Policy> 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<Policy> 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<Policy> 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<Policy> 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);
}
}

View File

@@ -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);

View File

@@ -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<Integer, Object> 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();
}
}

View File

@@ -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<SliceAction> toggles = metadata.getToggles();
assertThat(toggles).isEmpty();
final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
assertThat(primaryPendingIntent).isEqualTo(
SliceBuilderUtils.getContentIntent(context, sliceData));
final List<SliceItem> 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<SliceAction> 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<SliceItem> 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<SliceItem> 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<SliceAction> 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<SliceItem> sliceItems = slice.getItems();
assertTitle(sliceItems, sliceData.getTitle());
}
private static void assertTitle(List<SliceItem> sliceItems, String title) {
boolean hasTitle = false;
for (SliceItem item : sliceItems) {
List<SliceItem> 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();
}
}