Format battery java code
After this CL, we can follow Guideline:go/hc-mainline-dev#format-code to keep java format consistent. Test: manual Bug: 304439460 Change-Id: I5bb77f81b0bd9be618e34942eaaee8296bc42796
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
package com.android.settings.fuelgauge.batteryusage;
|
||||
|
||||
import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.utcToLocalTimeForLogging;
|
||||
|
||||
import android.app.usage.IUsageStatsManager;
|
||||
@@ -65,8 +66,9 @@ public final class DatabaseUtils {
|
||||
private static final String TAG = "DatabaseUtils";
|
||||
private static final String SHARED_PREFS_FILE = "battery_usage_shared_prefs";
|
||||
|
||||
/** Clear memory threshold for device booting phase. **/
|
||||
/** Clear memory threshold for device booting phase. */
|
||||
private static final long CLEAR_MEMORY_THRESHOLD_MS = Duration.ofMinutes(5).toMillis();
|
||||
|
||||
private static final long CLEAR_MEMORY_DELAYED_MS = Duration.ofSeconds(2).toMillis();
|
||||
private static final long INVALID_TIMESTAMP = 0L;
|
||||
|
||||
@@ -78,28 +80,39 @@ public final class DatabaseUtils {
|
||||
|
||||
/** An authority name of the battery content provider. */
|
||||
public static final String AUTHORITY = "com.android.settings.battery.usage.provider";
|
||||
|
||||
/** A table name for app usage events. */
|
||||
public static final String APP_USAGE_EVENT_TABLE = "AppUsageEvent";
|
||||
|
||||
/** A table name for battery events. */
|
||||
public static final String BATTERY_EVENT_TABLE = "BatteryEvent";
|
||||
|
||||
/** A table name for battery usage history. */
|
||||
public static final String BATTERY_STATE_TABLE = "BatteryState";
|
||||
|
||||
/** A table name for battery usage slot. */
|
||||
public static final String BATTERY_USAGE_SLOT_TABLE = "BatteryUsageSlot";
|
||||
|
||||
/** A path name for last full charge time query. */
|
||||
public static final String LAST_FULL_CHARGE_TIMESTAMP_PATH = "lastFullChargeTimestamp";
|
||||
|
||||
/** A path name for querying the latest record timestamp in battery state table. */
|
||||
public static final String BATTERY_STATE_LATEST_TIMESTAMP_PATH = "batteryStateLatestTimestamp";
|
||||
|
||||
/** A path name for app usage latest timestamp query. */
|
||||
public static final String APP_USAGE_LATEST_TIMESTAMP_PATH = "appUsageLatestTimestamp";
|
||||
/** Key for query parameter timestamp used in BATTERY_CONTENT_URI **/
|
||||
|
||||
/** Key for query parameter timestamp used in BATTERY_CONTENT_URI */
|
||||
public static final String QUERY_KEY_TIMESTAMP = "timestamp";
|
||||
/** Key for query parameter userid used in APP_USAGE_EVENT_URI **/
|
||||
|
||||
/** Key for query parameter userid used in APP_USAGE_EVENT_URI */
|
||||
public static final String QUERY_KEY_USERID = "userid";
|
||||
/** Key for query parameter battery event type used in BATTERY_EVENT_URI **/
|
||||
|
||||
/** Key for query parameter battery event type used in BATTERY_EVENT_URI */
|
||||
public static final String QUERY_BATTERY_EVENT_TYPE = "batteryEventType";
|
||||
|
||||
public static final long INVALID_USER_ID = Integer.MIN_VALUE;
|
||||
|
||||
/**
|
||||
* The buffer hours to query app usage events that may have begun or ended out of the final
|
||||
* desired time frame.
|
||||
@@ -113,6 +126,7 @@ public final class DatabaseUtils {
|
||||
.authority(AUTHORITY)
|
||||
.appendPath(APP_USAGE_EVENT_TABLE)
|
||||
.build();
|
||||
|
||||
/** A content URI to access battery events data. */
|
||||
public static final Uri BATTERY_EVENT_URI =
|
||||
new Uri.Builder()
|
||||
@@ -120,6 +134,7 @@ public final class DatabaseUtils {
|
||||
.authority(AUTHORITY)
|
||||
.appendPath(BATTERY_EVENT_TABLE)
|
||||
.build();
|
||||
|
||||
/** A content URI to access battery usage states data. */
|
||||
public static final Uri BATTERY_CONTENT_URI =
|
||||
new Uri.Builder()
|
||||
@@ -127,6 +142,7 @@ public final class DatabaseUtils {
|
||||
.authority(AUTHORITY)
|
||||
.appendPath(BATTERY_STATE_TABLE)
|
||||
.build();
|
||||
|
||||
/** A content URI to access battery usage slots data. */
|
||||
public static final Uri BATTERY_USAGE_SLOT_URI =
|
||||
new Uri.Builder()
|
||||
@@ -139,11 +155,9 @@ public final class DatabaseUtils {
|
||||
List.of(BatteryEventType.FULL_CHARGED, BatteryEventType.EVEN_HOUR);
|
||||
|
||||
// For testing only.
|
||||
@VisibleForTesting
|
||||
static Supplier<Cursor> sFakeSupplier;
|
||||
@VisibleForTesting static Supplier<Cursor> sFakeSupplier;
|
||||
|
||||
private DatabaseUtils() {
|
||||
}
|
||||
private DatabaseUtils() {}
|
||||
|
||||
/** Returns true if current user is a work profile user. */
|
||||
public static boolean isWorkProfile(Context context) {
|
||||
@@ -161,15 +175,17 @@ public final class DatabaseUtils {
|
||||
.scheme(ContentResolver.SCHEME_CONTENT)
|
||||
.authority(AUTHORITY)
|
||||
.appendPath(APP_USAGE_LATEST_TIMESTAMP_PATH)
|
||||
.appendQueryParameter(
|
||||
QUERY_KEY_USERID, Long.toString(userId))
|
||||
.appendQueryParameter(QUERY_KEY_USERID, Long.toString(userId))
|
||||
.build();
|
||||
final long latestTimestamp = loadLongFromContentProvider(
|
||||
context, appUsageLatestTimestampUri, /*defaultValue=*/ INVALID_TIMESTAMP);
|
||||
final long latestTimestamp =
|
||||
loadLongFromContentProvider(
|
||||
context, appUsageLatestTimestampUri, /* defaultValue= */ INVALID_TIMESTAMP);
|
||||
final String latestTimestampString = utcToLocalTimeForLogging(latestTimestamp);
|
||||
Log.d(TAG, String.format(
|
||||
"getAppUsageStartTimestampOfUser() userId=%d latestTimestamp=%s in %d/ms",
|
||||
userId, latestTimestampString, (System.currentTimeMillis() - startTime)));
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"getAppUsageStartTimestampOfUser() userId=%d latestTimestamp=%s in %d/ms",
|
||||
userId, latestTimestampString, (System.currentTimeMillis() - startTime)));
|
||||
// Use (latestTimestamp + 1) here to avoid loading the events of the latestTimestamp
|
||||
// repeatedly.
|
||||
return Math.max(latestTimestamp + 1, earliestTimestamp);
|
||||
@@ -188,25 +204,30 @@ public final class DatabaseUtils {
|
||||
final long queryTimestamp =
|
||||
Math.max(rawStartTimestamp, sixDaysAgoTimestamp) - USAGE_QUERY_BUFFER_HOURS;
|
||||
Log.d(TAG, "sixDaysAgoTimestamp: " + utcToLocalTimeForLogging(sixDaysAgoTimestamp));
|
||||
final String queryUserIdString = userIds.stream()
|
||||
.map(userId -> String.valueOf(userId))
|
||||
.collect(Collectors.joining(","));
|
||||
final String queryUserIdString =
|
||||
userIds.stream()
|
||||
.map(userId -> String.valueOf(userId))
|
||||
.collect(Collectors.joining(","));
|
||||
// Builds the content uri everytime to avoid cache.
|
||||
final Uri appUsageEventUri =
|
||||
new Uri.Builder()
|
||||
.scheme(ContentResolver.SCHEME_CONTENT)
|
||||
.authority(AUTHORITY)
|
||||
.appendPath(APP_USAGE_EVENT_TABLE)
|
||||
.appendQueryParameter(
|
||||
QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
|
||||
.appendQueryParameter(QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
|
||||
.appendQueryParameter(QUERY_KEY_USERID, queryUserIdString)
|
||||
.build();
|
||||
|
||||
final List<AppUsageEvent> appUsageEventList = loadListFromContentProvider(
|
||||
context, appUsageEventUri, ConvertUtils::convertToAppUsageEvent);
|
||||
Log.d(TAG, String.format("getAppUsageEventForUser userId=%s size=%d in %d/ms",
|
||||
queryUserIdString, appUsageEventList.size(),
|
||||
(System.currentTimeMillis() - startTime)));
|
||||
final List<AppUsageEvent> appUsageEventList =
|
||||
loadListFromContentProvider(
|
||||
context, appUsageEventUri, ConvertUtils::convertToAppUsageEvent);
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"getAppUsageEventForUser userId=%s size=%d in %d/ms",
|
||||
queryUserIdString,
|
||||
appUsageEventList.size(),
|
||||
(System.currentTimeMillis() - startTime)));
|
||||
return appUsageEventList;
|
||||
}
|
||||
|
||||
@@ -220,25 +241,29 @@ public final class DatabaseUtils {
|
||||
final long sixDaysAgoTimestamp = getTimestampSixDaysAgo(calendar);
|
||||
final long queryTimestamp = Math.max(rawStartTimestamp, sixDaysAgoTimestamp);
|
||||
Log.d(TAG, "getBatteryEvents for timestamp: " + queryTimestamp);
|
||||
final String queryBatteryEventTypesString = queryBatteryEventTypes.stream()
|
||||
.map(type -> String.valueOf(type.getNumber()))
|
||||
.collect(Collectors.joining(","));
|
||||
final String queryBatteryEventTypesString =
|
||||
queryBatteryEventTypes.stream()
|
||||
.map(type -> String.valueOf(type.getNumber()))
|
||||
.collect(Collectors.joining(","));
|
||||
// Builds the content uri everytime to avoid cache.
|
||||
final Uri batteryEventUri =
|
||||
new Uri.Builder()
|
||||
.scheme(ContentResolver.SCHEME_CONTENT)
|
||||
.authority(AUTHORITY)
|
||||
.appendPath(BATTERY_EVENT_TABLE)
|
||||
.appendQueryParameter(
|
||||
QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
|
||||
.appendQueryParameter(QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
|
||||
.appendQueryParameter(
|
||||
QUERY_BATTERY_EVENT_TYPE, queryBatteryEventTypesString)
|
||||
.build();
|
||||
|
||||
final List<BatteryEvent> batteryEventList = loadListFromContentProvider(
|
||||
context, batteryEventUri, ConvertUtils::convertToBatteryEvent);
|
||||
Log.d(TAG, String.format("getBatteryEvents size=%d in %d/ms", batteryEventList.size(),
|
||||
(System.currentTimeMillis() - startTime)));
|
||||
final List<BatteryEvent> batteryEventList =
|
||||
loadListFromContentProvider(
|
||||
context, batteryEventUri, ConvertUtils::convertToBatteryEvent);
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"getBatteryEvents size=%d in %d/ms",
|
||||
batteryEventList.size(), (System.currentTimeMillis() - startTime)));
|
||||
return batteryEventList;
|
||||
}
|
||||
|
||||
@@ -246,9 +271,7 @@ public final class DatabaseUtils {
|
||||
* Returns the battery usage slot data after {@code rawStartTimestamp} in battery event table.
|
||||
*/
|
||||
public static List<BatteryUsageSlot> getBatteryUsageSlots(
|
||||
Context context,
|
||||
final Calendar calendar,
|
||||
final long rawStartTimestamp) {
|
||||
Context context, final Calendar calendar, final long rawStartTimestamp) {
|
||||
final long startTime = System.currentTimeMillis();
|
||||
final long sixDaysAgoTimestamp = getTimestampSixDaysAgo(calendar);
|
||||
final long queryTimestamp = Math.max(rawStartTimestamp, sixDaysAgoTimestamp);
|
||||
@@ -259,14 +282,17 @@ public final class DatabaseUtils {
|
||||
.scheme(ContentResolver.SCHEME_CONTENT)
|
||||
.authority(AUTHORITY)
|
||||
.appendPath(BATTERY_USAGE_SLOT_TABLE)
|
||||
.appendQueryParameter(
|
||||
QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
|
||||
.appendQueryParameter(QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
|
||||
.build();
|
||||
|
||||
final List<BatteryUsageSlot> batteryUsageSlotList = loadListFromContentProvider(
|
||||
context, batteryUsageSlotUri, ConvertUtils::convertToBatteryUsageSlot);
|
||||
Log.d(TAG, String.format("getBatteryUsageSlots size=%d in %d/ms",
|
||||
batteryUsageSlotList.size(), (System.currentTimeMillis() - startTime)));
|
||||
final List<BatteryUsageSlot> batteryUsageSlotList =
|
||||
loadListFromContentProvider(
|
||||
context, batteryUsageSlotUri, ConvertUtils::convertToBatteryUsageSlot);
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"getBatteryUsageSlots size=%d in %d/ms",
|
||||
batteryUsageSlotList.size(), (System.currentTimeMillis() - startTime)));
|
||||
return batteryUsageSlotList;
|
||||
}
|
||||
|
||||
@@ -280,12 +306,15 @@ public final class DatabaseUtils {
|
||||
.authority(AUTHORITY)
|
||||
.appendPath(LAST_FULL_CHARGE_TIMESTAMP_PATH)
|
||||
.build();
|
||||
final long lastFullChargeTime = loadLongFromContentProvider(
|
||||
context, lastFullChargeTimeUri, /*defaultValue=*/ INVALID_TIMESTAMP);
|
||||
final long lastFullChargeTime =
|
||||
loadLongFromContentProvider(
|
||||
context, lastFullChargeTimeUri, /* defaultValue= */ INVALID_TIMESTAMP);
|
||||
final String lastFullChargeTimeString = utcToLocalTimeForLogging(lastFullChargeTime);
|
||||
Log.d(TAG, String.format(
|
||||
"getLastFullChargeTime() lastFullChargeTime=%s in %d/ms",
|
||||
lastFullChargeTimeString, (System.currentTimeMillis() - startTime)));
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"getLastFullChargeTime() lastFullChargeTime=%s in %d/ms",
|
||||
lastFullChargeTimeString, (System.currentTimeMillis() - startTime)));
|
||||
return lastFullChargeTime;
|
||||
}
|
||||
|
||||
@@ -300,16 +329,21 @@ public final class DatabaseUtils {
|
||||
.scheme(ContentResolver.SCHEME_CONTENT)
|
||||
.authority(AUTHORITY)
|
||||
.appendPath(BATTERY_STATE_LATEST_TIMESTAMP_PATH)
|
||||
.appendQueryParameter(
|
||||
QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
|
||||
.appendQueryParameter(QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
|
||||
.build();
|
||||
final long batteryStateLatestTimestamp = loadLongFromContentProvider(
|
||||
context, batteryStateLatestTimestampUri, /*defaultValue=*/ INVALID_TIMESTAMP);
|
||||
final long batteryStateLatestTimestamp =
|
||||
loadLongFromContentProvider(
|
||||
context,
|
||||
batteryStateLatestTimestampUri,
|
||||
/* defaultValue= */ INVALID_TIMESTAMP);
|
||||
final String batteryStateLatestTimestampString =
|
||||
utcToLocalTimeForLogging(batteryStateLatestTimestamp);
|
||||
Log.d(TAG, String.format(
|
||||
"getBatteryStateLatestTimestamp() batteryStateLatestTimestamp=%s in %d/ms",
|
||||
batteryStateLatestTimestampString, (System.currentTimeMillis() - startTime)));
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"getBatteryStateLatestTimestamp() batteryStateLatestTimestamp=%s in %d/ms",
|
||||
batteryStateLatestTimestampString,
|
||||
(System.currentTimeMillis() - startTime)));
|
||||
return batteryStateLatestTimestamp;
|
||||
}
|
||||
|
||||
@@ -324,12 +358,12 @@ public final class DatabaseUtils {
|
||||
.scheme(ContentResolver.SCHEME_CONTENT)
|
||||
.authority(AUTHORITY)
|
||||
.appendPath(BATTERY_STATE_TABLE)
|
||||
.appendQueryParameter(
|
||||
QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
|
||||
.appendQueryParameter(QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
|
||||
.build();
|
||||
|
||||
final List<BatteryHistEntry> batteryHistEntryList = loadListFromContentProvider(
|
||||
context, batteryStateUri, cursor -> new BatteryHistEntry(cursor));
|
||||
final List<BatteryHistEntry> batteryHistEntryList =
|
||||
loadListFromContentProvider(
|
||||
context, batteryStateUri, cursor -> new BatteryHistEntry(cursor));
|
||||
final Map<Long, Map<String, BatteryHistEntry>> resultMap = new ArrayMap();
|
||||
for (final BatteryHistEntry entry : batteryHistEntryList) {
|
||||
final long timestamp = entry.mTimestamp;
|
||||
@@ -346,27 +380,37 @@ public final class DatabaseUtils {
|
||||
if (resultMap == null || resultMap.isEmpty()) {
|
||||
Log.d(TAG, "getBatteryHistoryMap() returns empty or null");
|
||||
} else {
|
||||
Log.d(TAG, String.format("getBatteryHistoryMap() size=%d in %d/ms",
|
||||
resultMap.size(), (System.currentTimeMillis() - startTime)));
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"getBatteryHistoryMap() size=%d in %d/ms",
|
||||
resultMap.size(), (System.currentTimeMillis() - startTime)));
|
||||
}
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the battery history map since the latest record no later than the given timestamp.
|
||||
* If there is no record before the given timestamp or the given timestamp is before last full
|
||||
* Returns the battery history map since the latest record no later than the given timestamp. If
|
||||
* there is no record before the given timestamp or the given timestamp is before last full
|
||||
* charge time, returns the history map since last full charge time.
|
||||
*/
|
||||
public static Map<Long, Map<String, BatteryHistEntry>>
|
||||
getHistoryMapSinceLatestRecordBeforeQueryTimestamp(Context context, Calendar calendar,
|
||||
final long queryTimestamp, final long lastFullChargeTime) {
|
||||
getHistoryMapSinceLatestRecordBeforeQueryTimestamp(
|
||||
Context context,
|
||||
Calendar calendar,
|
||||
final long queryTimestamp,
|
||||
final long lastFullChargeTime) {
|
||||
final long sixDaysAgoTimestamp = getTimestampSixDaysAgo(calendar);
|
||||
Log.d(TAG, "sixDaysAgoTimestamp: " + utcToLocalTimeForLogging(sixDaysAgoTimestamp));
|
||||
final long batteryStateLatestTimestamp =
|
||||
queryTimestamp == 0L ? 0L : getBatteryStateLatestTimestampBeforeQueryTimestamp(
|
||||
context, queryTimestamp);
|
||||
final long maxTimestamp = Math.max(Math.max(
|
||||
sixDaysAgoTimestamp, lastFullChargeTime), batteryStateLatestTimestamp);
|
||||
queryTimestamp == 0L
|
||||
? 0L
|
||||
: getBatteryStateLatestTimestampBeforeQueryTimestamp(
|
||||
context, queryTimestamp);
|
||||
final long maxTimestamp =
|
||||
Math.max(
|
||||
Math.max(sixDaysAgoTimestamp, lastFullChargeTime),
|
||||
batteryStateLatestTimestamp);
|
||||
return getHistoryMapSinceQueryTimestamp(context, maxTimestamp);
|
||||
}
|
||||
|
||||
@@ -380,36 +424,39 @@ public final class DatabaseUtils {
|
||||
|
||||
/** Clears all data in the battery usage database. */
|
||||
public static void clearAll(Context context) {
|
||||
AsyncTask.execute(() -> {
|
||||
try {
|
||||
final BatteryStateDatabase database = BatteryStateDatabase
|
||||
.getInstance(context.getApplicationContext());
|
||||
database.appUsageEventDao().clearAll();
|
||||
database.batteryEventDao().clearAll();
|
||||
database.batteryStateDao().clearAll();
|
||||
database.batteryUsageSlotDao().clearAll();
|
||||
} catch (RuntimeException e) {
|
||||
Log.e(TAG, "clearAll() failed", e);
|
||||
}
|
||||
});
|
||||
AsyncTask.execute(
|
||||
() -> {
|
||||
try {
|
||||
final BatteryStateDatabase database =
|
||||
BatteryStateDatabase.getInstance(context.getApplicationContext());
|
||||
database.appUsageEventDao().clearAll();
|
||||
database.batteryEventDao().clearAll();
|
||||
database.batteryStateDao().clearAll();
|
||||
database.batteryUsageSlotDao().clearAll();
|
||||
} catch (RuntimeException e) {
|
||||
Log.e(TAG, "clearAll() failed", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** Clears all out-of-date data in the battery usage database. */
|
||||
public static void clearExpiredDataIfNeeded(Context context) {
|
||||
AsyncTask.execute(() -> {
|
||||
try {
|
||||
final BatteryStateDatabase database = BatteryStateDatabase
|
||||
.getInstance(context.getApplicationContext());
|
||||
final long earliestTimestamp = Clock.systemUTC().millis()
|
||||
- Duration.ofDays(DATA_RETENTION_INTERVAL_DAY).toMillis();
|
||||
database.appUsageEventDao().clearAllBefore(earliestTimestamp);
|
||||
database.batteryEventDao().clearAllBefore(earliestTimestamp);
|
||||
database.batteryStateDao().clearAllBefore(earliestTimestamp);
|
||||
database.batteryUsageSlotDao().clearAllBefore(earliestTimestamp);
|
||||
} catch (RuntimeException e) {
|
||||
Log.e(TAG, "clearAllBefore() failed", e);
|
||||
}
|
||||
});
|
||||
AsyncTask.execute(
|
||||
() -> {
|
||||
try {
|
||||
final BatteryStateDatabase database =
|
||||
BatteryStateDatabase.getInstance(context.getApplicationContext());
|
||||
final long earliestTimestamp =
|
||||
Clock.systemUTC().millis()
|
||||
- Duration.ofDays(DATA_RETENTION_INTERVAL_DAY).toMillis();
|
||||
database.appUsageEventDao().clearAllBefore(earliestTimestamp);
|
||||
database.batteryEventDao().clearAllBefore(earliestTimestamp);
|
||||
database.batteryStateDao().clearAllBefore(earliestTimestamp);
|
||||
database.batteryUsageSlotDao().clearAllBefore(earliestTimestamp);
|
||||
} catch (RuntimeException e) {
|
||||
Log.e(TAG, "clearAllBefore() failed", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** Clears all data and jobs if current timestamp is out of the range of last recorded job. */
|
||||
@@ -458,9 +505,9 @@ public final class DatabaseUtils {
|
||||
if (isWorkProfile(context)) {
|
||||
try {
|
||||
return context.createPackageContextAsUser(
|
||||
/*packageName=*/ context.getPackageName(),
|
||||
/*flags=*/ 0,
|
||||
/*user=*/ context.getSystemService(UserManager.class)
|
||||
/* packageName= */ context.getPackageName(),
|
||||
/* flags= */ 0,
|
||||
/* user= */ context.getSystemService(UserManager.class)
|
||||
.getProfileParent(context.getUser()));
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
Log.e(TAG, "context.createPackageContextAsUser() fail:", e);
|
||||
@@ -477,8 +524,11 @@ public final class DatabaseUtils {
|
||||
final List<ContentValues> valuesList = new ArrayList<>();
|
||||
appUsageEventList.stream()
|
||||
.filter(appUsageEvent -> appUsageEvent.hasUid())
|
||||
.forEach(appUsageEvent -> valuesList.add(
|
||||
ConvertUtils.convertAppUsageEventToContentValues(appUsageEvent)));
|
||||
.forEach(
|
||||
appUsageEvent ->
|
||||
valuesList.add(
|
||||
ConvertUtils.convertAppUsageEventToContentValues(
|
||||
appUsageEvent)));
|
||||
int size = 0;
|
||||
final ContentResolver resolver = context.getContentResolver();
|
||||
// Inserts all ContentValues into battery provider.
|
||||
@@ -487,14 +537,17 @@ public final class DatabaseUtils {
|
||||
valuesList.toArray(valuesArray);
|
||||
try {
|
||||
size = resolver.bulkInsert(APP_USAGE_EVENT_URI, valuesArray);
|
||||
resolver.notifyChange(APP_USAGE_EVENT_URI, /*observer=*/ null);
|
||||
resolver.notifyChange(APP_USAGE_EVENT_URI, /* observer= */ null);
|
||||
Log.d(TAG, "insert() app usage events data into database");
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "bulkInsert() app usage data into database error:", e);
|
||||
}
|
||||
}
|
||||
Log.d(TAG, String.format("sendAppUsageEventData() size=%d in %d/ms",
|
||||
size, (System.currentTimeMillis() - startTime)));
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"sendAppUsageEventData() size=%d in %d/ms",
|
||||
size, (System.currentTimeMillis() - startTime)));
|
||||
clearMemory();
|
||||
return valuesList;
|
||||
}
|
||||
@@ -510,8 +563,11 @@ public final class DatabaseUtils {
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "insert() battery event data into database error:", e);
|
||||
}
|
||||
Log.d(TAG, String.format("sendBatteryEventData() in %d/ms",
|
||||
(System.currentTimeMillis() - startTime)));
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"sendBatteryEventData() in %d/ms",
|
||||
(System.currentTimeMillis() - startTime)));
|
||||
clearMemory();
|
||||
return contentValues;
|
||||
}
|
||||
@@ -522,8 +578,11 @@ public final class DatabaseUtils {
|
||||
// Creates the ContentValues list to insert them into provider.
|
||||
final List<ContentValues> valuesList = new ArrayList<>();
|
||||
batteryEventList.stream()
|
||||
.forEach(batteryEvent -> valuesList.add(
|
||||
ConvertUtils.convertBatteryEventToContentValues(batteryEvent)));
|
||||
.forEach(
|
||||
batteryEvent ->
|
||||
valuesList.add(
|
||||
ConvertUtils.convertBatteryEventToContentValues(
|
||||
batteryEvent)));
|
||||
int size = 0;
|
||||
final ContentResolver resolver = context.getContentResolver();
|
||||
// Inserts all ContentValues into battery provider.
|
||||
@@ -532,14 +591,17 @@ public final class DatabaseUtils {
|
||||
valuesList.toArray(valuesArray);
|
||||
try {
|
||||
size = resolver.bulkInsert(BATTERY_EVENT_URI, valuesArray);
|
||||
resolver.notifyChange(BATTERY_EVENT_URI, /*observer=*/ null);
|
||||
resolver.notifyChange(BATTERY_EVENT_URI, /* observer= */ null);
|
||||
Log.d(TAG, "insert() battery event data into database");
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "bulkInsert() battery event data into database error:", e);
|
||||
}
|
||||
}
|
||||
Log.d(TAG, String.format("sendBatteryEventData() size=%d in %d/ms",
|
||||
size, (System.currentTimeMillis() - startTime)));
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"sendBatteryEventData() size=%d in %d/ms",
|
||||
size, (System.currentTimeMillis() - startTime)));
|
||||
clearMemory();
|
||||
return valuesList;
|
||||
}
|
||||
@@ -550,8 +612,11 @@ public final class DatabaseUtils {
|
||||
// Creates the ContentValues list to insert them into provider.
|
||||
final List<ContentValues> valuesList = new ArrayList<>();
|
||||
batteryUsageSlotList.stream()
|
||||
.forEach(batteryUsageSlot -> valuesList.add(
|
||||
ConvertUtils.convertBatteryUsageSlotToContentValues(batteryUsageSlot)));
|
||||
.forEach(
|
||||
batteryUsageSlot ->
|
||||
valuesList.add(
|
||||
ConvertUtils.convertBatteryUsageSlotToContentValues(
|
||||
batteryUsageSlot)));
|
||||
int size = 0;
|
||||
final ContentResolver resolver = context.getContentResolver();
|
||||
// Inserts all ContentValues into battery provider.
|
||||
@@ -560,14 +625,17 @@ public final class DatabaseUtils {
|
||||
valuesList.toArray(valuesArray);
|
||||
try {
|
||||
size = resolver.bulkInsert(BATTERY_USAGE_SLOT_URI, valuesArray);
|
||||
resolver.notifyChange(BATTERY_USAGE_SLOT_URI, /*observer=*/ null);
|
||||
resolver.notifyChange(BATTERY_USAGE_SLOT_URI, /* observer= */ null);
|
||||
Log.d(TAG, "insert() battery usage slots data into database");
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "bulkInsert() battery usage slots data into database error:", e);
|
||||
}
|
||||
}
|
||||
Log.d(TAG, String.format("sendBatteryUsageSlotData() size=%d in %d/ms",
|
||||
size, (System.currentTimeMillis() - startTime)));
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"sendBatteryUsageSlotData() size=%d in %d/ms",
|
||||
size, (System.currentTimeMillis() - startTime)));
|
||||
clearMemory();
|
||||
return valuesList;
|
||||
}
|
||||
@@ -586,10 +654,12 @@ public final class DatabaseUtils {
|
||||
return null;
|
||||
}
|
||||
final int batteryLevel = BatteryStatus.getBatteryLevel(intent);
|
||||
final int batteryStatus = intent.getIntExtra(
|
||||
BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_UNKNOWN);
|
||||
final int batteryHealth = intent.getIntExtra(
|
||||
BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN);
|
||||
final int batteryStatus =
|
||||
intent.getIntExtra(
|
||||
BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_UNKNOWN);
|
||||
final int batteryHealth =
|
||||
intent.getIntExtra(
|
||||
BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN);
|
||||
// We should use the same timestamp for each data snapshot.
|
||||
final long snapshotBootTimestamp = SystemClock.elapsedRealtime();
|
||||
|
||||
@@ -597,30 +667,35 @@ public final class DatabaseUtils {
|
||||
final List<ContentValues> valuesList = new ArrayList<>();
|
||||
if (batteryEntryList != null) {
|
||||
batteryEntryList.stream()
|
||||
.filter(entry -> {
|
||||
final long foregroundMs = entry.getTimeInForegroundMs();
|
||||
final long backgroundMs = entry.getTimeInBackgroundMs();
|
||||
if (entry.getConsumedPower() == 0
|
||||
&& (foregroundMs != 0
|
||||
|| backgroundMs != 0)) {
|
||||
Log.w(TAG, String.format(
|
||||
"no consumed power but has running time for %s time=%d|%d",
|
||||
entry.getLabel(), foregroundMs, backgroundMs));
|
||||
}
|
||||
return entry.getConsumedPower() != 0
|
||||
|| foregroundMs != 0
|
||||
|| backgroundMs != 0;
|
||||
})
|
||||
.forEach(entry -> valuesList.add(
|
||||
ConvertUtils.convertBatteryEntryToContentValues(
|
||||
entry,
|
||||
batteryUsageStats,
|
||||
batteryLevel,
|
||||
batteryStatus,
|
||||
batteryHealth,
|
||||
snapshotBootTimestamp,
|
||||
snapshotTimestamp,
|
||||
isFullChargeStart)));
|
||||
.filter(
|
||||
entry -> {
|
||||
final long foregroundMs = entry.getTimeInForegroundMs();
|
||||
final long backgroundMs = entry.getTimeInBackgroundMs();
|
||||
if (entry.getConsumedPower() == 0
|
||||
&& (foregroundMs != 0 || backgroundMs != 0)) {
|
||||
Log.w(
|
||||
TAG,
|
||||
String.format(
|
||||
"no consumed power but has running time for %s"
|
||||
+ " time=%d|%d",
|
||||
entry.getLabel(), foregroundMs, backgroundMs));
|
||||
}
|
||||
return entry.getConsumedPower() != 0
|
||||
|| foregroundMs != 0
|
||||
|| backgroundMs != 0;
|
||||
})
|
||||
.forEach(
|
||||
entry ->
|
||||
valuesList.add(
|
||||
ConvertUtils.convertBatteryEntryToContentValues(
|
||||
entry,
|
||||
batteryUsageStats,
|
||||
batteryLevel,
|
||||
batteryStatus,
|
||||
batteryHealth,
|
||||
snapshotBootTimestamp,
|
||||
snapshotTimestamp,
|
||||
isFullChargeStart)));
|
||||
}
|
||||
|
||||
int size = 1;
|
||||
@@ -632,8 +707,10 @@ public final class DatabaseUtils {
|
||||
valuesList.toArray(valuesArray);
|
||||
try {
|
||||
size = resolver.bulkInsert(BATTERY_CONTENT_URI, valuesArray);
|
||||
Log.d(TAG, "insert() battery states data into database with isFullChargeStart:"
|
||||
+ isFullChargeStart);
|
||||
Log.d(
|
||||
TAG,
|
||||
"insert() battery states data into database with isFullChargeStart:"
|
||||
+ isFullChargeStart);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "bulkInsert() data into database error:", e);
|
||||
}
|
||||
@@ -641,8 +718,8 @@ public final class DatabaseUtils {
|
||||
// Inserts one fake data into battery provider.
|
||||
final ContentValues contentValues =
|
||||
ConvertUtils.convertBatteryEntryToContentValues(
|
||||
/*entry=*/ null,
|
||||
/*batteryUsageStats=*/ null,
|
||||
/* entry= */ null,
|
||||
/* batteryUsageStats= */ null,
|
||||
batteryLevel,
|
||||
batteryStatus,
|
||||
batteryHealth,
|
||||
@@ -651,21 +728,23 @@ public final class DatabaseUtils {
|
||||
isFullChargeStart);
|
||||
try {
|
||||
resolver.insert(BATTERY_CONTENT_URI, contentValues);
|
||||
Log.d(TAG, "insert() data into database with isFullChargeStart:"
|
||||
+ isFullChargeStart);
|
||||
Log.d(
|
||||
TAG,
|
||||
"insert() data into database with isFullChargeStart:" + isFullChargeStart);
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "insert() data into database error:", e);
|
||||
}
|
||||
valuesList.add(contentValues);
|
||||
}
|
||||
resolver.notifyChange(BATTERY_CONTENT_URI, /*observer=*/ null);
|
||||
resolver.notifyChange(BATTERY_CONTENT_URI, /* observer= */ null);
|
||||
BatteryUsageLogUtils.writeLog(
|
||||
context,
|
||||
Action.INSERT_USAGE_DATA,
|
||||
"size=" + size + " " + errorMessage);
|
||||
Log.d(TAG, String.format("sendBatteryEntryData() size=%d in %d/ms",
|
||||
size, (System.currentTimeMillis() - startTime)));
|
||||
context, Action.INSERT_USAGE_DATA, "size=" + size + " " + errorMessage);
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"sendBatteryEntryData() size=%d in %d/ms",
|
||||
size, (System.currentTimeMillis() - startTime)));
|
||||
if (isFullChargeStart) {
|
||||
recordDateTime(context, KEY_LAST_UPLOAD_FULL_CHARGE_TIME);
|
||||
}
|
||||
@@ -675,25 +754,30 @@ public final class DatabaseUtils {
|
||||
|
||||
/** Dump all required data into {@link PrintWriter}. */
|
||||
public static void dump(Context context, PrintWriter writer) {
|
||||
writeString(context, writer, "BatteryLevelChanged",
|
||||
Intent.ACTION_BATTERY_LEVEL_CHANGED);
|
||||
writeString(context, writer, "BatteryPlugging",
|
||||
writeString(context, writer, "BatteryLevelChanged", Intent.ACTION_BATTERY_LEVEL_CHANGED);
|
||||
writeString(
|
||||
context,
|
||||
writer,
|
||||
"BatteryPlugging",
|
||||
BatteryUsageBroadcastReceiver.ACTION_BATTERY_PLUGGING);
|
||||
writeString(context, writer, "BatteryUnplugging",
|
||||
writeString(
|
||||
context,
|
||||
writer,
|
||||
"BatteryUnplugging",
|
||||
BatteryUsageBroadcastReceiver.ACTION_BATTERY_UNPLUGGING);
|
||||
writeString(context, writer, "ClearBatteryCacheData",
|
||||
writeString(
|
||||
context,
|
||||
writer,
|
||||
"ClearBatteryCacheData",
|
||||
BatteryUsageBroadcastReceiver.ACTION_CLEAR_BATTERY_CACHE_DATA);
|
||||
writeString(context, writer, "LastLoadFullChargeTime",
|
||||
KEY_LAST_LOAD_FULL_CHARGE_TIME);
|
||||
writeString(context, writer, "LastUploadFullChargeTime",
|
||||
KEY_LAST_UPLOAD_FULL_CHARGE_TIME);
|
||||
writeString(context, writer, "DismissedPowerAnomalyKeys",
|
||||
KEY_DISMISSED_POWER_ANOMALY_KEYS);
|
||||
writeString(context, writer, "LastLoadFullChargeTime", KEY_LAST_LOAD_FULL_CHARGE_TIME);
|
||||
writeString(context, writer, "LastUploadFullChargeTime", KEY_LAST_UPLOAD_FULL_CHARGE_TIME);
|
||||
writeString(context, writer, "DismissedPowerAnomalyKeys", KEY_DISMISSED_POWER_ANOMALY_KEYS);
|
||||
}
|
||||
|
||||
static SharedPreferences getSharedPreferences(Context context) {
|
||||
return context.getApplicationContext().getSharedPreferences(
|
||||
SHARED_PREFS_FILE, Context.MODE_PRIVATE);
|
||||
return context.getApplicationContext()
|
||||
.getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);
|
||||
}
|
||||
|
||||
static void removeUsageSource(Context context) {
|
||||
@@ -711,8 +795,8 @@ public final class DatabaseUtils {
|
||||
static int getUsageSource(Context context, IUsageStatsManager usageStatsManager) {
|
||||
final SharedPreferences sharedPreferences = getSharedPreferences(context);
|
||||
if (sharedPreferences != null && sharedPreferences.contains(KEY_LAST_USAGE_SOURCE)) {
|
||||
return sharedPreferences
|
||||
.getInt(KEY_LAST_USAGE_SOURCE, ConvertUtils.DEFAULT_USAGE_SOURCE);
|
||||
return sharedPreferences.getInt(
|
||||
KEY_LAST_USAGE_SOURCE, ConvertUtils.DEFAULT_USAGE_SOURCE);
|
||||
}
|
||||
int usageSource = ConvertUtils.DEFAULT_USAGE_SOURCE;
|
||||
|
||||
@@ -747,7 +831,8 @@ public final class DatabaseUtils {
|
||||
if (sharedPreferences != null) {
|
||||
final Set<String> dismissedPowerAnomalyKeys = getDismissedPowerAnomalyKeys(context);
|
||||
dismissedPowerAnomalyKeys.add(dismissedPowerAnomalyKey);
|
||||
sharedPreferences.edit()
|
||||
sharedPreferences
|
||||
.edit()
|
||||
.putStringSet(KEY_DISMISSED_POWER_ANOMALY_KEYS, dismissedPowerAnomalyKeys)
|
||||
.apply();
|
||||
}
|
||||
@@ -769,22 +854,32 @@ public final class DatabaseUtils {
|
||||
if (context == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
try (Cursor cursor = sFakeSupplier != null ? sFakeSupplier.get() :
|
||||
context.getContentResolver().query(uri, null, null, null)) {
|
||||
try (Cursor cursor =
|
||||
sFakeSupplier != null
|
||||
? sFakeSupplier.get()
|
||||
: context.getContentResolver().query(uri, null, null, null)) {
|
||||
return (cursor == null || cursor.getCount() == 0)
|
||||
? defaultValue : cursorReader.apply(cursor);
|
||||
? defaultValue
|
||||
: cursorReader.apply(cursor);
|
||||
}
|
||||
}
|
||||
|
||||
private static long loadLongFromContentProvider(
|
||||
Context context, Uri uri, final long defaultValue) {
|
||||
return loadFromContentProvider(context, uri, defaultValue,
|
||||
cursor -> cursor.moveToFirst() ? cursor.getLong(/*columnIndex=*/ 0) : defaultValue);
|
||||
return loadFromContentProvider(
|
||||
context,
|
||||
uri,
|
||||
defaultValue,
|
||||
cursor ->
|
||||
cursor.moveToFirst() ? cursor.getLong(/* columnIndex= */ 0) : defaultValue);
|
||||
}
|
||||
|
||||
private static <E> List<E> loadListFromContentProvider(
|
||||
Context context, Uri uri, Function<Cursor, E> converter) {
|
||||
return loadFromContentProvider(context, uri, new ArrayList<>(),
|
||||
return loadFromContentProvider(
|
||||
context,
|
||||
uri,
|
||||
new ArrayList<>(),
|
||||
cursor -> {
|
||||
final List<E> list = new ArrayList<>();
|
||||
while (cursor.moveToNext()) {
|
||||
@@ -808,11 +903,13 @@ public final class DatabaseUtils {
|
||||
return;
|
||||
}
|
||||
final Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||
mainHandler.postDelayed(() -> {
|
||||
System.gc();
|
||||
System.runFinalization();
|
||||
System.gc();
|
||||
Log.w(TAG, "invoke clearMemory()");
|
||||
}, CLEAR_MEMORY_DELAYED_MS);
|
||||
mainHandler.postDelayed(
|
||||
() -> {
|
||||
System.gc();
|
||||
System.runFinalization();
|
||||
System.gc();
|
||||
Log.w(TAG, "invoke clearMemory()");
|
||||
},
|
||||
CLEAR_MEMORY_DELAYED_MS);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user