Exclude screen on time in battery usage page when the device is in charging.

Bug: 265751163
Fix: 265751163
Test: manual
Change-Id: I4ed71e1d6fad56a7cbfc9cd47ed4d791f45261ce
This commit is contained in:
Zaiyue Xue
2023-02-27 16:29:04 +08:00
parent 39dd52d468
commit ff11b8e307
20 changed files with 809 additions and 52 deletions

View File

@@ -31,6 +31,7 @@ import android.net.Uri;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
import com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity;
import com.android.settings.fuelgauge.batteryusage.db.BatteryState;
import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDatabase;
import com.android.settings.testutils.BatteryTestUtils;
@@ -353,6 +354,28 @@ public final class BatteryUsageContentProviderTest {
assertThat(entities.get(0).taskRootPackageName).isEqualTo("com.android.settings2");
}
@Test
public void insert_batteryEvent_returnsExpectedResult() {
mProvider.onCreate();
ContentValues values = new ContentValues();
values.put(BatteryEventEntity.KEY_TIMESTAMP, 10001L);
values.put(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE,
BatteryEventType.POWER_CONNECTED.getNumber());
values.put(BatteryEventEntity.KEY_BATTERY_LEVEL, 66);
final Uri uri = mProvider.insert(DatabaseUtils.BATTERY_EVENT_URI, values);
assertThat(uri).isEqualTo(DatabaseUtils.BATTERY_EVENT_URI);
// Verifies the AppUsageEventEntity content.
final List<BatteryEventEntity> entities =
BatteryStateDatabase.getInstance(mContext).batteryEventDao().getAll();
assertThat(entities).hasSize(1);
assertThat(entities.get(0).timestamp).isEqualTo(10001L);
assertThat(entities.get(0).batteryEventType).isEqualTo(
BatteryEventType.POWER_CONNECTED.getNumber());
assertThat(entities.get(0).batteryLevel).isEqualTo(66);
}
@Test
public void delete_throwsUnsupportedOperationException() {
assertThrows(

View File

@@ -39,6 +39,7 @@ import android.os.RemoteException;
import android.os.UserHandle;
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
import com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity;
import org.junit.Before;
import org.junit.Test;
@@ -194,6 +195,22 @@ public final class ConvertUtilsTest {
.isEqualTo("com.android.settings2");
}
@Test
public void convertBatteryEventToContentValues_normalCase_returnsExpectedContentValues() {
final BatteryEvent batteryEvent =
BatteryEvent.newBuilder()
.setTimestamp(10001L)
.setType(BatteryEventType.POWER_CONNECTED)
.setBatteryLevel(66)
.build();
final ContentValues values =
ConvertUtils.convertBatteryEventToContentValues(batteryEvent);
assertThat(values.getAsLong(BatteryEventEntity.KEY_TIMESTAMP)).isEqualTo(10001L);
assertThat(values.getAsInteger(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE)).isEqualTo(
BatteryEventType.POWER_CONNECTED.getNumber());
assertThat(values.getAsInteger(BatteryEventEntity.KEY_BATTERY_LEVEL)).isEqualTo(66);
}
@Test
public void convertToBatteryHistEntry_returnsExpectedResult() {
final int expectedType = 3;
@@ -405,6 +422,15 @@ public final class ConvertUtilsTest {
assertThat(appUsageEvent.getInstanceId()).isEqualTo(0);
}
@Test
public void convertToBatteryEvent_normalCase_returnsExpectedResult() {
final BatteryEvent batteryEvent = ConvertUtils.convertToBatteryEvent(
666L, BatteryEventType.POWER_DISCONNECTED, 88);
assertThat(batteryEvent.getTimestamp()).isEqualTo(666L);
assertThat(batteryEvent.getType()).isEqualTo(BatteryEventType.POWER_DISCONNECTED);
assertThat(batteryEvent.getBatteryLevel()).isEqualTo(88);
}
@Test
public void getLocale_nullContext_returnDefaultLocale() {
assertThat(ConvertUtils.getLocale(/*context=*/ null))

View File

@@ -183,7 +183,7 @@ public final class DataProcessManagerTest {
assertThat(dataProcessManager.getIsCurrentBatteryHistoryLoaded()).isTrue();
assertThat(dataProcessManager.getShowScreenOnTime()).isTrue();
final List<AppUsageEvent> appUsageEventList = dataProcessManager.getAppUsageEventList();
Collections.sort(appUsageEventList, DataProcessor.TIMESTAMP_COMPARATOR);
Collections.sort(appUsageEventList, DataProcessor.APP_USAGE_EVENT_TIMESTAMP_COMPARATOR);
assertThat(appUsageEventList.size()).isEqualTo(6);
assertAppUsageEvent(
appUsageEventList.get(0), AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 1);

View File

@@ -250,7 +250,7 @@ public final class DataProcessorTest {
final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>> periodMap =
DataProcessor.generateAppUsagePeriodMap(
14400000L, hourlyBatteryLevelsPerDay, appUsageEventList);
14400000L, hourlyBatteryLevelsPerDay, appUsageEventList, new ArrayList<>());
assertThat(periodMap).hasSize(3);
// Day 1
@@ -288,7 +288,7 @@ public final class DataProcessorTest {
hourlyBatteryLevelsPerDay.add(
new BatteryLevelData.PeriodBatteryLevelData(new ArrayList<>(), new ArrayList<>()));
assertThat(DataProcessor.generateAppUsagePeriodMap(
0L, hourlyBatteryLevelsPerDay, new ArrayList<>())).isNull();
0L, hourlyBatteryLevelsPerDay, new ArrayList<>(), new ArrayList<>())).isNull();
}
@Test
@@ -1669,7 +1669,8 @@ public final class DataProcessorTest {
/*instanceId=*/ 4, packageName2));
final Map<Long, Map<String, List<AppUsagePeriod>>> appUsagePeriodMap =
DataProcessor.buildAppUsagePeriodList(appUsageEvents, 0, 5);
DataProcessor.buildAppUsagePeriodList(
appUsageEvents, new ArrayList<>(), 0, 5);
assertThat(appUsagePeriodMap).hasSize(2);
final Map<String, List<AppUsagePeriod>> userMap1 = appUsagePeriodMap.get(1L);
@@ -1693,7 +1694,7 @@ public final class DataProcessorTest {
@Test
public void buildAppUsagePeriodList_emptyEventList_returnNull() {
assertThat(DataProcessor.buildAppUsagePeriodList(
new ArrayList<>(), 0, 1)).isNull();
new ArrayList<>(), new ArrayList<>(), 0, 1)).isNull();
}
@Test
@@ -1705,7 +1706,7 @@ public final class DataProcessorTest {
AppUsageEventType.DEVICE_SHUTDOWN, /*timestamp=*/ 2));
assertThat(DataProcessor.buildAppUsagePeriodList(
appUsageEvents, 0, 3)).isNull();
appUsageEvents, new ArrayList<>(), 0, 3)).isNull();
}
@Test
@@ -1765,6 +1766,89 @@ public final class DataProcessorTest {
assertAppUsagePeriod(appUsagePeriodList.get(6), 1000000, 1100000);
}
@Test
public void excludePowerConnectedTime_startEndNotCharging_returnExpectedResult() {
final List<AppUsagePeriod> appUsagePeriodList = List.of(
AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build());
final List<BatteryEvent> batteryEventList = List.of(
BatteryEvent.newBuilder().setTimestamp(50).setType(
BatteryEventType.POWER_DISCONNECTED).build(),
BatteryEvent.newBuilder().setTimestamp(166).setType(
BatteryEventType.POWER_CONNECTED).build(),
BatteryEvent.newBuilder().setTimestamp(188).setType(
BatteryEventType.POWER_DISCONNECTED).build(),
BatteryEvent.newBuilder().setTimestamp(280).setType(
BatteryEventType.POWER_CONNECTED).build());
final List<AppUsagePeriod> resultList =
DataProcessor.excludePowerConnectedTimeFromAppUsagePeriodList(
appUsagePeriodList, batteryEventList);
assertThat(resultList).hasSize(2);
assertAppUsagePeriod(resultList.get(0), 100, 166);
assertAppUsagePeriod(resultList.get(1), 188, 200);
}
@Test
public void excludePowerConnectedTime_startEndInCharging_returnExpectedResult() {
final List<AppUsagePeriod> appUsagePeriodList = List.of(
AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build());
final List<BatteryEvent> batteryEventList = List.of(
BatteryEvent.newBuilder().setTimestamp(50).setType(
BatteryEventType.POWER_DISCONNECTED).build(),
BatteryEvent.newBuilder().setTimestamp(80).setType(
BatteryEventType.POWER_CONNECTED).build(),
BatteryEvent.newBuilder().setTimestamp(120).setType(
BatteryEventType.POWER_DISCONNECTED).build(),
BatteryEvent.newBuilder().setTimestamp(150).setType(
BatteryEventType.POWER_CONNECTED).build(),
BatteryEvent.newBuilder().setTimestamp(160).setType(
BatteryEventType.POWER_DISCONNECTED).build(),
BatteryEvent.newBuilder().setTimestamp(180).setType(
BatteryEventType.POWER_CONNECTED).build());
final List<AppUsagePeriod> resultList =
DataProcessor.excludePowerConnectedTimeFromAppUsagePeriodList(
appUsagePeriodList, batteryEventList);
assertThat(resultList).hasSize(2);
assertAppUsagePeriod(resultList.get(0), 120, 150);
assertAppUsagePeriod(resultList.get(1), 160, 180);
}
@Test
public void excludePowerConnectedTime_wholePeriodNotCharging_returnExpectedResult() {
final List<AppUsagePeriod> appUsagePeriodList = List.of(
AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build());
final List<BatteryEvent> batteryEventList = List.of(
BatteryEvent.newBuilder().setTimestamp(50).setType(
BatteryEventType.POWER_DISCONNECTED).build(),
BatteryEvent.newBuilder().setTimestamp(80).setType(
BatteryEventType.POWER_CONNECTED).build());
final List<AppUsagePeriod> resultList =
DataProcessor.excludePowerConnectedTimeFromAppUsagePeriodList(
appUsagePeriodList, batteryEventList);
assertThat(resultList).isEmpty();
}
@Test
public void excludePowerConnectedTime_wholePeriodInCharging_returnExpectedResult() {
final List<AppUsagePeriod> appUsagePeriodList = List.of(
AppUsagePeriod.newBuilder().setStartTime(100).setEndTime(200).build());
final List<BatteryEvent> batteryEventList = List.of(
BatteryEvent.newBuilder().setTimestamp(50).setType(
BatteryEventType.POWER_DISCONNECTED).build());
final List<AppUsagePeriod> resultList =
DataProcessor.excludePowerConnectedTimeFromAppUsagePeriodList(
appUsagePeriodList, batteryEventList);
assertThat(resultList).hasSize(1);
assertAppUsagePeriod(resultList.get(0), 100, 200);
}
@Test
public void getScreenOnTime_returnExpectedResult() {
final long userId = 1;

View File

@@ -36,6 +36,7 @@ import android.os.UserHandle;
import android.os.UserManager;
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
import com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity;
import com.android.settings.testutils.BatteryTestUtils;
import org.junit.Before;
@@ -136,6 +137,28 @@ public final class DatabaseUtilsTest {
verifyNoMoreInteractions(mMockContentResolver);
}
@Test
public void sendBatteryEventData_returnsExpectedList() {
final BatteryEvent batteryEvent =
BatteryEvent.newBuilder()
.setTimestamp(10001L)
.setType(BatteryEventType.POWER_CONNECTED)
.setBatteryLevel(66)
.build();
final ContentValues contentValues =
DatabaseUtils.sendBatteryEventData(mContext, batteryEvent);
assertThat(contentValues.getAsInteger(BatteryEventEntity.KEY_TIMESTAMP))
.isEqualTo(10001L);
assertThat(contentValues.getAsInteger(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE))
.isEqualTo(BatteryEventType.POWER_CONNECTED.getNumber());
assertThat(contentValues.getAsInteger(BatteryEventEntity.KEY_BATTERY_LEVEL))
.isEqualTo(66);
// Verifies the inserted ContentValues into content provider.
verify(mMockContentResolver).insert(DatabaseUtils.BATTERY_EVENT_URI, contentValues);
}
@Test
public void sendBatteryEntryData_nullBatteryIntent_returnsNullValue() {
doReturn(null).when(mContext).registerReceiver(any(), any());

View File

@@ -0,0 +1,80 @@
/*
* Copyright (C) 2022 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.db;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import android.database.Cursor;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.testutils.BatteryTestUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
/** Tests for {@link BatteryEventDao}. */
@RunWith(RobolectricTestRunner.class)
public final class BatteryEventDaoTest {
private Context mContext;
private BatteryStateDatabase mDatabase;
private BatteryEventDao mBatteryEventDao;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
mDatabase = BatteryTestUtils.setUpBatteryStateDatabase(mContext);
mBatteryEventDao = mDatabase.batteryEventDao();
}
@After
public void closeDb() {
mDatabase.close();
BatteryStateDatabase.setBatteryStateDatabase(/*database=*/ null);
}
@Test
public void getAllAfter_returnExpectedResult() {
mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
.setTimestamp(100L)
.setBatteryEventType(1)
.setBatteryLevel(66)
.build());
mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
.setTimestamp(200L)
.setBatteryEventType(2)
.setBatteryLevel(88)
.build());
final Cursor cursor = mBatteryEventDao.getAllAfter(160L);
assertThat(cursor.getCount()).isEqualTo(1);
cursor.moveToFirst();
assertThat(cursor.getLong(cursor.getColumnIndex(BatteryEventEntity.KEY_TIMESTAMP)))
.isEqualTo(200L);
assertThat(cursor.getInt(cursor.getColumnIndex(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE)))
.isEqualTo(2);
assertThat(cursor.getInt(cursor.getColumnIndex(BatteryEventEntity.KEY_BATTERY_LEVEL)))
.isEqualTo(88);
mBatteryEventDao.clearAll();
assertThat(mBatteryEventDao.getAll()).isEmpty();
}
}

View File

@@ -0,0 +1,47 @@
/*
* Copyright (C) 2023 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.db;
import static com.google.common.truth.Truth.assertThat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
/** Tests for {@link BatteryEventEntity}. */
@RunWith(RobolectricTestRunner.class)
public final class BatteryEventEntityTest {
@Test
public void testBuilder_returnsExpectedResult() {
final long timestamp = 10001L;
final int batteryEventType = 1;
final int batteryLevel = 66;
BatteryEventEntity entity = BatteryEventEntity
.newBuilder()
.setTimestamp(timestamp)
.setBatteryEventType(batteryEventType)
.setBatteryLevel(batteryLevel)
.build();
// Verifies the app relative information.
assertThat(entity.timestamp).isEqualTo(timestamp);
assertThat(entity.batteryEventType).isEqualTo(batteryEventType);
assertThat(entity.batteryLevel).isEqualTo(batteryLevel);
}
}