Merge "Change to use the expand button in support lib."

This commit is contained in:
TreeHugger Robot
2017-10-27 21:56:23 +00:00
committed by Android (Google) Code Review
30 changed files with 85 additions and 1473 deletions

View File

@@ -1,75 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2016 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.
-->
<!-- Based off frameworks/base/core/res/res/layout/preference_material.xml -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:background="?android:attr/selectableItemBackground"
android:clipToPadding="false">
<LinearLayout
android:id="@+id/icon_frame"
style="@style/preference_icon_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="start|center_vertical"
android:orientation="horizontal"
android:paddingEnd="12dp"
android:paddingTop="4dp"
android:paddingBottom="4dp">
<com.android.internal.widget.PreferenceImageView
android:id="@android:id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="48dp"
android:maxHeight="48dp"/>
</LinearLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="16dp"
android:paddingBottom="16dp">
<TextView
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItem"
android:ellipsize="marquee"/>
<TextView
android:id="@android:id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@android:id/title"
android:layout_alignStart="@android:id/title"
android:textAppearance="?android:attr/textAppearanceListItemSecondary"
android:textColor="?android:attr/textColorSecondary"
android:ellipsize="marquee"
android:maxLines="1"/>
</RelativeLayout>
</LinearLayout>

View File

@@ -19,7 +19,8 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
android:key="apps_and_notification_screen"
android:title="@string/app_and_notification_dashboard_title">
android:title="@string/app_and_notification_dashboard_title"
settings:initialExpandedChildrenCount="4">
<PreferenceCategory
android:key="recent_apps_category"

View File

@@ -1,83 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2016 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/com.android.settings"
android:title="@string/app_and_notification_dashboard_title"
android:key="apps_and_notification_screen"
settings:initialExpandedChildrenCount="4">
<PreferenceCategory
android:key="recent_apps_category"
android:title="@string/recent_app_category_title"
android:order="-200">
<!-- Placeholder for a list of recent apps -->
<!-- See all apps button -->
<Preference
android:title="@string/applications_settings"
android:key="all_app_info"
android:order="20">
<intent
android:action="android.intent.action.MAIN"
android:targetPackage="com.android.settings"
android:targetClass="com.android.settings.Settings$ManageApplicationsActivity">
<extra android:name="show_drawer_menu" android:value="true" />
</intent>
</Preference>
</PreferenceCategory>
<!-- Empty category to draw divider -->
<PreferenceCategory
android:key="all_app_info_divider"
android:order="-190"/>
<Preference
android:key="manage_perms"
android:title="@string/app_permissions"
android:order="-130"
settings:keywords="@string/keywords_app_permissions">
<intent android:action="android.intent.action.MANAGE_PERMISSIONS" />
</Preference>
<PreferenceCategory
android:key="dashboard_tile_placeholder"
android:order="10" />
<com.android.settingslib.RestrictedPreference
android:key="app_and_notif_cell_broadcast_settings"
android:title="@string/cell_broadcast_settings"
android:order="15"
settings:useAdminDisabledSummary="true">
<intent
android:action="android.intent.action.MAIN"
android:targetPackage="com.android.cellbroadcastreceiver"
android:targetClass="com.android.cellbroadcastreceiver.CellBroadcastSettings" />
</com.android.settingslib.RestrictedPreference>
<Preference
android:key="special_access"
android:title="@string/special_access"
android:order="20" >
<intent
android:action="android.intent.action.MAIN"
android:targetPackage="com.android.settings"
android:targetClass="com.android.settings.Settings$SpecialAccessSettingsActivity" />
</Preference>
</PreferenceScreen>

View File

@@ -19,7 +19,8 @@
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
android:key="display_settings_screen"
android:title="@string/display_settings"
settings:keywords="@string/keywords_display">
settings:keywords="@string/keywords_display"
settings:initialExpandedChildrenCount="4">
<Preference
android:key="brightness"

View File

@@ -1,128 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2016 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/com.android.settings"
android:title="@string/display_settings"
settings:keywords="@string/keywords_display"
android:key="display_settings_screen"
settings:initialExpandedChildrenCount="4">
<Preference
android:key="brightness"
android:title="@string/brightness"
settings:keywords="@string/keywords_display_brightness_level">
<intent android:action="com.android.intent.action.SHOW_BRIGHTNESS_DIALOG" />
</Preference>
<com.android.settings.display.NightDisplayPreference
android:key="night_display"
android:title="@string/night_display_title"
android:fragment="com.android.settings.display.NightDisplaySettings"
android:widgetLayout="@null"
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 -->
<SwitchPreference
android:key="auto_brightness"
android:title="@string/auto_brightness_title"
settings:keywords="@string/keywords_display_auto_brightness"
android:summary="@string/auto_brightness_summary" />
<com.android.settingslib.RestrictedPreference
android:key="wallpaper"
android:title="@string/wallpaper_settings_title"
settings:keywords="@string/keywords_display_wallpaper"
settings:useAdminDisabledSummary="true">
<intent
android:targetPackage="@string/config_wallpaper_picker_package"
android:targetClass="@string/config_wallpaper_picker_class" />
</com.android.settingslib.RestrictedPreference>
<!-- Cross-listed item, if you change this, also change it in power_usage_summary.xml -->
<com.android.settings.TimeoutListPreference
android:key="screen_timeout"
android:title="@string/screen_timeout"
android:summary="@string/summary_placeholder"
android:entries="@array/screen_timeout_entries"
android:entryValues="@array/screen_timeout_values" />
<SwitchPreference
android:key="auto_rotate"
android:title="@string/accelerometer_title" />
<SwitchPreference
android:key="color_mode"
android:title="@string/color_mode_title" />
<Preference
android:key="font_size"
android:title="@string/title_font_size"
android:fragment="com.android.settings.accessibility.ToggleFontSizePreferenceFragment"
settings:keywords="@string/keywords_display_font_size" />
<com.android.settings.display.ScreenZoomPreference
android:key="screen_zoom"
android:title="@string/screen_zoom_title"
settings:keywords="@string/screen_zoom_keywords" />
<Preference
android:key="screensaver"
android:title="@string/screensaver_settings_title"
android:fragment="com.android.settings.dream.DreamSettings" />
<!-- Cross-listed item, if you change this, also change it in power_usage_summary.xml -->
<Preference
android:key="ambient_display"
android:title="@string/ambient_display_screen_title"
android:fragment="com.android.settings.display.AmbientDisplaySettings" />
<!-- Hide night mode for now
<ListPreference
android:key="night_mode"
android:title="@string/night_mode_title"
settings:keywords="@string/keywords_display_night_mode"
android:summary="@string/night_mode_summary"
android:entries="@array/night_mode_entries"
android:entryValues="@array/night_mode_values" /> -->
<SwitchPreference
android:key="camera_gesture"
android:title="@string/camera_gesture_title"
android:summary="@string/camera_gesture_desc" />
<SwitchPreference
android:key="lift_to_wake"
android:title="@string/lift_to_wake_title" />
<SwitchPreference
android:key="tap_to_wake"
android:title="@string/tap_to_wake"
android:summary="@string/tap_to_wake_summary" />
<ListPreference
android:key="theme"
android:title="@string/device_theme"
android:summary="@string/summary_placeholder" />
<Preference
android:key="vr_display_pref"
android:title="@string/display_vr_pref_title"
android:fragment="com.android.settings.display.VrDisplayPreferencePicker" />
</PreferenceScreen>

View File

@@ -17,7 +17,9 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
xmlns:app="http://schemas.android.com/apk/res-auto"
android:key="installed_app_detail_settings_screen"
app:initialExpandedChildrenCount="6">
<com.android.settings.applications.LayoutPreference
android:key="header_view"

View File

@@ -19,7 +19,8 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
android:key="language_and_input_settings_screen"
android:title="@string/language_settings" >
android:title="@string/language_settings"
settings:initialExpandedChildrenCount="3" >
<Preference
android:key="phone_language"

View File

@@ -1,95 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2016 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/com.android.settings"
android:title="@string/language_settings"
android:key="language_and_input_settings_screen"
settings:initialExpandedChildrenCount="3" >
<Preference
android:key="phone_language"
android:title="@string/phone_language"
android:icon="@drawable/ic_translate_24dp"
android:fragment="com.android.settings.localepicker.LocaleListEditor"/>
<PreferenceCategory
android:key="keyboards_category"
android:title="@string/keyboard_and_input_methods_category">
<Preference
android:key="virtual_keyboard_pref"
android:title="@string/virtual_keyboard_category"
android:fragment="com.android.settings.inputmethod.VirtualKeyboardFragment"/>
<Preference
android:key="physical_keyboard_pref"
android:title="@string/physical_keyboard_title"
android:summary="@string/summary_placeholder"
android:fragment="com.android.settings.inputmethod.PhysicalKeyboardFragment"/>
</PreferenceCategory>
<PreferenceCategory
android:key="input_assistance_category"
android:title="@string/input_assistance">
<!-- Spell checker preference title, summary and fragment will be set programmatically. -->
<!-- Note: Mark this as persistent="false" to remove unnecessarily saved shared preference.
See: InputMethodAndSubtypeUtil.removeUnnecessaryNonPersistentPreference. -->
<Preference
android:key="spellcheckers_settings"
android:title="@string/spellcheckers_settings_title"
android:persistent="false"
android:fragment="com.android.settings.inputmethod.SpellCheckersSettings"/>
<com.android.settings.widget.GearPreference
android:key="default_autofill"
android:title="@string/autofill_app"
android:fragment="com.android.settings.applications.defaultapps.DefaultAutofillPicker"
settings:keywords="@string/autofill_keywords" />
<!-- User dictionary preference title and fragment will be set programmatically. -->
<Preference
android:key="key_user_dictionary_settings"
android:title="@string/user_dict_settings_title"/>
</PreferenceCategory>
<PreferenceCategory
android:key="pointer_and_tts_category">
<com.android.settings.PointerSpeedPreference
android:key="pointer_speed"
android:title="@string/pointer_speed"
android:dialogTitle="@string/pointer_speed"/>
<Preference
android:key="tts_settings_summary"
android:title="@string/tts_settings_title"
android:fragment="com.android.settings.tts.TextToSpeechSettings"/>
</PreferenceCategory>
<PreferenceCategory
android:key="game_controller_settings_category"
android:title="@string/game_controller_settings_category">
<SwitchPreference
android:key="vibrate_input_devices"
android:title="@string/vibrate_input_devices"
android:summary="@string/vibrate_input_devices_summary" />
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -14,7 +14,11 @@
limitations under the License.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/security_settings_title">
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
android:key="security_dashboard_page"
android:title="@string/security_settings_title"
settings:initialExpandedChildrenCount="9">
</PreferenceScreen>

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2017 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/com.android.settings"
android:key="security_dashboard_page"
android:title="@string/security_settings_title"
settings:initialExpandedChildrenCount="9">
</PreferenceScreen>

View File

@@ -19,59 +19,62 @@
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
android:title="@string/sound_settings"
android:key="sound_settings"
settings:keywords="@string/keywords_sounds">
settings:keywords="@string/keywords_sounds"
settings:initialExpandedChildrenCount="6">
<PreferenceCategory
android:key="sound_settings_primary_items_category"
android:order="-100">
<!-- Media volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="media_volume"
android:icon="@*android:drawable/ic_audio_media"
android:title="@string/media_volume_option_title" />
<!-- Media volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="media_volume"
android:icon="@*android:drawable/ic_audio_media"
android:title="@string/media_volume_option_title"
android:order="-106"/>
<!-- Alarm volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="alarm_volume"
android:icon="@*android:drawable/ic_audio_alarm"
android:title="@string/alarm_volume_option_title" />
<!-- Alarm volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="alarm_volume"
android:icon="@*android:drawable/ic_audio_alarm"
android:title="@string/alarm_volume_option_title"
android:order="-105"/>
<!-- Ring volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="ring_volume"
android:icon="@*android:drawable/ic_audio_ring_notif"
android:title="@string/ring_volume_option_title" />
<!-- Ring volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="ring_volume"
android:icon="@*android:drawable/ic_audio_ring_notif"
android:title="@string/ring_volume_option_title"
android:order="-104"/>
<!-- Notification volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="notification_volume"
android:icon="@*android:drawable/ic_audio_ring_notif"
android:title="@string/notification_volume_option_title" />
<!-- Notification volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="notification_volume"
android:icon="@*android:drawable/ic_audio_ring_notif"
android:title="@string/notification_volume_option_title"
android:order="-103"/>
<!-- Also vibrate for calls -->
<SwitchPreference
android:key="vibrate_when_ringing"
android:title="@string/vibrate_when_ringing_title" />
<!-- Also vibrate for calls -->
<SwitchPreference
android:key="vibrate_when_ringing"
android:title="@string/vibrate_when_ringing_title"
android:order="-102"/>
<!-- Interruptions -->
<com.android.settingslib.RestrictedPreference
android:key="zen_mode"
android:title="@string/zen_mode_settings_title"
settings:useAdminDisabledSummary="true"
settings:keywords="@string/keywords_sounds_and_notifications_interruptions"
android:fragment="com.android.settings.notification.ZenModeSettings"
settings:allowDividerAbove="true" />
<!-- Interruptions -->
<com.android.settingslib.RestrictedPreference
android:key="zen_mode"
android:title="@string/zen_mode_settings_title"
settings:useAdminDisabledSummary="true"
settings:keywords="@string/keywords_sounds_and_notifications_interruptions"
android:fragment="com.android.settings.notification.ZenModeSettings"
settings:allowDividerAbove="true"
android:order="-101"/>
<!-- Phone ringtone -->
<com.android.settings.DefaultRingtonePreference
android:key="ringtone"
android:title="@string/ringtone_title"
android:dialogTitle="@string/ringtone_title"
android:summary="@string/summary_placeholder"
android:ringtoneType="ringtone"
settings:allowDividerAbove="true" />
</PreferenceCategory>
<!-- Phone ringtone -->
<com.android.settings.DefaultRingtonePreference
android:key="ringtone"
android:title="@string/ringtone_title"
android:dialogTitle="@string/ringtone_title"
android:summary="@string/summary_placeholder"
android:ringtoneType="ringtone"
settings:allowDividerAbove="true"
android:order="-100"/>
<!-- Default notification ringtone -->
<com.android.settings.DefaultRingtonePreference

View File

@@ -1,195 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2017 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/com.android.settings"
android:title="@string/sound_settings"
android:key="sound_settings"
settings:keywords="@string/keywords_sounds"
settings:initialExpandedChildrenCount="6">
<PreferenceCategory
android:order="-100">
<!-- Media volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="media_volume"
android:icon="@*android:drawable/ic_audio_media"
android:title="@string/media_volume_option_title" />
<!-- Alarm volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="alarm_volume"
android:icon="@*android:drawable/ic_audio_alarm"
android:title="@string/alarm_volume_option_title" />
<!-- Ring volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="ring_volume"
android:icon="@*android:drawable/ic_audio_ring_notif"
android:title="@string/ring_volume_option_title" />
<!-- Notification volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="notification_volume"
android:icon="@*android:drawable/ic_audio_ring_notif"
android:title="@string/notification_volume_option_title" />
<!-- Also vibrate for calls -->
<SwitchPreference
android:key="vibrate_when_ringing"
android:title="@string/vibrate_when_ringing_title" />
<!-- Interruptions -->
<com.android.settingslib.RestrictedPreference
android:key="zen_mode"
android:title="@string/zen_mode_settings_title"
settings:useAdminDisabledSummary="true"
settings:keywords="@string/keywords_sounds_and_notifications_interruptions"
android:fragment="com.android.settings.notification.ZenModeSettings"
settings:allowDividerAbove="true" />
<!-- Phone ringtone -->
<com.android.settings.DefaultRingtonePreference
android:key="ringtone"
android:title="@string/ringtone_title"
android:dialogTitle="@string/ringtone_title"
android:summary="@string/summary_placeholder"
android:ringtoneType="ringtone"
settings:allowDividerAbove="true" />
<!-- Default notification ringtone -->
<com.android.settings.DefaultRingtonePreference
android:key="notification_ringtone"
android:title="@string/notification_ringtone_title"
android:dialogTitle="@string/notification_ringtone_title"
android:summary="@string/summary_placeholder"
android:ringtoneType="notification" />
<!-- Default alarm ringtone -->
<com.android.settings.DefaultRingtonePreference
android:key="alarm_ringtone"
android:title="@string/alarm_ringtone_title"
android:dialogTitle="@string/alarm_ringtone_title"
android:summary="@string/summary_placeholder"
android:persistent="false"
android:ringtoneType="alarm" />
</PreferenceCategory>
<!-- Other sounds -->
<PreferenceCategory
android:title="@string/other_sound_category_preference_title"
android:order="-50">
<!-- Dial pad tones -->
<SwitchPreference
android:key="dial_pad_tones"
android:title="@string/dial_pad_tones_title" />
<!-- Screen locking sounds -->
<SwitchPreference
android:key="screen_locking_sounds"
android:title="@string/screen_locking_sounds_title" />
<!-- Charging sounds -->
<SwitchPreference
android:key="charging_sounds"
android:title="@string/charging_sounds_title" />
<!-- Docking sounds -->
<SwitchPreference
android:key="docking_sounds"
android:title="@string/docking_sounds_title" />
<!-- Touch sounds -->
<SwitchPreference
android:key="touch_sounds"
android:title="@string/touch_sounds_title" />
<!-- Vibrate on touch -->
<SwitchPreference
android:key="vibrate_on_touch"
android:title="@string/vibrate_on_touch_title" />
<!-- Dock speaker plays -->
<DropDownPreference
android:key="dock_audio_media"
android:title="@string/dock_audio_media_title"
android:summary="%s" />
<!-- Boot sounds -->
<SwitchPreference
android:key="boot_sounds"
android:title="@string/boot_sounds_title" />
<!-- Emergency tone -->
<DropDownPreference
android:key="emergency_tone"
android:title="@string/emergency_tone_title"
android:summary="%s" />
</PreferenceCategory>
<com.android.settingslib.RestrictedPreference
android:key="cell_broadcast_settings"
android:title="@string/cell_broadcast_settings"
settings:useAdminDisabledSummary="true"
settings:allowDividerAbove="true"
android:order="-1">
<intent
android:action="android.intent.action.MAIN"
android:targetPackage="com.android.cellbroadcastreceiver"
android:targetClass="com.android.cellbroadcastreceiver.CellBroadcastSettings" />
</com.android.settingslib.RestrictedPreference>
<com.android.settings.widget.WorkOnlyCategory
android:key="sound_work_settings_section"
android:title="@string/sound_work_settings"
android:order="100">
<!-- Use the same sounds of the work profile -->
<SwitchPreference
android:key="work_use_personal_sounds"
android:title="@string/work_use_personal_sounds_title"
android:summary="@string/work_use_personal_sounds_summary"
android:disableDependentsState="true" />
<!-- Work phone ringtone -->
<com.android.settings.DefaultRingtonePreference
android:key="work_ringtone"
android:title="@string/work_ringtone_title"
android:dialogTitle="@string/work_alarm_ringtone_title"
android:ringtoneType="ringtone"
android:dependency="work_use_personal_sounds" />
<!-- Default work notification ringtone -->
<com.android.settings.DefaultRingtonePreference
android:key="work_notification_ringtone"
android:title="@string/work_notification_ringtone_title"
android:dialogTitle="@string/work_alarm_ringtone_title"
android:ringtoneType="notification"
android:dependency="work_use_personal_sounds" />
<!-- Default work alarm ringtone -->
<com.android.settings.DefaultRingtonePreference
android:key="work_alarm_ringtone"
android:title="@string/work_alarm_ringtone_title"
android:dialogTitle="@string/work_alarm_ringtone_title"
android:persistent="false"
android:ringtoneType="alarm"
android:dependency="work_use_personal_sounds" />
</com.android.settings.widget.WorkOnlyCategory>
</PreferenceScreen>

View File

@@ -16,8 +16,10 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="system_dashboard_screen"
android:title="@string/header_category_system">
android:title="@string/header_category_system"
settings:initialExpandedChildrenCount="4">
<Preference
android:key="gesture_settings"

View File

@@ -65,16 +65,9 @@ public class DisplaySettings extends DashboardFragment {
return TAG;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
mProgressiveDisclosureMixin.setTileLimit(4);
}
@Override
protected int getPreferenceScreenResId() {
return mProgressiveDisclosureMixin.isEnabled()
? R.xml.display_settings : R.xml.display_settings_new_advance_button;
return R.xml.display_settings;
}
@Override

View File

@@ -58,7 +58,6 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.settings.TrustAgentUtils.TrustAgentComponentInfo;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.ProgressiveDisclosureMixin;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.enterprise.EnterprisePrivacyPreferenceController;
import com.android.settings.enterprise.ManageDeviceAdminPreferenceController;
@@ -275,11 +274,7 @@ public class SecuritySettings extends SettingsPreferenceFragment
if (root != null) {
root.removeAll();
}
if (ProgressiveDisclosureMixin.isV2Enabled()) {
addPreferencesFromResource(R.xml.security_settings_advanced_button);
} else {
addPreferencesFromResource(R.xml.security_settings);
}
addPreferencesFromResource(R.xml.security_settings);
root = getPreferenceScreen();
// Add category for security status

View File

@@ -47,12 +47,6 @@ public class AppAndNotificationDashboardFragment extends DashboardFragment {
return TAG;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
mProgressiveDisclosureMixin.setTileLimit(4);
}
@Override
protected int getHelpResource() {
return R.string.help_url_apps_and_notifications;
@@ -60,8 +54,7 @@ public class AppAndNotificationDashboardFragment extends DashboardFragment {
@Override
protected int getPreferenceScreenResId() {
return mProgressiveDisclosureMixin.isEnabled()
? R.xml.app_and_notification : R.xml.app_and_notification_new_advance_button;
return R.xml.app_and_notification;
}
@Override

View File

@@ -17,7 +17,6 @@ package com.android.settings.dashboard;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.preference.Preference;
import com.android.settingslib.drawer.DashboardCategory;
@@ -79,12 +78,6 @@ public interface DashboardFeatureProvider {
void bindPreferenceToTile(Activity activity, int sourceMetricsCategory, Preference pref,
Tile tile, String key, int baseOrder);
/**
* Returns a {@link ProgressiveDisclosureMixin} for specified fragment.
*/
ProgressiveDisclosureMixin getProgressiveDisclosureMixin(Context context,
DashboardFragment fragment, Bundle args);
/**
* Returns additional intent filter action for dashboard tiles
*/

View File

@@ -188,16 +188,6 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
}
}
@Override
public ProgressiveDisclosureMixin getProgressiveDisclosureMixin(Context context,
DashboardFragment fragment, Bundle args) {
boolean keepExpanded = false;
if (args != null) {
keepExpanded = args.getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY) != null;
}
return new ProgressiveDisclosureMixin(context, fragment, keepExpanded);
}
@Override
public String getExtraIntentAction() {
return null;

View File

@@ -58,7 +58,6 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
new ArrayMap<>();
private final Set<String> mDashboardTilePrefKeys = new ArraySet<>();
protected ProgressiveDisclosureMixin mProgressiveDisclosureMixin;
protected DashboardFeatureProvider mDashboardFeatureProvider;
private DashboardTilePlaceholderPreferenceController mPlaceholderPreferenceController;
private boolean mListeningToCategoryChange;
@@ -69,9 +68,6 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
super.onAttach(context);
mDashboardFeatureProvider =
FeatureFactory.getFactory(context).getDashboardFeatureProvider(context);
mProgressiveDisclosureMixin = mDashboardFeatureProvider
.getProgressiveDisclosureMixin(context, this, getArguments());
getLifecycle().addObserver(mProgressiveDisclosureMixin);
List<AbstractPreferenceController> controllers = getPreferenceControllers(context);
if (controllers == null) {
@@ -140,8 +136,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
@Override
public void notifySummaryChanged(Tile tile) {
final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile);
final Preference pref = mProgressiveDisclosureMixin.findPreference(
getPreferenceScreen(), key);
final Preference pref = getPreferenceScreen().findPreference(key);
if (pref == null) {
Log.d(getLogTag(),
String.format("Can't find pref by key %s, skipping update summary %s/%s",
@@ -267,7 +262,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
}
final String key = controller.getPreferenceKey();
final Preference preference = mProgressiveDisclosureMixin.findPreference(screen, key);
final Preference preference = screen.findPreference(key);
if (preference == null) {
Log.d(TAG, String.format("Cannot find preference with key %s in Controller %s",
key, controller.getClass().getSimpleName()));
@@ -290,7 +285,6 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
// Add resource based tiles.
displayResourceTiles();
mProgressiveDisclosureMixin.collapse(getPreferenceScreen());
refreshDashboardTiles(TAG);
}
@@ -342,8 +336,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
}
if (mDashboardTilePrefKeys.contains(key)) {
// Have the key already, will rebind.
final Preference preference = mProgressiveDisclosureMixin.findPreference(
screen, key);
final Preference preference = screen.findPreference(key);
mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), getMetricsCategory(),
preference, tile, key, mPlaceholderPreferenceController.getOrder());
} else {
@@ -351,7 +344,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
final Preference pref = new Preference(getPrefContext());
mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), getMetricsCategory(),
pref, tile, key, mPlaceholderPreferenceController.getOrder());
mProgressiveDisclosureMixin.addPreference(screen, pref);
screen.addPreference(pref);
mDashboardTilePrefKeys.add(key);
}
remove.remove(key);
@@ -359,7 +352,10 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
// Finally remove tiles that are gone.
for (String key : remove) {
mDashboardTilePrefKeys.remove(key);
mProgressiveDisclosureMixin.removePreference(screen, key);
final Preference preference = screen.findPreference(key);
if (preference != null) {
screen.removePreference(preference);
}
}
mSummaryLoader.setListening(true);
}

View File

@@ -1,61 +0,0 @@
/*
* Copyright (C) 2016 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.dashboard;
import android.content.Context;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;
import android.util.AttributeSet;
import com.android.settings.R;
public class ExpandPreference extends Preference {
public ExpandPreference(Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
public ExpandPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public ExpandPreference(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ExpandPreference(Context context) {
super(context);
init();
}
private void init() {
setLayoutResource(R.layout.expand_preference);
setIcon(R.drawable.ic_arrow_down_24dp);
setTitle(R.string.advanced_section_header);
setOrder(999);
}
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
holder.setDividerAllowedAbove(false);
}
}

View File

@@ -1,282 +0,0 @@
/*
* Copyright (C) 2016 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.dashboard;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.VisibleForTesting;
import android.support.v14.preference.PreferenceFragment;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
import android.util.FeatureFlagUtils;
import android.util.Log;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.core.instrumentation.Instrumentable;
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnCreate;
import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ProgressiveDisclosureMixin implements Preference.OnPreferenceClickListener,
LifecycleObserver, OnCreate, OnSaveInstanceState {
@VisibleForTesting
static final String FEATURE_FLAG_NEW_ADVANCE_BUTTON = "new_settings_advance_button";
private static final String TAG = "ProgressiveDisclosure";
private static final String STATE_USER_EXPANDED = "state_user_expanded";
private static final int DEFAULT_TILE_LIMIT = 300;
private final Context mContext;
// Collapsed preference sorted by order.
private final List<Preference> mCollapsedPrefs = new ArrayList<>();
private final MetricsFeatureProvider mMetricsFeatureProvider;
private final PreferenceFragment mFragment;
private /* final */ ExpandPreference mExpandButton;
private int mTileLimit = DEFAULT_TILE_LIMIT;
private boolean mUserExpanded;
public ProgressiveDisclosureMixin(Context context,
PreferenceFragment fragment, boolean keepExpanded) {
mContext = context;
mFragment = fragment;
mExpandButton = new ExpandPreference(context);
mExpandButton.setOnPreferenceClickListener(this);
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
mUserExpanded = keepExpanded;
}
@Override
public void onCreate(Bundle savedInstanceState) {
if (savedInstanceState != null) {
mUserExpanded = savedInstanceState.getBoolean(STATE_USER_EXPANDED, false);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putBoolean(STATE_USER_EXPANDED, mUserExpanded);
}
@Override
public boolean onPreferenceClick(Preference preference) {
if (preference instanceof ExpandPreference) {
final PreferenceScreen screen = mFragment.getPreferenceScreen();
if (screen != null) {
screen.removePreference(preference);
for (Preference pref : mCollapsedPrefs) {
screen.addPreference(pref);
}
mCollapsedPrefs.clear();
mUserExpanded = true;
final int metricsCategory;
if (mFragment instanceof Instrumentable) {
metricsCategory = ((Instrumentable) mFragment).getMetricsCategory();
} else {
metricsCategory = MetricsProto.MetricsEvent.VIEW_UNKNOWN;
}
mMetricsFeatureProvider.actionWithSource(mContext, metricsCategory,
MetricsProto.MetricsEvent.ACTION_SETTINGS_ADVANCED_BUTTON_EXPAND);
}
}
return false;
}
public boolean isEnabled() {
return !isV2Enabled();
}
public static boolean isV2Enabled() {
return FeatureFlagUtils.isEnabled(FEATURE_FLAG_NEW_ADVANCE_BUTTON);
}
/**
* Sets the threshold to start collapsing preferences when there are too many.
*/
public void setTileLimit(int limit) {
if (isEnabled()) {
mTileLimit = limit;
}
}
/**
* Whether the controller is in collapsed state.
*/
public boolean isCollapsed() {
return !mCollapsedPrefs.isEmpty();
}
/**
* Whether the screen should be collapsed.
*/
public boolean shouldCollapse(PreferenceScreen screen) {
return !mUserExpanded && screen.getPreferenceCount() > mTileLimit;
}
/**
* Collapse extra preferences and show a "More" button
*/
public void collapse(PreferenceScreen screen) {
final int itemCount = screen.getPreferenceCount();
if (!shouldCollapse(screen)) {
return;
}
if (!mCollapsedPrefs.isEmpty()) {
Log.w(TAG, "collapsed list should ALWAYS BE EMPTY before collapsing!");
}
for (int i = itemCount - 1; i >= mTileLimit; i--) {
final Preference preference = screen.getPreference(i);
addToCollapsedList(preference);
screen.removePreference(preference);
}
screen.addPreference(mExpandButton);
}
/**
* Adds preference to screen. If there are too many preference on screen, adds it to
* collapsed list instead.
*/
public void addPreference(PreferenceScreen screen, Preference pref) {
// Either add to screen, or to collapsed list.
if (isCollapsed()) {
// insert the preference to right position.
final int lastPreferenceIndex = screen.getPreferenceCount() - 2;
if (lastPreferenceIndex >= 0) {
final Preference lastPreference = screen.getPreference(lastPreferenceIndex);
if (lastPreference.getOrder() > pref.getOrder()) {
// insert to screen and move the last pref to collapsed list.
screen.removePreference(lastPreference);
screen.addPreference(pref);
addToCollapsedList(lastPreference);
} else {
// Insert to collapsed list.
addToCollapsedList(pref);
}
} else {
// Couldn't find last preference on screen, just add to collapsed list.
addToCollapsedList(pref);
}
} else if (shouldCollapse(screen)) {
// About to have too many tiles on scree, collapse and add pref to collapsed list.
screen.addPreference(pref);
collapse(screen);
} else {
// No need to collapse, add to screen directly.
screen.addPreference(pref);
}
}
/**
* Removes preference. If the preference is on screen, remove it from screen. If the
* preference is in collapsed list, remove it from list.
*/
public void removePreference(PreferenceScreen screen, String key) {
// Try removing from screen.
final Preference preference = screen.findPreference(key);
if (preference != null) {
screen.removePreference(preference);
return;
}
// Didn't find on screen, try removing from collapsed list.
for (int i = 0; i < mCollapsedPrefs.size(); i++) {
final Preference pref = mCollapsedPrefs.get(i);
if (TextUtils.equals(key, pref.getKey())) {
mCollapsedPrefs.remove(pref);
if (mCollapsedPrefs.isEmpty()) {
// Removed last element, remove expand button too.
screen.removePreference(mExpandButton);
} else {
updateExpandButtonSummary();
}
return;
}
}
}
/**
* Finds preference by key, either from screen or from collapsed list.
*/
public Preference findPreference(PreferenceScreen screen, CharSequence key) {
Preference preference = screen.findPreference(key);
if (preference != null) {
return preference;
}
for (int i = 0; i < mCollapsedPrefs.size(); i++) {
final Preference pref = mCollapsedPrefs.get(i);
if (TextUtils.equals(key, pref.getKey())) {
return pref;
}
if (pref instanceof PreferenceGroup) {
final Preference returnedPreference = ((PreferenceGroup) pref).findPreference(key);
if (returnedPreference != null) {
return returnedPreference;
}
}
}
Log.d(TAG, "Cannot find preference with key " + key);
return null;
}
/**
* Add preference to collapsed list.
*/
@VisibleForTesting
void addToCollapsedList(Preference preference) {
// Insert preference based on it's order.
int insertionIndex = Collections.binarySearch(mCollapsedPrefs, preference);
if (insertionIndex < 0) {
insertionIndex = insertionIndex * -1 - 1;
}
mCollapsedPrefs.add(insertionIndex, preference);
updateExpandButtonSummary();
}
@VisibleForTesting
List<Preference> getCollapsedPrefs() {
return mCollapsedPrefs;
}
@VisibleForTesting
void updateExpandButtonSummary() {
final int size = mCollapsedPrefs.size();
if (size == 0) {
mExpandButton.setSummary(null);
} else if (size == 1) {
mExpandButton.setSummary(mCollapsedPrefs.get(0).getTitle());
} else {
CharSequence summary = mCollapsedPrefs.get(0).getTitle();
for (int i = 1; i < size; i++) {
final CharSequence nextSummary = mCollapsedPrefs.get(i).getTitle();
if (!TextUtils.isEmpty(nextSummary)) {
summary = mContext.getString(R.string.join_many_items_middle, summary,
nextSummary);
}
}
mExpandButton.setSummary(summary);
}
}
}

View File

@@ -64,13 +64,6 @@ public class LanguageAndInputSettings extends DashboardFragment {
return TAG;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
mProgressiveDisclosureMixin.setTileLimit(2);
}
@Override
public void onResume() {
super.onResume();
@@ -86,8 +79,7 @@ public class LanguageAndInputSettings extends DashboardFragment {
@Override
protected int getPreferenceScreenResId() {
return mProgressiveDisclosureMixin.isEnabled()
? R.xml.language_and_input : R.xml.language_and_input_new_advance_button;
return R.xml.language_and_input;
}
@Override

View File

@@ -54,12 +54,6 @@ public class SoundSettings extends DashboardFragment {
private RingtonePreference mRequestPreference;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mProgressiveDisclosureMixin.setTileLimit(1);
}
@Override
public int getMetricsCategory() {
return MetricsEvent.SOUND;
@@ -109,8 +103,7 @@ public class SoundSettings extends DashboardFragment {
@Override
protected int getPreferenceScreenResId() {
return mProgressiveDisclosureMixin.isEnabled()
? R.xml.sound_settings : R.xml.sound_settings_new_advance_button;
return R.xml.sound_settings;
}
@Override

View File

@@ -23,6 +23,7 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkScoreManager;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.provider.SearchIndexableResource;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -60,8 +61,8 @@ public class ConfigureWifiSettings extends DashboardFragment {
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
int tileLimit = 1;
if (mWifiWakeupPreferenceController.isAvailable()) {
tileLimit++;
@@ -69,7 +70,7 @@ public class ConfigureWifiSettings extends DashboardFragment {
if (mUseOpenWifiPreferenceController.isAvailable()) {
tileLimit++;
}
mProgressiveDisclosureMixin.setTileLimit(tileLimit);
getPreferenceScreen().setInitialExpandedChildrenCount(tileLimit);
}
@Override

View File

@@ -6,7 +6,6 @@ import static org.mockito.Mockito.mock;
import android.content.Context;
import com.android.settings.dashboard.ProgressiveDisclosureMixin;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.XmlTestUtils;
import com.android.settings.testutils.shadow.ShadowPowerManagerWrapper;
@@ -30,8 +29,6 @@ public class DisplaySettingsTest {
public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() {
final Context context = RuntimeEnvironment.application;
final DisplaySettings fragment = new DisplaySettings();
ReflectionHelpers.setField(fragment, "mProgressiveDisclosureMixin",
mock(ProgressiveDisclosureMixin.class));
final List<String> preferenceScreenKeys = XmlTestUtils.getKeysFromPreferenceXml(context,
fragment.getPreferenceScreenResId());
final List<String> preferenceKeys = new ArrayList<>();

View File

@@ -20,7 +20,6 @@ import android.content.Context;
import android.os.UserManager;
import com.android.settings.dashboard.ProgressiveDisclosureMixin;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.testutils.XmlTestUtils;
@@ -51,8 +50,6 @@ public class AppAndNotificationDashboardFragmentTest {
final List<String> niks = AppAndNotificationDashboardFragment.SEARCH_INDEX_DATA_PROVIDER
.getNonIndexableKeys(context);
AppAndNotificationDashboardFragment fragment = new AppAndNotificationDashboardFragment();
ReflectionHelpers.setField(fragment, "mProgressiveDisclosureMixin",
mock(ProgressiveDisclosureMixin.class));
final int xmlId = fragment.getPreferenceScreenResId();
final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);

View File

@@ -67,8 +67,6 @@ public class DashboardFragmentTest {
private DashboardCategory mDashboardCategory;
@Mock
private FakeFeatureFactory mFakeFeatureFactory;
@Mock
private ProgressiveDisclosureMixin mDisclosureMixin;
private TestFragment mTestFragment;
@Before
@@ -79,9 +77,6 @@ public class DashboardFragmentTest {
mDashboardCategory.tiles = new ArrayList<>();
mDashboardCategory.tiles.add(new Tile());
mTestFragment = new TestFragment(ShadowApplication.getInstance().getApplicationContext());
when(mFakeFeatureFactory.dashboardFeatureProvider.getProgressiveDisclosureMixin(
nullable(Context.class), eq(mTestFragment), nullable(Bundle.class)))
.thenReturn(mDisclosureMixin);
when(mFakeFeatureFactory.dashboardFeatureProvider
.getTilesForCategory(nullable(String.class)))
.thenReturn(mDashboardCategory);
@@ -110,8 +105,7 @@ public class DashboardFragmentTest {
.thenReturn("test_key");
mTestFragment.onCreatePreferences(new Bundle(), "rootKey");
verify(mDisclosureMixin).addPreference(nullable(PreferenceScreen.class),
nullable(Preference.class));
verify(mTestFragment.mScreen).addPreference(nullable(Preference.class));
}
@Test

View File

@@ -1,381 +0,0 @@
/*
* Copyright (C) 2016 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.dashboard;
import android.content.Context;
import android.support.v14.preference.PreferenceFragment;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceManager;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import org.robolectric.util.ReflectionHelpers;
import java.util.List;
import static android.util.FeatureFlagUtils.FFLAG_PREFIX;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
shadows = {SettingsShadowSystemProperties.class})
public class ProgressiveDisclosureTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private PreferenceFragment mPreferenceFragment;
@Mock
private ExpandPreference mExpandButton;
private PreferenceScreen mScreen;
private Context mAppContext;
private Preference mPreference;
private ProgressiveDisclosureMixin mMixin;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
FakeFeatureFactory.setupForTest(mContext);
mScreen = mPreferenceFragment.getPreferenceScreen();
mAppContext = ShadowApplication.getInstance().getApplicationContext();
mMixin = new ProgressiveDisclosureMixin(mAppContext,
mPreferenceFragment, false /* keepExpanded */);
ReflectionHelpers.setField(mMixin, "mExpandButton", mExpandButton);
mPreference = new Preference(mAppContext);
mPreference.setKey("test");
}
@After
public void tearDown() {
SettingsShadowSystemProperties.clear();
}
@Test
public void systemPropertySetForNewAdvancedButtonFeature_verifyIsDisabled() {
SettingsShadowSystemProperties.set(
FFLAG_PREFIX + ProgressiveDisclosureMixin.FEATURE_FLAG_NEW_ADVANCE_BUTTON, "true");
assertThat(mMixin.isEnabled()).isFalse();
}
@Test
public void systemPropertyNotSet_verifyIsDisabled() {
SettingsShadowSystemProperties.set(
FFLAG_PREFIX + ProgressiveDisclosureMixin.FEATURE_FLAG_NEW_ADVANCE_BUTTON, "false");
assertThat(mMixin.isEnabled()).isTrue();
}
@Test
public void shouldNotCollapse_lessPreferenceThanLimit() {
when(mScreen.getPreferenceCount()).thenReturn(5);
mMixin.setTileLimit(10);
assertThat(mMixin.shouldCollapse(mScreen)).isFalse();
}
@Test
public void shouldNotCollapse_preferenceCountSameAsThreshold() {
when(mScreen.getPreferenceCount()).thenReturn(5);
mMixin.setTileLimit(5);
assertThat(mMixin.shouldCollapse(mScreen)).isFalse();
}
@Test
public void shouldNotCollapse_whenStartAsExpanded() {
when(mScreen.getPreferenceCount()).thenReturn(5);
mMixin = new ProgressiveDisclosureMixin(mAppContext,
mPreferenceFragment, true /* keepExpanded */);
mMixin.setTileLimit(10);
assertThat(mMixin.shouldCollapse(mScreen)).isFalse();
}
@Test
public void shouldCollapse_morePreferenceThanLimit() {
when(mScreen.getPreferenceCount()).thenReturn(5);
mMixin.setTileLimit(3);
assertThat(mMixin.shouldCollapse(mScreen)).isTrue();
}
@Test
public void findPreference_prefInCollapsedList_shouldFindIt() {
when(mScreen.findPreference(nullable(String.class))).thenReturn(null);
mMixin.addToCollapsedList(mPreference);
Preference pref = mMixin.findPreference(mScreen, mPreference.getKey());
assertThat(pref).isNotNull();
assertThat(pref).isSameAs(mPreference);
}
@Test
public void findPreference_prefOnScreen_shouldFindIt() {
when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
Preference pref = mMixin.findPreference(mScreen, mPreference.getKey());
assertThat(pref).isNotNull();
assertThat(pref).isSameAs(mPreference);
}
@Test
public void findPreference_prefNotInCollapsedListOrScreen_shouldNotFindIt() {
when(mScreen.findPreference(nullable(String.class))).thenReturn(null);
Preference pref = mMixin.findPreference(mScreen, mPreference.getKey());
assertThat(pref).isNull();
}
@Test
public void findPreference_prefRemovedFromCollapsedList_shouldNotFindIt() {
when(mScreen.findPreference(nullable(String.class))).thenReturn(null);
mMixin.addToCollapsedList(mPreference);
mMixin.removePreference(mPreferenceFragment.getPreferenceScreen(), mPreference.getKey());
Preference pref = mMixin.findPreference(mScreen, mPreference.getKey());
assertThat(pref).isNull();
}
@Test
public void findPreference_nestedPrefInCollapsedList_shouldFindIt() {
when(mScreen.findPreference(nullable(String.class))).thenReturn(null);
final PreferenceScreen prefGroup = spy(new PreferenceScreen(mAppContext, null));
when(prefGroup.getPreferenceManager()).thenReturn(mock(PreferenceManager.class));
final Preference preference = mock(Preference.class);
when(preference.getKey()).thenReturn("TestKey");
prefGroup.addPreference(preference);
mMixin.addToCollapsedList(prefGroup);
Preference pref = mMixin.findPreference(mScreen, "TestKey");
assertThat(pref).isNotNull();
assertThat(pref).isSameAs(preference);
}
@Test
public void removePreference_shouldRemoveOnScreenPreference() {
when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
mMixin.removePreference(mScreen, mPreference.getKey());
verify(mScreen).removePreference(mPreference);
}
@Test
public void removeLastPreference_shouldRemoveExpandButtonToo() {
when(mScreen.findPreference(nullable(String.class))).thenReturn(null);
mMixin.addToCollapsedList(mPreference);
// Collapsed
assertThat(mMixin.isCollapsed()).isTrue();
mMixin.removePreference(mScreen, mPreference.getKey());
// Removing expand button
verify(mScreen).removePreference(any(Preference.class));
// No longer collapsed
assertThat(mMixin.isCollapsed()).isFalse();
}
@Test
public void collapse_shouldDoNothingIfNotCollapsible() {
final PreferenceScreen screen = mPreferenceFragment.getPreferenceScreen();
when(screen.getPreferenceCount()).thenReturn(5);
mMixin.setTileLimit(15);
mMixin.collapse(screen);
assertThat(mMixin.isCollapsed()).isFalse();
verify(mExpandButton, never()).setSummary(nullable(String.class));
verify(screen, never()).addPreference(any(Preference.class));
verify(screen, never()).removePreference(any(Preference.class));
}
@Test
public void collapse_shouldRemovePrefAndAddExpandButton() {
final PreferenceScreen screen = mPreferenceFragment.getPreferenceScreen();
when(screen.getPreferenceCount()).thenReturn(5);
when(screen.getPreference(anyInt())).thenReturn(mPreference);
mMixin.setTileLimit(2);
mMixin.collapse(screen);
assertThat(mMixin.isCollapsed()).isTrue();
verify(mExpandButton, atLeastOnce()).setSummary(nullable(String.class));
verify(screen).addPreference(any(ExpandPreference.class));
verify(screen, times(3)).removePreference(any(Preference.class));
}
@Test
public void addToCollapsedList_shouldAddInOrder() {
final Preference pref1 = new Preference(mAppContext);
final Preference pref2 = new Preference(mAppContext);
pref1.setOrder(10);
pref2.setOrder(20);
// Pref1 has lower order than pref2, but add pref2 first. The collapsed list should maintain
// items in increasing order.
mMixin.addToCollapsedList(pref2);
mMixin.addToCollapsedList(pref1);
List<Preference> collapsedList = mMixin.getCollapsedPrefs();
assertThat(collapsedList.get(0)).isSameAs(pref1);
assertThat(collapsedList.get(1)).isSameAs(pref2);
}
@Test
public void addPreferenceWhenCollapsed_noPrefOnScreen_shouldAddToList() {
// Add something to collapsed list so we are in collapsed state.
mMixin.addToCollapsedList(new Preference(mAppContext));
assertThat(mMixin.getCollapsedPrefs().size()).isEqualTo(1);
// Just 1 preference on screen: the more button
when(mScreen.getPreferenceCount()).thenReturn(1);
final Preference toBeAdded = new Preference(mAppContext);
toBeAdded.setOrder(100);
mMixin.addPreference(mScreen, toBeAdded);
// Should have 2 prefs in collapsed list now
assertThat(mMixin.getCollapsedPrefs().size()).isEqualTo(2);
assertThat(mMixin.getCollapsedPrefs().get(0)).isSameAs(toBeAdded);
}
@Test
public void addPreferenceWhenCollapsed_prefOrderLessThanLastOnScreen_shouldAddToScreen() {
final Preference lastPref = new Preference(mAppContext);
lastPref.setOrder(100);
// Add something to collapsed list so we are in collapsed state.
mMixin.addToCollapsedList(new Preference(mAppContext));
verify(mExpandButton).setSummary(nullable(String.class));
assertThat(mMixin.getCollapsedPrefs().size()).isEqualTo(1);
// 3 prefs on screen, 2 are real and the last one is more button.
when(mScreen.getPreferenceCount()).thenReturn(3);
when(mScreen.getPreference(1)).thenReturn(lastPref);
final Preference toBeAdded = new Preference(mAppContext);
toBeAdded.setOrder(50);
mMixin.addPreference(mScreen, toBeAdded);
verify(mScreen).removePreference(lastPref);
verify(mScreen).addPreference(toBeAdded);
assertThat(mMixin.getCollapsedPrefs().get(0)).isSameAs(lastPref);
}
@Test
public void addPreferenceWhenCollapsed_prefOrderMoreThanLastOnScreen_shouldAddToList() {
final Preference lastPref = new Preference(mAppContext);
lastPref.setOrder(100);
// Add something to collapsed list so we are in collapsed state.
mMixin.addToCollapsedList(new Preference(mAppContext));
verify(mExpandButton).setSummary(nullable(String.class));
assertThat(mMixin.getCollapsedPrefs().size()).isEqualTo(1);
// 3 prefs on screen, 2 are real and the last one is more button.
when(mScreen.getPreferenceCount()).thenReturn(3);
when(mScreen.getPreference(1)).thenReturn(lastPref);
final Preference toBeAdded = new Preference(mAppContext);
toBeAdded.setOrder(200);
mMixin.addPreference(mScreen, toBeAdded);
verify(mScreen, never()).removePreference(any(Preference.class));
verify(mScreen, never()).addPreference(any(Preference.class));
verify(mExpandButton, times(2)).setSummary(nullable(String.class));
assertThat(mMixin.getCollapsedPrefs().get(0)).isSameAs(toBeAdded);
}
@Test
public void updateExpandSummary_noPref_noSummary() {
mMixin.updateExpandButtonSummary();
verify(mExpandButton).setSummary(null);
}
@Test
public void updateExpandSummary_doNotIncludeEmptyPrefTitle() {
final Preference pref1 = new Preference(mAppContext);
pref1.setTitle("1");
final Preference pref2 = new Preference(mAppContext);
pref2.setTitle(null);
final Preference pref3 = new Preference(mAppContext);
pref3.setTitle("3");
final Preference pref4 = new Preference(mAppContext);
pref4.setTitle("");
mMixin.addToCollapsedList(pref1);
mMixin.addToCollapsedList(pref2);
mMixin.addToCollapsedList(pref3);
mMixin.addToCollapsedList(pref4);
verify(mExpandButton).setSummary("1, 3");
}
@Test
public void updateExapndSummary_singlePref_expandSummarySameAsPrefTitle() {
final String TEST = "test";
final Preference pref = new Preference(mAppContext);
pref.setTitle(TEST);
mMixin.addToCollapsedList(pref);
verify(mExpandButton).setSummary(TEST);
}
@Test
public void updateExapndSummary_multiPrefs_useCombinedPrefTitleAsSummary() {
final String TEST1 = "test1";
final String TEST2 = "test2";
final Preference pref1 = new Preference(mAppContext);
pref1.setTitle(TEST1);
final Preference pref2 = new Preference(mAppContext);
pref2.setTitle(TEST2);
mMixin.addToCollapsedList(pref1);
mMixin.addToCollapsedList(pref2);
verify(mExpandButton)
.setSummary(mAppContext.getString(R.string.join_many_items_middle, TEST1, TEST2));
}
}

View File

@@ -43,7 +43,6 @@ import android.view.textservice.TextServicesManager;
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.dashboard.ProgressiveDisclosureMixin;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.XmlTestUtils;
@@ -103,9 +102,6 @@ public class LanguageAndInputSettingsTest {
@Test
public void testGetPreferenceScreenResId() {
ProgressiveDisclosureMixin progessiveMixin = mock(ProgressiveDisclosureMixin.class);
when(progessiveMixin.isEnabled()).thenReturn(true);
ReflectionHelpers.setField(mFragment, "mProgressiveDisclosureMixin", progessiveMixin);
assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(R.xml.language_and_input);
}
@@ -173,8 +169,6 @@ public class LanguageAndInputSettingsTest {
final List<String> niks = LanguageAndInputSettings.SEARCH_INDEX_DATA_PROVIDER
.getNonIndexableKeys(context);
LanguageAndInputSettings settings = new LanguageAndInputSettings();
ReflectionHelpers.setField(settings, "mProgressiveDisclosureMixin",
mock(ProgressiveDisclosureMixin.class));
final int xmlId = settings.getPreferenceScreenResId();
final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
@@ -186,8 +180,6 @@ public class LanguageAndInputSettingsTest {
public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() {
final Context context = RuntimeEnvironment.application;
final LanguageAndInputSettings fragment = new LanguageAndInputSettings();
ReflectionHelpers.setField(fragment, "mProgressiveDisclosureMixin",
mock(ProgressiveDisclosureMixin.class));
final List<String> preferenceScreenKeys = XmlTestUtils.getKeysFromPreferenceXml(context,
fragment.getPreferenceScreenResId());
final List<String> preferenceKeys = new ArrayList<>();

View File

@@ -21,7 +21,6 @@ import android.content.Context;
import android.media.AudioManager;
import android.os.UserManager;
import com.android.settings.R;
import com.android.settings.dashboard.ProgressiveDisclosureMixin;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.testutils.XmlTestUtils;
@@ -62,8 +61,6 @@ public class SoundSettingsTest {
final List<String> niks = SoundSettings.SEARCH_INDEX_DATA_PROVIDER
.getNonIndexableKeys(context);
SoundSettings settings = new SoundSettings();
ReflectionHelpers.setField(settings, "mProgressiveDisclosureMixin",
mock(ProgressiveDisclosureMixin.class));
final int xmlId = settings.getPreferenceScreenResId();
final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(context,