Merge "Support Private Space in battery usage." into main

This commit is contained in:
Treehugger Robot
2024-03-15 09:46:38 +00:00
committed by Android (Google) Code Review
9 changed files with 227 additions and 121 deletions

View File

@@ -556,9 +556,11 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
String.format( String.format(
"getBatterySinceLastFullChargeUsageData() size=%d time=%d/ms", "getBatterySinceLastFullChargeUsageData() size=%d time=%d/ms",
batteryHistoryMap.size(), (System.currentTimeMillis() - start))); batteryHistoryMap.size(), (System.currentTimeMillis() - start)));
final Map<Integer, Map<Integer, BatteryDiffData>> batteryUsageData = final Map<Integer, Map<Integer, BatteryDiffData>> batteryUsageData =
DataProcessor.getBatteryUsageData(context, batteryHistoryMap); DataProcessor.getBatteryUsageData(
context,
new UserIdsSeries(context, /* mainUserOnly= */ false),
batteryHistoryMap);
if (batteryUsageData == null) { if (batteryUsageData == null) {
return null; return null;
} }

View File

@@ -84,12 +84,12 @@ public final class BatteryUsageDataLoader {
} }
@VisibleForTesting @VisibleForTesting
static void loadAppUsageData(final Context context) { static void loadAppUsageData(final Context context, final UserIdsSeries userIdsSeries) {
final long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
final Map<Long, UsageEvents> appUsageEvents = final Map<Long, UsageEvents> appUsageEvents =
sFakeAppUsageEventsSupplier != null sFakeAppUsageEventsSupplier != null
? sFakeAppUsageEventsSupplier.get() ? sFakeAppUsageEventsSupplier.get()
: DataProcessor.getAppUsageEvents(context); : DataProcessor.getAppUsageEvents(context, userIdsSeries);
if (appUsageEvents == null) { if (appUsageEvents == null) {
Log.w(TAG, "loadAppUsageData() returns null"); Log.w(TAG, "loadAppUsageData() returns null");
return; return;
@@ -113,13 +113,15 @@ public final class BatteryUsageDataLoader {
DatabaseUtils.sendAppUsageEventData(context, appUsageEventList); DatabaseUtils.sendAppUsageEventData(context, appUsageEventList);
} }
private static void preprocessBatteryUsageSlots(final Context context) { private static void preprocessBatteryUsageSlots(
final Context context, final UserIdsSeries userIdsSeries) {
final long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
final Handler handler = new Handler(Looper.getMainLooper()); final Handler handler = new Handler(Looper.getMainLooper());
final BatteryLevelData batteryLevelData = final BatteryLevelData batteryLevelData =
DataProcessManager.getBatteryLevelData( DataProcessManager.getBatteryLevelData(
context, context,
handler, handler,
userIdsSeries,
/* isFromPeriodJob= */ true, /* isFromPeriodJob= */ true,
batteryDiffDataMap -> { batteryDiffDataMap -> {
DatabaseUtils.sendBatteryUsageSlotData( DatabaseUtils.sendBatteryUsageSlotData(
@@ -162,8 +164,12 @@ public final class BatteryUsageDataLoader {
loadBatteryStatsData(context, isFullChargeStart); loadBatteryStatsData(context, isFullChargeStart);
if (!isFullChargeStart) { if (!isFullChargeStart) {
// No app usage data or battery diff data at this time. // No app usage data or battery diff data at this time.
loadAppUsageData(context); final UserIdsSeries userIdsSeries =
preprocessBatteryUsageSlots(context); new UserIdsSeries(context, /* mainUserOnly= */ true);
if (!userIdsSeries.isCurrentUserLocked()) {
loadAppUsageData(context, userIdsSeries);
preprocessBatteryUsageSlots(context, userIdsSeries);
}
} }
Log.d( Log.d(
TAG, TAG,

View File

@@ -21,8 +21,6 @@ import android.content.Context;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.Log; import android.util.Log;
@@ -30,7 +28,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.Utils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
@@ -82,7 +79,7 @@ public class DataProcessManager {
private final long mLastFullChargeTimestamp; private final long mLastFullChargeTimestamp;
private final Context mContext; private final Context mContext;
private final Handler mHandler; private final Handler mHandler;
private final UserManager mUserManager; private final UserIdsSeries mUserIdsSeries;
private final OnBatteryDiffDataMapLoadedListener mCallbackFunction; private final OnBatteryDiffDataMapLoadedListener mCallbackFunction;
private final List<AppUsageEvent> mAppUsageEventList = new ArrayList<>(); private final List<AppUsageEvent> mAppUsageEventList = new ArrayList<>();
private final List<BatteryEvent> mBatteryEventList = new ArrayList<>(); private final List<BatteryEvent> mBatteryEventList = new ArrayList<>();
@@ -123,6 +120,7 @@ public class DataProcessManager {
DataProcessManager( DataProcessManager(
Context context, Context context,
Handler handler, Handler handler,
final UserIdsSeries userIdsSeries,
final long rawStartTimestamp, final long rawStartTimestamp,
final long lastFullChargeTimestamp, final long lastFullChargeTimestamp,
@NonNull final OnBatteryDiffDataMapLoadedListener callbackFunction, @NonNull final OnBatteryDiffDataMapLoadedListener callbackFunction,
@@ -130,7 +128,7 @@ public class DataProcessManager {
@NonNull final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) { @NonNull final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) {
mContext = context.getApplicationContext(); mContext = context.getApplicationContext();
mHandler = handler; mHandler = handler;
mUserManager = mContext.getSystemService(UserManager.class); mUserIdsSeries = userIdsSeries;
mRawStartTimestamp = rawStartTimestamp; mRawStartTimestamp = rawStartTimestamp;
mLastFullChargeTimestamp = lastFullChargeTimestamp; mLastFullChargeTimestamp = lastFullChargeTimestamp;
mCallbackFunction = callbackFunction; mCallbackFunction = callbackFunction;
@@ -142,10 +140,11 @@ public class DataProcessManager {
DataProcessManager( DataProcessManager(
Context context, Context context,
Handler handler, Handler handler,
final UserIdsSeries userIdsSeries,
@NonNull final OnBatteryDiffDataMapLoadedListener callbackFunction) { @NonNull final OnBatteryDiffDataMapLoadedListener callbackFunction) {
mContext = context.getApplicationContext(); mContext = context.getApplicationContext();
mHandler = handler; mHandler = handler;
mUserManager = mContext.getSystemService(UserManager.class); mUserIdsSeries = userIdsSeries;
mCallbackFunction = callbackFunction; mCallbackFunction = callbackFunction;
mRawStartTimestamp = 0L; mRawStartTimestamp = 0L;
mLastFullChargeTimestamp = 0L; mLastFullChargeTimestamp = 0L;
@@ -175,10 +174,18 @@ public class DataProcessManager {
// Loads the latest app usage list from the service. // Loads the latest app usage list from the service.
loadCurrentAppUsageList(); loadCurrentAppUsageList();
// Loads existing battery usage slots from database. // Loads existing battery usage slots from database.
loadBatteryUsageSlotList(); if (mUserIdsSeries.isMainUserProfileOnly()) {
loadBatteryUsageSlotList();
} else {
mIsBatteryUsageSlotLoaded = true;
}
} }
// Loads app usage list from database. // Loads app usage list from database.
loadDatabaseAppUsageList(); if (mUserIdsSeries.isMainUserProfileOnly()) {
loadDatabaseAppUsageList();
} else {
mIsDatabaseAppUsageLoaded = true;
}
// Loads the battery event list from database. // Loads the battery event list from database.
loadPowerConnectionBatteryEventList(); loadPowerConnectionBatteryEventList();
} else { } else {
@@ -264,6 +271,7 @@ public class DataProcessManager {
private void loadCurrentAppUsageList() { private void loadCurrentAppUsageList() {
new AsyncTask<Void, Void, List<AppUsageEvent>>() { new AsyncTask<Void, Void, List<AppUsageEvent>>() {
@Override @Override
@Nullable
protected List<AppUsageEvent> doInBackground(Void... voids) { protected List<AppUsageEvent> doInBackground(Void... voids) {
if (!shouldLoadAppUsageData()) { if (!shouldLoadAppUsageData()) {
Log.d(TAG, "not loadCurrentAppUsageList"); Log.d(TAG, "not loadCurrentAppUsageList");
@@ -271,33 +279,21 @@ public class DataProcessManager {
} }
final long startTime = System.currentTimeMillis(); final long startTime = System.currentTimeMillis();
// Loads the current battery usage data from the battery stats service. // Loads the current battery usage data from the battery stats service.
final int currentUserId = getCurrentUserId();
final int workProfileUserId = getWorkProfileUserId();
final UsageEvents usageEventsForCurrentUser =
DataProcessor.getAppUsageEventsForUser(
mContext, currentUserId, mRawStartTimestamp);
// If fail to load usage events for current user, return null directly and screen-on
// time will not be shown in the UI.
if (usageEventsForCurrentUser == null) {
Log.w(TAG, "usageEventsForCurrentUser is null");
return null;
}
UsageEvents usageEventsForWorkProfile = null;
if (workProfileUserId != Integer.MIN_VALUE) {
usageEventsForWorkProfile =
DataProcessor.getAppUsageEventsForUser(
mContext, workProfileUserId, mRawStartTimestamp);
} else {
Log.d(TAG, "there is no work profile");
}
final Map<Long, UsageEvents> usageEventsMap = new ArrayMap<>(); final Map<Long, UsageEvents> usageEventsMap = new ArrayMap<>();
usageEventsMap.put(Long.valueOf(currentUserId), usageEventsForCurrentUser); for (int userId : mUserIdsSeries.getVisibleUserIds()) {
if (usageEventsForWorkProfile != null) { final UsageEvents usageEventsForCurrentUser =
Log.d(TAG, "usageEventsForWorkProfile is null"); DataProcessor.getCurrentAppUsageEventsForUser(
usageEventsMap.put(Long.valueOf(workProfileUserId), usageEventsForWorkProfile); mContext, mUserIdsSeries, userId, mRawStartTimestamp);
if (usageEventsForCurrentUser == null) {
// If fail to load usage events for any user, return null directly and
// screen-on time will not be shown in the UI.
if (userId == mUserIdsSeries.getCurrentUserId()) {
return null;
}
} else {
usageEventsMap.put(Long.valueOf(userId), usageEventsForCurrentUser);
}
} }
final List<AppUsageEvent> appUsageEventList = final List<AppUsageEvent> appUsageEventList =
DataProcessor.generateAppUsageEventListFromUsageEvents( DataProcessor.generateAppUsageEventListFromUsageEvents(
mContext, usageEventsMap); mContext, usageEventsMap);
@@ -337,7 +333,7 @@ public class DataProcessManager {
DatabaseUtils.getAppUsageEventForUsers( DatabaseUtils.getAppUsageEventForUsers(
mContext, mContext,
Calendar.getInstance(), Calendar.getInstance(),
getCurrentUserIds(), mUserIdsSeries.getVisibleUserIds(),
mRawStartTimestamp); mRawStartTimestamp);
Log.d( Log.d(
TAG, TAG,
@@ -435,6 +431,7 @@ public class DataProcessManager {
final Map<Long, BatteryDiffData> batteryDiffDataMap = final Map<Long, BatteryDiffData> batteryDiffDataMap =
DataProcessor.getBatteryDiffDataMapFromStatsService( DataProcessor.getBatteryDiffDataMapFromStatsService(
mContext, mContext,
mUserIdsSeries,
mRawStartTimestamp, mRawStartTimestamp,
getSystemAppsPackageNames(), getSystemAppsPackageNames(),
getSystemAppsUids()); getSystemAppsUids());
@@ -514,6 +511,7 @@ public class DataProcessManager {
batteryDiffDataMap.putAll( batteryDiffDataMap.putAll(
DataProcessor.getBatteryDiffDataMap( DataProcessor.getBatteryDiffDataMap(
mContext, mContext,
mUserIdsSeries,
mHourlyBatteryLevelsPerDay, mHourlyBatteryLevelsPerDay,
mBatteryHistoryMap, mBatteryHistoryMap,
mAppUsagePeriodMap, mAppUsagePeriodMap,
@@ -546,9 +544,8 @@ public class DataProcessManager {
if (!mShowScreenOnTime) { if (!mShowScreenOnTime) {
return false; return false;
} }
final int currentUserId = getCurrentUserId();
// If current user is locked, no need to load app usage data from service or database. // If current user is locked, no need to load app usage data from service or database.
if (mUserManager == null || !mUserManager.isUserUnlocked(currentUserId)) { if (mUserIdsSeries.isCurrentUserLocked()) {
Log.d(TAG, "shouldLoadAppUsageData: false, current user is locked"); Log.d(TAG, "shouldLoadAppUsageData: false, current user is locked");
mShowScreenOnTime = false; mShowScreenOnTime = false;
return false; return false;
@@ -556,26 +553,6 @@ public class DataProcessManager {
return true; return true;
} }
// Returns the list of current user id and work profile id if exists.
private List<Integer> getCurrentUserIds() {
final List<Integer> userIds = new ArrayList<>();
userIds.add(getCurrentUserId());
final int workProfileUserId = getWorkProfileUserId();
if (workProfileUserId != Integer.MIN_VALUE) {
userIds.add(workProfileUserId);
}
return userIds;
}
private int getCurrentUserId() {
return mContext.getUserId();
}
private int getWorkProfileUserId() {
final UserHandle userHandle = Utils.getManagedProfile(mUserManager);
return userHandle != null ? userHandle.getIdentifier() : Integer.MIN_VALUE;
}
private synchronized Set<String> getSystemAppsPackageNames() { private synchronized Set<String> getSystemAppsPackageNames() {
if (mSystemAppsPackageNames == null) { if (mSystemAppsPackageNames == null) {
mSystemAppsPackageNames = DataProcessor.getSystemAppsPackageNames(mContext); mSystemAppsPackageNames = DataProcessor.getSystemAppsPackageNames(mContext);
@@ -599,6 +576,7 @@ public class DataProcessManager {
public static BatteryLevelData getBatteryLevelData( public static BatteryLevelData getBatteryLevelData(
Context context, Context context,
@Nullable Handler handler, @Nullable Handler handler,
final UserIdsSeries userIdsSeries,
final boolean isFromPeriodJob, final boolean isFromPeriodJob,
final OnBatteryDiffDataMapLoadedListener onBatteryUsageMapLoadedListener) { final OnBatteryDiffDataMapLoadedListener onBatteryUsageMapLoadedListener) {
final long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
@@ -610,13 +588,14 @@ public class DataProcessManager {
lastFullChargeTime, lastFullChargeTime,
DatabaseUtils.BATTERY_LEVEL_RECORD_EVENTS); DatabaseUtils.BATTERY_LEVEL_RECORD_EVENTS);
final long startTimestamp = final long startTimestamp =
batteryLevelRecordEvents.isEmpty() (batteryLevelRecordEvents.isEmpty() || !userIdsSeries.isMainUserProfileOnly())
? lastFullChargeTime ? lastFullChargeTime
: batteryLevelRecordEvents.get(0).getTimestamp(); : batteryLevelRecordEvents.get(0).getTimestamp();
final BatteryLevelData batteryLevelData = final BatteryLevelData batteryLevelData =
getPeriodBatteryLevelData( getPeriodBatteryLevelData(
context, context,
handler, handler,
userIdsSeries,
startTimestamp, startTimestamp,
lastFullChargeTime, lastFullChargeTime,
isFromPeriodJob, isFromPeriodJob,
@@ -636,6 +615,7 @@ public class DataProcessManager {
private static BatteryLevelData getPeriodBatteryLevelData( private static BatteryLevelData getPeriodBatteryLevelData(
Context context, Context context,
@Nullable Handler handler, @Nullable Handler handler,
final UserIdsSeries userIdsSeries,
final long startTimestamp, final long startTimestamp,
final long lastFullChargeTime, final long lastFullChargeTime,
final boolean isFromPeriodJob, final boolean isFromPeriodJob,
@@ -663,7 +643,9 @@ public class DataProcessManager {
lastFullChargeTime); lastFullChargeTime);
if (batteryHistoryMap == null || batteryHistoryMap.isEmpty()) { if (batteryHistoryMap == null || batteryHistoryMap.isEmpty()) {
Log.d(TAG, "batteryHistoryMap is null in getPeriodBatteryLevelData()"); Log.d(TAG, "batteryHistoryMap is null in getPeriodBatteryLevelData()");
new DataProcessManager(context, handler, onBatteryDiffDataMapLoadedListener).start(); new DataProcessManager(
context, handler, userIdsSeries, onBatteryDiffDataMapLoadedListener)
.start();
return null; return null;
} }
@@ -675,7 +657,9 @@ public class DataProcessManager {
DataProcessor.getLevelDataThroughProcessedHistoryMap( DataProcessor.getLevelDataThroughProcessedHistoryMap(
context, processedBatteryHistoryMap); context, processedBatteryHistoryMap);
if (batteryLevelData == null) { if (batteryLevelData == null) {
new DataProcessManager(context, handler, onBatteryDiffDataMapLoadedListener).start(); new DataProcessManager(
context, handler, userIdsSeries, onBatteryDiffDataMapLoadedListener)
.start();
Log.d(TAG, "getBatteryLevelData() returns null"); Log.d(TAG, "getBatteryLevelData() returns null");
return null; return null;
} }
@@ -684,6 +668,7 @@ public class DataProcessManager {
new DataProcessManager( new DataProcessManager(
context, context,
handler, handler,
userIdsSeries,
startTimestamp, startTimestamp,
lastFullChargeTime, lastFullChargeTime,
onBatteryDiffDataMapLoadedListener, onBatteryDiffDataMapLoadedListener,

View File

@@ -28,7 +28,6 @@ import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.os.BatteryConsumer; import android.os.BatteryConsumer;
import android.os.BatteryStatsManager; import android.os.BatteryStatsManager;
import android.os.BatteryUsageStats; import android.os.BatteryUsageStats;
@@ -52,7 +51,6 @@ import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerProfile;
import com.android.settings.Utils;
import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.fuelgauge.BatteryStatus; import com.android.settingslib.fuelgauge.BatteryStatus;
@@ -134,6 +132,7 @@ public final class DataProcessor {
@Nullable @Nullable
public static Map<Integer, Map<Integer, BatteryDiffData>> getBatteryUsageData( public static Map<Integer, Map<Integer, BatteryDiffData>> getBatteryUsageData(
Context context, Context context,
UserIdsSeries userIdsSeries,
@Nullable final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) { @Nullable final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) {
if (batteryHistoryMap == null || batteryHistoryMap.isEmpty()) { if (batteryHistoryMap == null || batteryHistoryMap.isEmpty()) {
Log.d(TAG, "getBatteryLevelData() returns null"); Log.d(TAG, "getBatteryLevelData() returns null");
@@ -161,6 +160,7 @@ public final class DataProcessor {
context, context,
getBatteryDiffDataMap( getBatteryDiffDataMap(
context, context,
userIdsSeries,
batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryLevelData.getHourlyBatteryLevelsPerDay(),
processedBatteryHistoryMap, processedBatteryHistoryMap,
/* appUsagePeriodMap= */ null, /* appUsagePeriodMap= */ null,
@@ -183,24 +183,21 @@ public final class DataProcessor {
/** Gets the {@link UsageEvents} from system service for all unlocked users. */ /** Gets the {@link UsageEvents} from system service for all unlocked users. */
@Nullable @Nullable
public static Map<Long, UsageEvents> getAppUsageEvents(Context context) { public static Map<Long, UsageEvents> getAppUsageEvents(
Context context, UserIdsSeries userIdsSeries) {
final long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
context = DatabaseUtils.getParentContext(context); context = DatabaseUtils.getParentContext(context);
if (context == null) { if (context == null) {
return null; return null;
} }
final Map<Long, UsageEvents> resultMap = new ArrayMap(); final Map<Long, UsageEvents> resultMap = new ArrayMap();
final UserManager userManager = context.getSystemService(UserManager.class);
if (userManager == null) {
return null;
}
final long sixDaysAgoTimestamp = final long sixDaysAgoTimestamp =
DatabaseUtils.getTimestampSixDaysAgo(Calendar.getInstance()); DatabaseUtils.getTimestampSixDaysAgo(Calendar.getInstance());
for (final UserInfo user : userManager.getAliveUsers()) { for (final int userId : userIdsSeries.getVisibleUserIds()) {
final UsageEvents events = final UsageEvents events =
getAppUsageEventsForUser(context, userManager, user.id, sixDaysAgoTimestamp); getAppUsageEventsForUser(context, userIdsSeries, userId, sixDaysAgoTimestamp);
if (events != null) { if (events != null) {
resultMap.put(Long.valueOf(user.id), events); resultMap.put(Long.valueOf(userId), events);
} }
} }
final long elapsedTime = System.currentTimeMillis() - start; final long elapsedTime = System.currentTimeMillis() - start;
@@ -212,22 +209,21 @@ public final class DataProcessor {
/** Gets the {@link UsageEvents} from system service for the specific user. */ /** Gets the {@link UsageEvents} from system service for the specific user. */
@Nullable @Nullable
public static UsageEvents getAppUsageEventsForUser( public static UsageEvents getCurrentAppUsageEventsForUser(
Context context, final int userID, final long startTimestampOfLevelData) { Context context,
final UserIdsSeries userIdsSeries,
final int userID,
final long startTimestampOfLevelData) {
final long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
context = DatabaseUtils.getParentContext(context); context = DatabaseUtils.getParentContext(context);
if (context == null) { if (context == null) {
return null; return null;
} }
final UserManager userManager = context.getSystemService(UserManager.class);
if (userManager == null) {
return null;
}
final long sixDaysAgoTimestamp = final long sixDaysAgoTimestamp =
DatabaseUtils.getTimestampSixDaysAgo(Calendar.getInstance()); DatabaseUtils.getTimestampSixDaysAgo(Calendar.getInstance());
final long earliestTimestamp = Math.max(sixDaysAgoTimestamp, startTimestampOfLevelData); final long earliestTimestamp = Math.max(sixDaysAgoTimestamp, startTimestampOfLevelData);
final UsageEvents events = final UsageEvents events =
getAppUsageEventsForUser(context, userManager, userID, earliestTimestamp); getAppUsageEventsForUser(context, userIdsSeries, userID, earliestTimestamp);
final long elapsedTime = System.currentTimeMillis() - start; final long elapsedTime = System.currentTimeMillis() - start;
Log.d( Log.d(
TAG, TAG,
@@ -521,6 +517,7 @@ public final class DataProcessor {
static Map<Long, BatteryDiffData> getBatteryDiffDataMap( static Map<Long, BatteryDiffData> getBatteryDiffDataMap(
Context context, Context context,
final UserIdsSeries userIdsSeries,
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay, final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay,
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap, final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap,
final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>> final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>>
@@ -528,11 +525,6 @@ public final class DataProcessor {
final @NonNull Set<String> systemAppsPackageNames, final @NonNull Set<String> systemAppsPackageNames,
final @NonNull Set<Integer> systemAppsUids) { final @NonNull Set<Integer> systemAppsUids) {
final Map<Long, BatteryDiffData> batteryDiffDataMap = new ArrayMap<>(); final Map<Long, BatteryDiffData> batteryDiffDataMap = new ArrayMap<>();
final int currentUserId = context.getUserId();
final UserHandle userHandle =
Utils.getManagedProfile(context.getSystemService(UserManager.class));
final int workProfileUserId =
userHandle != null ? userHandle.getIdentifier() : Integer.MIN_VALUE;
// Each time slot usage diff data = // Each time slot usage diff data =
// sum(Math.abs(timestamp[i+1] data - timestamp[i] data)); // sum(Math.abs(timestamp[i+1] data - timestamp[i] data));
// since we want to aggregate every hour usage diff data into a single time slot. // since we want to aggregate every hour usage diff data into a single time slot.
@@ -569,8 +561,7 @@ public final class DataProcessor {
endTimestamp, endTimestamp,
startBatteryLevel, startBatteryLevel,
endBatteryLevel, endBatteryLevel,
currentUserId, userIdsSeries,
workProfileUserId,
slotDuration, slotDuration,
systemAppsPackageNames, systemAppsPackageNames,
systemAppsUids, systemAppsUids,
@@ -629,6 +620,7 @@ public final class DataProcessor {
@Nullable @Nullable
static BatteryDiffData generateBatteryDiffData( static BatteryDiffData generateBatteryDiffData(
final Context context, final Context context,
final UserIdsSeries userIdsSeries,
final long startTimestamp, final long startTimestamp,
final List<BatteryHistEntry> batteryHistEntryList, final List<BatteryHistEntry> batteryHistEntryList,
final @NonNull Set<String> systemAppsPackageNames, final @NonNull Set<String> systemAppsPackageNames,
@@ -650,15 +642,9 @@ public final class DataProcessor {
systemAppsUids, systemAppsUids,
/* isAccumulated= */ false); /* isAccumulated= */ false);
} }
final int currentUserId = context.getUserId();
final UserHandle userHandle =
Utils.getManagedProfile(context.getSystemService(UserManager.class));
final int workProfileUserId =
userHandle != null ? userHandle.getIdentifier() : Integer.MIN_VALUE;
for (BatteryHistEntry entry : batteryHistEntryList) { for (BatteryHistEntry entry : batteryHistEntryList) {
final boolean isFromOtherUsers = final boolean isFromOtherUsers =
isConsumedFromOtherUsers(currentUserId, workProfileUserId, entry); isConsumedFromOtherUsers(userIdsSeries, entry);
// Not show other users' battery usage data. // Not show other users' battery usage data.
if (isFromOtherUsers) { if (isFromOtherUsers) {
continue; continue;
@@ -905,6 +891,7 @@ public final class DataProcessor {
static Map<Long, BatteryDiffData> getBatteryDiffDataMapFromStatsService( static Map<Long, BatteryDiffData> getBatteryDiffDataMapFromStatsService(
final Context context, final Context context,
final UserIdsSeries userIdsSeries,
final long startTimestamp, final long startTimestamp,
@NonNull final Set<String> systemAppsPackageNames, @NonNull final Set<String> systemAppsPackageNames,
@NonNull final Set<Integer> systemAppsUids) { @NonNull final Set<Integer> systemAppsUids) {
@@ -913,6 +900,7 @@ public final class DataProcessor {
startTimestamp, startTimestamp,
generateBatteryDiffData( generateBatteryDiffData(
context, context,
userIdsSeries,
startTimestamp, startTimestamp,
getBatteryHistListFromFromStatsService(context), getBatteryHistListFromFromStatsService(context),
systemAppsPackageNames, systemAppsPackageNames,
@@ -1034,14 +1022,14 @@ public final class DataProcessor {
@Nullable @Nullable
private static UsageEvents getAppUsageEventsForUser( private static UsageEvents getAppUsageEventsForUser(
Context context, Context context,
final UserManager userManager, final UserIdsSeries userIdsSeries,
final int userID, final int userID,
final long earliestTimestamp) { final long earliestTimestamp) {
final String callingPackage = context.getPackageName(); final String callingPackage = context.getPackageName();
final long now = System.currentTimeMillis(); final long now = System.currentTimeMillis();
// When the user is not unlocked, UsageStatsManager will return null, so bypass the // When the user is not unlocked, UsageStatsManager will return null, so bypass the
// following data loading logics directly. // following data loading logics directly.
if (!userManager.isUserUnlocked(userID)) { if (userIdsSeries.isUserLocked(userID)) {
Log.w(TAG, "fail to load app usage event for user :" + userID + " because locked"); Log.w(TAG, "fail to load app usage event for user :" + userID + " because locked");
return null; return null;
} }
@@ -1331,8 +1319,7 @@ public final class DataProcessor {
final long endTimestamp, final long endTimestamp,
final int startBatteryLevel, final int startBatteryLevel,
final int endBatteryLevel, final int endBatteryLevel,
final int currentUserId, final UserIdsSeries userIdsSeries,
final int workProfileUserId,
final long slotDuration, final long slotDuration,
final Set<String> systemAppsPackageNames, final Set<String> systemAppsPackageNames,
final Set<Integer> systemAppsUids, final Set<Integer> systemAppsUids,
@@ -1342,8 +1329,7 @@ public final class DataProcessor {
if (appUsageMap != null) { if (appUsageMap != null) {
final List<AppUsagePeriod> flatAppUsagePeriodList = new ArrayList<>(); final List<AppUsagePeriod> flatAppUsagePeriodList = new ArrayList<>();
for (final long userId : appUsageMap.keySet()) { for (final long userId : appUsageMap.keySet()) {
if ((userId != currentUserId && userId != workProfileUserId) if (userIdsSeries.isFromOtherUsers(userId) || appUsageMap.get(userId) == null) {
|| appUsageMap.get(userId) == null) {
continue; continue;
} }
for (final String packageName : appUsageMap.get(userId).keySet()) { for (final String packageName : appUsageMap.get(userId).keySet()) {
@@ -1405,8 +1391,7 @@ public final class DataProcessor {
// Not show other users' battery usage data. // Not show other users' battery usage data.
final boolean isFromOtherUsers = final boolean isFromOtherUsers =
isConsumedFromOtherUsers( isConsumedFromOtherUsers(userIdsSeries, selectedBatteryEntry);
currentUserId, workProfileUserId, selectedBatteryEntry);
if (isFromOtherUsers) { if (isFromOtherUsers) {
continue; continue;
} }
@@ -1593,12 +1578,10 @@ public final class DataProcessor {
} }
private static boolean isConsumedFromOtherUsers( private static boolean isConsumedFromOtherUsers(
final int currentUserId, final UserIdsSeries userIdsSeries,
final int workProfileUserId,
final BatteryHistEntry batteryHistEntry) { final BatteryHistEntry batteryHistEntry) {
return isUidConsumer(batteryHistEntry.mConsumerType) return isUidConsumer(batteryHistEntry.mConsumerType)
&& batteryHistEntry.mUserId != currentUserId && userIdsSeries.isFromOtherUsers(batteryHistEntry.mUserId);
&& batteryHistEntry.mUserId != workProfileUserId;
} }
@Nullable @Nullable

View File

@@ -492,6 +492,7 @@ public class PowerUsageAdvanced extends PowerUsageBase {
return DataProcessManager.getBatteryLevelData( return DataProcessManager.getBatteryLevelData(
getContext(), getContext(),
mHandler, mHandler,
new UserIdsSeries(getContext(), /* mainUserOnly= */ false),
/* isFromPeriodJob= */ false, /* isFromPeriodJob= */ false,
PowerUsageAdvanced.this::onBatteryDiffDataMapUpdate); PowerUsageAdvanced.this::onBatteryDiffDataMapUpdate);
} }

View File

@@ -0,0 +1,91 @@
/*
* Copyright (C) 2024 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.batteryusage;
import android.content.Context;
import android.content.pm.UserInfo;
import android.os.UserManager;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
class UserIdsSeries {
private final UserManager mUserManager;
private final int mCurrentUserId;
private final List<Integer> mVisibleUserIds = new ArrayList<>();
@Nullable private UserInfo mPrivateUser = null;
@Nullable private UserInfo mManagedProfileUser = null;
UserIdsSeries(final Context context, final boolean mainUserOnly) {
mUserManager = context.getSystemService(UserManager.class);
mCurrentUserId = context.getUserId();
List<UserInfo> aliveUsers =
mUserManager != null ? mUserManager.getAliveUsers() : new ArrayList<>();
if (mainUserOnly) {
aliveUsers.stream()
.filter(UserInfo::isMain)
.forEach(userInfo -> mVisibleUserIds.add(userInfo.id));
return;
}
for (UserInfo userInfo : aliveUsers) {
if (!mUserManager.isSameProfileGroup(mCurrentUserId, userInfo.id)) {
continue;
}
if (!userInfo.isQuietModeEnabled() || userInfo.isManagedProfile()) {
mVisibleUserIds.add(userInfo.id);
}
if (userInfo.isPrivateProfile()) {
mPrivateUser = userInfo;
}
if (userInfo.isManagedProfile()) {
mManagedProfileUser = userInfo;
}
}
}
int getCurrentUserId() {
return mCurrentUserId;
}
List<Integer> getVisibleUserIds() {
return mVisibleUserIds;
}
boolean isCurrentUserLocked() {
return isUserLocked(mCurrentUserId);
}
boolean isUserLocked(int userId) {
return mUserManager == null || !mUserManager.isUserUnlocked(userId);
}
boolean isFromOtherUsers(long userId) {
return !mVisibleUserIds.contains((int) userId);
}
boolean isMainUserProfileOnly() {
return mUserManager != null
&& mUserManager.isMainUser()
&& mPrivateUser == null
&& mManagedProfileUser == null;
}
}

View File

@@ -52,6 +52,7 @@ import java.util.List;
public final class BatteryUsageDataLoaderTest { public final class BatteryUsageDataLoaderTest {
private Context mContext; private Context mContext;
@Mock private UserIdsSeries mUserIdsSeries;
@Mock private ContentResolver mMockContentResolver; @Mock private ContentResolver mMockContentResolver;
@Mock private BatteryStatsManager mBatteryStatsManager; @Mock private BatteryStatsManager mBatteryStatsManager;
@Mock private PackageManager mPackageManager; @Mock private PackageManager mPackageManager;
@@ -120,7 +121,7 @@ public final class BatteryUsageDataLoaderTest {
BatteryUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>(); BatteryUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>();
BatteryUsageDataLoader.sFakeUsageEventsListSupplier = () -> AppUsageEventList; BatteryUsageDataLoader.sFakeUsageEventsListSupplier = () -> AppUsageEventList;
BatteryUsageDataLoader.loadAppUsageData(mContext); BatteryUsageDataLoader.loadAppUsageData(mContext, mUserIdsSeries);
verify(mMockContentResolver).bulkInsert(any(), any()); verify(mMockContentResolver).bulkInsert(any(), any());
verify(mMockContentResolver).notifyChange(any(), any()); verify(mMockContentResolver).notifyChange(any(), any());
@@ -130,7 +131,7 @@ public final class BatteryUsageDataLoaderTest {
public void loadAppUsageData_nullAppUsageEvents_notInsertDataIntoProvider() { public void loadAppUsageData_nullAppUsageEvents_notInsertDataIntoProvider() {
BatteryUsageDataLoader.sFakeAppUsageEventsSupplier = () -> null; BatteryUsageDataLoader.sFakeAppUsageEventsSupplier = () -> null;
BatteryUsageDataLoader.loadAppUsageData(mContext); BatteryUsageDataLoader.loadAppUsageData(mContext, mUserIdsSeries);
verifyNoMoreInteractions(mMockContentResolver); verifyNoMoreInteractions(mMockContentResolver);
} }
@@ -140,7 +141,7 @@ public final class BatteryUsageDataLoaderTest {
BatteryUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>(); BatteryUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>();
BatteryUsageDataLoader.sFakeUsageEventsListSupplier = () -> null; BatteryUsageDataLoader.sFakeUsageEventsListSupplier = () -> null;
BatteryUsageDataLoader.loadAppUsageData(mContext); BatteryUsageDataLoader.loadAppUsageData(mContext, mUserIdsSeries);
verifyNoMoreInteractions(mMockContentResolver); verifyNoMoreInteractions(mMockContentResolver);
} }
@@ -150,7 +151,7 @@ public final class BatteryUsageDataLoaderTest {
BatteryUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>(); BatteryUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>();
BatteryUsageDataLoader.sFakeUsageEventsListSupplier = () -> new ArrayList<>(); BatteryUsageDataLoader.sFakeUsageEventsListSupplier = () -> new ArrayList<>();
BatteryUsageDataLoader.loadAppUsageData(mContext); BatteryUsageDataLoader.loadAppUsageData(mContext, mUserIdsSeries);
verifyNoMoreInteractions(mMockContentResolver); verifyNoMoreInteractions(mMockContentResolver);
} }

View File

@@ -70,6 +70,7 @@ public final class DataProcessManagerTest {
private Context mContext; private Context mContext;
private DataProcessManager mDataProcessManager; private DataProcessManager mDataProcessManager;
@Mock private UserIdsSeries mUserIdsSeries;
@Mock private IUsageStatsManager mUsageStatsManager; @Mock private IUsageStatsManager mUsageStatsManager;
@Mock private UserManager mUserManager; @Mock private UserManager mUserManager;
@Mock private BatteryStatsManager mBatteryStatsManager; @Mock private BatteryStatsManager mBatteryStatsManager;
@@ -95,11 +96,13 @@ public final class DataProcessManagerTest {
doReturn(mIntent).when(mContext).registerReceiver(any(), any()); doReturn(mIntent).when(mContext).registerReceiver(any(), any());
doReturn(100).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_SCALE), anyInt()); doReturn(100).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_SCALE), anyInt());
doReturn(66).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_LEVEL), anyInt()); doReturn(66).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_LEVEL), anyInt());
doReturn(true).when(mUserIdsSeries).isMainUserProfileOnly();
mDataProcessManager = mDataProcessManager =
new DataProcessManager( new DataProcessManager(
mContext, mContext,
/* handler= */ null, /* handler= */ null,
mUserIdsSeries,
/* rawStartTimestamp= */ 0L, /* rawStartTimestamp= */ 0L,
/* lastFullChargeTimestamp= */ 0L, /* lastFullChargeTimestamp= */ 0L,
/* callbackFunction= */ null, /* callbackFunction= */ null,
@@ -117,7 +120,11 @@ public final class DataProcessManagerTest {
@LooperMode(LooperMode.Mode.LEGACY) @LooperMode(LooperMode.Mode.LEGACY)
public void constructor_noLevelData() { public void constructor_noLevelData() {
final DataProcessManager dataProcessManager = final DataProcessManager dataProcessManager =
new DataProcessManager(mContext, /* handler= */ null, /* callbackFunction= */ null); new DataProcessManager(
mContext,
/* handler= */ null,
mUserIdsSeries,
/* callbackFunction= */ null);
assertThat(dataProcessManager.getShowScreenOnTime()).isFalse(); assertThat(dataProcessManager.getShowScreenOnTime()).isFalse();
} }
@@ -180,6 +187,7 @@ public final class DataProcessManagerTest {
doReturn(1).when(mContext).getUserId(); doReturn(1).when(mContext).getUserId();
// No work profile. // No work profile.
doReturn(new ArrayList<>()).when(mUserManager).getUserProfiles(); doReturn(new ArrayList<>()).when(mUserManager).getUserProfiles();
doReturn(new ArrayList<>(List.of(1))).when(mUserIdsSeries).getVisibleUserIds();
// Fake database usage data. // Fake database usage data.
final MatrixCursor cursor = final MatrixCursor cursor =
@@ -239,6 +247,7 @@ public final class DataProcessManagerTest {
new DataProcessManager( new DataProcessManager(
mContext, mContext,
/* handler= */ null, /* handler= */ null,
mUserIdsSeries,
/* rawStartTimestamp= */ 2L, /* rawStartTimestamp= */ 2L,
/* lastFullChargeTimestamp= */ 1L, /* lastFullChargeTimestamp= */ 1L,
/* callbackFunction= */ null, /* callbackFunction= */ null,
@@ -301,7 +310,7 @@ public final class DataProcessManagerTest {
doReturn(getUsageEvents(events)) doReturn(getUsageEvents(events))
.when(mUsageStatsManager) .when(mUsageStatsManager)
.queryEventsForUser(anyLong(), anyLong(), anyInt(), any()); .queryEventsForUser(anyLong(), anyLong(), anyInt(), any());
doReturn(false).when(mUserManager).isUserUnlocked(anyInt()); doReturn(true).when(mUserIdsSeries).isCurrentUserLocked();
final MatrixCursor cursor = final MatrixCursor cursor =
new MatrixCursor( new MatrixCursor(
new String[] { new String[] {
@@ -327,6 +336,7 @@ public final class DataProcessManagerTest {
DataProcessManager.getBatteryLevelData( DataProcessManager.getBatteryLevelData(
mContext, mContext,
/* handler= */ null, /* handler= */ null,
mUserIdsSeries,
/* isFromPeriodJob= */ false, /* isFromPeriodJob= */ false,
/* asyncResponseDelegate= */ null)) /* asyncResponseDelegate= */ null))
.isNull(); .isNull();
@@ -334,6 +344,7 @@ public final class DataProcessManagerTest {
DataProcessManager.getBatteryLevelData( DataProcessManager.getBatteryLevelData(
mContext, mContext,
/* handler= */ null, /* handler= */ null,
mUserIdsSeries,
/* isFromPeriodJob= */ true, /* isFromPeriodJob= */ true,
/* asyncResponseDelegate= */ null)) /* asyncResponseDelegate= */ null))
.isNull(); .isNull();
@@ -355,6 +366,7 @@ public final class DataProcessManagerTest {
DataProcessManager.getBatteryLevelData( DataProcessManager.getBatteryLevelData(
mContext, mContext,
/* handler= */ null, /* handler= */ null,
mUserIdsSeries,
/* isFromPeriodJob= */ false, /* isFromPeriodJob= */ false,
/* asyncResponseDelegate= */ null); /* asyncResponseDelegate= */ null);
@@ -383,6 +395,7 @@ public final class DataProcessManagerTest {
DataProcessManager.getBatteryLevelData( DataProcessManager.getBatteryLevelData(
mContext, mContext,
/* handler= */ null, /* handler= */ null,
mUserIdsSeries,
/* isFromPeriodJob= */ false, /* isFromPeriodJob= */ false,
/* asyncResponseDelegate= */ null); /* asyncResponseDelegate= */ null);

View File

@@ -80,6 +80,7 @@ public final class DataProcessorTest {
@Mock private Intent mIntent; @Mock private Intent mIntent;
@Mock private BatteryUsageStats mBatteryUsageStats; @Mock private BatteryUsageStats mBatteryUsageStats;
@Mock private UserManager mUserManager; @Mock private UserManager mUserManager;
@Mock private UserIdsSeries mUserIdsSeries;
@Mock private IUsageStatsManager mUsageStatsManager; @Mock private IUsageStatsManager mUsageStatsManager;
@Mock private BatteryEntry mMockBatteryEntry1; @Mock private BatteryEntry mMockBatteryEntry1;
@Mock private BatteryEntry mMockBatteryEntry2; @Mock private BatteryEntry mMockBatteryEntry2;
@@ -95,6 +96,7 @@ public final class DataProcessorTest {
mContext = spy(RuntimeEnvironment.application); mContext = spy(RuntimeEnvironment.application);
mFeatureFactory = FakeFeatureFactory.setupForTest(); mFeatureFactory = FakeFeatureFactory.setupForTest();
mPowerUsageFeatureProvider = mFeatureFactory.powerUsageFeatureProvider; mPowerUsageFeatureProvider = mFeatureFactory.powerUsageFeatureProvider;
doReturn(true).when(mUserIdsSeries).isMainUserProfileOnly();
DataProcessor.sTestSystemAppsPackageNames = Set.of(); DataProcessor.sTestSystemAppsPackageNames = Set.of();
DataProcessor.sUsageStatsManager = mUsageStatsManager; DataProcessor.sUsageStatsManager = mUsageStatsManager;
@@ -118,8 +120,10 @@ public final class DataProcessorTest {
doReturn(mUsageEvents1) doReturn(mUsageEvents1)
.when(mUsageStatsManager) .when(mUsageStatsManager)
.queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString()); .queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString());
doReturn(new ArrayList<>(List.of(0))).when(mUserIdsSeries).getVisibleUserIds();
final Map<Long, UsageEvents> resultMap = DataProcessor.getAppUsageEvents(mContext); final Map<Long, UsageEvents> resultMap =
DataProcessor.getAppUsageEvents(mContext, mUserIdsSeries);
assertThat(resultMap).hasSize(1); assertThat(resultMap).hasSize(1);
assertThat(resultMap.get(Long.valueOf(userInfo.id))).isEqualTo(mUsageEvents1); assertThat(resultMap.get(Long.valueOf(userInfo.id))).isEqualTo(mUsageEvents1);
@@ -134,7 +138,8 @@ public final class DataProcessorTest {
// Test locked user. // Test locked user.
doReturn(false).when(mUserManager).isUserUnlocked(userInfo.id); doReturn(false).when(mUserManager).isUserUnlocked(userInfo.id);
final Map<Long, UsageEvents> resultMap = DataProcessor.getAppUsageEvents(mContext); final Map<Long, UsageEvents> resultMap =
DataProcessor.getAppUsageEvents(mContext, mUserIdsSeries);
assertThat(resultMap).isNull(); assertThat(resultMap).isNull();
} }
@@ -150,7 +155,8 @@ public final class DataProcessorTest {
.when(mUsageStatsManager) .when(mUsageStatsManager)
.queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString()); .queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString());
final Map<Long, UsageEvents> resultMap = DataProcessor.getAppUsageEvents(mContext); final Map<Long, UsageEvents> resultMap =
DataProcessor.getAppUsageEvents(mContext, mUserIdsSeries);
assertThat(resultMap).isNull(); assertThat(resultMap).isNull();
} }
@@ -163,7 +169,8 @@ public final class DataProcessorTest {
.when(mUsageStatsManager) .when(mUsageStatsManager)
.queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString()); .queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString());
assertThat(DataProcessor.getAppUsageEventsForUser(mContext, userId, 0)) assertThat(DataProcessor.getCurrentAppUsageEventsForUser(
mContext, mUserIdsSeries, userId, 0))
.isEqualTo(mUsageEvents1); .isEqualTo(mUsageEvents1);
} }
@@ -173,7 +180,9 @@ public final class DataProcessorTest {
// Test locked user. // Test locked user.
doReturn(false).when(mUserManager).isUserUnlocked(userId); doReturn(false).when(mUserManager).isUserUnlocked(userId);
assertThat(DataProcessor.getAppUsageEventsForUser(mContext, userId, 0)).isNull(); assertThat(DataProcessor.getCurrentAppUsageEventsForUser(
mContext, mUserIdsSeries, userId, 0))
.isNull();
} }
@Test @Test
@@ -184,7 +193,9 @@ public final class DataProcessorTest {
.when(mUsageStatsManager) .when(mUsageStatsManager)
.queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString()); .queryEventsForUser(anyLong(), anyLong(), anyInt(), anyString());
assertThat(DataProcessor.getAppUsageEventsForUser(mContext, userId, 0)).isNull(); assertThat(DataProcessor.getCurrentAppUsageEventsForUser(
mContext, mUserIdsSeries, userId, 0))
.isNull();
} }
@Test @Test
@@ -852,6 +863,7 @@ public final class DataProcessorTest {
assertThat( assertThat(
DataProcessor.getBatteryDiffDataMap( DataProcessor.getBatteryDiffDataMap(
mContext, mContext,
mUserIdsSeries,
hourlyBatteryLevelsPerDay, hourlyBatteryLevelsPerDay,
new HashMap<>(), new HashMap<>(),
/* appUsagePeriodMap= */ null, /* appUsagePeriodMap= */ null,
@@ -938,6 +950,7 @@ public final class DataProcessorTest {
Map<Long, BatteryDiffData> batteryDiffDataMap = Map<Long, BatteryDiffData> batteryDiffDataMap =
DataProcessor.getBatteryDiffDataMap( DataProcessor.getBatteryDiffDataMap(
mContext, mContext,
mUserIdsSeries,
batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryLevelData.getHourlyBatteryLevelsPerDay(),
batteryHistoryMap, batteryHistoryMap,
appUsagePeriodMap, appUsagePeriodMap,
@@ -1154,6 +1167,7 @@ public final class DataProcessorTest {
mContext, mContext,
DataProcessor.getBatteryDiffDataMap( DataProcessor.getBatteryDiffDataMap(
mContext, mContext,
mUserIdsSeries,
batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryLevelData.getHourlyBatteryLevelsPerDay(),
batteryHistoryMap, batteryHistoryMap,
appUsagePeriodMap, appUsagePeriodMap,
@@ -1271,6 +1285,10 @@ public final class DataProcessorTest {
}; };
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>(); final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>();
final int currentUserId = mContext.getUserId(); final int currentUserId = mContext.getUserId();
doReturn(false).when(mUserIdsSeries).isFromOtherUsers(currentUserId);
doReturn(true).when(mUserIdsSeries).isFromOtherUsers(currentUserId + 1);
doReturn(true).when(mUserIdsSeries).isFromOtherUsers(currentUserId + 2);
// Adds the index = 0 data. // Adds the index = 0 data.
Map<String, BatteryHistEntry> entryMap = new HashMap<>(); Map<String, BatteryHistEntry> entryMap = new HashMap<>();
BatteryHistEntry entry = BatteryHistEntry entry =
@@ -1431,6 +1449,7 @@ public final class DataProcessorTest {
mContext, mContext,
DataProcessor.getBatteryDiffDataMap( DataProcessor.getBatteryDiffDataMap(
mContext, mContext,
mUserIdsSeries,
batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryLevelData.getHourlyBatteryLevelsPerDay(),
batteryHistoryMap, batteryHistoryMap,
/* appUsagePeriodMap= */ null, /* appUsagePeriodMap= */ null,
@@ -1546,6 +1565,7 @@ public final class DataProcessorTest {
mContext, mContext,
DataProcessor.getBatteryDiffDataMap( DataProcessor.getBatteryDiffDataMap(
mContext, mContext,
mUserIdsSeries,
batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryLevelData.getHourlyBatteryLevelsPerDay(),
batteryHistoryMap, batteryHistoryMap,
appUsagePeriodMap, appUsagePeriodMap,
@@ -1701,6 +1721,7 @@ public final class DataProcessorTest {
mContext, mContext,
DataProcessor.getBatteryDiffDataMap( DataProcessor.getBatteryDiffDataMap(
mContext, mContext,
mUserIdsSeries,
batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryLevelData.getHourlyBatteryLevelsPerDay(),
batteryHistoryMap, batteryHistoryMap,
/* appUsagePeriodMap= */ null, /* appUsagePeriodMap= */ null,
@@ -1851,6 +1872,7 @@ public final class DataProcessorTest {
mContext, mContext,
DataProcessor.getBatteryDiffDataMap( DataProcessor.getBatteryDiffDataMap(
mContext, mContext,
mUserIdsSeries,
batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryLevelData.getHourlyBatteryLevelsPerDay(),
batteryHistoryMap, batteryHistoryMap,
/* appUsagePeriodMap= */ null, /* appUsagePeriodMap= */ null,
@@ -1873,6 +1895,7 @@ public final class DataProcessorTest {
final BatteryDiffData batteryDiffData = final BatteryDiffData batteryDiffData =
DataProcessor.generateBatteryDiffData( DataProcessor.generateBatteryDiffData(
mContext, mContext,
mUserIdsSeries,
System.currentTimeMillis(), System.currentTimeMillis(),
DataProcessor.convertToBatteryHistEntry(null, mBatteryUsageStats), DataProcessor.convertToBatteryHistEntry(null, mBatteryUsageStats),
/* systemAppsPackageNames= */ Set.of(), /* systemAppsPackageNames= */ Set.of(),
@@ -1933,6 +1956,7 @@ public final class DataProcessorTest {
final BatteryDiffData batteryDiffData = final BatteryDiffData batteryDiffData =
DataProcessor.generateBatteryDiffData( DataProcessor.generateBatteryDiffData(
mContext, mContext,
mUserIdsSeries,
System.currentTimeMillis(), System.currentTimeMillis(),
DataProcessor.convertToBatteryHistEntry( DataProcessor.convertToBatteryHistEntry(
batteryEntryList, mBatteryUsageStats), batteryEntryList, mBatteryUsageStats),