Merge "Import translations. DO NOT MERGE" into pi-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 72dc31f..39f641c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3786,8 +3786,8 @@
<string name="disable_text">Disable</string>
<!-- [CHAR LIMIT=25] Manage applications, individual application info screen, button label under Storage heading. Button to re-enable an existing application. -->
<string name="enable_text">Enable</string>
- <!-- Manage applications, individual application info screen, button label under Storage heading. Button to clear all data associated with tis app (for exampel, remove all cached emails for an Email app) -->
- <string name="clear_user_data_text">Clear data</string>
+ <!-- Manage applications, individual application info screen, button label under Storage heading. Button to clear all data associated with tis app (for example, remove all cached emails for an Email app) -->
+ <string name="clear_user_data_text">Clear storage</string>
<!-- Manage applications, restore updated system application to factory version -->
<string name="app_factory_reset">Uninstall updates</string>
<!-- Manage applications, individual application info screen, screen, message text under Launch by default heading. This is present if the app is set as a default for some actions. -->
@@ -3883,12 +3883,8 @@
<string name="app_not_found_dlg_title"></string>
<!-- Manage applications, individual application dialog box message. Shown when the user somehow got into a state where it wants to manage some app that isn't found. -->
<string name="app_not_found_dlg_text"> The app wasn\u2019t found in the list of installed apps.</string>
- <!-- Manage applications, individual application dialog box message. Shown when there was an error trying to clear the data. -->
- <string name="clear_data_failed">Couldn\u2019t clear app data.</string>
- <!-- Manage applications, title for dialog if clear data fails-->
- <string name="clear_failed_dlg_title">Clear data</string>
<!-- Manage applications, text for dialog if clear data fails-->
- <string name="clear_failed_dlg_text">Couldn\u2019t clear data for app.</string>
+ <string name="clear_failed_dlg_text">Couldn\u2019t clear storage for app.</string>
<!-- Manage applications, individual application info screen, text that appears under the "Permissions" heading. This describes the permissions that the application has. -->
<string name="security_settings_desc" product="tablet">This app can access the following on your tablet:</string>
<!-- Manage applications, individual application info screen, text that appears under the "Permissions" heading. This describes the permissions that the application has. -->
diff --git a/res/xml/accessibility_vibration_settings.xml b/res/xml/accessibility_vibration_settings.xml
index d24834a..2228f29 100644
--- a/res/xml/accessibility_vibration_settings.xml
+++ b/res/xml/accessibility_vibration_settings.xml
@@ -14,17 +14,21 @@
limitations under the License.
-->
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:key="accessibility_settings_vibration_screen"
- android:title="@string/accessibility_vibration_settings_title">
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:key="accessibility_settings_vibration_screen"
+ android:title="@string/accessibility_vibration_settings_title">
<Preference
android:fragment="com.android.settings.accessibility.NotificationVibrationPreferenceFragment"
android:key="notification_vibration_preference_screen"
- android:title="@string/accessibility_notification_vibration_title" />
+ android:title="@string/accessibility_notification_vibration_title"
+ app:controller="com.android.settings.accessibility.NotificationVibrationIntensityPreferenceController" />
<Preference
android:fragment="com.android.settings.accessibility.TouchVibrationPreferenceFragment"
android:key="touch_vibration_preference_screen"
- android:title="@string/accessibility_touch_vibration_title" />
+ android:title="@string/accessibility_touch_vibration_title"
+ app:controller="com.android.settings.accessibility.HapticFeedbackIntensityPreferenceController" />
</PreferenceScreen>
diff --git a/res/xml/accounts_dashboard_settings.xml b/res/xml/accounts_dashboard_settings.xml
index 1e29d0a..6b5f825 100644
--- a/res/xml/accounts_dashboard_settings.xml
+++ b/res/xml/accounts_dashboard_settings.xml
@@ -23,6 +23,25 @@
<PreferenceCategory
android:key="dashboard_tile_placeholder"
- android:order="200"/>
+ android:order="30"/>
+
+ <SwitchPreference
+ android:key="auto_sync_account_data"
+ android:title="@string/auto_sync_account_title"
+ android:summary="@string/auto_sync_account_summary"
+ android:order="102"
+ settings:allowDividerAbove="true"/>
+
+ <SwitchPreference
+ android:key="auto_sync_work_account_data"
+ android:title="@string/account_settings_menu_auto_sync_work"
+ android:summary="@string/auto_sync_account_summary"
+ android:order="103"/>
+
+ <SwitchPreference
+ android:key="auto_sync_personal_account_data"
+ android:title="@string/account_settings_menu_auto_sync_personal"
+ android:summary="@string/auto_sync_account_summary"
+ android:order="104"/>
</PreferenceScreen>
diff --git a/res/xml/connected_devices.xml b/res/xml/connected_devices.xml
index 227dee2..9b84a43 100644
--- a/res/xml/connected_devices.xml
+++ b/res/xml/connected_devices.xml
@@ -28,13 +28,15 @@
android:key="saved_device_list"
android:title="@string/connected_device_saved_title"/>
- <Preference
+ <com.android.settingslib.RestrictedPreference
android:fragment="com.android.settings.bluetooth.BluetoothPairingDetail"
android:key="add_bt_devices"
android:title="@string/connected_device_add_device_title"
android:icon="@drawable/ic_menu_add"
android:summary="@string/connected_device_add_device_summary"
- settings:allowDividerAbove="true"/>
+ settings:allowDividerAbove="true"
+ settings:userRestriction="no_config_bluetooth"
+ settings:useAdminDisabledSummary="true"/>
<Preference
android:fragment="com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment"
diff --git a/res/xml/user_settings.xml b/res/xml/user_settings.xml
index 32b46d9..7fa735d 100644
--- a/res/xml/user_settings.xml
+++ b/res/xml/user_settings.xml
@@ -16,7 +16,6 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="user_settings_screen"
android:title="@string/user_settings_title">
@@ -32,25 +31,6 @@
android:icon="@drawable/ic_menu_add"
android:order="20"/>
- <SwitchPreference
- android:key="auto_sync_account_data"
- android:title="@string/auto_sync_account_title"
- android:summary="@string/auto_sync_account_summary"
- android:order="102"
- settings:allowDividerAbove="true"/>
-
- <SwitchPreference
- android:key="auto_sync_work_account_data"
- android:title="@string/account_settings_menu_auto_sync_work"
- android:summary="@string/auto_sync_account_summary"
- android:order="103"/>
-
- <SwitchPreference
- android:key="auto_sync_personal_account_data"
- android:title="@string/account_settings_menu_auto_sync_personal"
- android:summary="@string/auto_sync_account_summary"
- android:order="104"/>
-
<com.android.settingslib.RestrictedSwitchPreference
android:key="user_settings_add_users_when_locked"
android:title="@string/user_add_on_lockscreen_menu"
diff --git a/src/com/android/settings/accessibility/VibrationSettings.java b/src/com/android/settings/accessibility/VibrationSettings.java
index 4b19d93..83a5af6 100644
--- a/src/com/android/settings/accessibility/VibrationSettings.java
+++ b/src/com/android/settings/accessibility/VibrationSettings.java
@@ -23,8 +23,6 @@
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
import java.util.ArrayList;
import java.util.List;
@@ -51,28 +49,6 @@
return TAG;
}
- @Override
- protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
- return buildControllers(context, getLifecycle());
- }
-
- public static List<AbstractPreferenceController> buildControllers(Context context,
- Lifecycle lifecycle) {
-
- final List<AbstractPreferenceController> controllers = new ArrayList<>();
- final NotificationVibrationIntensityPreferenceController notifVibPrefController =
- new NotificationVibrationIntensityPreferenceController(context);
- final HapticFeedbackIntensityPreferenceController hapticPreferenceController =
- new HapticFeedbackIntensityPreferenceController(context);
- controllers.add(hapticPreferenceController);
- controllers.add(notifVibPrefController);
- if (lifecycle != null) {
- lifecycle.addObserver(hapticPreferenceController);
- lifecycle.addObserver(notifVibPrefController);
- }
- return controllers;
- }
-
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
@@ -84,11 +60,5 @@
indexables.add(indexable);
return indexables;
}
-
- @Override
- public List<AbstractPreferenceController> createPreferenceControllers(
- Context context) {
- return buildControllers(context, null /* lifecycle */);
- }
};
}
diff --git a/src/com/android/settings/accounts/AccountDashboardFragment.java b/src/com/android/settings/accounts/AccountDashboardFragment.java
index cab5dab..b976940 100644
--- a/src/com/android/settings/accounts/AccountDashboardFragment.java
+++ b/src/com/android/settings/accounts/AccountDashboardFragment.java
@@ -29,6 +29,9 @@
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.users.AutoSyncDataPreferenceController;
+import com.android.settings.users.AutoSyncPersonalDataPreferenceController;
+import com.android.settings.users.AutoSyncWorkDataPreferenceController;
import com.android.settingslib.accounts.AuthenticatorHelper;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -69,6 +72,9 @@
new AccountPreferenceController(context, this, authorities);
getLifecycle().addObserver(accountPrefController);
controllers.add(accountPrefController);
+ controllers.add(new AutoSyncDataPreferenceController(context, this /*parent */));
+ controllers.add(new AutoSyncPersonalDataPreferenceController(context, this /*parent */));
+ controllers.add(new AutoSyncWorkDataPreferenceController(context, this /* parent */));
return controllers;
}
diff --git a/src/com/android/settings/applications/AppStorageSettings.java b/src/com/android/settings/applications/AppStorageSettings.java
index ff036bb..7382d20 100644
--- a/src/com/android/settings/applications/AppStorageSettings.java
+++ b/src/com/android/settings/applications/AppStorageSettings.java
@@ -28,7 +28,6 @@
import android.content.DialogInterface;
import android.content.Intent;
import android.content.Loader;
-import android.content.UriPermission;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageDataObserver;
import android.content.pm.PackageManager;
@@ -487,7 +486,7 @@
.create();
case DLG_CANNOT_CLEAR_DATA:
return new AlertDialog.Builder(getActivity())
- .setTitle(getActivity().getText(R.string.clear_failed_dlg_title))
+ .setTitle(getActivity().getText(R.string.clear_user_data_text))
.setMessage(getActivity().getText(R.string.clear_failed_dlg_text))
.setNeutralButton(R.string.dlg_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
diff --git a/src/com/android/settings/core/BasePreferenceController.java b/src/com/android/settings/core/BasePreferenceController.java
index 9145c3c..391dafc 100644
--- a/src/com/android/settings/core/BasePreferenceController.java
+++ b/src/com/android/settings/core/BasePreferenceController.java
@@ -34,8 +34,6 @@
* Abstract class to consolidate utility between preference controllers and act as an interface
* for Slices. The abstract classes that inherit from this class will act as the direct interfaces
* for each type when plugging into Slices.
- *
- * TODO (b/73074893) Add Lifecycle Setting method.
*/
public abstract class BasePreferenceController extends AbstractPreferenceController {
diff --git a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
index 1433008..e41a94b 100644
--- a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
@@ -74,6 +74,7 @@
final AppOpsManager.PackageOps packageOps = packageOpsList.get(i);
mAppInfos.add(new AppInfo.Builder()
.setPackageName(packageOps.getPackageName())
+ .setUid(packageOps.getUid())
.build());
}
diff --git a/src/com/android/settings/fuelgauge/RestrictedAppDetails.java b/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
index 0843c98..8881800 100644
--- a/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
+++ b/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
@@ -130,19 +130,15 @@
appInfo.packageName, 0 /* flags */);
checkBoxPreference.setChecked(true);
checkBoxPreference.setTitle(mPackageManager.getApplicationLabel(applicationInfo));
- checkBoxPreference.setKey(appInfo.packageName);
checkBoxPreference.setIcon(
Utils.getBadgedIcon(mIconDrawableFactory, mPackageManager,
appInfo.packageName,
- UserHandle.getUserId(
- mBatteryUtils.getPackageUid(appInfo.packageName))));
+ UserHandle.getUserId(appInfo.uid)));
checkBoxPreference.setOnPreferenceChangeListener((pref, value) -> {
// change the toggle
final int mode = (Boolean) value ? AppOpsManager.MODE_IGNORED
: AppOpsManager.MODE_ALLOWED;
- final String packageName = pref.getKey();
- final int uid = mBatteryUtils.getPackageUid(packageName);
- mBatteryUtils.setForceAppStandby(uid, packageName, mode);
+ mBatteryUtils.setForceAppStandby(appInfo.uid, appInfo.packageName, mode);
return true;
});
mRestrictedAppListGroup.addPreference(checkBoxPreference);
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
index ff71525..83a79bc 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
@@ -41,6 +41,7 @@
import com.android.internal.os.BatteryStatsHelper;
import com.android.settings.R;
import com.android.settings.fuelgauge.BatteryUtils;
+import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
import com.android.settingslib.utils.ThreadUtils;
import java.util.List;
@@ -81,11 +82,12 @@
final BatteryStatsHelper batteryStatsHelper = new BatteryStatsHelper(this,
true /* collectBatteryBroadcast */);
final UserManager userManager = getSystemService(UserManager.class);
+ final PowerWhitelistBackend powerWhitelistBackend = PowerWhitelistBackend.getInstance();
for (JobWorkItem item = params.dequeueWork(); item != null;
item = params.dequeueWork()) {
saveAnomalyToDatabase(batteryStatsHelper, userManager, batteryDatabaseManager,
- batteryUtils, policy, contentResolver,
+ batteryUtils, policy, powerWhitelistBackend, contentResolver,
item.getIntent().getExtras());
}
jobFinished(params, false /* wantsReschedule */);
@@ -102,7 +104,8 @@
@VisibleForTesting
void saveAnomalyToDatabase(BatteryStatsHelper batteryStatsHelper, UserManager userManager,
BatteryDatabaseManager databaseManager, BatteryUtils batteryUtils,
- BatteryTipPolicy policy, ContentResolver contentResolver, Bundle bundle) {
+ BatteryTipPolicy policy, PowerWhitelistBackend powerWhitelistBackend,
+ ContentResolver contentResolver, Bundle bundle) {
// The Example of intentDimsValue is: 35:{1:{1:{1:10013|}|}|}
final StatsDimensionsValue intentDimsValue =
bundle.getParcelable(StatsManager.EXTRA_STATS_DIMENSIONS_VALUE);
@@ -119,24 +122,25 @@
final boolean smartBatteryOn = Settings.Global.getInt(contentResolver,
Settings.Global.APP_STANDBY_ENABLED, ON) == ON;
final String packageName = batteryUtils.getPackageName(uid);
-
- if (anomalyType == StatsManagerConfig.AnomalyType.EXCESSIVE_BG) {
- // TODO(b/72385333): check battery percentage draining in batterystats
- if (batteryUtils.isLegacyApp(packageName) && batteryUtils.isAppHeavilyUsed(
- batteryStatsHelper, userManager, uid,
- policy.excessiveBgDrainPercentage)) {
- Log.e(TAG, "Excessive detected uid=" + uid);
- batteryUtils.setForceAppStandby(uid, packageName,
- AppOpsManager.MODE_IGNORED);
+ if (!powerWhitelistBackend.isSysWhitelisted(packageName)) {
+ if (anomalyType == StatsManagerConfig.AnomalyType.EXCESSIVE_BG) {
+ // TODO(b/72385333): check battery percentage draining in batterystats
+ if (batteryUtils.isLegacyApp(packageName) && batteryUtils.isAppHeavilyUsed(
+ batteryStatsHelper, userManager, uid,
+ policy.excessiveBgDrainPercentage)) {
+ Log.e(TAG, "Excessive detected uid=" + uid);
+ batteryUtils.setForceAppStandby(uid, packageName,
+ AppOpsManager.MODE_IGNORED);
+ databaseManager.insertAnomaly(uid, packageName, anomalyType,
+ smartBatteryOn
+ ? AnomalyDatabaseHelper.State.AUTO_HANDLED
+ : AnomalyDatabaseHelper.State.NEW,
+ timeMs);
+ }
+ } else {
databaseManager.insertAnomaly(uid, packageName, anomalyType,
- smartBatteryOn
- ? AnomalyDatabaseHelper.State.AUTO_HANDLED
- : AnomalyDatabaseHelper.State.NEW,
- timeMs);
+ AnomalyDatabaseHelper.State.NEW, timeMs);
}
- } else {
- databaseManager.insertAnomaly(uid, packageName, anomalyType,
- AnomalyDatabaseHelper.State.NEW, timeMs);
}
} catch (NullPointerException | IndexOutOfBoundsException e) {
Log.e(TAG, "Parse stats dimensions value error.", e);
diff --git a/src/com/android/settings/fuelgauge/batterytip/AppInfo.java b/src/com/android/settings/fuelgauge/batterytip/AppInfo.java
index 9557d9a..dc6ba25 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AppInfo.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AppInfo.java
@@ -19,6 +19,7 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.VisibleForTesting;
+import android.text.TextUtils;
import com.android.settings.fuelgauge.anomaly.Anomaly;
@@ -74,6 +75,22 @@
+ screenOnTimeMs;
}
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof AppInfo)) {
+ return false;
+ }
+
+ AppInfo other = (AppInfo) obj;
+ return anomalyType == other.anomalyType
+ && uid == other.uid
+ && screenOnTimeMs == other.screenOnTimeMs
+ && TextUtils.equals(packageName, other.packageName);
+ }
+
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public AppInfo createFromParcel(Parcel in) {
return new AppInfo(in);
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
index d0bddec..798c8c6 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
@@ -19,10 +19,10 @@
import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
.ANOMALY_STATE;
import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
- .PACKAGE_NAME;
-import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
.ANOMALY_TYPE;
import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
+ .PACKAGE_NAME;
+import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
.TIME_STAMP_MS;
import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns.UID;
import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.Tables.TABLE_ANOMALY;
@@ -61,10 +61,11 @@
/**
* Insert an anomaly log to database.
- * @param packageName the package name of the app
- * @param type the type of the anomaly
- * @param anomalyState the state of the anomaly
- * @param timestampMs the time when it is happened
+ *
+ * @param packageName the package name of the app
+ * @param type the type of the anomaly
+ * @param anomalyState the state of the anomaly
+ * @param timestampMs the time when it is happened
*/
public synchronized void insertAnomaly(int uid, String packageName, int type, int anomalyState,
long timestampMs) {
diff --git a/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java b/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
index d982280..ec45c80f 100644
--- a/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
+++ b/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java
@@ -76,7 +76,7 @@
final AppInfo app = mHighUsageAppList.get(position);
holder.appIcon.setImageDrawable(
Utils.getBadgedIcon(mIconDrawableFactory, mPackageManager, app.packageName,
- UserHandle.myUserId()));
+ UserHandle.getUserId(app.uid)));
holder.appName.setText(Utils.getApplicationLabel(mContext, app.packageName));
if (app.screenOnTimeMs != 0) {
holder.appTime.setText(StringUtil.formatElapsedTime(mContext, app.screenOnTimeMs, false));
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java
index ed3fa04..fd150e4 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java
@@ -73,6 +73,7 @@
BatteryUtils.StatusType.FOREGROUND, batterySipper.uidObj,
BatteryStats.STATS_SINCE_CHARGED);
mHighUsageAppList.add(new AppInfo.Builder()
+ .setUid(batterySipper.getUid())
.setPackageName(
mBatteryUtils.getPackageName(batterySipper.getUid()))
.setScreenOnTimeMs(foregroundTimeMs)
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 4ca7e63..bc02b30 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -148,9 +148,6 @@
private EditUserInfoController mEditUserInfoController = new EditUserInfoController();
private AddUserWhenLockedPreferenceController mAddUserWhenLockedPreferenceController;
- private AutoSyncDataPreferenceController mAutoSyncDataPreferenceController;
- private AutoSyncPersonalDataPreferenceController mAutoSyncPersonalDataPreferenceController;
- private AutoSyncWorkDataPreferenceController mAutoSyncWorkDataPreferenceController;
// A place to cache the generated default avatar
private Drawable mDefaultIconDrawable;
@@ -159,15 +156,15 @@
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
- case MESSAGE_UPDATE_LIST:
- updateUserList();
- break;
- case MESSAGE_SETUP_USER:
- onUserCreated(msg.arg1);
- break;
- case MESSAGE_CONFIG_USER:
- onManageUserClicked(msg.arg1, true);
- break;
+ case MESSAGE_UPDATE_LIST:
+ updateUserList();
+ break;
+ case MESSAGE_SETUP_USER:
+ onUserCreated(msg.arg1);
+ break;
+ case MESSAGE_CONFIG_USER:
+ onManageUserClicked(msg.arg1, true);
+ break;
}
}
};
@@ -203,17 +200,9 @@
final Context context = getActivity();
mAddUserWhenLockedPreferenceController = new AddUserWhenLockedPreferenceController(
context, KEY_ADD_USER_WHEN_LOCKED, getLifecycle());
- mAutoSyncDataPreferenceController = new AutoSyncDataPreferenceController(context, this);
- mAutoSyncPersonalDataPreferenceController =
- new AutoSyncPersonalDataPreferenceController(context, this);
- mAutoSyncWorkDataPreferenceController =
- new AutoSyncWorkDataPreferenceController(context, this);
-
final PreferenceScreen screen = getPreferenceScreen();
mAddUserWhenLockedPreferenceController.displayPreference(screen);
- mAutoSyncDataPreferenceController.displayPreference(screen);
- mAutoSyncPersonalDataPreferenceController.displayPreference(screen);
- mAutoSyncWorkDataPreferenceController.displayPreference(screen);
+
screen.findPreference(mAddUserWhenLockedPreferenceController.getPreferenceKey())
.setOnPreferenceChangeListener(mAddUserWhenLockedPreferenceController);
@@ -274,22 +263,10 @@
}
final PreferenceScreen screen = getPreferenceScreen();
- if (mAutoSyncDataPreferenceController.isAvailable()) {
- mAutoSyncDataPreferenceController.updateState(screen.findPreference(
- mAutoSyncDataPreferenceController.getPreferenceKey()));
- }
if (mAddUserWhenLockedPreferenceController.isAvailable()) {
mAddUserWhenLockedPreferenceController.updateState(screen.findPreference(
mAddUserWhenLockedPreferenceController.getPreferenceKey()));
}
- if (mAutoSyncPersonalDataPreferenceController.isAvailable()) {
- mAutoSyncPersonalDataPreferenceController.updateState(screen.findPreference(
- mAutoSyncPersonalDataPreferenceController.getPreferenceKey()));
- }
- if (mAutoSyncWorkDataPreferenceController.isAvailable()) {
- mAutoSyncWorkDataPreferenceController.updateState(screen.findPreference(
- mAutoSyncWorkDataPreferenceController.getPreferenceKey()));
- }
if (mShouldUpdateUserList) {
mUserCaps.updateAddUserCapabilities(getActivity());
@@ -330,20 +307,6 @@
}
@Override
- public boolean onPreferenceTreeClick(Preference preference) {
- if (mAutoSyncDataPreferenceController.handlePreferenceTreeClick(preference)) {
- return true;
- }
- if (mAutoSyncPersonalDataPreferenceController.handlePreferenceTreeClick(preference)) {
- return true;
- }
- if (mAutoSyncWorkDataPreferenceController.handlePreferenceTreeClick(preference)) {
- return true;
- }
- return super.onPreferenceTreeClick(preference);
- }
-
- @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
int pos = 0;
UserManager um = getContext().getSystemService(UserManager.class);
@@ -438,16 +401,16 @@
synchronized (mUserLock) {
if (mRemovingUserId == -1 && !mAddingUser) {
switch (userType) {
- case USER_TYPE_USER:
- showDialog(DIALOG_ADD_USER);
- break;
- case USER_TYPE_RESTRICTED_PROFILE:
- if (hasLockscreenSecurity()) {
- addUserNow(USER_TYPE_RESTRICTED_PROFILE);
- } else {
- showDialog(DIALOG_NEED_LOCKSCREEN);
- }
- break;
+ case USER_TYPE_USER:
+ showDialog(DIALOG_ADD_USER);
+ break;
+ case USER_TYPE_RESTRICTED_PROFILE:
+ if (hasLockscreenSecurity()) {
+ addUserNow(USER_TYPE_RESTRICTED_PROFILE);
+ } else {
+ showDialog(DIALOG_NEED_LOCKSCREEN);
+ }
+ break;
}
}
}
@@ -556,9 +519,9 @@
}
case DIALOG_USER_CANNOT_MANAGE:
return new AlertDialog.Builder(context)
- .setMessage(R.string.user_cannot_manage_message)
- .setPositiveButton(android.R.string.ok, null)
- .create();
+ .setMessage(R.string.user_cannot_manage_message)
+ .setPositiveButton(android.R.string.ok, null)
+ .create();
case DIALOG_ADD_USER: {
final SharedPreferences preferences = getActivity().getPreferences(
Context.MODE_PRIVATE);
@@ -570,55 +533,56 @@
final int userType = dialogId == DIALOG_ADD_USER
? USER_TYPE_USER : USER_TYPE_RESTRICTED_PROFILE;
Dialog dlg = new AlertDialog.Builder(context)
- .setTitle(R.string.user_add_user_title)
- .setMessage(messageResId)
- .setPositiveButton(android.R.string.ok,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- addUserNow(userType);
- if (!longMessageDisplayed) {
- preferences.edit().putBoolean(
- KEY_ADD_USER_LONG_MESSAGE_DISPLAYED, true).apply();
- }
- }
- })
- .setNegativeButton(android.R.string.cancel, null)
- .create();
+ .setTitle(R.string.user_add_user_title)
+ .setMessage(messageResId)
+ .setPositiveButton(android.R.string.ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ addUserNow(userType);
+ if (!longMessageDisplayed) {
+ preferences.edit().putBoolean(
+ KEY_ADD_USER_LONG_MESSAGE_DISPLAYED,
+ true).apply();
+ }
+ }
+ })
+ .setNegativeButton(android.R.string.cancel, null)
+ .create();
return dlg;
}
case DIALOG_SETUP_USER: {
Dialog dlg = new AlertDialog.Builder(context)
- .setTitle(R.string.user_setup_dialog_title)
- .setMessage(R.string.user_setup_dialog_message)
- .setPositiveButton(R.string.user_setup_button_setup_now,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- switchUserNow(mAddedUserId);
- }
- })
- .setNegativeButton(R.string.user_setup_button_setup_later, null)
- .create();
+ .setTitle(R.string.user_setup_dialog_title)
+ .setMessage(R.string.user_setup_dialog_message)
+ .setPositiveButton(R.string.user_setup_button_setup_now,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ switchUserNow(mAddedUserId);
+ }
+ })
+ .setNegativeButton(R.string.user_setup_button_setup_later, null)
+ .create();
return dlg;
}
case DIALOG_SETUP_PROFILE: {
Dialog dlg = new AlertDialog.Builder(context)
- .setMessage(R.string.user_setup_profile_dialog_message)
- .setPositiveButton(android.R.string.ok,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- switchUserNow(mAddedUserId);
- }
- })
- .setNegativeButton(android.R.string.cancel, null)
- .create();
+ .setMessage(R.string.user_setup_profile_dialog_message)
+ .setPositiveButton(android.R.string.ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ switchUserNow(mAddedUserId);
+ }
+ })
+ .setNegativeButton(android.R.string.cancel, null)
+ .create();
return dlg;
}
case DIALOG_CHOOSE_USER_TYPE: {
- List<HashMap<String, String>> data = new ArrayList<HashMap<String,String>>();
- HashMap<String,String> addUserItem = new HashMap<String,String>();
+ List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
+ HashMap<String, String> addUserItem = new HashMap<String, String>();
addUserItem.put(KEY_TITLE, getString(R.string.user_add_user_item_title));
addUserItem.put(KEY_SUMMARY, getString(R.string.user_add_user_item_summary));
- HashMap<String,String> addProfileItem = new HashMap<String,String>();
+ HashMap<String, String> addProfileItem = new HashMap<String, String>();
addProfileItem.put(KEY_TITLE, getString(R.string.user_add_profile_item_title));
addProfileItem.put(KEY_SUMMARY, getString(R.string.user_add_profile_item_summary));
data.add(addUserItem);
@@ -891,7 +855,7 @@
// Add a virtual Guest user for guest defaults
UserPreference pref = new UserPreference(getPrefContext(), null,
UserPreference.USERID_GUEST_DEFAULTS,
- mUserCaps.mIsAdmin && voiceCapable? this : null /* settings icon handler */,
+ mUserCaps.mIsAdmin && voiceCapable ? this : null /* settings icon handler */,
null /* delete icon handler */);
pref.setTitle(R.string.user_guest);
pref.setIcon(getEncircledDefaultIcon());
@@ -1061,20 +1025,20 @@
if (v.getTag() instanceof UserPreference) {
int userId = ((UserPreference) v.getTag()).getUserId();
switch (v.getId()) {
- case UserPreference.DELETE_ID:
- final EnforcedAdmin removeDisallowedAdmin =
- RestrictedLockUtils.checkIfRestrictionEnforced(getContext(),
- UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId());
- if (removeDisallowedAdmin != null) {
- RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(),
- removeDisallowedAdmin);
- } else {
- onRemoveUserClicked(userId);
- }
- break;
- case UserPreference.SETTINGS_ID:
- onManageUserClicked(userId, false);
- break;
+ case UserPreference.DELETE_ID:
+ final EnforcedAdmin removeDisallowedAdmin =
+ RestrictedLockUtils.checkIfRestrictionEnforced(getContext(),
+ UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId());
+ if (removeDisallowedAdmin != null) {
+ RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(),
+ removeDisallowedAdmin);
+ } else {
+ onRemoveUserClicked(userId);
+ }
+ break;
+ case UserPreference.SETTINGS_ID:
+ onManageUserClicked(userId, false);
+ break;
}
}
}
@@ -1106,8 +1070,9 @@
* Returns a default user icon (as a {@link Bitmap}) for the given user.
*
* Note that for guest users, you should pass in {@code UserHandle.USER_NULL}.
+ *
* @param resources resources object to fetch the user icon.
- * @param userId the user id or {@code UserHandle.USER_NULL} for a non-user specific icon
+ * @param userId the user id or {@code UserHandle.USER_NULL} for a non-user specific icon
*/
private static Bitmap getDefaultUserIconAsBitmap(Resources resources, int userId) {
Bitmap bitmap = null;
@@ -1124,6 +1089,7 @@
/**
* Assign the default photo to user with {@paramref userId}
+ *
* @param context used to get the {@link UserManager}
* @param userId used to get the icon bitmap
* @return true if assign photo successfully, false if failed
@@ -1160,7 +1126,8 @@
um.setUserIcon(userId, icon);
try {
avatarDataStream.close();
- } catch (IOException ioe) { }
+ } catch (IOException ioe) {
+ }
}
private static class SummaryProvider implements SummaryLoader.SummaryProvider {
@@ -1177,9 +1144,9 @@
public void setListening(boolean listening) {
if (listening) {
UserInfo info = mContext.getSystemService(UserManager.class).getUserInfo(
- UserHandle.myUserId());
+ UserHandle.myUserId());
mSummaryLoader.setSummary(this, mContext.getString(R.string.users_summary,
- info.name));
+ info.name));
}
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
index da4b40a..261acad 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
@@ -54,6 +54,7 @@
public class RestrictedAppDetailsTest {
private static final String PACKAGE_NAME = "com.android.app";
+ private static final int UID = 234;
private static final String APP_NAME = "app";
@Mock
@@ -70,60 +71,62 @@
private InstrumentedPreferenceFragment mFragment;
private RestrictedAppDetails mRestrictedAppDetails;
private Context mContext;
+ private AppInfo mAppInfo;
private Intent mIntent;
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
+ MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- mRestrictedAppDetails = spy(new RestrictedAppDetails());
+ mContext = spy(RuntimeEnvironment.application);
+ mRestrictedAppDetails = spy(new RestrictedAppDetails());
+ mAppInfo = new AppInfo.Builder()
+ .setPackageName(PACKAGE_NAME)
+ .setUid(UID)
+ .build();
- when(mRestrictedAppDetails.getPreferenceManager()).thenReturn(mPreferenceManager);
- when(mPreferenceManager.getContext()).thenReturn(mContext);
- mRestrictedAppDetails.mPackageManager = mPackageManager;
- mRestrictedAppDetails.mIconDrawableFactory = mIconDrawableFactory;
- mRestrictedAppDetails.mAppInfos = new ArrayList<>();
- mRestrictedAppDetails.mAppInfos.add(new AppInfo.Builder()
- .setPackageName(PACKAGE_NAME)
- .build());
- mRestrictedAppDetails.mRestrictedAppListGroup = spy(new PreferenceCategory(mContext));
- mRestrictedAppDetails.mBatteryUtils = new BatteryUtils(mContext);
- when(mRestrictedAppDetails.mRestrictedAppListGroup.getPreferenceManager())
- .thenReturn(mPreferenceManager);
+ doReturn(mPreferenceManager).when(mRestrictedAppDetails).getPreferenceManager();
+ doReturn(mContext).when(mPreferenceManager).getContext();
+ mRestrictedAppDetails.mPackageManager = mPackageManager;
+ mRestrictedAppDetails.mIconDrawableFactory = mIconDrawableFactory;
+ mRestrictedAppDetails.mAppInfos = new ArrayList<>();
+ mRestrictedAppDetails.mAppInfos.add(mAppInfo);
+ mRestrictedAppDetails.mRestrictedAppListGroup = spy(new PreferenceCategory(mContext));
+ mRestrictedAppDetails.mBatteryUtils = new BatteryUtils(mContext);
+ doReturn(mPreferenceManager).when(
+ mRestrictedAppDetails.mRestrictedAppListGroup).getPreferenceManager();
}
@Test
public void testRefreshUi_displayPreference() throws Exception {
- doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME, 0);
- doReturn(APP_NAME).when(mPackageManager).getApplicationLabel(mApplicationInfo);
+ doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME, 0);
+ doReturn(APP_NAME).when(mPackageManager).getApplicationLabel(mApplicationInfo);
- mRestrictedAppDetails.refreshUi();
+ mRestrictedAppDetails.refreshUi();
- assertThat(mRestrictedAppDetails.mRestrictedAppListGroup.getPreferenceCount()).isEqualTo(1);
- final Preference preference = mRestrictedAppDetails.mRestrictedAppListGroup.getPreference(0);
- assertThat(preference.getKey()).isEqualTo(PACKAGE_NAME);
- assertThat(preference.getTitle()).isEqualTo(APP_NAME);
+ assertThat(mRestrictedAppDetails.mRestrictedAppListGroup.getPreferenceCount()).isEqualTo(1);
+ final Preference preference = mRestrictedAppDetails.mRestrictedAppListGroup.getPreference(
+ 0);
+ assertThat(preference.getTitle()).isEqualTo(APP_NAME);
}
@Test
public void testStartRestrictedAppDetails_startWithCorrectData() {
- final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
- doAnswer(invocation -> {
- // Get the intent in which it has the app info bundle
- mIntent = captor.getValue();
- return true;
- }).when(mSettingsActivity).startActivity(captor.capture());
+ final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+ doAnswer(invocation -> {
+ // Get the intent in which it has the app info bundle
+ mIntent = captor.getValue();
+ return true;
+ }).when(mSettingsActivity).startActivity(captor.capture());
- RestrictedAppDetails.
- startRestrictedAppDetails(mSettingsActivity, mFragment, mRestrictedAppDetails.mAppInfos);
+ RestrictedAppDetails.startRestrictedAppDetails(mSettingsActivity, mFragment,
+ mRestrictedAppDetails.mAppInfos);
- final Bundle bundle = mIntent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
- // Verify the bundle has the correct info
- final List<AppInfo> appInfos =
- bundle.getParcelableArrayList(RestrictedAppDetails.EXTRA_APP_INFO_LIST);
- assertThat(appInfos).isNotNull();
- assertThat(appInfos).hasSize(1);
- assertThat(appInfos.get(0).packageName).isEqualTo(PACKAGE_NAME);
+ final Bundle bundle = mIntent.getBundleExtra(
+ SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+ // Verify the bundle has the correct info
+ final List<AppInfo> appInfos = bundle.getParcelableArrayList(
+ RestrictedAppDetails.EXTRA_APP_INFO_LIST);
+ assertThat(appInfos).containsExactly(mAppInfo);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
index 77e51b1..aa3d5a8 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
@@ -17,17 +17,36 @@
package com.android.settings.fuelgauge.batterytip;
import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
import static org.robolectric.RuntimeEnvironment.application;
+import android.app.StatsManager;
import android.app.job.JobInfo;
import android.app.job.JobScheduler;
+import android.content.Context;
import android.content.Intent;
+import android.os.Bundle;
+import android.os.StatsDimensionsValue;
+import android.os.UserManager;
+import com.android.internal.os.BatteryStatsHelper;
import com.android.settings.R;
+import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.shadows.ShadowJobScheduler;
@@ -36,6 +55,37 @@
@RunWith(SettingsRobolectricTestRunner.class)
public class AnomalyDetectionJobServiceTest {
+ private static final int UID = 123;
+ private static final String SYSTEM_PACKAGE = "com.android.system";
+ @Mock
+ private BatteryStatsHelper mBatteryStatsHelper;
+ @Mock
+ private UserManager mUserManager;
+ @Mock
+ private BatteryDatabaseManager mBatteryDatabaseManager;
+ @Mock
+ private BatteryUtils mBatteryUtils;
+ @Mock
+ private PowerWhitelistBackend mPowerWhitelistBackend;
+ @Mock
+ private StatsDimensionsValue mStatsDimensionsValue;
+
+ private BatteryTipPolicy mPolicy;
+ private Bundle mBundle;
+ private AnomalyDetectionJobService mAnomalyDetectionJobService;
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mContext = RuntimeEnvironment.application;
+ mPolicy = new BatteryTipPolicy(mContext);
+ mBundle = new Bundle();
+ mBundle.putParcelable(StatsManager.EXTRA_STATS_DIMENSIONS_VALUE, mStatsDimensionsValue);
+
+ mAnomalyDetectionJobService = new AnomalyDetectionJobService();
+ }
@Test
public void testScheduleCleanUp() {
@@ -50,4 +100,30 @@
assertThat(pendingJob.getMaxExecutionDelayMillis())
.isEqualTo(TimeUnit.MINUTES.toMillis(30));
}
+
+ @Test
+ public void testSaveAnomalyToDatabase_systemWhitelisted_doNotSave() {
+ doReturn(SYSTEM_PACKAGE).when(mBatteryUtils).getPackageName(anyInt());
+ doReturn(true).when(mPowerWhitelistBackend).isSysWhitelisted(SYSTEM_PACKAGE);
+
+ mAnomalyDetectionJobService.saveAnomalyToDatabase(mBatteryStatsHelper, mUserManager,
+ mBatteryDatabaseManager, mBatteryUtils, mPolicy, mPowerWhitelistBackend,
+ mContext.getContentResolver(), mBundle);
+
+ verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(),
+ anyInt(), anyLong());
+ }
+
+ @Test
+ public void testSaveAnomalyToDatabase_normalApp_save() {
+ doReturn(SYSTEM_PACKAGE).when(mBatteryUtils).getPackageName(anyInt());
+ doReturn(false).when(mPowerWhitelistBackend).isSysWhitelisted(SYSTEM_PACKAGE);
+
+ mAnomalyDetectionJobService.saveAnomalyToDatabase(mBatteryStatsHelper, mUserManager,
+ mBatteryDatabaseManager, mBatteryUtils, mPolicy, mPowerWhitelistBackend,
+ mContext.getContentResolver(), mBundle);
+
+ verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), anyInt(), anyInt(),
+ anyLong());
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java
index 7dbad7a..14627c5 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetectorTest.java
@@ -29,8 +29,10 @@
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper;
import com.android.settings.fuelgauge.BatteryUtils;
+import com.android.settings.fuelgauge.batterytip.AppInfo;
import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
import com.android.settings.fuelgauge.batterytip.HighUsageDataParser;
+import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
@@ -46,7 +48,8 @@
@RunWith(SettingsRobolectricTestRunner.class)
public class HighUsageDetectorTest {
-
+ private static final int UID = 123;
+ private static final long SCREEN_ON_TIME_MS = DateUtils.HOUR_IN_MILLIS;
private Context mContext;
@Mock
private BatteryStatsHelper mBatteryStatsHelper;
@@ -57,6 +60,7 @@
@Mock
private HighUsageDataParser mDataParser;
+ private AppInfo mAppInfo;
private BatteryTipPolicy mPolicy;
private HighUsageDetector mHighUsageDetector;
private List<BatterySipper> mUsageList;
@@ -71,6 +75,11 @@
mHighUsageDetector.mBatteryUtils = mBatteryUtils;
mHighUsageDetector.mDataParser = mDataParser;
doNothing().when(mHighUsageDetector).parseBatteryData();
+ doReturn(UID).when(mBatterySipper).getUid();
+ mAppInfo = new AppInfo.Builder()
+ .setUid(UID)
+ .setScreenOnTimeMs(SCREEN_ON_TIME_MS)
+ .build();
mUsageList = new ArrayList<>();
mUsageList.add(mBatterySipper);
@@ -87,10 +96,12 @@
public void testDetect_containsHighUsageApp_tipVisible() {
doReturn(true).when(mDataParser).isDeviceHeavilyUsed();
when(mBatteryStatsHelper.getUsageList()).thenReturn(mUsageList);
- doReturn(DateUtils.HOUR_IN_MILLIS).when(mBatteryUtils).getProcessTimeMs(
+ doReturn(SCREEN_ON_TIME_MS).when(mBatteryUtils).getProcessTimeMs(
BatteryUtils.StatusType.FOREGROUND, mBatterySipper.uidObj,
BatteryStats.STATS_SINCE_CHARGED);
- assertThat(mHighUsageDetector.detect().isVisible()).isTrue();
+ final HighUsageTip highUsageTip = (HighUsageTip) mHighUsageDetector.detect();
+ assertThat(highUsageTip.isVisible()).isTrue();
+ assertThat(highUsageTip.getHighUsageAppList()).containsExactly(mAppInfo);
}
}
diff --git a/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java b/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java
index bf979c6..7de9c2b 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java
@@ -16,16 +16,17 @@
package com.android.settings.slices;
+import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_CONTROLLER;
+import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import static org.mockito.Mockito.spy;
import android.content.Context;
-import android.content.res.XmlResourceParser;
+import android.os.Bundle;
import android.provider.SearchIndexableResource;
import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Xml;
+import com.android.settings.core.PreferenceXmlParserUtils;
import com.android.settings.core.TogglePreferenceController;
import com.android.settings.core.codeinspection.ClassScanner;
import com.android.settings.core.codeinspection.CodeInspector;
@@ -34,7 +35,6 @@
import com.android.settings.search.Indexable;
import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl;
-import com.android.settings.core.PreferenceXmlParserUtils;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -42,8 +42,9 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
-import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -53,7 +54,7 @@
public class SliceControllerInXmlTest {
private static final List<Class> mSliceControllerClasses = Collections.singletonList(
- TogglePreferenceController.class
+ TogglePreferenceController.class
);
private final List<String> mXmlDeclaredControllers = new ArrayList<>();
@@ -71,7 +72,7 @@
private FakeFeatureFactory mFakeFeatureFactory;
@Before
- public void setUp() {
+ public void setUp() throws IOException, XmlPullParserException {
mContext = spy(RuntimeEnvironment.application);
mSearchProvider = new SearchFeatureProviderImpl();
@@ -83,44 +84,28 @@
initDeclaredControllers();
}
- private void initDeclaredControllers() {
+ private void initDeclaredControllers() throws IOException, XmlPullParserException {
final List<Integer> xmlResources = getIndexableXml();
- XmlResourceParser parser;
-
for (int xmlResId : xmlResources) {
- try {
- parser = mContext.getResources().getXml(xmlResId);
-
- int type;
- while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
- && type != XmlPullParser.START_TAG) {
- // Parse next until start tag is found
+ final List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(mContext,
+ xmlResId, PreferenceXmlParserUtils.MetadataFlag.FLAG_NEED_PREF_CONTROLLER);
+ for (Bundle bundle : metadata) {
+ final String controllerClassName = bundle.getString(METADATA_CONTROLLER);
+ if (TextUtils.isEmpty(controllerClassName)) {
+ continue;
}
-
- final int outerDepth = parser.getDepth();
- final AttributeSet attrs = Xml.asAttributeSet(parser);
- String controllerClassName;
- while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
- && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
- if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
- continue;
- }
- controllerClassName = PreferenceXmlParserUtils.getController(mContext, attrs);
-
- if (!TextUtils.isEmpty(controllerClassName)) {
- mXmlDeclaredControllers.add(controllerClassName);
- }
- }
- } catch (Exception e) {
- // Assume an issue with robolectric resources
+ mXmlDeclaredControllers.add(controllerClassName);
}
}
+ // We definitely have some controllers in xml, so assert not-empty here as a proxy to
+ // make sure the parser didn't fail
+ assertThat(mXmlDeclaredControllers).isNotEmpty();
}
@Test
public void testAllControllersDeclaredInXml() throws Exception {
final List<Class<?>> classes =
- new ClassScanner().getClassesForPackage(mContext.getPackageName());
+ new ClassScanner().getClassesForPackage(mContext.getPackageName());
final List<String> missingControllersInXml = new ArrayList<>();
for (Class<?> clazz : classes) {
@@ -139,7 +124,7 @@
missingControllersInXml.removeAll(mGrandfatheredClasses);
final String missingControllerError =
- buildErrorMessage(ERROR_MISSING_CONTROLLER, missingControllersInXml);
+ buildErrorMessage(ERROR_MISSING_CONTROLLER, missingControllersInXml);
assertWithMessage(missingControllerError).that(missingControllersInXml).isEmpty();
}