Load app usage events data in the hourly job.
Test: make RunSettingsRoboTests + manual Bug: 260964679 Change-Id: Iaccaa77bd52fb7356cdcb786c64523f21040b128
This commit is contained in:
@@ -29,6 +29,8 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventDao;
|
||||
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
|
||||
import com.android.settings.fuelgauge.batteryusage.db.BatteryState;
|
||||
import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDao;
|
||||
import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDatabase;
|
||||
@@ -43,11 +45,11 @@ public class BatteryUsageContentProvider extends ContentProvider {
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
|
||||
public static final Duration QUERY_DURATION_HOURS = Duration.ofDays(6);
|
||||
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
|
||||
public static final String QUERY_KEY_TIMESTAMP = "timestamp";
|
||||
|
||||
/** Codes */
|
||||
private static final int BATTERY_STATE_CODE = 1;
|
||||
private static final int APP_USAGE_LATEST_TIMESTAMP_CODE = 2;
|
||||
private static final int APP_USAGE_EVENT_CODE = 3;
|
||||
|
||||
private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
|
||||
|
||||
static {
|
||||
@@ -55,10 +57,19 @@ public class BatteryUsageContentProvider extends ContentProvider {
|
||||
DatabaseUtils.AUTHORITY,
|
||||
/*path=*/ DatabaseUtils.BATTERY_STATE_TABLE,
|
||||
/*code=*/ BATTERY_STATE_CODE);
|
||||
sUriMatcher.addURI(
|
||||
DatabaseUtils.AUTHORITY,
|
||||
/*path=*/ DatabaseUtils.APP_USAGE_LATEST_TIMESTAMP_PATH,
|
||||
/*code=*/ APP_USAGE_LATEST_TIMESTAMP_CODE);
|
||||
sUriMatcher.addURI(
|
||||
DatabaseUtils.AUTHORITY,
|
||||
/*path=*/ DatabaseUtils.APP_USAGE_EVENT_TABLE,
|
||||
/*code=*/ APP_USAGE_EVENT_CODE);
|
||||
}
|
||||
|
||||
private Clock mClock;
|
||||
private BatteryStateDao mBatteryStateDao;
|
||||
private AppUsageEventDao mAppUsageEventDao;
|
||||
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
|
||||
public void setClock(Clock clock) {
|
||||
@@ -73,6 +84,7 @@ public class BatteryUsageContentProvider extends ContentProvider {
|
||||
}
|
||||
mClock = Clock.systemUTC();
|
||||
mBatteryStateDao = BatteryStateDatabase.getInstance(getContext()).batteryStateDao();
|
||||
mAppUsageEventDao = BatteryStateDatabase.getInstance(getContext()).appUsageEventDao();
|
||||
Log.w(TAG, "create content provider from " + getCallingPackage());
|
||||
return true;
|
||||
}
|
||||
@@ -88,6 +100,8 @@ public class BatteryUsageContentProvider extends ContentProvider {
|
||||
switch (sUriMatcher.match(uri)) {
|
||||
case BATTERY_STATE_CODE:
|
||||
return getBatteryStates(uri);
|
||||
case APP_USAGE_LATEST_TIMESTAMP_CODE:
|
||||
return getAppUsageLatestTimestamp(uri);
|
||||
default:
|
||||
throw new IllegalArgumentException("unknown URI: " + uri);
|
||||
}
|
||||
@@ -111,6 +125,14 @@ public class BatteryUsageContentProvider extends ContentProvider {
|
||||
Log.e(TAG, "insert() from:" + uri + " error:" + e);
|
||||
return null;
|
||||
}
|
||||
case APP_USAGE_EVENT_CODE:
|
||||
try {
|
||||
mAppUsageEventDao.insert(AppUsageEventEntity.create(contentValues));
|
||||
return uri;
|
||||
} catch (RuntimeException e) {
|
||||
Log.e(TAG, "insert() from:" + uri + " error:" + e);
|
||||
return null;
|
||||
}
|
||||
default:
|
||||
throw new IllegalArgumentException("unknown URI: " + uri);
|
||||
}
|
||||
@@ -145,24 +167,54 @@ public class BatteryUsageContentProvider extends ContentProvider {
|
||||
Log.e(TAG, "query() from:" + uri + " error:" + e);
|
||||
}
|
||||
AsyncTask.execute(() -> BootBroadcastReceiver.invokeJobRecheck(getContext()));
|
||||
Log.w(TAG, "query battery states in " + (mClock.millis() - timestamp) + "/ms");
|
||||
Log.d(TAG, "query battery states in " + (mClock.millis() - timestamp) + "/ms");
|
||||
return cursor;
|
||||
}
|
||||
|
||||
private Cursor getAppUsageLatestTimestamp(Uri uri) {
|
||||
final long queryUserId = getQueryUserId(uri);
|
||||
if (queryUserId == DatabaseUtils.INVALID_USER_ID) {
|
||||
return null;
|
||||
}
|
||||
final long timestamp = mClock.millis();
|
||||
Cursor cursor = null;
|
||||
try {
|
||||
cursor = mAppUsageEventDao.getLatestTimestampOfUser(queryUserId);
|
||||
} catch (RuntimeException e) {
|
||||
Log.e(TAG, "query() from:" + uri + " error:" + e);
|
||||
}
|
||||
Log.d(TAG, String.format("query app usage latest timestamp %d for user %d in %d/ms",
|
||||
timestamp, queryUserId, (mClock.millis() - timestamp)));
|
||||
return cursor;
|
||||
}
|
||||
|
||||
// If URI contains query parameter QUERY_KEY_USERID, use the value directly.
|
||||
// Otherwise, return INVALID_USER_ID.
|
||||
private long getQueryUserId(Uri uri) {
|
||||
Log.d(TAG, "getQueryUserId from uri: " + uri);
|
||||
return getQueryValueFromUri(
|
||||
uri, DatabaseUtils.QUERY_KEY_USERID, DatabaseUtils.INVALID_USER_ID);
|
||||
}
|
||||
|
||||
// If URI contains query parameter QUERY_KEY_TIMESTAMP, use the value directly.
|
||||
// Otherwise, load the data for QUERY_DURATION_HOURS by default.
|
||||
private long getQueryTimestamp(Uri uri, long defaultTimestamp) {
|
||||
final String firstTimestampString = uri.getQueryParameter(QUERY_KEY_TIMESTAMP);
|
||||
if (TextUtils.isEmpty(firstTimestampString)) {
|
||||
Log.w(TAG, "empty query timestamp");
|
||||
return defaultTimestamp;
|
||||
Log.d(TAG, "getQueryTimestamp from uri: " + uri);
|
||||
return getQueryValueFromUri(uri, DatabaseUtils.QUERY_KEY_TIMESTAMP, defaultTimestamp);
|
||||
}
|
||||
|
||||
private long getQueryValueFromUri(Uri uri, String key, long defaultValue) {
|
||||
final String value = uri.getQueryParameter(key);
|
||||
if (TextUtils.isEmpty(value)) {
|
||||
Log.w(TAG, "empty query value");
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
try {
|
||||
return Long.parseLong(firstTimestampString);
|
||||
return Long.parseLong(value);
|
||||
} catch (NumberFormatException e) {
|
||||
Log.e(TAG, "invalid query timestamp: " + firstTimestampString, e);
|
||||
return defaultTimestamp;
|
||||
Log.e(TAG, "invalid query value: " + value, e);
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user