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) {
