diff --git a/src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java b/src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java index 3674212681e..c0f96c8c49a 100644 --- a/src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java +++ b/src/com/android/settings/applications/AppStateAppBatteryUsageBridge.java @@ -22,6 +22,7 @@ import android.content.Context; 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 @@ public class AppStateAppBatteryUsageBridge extends AppStateBaseBridge { 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 @@ public class AppStateAppBatteryUsageBridge extends AppStateBaseBridge { 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 018fda51e12..9a4d13c896f 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -1196,9 +1196,12 @@ public class ManageApplications extends InstrumentedFragment 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 @@ public class ManageApplications extends InstrumentedFragment 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 00000000000..c49b4cd8d2f --- /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); + } +}