diff --git a/res/layout/preference_battery_error.xml b/res/layout/preference_battery_error.xml
index 68ac6a2..05d842b 100644
--- a/res/layout/preference_battery_error.xml
+++ b/res/layout/preference_battery_error.xml
@@ -47,6 +47,7 @@
                       android:layout_marginTop="12dp"
                       android:layout_marginBottom="16dp"
                       android:text="@string/battery_missing_message"
+                      android:textColor="@color/battery_info_error_color_black"
                       android:textAppearance="?android:attr/textAppearanceListItem" />
 
             <TextView android:id="@+id/link_text"
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 0fe4975..adee07c 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -210,4 +210,7 @@
 
     <!-- Material inverse ripple color, useful for inverted backgrounds. -->
     <color name="ripple_material_inverse">@*android:color/ripple_material_dark</color>
+
+    <!-- Battery error text color -->
+    <color name="battery_info_error_color_black">@*android:color/primary_text_default_material_light</color>
 </resources>
diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
index 3c9cbaa..3bb8448 100644
--- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
@@ -332,9 +332,12 @@
 
         mTrapezoidIndex = trapezoidIndex;
         mHandler.post(() -> {
+            final long start = System.currentTimeMillis();
             removeAndCacheAllPrefs();
             addAllPreferences();
             refreshCategoryTitle();
+            Log.d(TAG, String.format("refreshUi is finished in %d/ms",
+                    (System.currentTimeMillis() - start)));
         });
         return true;
     }
diff --git a/src/com/android/settings/fuelgauge/BatteryEntry.java b/src/com/android/settings/fuelgauge/BatteryEntry.java
index 0478c8b..5c9d071 100644
--- a/src/com/android/settings/fuelgauge/BatteryEntry.java
+++ b/src/com/android/settings/fuelgauge/BatteryEntry.java
@@ -572,7 +572,8 @@
             name = context.getResources().getString(R.string.process_kernel_label);
         } else if ("mediaserver".equals(name)) {
             name = context.getResources().getString(R.string.process_mediaserver_label);
-        } else if ("dex2oat".equals(name)) {
+        } else if ("dex2oat".equals(name) || "dex2oat32".equals(name) ||
+                "dex2oat64".equals(name)) {
             name = context.getResources().getString(R.string.process_dex2oat_label);
         }
         return new NameAndIcon(name, icon, 0 /* iconId */);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
index 96f0ec7..c1b1761 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
@@ -22,6 +22,7 @@
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
@@ -36,6 +37,7 @@
 import android.os.UserManager;
 
 import com.android.settings.R;
+import com.android.settings.fuelgauge.BatteryEntry.NameAndIcon;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -64,6 +66,7 @@
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Context mMockContext;
+    private Context mContext;
     @Mock private Handler mockHandler;
     @Mock private PackageManager mockPackageManager;
     @Mock private UserManager mockUserManager;
@@ -71,6 +74,7 @@
 
     @Before
     public void stubContextToReturnMockPackageManager() {
+        mContext = spy(RuntimeEnvironment.application);
         when(mMockContext.getPackageManager()).thenReturn(mockPackageManager);
     }
 
@@ -248,4 +252,77 @@
         final String key = entry.getKey();
         assertThat(key).isEqualTo("U|2");
     }
+
+    @Test
+    public void getNameAndIconFromUserId_nullUserInfo_returnDefaultNameAndIcon() {
+        final int userId = 1001;
+        doReturn(mockUserManager).when(mContext).getSystemService(UserManager.class);
+        doReturn(null).when(mockUserManager).getUserInfo(userId);
+
+        final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUserId(
+                mContext, userId);
+        assertThat(nameAndIcon.name).isEqualTo(getString(
+                R.string.running_process_item_removed_user_label));
+        assertThat(nameAndIcon.icon).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));
+
+        assertNameAndIcon("mediaserver", R.string.process_mediaserver_label);
+        assertNameAndIcon("dex2oat32", R.string.process_dex2oat_label);
+        assertNameAndIcon("dex2oat64", R.string.process_dex2oat_label);
+        assertNameAndIcon("dex2oat", R.string.process_dex2oat_label);
+    }
+
+    @Test
+    public void getNameAndIconFromPowerComponent_rerturnExpectedNameAndIcon() {
+        assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY,
+                R.string.ambient_display_screen_title,
+                R.drawable.ic_settings_aod);
+        assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
+                R.string.power_bluetooth,
+                com.android.internal.R.drawable.ic_settings_bluetooth);
+        assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_CAMERA,
+                R.string.power_camera,
+                R.drawable.ic_settings_camera);
+        assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
+                R.string.power_cell,
+                R.drawable.ic_cellular_1_bar);
+        assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT,
+                R.string.power_flashlight,
+                R.drawable.ic_settings_display);
+        assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_PHONE,
+                R.string.power_phone,
+                R.drawable.ic_settings_voice_calls);
+        assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_SCREEN,
+                R.string.power_screen,
+                R.drawable.ic_settings_display);
+        assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_WIFI,
+                R.string.power_wifi,
+                R.drawable.ic_settings_wireless);
+        assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_IDLE,
+                R.string.power_idle,
+                R.drawable.ic_settings_phone_idle);
+    }
+
+    private void assertNameAndIcon(String name, int stringId) {
+        final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUid(
+                mContext, name, /* uid */ 1000);
+        assertThat(nameAndIcon.name).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);
+    }
+
+    private String getString(int stringId) {
+        return mContext.getResources().getString(stringId);
+    }
 }
