Merge "Add method to update "state" column in anomaly db."
This commit is contained in:
committed by
Android (Google) Code Review
commit
2792da1ec7
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.settings.fuelgauge.batterytip;
|
package com.android.settings.fuelgauge.batterytip;
|
||||||
|
|
||||||
|
import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
|
||||||
|
.ANOMALY_STATE;
|
||||||
import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
|
import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
|
||||||
.PACKAGE_NAME;
|
.PACKAGE_NAME;
|
||||||
import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
|
import static com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper.AnomalyColumns
|
||||||
@@ -28,8 +30,10 @@ import android.content.ContentValues;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -55,22 +59,24 @@ public class BatteryDatabaseManager {
|
|||||||
values.put(PACKAGE_NAME, packageName);
|
values.put(PACKAGE_NAME, packageName);
|
||||||
values.put(ANOMALY_TYPE, type);
|
values.put(ANOMALY_TYPE, type);
|
||||||
values.put(TIME_STAMP_MS, timestampMs);
|
values.put(TIME_STAMP_MS, timestampMs);
|
||||||
|
values.put(ANOMALY_STATE, AnomalyDatabaseHelper.State.NEW);
|
||||||
db.insert(TABLE_ANOMALY, null, values);
|
db.insert(TABLE_ANOMALY, null, values);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query all the anomalies that happened after {@code timestampMs}.
|
* Query all the anomalies that happened after {@code timestampMsAfter} and with {@code state}.
|
||||||
*/
|
*/
|
||||||
public List<AppInfo> queryAllAnomaliesAfter(long timestampMs) {
|
public List<AppInfo> queryAllAnomalies(long timestampMsAfter, int state) {
|
||||||
final List<AppInfo> appInfos = new ArrayList<>();
|
final List<AppInfo> appInfos = new ArrayList<>();
|
||||||
try (SQLiteDatabase db = mDatabaseHelper.getReadableDatabase()) {
|
try (SQLiteDatabase db = mDatabaseHelper.getReadableDatabase()) {
|
||||||
final String[] projection = {PACKAGE_NAME, ANOMALY_TYPE};
|
final String[] projection = {PACKAGE_NAME, ANOMALY_TYPE};
|
||||||
final String orderBy = AnomalyDatabaseHelper.AnomalyColumns.TIME_STAMP_MS + " DESC";
|
final String orderBy = AnomalyDatabaseHelper.AnomalyColumns.TIME_STAMP_MS + " DESC";
|
||||||
|
|
||||||
try (Cursor cursor = db.query(TABLE_ANOMALY, projection, TIME_STAMP_MS + " > ?",
|
try (Cursor cursor = db.query(TABLE_ANOMALY, projection,
|
||||||
new String[]{String.valueOf(timestampMs)}, null, null, orderBy)) {
|
TIME_STAMP_MS + " > ? AND " + ANOMALY_STATE + " = ? ",
|
||||||
|
new String[]{String.valueOf(timestampMsAfter), String.valueOf(state)}, null,
|
||||||
|
null, orderBy)) {
|
||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
AppInfo appInfo = new AppInfo.Builder()
|
AppInfo appInfo = new AppInfo.Builder()
|
||||||
.setPackageName(cursor.getString(cursor.getColumnIndex(PACKAGE_NAME)))
|
.setPackageName(cursor.getString(cursor.getColumnIndex(PACKAGE_NAME)))
|
||||||
@@ -90,4 +96,26 @@ public class BatteryDatabaseManager {
|
|||||||
new String[]{String.valueOf(timestampMs)});
|
new String[]{String.valueOf(timestampMs)});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the type of anomalies to {@code state}
|
||||||
|
*
|
||||||
|
* @param appInfos represents the anomalies
|
||||||
|
* @param state which state to update to
|
||||||
|
*/
|
||||||
|
public void updateAnomalies(List<AppInfo> appInfos, int state) {
|
||||||
|
if (!appInfos.isEmpty()) {
|
||||||
|
final int size = appInfos.size();
|
||||||
|
final String[] whereArgs = new String[size];
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
whereArgs[i] = appInfos.get(i).packageName;
|
||||||
|
}
|
||||||
|
try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
|
||||||
|
final ContentValues values = new ContentValues();
|
||||||
|
values.put(ANOMALY_STATE, state);
|
||||||
|
db.update(TABLE_ANOMALY, values, PACKAGE_NAME + " IN (" + TextUtils.join(",",
|
||||||
|
Collections.nCopies(appInfos.size(), "?")) + ")", whereArgs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -24,6 +24,7 @@ import android.content.Context;
|
|||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
|
|
||||||
import com.android.settings.TestConfig;
|
import com.android.settings.TestConfig;
|
||||||
|
import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
|
||||||
import com.android.settings.fuelgauge.batterytip.AppInfo;
|
import com.android.settings.fuelgauge.batterytip.AppInfo;
|
||||||
import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
|
import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
|
||||||
import com.android.settings.testutils.DatabaseTestUtils;
|
import com.android.settings.testutils.DatabaseTestUtils;
|
||||||
@@ -37,6 +38,7 @@ import org.robolectric.RobolectricTestRunner;
|
|||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
@@ -71,28 +73,54 @@ public class BatteryDatabaseManagerTest {
|
|||||||
mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_OLD, TYPE_OLD, TWO_DAYS_BEFORE);
|
mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_OLD, TYPE_OLD, TWO_DAYS_BEFORE);
|
||||||
|
|
||||||
// In database, it contains two record
|
// In database, it contains two record
|
||||||
List<AppInfo> totalAppInfos = mBatteryDatabaseManager.queryAllAnomaliesAfter(0);
|
List<AppInfo> totalAppInfos = mBatteryDatabaseManager.queryAllAnomalies(0 /* timeMsAfter */,
|
||||||
|
AnomalyDatabaseHelper.State.NEW);
|
||||||
assertThat(totalAppInfos).hasSize(2);
|
assertThat(totalAppInfos).hasSize(2);
|
||||||
verifyAppInfo(totalAppInfos.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
|
assertAppInfo(totalAppInfos.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
|
||||||
verifyAppInfo(totalAppInfos.get(1), PACKAGE_NAME_OLD, TYPE_OLD);
|
assertAppInfo(totalAppInfos.get(1), PACKAGE_NAME_OLD, TYPE_OLD);
|
||||||
|
|
||||||
// Only one record shows up if we query by timestamp
|
// Only one record shows up if we query by timestamp
|
||||||
List<AppInfo> appInfos = mBatteryDatabaseManager.queryAllAnomaliesAfter(ONE_DAY_BEFORE);
|
List<AppInfo> appInfos = mBatteryDatabaseManager.queryAllAnomalies(ONE_DAY_BEFORE,
|
||||||
|
AnomalyDatabaseHelper.State.NEW);
|
||||||
assertThat(appInfos).hasSize(1);
|
assertThat(appInfos).hasSize(1);
|
||||||
verifyAppInfo(appInfos.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
|
assertAppInfo(appInfos.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
|
||||||
|
|
||||||
mBatteryDatabaseManager.deleteAllAnomaliesBeforeTimeStamp(ONE_DAY_BEFORE);
|
mBatteryDatabaseManager.deleteAllAnomaliesBeforeTimeStamp(ONE_DAY_BEFORE);
|
||||||
|
|
||||||
// The obsolete record is removed from database
|
// The obsolete record is removed from database
|
||||||
List<AppInfo> appInfos1 = mBatteryDatabaseManager.queryAllAnomaliesAfter(0);
|
List<AppInfo> appInfos1 = mBatteryDatabaseManager.queryAllAnomalies(0 /* timeMsAfter */,
|
||||||
|
AnomalyDatabaseHelper.State.NEW);
|
||||||
assertThat(appInfos1).hasSize(1);
|
assertThat(appInfos1).hasSize(1);
|
||||||
verifyAppInfo(appInfos1.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
|
assertAppInfo(appInfos1.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void verifyAppInfo(final AppInfo appInfo, String packageName, int type) {
|
@Test
|
||||||
|
public void testUpdateAnomalies_updateSuccessfully() {
|
||||||
|
mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_NEW, TYPE_NEW, NOW);
|
||||||
|
mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_OLD, TYPE_OLD, NOW);
|
||||||
|
final AppInfo appInfo = new AppInfo.Builder().setPackageName(PACKAGE_NAME_OLD).build();
|
||||||
|
final List<AppInfo> updateAppInfos = new ArrayList<>();
|
||||||
|
updateAppInfos.add(appInfo);
|
||||||
|
|
||||||
|
// Change state of PACKAGE_NAME_OLD to handled
|
||||||
|
mBatteryDatabaseManager.updateAnomalies(updateAppInfos,
|
||||||
|
AnomalyDatabaseHelper.State.HANDLED);
|
||||||
|
|
||||||
|
// The state of PACKAGE_NAME_NEW is still new
|
||||||
|
List<AppInfo> newAppInfos = mBatteryDatabaseManager.queryAllAnomalies(ONE_DAY_BEFORE,
|
||||||
|
AnomalyDatabaseHelper.State.NEW);
|
||||||
|
assertThat(newAppInfos).hasSize(1);
|
||||||
|
assertAppInfo(newAppInfos.get(0), PACKAGE_NAME_NEW, TYPE_NEW);
|
||||||
|
|
||||||
|
// The state of PACKAGE_NAME_OLD is changed to handled
|
||||||
|
List<AppInfo> handledAppInfos = mBatteryDatabaseManager.queryAllAnomalies(ONE_DAY_BEFORE,
|
||||||
|
AnomalyDatabaseHelper.State.HANDLED);
|
||||||
|
assertThat(handledAppInfos).hasSize(1);
|
||||||
|
assertAppInfo(handledAppInfos.get(0), PACKAGE_NAME_OLD, TYPE_OLD);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertAppInfo(final AppInfo appInfo, String packageName, int type) {
|
||||||
assertThat(appInfo.packageName).isEqualTo(packageName);
|
assertThat(appInfo.packageName).isEqualTo(packageName);
|
||||||
assertThat(appInfo.anomalyType).isEqualTo(type);
|
assertThat(appInfo.anomalyType).isEqualTo(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user