Snap for 4713750 from b86e8cadd9
to pi-release
Change-Id: Ifb9e956ca35c905137d9811631bd06fbe14e1f60
This commit is contained in:
@@ -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" />
|
||||
|
0
res/drawable-nodpi/aab_brightness
Normal file
0
res/drawable-nodpi/aab_brightness
Normal file
0
res/drawable-nodpi/gesture_prevent_ringing
Normal file
0
res/drawable-nodpi/gesture_prevent_ringing
Normal 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>
|
||||
|
@@ -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"
|
||||
|
167
res/layout/zen_onboarding.xml
Normal file
167
res/layout/zen_onboarding.xml
Normal 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>
|
0
res/raw/aab_brightness.mp4
Normal file
0
res/raw/aab_brightness.mp4
Normal file
0
res/raw/gesture_prevent_ringing.mp4
Normal file
0
res/raw/gesture_prevent_ringing.mp4
Normal 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 & 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>
|
||||
|
38
res/xml/auto_brightness_detail.xml
Normal file
38
res/xml/auto_brightness_detail.xml
Normal 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>
|
@@ -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"
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
@@ -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"
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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();
|
||||
}
|
||||
|
||||
|
72
src/com/android/settings/display/AutoBrightnessSettings.java
Normal file
72
src/com/android/settings/display/AutoBrightnessSettings.java
Normal 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);
|
||||
}
|
||||
};
|
||||
}
|
@@ -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
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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));
|
||||
|
@@ -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) {
|
||||
|
@@ -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));
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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()));
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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 */);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
@@ -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, Lifecycle lifecycle,
|
||||
@UserIdInt int userId, String key) {
|
||||
super(context);
|
||||
if (lifecycle != null) {
|
||||
lifecycle.addObserver(this);
|
||||
public PreventRingingPreferenceController(Context context, String key) {
|
||||
super(context, key);
|
||||
}
|
||||
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);
|
||||
|
@@ -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());
|
||||
|
@@ -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;
|
||||
|
@@ -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();
|
||||
}
|
||||
|
@@ -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();
|
||||
|
@@ -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
|
||||
|
@@ -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) {
|
||||
|
@@ -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());
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
@@ -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();
|
||||
}
|
||||
|
106
src/com/android/settings/notification/ZenOnboardingActivity.java
Normal file
106
src/com/android/settings/notification/ZenOnboardingActivity.java
Normal 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();
|
||||
}
|
||||
}
|
@@ -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);
|
||||
|
@@ -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:
|
||||
|
@@ -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;
|
||||
|
@@ -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()));
|
||||
}
|
||||
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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();
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
|
@@ -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();
|
||||
|
@@ -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();
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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());
|
||||
}
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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);
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user