release-request-5cce6180-1979-44b8-a969-842cd4c8a044-for-git_pi-release-4342840 snap-temp-L74000000103414049

Change-Id: If8ca043ad02010f90dbef104365a9bc5f9bfba4e
This commit is contained in:
android-build-team Robot
2017-09-16 08:13:29 +00:00
193 changed files with 4791 additions and 1365 deletions

View File

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

View File

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

File diff suppressed because it is too large Load Diff

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

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

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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;
}
}
/**

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -362,4 +362,4 @@ public class DatabaseIndexingManager {
}
}
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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