Database restructure: use protobuf to save battery information fields.

This patch only updates the existing fields.
There will be 2 following patches to:
1. Expose the new fields (foreground / foreground service / background x
   usage time / power consumption) to UI.
2. Get the full charge cycle start time from Database and remove the
   SharedPreference.

Test: make RunSettingsRoboTests + manual
Bug: 253553141
Change-Id: Iee02dc7e671f97899cb1495323acfa0173e31df2
diff --git a/Android.bp b/Android.bp
index 1acba28..a991c89 100644
--- a/Android.bp
+++ b/Android.bp
@@ -80,6 +80,7 @@
         "settings-log-bridge-protos-lite",
         "settings-telephony-protos-lite",
         "fuelgauge-log-protos-lite",
+        "fuelgauge-usage-state-protos-lite",
         "contextualcards",
         "settings-logtags",
         "statslog-settings",
diff --git a/protos/Android.bp b/protos/Android.bp
index d546e2d..26b1ec8 100644
--- a/protos/Android.bp
+++ b/protos/Android.bp
@@ -41,3 +41,11 @@
     },
     srcs: ["fuelgauge_log.proto"],
 }
+
+java_library {
+    name: "fuelgauge-usage-state-protos-lite",
+    proto: {
+        type: "lite",
+    },
+    srcs: ["fuelgauge_usage_state.proto"],
+}
diff --git a/protos/fuelgauge_usage_state.proto b/protos/fuelgauge_usage_state.proto
new file mode 100644
index 0000000..cd112ea
--- /dev/null
+++ b/protos/fuelgauge_usage_state.proto
@@ -0,0 +1,41 @@
+syntax = "proto2";
+
+package com.android.settings.intelligence;
+option java_multiple_files = true;
+option java_package = "com.android.settings.fuelgauge.batteryusage";
+option java_outer_classname = "FuelgaugeUsageStateProto";
+
+// Stores device battery relative information.
+message DeviceBatteryState {
+  optional int32 battery_level = 1;
+  optional int32 battery_status = 2;
+  optional int32 battery_health = 3;
+}
+
+message BatteryInformation {
+  // Records device battery relative information.
+  optional DeviceBatteryState device_battery_state = 1;
+
+  // Whether the data is represented as a system component or not?
+  optional bool is_hidden = 2;
+
+  // Records the timestamp relative information.
+  optional int64 boot_timestamp = 3;
+  optional string zone_id = 4;
+
+  // Records app relative information.
+  optional string app_label = 7;
+
+  // Records the battery usage relative information.
+  optional double total_power = 10;
+  optional double consume_power = 11;
+  optional double percent_of_total = 12;
+  optional int32 drain_type = 13;
+  optional int64 foreground_usage_time_in_ms = 14;
+  optional int64 foreground_service_usage_time_in_ms = 15;
+  optional int64 background_usage_time_in_ms = 16;
+  optional double foreground_usage_consume_power = 17;
+  optional double foreground_service_usage_consume_power = 18;
+  optional double background_usage_consume_power = 19;
+  optional double cached_usage_consume_power = 20;
+}
\ No newline at end of file
diff --git a/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtil.java b/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtil.java
index 7b07642..68a8bfb 100644
--- a/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtil.java
+++ b/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtil.java
@@ -19,13 +19,10 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.util.Base64;
-import android.util.Log;
 
 import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.protobuf.InvalidProtocolBufferException;
-import com.google.protobuf.MessageLite;
 
 import java.io.PrintWriter;
 import java.util.List;
@@ -76,22 +73,8 @@
     }
 
     private static BatteryOptimizeHistoricalLog parseLogFromString(String storedLogs) {
-        return parseProtoFromString(storedLogs, BatteryOptimizeHistoricalLog.getDefaultInstance());
-    }
-
-    @SuppressWarnings("unchecked")
-    private static <T extends MessageLite> T parseProtoFromString(
-            String serializedProto, T protoClass) {
-        if (serializedProto.isEmpty()) {
-            return (T) protoClass.getDefaultInstanceForType();
-        }
-        try {
-            return (T) protoClass.getParserForType()
-                    .parseFrom(Base64.decode(serializedProto, Base64.DEFAULT));
-        } catch (InvalidProtocolBufferException e) {
-            Log.e(TAG, "Failed to deserialize proto class", e);
-            return (T) protoClass.getDefaultInstanceForType();
-        }
+        return BatteryUtils.parseProtoFromString(
+                storedLogs, BatteryOptimizeHistoricalLog.getDefaultInstance());
     }
 
     /**
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index 86259d5..7739f6d 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -32,6 +32,7 @@
 import android.os.SystemClock;
 import android.os.UidBatteryConsumer;
 import android.os.UserHandle;
+import android.util.Base64;
 import android.util.Log;
 
 import androidx.annotation.IntDef;
@@ -52,6 +53,9 @@
 import com.android.settingslib.utils.PowerUtil;
 import com.android.settingslib.utils.ThreadUtils;
 
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.MessageLite;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.time.Duration;
@@ -316,6 +320,28 @@
         }
     }
 
+    /**
+     * Parses proto object from string.
+     *
+     * @param serializedProto the serialized proto string
+     * @param protoClass class of the proto
+     * @return instance of the proto class parsed from the string
+     */
+    @SuppressWarnings("unchecked")
+    public static <T extends MessageLite> T parseProtoFromString(
+            String serializedProto, T protoClass) {
+        if (serializedProto.isEmpty()) {
+            return (T) protoClass.getDefaultInstanceForType();
+        }
+        try {
+            return (T) protoClass.getParserForType()
+                    .parseFrom(Base64.decode(serializedProto, Base64.DEFAULT));
+        } catch (InvalidProtocolBufferException e) {
+            Log.e(TAG, "Failed to deserialize proto class", e);
+            return (T) protoClass.getDefaultInstanceForType();
+        }
+    }
+
     public void setForceAppStandby(int uid, String packageName,
             int mode) {
         final boolean isPreOApp = isPreOApp(packageName);
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java
index b88b2f6..d26927b 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java
@@ -30,23 +30,12 @@
     /** Keys for accessing {@link ContentValues} or {@link Cursor}. */
     public static final String KEY_UID = "uid";
     public static final String KEY_USER_ID = "userId";
-    public static final String KEY_APP_LABEL = "appLabel";
     public static final String KEY_PACKAGE_NAME = "packageName";
-    public static final String KEY_IS_HIDDEN = "isHidden";
-    // Device booting elapsed time from SystemClock.elapsedRealtime().
-    public static final String KEY_BOOT_TIMESTAMP = "bootTimestamp";
     public static final String KEY_TIMESTAMP = "timestamp";
-    public static final String KEY_ZONE_ID = "zoneId";
-    public static final String KEY_TOTAL_POWER = "totalPower";
-    public static final String KEY_CONSUME_POWER = "consumePower";
-    public static final String KEY_PERCENT_OF_TOTAL = "percentOfTotal";
-    public static final String KEY_FOREGROUND_USAGE_TIME = "foregroundUsageTimeInMs";
-    public static final String KEY_BACKGROUND_USAGE_TIME = "backgroundUsageTimeInMs";
-    public static final String KEY_DRAIN_TYPE = "drainType";
     public static final String KEY_CONSUMER_TYPE = "consumerType";
-    public static final String KEY_BATTERY_LEVEL = "batteryLevel";
-    public static final String KEY_BATTERY_STATUS = "batteryStatus";
-    public static final String KEY_BATTERY_HEALTH = "batteryHealth";
+    public static final String KEY_IS_FULL_CHARGE_CYCLE_START = "isFullChargeCycleStart";
+    public static final String KEY_BATTERY_INFORMATION = "batteryInformation";
+    public static final String KEY_BATTERY_INFORMATION_DEBUG = "batteryInformationDebug";
 
     public final long mUid;
     public final long mUserId;
@@ -79,43 +68,49 @@
     public BatteryHistEntry(ContentValues values) {
         mUid = getLong(values, KEY_UID);
         mUserId = getLong(values, KEY_USER_ID);
-        mAppLabel = getString(values, KEY_APP_LABEL);
         mPackageName = getString(values, KEY_PACKAGE_NAME);
-        mIsHidden = getBoolean(values, KEY_IS_HIDDEN);
-        mBootTimestamp = getLong(values, KEY_BOOT_TIMESTAMP);
         mTimestamp = getLong(values, KEY_TIMESTAMP);
-        mZoneId = getString(values, KEY_ZONE_ID);
-        mTotalPower = getDouble(values, KEY_TOTAL_POWER);
-        mConsumePower = getDouble(values, KEY_CONSUME_POWER);
-        mPercentOfTotal = getDouble(values, KEY_PERCENT_OF_TOTAL);
-        mForegroundUsageTimeInMs = getLong(values, KEY_FOREGROUND_USAGE_TIME);
-        mBackgroundUsageTimeInMs = getLong(values, KEY_BACKGROUND_USAGE_TIME);
-        mDrainType = getInteger(values, KEY_DRAIN_TYPE);
         mConsumerType = getInteger(values, KEY_CONSUMER_TYPE);
-        mBatteryLevel = getInteger(values, KEY_BATTERY_LEVEL);
-        mBatteryStatus = getInteger(values, KEY_BATTERY_STATUS);
-        mBatteryHealth = getInteger(values, KEY_BATTERY_HEALTH);
+        final BatteryInformation batteryInformation =
+                ConvertUtils.getBatteryInformation(values, KEY_BATTERY_INFORMATION);
+        mAppLabel = batteryInformation.getAppLabel();
+        mIsHidden = batteryInformation.getIsHidden();
+        mBootTimestamp = batteryInformation.getBootTimestamp();
+        mZoneId = batteryInformation.getZoneId();
+        mTotalPower = batteryInformation.getTotalPower();
+        mConsumePower = batteryInformation.getConsumePower();
+        mPercentOfTotal = batteryInformation.getPercentOfTotal();
+        mForegroundUsageTimeInMs = batteryInformation.getForegroundUsageTimeInMs();
+        mBackgroundUsageTimeInMs = batteryInformation.getBackgroundUsageTimeInMs();
+        mDrainType = batteryInformation.getDrainType();
+        final DeviceBatteryState deviceBatteryState = batteryInformation.getDeviceBatteryState();
+        mBatteryLevel = deviceBatteryState.getBatteryLevel();
+        mBatteryStatus = deviceBatteryState.getBatteryStatus();
+        mBatteryHealth = deviceBatteryState.getBatteryHealth();
     }
 
     public BatteryHistEntry(Cursor cursor) {
         mUid = getLong(cursor, KEY_UID);
         mUserId = getLong(cursor, KEY_USER_ID);
-        mAppLabel = getString(cursor, KEY_APP_LABEL);
         mPackageName = getString(cursor, KEY_PACKAGE_NAME);
-        mIsHidden = getBoolean(cursor, KEY_IS_HIDDEN);
-        mBootTimestamp = getLong(cursor, KEY_BOOT_TIMESTAMP);
         mTimestamp = getLong(cursor, KEY_TIMESTAMP);
-        mZoneId = getString(cursor, KEY_ZONE_ID);
-        mTotalPower = getDouble(cursor, KEY_TOTAL_POWER);
-        mConsumePower = getDouble(cursor, KEY_CONSUME_POWER);
-        mPercentOfTotal = getDouble(cursor, KEY_PERCENT_OF_TOTAL);
-        mForegroundUsageTimeInMs = getLong(cursor, KEY_FOREGROUND_USAGE_TIME);
-        mBackgroundUsageTimeInMs = getLong(cursor, KEY_BACKGROUND_USAGE_TIME);
-        mDrainType = getInteger(cursor, KEY_DRAIN_TYPE);
         mConsumerType = getInteger(cursor, KEY_CONSUMER_TYPE);
-        mBatteryLevel = getInteger(cursor, KEY_BATTERY_LEVEL);
-        mBatteryStatus = getInteger(cursor, KEY_BATTERY_STATUS);
-        mBatteryHealth = getInteger(cursor, KEY_BATTERY_HEALTH);
+        final BatteryInformation batteryInformation =
+                ConvertUtils.getBatteryInformation(cursor, KEY_BATTERY_INFORMATION);
+        mAppLabel = batteryInformation.getAppLabel();
+        mIsHidden = batteryInformation.getIsHidden();
+        mBootTimestamp = batteryInformation.getBootTimestamp();
+        mZoneId = batteryInformation.getZoneId();
+        mTotalPower = batteryInformation.getTotalPower();
+        mConsumePower = batteryInformation.getConsumePower();
+        mPercentOfTotal = batteryInformation.getPercentOfTotal();
+        mForegroundUsageTimeInMs = batteryInformation.getForegroundUsageTimeInMs();
+        mBackgroundUsageTimeInMs = batteryInformation.getBackgroundUsageTimeInMs();
+        mDrainType = batteryInformation.getDrainType();
+        final DeviceBatteryState deviceBatteryState = batteryInformation.getDeviceBatteryState();
+        mBatteryLevel = deviceBatteryState.getBatteryLevel();
+        mBatteryStatus = deviceBatteryState.getBatteryStatus();
+        mBatteryHealth = deviceBatteryState.getBatteryHealth();
     }
 
     private BatteryHistEntry(
@@ -240,23 +235,6 @@
         return 0L;
     }
 
-    private double getDouble(ContentValues values, String key) {
-        if (values != null && values.containsKey(key)) {
-            return values.getAsDouble(key);
-        }
-        mIsValidEntry = false;
-        return 0f;
-    }
-
-    private double getDouble(Cursor cursor, String key) {
-        final int columnIndex = cursor.getColumnIndex(key);
-        if (columnIndex >= 0) {
-            return cursor.getDouble(columnIndex);
-        }
-        mIsValidEntry = false;
-        return 0f;
-    }
-
     private String getString(ContentValues values, String key) {
         if (values != null && values.containsKey(key)) {
             return values.getAsString(key);
@@ -274,24 +252,6 @@
         return null;
     }
 
-    private boolean getBoolean(ContentValues values, String key) {
-        if (values != null && values.containsKey(key)) {
-            return values.getAsBoolean(key);
-        }
-        mIsValidEntry = false;
-        return false;
-    }
-
-    private boolean getBoolean(Cursor cursor, String key) {
-        final int columnIndex = cursor.getColumnIndex(key);
-        if (columnIndex >= 0) {
-            // Use value == 1 to represent boolean value in the database.
-            return cursor.getInt(columnIndex) == 1;
-        }
-        mIsValidEntry = false;
-        return false;
-    }
-
     /** Creates new {@link BatteryHistEntry} from interpolation. */
     public static BatteryHistEntry interpolate(
             long slotTimestamp,
@@ -315,7 +275,7 @@
                 lowerHistEntry == null ? 0 : lowerHistEntry.mBackgroundUsageTimeInMs,
                 upperHistEntry.mBackgroundUsageTimeInMs,
                 ratio);
-        // Checks whether there is any abnoaml cases!
+        // Checks whether there is any abnormal cases!
         if (upperHistEntry.mConsumePower < consumePower
                 || upperHistEntry.mForegroundUsageTimeInMs < foregroundUsageTimeInMs
                 || upperHistEntry.mBackgroundUsageTimeInMs < backgroundUsageTimeInMs) {
diff --git a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
index 1303573..7f3dc31 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
@@ -18,13 +18,16 @@
 import android.annotation.IntDef;
 import android.content.ContentValues;
 import android.content.Context;
+import android.database.Cursor;
 import android.os.BatteryUsageStats;
+import android.os.Build;
 import android.os.LocaleList;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.text.format.DateFormat;
 import android.text.format.DateUtils;
 import android.util.ArraySet;
+import android.util.Base64;
 import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
@@ -83,48 +86,71 @@
 
     /** Converts to content values */
     public static ContentValues convertToContentValues(
-            BatteryEntry entry,
-            BatteryUsageStats batteryUsageStats,
-            int batteryLevel,
-            int batteryStatus,
-            int batteryHealth,
-            long bootTimestamp,
-            long timestamp) {
+            final BatteryEntry entry,
+            final BatteryUsageStats batteryUsageStats,
+            final int batteryLevel,
+            final int batteryStatus,
+            final int batteryHealth,
+            final long bootTimestamp,
+            final long timestamp) {
         final ContentValues values = new ContentValues();
         if (entry != null && batteryUsageStats != null) {
             values.put(BatteryHistEntry.KEY_UID, Long.valueOf(entry.getUid()));
             values.put(BatteryHistEntry.KEY_USER_ID,
                     Long.valueOf(UserHandle.getUserId(entry.getUid())));
-            values.put(BatteryHistEntry.KEY_APP_LABEL, entry.getLabel());
             values.put(BatteryHistEntry.KEY_PACKAGE_NAME,
                     entry.getDefaultPackageName());
-            values.put(BatteryHistEntry.KEY_IS_HIDDEN, Boolean.valueOf(entry.isHidden()));
-            values.put(BatteryHistEntry.KEY_TOTAL_POWER,
-                    Double.valueOf(batteryUsageStats.getConsumedPower()));
-            values.put(BatteryHistEntry.KEY_CONSUME_POWER,
-                    Double.valueOf(entry.getConsumedPower()));
-            values.put(BatteryHistEntry.KEY_PERCENT_OF_TOTAL,
-                    Double.valueOf(entry.mPercent));
-            values.put(BatteryHistEntry.KEY_FOREGROUND_USAGE_TIME,
-                    Long.valueOf(entry.getTimeInForegroundMs()));
-            values.put(BatteryHistEntry.KEY_BACKGROUND_USAGE_TIME,
-                    Long.valueOf(entry.getTimeInBackgroundMs()));
-            values.put(BatteryHistEntry.KEY_DRAIN_TYPE,
-                    Integer.valueOf(entry.getPowerComponentId()));
             values.put(BatteryHistEntry.KEY_CONSUMER_TYPE,
                     Integer.valueOf(entry.getConsumerType()));
         } else {
             values.put(BatteryHistEntry.KEY_PACKAGE_NAME, FAKE_PACKAGE_NAME);
         }
-        values.put(BatteryHistEntry.KEY_BOOT_TIMESTAMP, Long.valueOf(bootTimestamp));
         values.put(BatteryHistEntry.KEY_TIMESTAMP, Long.valueOf(timestamp));
-        values.put(BatteryHistEntry.KEY_ZONE_ID, TimeZone.getDefault().getID());
-        values.put(BatteryHistEntry.KEY_BATTERY_LEVEL, Integer.valueOf(batteryLevel));
-        values.put(BatteryHistEntry.KEY_BATTERY_STATUS, Integer.valueOf(batteryStatus));
-        values.put(BatteryHistEntry.KEY_BATTERY_HEALTH, Integer.valueOf(batteryHealth));
+        final BatteryInformation batteryInformation =
+                constructBatteryInformation(
+                        entry,
+                        batteryUsageStats,
+                        batteryLevel,
+                        batteryStatus,
+                        batteryHealth,
+                        bootTimestamp);
+        values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
+                convertBatteryInformationToString(batteryInformation));
+        // Save the BatteryInformation unencoded string into database for debugging.
+        if (Build.TYPE.equals("userdebug")) {
+            values.put(
+                    BatteryHistEntry.KEY_BATTERY_INFORMATION_DEBUG, batteryInformation.toString());
+        }
         return values;
     }
 
+    /** Gets the encoded string from {@link BatteryInformation} instance. */
+    public static String convertBatteryInformationToString(
+            final BatteryInformation batteryInformation) {
+        return Base64.encodeToString(batteryInformation.toByteArray(), Base64.DEFAULT);
+    }
+
+    /** Gets the {@link BatteryInformation} instance from {@link ContentValues}. */
+    public static BatteryInformation getBatteryInformation(
+            final ContentValues values, final String key) {
+        final BatteryInformation defaultInstance = BatteryInformation.getDefaultInstance();
+        if (values != null && values.containsKey(key)) {
+            return BatteryUtils.parseProtoFromString(values.getAsString(key), defaultInstance);
+        }
+        return defaultInstance;
+    }
+
+    /** Gets the {@link BatteryInformation} instance from {@link Cursor}. */
+    public static BatteryInformation getBatteryInformation(final Cursor cursor, final String key) {
+        final BatteryInformation defaultInstance = BatteryInformation.getDefaultInstance();
+        final int columnIndex = cursor.getColumnIndex(key);
+        if (columnIndex >= 0) {
+            return BatteryUtils.parseProtoFromString(
+                    cursor.getString(columnIndex), defaultInstance);
+        }
+        return defaultInstance;
+    }
+
     /** Converts to {@link BatteryHistEntry} */
     public static BatteryHistEntry convertToBatteryHistEntry(
             BatteryEntry entry,
@@ -331,6 +357,41 @@
         }
     }
 
+    private static BatteryInformation constructBatteryInformation(
+            final BatteryEntry entry,
+            final BatteryUsageStats batteryUsageStats,
+            final int batteryLevel,
+            final int batteryStatus,
+            final int batteryHealth,
+            final long bootTimestamp) {
+        final DeviceBatteryState deviceBatteryState =
+                DeviceBatteryState
+                        .newBuilder()
+                        .setBatteryLevel(batteryLevel)
+                        .setBatteryStatus(batteryStatus)
+                        .setBatteryHealth(batteryHealth)
+                        .build();
+        final BatteryInformation.Builder batteryInformationBuilder =
+                BatteryInformation
+                        .newBuilder()
+                        .setDeviceBatteryState(deviceBatteryState)
+                        .setBootTimestamp(bootTimestamp)
+                        .setZoneId(TimeZone.getDefault().getID());
+        if (entry != null && batteryUsageStats != null) {
+            batteryInformationBuilder
+                    .setIsHidden(entry.isHidden())
+                    .setAppLabel(entry.getLabel() != null ? entry.getLabel() : "")
+                    .setTotalPower(batteryUsageStats.getConsumedPower())
+                    .setConsumePower(entry.getConsumedPower())
+                    .setPercentOfTotal(entry.mPercent)
+                    .setDrainType(entry.getPowerComponentId())
+                    .setForegroundUsageTimeInMs(entry.getTimeInForegroundMs())
+                    .setBackgroundUsageTimeInMs(entry.getTimeInBackgroundMs());
+        }
+
+        return batteryInformationBuilder.build();
+    }
+
     private static void insert24HoursData(
             final int desiredIndex,
             final Map<Integer, List<BatteryDiffEntry>> indexedUsageMap) {
diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryState.java b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryState.java
index 11db118..a50578b 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryState.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryState.java
@@ -17,16 +17,16 @@
 package com.android.settings.fuelgauge.batteryusage.db;
 
 import android.content.ContentValues;
-import android.content.Intent;
-import android.os.BatteryManager;
 
 import androidx.room.Entity;
 import androidx.room.PrimaryKey;
 
+import com.android.settings.fuelgauge.BatteryUtils;
+import com.android.settings.fuelgauge.batteryusage.BatteryInformation;
+
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 
 import java.text.SimpleDateFormat;
-import java.time.Duration;
 import java.util.Date;
 import java.util.Locale;
 import java.util.TimeZone;
@@ -43,68 +43,41 @@
     // Records the app relative information.
     public final long uid;
     public final long userId;
-    public final String appLabel;
     public final String packageName;
-    // Whether the data is represented as system component or not?
-    public final boolean isHidden;
-    // Records the timestamp relative information.
-    public final long bootTimestamp;
     public final long timestamp;
-    public final String zoneId;
-    // Records the battery usage relative information.
-    public final double totalPower;
-    public final double consumePower;
-    public final double percentOfTotal;
-    public final long foregroundUsageTimeInMs;
-    public final long backgroundUsageTimeInMs;
-    public final int drainType;
     public final int consumerType;
-    // Records the battery intent relative information.
-    public final int batteryLevel;
-    public final int batteryStatus;
-    public final int batteryHealth;
+    public final boolean isFullChargeCycleStart;
+    public final String batteryInformation;
+    /**
+     * This field is filled only when build type is "userdebug".
+     * For now, Java Proto Lite is recommended by the Android team as the more lightweight solution
+     * designed specifically for mobile apps to process protobuf.
+     * However, converting protobuf to string through Java Proto Lite needs to parse it into a bytes
+     * field first, which leads to the strings saved in our database are encoded and hard to
+     * understand.
+     * To make it easier to debug in our daily development, this field is added.
+     * It will not be filled for the real users.
+     */
+    public final String batteryInformationDebug;
 
     public BatteryState(
             long uid,
             long userId,
-            String appLabel,
             String packageName,
-            boolean isHidden,
-            long bootTimestamp,
             long timestamp,
-            String zoneId,
-            double totalPower,
-            double consumePower,
-            double percentOfTotal,
-            long foregroundUsageTimeInMs,
-            long backgroundUsageTimeInMs,
-            int drainType,
             int consumerType,
-            int batteryLevel,
-            int batteryStatus,
-            int batteryHealth) {
+            boolean isFullChargeCycleStart,
+            String batteryInformation,
+            String batteryInformationDebug) {
         // Records the app relative information.
         this.uid = uid;
         this.userId = userId;
-        this.appLabel = appLabel;
         this.packageName = packageName;
-        this.isHidden = isHidden;
-        // Records the timestamp relative information.
-        this.bootTimestamp = bootTimestamp;
         this.timestamp = timestamp;
-        this.zoneId = zoneId;
-        // Records the battery usage relative information.
-        this.totalPower = totalPower;
-        this.consumePower = consumePower;
-        this.percentOfTotal = percentOfTotal;
-        this.foregroundUsageTimeInMs = foregroundUsageTimeInMs;
-        this.backgroundUsageTimeInMs = backgroundUsageTimeInMs;
-        this.drainType = drainType;
         this.consumerType = consumerType;
-        // Records the battery intent relative information.
-        this.batteryLevel = batteryLevel;
-        this.batteryStatus = batteryStatus;
-        this.batteryHealth = batteryHealth;
+        this.isFullChargeCycleStart = isFullChargeCycleStart;
+        this.batteryInformation = batteryInformation;
+        this.batteryInformationDebug = batteryInformationDebug;
     }
 
     /** Sets the auto-generated content ID. */
@@ -126,22 +99,17 @@
             sCacheSimpleDateFormat = new SimpleDateFormat("MMM dd,yyyy HH:mm:ss", Locale.US);
         }
         final String recordAtDateTime = sCacheSimpleDateFormat.format(new Date(timestamp));
+        final BatteryInformation batteryInformationInstance =
+                BatteryUtils.parseProtoFromString(
+                        batteryInformation, BatteryInformation.getDefaultInstance());
         final StringBuilder builder = new StringBuilder()
                 .append("\nBatteryState{")
                 .append(String.format(Locale.US,
-                        "\n\tpackage=%s|label=%s|uid=%d|userId=%d|isHidden=%b",
-                        packageName, appLabel, uid, userId, isHidden))
-                .append(String.format(Locale.US, "\n\ttimestamp=%s|zoneId=%s|bootTimestamp=%d",
-                        recordAtDateTime, zoneId, Duration.ofMillis(bootTimestamp).getSeconds()))
-                .append(String.format(Locale.US,
-                        "\n\tusage=%f|total=%f|consume=%f|elapsedTime=%d|%d",
-                        percentOfTotal, totalPower, consumePower,
-                        Duration.ofMillis(foregroundUsageTimeInMs).getSeconds(),
-                        Duration.ofMillis(backgroundUsageTimeInMs).getSeconds()))
-                .append(String.format(Locale.US,
-                        "\n\tdrain=%d|consumer=%d", drainType, consumerType))
-                .append(String.format(Locale.US, "\n\tbattery=%d|status=%d|health=%d\n}",
-                        batteryLevel, batteryStatus, batteryHealth));
+                        "\n\tpackage=%s|uid=%d|userId=%d", packageName, uid, userId))
+                .append(String.format(Locale.US, "\n\ttimestamp=%s|consumer=%d|isStart=%b",
+                        recordAtDateTime, consumerType, isFullChargeCycleStart))
+                .append(String.format(Locale.US, "\n\tbatteryInfo="))
+                .append(batteryInformationInstance.toString());
         return builder.toString();
     }
 
@@ -155,52 +123,25 @@
         if (contentValues.containsKey("userId")) {
             builder.setUserId(contentValues.getAsLong("userId"));
         }
-        if (contentValues.containsKey("appLabel")) {
-            builder.setAppLabel(contentValues.getAsString("appLabel"));
-        }
         if (contentValues.containsKey("packageName")) {
             builder.setPackageName(contentValues.getAsString("packageName"));
         }
-        if (contentValues.containsKey("isHidden")) {
-            builder.setIsHidden(contentValues.getAsBoolean("isHidden"));
-        }
-        if (contentValues.containsKey("bootTimestamp")) {
-            builder.setBootTimestamp(contentValues.getAsLong("bootTimestamp"));
-        }
         if (contentValues.containsKey("timestamp")) {
             builder.setTimestamp(contentValues.getAsLong("timestamp"));
         }
-        if (contentValues.containsKey("consumePower")) {
-            builder.setConsumePower(contentValues.getAsDouble("consumePower"));
-        }
-        if (contentValues.containsKey("totalPower")) {
-            builder.setTotalPower(contentValues.getAsDouble("totalPower"));
-        }
-        if (contentValues.containsKey("percentOfTotal")) {
-            builder.setPercentOfTotal(contentValues.getAsDouble("percentOfTotal"));
-        }
-        if (contentValues.containsKey("foregroundUsageTimeInMs")) {
-            builder.setForegroundUsageTimeInMs(
-                    contentValues.getAsLong("foregroundUsageTimeInMs"));
-        }
-        if (contentValues.containsKey("backgroundUsageTimeInMs")) {
-            builder.setBackgroundUsageTimeInMs(
-                    contentValues.getAsLong("backgroundUsageTimeInMs"));
-        }
-        if (contentValues.containsKey("drainType")) {
-            builder.setDrainType(contentValues.getAsInteger("drainType"));
-        }
         if (contentValues.containsKey("consumerType")) {
             builder.setConsumerType(contentValues.getAsInteger("consumerType"));
         }
-        if (contentValues.containsKey("batteryLevel")) {
-            builder.setBatteryLevel(contentValues.getAsInteger("batteryLevel"));
+        if (contentValues.containsKey("isFullChargeCycleStart")) {
+            builder.setIsFullChargeCycleStart(
+                    contentValues.getAsBoolean("isFullChargeCycleStart"));
         }
-        if (contentValues.containsKey("batteryStatus")) {
-            builder.setBatteryStatus(contentValues.getAsInteger("batteryStatus"));
+        if (contentValues.containsKey("batteryInformation")) {
+            builder.setBatteryInformation(contentValues.getAsString("batteryInformation"));
         }
-        if (contentValues.containsKey("batteryHealth")) {
-            builder.setBatteryHealth(contentValues.getAsInteger("batteryHealth"));
+        if (contentValues.containsKey("batteryInformationDebug")) {
+            builder.setBatteryInformationDebug(
+                    contentValues.getAsString("batteryInformationDebug"));
         }
         return builder.build();
     }
@@ -214,21 +155,12 @@
     public static class Builder {
         private long mUid;
         private long mUserId;
-        private String mAppLabel;
         private String mPackageName;
-        private boolean mIsHidden;
-        private long mBootTimestamp;
         private long mTimestamp;
-        private double mTotalPower;
-        private double mConsumePower;
-        private double mPercentOfTotal;
-        private long mForegroundUsageTimeInMs;
-        private long mBackgroundUsageTimeInMs;
-        private int mDrainType;
         private int mConsumerType;
-        private int mBatteryLevel;
-        private int mBatteryStatus;
-        private int mBatteryHealth;
+        private boolean mIsFullChargeCycleStart;
+        private String mBatteryInformation;
+        private String mBatteryInformationDebug;
 
         /** Sets the uid. */
         @CanIgnoreReturnValue
@@ -244,13 +176,6 @@
             return this;
         }
 
-        /** Sets the app label. */
-        @CanIgnoreReturnValue
-        public Builder setAppLabel(String appLabel) {
-            this.mAppLabel = appLabel;
-            return this;
-        }
-
         /** Sets the package name. */
         @CanIgnoreReturnValue
         public Builder setPackageName(String packageName) {
@@ -258,20 +183,6 @@
             return this;
         }
 
-        /** Sets the is hidden value. */
-        @CanIgnoreReturnValue
-        public Builder setIsHidden(boolean isHidden) {
-            this.mIsHidden = isHidden;
-            return this;
-        }
-
-        /** Sets the boot timestamp. */
-        @CanIgnoreReturnValue
-        public Builder setBootTimestamp(long bootTimestamp) {
-            this.mBootTimestamp = bootTimestamp;
-            return this;
-        }
-
         /** Sets the timestamp. */
         @CanIgnoreReturnValue
         public Builder setTimestamp(long timestamp) {
@@ -279,48 +190,6 @@
             return this;
         }
 
-        /** Sets the total power. */
-        @CanIgnoreReturnValue
-        public Builder setTotalPower(double totalPower) {
-            this.mTotalPower = totalPower;
-            return this;
-        }
-
-        /** Sets the consumed power. */
-        @CanIgnoreReturnValue
-        public Builder setConsumePower(double consumePower) {
-            this.mConsumePower = consumePower;
-            return this;
-        }
-
-        /** Sets the percentage of total. */
-        @CanIgnoreReturnValue
-        public Builder setPercentOfTotal(double percentOfTotal) {
-            this.mPercentOfTotal = percentOfTotal;
-            return this;
-        }
-
-        /** Sets the foreground usage time. */
-        @CanIgnoreReturnValue
-        public Builder setForegroundUsageTimeInMs(long foregroundUsageTimeInMs) {
-            this.mForegroundUsageTimeInMs = foregroundUsageTimeInMs;
-            return this;
-        }
-
-        /** Sets the background usage time. */
-        @CanIgnoreReturnValue
-        public Builder setBackgroundUsageTimeInMs(long backgroundUsageTimeInMs) {
-            this.mBackgroundUsageTimeInMs = backgroundUsageTimeInMs;
-            return this;
-        }
-
-        /** Sets the drain type. */
-        @CanIgnoreReturnValue
-        public Builder setDrainType(int drainType) {
-            this.mDrainType = drainType;
-            return this;
-        }
-
         /** Sets the consumer type. */
         @CanIgnoreReturnValue
         public Builder setConsumerType(int consumerType) {
@@ -328,44 +197,24 @@
             return this;
         }
 
-        /** Sets the battery level. */
+        /** Sets whether is the full charge cycle start. */
         @CanIgnoreReturnValue
-        public Builder setBatteryLevel(int batteryLevel) {
-            this.mBatteryLevel = batteryLevel;
+        public Builder setIsFullChargeCycleStart(boolean isFullChargeCycleStart) {
+            this.mIsFullChargeCycleStart = isFullChargeCycleStart;
             return this;
         }
 
-        /** Sets the battery status. */
+        /** Sets the consumer type. */
         @CanIgnoreReturnValue
-        public Builder setBatteryStatus(int batteryStatus) {
-            this.mBatteryStatus = batteryStatus;
+        public Builder setBatteryInformation(String batteryInformation) {
+            this.mBatteryInformation = batteryInformation;
             return this;
         }
 
-        /** Sets the battery health. */
+        /** Sets the consumer type. */
         @CanIgnoreReturnValue
-        public Builder setBatteryHealth(int batteryHealth) {
-            this.mBatteryHealth = batteryHealth;
-            return this;
-        }
-
-        /** Sets the battery intent. */
-        @CanIgnoreReturnValue
-        public Builder setBatteryIntent(Intent batteryIntent) {
-            final int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
-            final int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 0);
-            this.mBatteryLevel =
-                    scale == 0
-                            ? -1 /*invalid battery level*/
-                            : Math.round((level / (float) scale) * 100f);
-            this.mBatteryStatus =
-                    batteryIntent.getIntExtra(
-                            BatteryManager.EXTRA_STATUS,
-                            BatteryManager.BATTERY_STATUS_UNKNOWN);
-            this.mBatteryHealth =
-                    batteryIntent.getIntExtra(
-                            BatteryManager.EXTRA_HEALTH,
-                            BatteryManager.BATTERY_HEALTH_UNKNOWN);
+        public Builder setBatteryInformationDebug(String batteryInformationDebug) {
+            this.mBatteryInformationDebug = batteryInformationDebug;
             return this;
         }
 
@@ -374,22 +223,12 @@
             return new BatteryState(
                     mUid,
                     mUserId,
-                    mAppLabel,
                     mPackageName,
-                    mIsHidden,
-                    mBootTimestamp,
                     mTimestamp,
-                    /*zoneId=*/ TimeZone.getDefault().getID(),
-                    mTotalPower,
-                    mConsumePower,
-                    mPercentOfTotal,
-                    mForegroundUsageTimeInMs,
-                    mBackgroundUsageTimeInMs,
-                    mDrainType,
                     mConsumerType,
-                    mBatteryLevel,
-                    mBatteryStatus,
-                    mBatteryHealth);
+                    mIsFullChargeCycleStart,
+                    mBatteryInformation,
+                    mBatteryInformationDebug);
         }
 
         private Builder() {}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDatabase.java b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDatabase.java
index 9d13d9f..64c629c 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDatabase.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDatabase.java
@@ -40,7 +40,7 @@
         if (sBatteryStateDatabase == null) {
             sBatteryStateDatabase =
                     Room.databaseBuilder(
-                                    context, BatteryStateDatabase.class, "battery-usage-db-v5")
+                                    context, BatteryStateDatabase.class, "battery-usage-db-v6")
                             // Allows accessing data in the main thread for dumping bugreport.
                             .allowMainThreadQueries()
                             .fallbackToDestructiveMigration()
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
index 3e2db61..d80ae02 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
@@ -679,8 +679,19 @@
         final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>();
         for (int index = 0; index < numOfHours; index++) {
             final ContentValues values = new ContentValues();
-            values.put("batteryLevel", Integer.valueOf(100 - index));
-            values.put("consumePower", Integer.valueOf(100 - index));
+            final DeviceBatteryState deviceBatteryState =
+                    DeviceBatteryState
+                            .newBuilder()
+                            .setBatteryLevel(100 - index)
+                            .build();
+            final BatteryInformation batteryInformation =
+                    BatteryInformation
+                            .newBuilder()
+                            .setDeviceBatteryState(deviceBatteryState)
+                            .setConsumePower(100 - index)
+                            .build();
+            values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
+                    ConvertUtils.convertBatteryInformationToString(batteryInformation));
             final BatteryHistEntry entry = new BatteryHistEntry(values);
             final Map<String, BatteryHistEntry> entryMap = new HashMap<>();
             entryMap.put("fake_entry_key" + index, entry);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
index 07a5504..79c5a1c 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
@@ -138,8 +138,13 @@
         // Generates fake testing data.
         final ContentValues values = getContentValuesWithType(
                 ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
-        values.put(BatteryHistEntry.KEY_DRAIN_TYPE,
-                Integer.valueOf(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY));
+        final BatteryInformation batteryInformation =
+                BatteryInformation
+                        .newBuilder()
+                        .setDrainType(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY)
+                        .build();
+        values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
+                ConvertUtils.convertBatteryInformationToString(batteryInformation));
         final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
 
         final BatteryDiffEntry entry = createBatteryDiffEntry(10, batteryHistEntry);
@@ -233,7 +238,13 @@
         final String expectedAppLabel = "fake app label";
         final ContentValues values = getContentValuesWithType(
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
-        values.put(BatteryHistEntry.KEY_APP_LABEL, expectedAppLabel);
+        final BatteryInformation batteryInformation =
+                BatteryInformation
+                        .newBuilder()
+                        .setAppLabel(expectedAppLabel)
+                        .build();
+        values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
+                ConvertUtils.convertBatteryInformationToString(batteryInformation));
         final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
 
         final BatteryDiffEntry entry = createBatteryDiffEntry(10, batteryHistEntry);
@@ -461,7 +472,13 @@
     private BatteryDiffEntry createBatteryDiffEntry(
             int consumerType, long uid, boolean isHidden) {
         final ContentValues values = getContentValuesWithType(consumerType);
-        values.put(BatteryHistEntry.KEY_IS_HIDDEN, isHidden);
+        final BatteryInformation batteryInformation =
+                BatteryInformation
+                        .newBuilder()
+                        .setIsHidden(isHidden)
+                        .build();
+        values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
+                ConvertUtils.convertBatteryInformationToString(batteryInformation));
         values.put(BatteryHistEntry.KEY_UID, uid);
         return new BatteryDiffEntry(
                 mContext,
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java
index 5dfdd39..d7a5503 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java
@@ -124,7 +124,13 @@
     public void testGetKey_consumerSystemType_returnExpectedString() {
         final ContentValues values = getContentValuesWithType(
                 ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
-        values.put(BatteryHistEntry.KEY_DRAIN_TYPE, 1);
+        final BatteryInformation batteryInformation =
+                BatteryInformation
+                        .newBuilder()
+                        .setDrainType(1)
+                        .build();
+        values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
+                ConvertUtils.convertBatteryInformationToString(batteryInformation));
         final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
 
         assertThat(batteryHistEntry.getKey()).isEqualTo("S|1");
@@ -308,42 +314,40 @@
             new String[]{
                 BatteryHistEntry.KEY_UID,
                 BatteryHistEntry.KEY_USER_ID,
-                BatteryHistEntry.KEY_APP_LABEL,
                 BatteryHistEntry.KEY_PACKAGE_NAME,
-                BatteryHistEntry.KEY_IS_HIDDEN,
-                BatteryHistEntry.KEY_BOOT_TIMESTAMP,
                 BatteryHistEntry.KEY_TIMESTAMP,
-                BatteryHistEntry.KEY_ZONE_ID,
-                BatteryHistEntry.KEY_TOTAL_POWER,
-                BatteryHistEntry.KEY_CONSUME_POWER,
-                BatteryHistEntry.KEY_PERCENT_OF_TOTAL,
-                BatteryHistEntry.KEY_FOREGROUND_USAGE_TIME,
-                BatteryHistEntry.KEY_BACKGROUND_USAGE_TIME,
-                BatteryHistEntry.KEY_DRAIN_TYPE,
                 BatteryHistEntry.KEY_CONSUMER_TYPE,
-                BatteryHistEntry.KEY_BATTERY_LEVEL,
-                BatteryHistEntry.KEY_BATTERY_STATUS,
-                BatteryHistEntry.KEY_BATTERY_HEALTH});
+                BatteryHistEntry.KEY_BATTERY_INFORMATION});
+        DeviceBatteryState deviceBatteryState =
+                DeviceBatteryState
+                        .newBuilder()
+                        .setBatteryLevel(batteryLevel)
+                        .setBatteryStatus(BatteryManager.BATTERY_STATUS_FULL)
+                        .setBatteryHealth(BatteryManager.BATTERY_HEALTH_COLD)
+                        .build();
+        BatteryInformation batteryInformation =
+                BatteryInformation
+                        .newBuilder()
+                        .setDeviceBatteryState(deviceBatteryState)
+                        .setIsHidden(true)
+                        .setBootTimestamp(bootTimestamp)
+                        .setZoneId(TimeZone.getDefault().getID())
+                        .setAppLabel("Settings")
+                        .setTotalPower(totalPower)
+                        .setConsumePower(consumePower)
+                        .setPercentOfTotal(0.3)
+                        .setDrainType(3)
+                        .setForegroundUsageTimeInMs(foregroundUsageTimeInMs)
+                        .setBackgroundUsageTimeInMs(backgroundUsageTimeInMs)
+                        .build();
         cursor.addRow(
             new Object[]{
                 Long.valueOf(1001),
                 Long.valueOf(UserHandle.getUserId(1001)),
-                "Settings",
                 "com.google.android.settings.battery",
-                Integer.valueOf(1),
-                Long.valueOf(bootTimestamp),
                 Long.valueOf(timestamp),
-                TimeZone.getDefault().getID(),
-                Double.valueOf(totalPower),
-                Double.valueOf(consumePower),
-                Double.valueOf(0.3),
-                Long.valueOf(foregroundUsageTimeInMs),
-                Long.valueOf(backgroundUsageTimeInMs),
-                Integer.valueOf(3),
                 Integer.valueOf(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY),
-                Integer.valueOf(batteryLevel),
-                Integer.valueOf(BatteryManager.BATTERY_STATUS_FULL),
-                Integer.valueOf(BatteryManager.BATTERY_HEALTH_COLD)});
+                ConvertUtils.convertBatteryInformationToString(batteryInformation)});
         cursor.moveToFirst();
         return new BatteryHistEntry(cursor);
     }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java
index 713c2ee..361c596 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java
@@ -148,23 +148,37 @@
     @Test
     public void insert_batteryState_returnsExpectedResult() {
         mProvider.onCreate();
+        final DeviceBatteryState deviceBatteryState =
+                DeviceBatteryState
+                        .newBuilder()
+                        .setBatteryLevel(51)
+                        .setBatteryStatus(2)
+                        .setBatteryHealth(3)
+                        .build();
+        final BatteryInformation batteryInformation =
+                BatteryInformation
+                        .newBuilder()
+                        .setDeviceBatteryState(deviceBatteryState)
+                        .setAppLabel("Settings")
+                        .setIsHidden(true)
+                        .setBootTimestamp(101L)
+                        .setTotalPower(99)
+                        .setConsumePower(9)
+                        .setPercentOfTotal(0.9)
+                        .setForegroundUsageTimeInMs(1000)
+                        .setBackgroundUsageTimeInMs(2000)
+                        .setDrainType(1)
+                        .build();
+        final String expectedBatteryInformationString =
+                ConvertUtils.convertBatteryInformationToString(batteryInformation);
         ContentValues values = new ContentValues();
-        values.put("uid", Long.valueOf(101L));
-        values.put("userId", Long.valueOf(1001L));
-        values.put("appLabel", new String("Settings"));
-        values.put("packageName", new String("com.android.settings"));
-        values.put("timestamp", Long.valueOf(2100021L));
-        values.put("isHidden", Boolean.valueOf(true));
-        values.put("totalPower", Double.valueOf(99.0));
-        values.put("consumePower", Double.valueOf(9.0));
-        values.put("percentOfTotal", Double.valueOf(0.9));
-        values.put("foregroundUsageTimeInMs", Long.valueOf(1000));
-        values.put("backgroundUsageTimeInMs", Long.valueOf(2000));
-        values.put("drainType", Integer.valueOf(1));
-        values.put("consumerType", Integer.valueOf(2));
-        values.put("batteryLevel", Integer.valueOf(51));
-        values.put("batteryStatus", Integer.valueOf(2));
-        values.put("batteryHealth", Integer.valueOf(3));
+        values.put(BatteryHistEntry.KEY_UID, Long.valueOf(101L));
+        values.put(BatteryHistEntry.KEY_USER_ID, Long.valueOf(1001L));
+        values.put(BatteryHistEntry.KEY_PACKAGE_NAME, new String("com.android.settings"));
+        values.put(BatteryHistEntry.KEY_TIMESTAMP, Long.valueOf(2100021L));
+        values.put(BatteryHistEntry.KEY_CONSUMER_TYPE, Integer.valueOf(2));
+        values.put(BatteryHistEntry.KEY_IS_FULL_CHARGE_CYCLE_START, true);
+        values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION, expectedBatteryInformationString);
 
         final Uri uri = mProvider.insert(VALID_BATTERY_STATE_CONTENT_URI, values);
 
@@ -175,31 +189,34 @@
         assertThat(states).hasSize(1);
         assertThat(states.get(0).uid).isEqualTo(101L);
         assertThat(states.get(0).userId).isEqualTo(1001L);
-        assertThat(states.get(0).appLabel).isEqualTo("Settings");
         assertThat(states.get(0).packageName).isEqualTo("com.android.settings");
-        assertThat(states.get(0).isHidden).isTrue();
         assertThat(states.get(0).timestamp).isEqualTo(2100021L);
-        assertThat(states.get(0).totalPower).isEqualTo(99.0);
-        assertThat(states.get(0).consumePower).isEqualTo(9.0);
-        assertThat(states.get(0).percentOfTotal).isEqualTo(0.9);
-        assertThat(states.get(0).foregroundUsageTimeInMs).isEqualTo(1000);
-        assertThat(states.get(0).backgroundUsageTimeInMs).isEqualTo(2000);
-        assertThat(states.get(0).drainType).isEqualTo(1);
         assertThat(states.get(0).consumerType).isEqualTo(2);
-        assertThat(states.get(0).batteryLevel).isEqualTo(51);
-        assertThat(states.get(0).batteryStatus).isEqualTo(2);
-        assertThat(states.get(0).batteryHealth).isEqualTo(3);
+        assertThat(states.get(0).isFullChargeCycleStart).isTrue();
+        assertThat(states.get(0).batteryInformation).isEqualTo(expectedBatteryInformationString);
     }
 
     @Test
     public void insert_partialFieldsContentValues_returnsExpectedResult() {
         mProvider.onCreate();
+        final DeviceBatteryState deviceBatteryState =
+                DeviceBatteryState
+                        .newBuilder()
+                        .setBatteryLevel(52)
+                        .setBatteryStatus(3)
+                        .setBatteryHealth(2)
+                        .build();
+        final BatteryInformation batteryInformation =
+                BatteryInformation
+                        .newBuilder()
+                        .setDeviceBatteryState(deviceBatteryState)
+                        .build();
+        final String expectedBatteryInformationString =
+                ConvertUtils.convertBatteryInformationToString(batteryInformation);
         final ContentValues values = new ContentValues();
-        values.put("packageName", new String("fake_data"));
-        values.put("timestamp", Long.valueOf(2100022L));
-        values.put("batteryLevel", Integer.valueOf(52));
-        values.put("batteryStatus", Integer.valueOf(3));
-        values.put("batteryHealth", Integer.valueOf(2));
+        values.put(BatteryHistEntry.KEY_PACKAGE_NAME, new String("fake_data"));
+        values.put(BatteryHistEntry.KEY_TIMESTAMP, Long.valueOf(2100022L));
+        values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION, expectedBatteryInformationString);
 
         final Uri uri = mProvider.insert(VALID_BATTERY_STATE_CONTENT_URI, values);
 
@@ -210,9 +227,7 @@
         assertThat(states).hasSize(1);
         assertThat(states.get(0).packageName).isEqualTo("fake_data");
         assertThat(states.get(0).timestamp).isEqualTo(2100022L);
-        assertThat(states.get(0).batteryLevel).isEqualTo(52);
-        assertThat(states.get(0).batteryStatus).isEqualTo(3);
-        assertThat(states.get(0).batteryHealth).isEqualTo(2);
+        assertThat(states.get(0).batteryInformation).isEqualTo(expectedBatteryInformationString);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
index 46ef7bc..dd8c536 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
@@ -96,34 +96,33 @@
                         /*batteryHealth=*/ BatteryManager.BATTERY_HEALTH_COLD,
                         /*bootTimestamp=*/ 101L,
                         /*timestamp=*/ 10001L);
+        final BatteryInformation batteryInformation =
+                ConvertUtils.getBatteryInformation(
+                        values, BatteryHistEntry.KEY_BATTERY_INFORMATION);
+        final DeviceBatteryState deviceBatteryState = batteryInformation.getDeviceBatteryState();
 
         assertThat(values.getAsLong(BatteryHistEntry.KEY_UID)).isEqualTo(1001L);
         assertThat(values.getAsLong(BatteryHistEntry.KEY_USER_ID))
                 .isEqualTo(UserHandle.getUserId(1001));
-        assertThat(values.getAsString(BatteryHistEntry.KEY_APP_LABEL))
-                .isEqualTo("Settings");
         assertThat(values.getAsString(BatteryHistEntry.KEY_PACKAGE_NAME))
                 .isEqualTo("com.google.android.settings.battery");
-        assertThat(values.getAsBoolean(BatteryHistEntry.KEY_IS_HIDDEN)).isTrue();
-        assertThat(values.getAsLong(BatteryHistEntry.KEY_BOOT_TIMESTAMP))
-                .isEqualTo(101L);
         assertThat(values.getAsLong(BatteryHistEntry.KEY_TIMESTAMP)).isEqualTo(10001L);
-        assertThat(values.getAsString(BatteryHistEntry.KEY_ZONE_ID))
-                .isEqualTo(TimeZone.getDefault().getID());
-        assertThat(values.getAsDouble(BatteryHistEntry.KEY_TOTAL_POWER)).isEqualTo(5.1);
-        assertThat(values.getAsDouble(BatteryHistEntry.KEY_CONSUME_POWER)).isEqualTo(1.1);
-        assertThat(values.getAsDouble(BatteryHistEntry.KEY_PERCENT_OF_TOTAL)).isEqualTo(0.3);
-        assertThat(values.getAsLong(BatteryHistEntry.KEY_FOREGROUND_USAGE_TIME))
-                .isEqualTo(1234L);
-        assertThat(values.getAsLong(BatteryHistEntry.KEY_BACKGROUND_USAGE_TIME))
-                .isEqualTo(5689L);
-        assertThat(values.getAsInteger(BatteryHistEntry.KEY_DRAIN_TYPE)).isEqualTo(expectedType);
         assertThat(values.getAsInteger(BatteryHistEntry.KEY_CONSUMER_TYPE))
                 .isEqualTo(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
-        assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_LEVEL)).isEqualTo(12);
-        assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_STATUS))
+        assertThat(batteryInformation.getAppLabel()).isEqualTo("Settings");
+        assertThat(batteryInformation.getIsHidden()).isTrue();
+        assertThat(batteryInformation.getBootTimestamp()).isEqualTo(101L);
+        assertThat(batteryInformation.getZoneId()).isEqualTo(TimeZone.getDefault().getID());
+        assertThat(batteryInformation.getTotalPower()).isEqualTo(5.1);
+        assertThat(batteryInformation.getConsumePower()).isEqualTo(1.1);
+        assertThat(batteryInformation.getPercentOfTotal()).isEqualTo(0.3);
+        assertThat(batteryInformation.getForegroundUsageTimeInMs()).isEqualTo(1234L);
+        assertThat(batteryInformation.getBackgroundUsageTimeInMs()).isEqualTo(5689L);
+        assertThat(batteryInformation.getDrainType()).isEqualTo(expectedType);
+        assertThat(deviceBatteryState.getBatteryLevel()).isEqualTo(12);
+        assertThat(deviceBatteryState.getBatteryStatus())
                 .isEqualTo(BatteryManager.BATTERY_STATUS_FULL);
-        assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_HEALTH))
+        assertThat(deviceBatteryState.getBatteryHealth())
                 .isEqualTo(BatteryManager.BATTERY_HEALTH_COLD);
     }
 
@@ -139,17 +138,19 @@
                         /*bootTimestamp=*/ 101L,
                         /*timestamp=*/ 10001L);
 
-        assertThat(values.getAsLong(BatteryHistEntry.KEY_BOOT_TIMESTAMP))
-                .isEqualTo(101L);
+        final BatteryInformation batteryInformation =
+                ConvertUtils.getBatteryInformation(
+                        values, BatteryHistEntry.KEY_BATTERY_INFORMATION);
+        final DeviceBatteryState deviceBatteryState = batteryInformation.getDeviceBatteryState();
+        assertThat(batteryInformation.getBootTimestamp()).isEqualTo(101L);
+        assertThat(batteryInformation.getZoneId()).isEqualTo(TimeZone.getDefault().getID());
+        assertThat(deviceBatteryState.getBatteryLevel()).isEqualTo(12);
+        assertThat(deviceBatteryState.getBatteryStatus())
+                .isEqualTo(BatteryManager.BATTERY_STATUS_FULL);
+        assertThat(deviceBatteryState.getBatteryHealth())
+                .isEqualTo(BatteryManager.BATTERY_HEALTH_COLD);
         assertThat(values.getAsLong(BatteryHistEntry.KEY_TIMESTAMP))
                 .isEqualTo(10001L);
-        assertThat(values.getAsString(BatteryHistEntry.KEY_ZONE_ID))
-                .isEqualTo(TimeZone.getDefault().getID());
-        assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_LEVEL)).isEqualTo(12);
-        assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_STATUS))
-                .isEqualTo(BatteryManager.BATTERY_STATUS_FULL);
-        assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_HEALTH))
-                .isEqualTo(BatteryManager.BATTERY_HEALTH_COLD);
         assertThat(values.getAsString(BatteryHistEntry.KEY_PACKAGE_NAME))
                 .isEqualTo(ConvertUtils.FAKE_PACKAGE_NAME);
     }
@@ -499,17 +500,21 @@
             String packageName, String appLabel, double consumePower,
             long uid, long foregroundUsageTimeInMs, long backgroundUsageTimeInMs) {
         // Only insert required fields.
+        final BatteryInformation batteryInformation =
+                BatteryInformation
+                        .newBuilder()
+                        .setAppLabel(appLabel)
+                        .setConsumePower(consumePower)
+                        .setForegroundUsageTimeInMs(foregroundUsageTimeInMs)
+                        .setBackgroundUsageTimeInMs(backgroundUsageTimeInMs)
+                        .build();
         final ContentValues values = new ContentValues();
         values.put(BatteryHistEntry.KEY_PACKAGE_NAME, packageName);
-        values.put(BatteryHistEntry.KEY_APP_LABEL, appLabel);
         values.put(BatteryHistEntry.KEY_UID, Long.valueOf(uid));
         values.put(BatteryHistEntry.KEY_CONSUMER_TYPE,
                 Integer.valueOf(ConvertUtils.CONSUMER_TYPE_UID_BATTERY));
-        values.put(BatteryHistEntry.KEY_CONSUME_POWER, consumePower);
-        values.put(BatteryHistEntry.KEY_FOREGROUND_USAGE_TIME,
-                Long.valueOf(foregroundUsageTimeInMs));
-        values.put(BatteryHistEntry.KEY_BACKGROUND_USAGE_TIME,
-                Long.valueOf(backgroundUsageTimeInMs));
+        values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
+                ConvertUtils.convertBatteryInformationToString(batteryInformation));
         return new BatteryHistEntry(values);
     }
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
index 7ac8fde..7d68140 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
@@ -458,8 +458,7 @@
     @Test
     public void isFromFullCharge_chargedData_returnTrue() {
         final Map<String, BatteryHistEntry> entryMap = new HashMap<>();
-        final ContentValues values = new ContentValues();
-        values.put("batteryLevel", 100);
+        final ContentValues values = getContentValuesWithBatteryLevel(100);
         final BatteryHistEntry entry = new BatteryHistEntry(values);
         entryMap.put(FAKE_ENTRY_KEY, entry);
 
@@ -1042,8 +1041,7 @@
         final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>();
         for (int index = 0; index < timestamps.length; index++) {
             final Map<String, BatteryHistEntry> entryMap = new HashMap<>();
-            final ContentValues values = new ContentValues();
-            values.put(BatteryHistEntry.KEY_BATTERY_LEVEL, levels[index]);
+            final ContentValues values = getContentValuesWithBatteryLevel(levels[index]);
             final BatteryHistEntry entry = new BatteryHistEntry(values);
             entryMap.put(FAKE_ENTRY_KEY, entry);
             batteryHistoryMap.put(timestamps[index], entryMap);
@@ -1051,20 +1049,43 @@
         return batteryHistoryMap;
     }
 
+    private static ContentValues getContentValuesWithBatteryLevel(final int level) {
+        final ContentValues values = new ContentValues();
+        final DeviceBatteryState deviceBatteryState =
+                DeviceBatteryState
+                        .newBuilder()
+                        .setBatteryLevel(level)
+                        .build();
+        final BatteryInformation batteryInformation =
+                BatteryInformation
+                        .newBuilder()
+                        .setDeviceBatteryState(deviceBatteryState)
+                        .build();
+        values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
+                ConvertUtils.convertBatteryInformationToString(batteryInformation));
+        return values;
+    }
+
     private static BatteryHistEntry createBatteryHistEntry(
             final String packageName, final String appLabel, final double consumePower,
             final long uid, final long userId, final int consumerType,
             final long foregroundUsageTimeInMs, final long backgroundUsageTimeInMs) {
         // Only insert required fields.
+        final BatteryInformation batteryInformation =
+                BatteryInformation
+                        .newBuilder()
+                        .setAppLabel(appLabel)
+                        .setConsumePower(consumePower)
+                        .setForegroundUsageTimeInMs(foregroundUsageTimeInMs)
+                        .setBackgroundUsageTimeInMs(backgroundUsageTimeInMs)
+                        .build();
         final ContentValues values = new ContentValues();
         values.put(BatteryHistEntry.KEY_PACKAGE_NAME, packageName);
-        values.put(BatteryHistEntry.KEY_APP_LABEL, appLabel);
         values.put(BatteryHistEntry.KEY_UID, uid);
         values.put(BatteryHistEntry.KEY_USER_ID, userId);
         values.put(BatteryHistEntry.KEY_CONSUMER_TYPE, consumerType);
-        values.put(BatteryHistEntry.KEY_CONSUME_POWER, consumePower);
-        values.put(BatteryHistEntry.KEY_FOREGROUND_USAGE_TIME, foregroundUsageTimeInMs);
-        values.put(BatteryHistEntry.KEY_BACKGROUND_USAGE_TIME, backgroundUsageTimeInMs);
+        values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
+                ConvertUtils.convertBatteryInformationToString(batteryInformation));
         return new BatteryHistEntry(values);
     }
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java
index 9d9cd02..d140ec1 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java
@@ -231,13 +231,13 @@
         // Verifies the BatteryHistEntry data for timestamp1.
         Map<String, BatteryHistEntry> batteryMap = batteryHistMap.get(timestamp1);
         assertThat(batteryMap).hasSize(1);
-        assertThat(batteryMap.get("1").mAppLabel).isEqualTo("app name1");
+        assertThat(batteryMap.get("1").mPackageName).isEqualTo("app name1");
         // Verifies the BatteryHistEntry data for timestamp2.
         batteryMap = batteryHistMap.get(timestamp2);
         assertThat(batteryMap).hasSize(3);
-        assertThat(batteryMap.get("2").mAppLabel).isEqualTo("app name2");
-        assertThat(batteryMap.get("3").mAppLabel).isEqualTo("app name3");
-        assertThat(batteryMap.get("4").mAppLabel).isEqualTo("app name4");
+        assertThat(batteryMap.get("2").mPackageName).isEqualTo("app name2");
+        assertThat(batteryMap.get("3").mPackageName).isEqualTo("app name3");
+        assertThat(batteryMap.get("4").mPackageName).isEqualTo("app name4");
     }
 
     @Test
@@ -341,20 +341,27 @@
     }
 
     private static void verifyContentValues(double consumedPower, ContentValues values) {
-        assertThat(values.getAsDouble(BatteryHistEntry.KEY_CONSUME_POWER))
-                .isEqualTo(consumedPower);
-        assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_LEVEL)).isEqualTo(20);
-        assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_STATUS))
+        final BatteryInformation batteryInformation =
+                ConvertUtils.getBatteryInformation(
+                        values, BatteryHistEntry.KEY_BATTERY_INFORMATION);
+        final DeviceBatteryState deviceBatteryState = batteryInformation.getDeviceBatteryState();
+        assertThat(batteryInformation.getConsumePower()).isEqualTo(consumedPower);
+        assertThat(deviceBatteryState.getBatteryLevel()).isEqualTo(20);
+        assertThat(deviceBatteryState.getBatteryStatus())
                 .isEqualTo(BatteryManager.BATTERY_STATUS_FULL);
-        assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_HEALTH))
+        assertThat(deviceBatteryState.getBatteryHealth())
                 .isEqualTo(BatteryManager.BATTERY_HEALTH_COLD);
     }
 
     private static void verifyFakeContentValues(ContentValues values) {
-        assertThat(values.getAsInteger("batteryLevel")).isEqualTo(20);
-        assertThat(values.getAsInteger("batteryStatus"))
+        final BatteryInformation batteryInformation =
+                ConvertUtils.getBatteryInformation(
+                        values, BatteryHistEntry.KEY_BATTERY_INFORMATION);
+        final DeviceBatteryState deviceBatteryState = batteryInformation.getDeviceBatteryState();
+        assertThat(deviceBatteryState.getBatteryLevel()).isEqualTo(20);
+        assertThat(deviceBatteryState.getBatteryStatus())
                 .isEqualTo(BatteryManager.BATTERY_STATUS_FULL);
-        assertThat(values.getAsInteger("batteryHealth"))
+        assertThat(deviceBatteryState.getBatteryHealth())
                 .isEqualTo(BatteryManager.BATTERY_HEALTH_COLD);
         assertThat(values.getAsString("packageName"))
                 .isEqualTo(ConvertUtils.FAKE_PACKAGE_NAME);
@@ -372,7 +379,7 @@
     private static MatrixCursor getMatrixCursor() {
         return new MatrixCursor(
                 new String[] {
-                        BatteryHistEntry.KEY_APP_LABEL,
+                        BatteryHistEntry.KEY_PACKAGE_NAME,
                         BatteryHistEntry.KEY_TIMESTAMP,
                         BatteryHistEntry.KEY_UID,
                         BatteryHistEntry.KEY_CONSUMER_TYPE});
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDaoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDaoTest.java
index 41e3f4d..5a22763 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDaoTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateDaoTest.java
@@ -36,7 +36,7 @@
 /** Tests for {@link BatteryStateDao}. */
 @RunWith(RobolectricTestRunner.class)
 public final class BatteryStateDaoTest {
-    private static final int CURSOR_COLUMN_SIZE = 19;
+    private static final int CURSOR_COLUMN_SIZE = 9;
     private static final long TIMESTAMP1 = System.currentTimeMillis();
     private static final long TIMESTAMP2 = System.currentTimeMillis() + 2;
     private static final long TIMESTAMP3 = System.currentTimeMillis() + 4;
@@ -81,10 +81,10 @@
         assertThat(cursor.getColumnCount()).isEqualTo(CURSOR_COLUMN_SIZE);
         // Verifies the queried first battery state.
         cursor.moveToFirst();
-        assertThat(cursor.getString(4 /*packageName*/)).isEqualTo(PACKAGE_NAME3);
+        assertThat(cursor.getString(3 /*packageName*/)).isEqualTo(PACKAGE_NAME3);
         // Verifies the queried second battery state.
         cursor.moveToNext();
-        assertThat(cursor.getString(4 /*packageName*/)).isEqualTo(PACKAGE_NAME2);
+        assertThat(cursor.getString(3 /*packageName*/)).isEqualTo(PACKAGE_NAME2);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateTest.java
index ef23c41..5482065 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateTest.java
@@ -18,9 +18,12 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import android.content.Intent;
 import android.os.BatteryManager;
 
+import com.android.settings.fuelgauge.batteryusage.BatteryInformation;
+import com.android.settings.fuelgauge.batteryusage.ConvertUtils;
+import com.android.settings.fuelgauge.batteryusage.DeviceBatteryState;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -33,66 +36,58 @@
     private static final int BATTERY_STATUS = BatteryManager.BATTERY_STATUS_FULL;
     private static final int BATTERY_HEALTH = BatteryManager.BATTERY_HEALTH_COLD;
 
-    private Intent mBatteryIntent;
+    private BatteryInformation mBatteryInformation;
 
     @Before
     public void setUp() {
-        mBatteryIntent = new Intent(Intent.ACTION_BATTERY_CHANGED);
-        // Inserts the battery states into intent.
-        mBatteryIntent.putExtra(BatteryManager.EXTRA_LEVEL, BATTERY_LEVEL);
-        mBatteryIntent.putExtra(BatteryManager.EXTRA_STATUS, BATTERY_STATUS);
-        mBatteryIntent.putExtra(BatteryManager.EXTRA_HEALTH, BATTERY_HEALTH);
+        final DeviceBatteryState deviceBatteryState =
+                DeviceBatteryState
+                        .newBuilder()
+                        .setBatteryLevel(BATTERY_LEVEL)
+                        .setBatteryStatus(BATTERY_STATUS)
+                        .setBatteryHealth(BATTERY_HEALTH)
+                        .build();
+        mBatteryInformation =
+                BatteryInformation
+                        .newBuilder()
+                        .setDeviceBatteryState(deviceBatteryState)
+                        .setBootTimestamp(101L)
+                        .setIsHidden(true)
+                        .setAppLabel("Settings")
+                        .setTotalPower(100)
+                        .setConsumePower(3)
+                        .setPercentOfTotal(10)
+                        .setDrainType(1)
+                        .setForegroundUsageTimeInMs(60000)
+                        .setBackgroundUsageTimeInMs(10000)
+                        .build();
     }
 
     @Test
     public void testBuilder_returnsExpectedResult() {
-        mBatteryIntent.putExtra(BatteryManager.EXTRA_SCALE, 100);
-        BatteryState state = create(mBatteryIntent);
+        BatteryState state = create(mBatteryInformation);
 
         // Verifies the app relative information.
         assertThat(state.uid).isEqualTo(1001L);
         assertThat(state.userId).isEqualTo(100L);
-        assertThat(state.appLabel).isEqualTo("Settings");
         assertThat(state.packageName).isEqualTo("com.android.settings");
-        assertThat(state.isHidden).isTrue();
-        assertThat(state.bootTimestamp).isEqualTo(101L);
         assertThat(state.timestamp).isEqualTo(100001L);
-        // Verifies the battery relative information.
-        assertThat(state.totalPower).isEqualTo(100);
-        assertThat(state.consumePower).isEqualTo(3);
-        assertThat(state.percentOfTotal).isEqualTo(10);
-        assertThat(state.foregroundUsageTimeInMs).isEqualTo(60000);
-        assertThat(state.backgroundUsageTimeInMs).isEqualTo(10000);
-        assertThat(state.drainType).isEqualTo(1);
         assertThat(state.consumerType).isEqualTo(2);
-        assertThat(state.batteryLevel).isEqualTo(BATTERY_LEVEL);
-        assertThat(state.batteryStatus).isEqualTo(BATTERY_STATUS);
-        assertThat(state.batteryHealth).isEqualTo(BATTERY_HEALTH);
+        assertThat(state.isFullChargeCycleStart).isTrue();
+        assertThat(state.batteryInformation).isEqualTo(
+                ConvertUtils.convertBatteryInformationToString(mBatteryInformation));
     }
 
-    @Test
-    public void create_withoutBatteryScale_returnsStateWithInvalidLevel() {
-        BatteryState state = create(mBatteryIntent);
-        assertThat(state.batteryLevel).isEqualTo(-1);
-    }
-
-    private static BatteryState create(Intent intent) {
+    private static BatteryState create(BatteryInformation batteryInformation) {
         return BatteryState.newBuilder()
                 .setUid(1001L)
                 .setUserId(100L)
-                .setAppLabel("Settings")
                 .setPackageName("com.android.settings")
-                .setIsHidden(true)
-                .setBootTimestamp(101L)
                 .setTimestamp(100001L)
-                .setTotalPower(100f)
-                .setConsumePower(3f)
-                .setPercentOfTotal(10f)
-                .setForegroundUsageTimeInMs(60000)
-                .setBackgroundUsageTimeInMs(10000)
-                .setDrainType(1)
                 .setConsumerType(2)
-                .setBatteryIntent(intent)
+                .setIsFullChargeCycleStart(true)
+                .setBatteryInformation(
+                        ConvertUtils.convertBatteryInformationToString(batteryInformation))
                 .build();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
index 80e6828..9023cc5 100644
--- a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
@@ -23,6 +23,9 @@
 
 import androidx.room.Room;
 
+import com.android.settings.fuelgauge.batteryusage.BatteryInformation;
+import com.android.settings.fuelgauge.batteryusage.ConvertUtils;
+import com.android.settings.fuelgauge.batteryusage.DeviceBatteryState;
 import com.android.settings.fuelgauge.batteryusage.db.BatteryState;
 import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDao;
 import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDatabase;
@@ -75,26 +78,44 @@
     /** Inserts a fake data into the database for testing. */
     public static void insertDataToBatteryStateDatabase(
             Context context, long timestamp, String packageName, boolean multiple) {
+        DeviceBatteryState deviceBatteryState =
+                DeviceBatteryState
+                        .newBuilder()
+                        .setBatteryLevel(31)
+                        .setBatteryStatus(0)
+                        .setBatteryHealth(0)
+                        .build();
+        BatteryInformation batteryInformation =
+                BatteryInformation
+                        .newBuilder()
+                        .setDeviceBatteryState(deviceBatteryState)
+                        .setIsHidden(true)
+                        .setBootTimestamp(timestamp - 1)
+                        .setZoneId("Europe/Paris")
+                        .setAppLabel("Settings")
+                        .setTotalPower(100f)
+                        .setConsumePower(0.3f)
+                        .setPercentOfTotal(10f)
+                        .setDrainType(1)
+                        .setForegroundUsageTimeInMs(60000)
+                        .setForegroundServiceUsageTimeInMs(30000)
+                        .setBackgroundUsageTimeInMs(10000)
+                        .setForegroundUsageConsumePower(0.1f)
+                        .setForegroundServiceUsageConsumePower(0.05f)
+                        .setBackgroundUsageConsumePower(0.1f)
+                        .setCachedUsageConsumePower(0.05f)
+                        .build();
+
         final BatteryState state =
                 new BatteryState(
                         /*uid=*/ 1001L,
                         /*userId=*/ 100L,
-                        /*appLabel=*/ "Settings",
                         packageName,
-                        /*isHidden=*/ true,
-                        /*bootTimestamp=*/ timestamp - 1,
                         timestamp,
-                        /*zoneId=*/ "Europe/Paris",
-                        /*totalPower=*/ 100f,
-                        /*consumePower=*/ 0.3f,
-                        /*percentOfTotal=*/ 10f,
-                        /*foregroundUsageTimeInMs=*/ 60000,
-                        /*backgroundUsageTimeInMs=*/ 10000,
-                        /*drainType=*/ 1,
                         /*consumerType=*/ 2,
-                        /*batteryLevel=*/ 31,
-                        /*batteryStatus=*/ 0,
-                        /*batteryHealth=*/ 0);
+                        /*isFullChargeCycleStart=*/ false,
+                        ConvertUtils.convertBatteryInformationToString(batteryInformation),
+                        "");
         BatteryStateDao dao =
                 BatteryStateDatabase.getInstance(context).batteryStateDao();
         if (multiple) {