release-request-5cce6180-1979-44b8-a969-842cd4c8a044-for-git_pi-release-4342840 snap-temp-L74000000103414049
Change-Id: If8ca043ad02010f90dbef104365a9bc5f9bfba4e
This commit is contained in:
@@ -72,6 +72,7 @@
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
<uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />
|
||||
<uses-permission android:name="android.permission.READ_SEARCH_INDEXABLES" />
|
||||
<uses-permission android:name="android.permission.BIND_SETTINGS_SUGGESTIONS_SERVICE" />
|
||||
<uses-permission android:name="android.permission.OEM_UNLOCK_STATE" />
|
||||
<uses-permission android:name="android.permission.MANAGE_USER_OEM_UNLOCK_STATE" />
|
||||
<uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG" />
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
[Hook Scripts]
|
||||
checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT}
|
||||
-fw src/com/android/settings/print/
|
||||
checkcolor_hook = ${REPO_ROOT}/prebuilts/checkcolor/checkcolor.py -p .
|
||||
|
||||
|
||||
2484
color-check-baseline.xml
Normal file
2484
color-check-baseline.xml
Normal file
File diff suppressed because it is too large
Load Diff
83
res/xml/app_and_notification_new_advance_button.xml
Normal file
83
res/xml/app_and_notification_new_advance_button.xml
Normal file
@@ -0,0 +1,83 @@
|
||||
<?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>
|
||||
128
res/xml/display_settings_new_advance_button.xml
Normal file
128
res/xml/display_settings_new_advance_button.xml
Normal file
@@ -0,0 +1,128 @@
|
||||
<?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>
|
||||
92
res/xml/language_and_input_new_advance_button.xml
Normal file
92
res/xml/language_and_input_new_advance_button.xml
Normal file
@@ -0,0 +1,92 @@
|
||||
<?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: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: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>
|
||||
|
||||
<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>
|
||||
195
res/xml/sound_settings_new_advance_button.xml
Normal file
195
res/xml/sound_settings_new_advance_button.xml
Normal file
@@ -0,0 +1,195 @@
|
||||
<?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.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.WorkOnlyCategory>
|
||||
</PreferenceScreen>
|
||||
@@ -73,7 +73,8 @@ public class DisplaySettings extends DashboardFragment {
|
||||
|
||||
@Override
|
||||
protected int getPreferenceScreenResId() {
|
||||
return R.xml.display_settings;
|
||||
return mProgressiveDisclosureMixin.isEnabled()
|
||||
? R.xml.display_settings : R.xml.display_settings_new_advance_button;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -110,9 +110,8 @@ import com.android.internal.app.UnlaunchableAppActivity;
|
||||
import com.android.internal.util.ArrayUtils;
|
||||
import com.android.internal.util.UserIcons;
|
||||
import com.android.internal.widget.LockPatternUtils;
|
||||
import com.android.settings.enterprise.DevicePolicyManagerWrapper;
|
||||
import com.android.settings.password.FingerprintManagerWrapper;
|
||||
import com.android.settings.password.IFingerprintManager;
|
||||
import com.android.settings.wrapper.FingerprintManagerWrapper;
|
||||
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
@@ -1258,7 +1257,7 @@ public final class Utils extends com.android.settingslib.Utils {
|
||||
}
|
||||
}
|
||||
|
||||
public static IFingerprintManager getFingerprintManagerWrapperOrNull(Context context) {
|
||||
public static FingerprintManagerWrapper getFingerprintManagerWrapperOrNull(Context context) {
|
||||
FingerprintManager fingerprintManager = getFingerprintManagerOrNull(context);
|
||||
if (fingerprintManager != null) {
|
||||
return new FingerprintManagerWrapper(fingerprintManager);
|
||||
|
||||
@@ -43,8 +43,7 @@ import com.android.settings.R;
|
||||
import com.android.settings.applications.LayoutPreference;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||
import com.android.settings.enterprise.DevicePolicyManagerWrapper;
|
||||
import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
|
||||
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
|
||||
import java.io.IOException;
|
||||
@@ -60,7 +59,7 @@ public class RemoveAccountPreferenceController extends AbstractPreferenceControl
|
||||
private DevicePolicyManagerWrapper mDpm;
|
||||
|
||||
public RemoveAccountPreferenceController(Context context, Fragment parent) {
|
||||
this(context, parent, new DevicePolicyManagerWrapperImpl(
|
||||
this(context, parent, new DevicePolicyManagerWrapper(
|
||||
(DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE)));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.android.settings.applications;
|
||||
|
||||
import android.accessibilityservice.AccessibilityServiceInfo;
|
||||
import android.content.ComponentName;
|
||||
|
||||
public class AccessibilityServiceInfoWrapperImpl implements AccessibilityServiceInfoWrapper {
|
||||
|
||||
private final AccessibilityServiceInfo mServiceInfo;
|
||||
|
||||
public AccessibilityServiceInfoWrapperImpl(AccessibilityServiceInfo serviceInfo) {
|
||||
mServiceInfo = serviceInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AccessibilityServiceInfo getAccessibilityServiceInfo() {
|
||||
return mServiceInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ComponentName getComponentName() {
|
||||
return mServiceInfo.getComponentName();
|
||||
}
|
||||
}
|
||||
@@ -60,7 +60,8 @@ public class AppAndNotificationDashboardFragment extends DashboardFragment {
|
||||
|
||||
@Override
|
||||
protected int getPreferenceScreenResId() {
|
||||
return R.xml.app_and_notification;
|
||||
return mProgressiveDisclosureMixin.isEnabled()
|
||||
? R.xml.app_and_notification : R.xml.app_and_notification_new_advance_button;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -22,6 +22,8 @@ import android.os.AsyncTask;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class AppCounter extends AsyncTask<Void, Void, Integer> {
|
||||
|
||||
@@ -43,9 +43,8 @@ import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.SettingsPreferenceFragment;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||
import com.android.settings.enterprise.DevicePolicyManagerWrapper;
|
||||
import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
||||
import com.android.settingslib.RestrictedLockUtils;
|
||||
import com.android.settingslib.applications.ApplicationsState;
|
||||
import com.android.settingslib.applications.ApplicationsState.AppEntry;
|
||||
@@ -94,7 +93,7 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment
|
||||
.getApplicationFeatureProvider(activity);
|
||||
mState = ApplicationsState.getInstance(activity.getApplication());
|
||||
mSession = mState.newSession(this);
|
||||
mDpm = new DevicePolicyManagerWrapperImpl(
|
||||
mDpm = new DevicePolicyManagerWrapper(
|
||||
(DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE));
|
||||
mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
|
||||
mPm = activity.getPackageManager();
|
||||
|
||||
@@ -23,6 +23,8 @@ import android.os.AsyncTask;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ import android.util.SparseArray;
|
||||
|
||||
import com.android.settingslib.applications.ApplicationsState;
|
||||
import com.android.settingslib.applications.ApplicationsState.AppEntry;
|
||||
import com.android.settings.wrapper.IPackageManagerWrapper;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
@@ -57,7 +58,7 @@ public abstract class AppStateAppOpsBridge extends AppStateBaseBridge {
|
||||
public AppStateAppOpsBridge(Context context, ApplicationsState appState, Callback callback,
|
||||
int appOpsOpCode, String[] permissions) {
|
||||
this(context, appState, callback, appOpsOpCode, permissions,
|
||||
new IPackageManagerWrapperImpl(AppGlobals.getPackageManager()));
|
||||
new IPackageManagerWrapper(AppGlobals.getPackageManager()));
|
||||
}
|
||||
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
|
||||
|
||||
@@ -22,7 +22,9 @@ import android.os.Build;
|
||||
import android.os.RemoteException;
|
||||
import android.os.UserHandle;
|
||||
|
||||
import com.android.settings.enterprise.DevicePolicyManagerWrapper;
|
||||
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
||||
import com.android.settings.wrapper.IPackageManagerWrapper;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
/**
|
||||
* Counts installed apps across all users that have been granted one or more specific permissions by
|
||||
|
||||
@@ -18,7 +18,9 @@ package com.android.settings.applications;
|
||||
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.os.UserManager;
|
||||
import com.android.settings.enterprise.DevicePolicyManagerWrapper;
|
||||
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
||||
import com.android.settings.wrapper.IPackageManagerWrapper;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
/**
|
||||
* Lists installed apps across all users that have been granted one or more specific permissions by
|
||||
|
||||
@@ -29,7 +29,9 @@ import android.util.ArraySet;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.settings.applications.instantapps.InstantAppButtonsController;
|
||||
import com.android.settings.enterprise.DevicePolicyManagerWrapper;
|
||||
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
||||
import com.android.settings.wrapper.IPackageManagerWrapper;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.android.settings.applications;
|
||||
|
||||
import android.view.autofill.AutofillManager;
|
||||
|
||||
public class AutofillManagerWrapperImpl implements AutofillManagerWrapper {
|
||||
private final AutofillManager mAfm;
|
||||
|
||||
public AutofillManagerWrapperImpl(AutofillManager afm) {
|
||||
mAfm = afm;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasAutofillFeature() {
|
||||
if (mAfm == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return mAfm.hasAutofillFeature();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAutofillSupported() {
|
||||
if (mAfm == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return mAfm.isAutofillSupported();
|
||||
}
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.android.settings.applications;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.content.pm.IPackageManager;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.ParceledListSlice;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.os.RemoteException;
|
||||
|
||||
public class IPackageManagerWrapperImpl implements IPackageManagerWrapper {
|
||||
|
||||
private final IPackageManager mPms;
|
||||
|
||||
public IPackageManagerWrapperImpl(IPackageManager pms) {
|
||||
mPms = pms;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int checkUidPermission(String permName, int uid) throws RemoteException {
|
||||
return mPms.checkUidPermission(permName, uid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResolveInfo findPersistentPreferredActivity(Intent intent, int userId)
|
||||
throws RemoteException {
|
||||
return mPms.findPersistentPreferredActivity(intent, userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PackageInfo getPackageInfo(String packageName, int flags, int userId)
|
||||
throws RemoteException {
|
||||
return mPms.getPackageInfo(packageName, flags, userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getAppOpPermissionPackages(String permissionName) throws RemoteException {
|
||||
return mPms.getAppOpPermissionPackages(permissionName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPackageAvailable(String packageName, int userId) throws RemoteException {
|
||||
return mPms.isPackageAvailable(packageName, userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(
|
||||
String[] permissions, int flags, int userId) throws RemoteException {
|
||||
return mPms.getPackagesHoldingPermissions(permissions, flags, userId);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -21,6 +21,8 @@ import android.content.pm.ResolveInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.UserHandle;
|
||||
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class InstalledAppCounter extends AppCounter {
|
||||
|
||||
@@ -24,7 +24,6 @@ import android.app.ActivityManager;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.LoaderManager;
|
||||
import android.app.LoaderManager.LoaderCallbacks;
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
@@ -106,6 +105,7 @@ import com.android.settingslib.applications.StorageStatsSource.AppStorageStats;
|
||||
import com.android.settingslib.development.DevelopmentSettingsEnabler;
|
||||
import com.android.settingslib.net.ChartData;
|
||||
import com.android.settingslib.net.ChartDataLoader;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
@@ -1236,7 +1236,7 @@ public class InstalledAppDetails extends AppInfoBase
|
||||
|
||||
if (pref != null) {
|
||||
pref.setSummary(DefaultHomePreferenceController.isHomeDefault(mPackageName,
|
||||
new PackageManagerWrapperImpl(context.getPackageManager()))
|
||||
new PackageManagerWrapper(context.getPackageManager()))
|
||||
? R.string.yes : R.string.no);
|
||||
}
|
||||
pref = findPreference("default_browser");
|
||||
|
||||
@@ -20,6 +20,8 @@ import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.UserManager;
|
||||
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
public abstract class InstalledAppLister extends AppLister {
|
||||
|
||||
public InstalledAppLister(PackageManagerWrapper packageManager, UserManager userManager) {
|
||||
|
||||
@@ -90,6 +90,7 @@ import com.android.settingslib.applications.ApplicationsState.AppFilter;
|
||||
import com.android.settingslib.applications.ApplicationsState.CompoundFilter;
|
||||
import com.android.settingslib.applications.ApplicationsState.VolumeFilter;
|
||||
import com.android.settingslib.applications.StorageStatsSource;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -117,6 +118,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment
|
||||
public static final String EXTRA_VOLUME_NAME = "volumeName";
|
||||
public static final String EXTRA_STORAGE_TYPE = "storageType";
|
||||
public static final String EXTRA_WORK_ONLY = "workProfileOnly";
|
||||
public static final String EXTRA_WORK_ID = "workId";
|
||||
|
||||
private static final String EXTRA_SORT_ORDER = "sortOrder";
|
||||
private static final String EXTRA_SHOW_SYSTEM = "showSystem";
|
||||
@@ -222,6 +224,8 @@ public class ManageApplications extends InstrumentedPreferenceFragment
|
||||
public static final int STORAGE_TYPE_LEGACY = 2; // Show apps even if they can be categorized.
|
||||
public static final int STORAGE_TYPE_PHOTOS_VIDEOS = 3;
|
||||
|
||||
private static final int NO_USER_SPECIFIED = -1;
|
||||
|
||||
// sort order
|
||||
private int mSortOrder = R.id.sort_order_alpha;
|
||||
|
||||
@@ -282,6 +286,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment
|
||||
private String mVolumeUuid;
|
||||
private int mStorageType;
|
||||
private boolean mIsWorkOnly;
|
||||
private int mWorkUserId;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
@@ -338,6 +343,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment
|
||||
}
|
||||
mFilter = getDefaultFilter();
|
||||
mIsWorkOnly = args != null ? args.getBoolean(EXTRA_WORK_ONLY) : false;
|
||||
mWorkUserId = args != null ? args.getInt(EXTRA_WORK_ID) : NO_USER_SPECIFIED;
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder);
|
||||
@@ -378,13 +384,15 @@ public class ManageApplications extends InstrumentedPreferenceFragment
|
||||
mApplications.mHasReceivedBridgeCallback =
|
||||
savedInstanceState.getBoolean(EXTRA_HAS_BRIDGE, false);
|
||||
}
|
||||
int userId = mIsWorkOnly ? mWorkUserId : UserHandle.getUserId(mCurrentUid);
|
||||
if (mStorageType == STORAGE_TYPE_MUSIC) {
|
||||
Context context = getContext();
|
||||
mApplications.setExtraViewController(new MusicViewHolderController(
|
||||
context,
|
||||
new StorageStatsSource(context),
|
||||
mVolumeUuid,
|
||||
UserHandle.of(UserHandle.getUserId(mCurrentUid))));
|
||||
mApplications.setExtraViewController(
|
||||
new MusicViewHolderController(
|
||||
context,
|
||||
new StorageStatsSource(context),
|
||||
mVolumeUuid,
|
||||
UserHandle.of(userId)));
|
||||
} else if (mStorageType == STORAGE_TYPE_PHOTOS_VIDEOS) {
|
||||
Context context = getContext();
|
||||
mApplications.setExtraViewController(
|
||||
@@ -392,7 +400,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment
|
||||
context,
|
||||
new StorageStatsSource(context),
|
||||
mVolumeUuid,
|
||||
UserHandle.of(UserHandle.getUserId(mCurrentUid))));
|
||||
UserHandle.of(userId)));
|
||||
}
|
||||
mListView.setAdapter(mApplications);
|
||||
mListView.setRecyclerListener(mApplications);
|
||||
@@ -888,7 +896,6 @@ public class ManageApplications extends InstrumentedPreferenceFragment
|
||||
private int mLastSortMode = -1;
|
||||
private int mWhichSize = SIZE_TOTAL;
|
||||
CharSequence mCurFilterPrefix;
|
||||
private PackageManager mPm;
|
||||
private AppFilter mCompositeFilter;
|
||||
private boolean mHasReceivedLoadEntries;
|
||||
private boolean mHasReceivedBridgeCallback;
|
||||
@@ -938,7 +945,6 @@ public class ManageApplications extends InstrumentedPreferenceFragment
|
||||
mManageApplications.mListContainer
|
||||
);
|
||||
mContext = manageApplications.getActivity();
|
||||
mPm = mContext.getPackageManager();
|
||||
mFilterMode = filterMode;
|
||||
if (mManageApplications.mListType == LIST_TYPE_NOTIFICATION) {
|
||||
mExtraInfoBridge = new AppStateNotificationBridge(mContext, mState, this,
|
||||
@@ -1491,7 +1497,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment
|
||||
public void setListening(boolean listening) {
|
||||
if (listening) {
|
||||
new InstalledAppCounter(mContext, InstalledAppCounter.IGNORE_INSTALL_REASON,
|
||||
new PackageManagerWrapperImpl(mContext.getPackageManager())) {
|
||||
new PackageManagerWrapper(mContext.getPackageManager())) {
|
||||
@Override
|
||||
protected void onCountComplete(int num) {
|
||||
mLoader.setSummary(SummaryProvider.this,
|
||||
|
||||
@@ -21,6 +21,7 @@ import android.content.pm.ApplicationInfo;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.dashboard.SummaryLoader;
|
||||
import com.android.settings.notification.NotificationBackend;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
/**
|
||||
* Extension of ManageApplications with no changes other than having its own
|
||||
@@ -39,7 +40,7 @@ public class NotificationApps extends ManageApplications {
|
||||
mContext = context;
|
||||
mLoader = loader;
|
||||
mNotificationBackend = new NotificationBackend();
|
||||
mPackageManager = new PackageManagerWrapperImpl(mContext.getPackageManager());
|
||||
mPackageManager = new PackageManagerWrapper(mContext.getPackageManager());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,116 +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.applications;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.IPackageDeleteObserver;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.os.UserHandle;
|
||||
import android.os.storage.VolumeInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This interface replicates a subset of the android.content.pm.PackageManager (PM). The interface
|
||||
* exists so that we can use a thin wrapper around the PM in production code and a mock in tests.
|
||||
* We cannot directly mock or shadow the PM, because some of the methods we rely on are newer than
|
||||
* the API version supported by Robolectric.
|
||||
*/
|
||||
public interface PackageManagerWrapper {
|
||||
|
||||
/**
|
||||
* Returns the real {@code PackageManager} object.
|
||||
*/
|
||||
PackageManager getPackageManager();
|
||||
|
||||
/**
|
||||
* Calls {@code PackageManager.getInstalledApplicationsAsUser()}.
|
||||
*
|
||||
* @see android.content.pm.PackageManager#getInstalledApplicationsAsUser
|
||||
*/
|
||||
List<ApplicationInfo> getInstalledApplicationsAsUser(int flags, int userId);
|
||||
|
||||
/**
|
||||
* Calls {@code PackageManager.hasSystemFeature()}.
|
||||
*
|
||||
* @see android.content.pm.PackageManager#hasSystemFeature
|
||||
*/
|
||||
boolean hasSystemFeature(String name);
|
||||
|
||||
/**
|
||||
* Calls {@code PackageManager.queryIntentActivitiesAsUser()}.
|
||||
*
|
||||
* @see android.content.pm.PackageManager#queryIntentActivitiesAsUser
|
||||
*/
|
||||
List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId);
|
||||
|
||||
/**
|
||||
* Calls {@code PackageManager.getInstallReason()}.
|
||||
*
|
||||
* @see android.content.pm.PackageManager#getInstallReason
|
||||
*/
|
||||
int getInstallReason(String packageName, UserHandle user);
|
||||
|
||||
/**
|
||||
* Calls {@code PackageManager.getApplicationInfoAsUser}
|
||||
*/
|
||||
ApplicationInfo getApplicationInfoAsUser(String packageName, int i, int userId)
|
||||
throws PackageManager.NameNotFoundException;
|
||||
|
||||
/**
|
||||
* Calls {@code PackageManager.setDefaultBrowserPackageNameAsUser}
|
||||
*/
|
||||
boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId);
|
||||
|
||||
/**
|
||||
* Calls {@code PackageManager.getDefaultBrowserPackageNameAsUser}
|
||||
*/
|
||||
String getDefaultBrowserPackageNameAsUser(int userId);
|
||||
|
||||
/**
|
||||
* Calls {@code PackageManager.getHomeActivities}
|
||||
*/
|
||||
ComponentName getHomeActivities(List<ResolveInfo> homeActivities);
|
||||
|
||||
/**
|
||||
* Calls {@code PackageManager.queryIntentServicesAsUser}
|
||||
*/
|
||||
List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int i, int user);
|
||||
|
||||
/**
|
||||
* Calls {@code PackageManager.replacePreferredActivity}
|
||||
*/
|
||||
void replacePreferredActivity(IntentFilter homeFilter, int matchCategoryEmpty,
|
||||
ComponentName[] componentNames, ComponentName component);
|
||||
|
||||
/**
|
||||
* Calls {@code PackageManager.getPrimaryStorageCurrentVolume}
|
||||
*/
|
||||
VolumeInfo getPrimaryStorageCurrentVolume();
|
||||
|
||||
/**
|
||||
* Calls {@code PackageManager.deletePackageAsUser}
|
||||
*/
|
||||
void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int flags,
|
||||
int userId);
|
||||
|
||||
int getPackageUidAsUser(String pkg, int userId) throws PackageManager.NameNotFoundException;
|
||||
}
|
||||
@@ -1,112 +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.applications;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.IPackageDeleteObserver;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.os.UserHandle;
|
||||
import android.os.storage.VolumeInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PackageManagerWrapperImpl implements PackageManagerWrapper {
|
||||
|
||||
private final PackageManager mPm;
|
||||
|
||||
public PackageManagerWrapperImpl(PackageManager pm) {
|
||||
mPm = pm;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PackageManager getPackageManager() {
|
||||
return mPm;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ApplicationInfo> getInstalledApplicationsAsUser(int flags, int userId) {
|
||||
return mPm.getInstalledApplicationsAsUser(flags, userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasSystemFeature(String name) {
|
||||
return mPm.hasSystemFeature(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId) {
|
||||
return mPm.queryIntentActivitiesAsUser(intent, flags, userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInstallReason(String packageName, UserHandle user) {
|
||||
return mPm.getInstallReason(packageName, user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApplicationInfo getApplicationInfoAsUser(String packageName, int i, int userId)
|
||||
throws PackageManager.NameNotFoundException {
|
||||
return mPm.getApplicationInfoAsUser(packageName, i, userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) {
|
||||
return mPm.setDefaultBrowserPackageNameAsUser(packageName, userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDefaultBrowserPackageNameAsUser(int userId) {
|
||||
return mPm.getDefaultBrowserPackageNameAsUser(userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ComponentName getHomeActivities(List<ResolveInfo> homeActivities) {
|
||||
return mPm.getHomeActivities(homeActivities);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int i, int user) {
|
||||
return mPm.queryIntentServicesAsUser(intent, i, user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void replacePreferredActivity(IntentFilter homeFilter, int matchCategoryEmpty,
|
||||
ComponentName[] componentNames, ComponentName component) {
|
||||
mPm.replacePreferredActivity(homeFilter, matchCategoryEmpty, componentNames, component);
|
||||
}
|
||||
|
||||
@Override
|
||||
public VolumeInfo getPrimaryStorageCurrentVolume() {
|
||||
return mPm.getPrimaryStorageCurrentVolume();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int flags,
|
||||
int userId) {
|
||||
mPm.deletePackageAsUser(packageName, observer, flags, userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPackageUidAsUser(String pkg, int userId)
|
||||
throws PackageManager.NameNotFoundException {
|
||||
return mPm.getPackageUidAsUser(pkg, userId);
|
||||
}
|
||||
}
|
||||
@@ -36,6 +36,7 @@ import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.notification.EmptyTextSettings;
|
||||
import com.android.settings.wrapper.ActivityInfoWrapper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
@@ -63,7 +64,7 @@ public class PictureInPictureSettings extends EmptyTextSettings {
|
||||
if (activities != null) {
|
||||
wrappedActivities = new ActivityInfoWrapper[activities.length];
|
||||
for (int i = 0; i < activities.length; i++) {
|
||||
wrappedActivities[i] = new ActivityInfoWrapperImpl(activities[i]);
|
||||
wrappedActivities[i] = new ActivityInfoWrapper(activities[i]);
|
||||
}
|
||||
}
|
||||
return checkPackageHasPictureInPictureActivities(packageName, wrappedActivities);
|
||||
|
||||
@@ -42,6 +42,7 @@ import com.android.settings.Utils;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settingslib.applications.ApplicationsState;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -143,7 +144,7 @@ public class RecentAppsPreferenceController extends AbstractPreferenceController
|
||||
refreshUi(mCategory.getContext());
|
||||
// Show total number of installed apps as See all's summary.
|
||||
new InstalledAppCounter(mContext, InstalledAppCounter.IGNORE_INSTALL_REASON,
|
||||
new PackageManagerWrapperImpl(mContext.getPackageManager())) {
|
||||
new PackageManagerWrapper(mContext.getPackageManager())) {
|
||||
@Override
|
||||
protected void onCountComplete(int num) {
|
||||
if (mHasRecentApps) {
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.android.settings.applications;
|
||||
|
||||
import android.content.pm.UserInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This interface replicates a subset of the android.os.UserManager. The interface
|
||||
* exists so that we can use a thin wrapper around the UserManager in production code and a mock in
|
||||
* tests. We cannot directly mock or shadow the UserManager, because some of the methods we rely on
|
||||
* are newer than the API version supported by Robolectric or are hidden.
|
||||
*/
|
||||
public interface UserManagerWrapper {
|
||||
UserInfo getPrimaryUser();
|
||||
List<UserInfo> getUsers();
|
||||
}
|
||||
@@ -24,9 +24,9 @@ import android.text.TextUtils;
|
||||
|
||||
import com.android.internal.app.AssistUtils;
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.applications.PackageManagerWrapper;
|
||||
import com.android.settings.applications.defaultapps.DefaultAppInfo;
|
||||
import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -26,8 +26,8 @@ import android.graphics.drawable.Drawable;
|
||||
import android.os.RemoteException;
|
||||
import android.os.UserHandle;
|
||||
|
||||
import com.android.settings.applications.PackageManagerWrapper;
|
||||
import com.android.settings.widget.RadioButtonPickerFragment;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
/**
|
||||
* Data model representing an app in DefaultAppPicker UI.
|
||||
|
||||
@@ -29,11 +29,10 @@ import android.util.Pair;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.applications.PackageManagerWrapper;
|
||||
import com.android.settings.applications.PackageManagerWrapperImpl;
|
||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||
import com.android.settings.widget.RadioButtonPickerFragment;
|
||||
import com.android.settings.widget.RadioButtonPreference;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
/**
|
||||
* A generic app picker fragment that shows a list of app as radio button group.
|
||||
@@ -45,7 +44,7 @@ public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment
|
||||
@Override
|
||||
public void onAttach(Context context) {
|
||||
super.onAttach(context);
|
||||
mPm = new PackageManagerWrapperImpl(context.getPackageManager());
|
||||
mPm = new PackageManagerWrapper(context.getPackageManager());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -26,11 +26,10 @@ import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.applications.PackageManagerWrapper;
|
||||
import com.android.settings.applications.PackageManagerWrapperImpl;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.widget.GearPreference;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
public abstract class DefaultAppPreferenceController extends AbstractPreferenceController
|
||||
implements PreferenceControllerMixin {
|
||||
@@ -44,7 +43,7 @@ public abstract class DefaultAppPreferenceController extends AbstractPreferenceC
|
||||
|
||||
public DefaultAppPreferenceController(Context context) {
|
||||
super(context);
|
||||
mPackageManager = new PackageManagerWrapperImpl(context.getPackageManager());
|
||||
mPackageManager = new PackageManagerWrapper(context.getPackageManager());
|
||||
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
|
||||
mUserId = UserHandle.myUserId();
|
||||
}
|
||||
|
||||
@@ -23,8 +23,7 @@ import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
import android.view.autofill.AutofillManager;
|
||||
|
||||
import com.android.settings.applications.AutofillManagerWrapper;
|
||||
import com.android.settings.applications.AutofillManagerWrapperImpl;
|
||||
import com.android.settings.wrapper.AutofillManagerWrapper;
|
||||
|
||||
public class DefaultAutofillPreferenceController extends DefaultAppPreferenceController {
|
||||
private AutofillManagerWrapper mAutofillManager;
|
||||
@@ -32,7 +31,7 @@ public class DefaultAutofillPreferenceController extends DefaultAppPreferenceCon
|
||||
public DefaultAutofillPreferenceController(Context context) {
|
||||
super(context);
|
||||
|
||||
mAutofillManager = new AutofillManagerWrapperImpl(
|
||||
mAutofillManager = new AutofillManagerWrapper(
|
||||
mContext.getSystemService(AutofillManager.class));
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
|
||||
import com.android.settings.applications.PackageManagerWrapper;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -29,9 +29,8 @@ import android.widget.Button;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.applications.AppStoreUtil;
|
||||
import com.android.settings.applications.PackageManagerWrapper;
|
||||
import com.android.settings.applications.PackageManagerWrapperImpl;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
/** Encapsulates a container for buttons relevant to instant apps */
|
||||
public class InstantAppButtonsController implements DialogInterface.OnClickListener {
|
||||
@@ -62,7 +61,7 @@ public class InstantAppButtonsController implements DialogInterface.OnClickListe
|
||||
mFragment = fragment;
|
||||
mView = view;
|
||||
mShowDialogDelegate = showDialogDelegate;
|
||||
mPackageManagerWrapper = new PackageManagerWrapperImpl(context.getPackageManager());
|
||||
mPackageManagerWrapper = new PackageManagerWrapper(context.getPackageManager());
|
||||
}
|
||||
|
||||
public InstantAppButtonsController setPackageName(String packageName) {
|
||||
|
||||
@@ -51,8 +51,9 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController
|
||||
}
|
||||
|
||||
protected void setHeaderProperties() {
|
||||
final Pair<Drawable, String> pair = Utils.getBtClassDrawableWithDescription
|
||||
(mContext, mCachedDevice);
|
||||
final Pair<Drawable, String> pair = Utils.getBtClassDrawableWithDescription(
|
||||
mContext, mCachedDevice,
|
||||
mContext.getResources().getFraction(R.fraction.bt_battery_scale_fraction, 1, 1));
|
||||
String summaryText = mCachedDevice.getConnectionSummary();
|
||||
mHeaderController.setLabel(mCachedDevice.getName());
|
||||
mHeaderController.setIcon(pair.first);
|
||||
|
||||
@@ -156,28 +156,36 @@ public final class Utils {
|
||||
|
||||
static Pair<Drawable, String> getBtClassDrawableWithDescription(Context context,
|
||||
CachedBluetoothDevice cachedDevice) {
|
||||
return getBtClassDrawableWithDescription(context, cachedDevice, 1 /* iconScale */);
|
||||
}
|
||||
|
||||
static Pair<Drawable, String> getBtClassDrawableWithDescription(Context context,
|
||||
CachedBluetoothDevice cachedDevice, float iconScale) {
|
||||
BluetoothClass btClass = cachedDevice.getBtClass();
|
||||
final int level = cachedDevice.getBatteryLevel();
|
||||
if (btClass != null) {
|
||||
switch (btClass.getMajorDeviceClass()) {
|
||||
case BluetoothClass.Device.Major.COMPUTER:
|
||||
return new Pair<>(getBluetoothDrawable(context, R.drawable.ic_bt_laptop, level),
|
||||
return new Pair<>(getBluetoothDrawable(context, R.drawable.ic_bt_laptop, level,
|
||||
iconScale),
|
||||
context.getString(R.string.bluetooth_talkback_computer));
|
||||
|
||||
case BluetoothClass.Device.Major.PHONE:
|
||||
return new Pair<>(
|
||||
getBluetoothDrawable(context, R.drawable.ic_bt_cellphone, level),
|
||||
getBluetoothDrawable(context, R.drawable.ic_bt_cellphone, level,
|
||||
iconScale),
|
||||
context.getString(R.string.bluetooth_talkback_phone));
|
||||
|
||||
case BluetoothClass.Device.Major.PERIPHERAL:
|
||||
return new Pair<>(
|
||||
getBluetoothDrawable(context, HidProfile.getHidClassDrawable(btClass),
|
||||
level),
|
||||
level, iconScale),
|
||||
context.getString(R.string.bluetooth_talkback_input_peripheral));
|
||||
|
||||
case BluetoothClass.Device.Major.IMAGING:
|
||||
return new Pair<>(
|
||||
getBluetoothDrawable(context, R.drawable.ic_settings_print, level),
|
||||
getBluetoothDrawable(context, R.drawable.ic_settings_print, level,
|
||||
iconScale),
|
||||
context.getString(R.string.bluetooth_talkback_imaging));
|
||||
|
||||
default:
|
||||
@@ -189,30 +197,34 @@ public final class Utils {
|
||||
for (LocalBluetoothProfile profile : profiles) {
|
||||
int resId = profile.getDrawableResource(btClass);
|
||||
if (resId != 0) {
|
||||
return new Pair<>(getBluetoothDrawable(context, resId, level), null);
|
||||
return new Pair<>(getBluetoothDrawable(context, resId, level, iconScale), null);
|
||||
}
|
||||
}
|
||||
if (btClass != null) {
|
||||
if (btClass.doesClassMatch(BluetoothClass.PROFILE_HEADSET)) {
|
||||
return new Pair<>(
|
||||
getBluetoothDrawable(context, R.drawable.ic_bt_headset_hfp, level),
|
||||
getBluetoothDrawable(context, R.drawable.ic_bt_headset_hfp, level,
|
||||
iconScale),
|
||||
context.getString(R.string.bluetooth_talkback_headset));
|
||||
}
|
||||
if (btClass.doesClassMatch(BluetoothClass.PROFILE_A2DP)) {
|
||||
return new Pair<>(
|
||||
getBluetoothDrawable(context, R.drawable.ic_bt_headphones_a2dp, level),
|
||||
getBluetoothDrawable(context, R.drawable.ic_bt_headphones_a2dp, level,
|
||||
iconScale),
|
||||
context.getString(R.string.bluetooth_talkback_headphone));
|
||||
}
|
||||
}
|
||||
return new Pair<>(getBluetoothDrawable(context, R.drawable.ic_settings_bluetooth, level),
|
||||
return new Pair<>(
|
||||
getBluetoothDrawable(context, R.drawable.ic_settings_bluetooth, level, iconScale),
|
||||
context.getString(R.string.bluetooth_talkback_bluetooth));
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
static Drawable getBluetoothDrawable(Context context, @DrawableRes int resId,
|
||||
int batteryLevel) {
|
||||
int batteryLevel, float iconScale) {
|
||||
if (batteryLevel != BluetoothDevice.BATTERY_LEVEL_UNKNOWN) {
|
||||
return BluetoothDeviceLayerDrawable.createLayerDrawable(context, resId, batteryLevel);
|
||||
return BluetoothDeviceLayerDrawable.createLayerDrawable(context, resId, batteryLevel,
|
||||
iconScale);
|
||||
} else if (resId != 0) {
|
||||
return context.getDrawable(resId);
|
||||
} else {
|
||||
|
||||
@@ -285,6 +285,7 @@ public class SettingsGateway {
|
||||
// Home page > Apps & Notifications
|
||||
Settings.UserSettingsActivity.class.getName(),
|
||||
Settings.ConfigureNotificationSettingsActivity.class.getName(),
|
||||
Settings.AdvancedAppsActivity.class.getName(),
|
||||
Settings.ManageApplicationsActivity.class.getName(),
|
||||
Settings.PaymentSettingsActivity.class.getName(),
|
||||
// Home page > Security & screen lock
|
||||
|
||||
@@ -30,6 +30,7 @@ import android.support.v7.widget.RecyclerView;
|
||||
import android.text.TextUtils;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.Log;
|
||||
import android.util.Pair;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -47,6 +48,7 @@ import com.android.settings.dashboard.conditional.ConditionAdapter;
|
||||
import com.android.settings.dashboard.suggestions.SuggestionAdapter;
|
||||
import com.android.settings.dashboard.suggestions.SuggestionDismissController;
|
||||
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
|
||||
import com.android.settings.dashboard.suggestions.SuggestionLogHelper;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settingslib.Utils;
|
||||
import com.android.settingslib.drawer.DashboardCategory;
|
||||
@@ -159,7 +161,8 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
final String identifier = mSuggestionFeatureProvider.getSuggestionIdentifier(
|
||||
mContext, suggestion);
|
||||
mMetricsFeatureProvider.action(
|
||||
mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, identifier);
|
||||
mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, identifier,
|
||||
getSuggestionTaggedData());
|
||||
mSuggestionsShownLogged.add(identifier);
|
||||
}
|
||||
}
|
||||
@@ -289,7 +292,8 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
mContext, suggestion);
|
||||
if (mSuggestionsShownLogged.contains(suggestionId)) {
|
||||
mMetricsFeatureProvider.action(
|
||||
mContext, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, suggestionId);
|
||||
mContext, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, suggestionId,
|
||||
getSuggestionTaggedData());
|
||||
}
|
||||
}
|
||||
mSuggestionsShownLogged.clear();
|
||||
@@ -325,8 +329,8 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
mContext, suggestion);
|
||||
if (!mSuggestionsShownLogged.contains(suggestionId)) {
|
||||
mMetricsFeatureProvider.action(
|
||||
mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
|
||||
suggestionId);
|
||||
mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, suggestionId,
|
||||
getSuggestionTaggedData());
|
||||
mSuggestionsShownLogged.add(suggestionId);
|
||||
}
|
||||
}
|
||||
@@ -507,6 +511,11 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
parent.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
private Pair<Integer, Object>[] getSuggestionTaggedData() {
|
||||
return SuggestionLogHelper.getSuggestionTaggedData(
|
||||
mSuggestionFeatureProvider.isSmartSuggestionEnabled(mContext));
|
||||
}
|
||||
|
||||
public static class IconCache {
|
||||
private final Context mContext;
|
||||
private final ArrayMap<Icon, Drawable> mMap = new ArrayMap<>();
|
||||
|
||||
@@ -198,15 +198,22 @@ public class DashboardData {
|
||||
final int hiddenSuggestion =
|
||||
hasSuggestions ? sizeOf(mSuggestions) - sizeOf(suggestions) : 0;
|
||||
|
||||
final boolean hasSuggestionAndCollapsed = hasSuggestions
|
||||
&& mSuggestionConditionMode == HEADER_MODE_COLLAPSED;
|
||||
final boolean onlyHasConditionAndCollapsed = !hasSuggestions
|
||||
&& hasConditions
|
||||
&& mSuggestionConditionMode != HEADER_MODE_FULLY_EXPANDED;
|
||||
|
||||
/* Top suggestion/condition header. This will be present when there is any suggestion
|
||||
* and the mode is collapsed, or it only has conditions and the mode is not fully
|
||||
* expanded. */
|
||||
* and the mode is collapsed */
|
||||
addToItemList(new SuggestionConditionHeaderData(conditions, hiddenSuggestion),
|
||||
R.layout.suggestion_condition_header,
|
||||
STABLE_ID_SUGGESTION_CONDITION_TOP_HEADER,
|
||||
hasSuggestions && mSuggestionConditionMode == HEADER_MODE_COLLAPSED
|
||||
|| !hasSuggestions && hasConditions
|
||||
&& mSuggestionConditionMode != HEADER_MODE_FULLY_EXPANDED);
|
||||
STABLE_ID_SUGGESTION_CONDITION_TOP_HEADER, hasSuggestionAndCollapsed);
|
||||
|
||||
/* Use mid header if there is only condition & it's in collapsed mode */
|
||||
addToItemList(new SuggestionConditionHeaderData(conditions, hiddenSuggestion),
|
||||
R.layout.suggestion_condition_header,
|
||||
STABLE_ID_SUGGESTION_CONDITION_MIDDLE_HEADER, onlyHasConditionAndCollapsed);
|
||||
|
||||
/* Suggestion container. This is the card view that contains the list of suggestions.
|
||||
* This will be added whenever the suggestion list is not empty */
|
||||
|
||||
@@ -38,6 +38,7 @@ import com.android.settings.dashboard.conditional.FocusRecyclerView;
|
||||
import com.android.settings.dashboard.conditional.FocusRecyclerView.FocusListener;
|
||||
import com.android.settings.dashboard.suggestions.SuggestionDismissController;
|
||||
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
|
||||
import com.android.settings.dashboard.suggestions.SuggestionControllerMixin;
|
||||
import com.android.settings.dashboard.suggestions.SuggestionsChecks;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.widget.ActionBarShadowController;
|
||||
@@ -60,7 +61,6 @@ public class DashboardSummary extends InstrumentedFragment
|
||||
private static final int MAX_WAIT_MILLIS = 700;
|
||||
private static final String TAG = "DashboardSummary";
|
||||
|
||||
|
||||
private static final String EXTRA_SCROLL_POSITION = "scroll_position";
|
||||
|
||||
private final Handler mHandler = new Handler();
|
||||
@@ -72,6 +72,7 @@ public class DashboardSummary extends InstrumentedFragment
|
||||
private SuggestionParser mSuggestionParser;
|
||||
private LinearLayoutManager mLayoutManager;
|
||||
private SuggestionsChecks mSuggestionsChecks;
|
||||
private SuggestionControllerMixin mSuggestionControllerMixin;
|
||||
private DashboardFeatureProvider mDashboardFeatureProvider;
|
||||
private SuggestionFeatureProvider mSuggestionFeatureProvider;
|
||||
private boolean isOnCategoriesChangedCalled;
|
||||
@@ -82,6 +83,12 @@ public class DashboardSummary extends InstrumentedFragment
|
||||
return MetricsEvent.DASHBOARD_SUMMARY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(Context context) {
|
||||
super.onAttach(context);
|
||||
mSuggestionControllerMixin = new SuggestionControllerMixin(context, getLifecycle());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
long startTime = System.currentTimeMillis();
|
||||
@@ -196,7 +203,7 @@ public class DashboardSummary extends InstrumentedFragment
|
||||
mDashboard.setHasFixedSize(true);
|
||||
mDashboard.setListener(this);
|
||||
mAdapter = new DashboardAdapter(getContext(), bundle, mConditionManager.getConditions(),
|
||||
mSuggestionParser, this /* SuggestionDismissController.Callback */);
|
||||
mSuggestionParser, this /* SuggestionDismissController.Callback */);
|
||||
mDashboard.setAdapter(mAdapter);
|
||||
mDashboard.setItemAnimator(new DashboardItemAnimator());
|
||||
mSummaryLoader.setSummaryConsumer(mAdapter);
|
||||
|
||||
@@ -24,6 +24,7 @@ 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;
|
||||
@@ -42,6 +43,8 @@ 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;
|
||||
@@ -102,11 +105,17 @@ public class ProgressiveDisclosureMixin implements Preference.OnPreferenceClickL
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
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) {
|
||||
mTileLimit = limit;
|
||||
if (isEnabled()) {
|
||||
mTileLimit = limit;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.android.settings.dashboard.suggestions;
|
||||
import android.content.Context;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Pair;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -67,11 +68,12 @@ public class SuggestionAdapter extends RecyclerView.Adapter<DashboardItemHolder>
|
||||
public void onBindViewHolder(DashboardItemHolder holder, int position) {
|
||||
final Tile suggestion = (Tile) mSuggestions.get(position);
|
||||
final String suggestionId = mSuggestionFeatureProvider.getSuggestionIdentifier(
|
||||
mContext, suggestion);
|
||||
mContext, suggestion);
|
||||
// This is for cases when a suggestion is dismissed and the next one comes to view
|
||||
if (!mSuggestionsShownLogged.contains(suggestionId)) {
|
||||
mMetricsFeatureProvider.action(
|
||||
mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, suggestionId);
|
||||
mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, suggestionId,
|
||||
getSuggestionTaggedData());
|
||||
mSuggestionsShownLogged.add(suggestionId);
|
||||
}
|
||||
if (suggestion.remoteViews != null) {
|
||||
@@ -102,9 +104,11 @@ public class SuggestionAdapter extends RecyclerView.Adapter<DashboardItemHolder>
|
||||
// set the item view to disabled to remove any touch effects
|
||||
holder.itemView.setEnabled(false);
|
||||
}
|
||||
|
||||
clickHandler.setOnClickListener(v -> {
|
||||
mMetricsFeatureProvider.action(mContext,
|
||||
MetricsEvent.ACTION_SETTINGS_SUGGESTION, suggestionId);
|
||||
MetricsEvent.ACTION_SETTINGS_SUGGESTION, suggestionId,
|
||||
getSuggestionTaggedData());
|
||||
((SettingsActivity) mContext).startSuggestion(suggestion.intent);
|
||||
});
|
||||
}
|
||||
@@ -129,7 +133,7 @@ public class SuggestionAdapter extends RecyclerView.Adapter<DashboardItemHolder>
|
||||
|
||||
public Tile getSuggestion(int position) {
|
||||
final long itemId = getItemId(position);
|
||||
for (Tile tile: mSuggestions) {
|
||||
for (Tile tile : mSuggestions) {
|
||||
if (Objects.hash(tile.title) == itemId) {
|
||||
return tile;
|
||||
}
|
||||
@@ -141,4 +145,10 @@ public class SuggestionAdapter extends RecyclerView.Adapter<DashboardItemHolder>
|
||||
mSuggestions.remove(suggestion);
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private Pair<Integer, Object>[] getSuggestionTaggedData() {
|
||||
return SuggestionLogHelper.getSuggestionTaggedData(
|
||||
mSuggestionFeatureProvider.isSmartSuggestionEnabled(mContext));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.android.settings.dashboard.suggestions;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.service.settings.suggestions.ISuggestionService;
|
||||
import android.service.settings.suggestions.Suggestion;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.WorkerThread;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* A controller class to access suggestion data.
|
||||
*/
|
||||
public class SuggestionController {
|
||||
|
||||
/**
|
||||
* Callback interface when service is connected/disconnected.
|
||||
*/
|
||||
public interface ServiceConnectionListener {
|
||||
/**
|
||||
* Called when service is connected.
|
||||
*/
|
||||
void onServiceConnected();
|
||||
|
||||
/**
|
||||
* Called when service is disconnected.
|
||||
*/
|
||||
void onServiceDisconnected();
|
||||
}
|
||||
|
||||
private static final String TAG = "SuggestionController";
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
private final Context mContext;
|
||||
private final Intent mServiceIntent;
|
||||
|
||||
private ServiceConnection mServiceConnection;
|
||||
private ISuggestionService mRemoteService;
|
||||
private ServiceConnectionListener mConnectionListener;
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
*
|
||||
* @param context caller context
|
||||
* @param service The component name for service.
|
||||
* @param listener listener to receive service connected/disconnected event.
|
||||
*/
|
||||
public SuggestionController(Context context, ComponentName service,
|
||||
ServiceConnectionListener listener) {
|
||||
mContext = context.getApplicationContext();
|
||||
mConnectionListener = listener;
|
||||
mServiceIntent = new Intent().setComponent(service);
|
||||
mServiceConnection = createServiceConnection();
|
||||
}
|
||||
|
||||
/**
|
||||
* Start the controller.
|
||||
*/
|
||||
public void start() {
|
||||
mContext.bindServiceAsUser(mServiceIntent, mServiceConnection, Context.BIND_AUTO_CREATE,
|
||||
android.os.Process.myUserHandle());
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop the controller.
|
||||
*/
|
||||
public void stop() {
|
||||
if (mRemoteService != null) {
|
||||
mRemoteService = null;
|
||||
mContext.unbindService(mServiceConnection);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get setting suggestions.
|
||||
*/
|
||||
@Nullable
|
||||
@WorkerThread
|
||||
public List<Suggestion> getSuggestions() {
|
||||
if (!isReady()) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return mRemoteService.getSuggestions();
|
||||
} catch (RemoteException e) {
|
||||
Log.w(TAG, "Error when calling getSuggestion()", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether or not the manager is ready
|
||||
*/
|
||||
private boolean isReady() {
|
||||
return mRemoteService != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new {@link ServiceConnection} object to handle service connect/disconnect event.
|
||||
*/
|
||||
private ServiceConnection createServiceConnection() {
|
||||
return new ServiceConnection() {
|
||||
|
||||
@Override
|
||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "Service is connected");
|
||||
}
|
||||
mRemoteService = ISuggestionService.Stub.asInterface(service);
|
||||
if (mConnectionListener != null) {
|
||||
mConnectionListener.onServiceConnected();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceDisconnected(ComponentName name) {
|
||||
if (mConnectionListener != null) {
|
||||
mRemoteService = null;
|
||||
mConnectionListener.onServiceDisconnected();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.android.settings.dashboard.suggestions;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.service.settings.suggestions.Suggestion;
|
||||
import android.support.annotation.VisibleForTesting;
|
||||
import android.util.FeatureFlagUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settingslib.core.lifecycle.events.OnStart;
|
||||
import com.android.settingslib.core.lifecycle.events.OnStop;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Manages IPC communication to SettingsIntelligence for suggestion related services.
|
||||
*/
|
||||
public class SuggestionControllerMixin implements SuggestionController.ServiceConnectionListener,
|
||||
LifecycleObserver, OnStart, OnStop {
|
||||
|
||||
@VisibleForTesting
|
||||
static final String FEATURE_FLAG = "new_settings_suggestion";
|
||||
private static final String TAG = "SuggestionCtrlMixin";
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
private final Context mContext;
|
||||
private final SuggestionController mSuggestionController;
|
||||
|
||||
public static boolean isEnabled() {
|
||||
return FeatureFlagUtils.isEnabled(FEATURE_FLAG);
|
||||
}
|
||||
|
||||
public SuggestionControllerMixin(Context context, Lifecycle lifecycle) {
|
||||
mContext = context.getApplicationContext();
|
||||
mSuggestionController = new SuggestionController(context,
|
||||
new ComponentName(
|
||||
"com.android.settings.intelligence",
|
||||
"com.android.settings.intelligence.suggestions.SuggestionService"),
|
||||
this /* serviceConnectionListener */);
|
||||
if (lifecycle != null) {
|
||||
lifecycle.addObserver(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
if (!isEnabled()) {
|
||||
Log.w(TAG, "Feature not enabled, skipping");
|
||||
return;
|
||||
}
|
||||
mSuggestionController.start();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
mSuggestionController.stop();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceConnected() {
|
||||
// TODO: Call API to get data from a loader instead of in current thread.
|
||||
final List<Suggestion> data = mSuggestionController.getSuggestions();
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "data size " + (data == null ? 0 : data.size()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceDisconnected() {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "SuggestionService disconnected");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,8 +26,9 @@ import android.provider.Settings.Secure;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.VisibleForTesting;
|
||||
import android.util.Log;
|
||||
import android.util.Pair;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.Settings.AmbientDisplayPickupSuggestionActivity;
|
||||
import com.android.settings.Settings.AmbientDisplaySuggestionActivity;
|
||||
import com.android.settings.Settings.DoubleTapPowerSuggestionActivity;
|
||||
@@ -45,6 +46,7 @@ import com.android.settings.support.NewDeviceIntroSuggestionActivity;
|
||||
import com.android.settingslib.drawer.Tile;
|
||||
import com.android.settingslib.suggestions.SuggestionParser;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider {
|
||||
@@ -130,10 +132,13 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
|
||||
if (parser == null || suggestion == null || context == null) {
|
||||
return;
|
||||
}
|
||||
mMetricsFeatureProvider.action(
|
||||
context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION,
|
||||
getSuggestionIdentifier(context, suggestion));
|
||||
final Pair<Integer, Object>[] taggedData =
|
||||
SuggestionLogHelper.getSuggestionTaggedData(isSmartSuggestionEnabled(context));
|
||||
|
||||
mMetricsFeatureProvider.action(
|
||||
context, MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION,
|
||||
getSuggestionIdentifier(context, suggestion),
|
||||
taggedData);
|
||||
if (!parser.dismissSuggestion(suggestion)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -13,24 +13,17 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.android.settings.wifi;
|
||||
package com.android.settings.dashboard.suggestions;
|
||||
|
||||
import android.net.ConnectivityManager;
|
||||
import android.util.Pair;
|
||||
|
||||
/**
|
||||
* Wrapper around {@link ConnectivityManager} to facilitate unit testing.
|
||||
*/
|
||||
public class ConnectivityManagerWrapper {
|
||||
private final ConnectivityManager mConnectivityManager;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
|
||||
public ConnectivityManagerWrapper(ConnectivityManager connectivityManager) {
|
||||
mConnectivityManager = connectivityManager;
|
||||
}
|
||||
public class SuggestionLogHelper {
|
||||
|
||||
/**
|
||||
* {@link ConnectivityManager#stopTethering}
|
||||
*/
|
||||
public void stopTethering(int type) {
|
||||
mConnectivityManager.stopTethering(type);
|
||||
public static Pair<Integer, Object>[] getSuggestionTaggedData(boolean enabled) {
|
||||
return new Pair[]{
|
||||
Pair.create(
|
||||
MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, enabled ? 1 : 0)};
|
||||
}
|
||||
}
|
||||
@@ -32,6 +32,7 @@ import com.android.settings.Utils;
|
||||
import com.android.settings.fingerprint.FingerprintSuggestionActivity;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.wallpaper.WallpaperSuggestionActivity;
|
||||
import com.android.settings.wrapper.WallpaperManagerWrapper;
|
||||
import com.android.settingslib.drawer.Tile;
|
||||
|
||||
/**
|
||||
|
||||
@@ -46,14 +46,13 @@ import android.widget.AdapterView;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.applications.AppInfoBase;
|
||||
import com.android.settings.applications.PackageManagerWrapper;
|
||||
import com.android.settings.applications.PackageManagerWrapperImpl;
|
||||
import com.android.settings.widget.EntityHeaderController;
|
||||
import com.android.settingslib.AppItem;
|
||||
import com.android.settingslib.net.ChartData;
|
||||
import com.android.settingslib.net.ChartDataLoader;
|
||||
import com.android.settingslib.net.UidDetail;
|
||||
import com.android.settingslib.net.UidDetailProvider;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
public class AppDataUsage extends DataUsageBase implements Preference.OnPreferenceChangeListener,
|
||||
DataSaverBackend.Listener {
|
||||
@@ -104,7 +103,7 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
|
||||
@Override
|
||||
public void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
mPackageManagerWrapper = new PackageManagerWrapperImpl(getPackageManager());
|
||||
mPackageManagerWrapper = new PackageManagerWrapper(getPackageManager());
|
||||
final Bundle args = getArguments();
|
||||
|
||||
try {
|
||||
|
||||
@@ -102,6 +102,6 @@ public class CameraHalHdrplusPreferenceController extends AbstractPreferenceCont
|
||||
}
|
||||
|
||||
private boolean isHalHdrplusEnabled() {
|
||||
return SystemProperties.getBoolean(PROPERTY_CAMERA_HAL_HDRPLUS, true);
|
||||
return SystemProperties.getBoolean(PROPERTY_CAMERA_HAL_HDRPLUS, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,8 +32,10 @@ import com.android.settings.search.BaseSearchIndexProvider;
|
||||
import com.android.settings.search.Indexable;
|
||||
import com.android.settings.widget.SwitchBar;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.development.DevelopmentSettingsEnabler;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@@ -116,7 +118,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
|
||||
|
||||
@Override
|
||||
protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
|
||||
return buildPreferenceControllers(context);
|
||||
return buildPreferenceControllers(context, getLifecycle());
|
||||
}
|
||||
|
||||
void onEnableDevelopmentOptionsConfirmed() {
|
||||
@@ -129,8 +131,12 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
|
||||
mSwitchBar.setChecked(false);
|
||||
}
|
||||
|
||||
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
|
||||
return null;
|
||||
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
|
||||
Lifecycle lifecycle) {
|
||||
final List<AbstractPreferenceController> controllers = new ArrayList<>();
|
||||
controllers.add(new StayAwakePreferenceController(context, lifecycle));
|
||||
|
||||
return controllers;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -156,7 +162,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
|
||||
@Override
|
||||
public List<AbstractPreferenceController> getPreferenceControllers(Context
|
||||
context) {
|
||||
return buildPreferenceControllers(context);
|
||||
return buildPreferenceControllers(context, null /* lifecycle */);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
package com.android.settings.development;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.database.ContentObserver;
|
||||
import android.net.Uri;
|
||||
import android.os.BatteryManager;
|
||||
import android.os.Handler;
|
||||
import android.provider.Settings;
|
||||
import android.support.annotation.VisibleForTesting;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settingslib.RestrictedLockUtils;
|
||||
import com.android.settingslib.RestrictedSwitchPreference;
|
||||
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.OnPause;
|
||||
import com.android.settingslib.core.lifecycle.events.OnResume;
|
||||
|
||||
|
||||
public class StayAwakePreferenceController extends AbstractPreferenceController implements
|
||||
PreferenceControllerMixin, Preference.OnPreferenceChangeListener, LifecycleObserver,
|
||||
OnResume, OnPause {
|
||||
|
||||
private static final String TAG = "StayAwakeCtrl";
|
||||
private static final String PREFERENCE_KEY = "keep_screen_on";
|
||||
@VisibleForTesting
|
||||
static final int SETTING_VALUE_OFF = 0;
|
||||
@VisibleForTesting
|
||||
static final int SETTING_VALUE_ON =
|
||||
BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB
|
||||
| BatteryManager.BATTERY_PLUGGED_WIRELESS;
|
||||
@VisibleForTesting
|
||||
SettingsObserver mSettingsObserver;
|
||||
|
||||
private RestrictedSwitchPreference mPreference;
|
||||
|
||||
public StayAwakePreferenceController(Context context, Lifecycle lifecycle) {
|
||||
super(context);
|
||||
mSettingsObserver = new SettingsObserver();
|
||||
|
||||
if (lifecycle != null) {
|
||||
lifecycle.addObserver(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPreferenceKey() {
|
||||
return PREFERENCE_KEY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
mPreference = (RestrictedSwitchPreference) screen.findPreference(getPreferenceKey());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
final boolean stayAwake = (Boolean) newValue;
|
||||
Settings.Global.putInt(mContext.getContentResolver(),
|
||||
Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
|
||||
stayAwake ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
final RestrictedLockUtils.EnforcedAdmin admin = checkIfMaximumTimeToLockSetByAdmin();
|
||||
if (admin != null) {
|
||||
mPreference.setDisabledByAdmin(admin);
|
||||
return;
|
||||
}
|
||||
|
||||
final int stayAwakeMode = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
|
||||
SETTING_VALUE_OFF);
|
||||
mPreference.setChecked(stayAwakeMode != SETTING_VALUE_OFF);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
if (mPreference != null) {
|
||||
mSettingsObserver.register(true /* register */);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
if (mPreference != null) {
|
||||
mSettingsObserver.register(false /* unregister */);
|
||||
}
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
RestrictedLockUtils.EnforcedAdmin checkIfMaximumTimeToLockSetByAdmin() {
|
||||
// A DeviceAdmin has specified a maximum time until the device
|
||||
// will lock... in this case we can't allow the user to turn
|
||||
// on "stay awake when plugged in" because that would defeat the
|
||||
// restriction.
|
||||
return RestrictedLockUtils.checkIfMaximumTimeToLockIsSet(mContext);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
class SettingsObserver extends ContentObserver {
|
||||
private final Uri mStayAwakeUri = Settings.Global.getUriFor(
|
||||
Settings.Global.STAY_ON_WHILE_PLUGGED_IN);
|
||||
|
||||
public SettingsObserver() {
|
||||
super(new Handler());
|
||||
}
|
||||
|
||||
public void register(boolean register) {
|
||||
final ContentResolver cr = mContext.getContentResolver();
|
||||
if (register) {
|
||||
cr.registerContentObserver(
|
||||
mStayAwakeUri, false, this);
|
||||
} else {
|
||||
cr.unregisterContentObserver(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean selfChange, Uri uri) {
|
||||
super.onChange(selfChange, uri);
|
||||
if (mStayAwakeUri.equals(uri)) {
|
||||
updateState(mPreference);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -24,12 +24,12 @@ import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.applications.PackageManagerWrapper;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settingslib.core.lifecycle.events.OnCreateOptionsMenu;
|
||||
import com.android.settingslib.core.lifecycle.events.OnOptionsItemSelected;
|
||||
import com.android.settingslib.core.lifecycle.events.OnPrepareOptionsMenu;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
|
||||
@@ -35,9 +35,6 @@ import android.view.View;
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.applications.PackageManagerWrapperImpl;
|
||||
import com.android.settings.applications.UserManagerWrapper;
|
||||
import com.android.settings.applications.UserManagerWrapperImpl;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
import com.android.settings.deviceinfo.storage.AutomaticStorageManagementSwitchPreferenceController;
|
||||
import com.android.settings.deviceinfo.storage.CachedStorageValuesHelper;
|
||||
@@ -49,10 +46,12 @@ import com.android.settings.deviceinfo.storage.UserIconLoader;
|
||||
import com.android.settings.deviceinfo.storage.VolumeSizesLoader;
|
||||
import com.android.settings.search.BaseSearchIndexProvider;
|
||||
import com.android.settings.search.Indexable;
|
||||
import com.android.settings.wrapper.UserManagerWrapper;
|
||||
import com.android.settingslib.applications.StorageStatsSource;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.deviceinfo.PrivateStorageInfo;
|
||||
import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -95,7 +94,7 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
@VisibleForTesting
|
||||
void initializeOptionsMenu(Activity activity) {
|
||||
mOptionMenuController = new PrivateVolumeOptionMenuController(
|
||||
activity, mVolume, new PackageManagerWrapperImpl(activity.getPackageManager()));
|
||||
activity, mVolume, new PackageManagerWrapper(activity.getPackageManager()));
|
||||
getLifecycle().addObserver(mOptionMenuController);
|
||||
setHasOptionsMenu(true);
|
||||
activity.invalidateOptionsMenu();
|
||||
@@ -105,9 +104,7 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
public void onViewCreated(View v, Bundle savedInstanceState) {
|
||||
super.onViewCreated(v, savedInstanceState);
|
||||
initializeCacheProvider();
|
||||
if (mAppsResult == null || mStorageInfo == null) {
|
||||
setLoading(true, false);
|
||||
}
|
||||
maybeSetLoading(isQuotaSupported());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -125,21 +122,23 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
}
|
||||
|
||||
private void onReceivedSizes() {
|
||||
if (mStorageInfo == null || mAppsResult == null) {
|
||||
return;
|
||||
if (mStorageInfo != null) {
|
||||
long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes;
|
||||
mSummaryController.updateBytes(privateUsedBytes, mStorageInfo.totalBytes);
|
||||
mPreferenceController.setVolume(mVolume);
|
||||
mPreferenceController.setUsedSize(privateUsedBytes);
|
||||
mPreferenceController.setTotalSize(mStorageInfo.totalBytes);
|
||||
for (int i = 0, size = mSecondaryUsers.size(); i < size; i++) {
|
||||
AbstractPreferenceController controller = mSecondaryUsers.get(i);
|
||||
if (controller instanceof SecondaryUserController) {
|
||||
SecondaryUserController userController = (SecondaryUserController) controller;
|
||||
userController.setTotalSize(mStorageInfo.totalBytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes;
|
||||
mSummaryController.updateBytes(privateUsedBytes, mStorageInfo.totalBytes);
|
||||
mPreferenceController.setVolume(mVolume);
|
||||
mPreferenceController.setUsedSize(privateUsedBytes);
|
||||
mPreferenceController.setTotalSize(mStorageInfo.totalBytes);
|
||||
for (int i = 0, size = mSecondaryUsers.size(); i < size; i++) {
|
||||
AbstractPreferenceController controller = mSecondaryUsers.get(i);
|
||||
if (controller instanceof SecondaryUserController) {
|
||||
SecondaryUserController userController = (SecondaryUserController) controller;
|
||||
userController.setTotalSize(mStorageInfo.totalBytes);
|
||||
}
|
||||
if (mAppsResult == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
mPreferenceController.onLoadFinished(mAppsResult, UserHandle.myUserId());
|
||||
@@ -178,7 +177,7 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
controllers.add(mPreferenceController);
|
||||
|
||||
UserManagerWrapper userManager =
|
||||
new UserManagerWrapperImpl(context.getSystemService(UserManager.class));
|
||||
new UserManagerWrapper(context.getSystemService(UserManager.class));
|
||||
mSecondaryUsers = SecondaryUserController.getSecondaryUserControllers(context, userManager);
|
||||
controllers.addAll(mSecondaryUsers);
|
||||
|
||||
@@ -227,7 +226,7 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
|
||||
final StorageManager sm = context.getSystemService(StorageManager.class);
|
||||
final UserManagerWrapper userManager =
|
||||
new UserManagerWrapperImpl(context.getSystemService(UserManager.class));
|
||||
new UserManagerWrapper(context.getSystemService(UserManager.class));
|
||||
final List<AbstractPreferenceController> controllers = new ArrayList<>();
|
||||
controllers.add(new StorageSummaryDonutPreferenceController(context));
|
||||
controllers.add(new StorageItemPreferenceController(context, null /* host */,
|
||||
@@ -244,10 +243,10 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
Bundle args) {
|
||||
Context context = getContext();
|
||||
return new StorageAsyncLoader(context,
|
||||
new UserManagerWrapperImpl(context.getSystemService(UserManager.class)),
|
||||
new UserManagerWrapper(context.getSystemService(UserManager.class)),
|
||||
mVolume.fsUuid,
|
||||
new StorageStatsSource(context),
|
||||
new PackageManagerWrapperImpl(context.getPackageManager()));
|
||||
new PackageManagerWrapper(context.getPackageManager()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -272,11 +271,21 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
return mStorageInfo;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public void setPrivateStorageInfo(PrivateStorageInfo info) {
|
||||
mStorageInfo = info;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public SparseArray<StorageAsyncLoader.AppsStorageResult> getAppsStorageResult() {
|
||||
return mAppsResult;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public void setAppsStorageResult(SparseArray<StorageAsyncLoader.AppsStorageResult> info) {
|
||||
mAppsResult = info;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public void initializeCachedValues() {
|
||||
PrivateStorageInfo info = mCachedStorageValuesHelper.getCachedPrivateStorageInfo();
|
||||
@@ -290,6 +299,16 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
mAppsResult = loaderResult;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public void maybeSetLoading(boolean isQuotaSupported) {
|
||||
// If we have fast stats, we load until both have loaded.
|
||||
// If we have slow stats, we load when we get the total volume sizes.
|
||||
if ((isQuotaSupported && (mStorageInfo == null || mAppsResult == null)) ||
|
||||
(!isQuotaSupported && mStorageInfo == null)) {
|
||||
setLoading(true /* loading */, false /* animate */);
|
||||
}
|
||||
}
|
||||
|
||||
private void initializeCacheProvider() {
|
||||
mCachedStorageValuesHelper =
|
||||
new CachedStorageValuesHelper(getContext(), UserHandle.myUserId());
|
||||
@@ -304,6 +323,11 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isQuotaSupported() {
|
||||
final StorageStatsManager stats = getActivity().getSystemService(StorageStatsManager.class);
|
||||
return stats.isQuotaSupported(mVolume.fsUuid);
|
||||
}
|
||||
|
||||
/**
|
||||
* IconLoaderCallbacks exists because StorageDashboardFragment already implements
|
||||
* LoaderCallbacks for a different type.
|
||||
|
||||
@@ -30,15 +30,15 @@ import android.util.SparseArray;
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.applications.PackageManagerWrapperImpl;
|
||||
import com.android.settings.applications.UserManagerWrapperImpl;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
import com.android.settings.deviceinfo.storage.StorageAsyncLoader;
|
||||
import com.android.settings.deviceinfo.storage.StorageAsyncLoader.AppsStorageResult;
|
||||
import com.android.settings.deviceinfo.storage.StorageItemPreferenceController;
|
||||
import com.android.settings.wrapper.UserManagerWrapper;
|
||||
import com.android.settingslib.applications.StorageStatsSource;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -116,10 +116,10 @@ public class StorageProfileFragment extends DashboardFragment
|
||||
public Loader<SparseArray<AppsStorageResult>> onCreateLoader(int id, Bundle args) {
|
||||
Context context = getContext();
|
||||
return new StorageAsyncLoader(context,
|
||||
new UserManagerWrapperImpl(context.getSystemService(UserManager.class)),
|
||||
new UserManagerWrapper(context.getSystemService(UserManager.class)),
|
||||
mVolume.fsUuid,
|
||||
new StorageStatsSource(context),
|
||||
new PackageManagerWrapperImpl(context.getPackageManager()));
|
||||
new PackageManagerWrapper(context.getPackageManager()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -603,16 +603,6 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index
|
||||
data.screenTitle = context.getString(R.string.storage_settings);
|
||||
result.add(data);
|
||||
|
||||
data = new SearchIndexableRaw(context);
|
||||
data.title = context.getString(R.string.memory_downloads_usage);
|
||||
data.screenTitle = context.getString(R.string.storage_settings);
|
||||
result.add(data);
|
||||
|
||||
data = new SearchIndexableRaw(context);
|
||||
data.title = context.getString(R.string.memory_media_cache_usage);
|
||||
data.screenTitle = context.getString(R.string.storage_settings);
|
||||
result.add(data);
|
||||
|
||||
data = new SearchIndexableRaw(context);
|
||||
data.title = context.getString(R.string.memory_media_misc_usage);
|
||||
data.screenTitle = context.getString(R.string.storage_settings);
|
||||
|
||||
@@ -27,9 +27,9 @@ import android.support.v7.preference.PreferenceScreen;
|
||||
import android.util.SparseArray;
|
||||
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.applications.UserManagerWrapper;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.deviceinfo.StorageItemPreference;
|
||||
import com.android.settings.wrapper.UserManagerWrapper;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
@@ -30,10 +30,10 @@ import android.util.ArraySet;
|
||||
import android.util.Log;
|
||||
import android.util.SparseArray;
|
||||
|
||||
import com.android.settings.applications.PackageManagerWrapper;
|
||||
import com.android.settings.applications.UserManagerWrapper;
|
||||
import com.android.settings.utils.AsyncLoader;
|
||||
import com.android.settings.wrapper.UserManagerWrapper;
|
||||
import com.android.settingslib.applications.StorageStatsSource;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.app.Fragment;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.TrafficStats;
|
||||
@@ -314,7 +313,7 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
|
||||
}
|
||||
|
||||
private Intent getPhotosIntent() {
|
||||
Bundle args = new Bundle(2);
|
||||
Bundle args = getWorkAnnotatedBundle(2);
|
||||
args.putString(
|
||||
ManageApplications.EXTRA_CLASSNAME, Settings.PhotosStorageActivity.class.getName());
|
||||
args.putInt(
|
||||
@@ -336,8 +335,7 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
|
||||
return null;
|
||||
}
|
||||
|
||||
Bundle args = new Bundle();
|
||||
args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile);
|
||||
Bundle args = getWorkAnnotatedBundle(4);
|
||||
args.putString(ManageApplications.EXTRA_CLASSNAME,
|
||||
Settings.StorageUseActivity.class.getName());
|
||||
args.putString(ManageApplications.EXTRA_VOLUME_UUID, mVolume.getFsUuid());
|
||||
@@ -353,8 +351,7 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
|
||||
return null;
|
||||
}
|
||||
|
||||
Bundle args = new Bundle();
|
||||
args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile);
|
||||
Bundle args = getWorkAnnotatedBundle(3);
|
||||
args.putString(ManageApplications.EXTRA_CLASSNAME,
|
||||
Settings.StorageUseActivity.class.getName());
|
||||
args.putString(ManageApplications.EXTRA_VOLUME_UUID, mVolume.getFsUuid());
|
||||
@@ -365,8 +362,7 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
|
||||
}
|
||||
|
||||
private Intent getGamesIntent() {
|
||||
Bundle args = new Bundle(1);
|
||||
args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile);
|
||||
Bundle args = getWorkAnnotatedBundle(1);
|
||||
args.putString(ManageApplications.EXTRA_CLASSNAME,
|
||||
Settings.GamesStorageActivity.class.getName());
|
||||
return Utils.onBuildStartFragmentIntent(mContext,
|
||||
@@ -375,8 +371,7 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
|
||||
}
|
||||
|
||||
private Intent getMoviesIntent() {
|
||||
Bundle args = new Bundle(1);
|
||||
args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile);
|
||||
Bundle args = getWorkAnnotatedBundle(1);
|
||||
args.putString(ManageApplications.EXTRA_CLASSNAME,
|
||||
Settings.MoviesStorageActivity.class.getName());
|
||||
return Utils.onBuildStartFragmentIntent(mContext,
|
||||
@@ -384,6 +379,13 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
|
||||
null, false, mMetricsFeatureProvider.getMetricsCategory(mFragment));
|
||||
}
|
||||
|
||||
private Bundle getWorkAnnotatedBundle(int additionalCapacity) {
|
||||
Bundle args = new Bundle(2 + additionalCapacity);
|
||||
args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile);
|
||||
args.putInt(ManageApplications.EXTRA_WORK_ID, mUserId);
|
||||
return args;
|
||||
}
|
||||
|
||||
private Intent getFilesIntent() {
|
||||
return mSvp.findEmulatedForPrivate(mVolume).buildBrowseIntent();
|
||||
}
|
||||
|
||||
@@ -30,10 +30,10 @@ import android.util.SparseArray;
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.internal.util.Preconditions;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.applications.UserManagerWrapper;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.deviceinfo.StorageItemPreference;
|
||||
import com.android.settings.deviceinfo.StorageProfileFragment;
|
||||
import com.android.settings.wrapper.UserManagerWrapper;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.drawer.SettingsDrawerActivity;
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ import android.support.v7.preference.PreferenceScreen;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.wrapper.PowerManagerWrapper;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
|
||||
@@ -1,125 +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.enterprise;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.os.UserHandle;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class DevicePolicyManagerWrapperImpl implements DevicePolicyManagerWrapper {
|
||||
private final DevicePolicyManager mDpm;
|
||||
|
||||
public DevicePolicyManagerWrapperImpl(DevicePolicyManager dpm) {
|
||||
mDpm = dpm;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<ComponentName> getActiveAdminsAsUser(int userId) {
|
||||
return mDpm.getActiveAdminsAsUser(userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaximumFailedPasswordsForWipe(@Nullable ComponentName admin, int userHandle) {
|
||||
return mDpm.getMaximumFailedPasswordsForWipe(admin, userHandle);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ComponentName getDeviceOwnerComponentOnCallingUser() {
|
||||
return mDpm.getDeviceOwnerComponentOnCallingUser();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ComponentName getDeviceOwnerComponentOnAnyUser() {
|
||||
return mDpm.getDeviceOwnerComponentOnAnyUser();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable ComponentName getProfileOwnerAsUser(final int userId) {
|
||||
return mDpm.getProfileOwnerAsUser(userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getDeviceOwnerOrganizationName() {
|
||||
return mDpm.getDeviceOwnerOrganizationName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPermissionGrantState(@Nullable ComponentName admin, String packageName,
|
||||
String permission) {
|
||||
return mDpm.getPermissionGrantState(admin, packageName, permission);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSecurityLoggingEnabled(@Nullable ComponentName admin) {
|
||||
return mDpm.isSecurityLoggingEnabled(admin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNetworkLoggingEnabled(@Nullable ComponentName admin) {
|
||||
return mDpm.isNetworkLoggingEnabled(admin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLastSecurityLogRetrievalTime() {
|
||||
return mDpm.getLastSecurityLogRetrievalTime();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLastBugReportRequestTime() {
|
||||
return mDpm.getLastBugReportRequestTime();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLastNetworkLogRetrievalTime() {
|
||||
return mDpm.getLastNetworkLogRetrievalTime();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCurrentInputMethodSetByOwner() {
|
||||
return mDpm.isCurrentInputMethodSetByOwner();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getOwnerInstalledCaCerts(@NonNull UserHandle user) {
|
||||
return mDpm.getOwnerInstalledCaCerts(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDeviceOwnerAppOnAnyUser(String packageName) {
|
||||
return mDpm.isDeviceOwnerAppOnAnyUser(packageName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean packageHasActiveAdmins(String packageName) {
|
||||
return mDpm.packageHasActiveAdmins(packageName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUninstallInQueue(String packageName) {
|
||||
return mDpm.isUninstallInQueue(packageName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Intent createAdminSupportIntent(@NonNull String restriction) {
|
||||
return mDpm.createAdminSupportIntent(restriction);
|
||||
}
|
||||
}
|
||||
@@ -30,9 +30,10 @@ import android.text.style.ClickableSpan;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.applications.PackageManagerWrapper;
|
||||
import com.android.settings.vpn2.ConnectivityManagerWrapper;
|
||||
import com.android.settings.vpn2.VpnUtils;
|
||||
import com.android.settings.wrapper.ConnectivityManagerWrapper;
|
||||
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@@ -29,8 +29,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.core.InstrumentedFragment;
|
||||
import com.android.settings.password.ChooseLockSettingsHelper;
|
||||
|
||||
import com.android.settings.password.IFingerprintManager;
|
||||
import com.android.settings.wrapper.FingerprintManagerWrapper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
@@ -48,7 +47,7 @@ public class FingerprintEnrollSidecar extends InstrumentedFragment {
|
||||
private byte[] mToken;
|
||||
private boolean mDone;
|
||||
private int mUserId;
|
||||
private IFingerprintManager mFingerprintManager;
|
||||
private FingerprintManagerWrapper mFingerprintManager;
|
||||
private ArrayList<QueuedEvent> mQueuedEvents;
|
||||
|
||||
private abstract class QueuedEvent {
|
||||
|
||||
@@ -280,7 +280,8 @@ public class FingerprintSettings extends SubSettings {
|
||||
}
|
||||
|
||||
private void retryFingerprint() {
|
||||
if (mRemovalSidecar.inProgress()) {
|
||||
if (mRemovalSidecar.inProgress()
|
||||
|| 0 == mFingerprintManager.getEnrolledFingerprints(mUserId).size()) {
|
||||
return;
|
||||
}
|
||||
// Don't start authentication if ChooseLockGeneric is showing, otherwise if the user
|
||||
|
||||
@@ -45,8 +45,7 @@ import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.applications.LayoutPreference;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
import com.android.settings.enterprise.DevicePolicyManagerWrapper;
|
||||
import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
|
||||
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
||||
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
||||
import com.android.settings.fuelgauge.anomaly.AnomalyDialogFragment;
|
||||
import com.android.settings.fuelgauge.anomaly.AnomalyLoader;
|
||||
@@ -194,7 +193,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
|
||||
super.onAttach(activity);
|
||||
|
||||
mState = ApplicationsState.getInstance(getActivity().getApplication());
|
||||
mDpm = new DevicePolicyManagerWrapperImpl(
|
||||
mDpm = new DevicePolicyManagerWrapper(
|
||||
(DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE));
|
||||
mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
|
||||
mPackageManager = activity.getPackageManager();
|
||||
|
||||
@@ -50,9 +50,9 @@ import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settings.enterprise.DevicePolicyManagerWrapper;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.widget.ActionButtonPreference;
|
||||
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
||||
import com.android.settingslib.RestrictedLockUtils;
|
||||
import com.android.settingslib.applications.AppUtils;
|
||||
import com.android.settingslib.applications.ApplicationsState;
|
||||
|
||||
@@ -35,8 +35,7 @@ import com.android.settings.R;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||
import com.android.settings.enterprise.DevicePolicyManagerWrapper;
|
||||
import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
|
||||
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
|
||||
/**
|
||||
@@ -71,7 +70,7 @@ public class BackgroundActivityPreferenceController extends AbstractPreferenceCo
|
||||
mPowerWhitelistBackend = backend;
|
||||
mPackageManager = context.getPackageManager();
|
||||
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
|
||||
mDpm = new DevicePolicyManagerWrapperImpl(
|
||||
mDpm = new DevicePolicyManagerWrapper(
|
||||
(DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE));
|
||||
mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
|
||||
mUid = uid;
|
||||
|
||||
@@ -23,6 +23,8 @@ import android.text.format.DateUtils;
|
||||
import android.util.KeyValueListParser;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.settings.wrapper.KeyValueListParserWrapper;
|
||||
|
||||
/**
|
||||
* Class to store the policy for anomaly detection, which comes from
|
||||
* {@link android.provider.Settings.Global}
|
||||
@@ -104,7 +106,7 @@ public class AnomalyDetectionPolicy {
|
||||
private final KeyValueListParserWrapper mParserWrapper;
|
||||
|
||||
public AnomalyDetectionPolicy(Context context) {
|
||||
this(context, new KeyValueListParserWrapperImpl(new KeyValueListParser(',')));
|
||||
this(context, new KeyValueListParserWrapper(new KeyValueListParser(',')));
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
@@ -122,7 +124,7 @@ public class AnomalyDetectionPolicy {
|
||||
anomalyDetectionEnabled = mParserWrapper.getBoolean(KEY_ANOMALY_DETECTION_ENABLED, true);
|
||||
wakeLockDetectionEnabled = mParserWrapper.getBoolean(KEY_WAKELOCK_DETECTION_ENABLED, true);
|
||||
wakeupAlarmDetectionEnabled = mParserWrapper.getBoolean(KEY_WAKEUP_ALARM_DETECTION_ENABLED,
|
||||
true);
|
||||
false);
|
||||
bluetoothScanDetectionEnabled = mParserWrapper.getBoolean(
|
||||
KEY_BLUETOOTH_SCAN_DETECTION_ENABLED, true);
|
||||
wakeLockThreshold = mParserWrapper.getLong(KEY_WAKELOCK_THRESHOLD,
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.android.settings.fuelgauge.anomaly;
|
||||
|
||||
import android.util.KeyValueListParser;
|
||||
|
||||
/**
|
||||
* Impl of {@link KeyValueListParser}
|
||||
*/
|
||||
public class KeyValueListParserWrapperImpl implements KeyValueListParserWrapper {
|
||||
private KeyValueListParser mParser;
|
||||
|
||||
public KeyValueListParserWrapperImpl(KeyValueListParser parser) {
|
||||
mParser = parser;
|
||||
}
|
||||
|
||||
@Override
|
||||
public KeyValueListParser getKeyValueListParser() {
|
||||
return mParser;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setString(String str) throws IllegalArgumentException {
|
||||
mParser.setString(str);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getBoolean(String key, boolean defaultValue) {
|
||||
return mParser.getBoolean(key, defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLong(String key, long defaultValue) {
|
||||
return mParser.getLong(key, defaultValue);
|
||||
}
|
||||
}
|
||||
@@ -86,7 +86,8 @@ public class LanguageAndInputSettings extends DashboardFragment {
|
||||
|
||||
@Override
|
||||
protected int getPreferenceScreenResId() {
|
||||
return R.xml.language_and_input;
|
||||
return mProgressiveDisclosureMixin.isEnabled()
|
||||
? R.xml.language_and_input : R.xml.language_and_input_new_advance_button;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -26,6 +26,7 @@ import android.telephony.TelephonyManager;
|
||||
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.wrapper.RestrictedLockUtilsWrapper;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settingslib.core.lifecycle.events.OnPause;
|
||||
|
||||
@@ -30,6 +30,7 @@ import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.InstrumentedPreferenceFragment;
|
||||
import com.android.settings.widget.RadioButtonPreference;
|
||||
import com.android.settings.wrapper.NetworkScoreManagerWrapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ import android.support.v7.preference.Preference;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.wrapper.NetworkScoreManagerWrapper;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -109,7 +109,8 @@ public class SoundSettings extends DashboardFragment {
|
||||
|
||||
@Override
|
||||
protected int getPreferenceScreenResId() {
|
||||
return R.xml.sound_settings;
|
||||
return mProgressiveDisclosureMixin.isEnabled()
|
||||
? R.xml.sound_settings : R.xml.sound_settings_new_advance_button;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -25,8 +25,6 @@ import android.support.annotation.Keep;
|
||||
|
||||
import com.android.settings.applications.ApplicationFeatureProvider;
|
||||
import com.android.settings.applications.ApplicationFeatureProviderImpl;
|
||||
import com.android.settings.applications.IPackageManagerWrapperImpl;
|
||||
import com.android.settings.applications.PackageManagerWrapperImpl;
|
||||
import com.android.settings.bluetooth.BluetoothFeatureProvider;
|
||||
import com.android.settings.bluetooth.BluetoothFeatureProviderImpl;
|
||||
import com.android.settings.connecteddevice.SmsMirroringFeatureProvider;
|
||||
@@ -38,7 +36,6 @@ import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
|
||||
import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl;
|
||||
import com.android.settings.datausage.DataPlanFeatureProvider;
|
||||
import com.android.settings.datausage.DataPlanFeatureProviderImpl;
|
||||
import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
|
||||
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
|
||||
import com.android.settings.enterprise.EnterprisePrivacyFeatureProviderImpl;
|
||||
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
|
||||
@@ -53,7 +50,10 @@ import com.android.settings.security.SecurityFeatureProvider;
|
||||
import com.android.settings.security.SecurityFeatureProviderImpl;
|
||||
import com.android.settings.users.UserFeatureProvider;
|
||||
import com.android.settings.users.UserFeatureProviderImpl;
|
||||
import com.android.settings.vpn2.ConnectivityManagerWrapperImpl;
|
||||
import com.android.settings.wrapper.ConnectivityManagerWrapper;
|
||||
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
||||
import com.android.settings.wrapper.IPackageManagerWrapper;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
/**
|
||||
* {@link FeatureFactory} implementation for AOSP Settings.
|
||||
@@ -109,9 +109,9 @@ public class FeatureFactoryImpl extends FeatureFactory {
|
||||
public ApplicationFeatureProvider getApplicationFeatureProvider(Context context) {
|
||||
if (mApplicationFeatureProvider == null) {
|
||||
mApplicationFeatureProvider = new ApplicationFeatureProviderImpl(context,
|
||||
new PackageManagerWrapperImpl(context.getPackageManager()),
|
||||
new IPackageManagerWrapperImpl(AppGlobals.getPackageManager()),
|
||||
new DevicePolicyManagerWrapperImpl((DevicePolicyManager) context
|
||||
new PackageManagerWrapper(context.getPackageManager()),
|
||||
new IPackageManagerWrapper(AppGlobals.getPackageManager()),
|
||||
new DevicePolicyManagerWrapper((DevicePolicyManager) context
|
||||
.getSystemService(Context.DEVICE_POLICY_SERVICE)));
|
||||
}
|
||||
return mApplicationFeatureProvider;
|
||||
@@ -129,11 +129,11 @@ public class FeatureFactoryImpl extends FeatureFactory {
|
||||
public EnterprisePrivacyFeatureProvider getEnterprisePrivacyFeatureProvider(Context context) {
|
||||
if (mEnterprisePrivacyFeatureProvider == null) {
|
||||
mEnterprisePrivacyFeatureProvider = new EnterprisePrivacyFeatureProviderImpl(context,
|
||||
new DevicePolicyManagerWrapperImpl((DevicePolicyManager) context
|
||||
new DevicePolicyManagerWrapper((DevicePolicyManager) context
|
||||
.getSystemService(Context.DEVICE_POLICY_SERVICE)),
|
||||
new PackageManagerWrapperImpl(context.getPackageManager()),
|
||||
new PackageManagerWrapper(context.getPackageManager()),
|
||||
UserManager.get(context),
|
||||
new ConnectivityManagerWrapperImpl((ConnectivityManager) context
|
||||
new ConnectivityManagerWrapper((ConnectivityManager) context
|
||||
.getSystemService(Context.CONNECTIVITY_SERVICE)),
|
||||
context.getResources());
|
||||
}
|
||||
|
||||
@@ -243,7 +243,6 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends OptionsMenuFra
|
||||
try {
|
||||
IActivityManager activityManager = ActivityManager.getService();
|
||||
final ActivityOptions options = ActivityOptions.makeBasic();
|
||||
options.setLaunchStackId(ActivityManager.StackId.INVALID_STACK_ID);
|
||||
activityManager.startActivityFromRecents(taskId, options.toBundle());
|
||||
return;
|
||||
} catch (RemoteException e) {
|
||||
|
||||
@@ -1,39 +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.password;
|
||||
|
||||
import android.hardware.fingerprint.FingerprintManager.EnrollmentCallback;
|
||||
import android.os.CancellationSignal;
|
||||
|
||||
/**
|
||||
* This is the workaround to allow us test {@link SetNewPasswordController} which uses a new hidden
|
||||
* API {@link android.hardware.fingerprint.FingerprintManager#hasEnrolledFingerprints(int)} that
|
||||
* roboelectric does not support yet. Having roboelectic to support latest platform API is tracked
|
||||
* in b/30995831.
|
||||
*/
|
||||
public interface IFingerprintManager {
|
||||
boolean isHardwareDetected();
|
||||
|
||||
boolean hasEnrolledFingerprints(int userId);
|
||||
|
||||
long preEnroll();
|
||||
|
||||
void setActiveUser(int userId);
|
||||
|
||||
void enroll(byte [] token, CancellationSignal cancel, int flags,
|
||||
int userId, EnrollmentCallback callback);
|
||||
}
|
||||
@@ -36,6 +36,7 @@ import android.os.UserManager;
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.widget.LockPatternUtils;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.wrapper.FingerprintManagerWrapper;
|
||||
|
||||
/**
|
||||
* Business logic for {@link SetNewPasswordActivity}.
|
||||
@@ -56,7 +57,7 @@ final class SetNewPasswordController {
|
||||
*/
|
||||
private final int mTargetUserId;
|
||||
private final PackageManager mPackageManager;
|
||||
@Nullable private final IFingerprintManager mFingerprintManager;
|
||||
@Nullable private final FingerprintManagerWrapper mFingerprintManager;
|
||||
private final DevicePolicyManager mDevicePolicyManager;
|
||||
private final Ui mUi;
|
||||
|
||||
@@ -77,7 +78,7 @@ final class SetNewPasswordController {
|
||||
}
|
||||
// Create a wrapper of FingerprintManager for testing, see IFingerPrintManager for details.
|
||||
final FingerprintManager fingerprintManager = Utils.getFingerprintManagerOrNull(context);
|
||||
final IFingerprintManager fingerprintManagerWrapper =
|
||||
final FingerprintManagerWrapper fingerprintManagerWrapper =
|
||||
fingerprintManager == null
|
||||
? null
|
||||
: new FingerprintManagerWrapper(fingerprintManager);
|
||||
@@ -91,7 +92,7 @@ final class SetNewPasswordController {
|
||||
SetNewPasswordController(
|
||||
int targetUserId,
|
||||
PackageManager packageManager,
|
||||
IFingerprintManager fingerprintManager,
|
||||
FingerprintManagerWrapper fingerprintManager,
|
||||
DevicePolicyManager devicePolicyManager,
|
||||
Ui ui) {
|
||||
mTargetUserId = targetUserId;
|
||||
|
||||
@@ -362,4 +362,4 @@ public class DatabaseIndexingManager {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,16 +17,10 @@
|
||||
|
||||
package com.android.settings.search;
|
||||
|
||||
import android.Manifest;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.Log;
|
||||
|
||||
@@ -37,10 +31,8 @@ import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.text.Normalizer;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Utility class for {@like DatabaseIndexingManager} to handle the mapping between Payloads
|
||||
@@ -53,15 +45,6 @@ public class DatabaseIndexingUtils {
|
||||
private static final String FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER =
|
||||
"SEARCH_INDEX_DATA_PROVIDER";
|
||||
|
||||
private static final String NON_BREAKING_HYPHEN = "\u2011";
|
||||
private static final String EMPTY = "";
|
||||
private static final String LIST_DELIMITERS = "[,]\\s*";
|
||||
private static final String HYPHEN = "-";
|
||||
private static final String SPACE = " ";
|
||||
|
||||
private static final Pattern REMOVE_DIACRITICALS_PATTERN
|
||||
= Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
|
||||
|
||||
/**
|
||||
* Builds intent into a subsetting.
|
||||
*/
|
||||
@@ -173,19 +156,4 @@ public class DatabaseIndexingUtils {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String normalizeHyphen(String input) {
|
||||
return (input != null) ? input.replaceAll(NON_BREAKING_HYPHEN, HYPHEN) : EMPTY;
|
||||
}
|
||||
|
||||
public static String normalizeString(String input) {
|
||||
final String nohyphen = (input != null) ? input.replaceAll(HYPHEN, EMPTY) : EMPTY;
|
||||
final String normalized = Normalizer.normalize(nohyphen, Normalizer.Form.NFD);
|
||||
|
||||
return REMOVE_DIACRITICALS_PATTERN.matcher(normalized).replaceAll("").toLowerCase();
|
||||
}
|
||||
|
||||
public static String normalizeKeywords(String input) {
|
||||
return (input != null) ? input.replaceAll(LIST_DELIMITERS, SPACE) : EMPTY;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,9 +34,9 @@ import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.applications.ManageApplications;
|
||||
import com.android.settings.applications.PackageManagerWrapper;
|
||||
import com.android.settings.dashboard.SiteMapManager;
|
||||
import com.android.settings.utils.AsyncLoader;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
|
||||
@@ -21,9 +21,9 @@ import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.settings.applications.PackageManagerWrapperImpl;
|
||||
import com.android.settings.dashboard.SiteMapManager;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
/**
|
||||
* FeatureProvider for the refactored search code.
|
||||
@@ -50,7 +50,7 @@ public class SearchFeatureProviderImpl implements SearchFeatureProvider {
|
||||
@Override
|
||||
public InstalledAppResultLoader getInstalledAppSearchLoader(Context context, String query) {
|
||||
return new InstalledAppResultLoader(
|
||||
context, new PackageManagerWrapperImpl(context.getPackageManager()),
|
||||
context, new PackageManagerWrapper(context.getPackageManager()),
|
||||
cleanQuery(query), getSiteMapManager());
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,9 @@ import com.android.settings.search.ResultPayload;
|
||||
import com.android.settings.search.ResultPayloadUtils;
|
||||
import com.android.settings.search.SearchIndexableResources;
|
||||
|
||||
import java.text.Normalizer;
|
||||
import java.util.Objects;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Data class representing a single row in the Setting Search results database.
|
||||
@@ -38,14 +40,11 @@ public class IndexData {
|
||||
public final String normalizedTitle;
|
||||
public final String updatedSummaryOn;
|
||||
public final String normalizedSummaryOn;
|
||||
public final String updatedSummaryOff;
|
||||
public final String normalizedSummaryOff;
|
||||
public final String entries;
|
||||
public final String className;
|
||||
public final String childClassName;
|
||||
public final String screenTitle;
|
||||
public final int iconResId;
|
||||
public final int rank;
|
||||
public final String spaceDelimitedKeywords;
|
||||
public final String intentAction;
|
||||
public final String intentTargetPackage;
|
||||
@@ -56,21 +55,28 @@ public class IndexData {
|
||||
public final int payloadType;
|
||||
public final byte[] payload;
|
||||
|
||||
private static final String NON_BREAKING_HYPHEN = "\u2011";
|
||||
private static final String EMPTY = "";
|
||||
private static final String HYPHEN = "-";
|
||||
private static final String SPACE = " ";
|
||||
// Regex matching a comma, and any number of subsequent white spaces.
|
||||
private static final String LIST_DELIMITERS = "[,]\\s*";
|
||||
|
||||
private static final Pattern REMOVE_DIACRITICALS_PATTERN
|
||||
= Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
|
||||
|
||||
private IndexData(Builder builder) {
|
||||
locale = builder.mLocale;
|
||||
updatedTitle = builder.mUpdatedTitle;
|
||||
normalizedTitle = builder.mNormalizedTitle;
|
||||
updatedSummaryOn = builder.mUpdatedSummaryOn;
|
||||
normalizedSummaryOn = builder.mNormalizedSummaryOn;
|
||||
updatedSummaryOff = builder.mUpdatedSummaryOff;
|
||||
normalizedSummaryOff = builder.mNormalizedSummaryOff;
|
||||
updatedTitle = normalizeHyphen(builder.mTitle);
|
||||
normalizedTitle = normalizeString(builder.mTitle);
|
||||
updatedSummaryOn = normalizeHyphen(builder.mSummaryOn);
|
||||
normalizedSummaryOn = normalizeString(builder.mSummaryOn);
|
||||
entries = builder.mEntries;
|
||||
className = builder.mClassName;
|
||||
childClassName = builder.mChildClassName;
|
||||
screenTitle = builder.mScreenTitle;
|
||||
iconResId = builder.mIconResId;
|
||||
rank = builder.mRank;
|
||||
spaceDelimitedKeywords = builder.mSpaceDelimitedKeywords;
|
||||
spaceDelimitedKeywords = normalizeKeywords(builder.mKeywords);
|
||||
intentAction = builder.mIntentAction;
|
||||
intentTargetPackage = builder.mIntentTargetPackage;
|
||||
intentTargetClass = builder.mIntentTargetClass;
|
||||
@@ -93,21 +99,49 @@ public class IndexData {
|
||||
: key.hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return new StringBuilder(updatedTitle)
|
||||
.append(": ")
|
||||
.append(updatedSummaryOn)
|
||||
.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* In the list of keywords, replace the comma and all subsequent whitespace with a single space.
|
||||
*/
|
||||
public static String normalizeKeywords(String input) {
|
||||
return (input != null) ? input.replaceAll(LIST_DELIMITERS, SPACE) : EMPTY;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@param input} where all non-standard hyphens are replaced by normal hyphens.
|
||||
*/
|
||||
public static String normalizeHyphen(String input) {
|
||||
return (input != null) ? input.replaceAll(NON_BREAKING_HYPHEN, HYPHEN) : EMPTY;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@param input} with all hyphens removed, and all letters lower case.
|
||||
*/
|
||||
public static String normalizeString(String input) {
|
||||
final String normalizedHypen = normalizeHyphen(input);
|
||||
final String nohyphen = (input != null) ? normalizedHypen.replaceAll(HYPHEN, EMPTY) : EMPTY;
|
||||
final String normalized = Normalizer.normalize(nohyphen, Normalizer.Form.NFD);
|
||||
|
||||
return REMOVE_DIACRITICALS_PATTERN.matcher(normalized).replaceAll("").toLowerCase();
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
private String mLocale;
|
||||
private String mUpdatedTitle;
|
||||
private String mNormalizedTitle;
|
||||
private String mUpdatedSummaryOn;
|
||||
private String mNormalizedSummaryOn;
|
||||
private String mUpdatedSummaryOff;
|
||||
private String mNormalizedSummaryOff;
|
||||
private String mTitle;
|
||||
private String mSummaryOn;
|
||||
private String mEntries;
|
||||
private String mClassName;
|
||||
private String mChildClassName;
|
||||
private String mScreenTitle;
|
||||
private int mIconResId;
|
||||
private int mRank;
|
||||
private String mSpaceDelimitedKeywords;
|
||||
private String mKeywords;
|
||||
private String mIntentAction;
|
||||
private String mIntentTargetPackage;
|
||||
private String mIntentTargetClass;
|
||||
@@ -123,33 +157,13 @@ public class IndexData {
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setUpdatedTitle(String updatedTitle) {
|
||||
mUpdatedTitle = updatedTitle;
|
||||
public Builder setTitle(String title) {
|
||||
mTitle = title;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setNormalizedTitle(String normalizedTitle) {
|
||||
mNormalizedTitle = normalizedTitle;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setUpdatedSummaryOn(String updatedSummaryOn) {
|
||||
mUpdatedSummaryOn = updatedSummaryOn;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setNormalizedSummaryOn(String normalizedSummaryOn) {
|
||||
mNormalizedSummaryOn = normalizedSummaryOn;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setUpdatedSummaryOff(String updatedSummaryOff) {
|
||||
mUpdatedSummaryOff = updatedSummaryOff;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setNormalizedSummaryOff(String normalizedSummaryOff) {
|
||||
this.mNormalizedSummaryOff = normalizedSummaryOff;
|
||||
public Builder setSummaryOn(String summaryOn) {
|
||||
mSummaryOn = summaryOn;
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -178,13 +192,8 @@ public class IndexData {
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setRank(int rank) {
|
||||
mRank = rank;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setSpaceDelimitedKeywords(String spaceDelimitedKeywords) {
|
||||
mSpaceDelimitedKeywords = spaceDelimitedKeywords;
|
||||
public Builder setKeywords(String keywords) {
|
||||
mKeywords = keywords;
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -260,8 +269,8 @@ public class IndexData {
|
||||
boolean isEmptyIntentAction = TextUtils.isEmpty(mIntentAction);
|
||||
// No intent action is set, or the intent action is for a subsetting.
|
||||
if (isEmptyIntentAction
|
||||
|| (!isEmptyIntentAction && TextUtils.equals(mIntentTargetPackage,
|
||||
SearchIndexableResources.SUBSETTING_TARGET_PACKAGE))) {
|
||||
|| TextUtils.equals(mIntentTargetPackage,
|
||||
SearchIndexableResources.SUBSETTING_TARGET_PACKAGE)) {
|
||||
// Action is null, we will launch it as a sub-setting
|
||||
intent = DatabaseIndexingUtils.buildSubsettingIntent(context, mClassName, mKey,
|
||||
mScreenTitle);
|
||||
|
||||
@@ -147,12 +147,14 @@ public class IndexDataConverter {
|
||||
}
|
||||
|
||||
IndexData.Builder builder = new IndexData.Builder();
|
||||
builder.setLocale(localeStr)
|
||||
builder.setTitle(raw.title)
|
||||
.setSummaryOn(raw.summaryOn)
|
||||
.setLocale(localeStr)
|
||||
.setEntries(raw.entries)
|
||||
.setKeywords(raw.keywords)
|
||||
.setClassName(raw.className)
|
||||
.setScreenTitle(raw.screenTitle)
|
||||
.setIconResId(raw.iconResId)
|
||||
.setRank(raw.rank)
|
||||
.setIntentAction(raw.intentAction)
|
||||
.setIntentTargetPackage(raw.intentTargetPackage)
|
||||
.setIntentTargetClass(raw.intentTargetClass)
|
||||
@@ -160,8 +162,7 @@ public class IndexDataConverter {
|
||||
.setKey(raw.key)
|
||||
.setUserId(raw.userId);
|
||||
|
||||
updateOneRowWithFilteredData(builder, raw.title, raw.summaryOn, raw.summaryOff,
|
||||
raw.keywords);
|
||||
updateOneRow(builder.build(mContext));
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
@@ -249,7 +250,6 @@ public class IndexDataConverter {
|
||||
ResultPayload payload;
|
||||
boolean enabled;
|
||||
final String fragmentName = sir.className;
|
||||
final int rank = sir.rank;
|
||||
final String intentAction = sir.intentAction;
|
||||
final String intentTargetPackage = sir.intentTargetPackage;
|
||||
final String intentTargetClass = sir.intentTargetClass;
|
||||
@@ -271,11 +271,12 @@ public class IndexDataConverter {
|
||||
|
||||
// TODO: Set payload type for header results
|
||||
IndexData.Builder headerBuilder = new IndexData.Builder();
|
||||
headerBuilder.setLocale(localeStr)
|
||||
.setEntries(null)
|
||||
headerBuilder.setTitle(headerTitle)
|
||||
.setSummaryOn(headerSummary)
|
||||
.setKeywords(headerKeywords)
|
||||
.setLocale(localeStr)
|
||||
.setClassName(fragmentName)
|
||||
.setScreenTitle(screenTitle)
|
||||
.setRank(rank)
|
||||
.setIntentAction(intentAction)
|
||||
.setIntentTargetPackage(intentTargetPackage)
|
||||
.setIntentTargetClass(intentTargetClass)
|
||||
@@ -306,11 +307,12 @@ public class IndexDataConverter {
|
||||
}
|
||||
|
||||
builder = new IndexData.Builder();
|
||||
builder.setLocale(localeStr)
|
||||
builder.setTitle(title)
|
||||
.setLocale(localeStr)
|
||||
.setKeywords(keywords)
|
||||
.setClassName(fragmentName)
|
||||
.setScreenTitle(screenTitle)
|
||||
.setIconResId(iconResId)
|
||||
.setRank(rank)
|
||||
.setIntentAction(intentAction)
|
||||
.setIntentTargetPackage(intentTargetPackage)
|
||||
.setIntentTargetClass(intentTargetClass)
|
||||
@@ -331,14 +333,17 @@ public class IndexDataConverter {
|
||||
payload = DatabaseIndexingUtils.getPayloadFromUriMap(controllerUriMap, key);
|
||||
childFragment = XmlParserUtils.getDataChildFragment(context, attrs);
|
||||
|
||||
builder.setEntries(entries)
|
||||
builder.setSummaryOn(summary)
|
||||
.setEntries(entries)
|
||||
.setChildClassName(childFragment)
|
||||
.setPayload(payload);
|
||||
|
||||
// Insert rows for the child nodes of PreferenceScreen
|
||||
updateOneRowWithFilteredData(builder, title, summary,
|
||||
null /* summary off */, keywords);
|
||||
updateOneRow(builder.build(mContext));
|
||||
} else {
|
||||
// TODO (b/33577327) We removed summary off here. We should check if we can
|
||||
// merge this 'else' section with the one above. Put a break point to
|
||||
// investigate.
|
||||
String summaryOn = XmlParserUtils.getDataSummaryOn(context, attrs);
|
||||
String summaryOff = XmlParserUtils.getDataSummaryOff(context, attrs);
|
||||
|
||||
@@ -346,15 +351,15 @@ public class IndexDataConverter {
|
||||
summaryOn = XmlParserUtils.getDataSummary(context, attrs);
|
||||
}
|
||||
|
||||
updateOneRowWithFilteredData(builder, title, summaryOn, summaryOff,
|
||||
keywords);
|
||||
builder.setSummaryOn(summaryOn);
|
||||
|
||||
updateOneRow(builder.build(mContext));
|
||||
}
|
||||
}
|
||||
|
||||
// The xml header's title does not match the title of one of the child settings.
|
||||
if (isHeaderUnique) {
|
||||
updateOneRowWithFilteredData(headerBuilder, headerTitle, headerSummary,
|
||||
null /* summary off */, headerKeywords);
|
||||
updateOneRow(headerBuilder.build(mContext));
|
||||
}
|
||||
} catch (XmlPullParserException e) {
|
||||
throw new RuntimeException("Error parsing PreferenceScreen", e);
|
||||
@@ -394,8 +399,11 @@ public class IndexDataConverter {
|
||||
boolean enabled = !nonIndexableKeys.contains(raw.key);
|
||||
|
||||
IndexData.Builder builder = new IndexData.Builder();
|
||||
builder.setLocale(localeStr)
|
||||
builder.setTitle(raw.title)
|
||||
.setSummaryOn(raw.summaryOn)
|
||||
.setLocale(localeStr)
|
||||
.setEntries(raw.entries)
|
||||
.setKeywords(raw.keywords)
|
||||
.setClassName(className)
|
||||
.setScreenTitle(raw.screenTitle)
|
||||
.setIconResId(raw.iconResId)
|
||||
@@ -406,8 +414,7 @@ public class IndexDataConverter {
|
||||
.setKey(raw.key)
|
||||
.setUserId(raw.userId);
|
||||
|
||||
updateOneRowWithFilteredData(builder, raw.title, raw.summaryOn, raw.summaryOff,
|
||||
raw.keywords);
|
||||
updateOneRow(builder.build(mContext));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -438,32 +445,6 @@ public class IndexDataConverter {
|
||||
}
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
void updateOneRowWithFilteredData(IndexData.Builder builder,
|
||||
String title, String summaryOn, String summaryOff, String keywords) {
|
||||
|
||||
final String updatedTitle = DatabaseIndexingUtils.normalizeHyphen(title);
|
||||
final String updatedSummaryOn = DatabaseIndexingUtils.normalizeHyphen(summaryOn);
|
||||
final String updatedSummaryOff = DatabaseIndexingUtils.normalizeHyphen(summaryOff);
|
||||
|
||||
final String normalizedTitle = DatabaseIndexingUtils.normalizeString(updatedTitle);
|
||||
final String normalizedSummaryOn = DatabaseIndexingUtils.normalizeString(updatedSummaryOn);
|
||||
final String normalizedSummaryOff = DatabaseIndexingUtils
|
||||
.normalizeString(updatedSummaryOff);
|
||||
|
||||
final String spaceDelimitedKeywords = DatabaseIndexingUtils.normalizeKeywords(keywords);
|
||||
|
||||
builder.setUpdatedTitle(updatedTitle)
|
||||
.setUpdatedSummaryOn(updatedSummaryOn)
|
||||
.setUpdatedSummaryOff(updatedSummaryOff)
|
||||
.setNormalizedTitle(normalizedTitle)
|
||||
.setNormalizedSummaryOn(normalizedSummaryOn)
|
||||
.setNormalizedSummaryOff(normalizedSummaryOff)
|
||||
.setSpaceDelimitedKeywords(spaceDelimitedKeywords);
|
||||
|
||||
updateOneRow(builder.build(mContext));
|
||||
}
|
||||
|
||||
private void updateOneRow(IndexData row) {
|
||||
if (TextUtils.isEmpty(row.updatedTitle)) {
|
||||
return;
|
||||
@@ -472,13 +453,10 @@ public class IndexDataConverter {
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(IndexDatabaseHelper.IndexColumns.DOCID, row.getDocId());
|
||||
values.put(LOCALE, row.locale);
|
||||
values.put(DATA_RANK, row.rank);
|
||||
values.put(DATA_TITLE, row.updatedTitle);
|
||||
values.put(DATA_TITLE_NORMALIZED, row.normalizedTitle);
|
||||
values.put(DATA_SUMMARY_ON, row.updatedSummaryOn);
|
||||
values.put(DATA_SUMMARY_ON_NORMALIZED, row.normalizedSummaryOn);
|
||||
values.put(DATA_SUMMARY_OFF, row.updatedSummaryOff);
|
||||
values.put(DATA_SUMMARY_OFF_NORMALIZED, row.normalizedSummaryOff);
|
||||
values.put(DATA_ENTRIES, row.entries);
|
||||
values.put(DATA_KEYWORDS, row.spaceDelimitedKeywords);
|
||||
values.put(CLASS_NAME, row.className);
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.android.settings.vpn2;
|
||||
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.ConnectivityManager.NetworkCallback;
|
||||
import android.net.Network;
|
||||
import android.net.NetworkRequest;
|
||||
import android.os.Handler;
|
||||
import android.net.ProxyInfo;
|
||||
|
||||
public class ConnectivityManagerWrapperImpl implements ConnectivityManagerWrapper {
|
||||
|
||||
private final ConnectivityManager mCm;
|
||||
|
||||
public ConnectivityManagerWrapperImpl(ConnectivityManager cm) {
|
||||
mCm = cm;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConnectivityManager getConnectivityManager() {
|
||||
return mCm;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAlwaysOnVpnPackageForUser(int userId) {
|
||||
return mCm.getAlwaysOnVpnPackageForUser(userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProxyInfo getGlobalProxy() {
|
||||
return mCm.getGlobalProxy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerNetworkCallback(NetworkRequest request, NetworkCallback callback,
|
||||
Handler handler) {
|
||||
mCm.registerNetworkCallback(request, callback, handler);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startCaptivePortalApp(Network network) {
|
||||
mCm.startCaptivePortalApp(network);
|
||||
}
|
||||
}
|
||||
@@ -27,6 +27,7 @@ import android.util.Log;
|
||||
|
||||
import com.android.internal.net.LegacyVpnInfo;
|
||||
import com.android.internal.net.VpnConfig;
|
||||
import com.android.settings.wrapper.ConnectivityManagerWrapper;
|
||||
|
||||
/**
|
||||
* Utility functions for vpn.
|
||||
|
||||
@@ -30,9 +30,10 @@ import android.text.TextUtils;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.applications.PackageManagerWrapper;
|
||||
import com.android.settings.applications.defaultapps.DefaultAppInfo;
|
||||
import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
|
||||
import com.android.settings.wrapper.UserPackageWrapper;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -28,6 +28,8 @@ import android.webkit.WebViewProviderInfo;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.wrapper.UserPackageWrapper;
|
||||
import com.android.settings.wrapper.UserPackageWrapperImpl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -28,12 +28,12 @@ import android.provider.SearchIndexableResource;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
import com.android.settings.network.NetworkScoreManagerWrapper;
|
||||
import com.android.settings.network.NetworkScorerPickerPreferenceController;
|
||||
import com.android.settings.network.WifiCallingPreferenceController;
|
||||
import com.android.settings.search.BaseSearchIndexProvider;
|
||||
import com.android.settings.search.Indexable;
|
||||
import com.android.settings.wifi.p2p.WifiP2pPreferenceController;
|
||||
import com.android.settings.wrapper.NetworkScoreManagerWrapper;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
@@ -21,7 +21,7 @@ import android.text.TextUtils;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.network.NetworkScoreManagerWrapper;
|
||||
import com.android.settings.wrapper.NetworkScoreManagerWrapper;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
|
||||
@@ -35,6 +35,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settings.widget.SwitchWidgetController;
|
||||
import com.android.settings.wrapper.ConnectivityManagerWrapper;
|
||||
import com.android.settingslib.RestrictedLockUtils;
|
||||
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
|
||||
import com.android.settingslib.WirelessUtils;
|
||||
|
||||
@@ -65,6 +65,7 @@ import com.android.settings.search.SearchIndexableRaw;
|
||||
import com.android.settings.widget.SummaryUpdater.OnSummaryChangeListener;
|
||||
import com.android.settings.widget.SwitchBarController;
|
||||
import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
|
||||
import com.android.settings.wrapper.WifiManagerWrapper;
|
||||
import com.android.settingslib.RestrictedLockUtils;
|
||||
import com.android.settingslib.wifi.AccessPoint;
|
||||
import com.android.settingslib.wifi.AccessPoint.AccessPointListener;
|
||||
|
||||
@@ -29,7 +29,7 @@ import android.text.TextUtils;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.network.NetworkScoreManagerWrapper;
|
||||
import com.android.settings.wrapper.NetworkScoreManagerWrapper;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.nfc.FormatException;
|
||||
import android.nfc.NdefMessage;
|
||||
import android.nfc.NdefRecord;
|
||||
@@ -43,6 +42,7 @@ import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.wrapper.WifiManagerWrapper;
|
||||
import com.android.settingslib.wifi.AccessPoint;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@@ -57,12 +57,12 @@ import com.android.settings.Utils;
|
||||
import com.android.settings.applications.LayoutPreference;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settings.vpn2.ConnectivityManagerWrapper;
|
||||
import com.android.settings.widget.ActionButtonPreference;
|
||||
import com.android.settings.widget.EntityHeaderController;
|
||||
import com.android.settings.wifi.WifiDetailPreference;
|
||||
import com.android.settings.wifi.WifiDialog;
|
||||
import com.android.settings.wifi.WifiDialog.WifiDialogListener;
|
||||
import com.android.settings.wrapper.ConnectivityManagerWrapper;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
|
||||
@@ -31,9 +31,9 @@ import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
import com.android.settings.vpn2.ConnectivityManagerWrapperImpl;
|
||||
import com.android.settings.wifi.WifiConfigUiBase;
|
||||
import com.android.settings.wifi.WifiDialog;
|
||||
import com.android.settings.wrapper.ConnectivityManagerWrapper;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.wifi.AccessPoint;
|
||||
import java.util.ArrayList;
|
||||
@@ -117,7 +117,7 @@ public class WifiNetworkDetailsFragment extends DashboardFragment {
|
||||
ConnectivityManager cm = context.getSystemService(ConnectivityManager.class);
|
||||
mWifiDetailPreferenceController = WifiDetailPreferenceController.newInstance(
|
||||
mAccessPoint,
|
||||
new ConnectivityManagerWrapperImpl(cm),
|
||||
new ConnectivityManagerWrapper(cm),
|
||||
context,
|
||||
this,
|
||||
new Handler(Looper.getMainLooper()), // UI thread.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user