Add database to store anomaly data
1. Refactor HighUsageApp to AppInfo so it could be reused both in dialog and app restriction 2. Add BatteryDatabaseHelper to store the anomaly log Bug: 70570352 Test: RunSettingsRoboTests Change-Id: I900cd9746ff7f1e19bd6f3948463588b7cf72b85
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Copyright (C) 2018 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;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.spy;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.format.DateUtils;
|
||||
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.fuelgauge.batterytip.AppInfo;
|
||||
import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
|
||||
import com.android.settings.testutils.DatabaseTestUtils;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||
public class BatteryDatabaseManagerTest {
|
||||
private static String PACKAGE_NAME_NEW = "com.android.app1";
|
||||
private static int TYPE_NEW = 1;
|
||||
private static String PACKAGE_NAME_OLD = "com.android.app2";
|
||||
private static int TYPE_OLD = 2;
|
||||
private static long NOW = System.currentTimeMillis();
|
||||
private static long ONE_DAY_BEFORE = NOW - DateUtils.DAY_IN_MILLIS;
|
||||
private static long TWO_DAYS_BEFORE = NOW - 2 * DateUtils.DAY_IN_MILLIS;
|
||||
private Context mContext;
|
||||
private BatteryDatabaseManager mBatteryDatabaseManager;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mBatteryDatabaseManager = spy(new BatteryDatabaseManager(mContext));
|
||||
}
|
||||
|
||||
@After
|
||||
public void cleanUp() {
|
||||
DatabaseTestUtils.clearDb(mContext);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAllFunctions() {
|
||||
mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_NEW, TYPE_NEW, NOW);
|
||||
mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_OLD, TYPE_OLD, TWO_DAYS_BEFORE);
|
||||
|
||||
// In database, it contains two record
|
||||
List<AppInfo> totalAppInfos = mBatteryDatabaseManager.queryAllAnomaliesAfter(0);
|
||||
assertThat(totalAppInfos).hasSize(2);
|
||||
verifyAppInfo(totalAppInfos.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
|
||||
verifyAppInfo(totalAppInfos.get(1), PACKAGE_NAME_OLD, TYPE_OLD);
|
||||
|
||||
// Only one record shows up if we query by timestamp
|
||||
List<AppInfo> appInfos = mBatteryDatabaseManager.queryAllAnomaliesAfter(ONE_DAY_BEFORE);
|
||||
assertThat(appInfos).hasSize(1);
|
||||
verifyAppInfo(appInfos.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
|
||||
|
||||
mBatteryDatabaseManager.deleteAllAnomaliesBeforeTimeStamp(ONE_DAY_BEFORE);
|
||||
|
||||
// The obsolete record is removed from database
|
||||
List<AppInfo> appInfos1 = mBatteryDatabaseManager.queryAllAnomaliesAfter(0);
|
||||
assertThat(appInfos1).hasSize(1);
|
||||
verifyAppInfo(appInfos1.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
|
||||
|
||||
}
|
||||
|
||||
private void verifyAppInfo(final AppInfo appInfo, String packageName, int type) {
|
||||
assertThat(appInfo.packageName).isEqualTo(packageName);
|
||||
assertThat(appInfo.anomalyType).isEqualTo(type);
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright (C) 2018 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.batterytip;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.text.format.DateUtils;
|
||||
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||
public class AppInfoTest {
|
||||
private static final String PACKAGE_NAME = "com.android.app";
|
||||
private static final int ANOMALY_TYPE = Anomaly.AnomalyType.WAKE_LOCK;
|
||||
private static final long SCREEN_TIME_MS = DateUtils.HOUR_IN_MILLIS;
|
||||
|
||||
private AppInfo mAppInfo;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mAppInfo = new AppInfo.Builder()
|
||||
.setPackageName(PACKAGE_NAME)
|
||||
.setAnomalyType(ANOMALY_TYPE)
|
||||
.setScreenOnTimeMs(SCREEN_TIME_MS)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParcel() {
|
||||
Parcel parcel = Parcel.obtain();
|
||||
mAppInfo.writeToParcel(parcel, mAppInfo.describeContents());
|
||||
parcel.setDataPosition(0);
|
||||
|
||||
final AppInfo appInfo = new AppInfo(parcel);
|
||||
|
||||
assertThat(appInfo.packageName).isEqualTo(PACKAGE_NAME);
|
||||
assertThat(appInfo.anomalyType).isEqualTo(ANOMALY_TYPE);
|
||||
assertThat(appInfo.screenOnTimeMs).isEqualTo(SCREEN_TIME_MS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCompareTo_hasCorrectOrder() {
|
||||
final AppInfo appInfo = new AppInfo.Builder()
|
||||
.setPackageName(PACKAGE_NAME)
|
||||
.setAnomalyType(ANOMALY_TYPE)
|
||||
.setScreenOnTimeMs(SCREEN_TIME_MS + 100)
|
||||
.build();
|
||||
|
||||
List<AppInfo> appInfos = new ArrayList<>();
|
||||
appInfos.add(appInfo);
|
||||
appInfos.add(mAppInfo);
|
||||
|
||||
Collections.sort(appInfos);
|
||||
assertThat(appInfos.get(0).screenOnTimeMs).isLessThan(appInfos.get(1).screenOnTimeMs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBuilder() {
|
||||
assertThat(mAppInfo.packageName).isEqualTo(PACKAGE_NAME);
|
||||
assertThat(mAppInfo.anomalyType).isEqualTo(ANOMALY_TYPE);
|
||||
assertThat(mAppInfo.screenOnTimeMs).isEqualTo(SCREEN_TIME_MS);
|
||||
}
|
||||
}
|
@@ -22,7 +22,7 @@ import android.os.Parcel;
|
||||
import android.text.format.DateUtils;
|
||||
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.fuelgauge.batterytip.HighUsageApp;
|
||||
import com.android.settings.fuelgauge.batterytip.AppInfo;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -42,14 +42,17 @@ public class HighUsageTipTest {
|
||||
|
||||
private Context mContext;
|
||||
private HighUsageTip mBatteryTip;
|
||||
private List<HighUsageApp> mUsageAppList;
|
||||
private List<AppInfo> mUsageAppList;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
|
||||
mUsageAppList = new ArrayList<>();
|
||||
mUsageAppList.add(new HighUsageApp(PACKAGE_NAME, SCREEN_TIME));
|
||||
mUsageAppList.add(new AppInfo.Builder()
|
||||
.setPackageName(PACKAGE_NAME)
|
||||
.setScreenOnTimeMs(SCREEN_TIME)
|
||||
.build());
|
||||
mBatteryTip = new HighUsageTip(SCREEN_TIME, mUsageAppList);
|
||||
}
|
||||
|
||||
@@ -67,7 +70,7 @@ public class HighUsageTipTest {
|
||||
assertThat(parcelTip.getState()).isEqualTo(BatteryTip.StateType.NEW);
|
||||
assertThat(parcelTip.getScreenTimeMs()).isEqualTo(SCREEN_TIME);
|
||||
assertThat(parcelTip.mHighUsageAppList.size()).isEqualTo(1);
|
||||
final HighUsageApp app = parcelTip.mHighUsageAppList.get(0);
|
||||
final AppInfo app = parcelTip.mHighUsageAppList.get(0);
|
||||
assertThat(app.packageName).isEqualTo(PACKAGE_NAME);
|
||||
assertThat(app.screenOnTimeMs).isEqualTo(SCREEN_TIME);
|
||||
}
|
||||
|
@@ -18,6 +18,7 @@ package com.android.settings.testutils;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
|
||||
import com.android.settings.search.IndexDatabaseHelper;
|
||||
import com.android.settings.slices.SlicesDatabaseHelper;
|
||||
|
||||
@@ -28,6 +29,7 @@ public class DatabaseTestUtils {
|
||||
public static void clearDb(Context context) {
|
||||
clearSearchDb(context);
|
||||
clearSlicesDb(context);
|
||||
clearAnomalyDb(context);
|
||||
}
|
||||
|
||||
private static void clearSlicesDb(Context context) {
|
||||
@@ -45,6 +47,21 @@ public class DatabaseTestUtils {
|
||||
}
|
||||
}
|
||||
|
||||
private static void clearAnomalyDb(Context context) {
|
||||
AnomalyDatabaseHelper helper = AnomalyDatabaseHelper.getInstance(context);
|
||||
helper.close();
|
||||
|
||||
Field instance;
|
||||
Class clazz = AnomalyDatabaseHelper.class;
|
||||
try {
|
||||
instance = clazz.getDeclaredField("sSingleton");
|
||||
instance.setAccessible(true);
|
||||
instance.set(null, null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
private static void clearSearchDb(Context context) {
|
||||
IndexDatabaseHelper helper = IndexDatabaseHelper.getInstance(context);
|
||||
helper.close();
|
||||
|
Reference in New Issue
Block a user