Merge "Use the field isFullChargeCycleStart in database to get the last full charge cycle start and remove the unused SharedPreference."

This commit is contained in:
Kuan Wang
2022-11-28 06:44:42 +00:00
committed by Android (Google) Code Review
14 changed files with 159 additions and 255 deletions

View File

@@ -71,7 +71,8 @@ public final class BatteryHistEntryTest {
/*batteryStatus=*/ BatteryManager.BATTERY_STATUS_FULL,
/*batteryHealth=*/ BatteryManager.BATTERY_HEALTH_COLD,
/*bootTimestamp=*/ 101L,
/*timestamp=*/ 10001L);
/*timestamp=*/ 10001L,
/*isFullChargeStart=*/ false);
assertBatteryHistEntry(
new BatteryHistEntry(values),

View File

@@ -49,6 +49,9 @@ import java.util.concurrent.TimeUnit;
@RunWith(RobolectricTestRunner.class)
public final class BatteryUsageContentProviderTest {
private static final Uri VALID_BATTERY_STATE_CONTENT_URI = DatabaseUtils.BATTERY_CONTENT_URI;
private static final String PACKAGE_NAME1 = "com.android.settings1";
private static final String PACKAGE_NAME2 = "com.android.settings2";
private static final String PACKAGE_NAME3 = "com.android.settings3";
private Context mContext;
private BatteryUsageContentProvider mProvider;
@@ -118,31 +121,60 @@ public final class BatteryUsageContentProviderTest {
public void query_batteryState_returnsExpectedResult() throws Exception {
mProvider.onCreate();
final Duration currentTime = Duration.ofHours(52);
final long expiredTimeCutoff = currentTime.toMillis()
- BatteryUsageContentProvider.QUERY_DURATION_HOURS.toMillis();
testQueryBatteryState(currentTime, expiredTimeCutoff, /*hasQueryTimestamp=*/ false);
final long expiredTimeCutoff = currentTime.toMillis() - 3;
final Cursor cursor = insertBatteryState(currentTime, Long.toString(expiredTimeCutoff));
// Verifies the result not include expired data.
assertThat(cursor.getCount()).isEqualTo(3);
final int packageNameIndex = cursor.getColumnIndex("packageName");
// Verifies the first data package name.
cursor.moveToFirst();
final String actualPackageName1 = cursor.getString(packageNameIndex);
assertThat(actualPackageName1).isEqualTo(PACKAGE_NAME1);
// Verifies the second data package name.
cursor.moveToNext();
final String actualPackageName2 = cursor.getString(packageNameIndex);
assertThat(actualPackageName2).isEqualTo(PACKAGE_NAME2);
// Verifies the third data package name.
cursor.moveToNext();
final String actualPackageName3 = cursor.getString(packageNameIndex);
assertThat(actualPackageName3).isEqualTo(PACKAGE_NAME3);
cursor.close();
// Verifies the broadcast intent.
TimeUnit.SECONDS.sleep(1);
final List<Intent> intents = Shadows.shadowOf((Application) mContext).getBroadcastIntents();
assertThat(intents).hasSize(1);
assertThat(intents.get(0).getAction()).isEqualTo(
BootBroadcastReceiver.ACTION_PERIODIC_JOB_RECHECK);
}
@Test
public void query_batteryStateTimestamp_returnsExpectedResult() throws Exception {
mProvider.onCreate();
final Duration currentTime = Duration.ofHours(52);
final long expiredTimeCutoff = currentTime.toMillis() - Duration.ofHours(10).toMillis();
testQueryBatteryState(currentTime, expiredTimeCutoff, /*hasQueryTimestamp=*/ true);
}
final long expiredTimeCutoff = currentTime.toMillis() - 1;
@Test
public void query_incorrectParameterFormat_returnsExpectedResult() throws Exception {
mProvider.onCreate();
final Duration currentTime = Duration.ofHours(52);
final long expiredTimeCutoff =
currentTime.toMillis()
- BatteryUsageContentProvider.QUERY_DURATION_HOURS.toMillis();
testQueryBatteryState(
currentTime,
expiredTimeCutoff,
/*hasQueryTimestamp=*/ false,
/*customParameter=*/ "invalid number format");
final Cursor cursor = insertBatteryState(currentTime, Long.toString(expiredTimeCutoff));
// Verifies the result not include expired data.
assertThat(cursor.getCount()).isEqualTo(2);
final int packageNameIndex = cursor.getColumnIndex("packageName");
// Verifies the first data package name.
cursor.moveToFirst();
final String actualPackageName1 = cursor.getString(packageNameIndex);
assertThat(actualPackageName1).isEqualTo(PACKAGE_NAME2);
// Verifies the third data package name.
cursor.moveToNext();
final String actualPackageName2 = cursor.getString(packageNameIndex);
assertThat(actualPackageName2).isEqualTo(PACKAGE_NAME3);
cursor.close();
// Verifies the broadcast intent.
TimeUnit.SECONDS.sleep(1);
final List<Intent> intents = Shadows.shadowOf((Application) mContext).getBroadcastIntents();
assertThat(intents).hasSize(1);
assertThat(intents.get(0).getAction()).isEqualTo(
BootBroadcastReceiver.ACTION_PERIODIC_JOB_RECHECK);
}
@Test
@@ -247,54 +279,32 @@ public final class BatteryUsageContentProviderTest {
/*strings=*/ null));
}
private void testQueryBatteryState(
Duration currentTime, long expiredTimeCutoff, boolean hasQueryTimestamp)
throws Exception {
testQueryBatteryState(currentTime, expiredTimeCutoff, hasQueryTimestamp, null);
}
private void testQueryBatteryState(
private Cursor insertBatteryState(
Duration currentTime,
long expiredTimeCutoff,
boolean hasQueryTimestamp,
String customParameter)
String queryTimestamp)
throws Exception {
mProvider.onCreate();
final FakeClock fakeClock = new FakeClock();
fakeClock.setCurrentTime(currentTime);
mProvider.setClock(fakeClock);
// Inserts some expired testing data.
BatteryTestUtils.insertDataToBatteryStateDatabase(
mContext, expiredTimeCutoff - 1, "com.android.sysui1");
BatteryTestUtils.insertDataToBatteryStateDatabase(
mContext, expiredTimeCutoff - 2, "com.android.sysui2");
BatteryTestUtils.insertDataToBatteryStateDatabase(
mContext, expiredTimeCutoff - 3, "com.android.sysui3");
final long currentTimestamp = currentTime.toMillis();
// Inserts some valid testing data.
final String packageName1 = "com.android.settings1";
final String packageName2 = "com.android.settings2";
final String packageName3 = "com.android.settings3";
BatteryTestUtils.insertDataToBatteryStateDatabase(
mContext, currentTime.toMillis(), packageName1);
mContext, currentTimestamp - 2, PACKAGE_NAME1,
/*isFullChargeStart=*/ true);
BatteryTestUtils.insertDataToBatteryStateDatabase(
mContext, expiredTimeCutoff + 2, packageName2);
mContext, currentTimestamp - 1, PACKAGE_NAME2);
BatteryTestUtils.insertDataToBatteryStateDatabase(
mContext, expiredTimeCutoff, packageName3);
mContext, currentTimestamp, PACKAGE_NAME3);
final Uri.Builder builder =
final Uri batteryStateQueryContentUri =
new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(DatabaseUtils.AUTHORITY)
.appendPath(DatabaseUtils.BATTERY_STATE_TABLE);
if (customParameter != null) {
builder.appendQueryParameter(
BatteryUsageContentProvider.QUERY_KEY_TIMESTAMP, customParameter);
} else if (hasQueryTimestamp) {
builder.appendQueryParameter(
BatteryUsageContentProvider.QUERY_KEY_TIMESTAMP,
Long.toString(expiredTimeCutoff));
}
final Uri batteryStateQueryContentUri = builder.build();
.appendPath(DatabaseUtils.BATTERY_STATE_TABLE)
.appendQueryParameter(
BatteryUsageContentProvider.QUERY_KEY_TIMESTAMP, queryTimestamp)
.build();
final Cursor cursor =
mProvider.query(
@@ -304,27 +314,6 @@ public final class BatteryUsageContentProviderTest {
/*strings1=*/ null,
/*s1=*/ null);
// Verifies the result not include expired data.
assertThat(cursor.getCount()).isEqualTo(3);
final int packageNameIndex = cursor.getColumnIndex("packageName");
// Verifies the first data package name.
cursor.moveToFirst();
final String actualPackageName1 = cursor.getString(packageNameIndex);
assertThat(actualPackageName1).isEqualTo(packageName1);
// Verifies the second data package name.
cursor.moveToNext();
final String actualPackageName2 = cursor.getString(packageNameIndex);
assertThat(actualPackageName2).isEqualTo(packageName2);
// Verifies the third data package name.
cursor.moveToNext();
final String actualPackageName3 = cursor.getString(packageNameIndex);
assertThat(actualPackageName3).isEqualTo(packageName3);
cursor.close();
// Verifies the broadcast intent.
TimeUnit.SECONDS.sleep(1);
final List<Intent> intents = Shadows.shadowOf((Application) mContext).getBroadcastIntents();
assertThat(intents).hasSize(1);
assertThat(intents.get(0).getAction()).isEqualTo(
BootBroadcastReceiver.ACTION_PERIODIC_JOB_RECHECK);
return cursor;
}
}

View File

@@ -82,7 +82,7 @@ public final class BatteryUsageDataLoaderTest {
.thenReturn(mBatteryUsageStats);
BatteryUsageDataLoader.sFakeBatteryEntryListSupplier = () -> batteryEntryList;
BatteryUsageDataLoader.loadUsageData(mContext);
BatteryUsageDataLoader.loadUsageData(mContext, /*isFullChargeStart=*/ false);
final int queryFlags = mStatsQueryCaptor.getValue().getFlags();
assertThat(queryFlags
@@ -97,7 +97,7 @@ public final class BatteryUsageDataLoaderTest {
.thenReturn(mBatteryUsageStats);
BatteryUsageDataLoader.sFakeBatteryEntryListSupplier = () -> null;
BatteryUsageDataLoader.loadUsageData(mContext);
BatteryUsageDataLoader.loadUsageData(mContext, /*isFullChargeStart=*/ false);
verify(mMockContentResolver).insert(any(), any());
}
@@ -106,9 +106,9 @@ public final class BatteryUsageDataLoaderTest {
public void loadUsageData_emptyBatteryEntryList_insertFakeDataIntoProvider() {
when(mBatteryStatsManager.getBatteryUsageStats(mStatsQueryCaptor.capture()))
.thenReturn(mBatteryUsageStats);
BatteryUsageDataLoader.sFakeBatteryEntryListSupplier = () -> new ArrayList<BatteryEntry>();
BatteryUsageDataLoader.sFakeBatteryEntryListSupplier = () -> new ArrayList<>();
BatteryUsageDataLoader.loadUsageData(mContext);
BatteryUsageDataLoader.loadUsageData(mContext, /*isFullChargeStart=*/ false);
verify(mMockContentResolver).insert(any(), any());
}

View File

@@ -95,7 +95,8 @@ public final class ConvertUtilsTest {
/*batteryStatus=*/ BatteryManager.BATTERY_STATUS_FULL,
/*batteryHealth=*/ BatteryManager.BATTERY_HEALTH_COLD,
/*bootTimestamp=*/ 101L,
/*timestamp=*/ 10001L);
/*timestamp=*/ 10001L,
/*isFullChargeStart=*/ true);
final BatteryInformation batteryInformation =
ConvertUtils.getBatteryInformation(
values, BatteryHistEntry.KEY_BATTERY_INFORMATION);
@@ -109,6 +110,7 @@ public final class ConvertUtilsTest {
assertThat(values.getAsLong(BatteryHistEntry.KEY_TIMESTAMP)).isEqualTo(10001L);
assertThat(values.getAsInteger(BatteryHistEntry.KEY_CONSUMER_TYPE))
.isEqualTo(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
assertThat(values.getAsBoolean(BatteryHistEntry.KEY_IS_FULL_CHARGE_CYCLE_START)).isTrue();
assertThat(batteryInformation.getAppLabel()).isEqualTo("Settings");
assertThat(batteryInformation.getIsHidden()).isTrue();
assertThat(batteryInformation.getBootTimestamp()).isEqualTo(101L);
@@ -136,7 +138,8 @@ public final class ConvertUtilsTest {
/*batteryStatus=*/ BatteryManager.BATTERY_STATUS_FULL,
/*batteryHealth=*/ BatteryManager.BATTERY_HEALTH_COLD,
/*bootTimestamp=*/ 101L,
/*timestamp=*/ 10001L);
/*timestamp=*/ 10001L,
/*isFullChargeStart=*/ false);
final BatteryInformation batteryInformation =
ConvertUtils.getBatteryInformation(
@@ -144,6 +147,7 @@ public final class ConvertUtilsTest {
final DeviceBatteryState deviceBatteryState = batteryInformation.getDeviceBatteryState();
assertThat(batteryInformation.getBootTimestamp()).isEqualTo(101L);
assertThat(batteryInformation.getZoneId()).isEqualTo(TimeZone.getDefault().getID());
assertThat(values.getAsBoolean(BatteryHistEntry.KEY_IS_FULL_CHARGE_CYCLE_START)).isFalse();
assertThat(deviceBatteryState.getBatteryLevel()).isEqualTo(12);
assertThat(deviceBatteryState.getBatteryStatus())
.isEqualTo(BatteryManager.BATTERY_STATUS_FULL);

View File

@@ -46,7 +46,6 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
@@ -99,7 +98,8 @@ public final class DatabaseUtilsTest {
doReturn(null).when(mContext).registerReceiver(any(), any());
assertThat(
DatabaseUtils.sendBatteryEntryData(
mContext, /*batteryEntryList=*/ null, mBatteryUsageStats))
mContext, /*batteryEntryList=*/ null, mBatteryUsageStats,
/*isFullChargeStart=*/ false))
.isNull();
}
@@ -118,7 +118,8 @@ public final class DatabaseUtilsTest {
final List<ContentValues> valuesList =
DatabaseUtils.sendBatteryEntryData(
mContext, batteryEntryList, mBatteryUsageStats);
mContext, batteryEntryList, mBatteryUsageStats,
/*isFullChargeStart=*/ false);
assertThat(valuesList).hasSize(2);
// Verifies the ContentValues content.
@@ -141,7 +142,8 @@ public final class DatabaseUtilsTest {
DatabaseUtils.sendBatteryEntryData(
mContext,
new ArrayList<>(),
mBatteryUsageStats);
mBatteryUsageStats,
/*isFullChargeStart=*/ false);
assertThat(valuesList).hasSize(1);
verifyFakeContentValues(valuesList.get(0));
@@ -159,7 +161,8 @@ public final class DatabaseUtilsTest {
DatabaseUtils.sendBatteryEntryData(
mContext,
/*batteryEntryList=*/ null,
mBatteryUsageStats);
mBatteryUsageStats,
/*isFullChargeStart=*/ false);
assertThat(valuesList).hasSize(1);
verifyFakeContentValues(valuesList.get(0));
@@ -177,7 +180,8 @@ public final class DatabaseUtilsTest {
DatabaseUtils.sendBatteryEntryData(
mContext,
/*batteryEntryList=*/ null,
/*batteryUsageStats=*/ null);
/*batteryUsageStats=*/ null,
/*isFullChargeStart=*/ false);
assertThat(valuesList).hasSize(1);
verifyFakeContentValues(valuesList.get(0));
@@ -258,88 +262,6 @@ public final class DatabaseUtilsTest {
assertThat(batteryHistMap).isEmpty();
}
@Test
public void saveLastFullChargeTimestampPref_notFullCharge_returnsFalse() {
DatabaseUtils.saveLastFullChargeTimestampPref(
mContext,
BatteryManager.BATTERY_STATUS_UNKNOWN,
/* level */ 10,
/* timestamp */ 1);
assertThat(DatabaseUtils.getLastFullChargeTimestampPref(mContext)).isEqualTo(0);
}
@Test
public void saveLastFullChargeTimestampPref_fullStatus_returnsTrue() {
long expectedTimestamp = 1;
DatabaseUtils.saveLastFullChargeTimestampPref(
mContext,
BatteryManager.BATTERY_STATUS_FULL,
/* level */ 10,
/* timestamp */ expectedTimestamp);
assertThat(DatabaseUtils.getLastFullChargeTimestampPref(mContext))
.isEqualTo(expectedTimestamp);
}
@Test
public void saveLastFullChargeTimestampPref_level100_returnsTrue() {
long expectedTimestamp = 1;
DatabaseUtils.saveLastFullChargeTimestampPref(
mContext,
BatteryManager.BATTERY_STATUS_UNKNOWN,
/* level */ 100,
/* timestamp */ expectedTimestamp);
assertThat(DatabaseUtils.getLastFullChargeTimestampPref(mContext))
.isEqualTo(expectedTimestamp);
}
@Test
public void getStartTimestampForLastFullCharge_noTimestampPreference_returnsSixDaysAgo() {
Calendar currentCalendar = Calendar.getInstance();
currentCalendar.set(2022, 6, 5, 6, 30, 50); // 2022-07-05 06:30:50
Calendar expectedCalendar = Calendar.getInstance();
expectedCalendar.set(2022, 5, 29, 0, 0, 0); // 2022-06-29 00:00:00
expectedCalendar.set(Calendar.MILLISECOND, 0);
assertThat(DatabaseUtils.getStartTimestampForLastFullCharge(mContext, currentCalendar))
.isEqualTo(expectedCalendar.getTimeInMillis());
}
@Test
public void getStartTimestampForLastFullCharge_lastFullChargeEarlier_returnsSixDaysAgo() {
Calendar lastFullCalendar = Calendar.getInstance();
lastFullCalendar.set(2021, 11, 25, 6, 30, 50); // 2021-12-25 06:30:50
DatabaseUtils.saveLastFullChargeTimestampPref(
mContext,
BatteryManager.BATTERY_STATUS_UNKNOWN,
/* level */ 100,
/* timestamp */ lastFullCalendar.getTimeInMillis());
Calendar currentCalendar = Calendar.getInstance();
currentCalendar.set(2022, 0, 2, 6, 30, 50); // 2022-01-02 06:30:50
Calendar expectedCalendar = Calendar.getInstance();
expectedCalendar.set(2021, 11, 27, 0, 0, 0); // 2021-12-27 00:00:00
expectedCalendar.set(Calendar.MILLISECOND, 0);
assertThat(DatabaseUtils.getStartTimestampForLastFullCharge(mContext, currentCalendar))
.isEqualTo(expectedCalendar.getTimeInMillis());
}
@Test
public void getStartTimestampForLastFullCharge_lastFullChargeLater_returnsLastFullCharge() {
Calendar lastFullCalendar = Calendar.getInstance();
lastFullCalendar.set(2022, 6, 1, 6, 30, 50); // 2022-07-01 06:30:50
long expectedTimestamp = lastFullCalendar.getTimeInMillis();
DatabaseUtils.saveLastFullChargeTimestampPref(
mContext,
BatteryManager.BATTERY_STATUS_UNKNOWN,
/* level */ 100,
/* timestamp */ expectedTimestamp);
Calendar currentCalendar = Calendar.getInstance();
currentCalendar.set(2022, 6, 5, 6, 30, 50); // 2022-07-05 06:30:50
assertThat(DatabaseUtils.getStartTimestampForLastFullCharge(mContext, currentCalendar))
.isEqualTo(expectedTimestamp);
}
private static void verifyContentValues(double consumedPower, ContentValues values) {
final BatteryInformation batteryInformation =
ConvertUtils.getBatteryInformation(

View File

@@ -53,10 +53,13 @@ public final class BatteryStateDaoTest {
mContext = ApplicationProvider.getApplicationContext();
mDatabase = BatteryTestUtils.setUpBatteryStateDatabase(mContext);
mBatteryStateDao = mDatabase.batteryStateDao();
BatteryTestUtils.insertDataToBatteryStateDatabase(mContext, TIMESTAMP3, PACKAGE_NAME3);
BatteryTestUtils.insertDataToBatteryStateDatabase(mContext, TIMESTAMP2, PACKAGE_NAME2);
BatteryTestUtils.insertDataToBatteryStateDatabase(
mContext, TIMESTAMP1, PACKAGE_NAME1, /*multiple=*/ true);
mContext, TIMESTAMP3, PACKAGE_NAME3);
BatteryTestUtils.insertDataToBatteryStateDatabase(
mContext, TIMESTAMP2, PACKAGE_NAME2);
BatteryTestUtils.insertDataToBatteryStateDatabase(
mContext, TIMESTAMP1, PACKAGE_NAME1, /*multiple=*/ true,
/*isFullChargeStart=*/ true);
}
@After
@@ -75,16 +78,26 @@ public final class BatteryStateDaoTest {
}
@Test
public void batteryStateDao_getCursorAfter() throws Exception {
final Cursor cursor = mBatteryStateDao.getCursorAfter(TIMESTAMP2);
assertThat(cursor.getCount()).isEqualTo(2);
assertThat(cursor.getColumnCount()).isEqualTo(CURSOR_COLUMN_SIZE);
public void batteryStateDao_getCursorSinceLastFullCharge() throws Exception {
final Cursor cursor1 = mBatteryStateDao.getCursorSinceLastFullCharge(TIMESTAMP1);
assertThat(cursor1.getCount()).isEqualTo(3);
assertThat(cursor1.getColumnCount()).isEqualTo(CURSOR_COLUMN_SIZE);
// Verifies the queried first battery state.
cursor.moveToFirst();
assertThat(cursor.getString(3 /*packageName*/)).isEqualTo(PACKAGE_NAME3);
cursor1.moveToFirst();
assertThat(cursor1.getString(3 /*packageName*/)).isEqualTo(PACKAGE_NAME1);
// Verifies the queried second battery state.
cursor.moveToNext();
assertThat(cursor.getString(3 /*packageName*/)).isEqualTo(PACKAGE_NAME2);
cursor1.moveToNext();
assertThat(cursor1.getString(3 /*packageName*/)).isEqualTo(PACKAGE_NAME2);
// Verifies the queried third battery state.
cursor1.moveToNext();
assertThat(cursor1.getString(3 /*packageName*/)).isEqualTo(PACKAGE_NAME3);
final Cursor cursor2 = mBatteryStateDao.getCursorSinceLastFullCharge(TIMESTAMP3);
assertThat(cursor2.getCount()).isEqualTo(1);
assertThat(cursor2.getColumnCount()).isEqualTo(CURSOR_COLUMN_SIZE);
// Verifies the queried first battery state.
cursor2.moveToFirst();
assertThat(cursor2.getString(3 /*packageName*/)).isEqualTo(PACKAGE_NAME3);
}
@Test

View File

@@ -72,12 +72,21 @@ public class BatteryTestUtils {
/** Inserts a fake data into the database for testing. */
public static void insertDataToBatteryStateDatabase(
Context context, long timestamp, String packageName) {
insertDataToBatteryStateDatabase(context, timestamp, packageName, /*multiple=*/ false);
insertDataToBatteryStateDatabase(
context, timestamp, packageName, /*multiple=*/ false, /*isFullChargeStart=*/ false);
}
/** Inserts a fake data into the database for testing. */
public static void insertDataToBatteryStateDatabase(
Context context, long timestamp, String packageName, boolean multiple) {
Context context, long timestamp, String packageName, boolean isFullChargeStart) {
insertDataToBatteryStateDatabase(
context, timestamp, packageName, /*multiple=*/ false, isFullChargeStart);
}
/** Inserts a fake data into the database for testing. */
public static void insertDataToBatteryStateDatabase(
Context context, long timestamp, String packageName, boolean multiple,
boolean isFullChargeStart) {
DeviceBatteryState deviceBatteryState =
DeviceBatteryState
.newBuilder()
@@ -113,7 +122,7 @@ public class BatteryTestUtils {
packageName,
timestamp,
/*consumerType=*/ 2,
/*isFullChargeCycleStart=*/ false,
isFullChargeStart,
ConvertUtils.convertBatteryInformationToString(batteryInformation),
"");
BatteryStateDao dao =