diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index b397e18..34edf98 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -172,7 +172,7 @@
         launchArgs.mPackageName = entry.getDefaultPackageName();
         launchArgs.mAppLabel = entry.getLabel();
         launchArgs.mUid = entry.getUid();
-        launchArgs.mIconId = entry.iconId;
+        launchArgs.mIconId = entry.mIconId;
         launchArgs.mConsumedPower = (int) entry.getConsumedPower();
         launchArgs.mForegroundTimeMs = isValidToShowSummary ? entry.getTimeInForegroundMs() : 0;
         launchArgs.mBackgroundTimeMs = isValidToShowSummary ? entry.getTimeInBackgroundMs() : 0;
diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
index 8dbce79..8fb0d1e 100644
--- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
@@ -127,9 +127,9 @@
                         final int userId = UserHandle.getUserId(entry.getUid());
                         final UserHandle userHandle = new UserHandle(userId);
                         pgp.setIcon(mUserManager.getBadgedIconForUser(entry.getIcon(), userHandle));
-                        pgp.setTitle(entry.name);
+                        pgp.setTitle(entry.mName);
                         if (entry.isAppEntry()) {
-                            pgp.setContentDescription(entry.name);
+                            pgp.setContentDescription(entry.mName);
                         }
                     }
                     break;
@@ -249,7 +249,7 @@
                             contentDescription, entry);
                     pref.setKey(key);
                 }
-                entry.percent = percentOfTotal;
+                entry.mPercent = percentOfTotal;
                 pref.setTitle(entry.getLabel());
                 pref.setOrder(i + 1);
                 pref.setPercent(percentOfTotal);
@@ -288,7 +288,7 @@
             final BatteryEntry entry = usageList.get(i);
             final double percentOfTotal = mBatteryUtils.calculateBatteryPercent(
                     entry.getConsumedPower(), totalPower, dischargePercentage);
-            entry.percent = percentOfTotal;
+            entry.mPercent = percentOfTotal;
         }
         return usageList;
     }
diff --git a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
index ca29cfe..5ef1110 100644
--- a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
+++ b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
@@ -171,9 +171,9 @@
         // Checks whether we have cached data or not first before fetching.
         final BatteryEntry.NameAndIcon nameAndIcon = getCache();
         if (nameAndIcon != null) {
-            mAppLabel = nameAndIcon.name;
-            mAppIcon = nameAndIcon.icon;
-            mAppIconId = nameAndIcon.iconId;
+            mAppLabel = nameAndIcon.mName;
+            mAppIcon = nameAndIcon.mIcon;
+            mAppIconId = nameAndIcon.mIconId;
         }
         final Boolean validForRestriction = sValidForRestriction.get(getKey());
         if (validForRestriction != null) {
@@ -196,8 +196,8 @@
                     BatteryEntry.getNameAndIconFromUserId(
                         mContext, (int) mBatteryHistEntry.mUserId);
                 if (nameAndIconForUser != null) {
-                    mAppIcon = nameAndIconForUser.icon;
-                    mAppLabel = nameAndIconForUser.name;
+                    mAppIcon = nameAndIconForUser.mIcon;
+                    mAppLabel = nameAndIconForUser.mName;
                     sResourceCache.put(
                         getKey(),
                         new BatteryEntry.NameAndIcon(mAppLabel, mAppIcon, /*iconId=*/ 0));
@@ -208,10 +208,10 @@
                     BatteryEntry.getNameAndIconFromPowerComponent(
                         mContext, mBatteryHistEntry.mDrainType);
                 if (nameAndIconForSystem != null) {
-                    mAppLabel = nameAndIconForSystem.name;
-                    if (nameAndIconForSystem.iconId != 0) {
-                        mAppIconId = nameAndIconForSystem.iconId;
-                        mAppIcon = mContext.getDrawable(nameAndIconForSystem.iconId);
+                    mAppLabel = nameAndIconForSystem.mName;
+                    if (nameAndIconForSystem.mIconId != 0) {
+                        mAppIconId = nameAndIconForSystem.mIconId;
+                        mAppIcon = mContext.getDrawable(nameAndIconForSystem.mIconId);
                     }
                     sResourceCache.put(
                         getKey(),
@@ -308,8 +308,8 @@
         if (packages == null || packages.length == 0) {
             final BatteryEntry.NameAndIcon nameAndIcon =
                 BatteryEntry.getNameAndIconFromUid(mContext, mAppLabel, uid);
-            mAppLabel = nameAndIcon.name;
-            mAppIcon = nameAndIcon.icon;
+            mAppLabel = nameAndIcon.mName;
+            mAppIcon = nameAndIcon.mIcon;
         }
 
         final BatteryEntry.NameAndIcon nameAndIcon =
@@ -319,13 +319,13 @@
         // Clears BatteryEntry internal cache since we will have another one.
         BatteryEntry.clearUidCache();
         if (nameAndIcon != null) {
-            mAppLabel = nameAndIcon.name;
-            mAppIcon = nameAndIcon.icon;
-            mDefaultPackageName = nameAndIcon.packageName;
+            mAppLabel = nameAndIcon.mName;
+            mAppIcon = nameAndIcon.mIcon;
+            mDefaultPackageName = nameAndIcon.mPackageName;
             if (mDefaultPackageName != null
-                    && !mDefaultPackageName.equals(nameAndIcon.packageName)) {
+                    && !mDefaultPackageName.equals(nameAndIcon.mPackageName)) {
                 Log.w(TAG, String.format("found different package: %s | %s",
-                    mDefaultPackageName, nameAndIcon.packageName));
+                    mDefaultPackageName, nameAndIcon.mPackageName));
             }
         }
     }
diff --git a/src/com/android/settings/fuelgauge/BatteryEntry.java b/src/com/android/settings/fuelgauge/BatteryEntry.java
index 7bb5a4e..c9acc4c 100644
--- a/src/com/android/settings/fuelgauge/BatteryEntry.java
+++ b/src/com/android/settings/fuelgauge/BatteryEntry.java
@@ -53,10 +53,10 @@
 public class BatteryEntry {
 
     public static final class NameAndIcon {
-        public final String name;
-        public final String packageName;
-        public final Drawable icon;
-        public final int iconId;
+        public final String mName;
+        public final String mPackageName;
+        public final Drawable mIcon;
+        public final int mIconId;
 
         public NameAndIcon(String name, Drawable icon, int iconId) {
             this(name, /*packageName=*/ null, icon, iconId);
@@ -64,10 +64,10 @@
 
         public NameAndIcon(
                 String name, String packageName, Drawable icon, int iconId) {
-            this.name = name;
-            this.icon = icon;
-            this.iconId = iconId;
-            this.packageName = packageName;
+            this.mName = name;
+            this.mIcon = icon;
+            this.mIconId = iconId;
+            this.mPackageName = packageName;
         }
     }
 
@@ -111,11 +111,11 @@
                 final NameAndIcon nameAndIcon =
                     BatteryEntry.loadNameAndIcon(
                         be.mContext, be.getUid(), sHandler, be,
-                        be.mDefaultPackageName, be.name, be.icon);
+                        be.mDefaultPackageName, be.mName, be.mIcon);
                 if (nameAndIcon != null) {
-                    be.icon = nameAndIcon.icon;
-                    be.name = nameAndIcon.name;
-                    be.mDefaultPackageName = nameAndIcon.packageName;
+                    be.mIcon = nameAndIcon.mIcon;
+                    be.mName = nameAndIcon.mName;
+                    be.mDefaultPackageName = nameAndIcon.mPackageName;
                 }
             }
         }
@@ -169,27 +169,27 @@
     private long mTimeInForegroundMs;
     private long mTimeInBackgroundMs;
 
-    public String name;
-    public Drawable icon;
-    public int iconId; // For passing to the detail screen.
-    public double percent;
+    public String mName;
+    public Drawable mIcon;
+    public int mIconId;
+    public double mPercent;
     private String mDefaultPackageName;
     private double mConsumedPower;
 
     static class UidToDetail {
-        String name;
-        String packageName;
-        Drawable icon;
+        String mName;
+        String mPackageName;
+        Drawable mIcon;
     }
 
     public BatteryEntry(Context context, Handler handler, UserManager um,
-            @NonNull BatteryConsumer batteryConsumer, boolean isHidden, int uid, String[] packages,
+            BatteryConsumer batteryConsumer, boolean isHidden, int uid, String[] packages,
             String packageName) {
         this(context, handler, um, batteryConsumer, isHidden, uid, packages, packageName, true);
     }
 
     public BatteryEntry(Context context, Handler handler, UserManager um,
-            @NonNull BatteryConsumer batteryConsumer, boolean isHidden, int uid, String[] packages,
+            BatteryConsumer batteryConsumer, boolean isHidden, int uid, String[] packages,
             String packageName, boolean loadDataInBackground) {
         sHandler = handler;
         mContext = context;
@@ -217,11 +217,11 @@
                 try {
                     ApplicationInfo appInfo =
                             pm.getApplicationInfo(mDefaultPackageName, 0 /* no flags */);
-                    name = pm.getApplicationLabel(appInfo).toString();
+                    mName = pm.getApplicationLabel(appInfo).toString();
                 } catch (NameNotFoundException e) {
                     Log.d(TAG, "PackageManager failed to retrieve ApplicationInfo for: "
                             + mDefaultPackageName);
-                    name = mDefaultPackageName;
+                    mName = mDefaultPackageName;
                 }
             }
             getQuickNameIconForUid(uid, packages, loadDataInBackground);
@@ -235,10 +235,10 @@
             mConsumedPower = batteryConsumer.getConsumedPower();
             final NameAndIcon nameAndIcon = getNameAndIconFromUserId(
                     context, ((UserBatteryConsumer) batteryConsumer).getUserId());
-            icon = nameAndIcon.icon;
-            name = nameAndIcon.name;
+            mIcon = nameAndIcon.mIcon;
+            mName = nameAndIcon.mName;
         } else {
-            throw new IllegalArgumentException("Unsupported battery consumer: " + batteryConsumer);
+            throw new IllegalArgumentException("Unsupported: " + batteryConsumer);
         }
     }
 
@@ -257,11 +257,12 @@
         mUsageDurationMs = usageDurationMs;
         mConsumerType = ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY;
 
-        final NameAndIcon nameAndIcon = getNameAndIconFromPowerComponent(context, powerComponentId);
-        iconId = nameAndIcon.iconId;
-        name = nameAndIcon.name;
-        if (iconId != 0) {
-            icon = context.getDrawable(iconId);
+        final NameAndIcon nameAndIcon =
+            getNameAndIconFromPowerComponent(context, powerComponentId);
+        mIconId = nameAndIcon.mIconId;
+        mName = nameAndIcon.mName;
+        if (mIconId != 0) {
+            mIcon = context.getDrawable(mIconId);
         }
     }
 
@@ -274,9 +275,9 @@
         mIsHidden = false;
         mPowerComponentId = powerComponentId;
 
-        iconId = R.drawable.ic_power_system;
-        icon = context.getDrawable(iconId);
-        name = powerComponentName;
+        mIconId = R.drawable.ic_power_system;
+        mIcon = context.getDrawable(mIconId);
+        mName = powerComponentName;
         mConsumedPower =
             powerComponentId == BatteryConsumer.POWER_COMPONENT_SCREEN
                 ? devicePowerMah
@@ -285,14 +286,11 @@
     }
 
     public Drawable getIcon() {
-        return icon;
+        return mIcon;
     }
 
-    /**
-     * Gets the application name
-     */
     public String getLabel() {
-        return name;
+        return mName;
     }
 
     @ConvertUtils.ConsumerType
@@ -317,18 +315,18 @@
         final String uidString = Integer.toString(uid);
         if (sUidCache.containsKey(uidString)) {
             UidToDetail utd = sUidCache.get(uidString);
-            mDefaultPackageName = utd.packageName;
-            name = utd.name;
-            icon = utd.icon;
+            mDefaultPackageName = utd.mPackageName;
+            mName = utd.mName;
+            mIcon = utd.mIcon;
             return;
         }
 
         if (packages == null || packages.length == 0) {
-            final NameAndIcon nameAndIcon = getNameAndIconFromUid(mContext, name, uid);
-            icon = nameAndIcon.icon;
-            name = nameAndIcon.name;
+            final NameAndIcon nameAndIcon = getNameAndIconFromUid(mContext, mName, uid);
+            mIcon = nameAndIcon.mIcon;
+            mName = nameAndIcon.mName;
         } else {
-            icon = mContext.getPackageManager().getDefaultActivityIcon();
+            mIcon = mContext.getPackageManager().getDefaultActivityIcon();
         }
 
         // Avoids post the loading icon and label in the background request.
@@ -339,9 +337,7 @@
         }
     }
 
-    /**
-     * Loads the app label and icon image and stores into the cache.
-     */
+    /** Loads the app label and icon image and stores into the cache. */
     public static NameAndIcon loadNameAndIcon(
             Context context,
             int uid,
@@ -400,7 +396,7 @@
                 // Look for an official name for this UID.
                 for (String pkgName : packages) {
                     try {
-                        final PackageInfo pi = ipm.getPackageInfo(pkgName, 0 /* no flags */, userId);
+                        final PackageInfo pi = ipm.getPackageInfo(pkgName, 0, userId);
                         if (pi == null) {
                             Log.d(TAG, "Retrieving null package info for package "
                                     + pkgName + ", user " + userId);
@@ -432,9 +428,9 @@
         }
 
         UidToDetail utd = new UidToDetail();
-        utd.name = name;
-        utd.icon = icon;
-        utd.packageName = defaultPackageName;
+        utd.mName = name;
+        utd.mIcon = icon;
+        utd.mPackageName = defaultPackageName;
 
         sUidCache.put(uidString, utd);
         if (handler != null) {
@@ -443,9 +439,7 @@
         return new NameAndIcon(name, defaultPackageName, icon, /*iconId=*/ 0);
     }
 
-    /**
-     * Returns a string that uniquely identifies this battery consumer.
-     */
+    /** Returns a string that uniquely identifies this battery consumer. */
     public String getKey() {
         if (mBatteryConsumer instanceof UidBatteryConsumer) {
             return Integer.toString(mUid);
@@ -456,23 +450,17 @@
         }
     }
 
-    /**
-     * Returns true if the entry is hidden from the battery usage summary list.
-     */
+    /** Returns true if the entry is hidden from the battery usage summary list. */
     public boolean isHidden() {
         return mIsHidden;
     }
 
-    /**
-     * Returns true if this entry describes an app (UID)
-     */
+    /** Returns true if this entry describes an app (UID). */
     public boolean isAppEntry() {
         return mBatteryConsumer instanceof UidBatteryConsumer;
     }
 
-    /**
-     * Returns true if this entry describes a User.
-     */
+    /** Returns true if this entry describes a User. */
     public boolean isUserEntry() {
         if (mBatteryConsumer instanceof UserBatteryConsumer) {
             return true;
@@ -495,9 +483,7 @@
         return mUid;
     }
 
-    /**
-     * Returns foreground foreground time (in milliseconds) that is attributed to this entry.
-     */
+    /** Returns foreground foreground time/ms that is attributed to this entry. */
     public long getTimeInForegroundMs() {
         if (mBatteryConsumer instanceof UidBatteryConsumer) {
             return mTimeInForegroundMs;
@@ -506,9 +492,7 @@
         }
     }
 
-    /**
-     * Returns background activity time (in milliseconds) that is attributed to this entry.
-     */
+    /** Returns background activity time/ms that is attributed to this entry. */
     public long getTimeInBackgroundMs() {
         if (mBatteryConsumer instanceof UidBatteryConsumer) {
             return mTimeInBackgroundMs;
@@ -542,9 +526,7 @@
         }
     }
 
-    /**
-     * Gets name and icon resource from UserBatteryConsumer userId.
-     */
+    /** Gets name and icon resource from UserBatteryConsumer userId. */
     public static NameAndIcon getNameAndIconFromUserId(
             Context context, final int userId) {
         UserManager um = context.getSystemService(UserManager.class);
@@ -562,9 +544,7 @@
         return new NameAndIcon(name, icon, 0 /* iconId */);
     }
 
-    /**
-     * Gets name and icon resource from UidBatteryConsumer uid.
-     */
+    /** Gets name and icon resource from UidBatteryConsumer uid. */
     public static NameAndIcon getNameAndIconFromUid(
             Context context, String name, final int uid) {
         Drawable icon = context.getDrawable(R.drawable.ic_power_system);
@@ -579,9 +559,7 @@
         return new NameAndIcon(name, icon, 0 /* iconId */);
     }
 
-    /**
-     * Gets name and icon resource from BatteryConsumer power component ID.
-     */
+    /** Gets name and icon resource from BatteryConsumer power component ID. */
     public static NameAndIcon getNameAndIconFromPowerComponent(
             Context context, @BatteryConsumer.PowerComponent int powerComponentId) {
         String name;
diff --git a/src/com/android/settings/fuelgauge/ConvertUtils.java b/src/com/android/settings/fuelgauge/ConvertUtils.java
index 946c910..696147b 100644
--- a/src/com/android/settings/fuelgauge/ConvertUtils.java
+++ b/src/com/android/settings/fuelgauge/ConvertUtils.java
@@ -101,7 +101,7 @@
             values.put(BatteryHistEntry.KEY_CONSUME_POWER,
                 Double.valueOf(entry.getConsumedPower()));
             values.put(BatteryHistEntry.KEY_PERCENT_OF_TOTAL,
-                Double.valueOf(entry.percent));
+                Double.valueOf(entry.mPercent));
             values.put(BatteryHistEntry.KEY_FOREGROUND_USAGE_TIME,
                 Long.valueOf(entry.getTimeInForegroundMs()));
             values.put(BatteryHistEntry.KEY_BACKGROUND_USAGE_TIME,
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index a10d323..aaa1487 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -181,7 +181,7 @@
         when(mBatteryEntry.getLabel()).thenReturn(APP_LABEL);
         when(mBatteryEntry.getTimeInBackgroundMs()).thenReturn(BACKGROUND_TIME_MS);
         when(mBatteryEntry.getTimeInForegroundMs()).thenReturn(FOREGROUND_TIME_MS);
-        mBatteryEntry.iconId = ICON_ID;
+        mBatteryEntry.mIconId = ICON_ID;
 
         mFragment.mHeaderPreference = mHeaderPreference;
         mFragment.mState = mState;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java
index 13ce29e..710d065 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java
@@ -140,8 +140,8 @@
         // Verifies the app label in the cache.
         final BatteryEntry.NameAndIcon nameAndIcon =
             BatteryDiffEntry.sResourceCache.get(entry.getKey());
-        assertThat(nameAndIcon.name).isEqualTo(expectedName);
-        assertThat(nameAndIcon.iconId).isEqualTo(R.drawable.ic_settings_aod);
+        assertThat(nameAndIcon.mName).isEqualTo(expectedName);
+        assertThat(nameAndIcon.mIconId).isEqualTo(R.drawable.ic_settings_aod);
         // Verifies the restrictable flag in the cache.
         assertThat(entry.mValidForRestriction).isTrue();
         assertThat(BatteryDiffEntry.sValidForRestriction.get(entry.getKey())).isTrue();
@@ -166,8 +166,8 @@
         // Verifies the app label in the cache.
         final BatteryEntry.NameAndIcon nameAndIcon =
             BatteryDiffEntry.sResourceCache.get(entry.getKey());
-        assertThat(nameAndIcon.name).isEqualTo(expectedName);
-        assertThat(nameAndIcon.iconId).isEqualTo(0);
+        assertThat(nameAndIcon.mName).isEqualTo(expectedName);
+        assertThat(nameAndIcon.mIconId).isEqualTo(0);
         // Verifies the restrictable flag in the cache.
         assertThat(entry.mValidForRestriction).isTrue();
         assertThat(BatteryDiffEntry.sValidForRestriction.get(entry.getKey())).isTrue();
@@ -195,7 +195,7 @@
         // Verifies the app label in the cache.
         final BatteryEntry.NameAndIcon nameAndIcon =
             BatteryDiffEntry.sResourceCache.get(entry.getKey());
-        assertThat(nameAndIcon.name).isEqualTo(expectedAppLabel);
+        assertThat(nameAndIcon.mName).isEqualTo(expectedAppLabel);
         // Verifies the restrictable flag in the cache.
         assertThat(entry.mValidForRestriction).isFalse();
         assertThat(BatteryDiffEntry.sValidForRestriction.get(entry.getKey())).isFalse();
@@ -215,7 +215,7 @@
         // Verifies the app label in the cache.
         final BatteryEntry.NameAndIcon nameAndIcon =
             BatteryDiffEntry.sResourceCache.get(entry.getKey());
-        assertThat(nameAndIcon.name).isEqualTo(expectedAppLabel);
+        assertThat(nameAndIcon.mName).isEqualTo(expectedAppLabel);
     }
 
     @Test
@@ -274,7 +274,7 @@
         // Verifies the app label in the cache.
         final BatteryEntry.NameAndIcon nameAndIcon =
             BatteryDiffEntry.sResourceCache.get(entry.getKey());
-        assertThat(nameAndIcon.icon).isEqualTo(mockDrawable);
+        assertThat(nameAndIcon.mIcon).isEqualTo(mockDrawable);
     }
 
     @Test
@@ -309,7 +309,7 @@
         // Verifies the cache is updated into the new drawable.
         final BatteryEntry.NameAndIcon nameAndIcon =
             BatteryDiffEntry.sResourceCache.get(entry2.getKey());
-        assertThat(nameAndIcon.icon).isEqualTo(mockDrawable2);
+        assertThat(nameAndIcon.mIcon).isEqualTo(mockDrawable2);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
index c1b1761..966bc70 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
@@ -158,8 +158,8 @@
         final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application,
                 BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, 200, 100, 1000);
 
-        assertThat(entry.iconId).isEqualTo(R.drawable.ic_settings_aod);
-        assertThat(entry.name).isEqualTo("Ambient display");
+        assertThat(entry.mIconId).isEqualTo(R.drawable.ic_settings_aod);
+        assertThat(entry.mName).isEqualTo("Ambient display");
     }
 
     @Test
@@ -167,8 +167,8 @@
         final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application,
                 BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 42, "ABC", 200, 100);
 
-        assertThat(entry.iconId).isEqualTo(R.drawable.ic_power_system);
-        assertThat(entry.name).isEqualTo("ABC");
+        assertThat(entry.mIconId).isEqualTo(R.drawable.ic_power_system);
+        assertThat(entry.mName).isEqualTo("ABC");
     }
 
     @Test
@@ -261,16 +261,16 @@
 
         final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUserId(
                 mContext, userId);
-        assertThat(nameAndIcon.name).isEqualTo(getString(
+        assertThat(nameAndIcon.mName).isEqualTo(getString(
                 R.string.running_process_item_removed_user_label));
-        assertThat(nameAndIcon.icon).isNull();
+        assertThat(nameAndIcon.mIcon).isNull();
     }
 
     @Test
     public void getNameAndIconFromUid_rerturnExpectedName() {
         final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUid(
                 mContext, /* name */ null, /* uid */ 0);
-        assertThat(nameAndIcon.name).isEqualTo(getString(R.string.process_kernel_label));
+        assertThat(nameAndIcon.mName).isEqualTo(getString(R.string.process_kernel_label));
 
         assertNameAndIcon("mediaserver", R.string.process_mediaserver_label);
         assertNameAndIcon("dex2oat32", R.string.process_dex2oat_label);
@@ -312,14 +312,14 @@
     private void assertNameAndIcon(String name, int stringId) {
         final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUid(
                 mContext, name, /* uid */ 1000);
-        assertThat(nameAndIcon.name).isEqualTo(getString(stringId));
+        assertThat(nameAndIcon.mName).isEqualTo(getString(stringId));
     }
 
     private void assertNameAndIcon(int powerComponentId, int stringId, int iconId) {
         final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromPowerComponent(
                 mContext, powerComponentId);
-        assertThat(nameAndIcon.name).isEqualTo(getString(stringId));
-        assertThat(nameAndIcon.iconId).isEqualTo(iconId);
+        assertThat(nameAndIcon.mName).isEqualTo(getString(stringId));
+        assertThat(nameAndIcon.mIconId).isEqualTo(iconId);
     }
 
     private String getString(int stringId) {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java
index ca3109c..3acb8f3 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java
@@ -57,7 +57,7 @@
         when(mockBatteryEntry.isHidden()).thenReturn(true);
         when(mBatteryUsageStats.getConsumedPower()).thenReturn(5.1);
         when(mockBatteryEntry.getConsumedPower()).thenReturn(1.1);
-        mockBatteryEntry.percent = 0.3;
+        mockBatteryEntry.mPercent = 0.3;
         when(mockBatteryEntry.getTimeInForegroundMs()).thenReturn(1234L);
         when(mockBatteryEntry.getTimeInBackgroundMs()).thenReturn(5689L);
         when(mockBatteryEntry.getPowerComponentId()).thenReturn(expectedType);
@@ -76,7 +76,7 @@
         assertBatteryHistEntry(
             new BatteryHistEntry(values),
             /*drainType=*/ expectedType,
-            /*percentOfTotal=*/ mockBatteryEntry.percent);
+            /*percentOfTotal=*/ mockBatteryEntry.mPercent);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java
index ff0f25c..42483d0 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java
@@ -77,7 +77,7 @@
         when(mockBatteryEntry.isHidden()).thenReturn(true);
         when(mBatteryUsageStats.getConsumedPower()).thenReturn(5.1);
         when(mockBatteryEntry.getConsumedPower()).thenReturn(1.1);
-        mockBatteryEntry.percent = 0.3;
+        mockBatteryEntry.mPercent = 0.3;
         when(mockBatteryEntry.getTimeInForegroundMs()).thenReturn(1234L);
         when(mockBatteryEntry.getTimeInBackgroundMs()).thenReturn(5689L);
         when(mockBatteryEntry.getPowerComponentId()).thenReturn(expectedType);
