Update App battery usage page and add tests.

- Add tests
- Remove duplicated "Set battery usage for apps" text
- Clean up some code

Screenshot: https://screenshot.googleplex.com/8LHhyxFA6X4ZFkT.png

Test: make RunSettingsRoboTests -j40
Bug: 244995036
Change-Id: Iaac9b0af10f541100e91b10affacf3307bd5edca
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);
+  }
+}