diff --git a/src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java b/src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java
index 3674212..c0f96c8 100644
--- a/src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java
+++ b/src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java
@@ -22,6 +22,7 @@
 import android.os.Build;
 import android.util.Log;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 import com.android.settingslib.applications.ApplicationsState.AppFilter;
@@ -37,14 +38,21 @@
     private static final String TAG = AppStateAppBatteryUsageBridge.class.getSimpleName();
     static final boolean DEBUG = Build.IS_DEBUGGABLE;
 
-    private final Context mContext;
-    private final AppOpsManager mAppOpsManager;
-    private final PowerAllowlistBackend mPowerAllowlistBackend;
+    @VisibleForTesting
+    Context mContext;
+    @VisibleForTesting
+    AppOpsManager mAppOpsManager;
+    @VisibleForTesting
+    PowerAllowlistBackend mPowerAllowlistBackend;
 
-    private static final int MODE_UNKNOWN = 0;
-    private static final int MODE_UNRESTRICTED = 1;
-    private static final int MODE_OPTIMIZED = 2;
-    private static final int MODE_RESTRICTED = 3;
+    @VisibleForTesting
+    static final int MODE_UNKNOWN = 0;
+    @VisibleForTesting
+    static final int MODE_UNRESTRICTED = 1;
+    @VisibleForTesting
+    static final int MODE_OPTIMIZED = 2;
+    @VisibleForTesting
+    static final int MODE_RESTRICTED = 3;
 
     @IntDef(
             prefix = {"MODE_"},
@@ -110,8 +118,9 @@
         return new AppBatteryUsageDetails(mode);
     }
 
+    @VisibleForTesting
     @OptimizationMode
-    private static int getAppBatteryUsageDetailsMode(AppEntry entry) {
+    static int getAppBatteryUsageDetailsMode(AppEntry entry) {
         if (entry == null || entry.extraInfo == null) {
             return MODE_UNKNOWN;
         }
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index 018fda5..9a4d13c 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -1196,9 +1196,12 @@
                     rebuild(R.id.sort_order_alpha, true);
                 }
                 return;
-            } else if (mManageApplications.mListType == LIST_TYPE_BATTERY_OPTIMIZATION) {
+            }
+
+            if (mManageApplications.mListType == LIST_TYPE_BATTERY_OPTIMIZATION) {
                 logAppBatteryUsage(filterType);
             }
+
             rebuild();
         }
 
@@ -1673,7 +1676,7 @@
                     holder.setSummary(AppLocaleDetails.getSummary(mContext, entry));
                     break;
                 case LIST_TYPE_BATTERY_OPTIMIZATION:
-                    holder.setSummary(R.string.app_battery_usage_summary);
+                    holder.setSummary(null);
                     break;
                 default:
                     holder.updateSizeText(entry, mManageApplications.mInvalidSizeStr, mWhichSize);
diff --git a/tests/unit/src/com/android/settings/applications/AppStateAppBatteryUsageBridgeTest.java b/tests/unit/src/com/android/settings/applications/AppStateAppBatteryUsageBridgeTest.java
new file mode 100644
index 0000000..c49b4cd
--- /dev/null
+++ b/tests/unit/src/com/android/settings/applications/AppStateAppBatteryUsageBridgeTest.java
@@ -0,0 +1,78 @@
+package com.android.settings.applications;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.app.AppOpsManager;
+import android.content.Context;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
+import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public final class AppStateAppBatteryUsageBridgeTest {
+  private static final String TEST_PACKAGE_1 = "com.example.test.pkg1";
+  private static final String TEST_PACKAGE_2 = "com.example.test.pkg2";
+  private static final int UID_1 = 12345;
+  private static final int UID_2 = 7654321;
+
+  @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+  private Context mContext;
+  @Mock
+  private AppOpsManager mAppOpsManager;
+  @Mock
+  private PowerAllowlistBackend mPowerAllowlistBackend;
+
+  @Before
+  public void initMocks() {
+      MockitoAnnotations.initMocks(this);
+  }
+
+  @Test
+  public void updateExtraInfo_updatesRestricted() {
+    when(mPowerAllowlistBackend.isAllowlisted(TEST_PACKAGE_1)).thenReturn(false);
+    when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
+            UID_1, TEST_PACKAGE_1)).thenReturn(AppOpsManager.MODE_IGNORED);
+    AppStateAppBatteryUsageBridge bridge =
+            new AppStateAppBatteryUsageBridge(mContext, null, null);
+    bridge.mAppOpsManager = mAppOpsManager;
+    bridge.mPowerAllowlistBackend = mPowerAllowlistBackend;
+    AppEntry entry = new AppEntry(mContext, null, 0);
+
+    bridge.updateExtraInfo(entry, TEST_PACKAGE_1, UID_1);
+
+    assertThat(entry.extraInfo.getClass())
+            .isEqualTo(AppStateAppBatteryUsageBridge.AppBatteryUsageDetails.class);
+    assertThat(AppStateAppBatteryUsageBridge.getAppBatteryUsageDetailsMode(entry))
+            .isEqualTo(AppStateAppBatteryUsageBridge.MODE_RESTRICTED);
+  }
+
+  @Test
+  public void updateExtraInfo_updatesUnrestricted() {
+    when(mPowerAllowlistBackend.isAllowlisted(TEST_PACKAGE_1)).thenReturn(true);
+    when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
+            UID_2, TEST_PACKAGE_2)).thenReturn(AppOpsManager.MODE_ALLOWED);
+    AppStateAppBatteryUsageBridge bridge =
+            new AppStateAppBatteryUsageBridge(mContext, null, null);
+    bridge.mAppOpsManager = mAppOpsManager;
+    bridge.mPowerAllowlistBackend = mPowerAllowlistBackend;
+    AppEntry entry = new AppEntry(mContext, null, 0);
+
+    bridge.updateExtraInfo(entry, TEST_PACKAGE_2, UID_2);
+
+    assertThat(entry.extraInfo.getClass())
+            .isEqualTo(AppStateAppBatteryUsageBridge.AppBatteryUsageDetails.class);
+    assertThat(AppStateAppBatteryUsageBridge.getAppBatteryUsageDetailsMode(entry))
+            .isEqualTo(AppStateAppBatteryUsageBridge.MODE_UNRESTRICTED);
+  }
+}
