Refactor BatteryOptimizeUtils from enum to @IntDef

Based on the Android API Council guideline, we should avoid using the
Enum structure to define the constant definition.
go/android-api-guidelines#avoid-enum

Bug: 197595292
Test: make SettingsRoboTests
Change-Id: I4b22f0abde7f4ce2c3a0b076db786e619783d93e
This commit is contained in:
ykhung
2021-08-24 14:37:05 +08:00
committed by YUKAI HUNG
parent d9085192ba
commit b2f80a7105
10 changed files with 84 additions and 70 deletions

View File

@@ -37,8 +37,6 @@ import android.util.Log;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -135,13 +133,16 @@ public final class BatteryBackupHelper implements BackupHelper {
for (ApplicationInfo info : applications) { for (ApplicationInfo info : applications) {
final int mode = appOps.checkOpNoThrow( final int mode = appOps.checkOpNoThrow(
AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, info.uid, info.packageName); AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, info.uid, info.packageName);
final AppUsageState state = BatteryOptimizeUtils.getAppUsageState( @BatteryOptimizeUtils.OptimizationMode
final int optimizationMode = BatteryOptimizeUtils.getAppOptimizationMode(
mode, allowlistedApps.contains(info.packageName)); mode, allowlistedApps.contains(info.packageName));
// Ignores default optimized or unknown state. // Ignores default optimized or unknown state.
if (state == AppUsageState.OPTIMIZED || state == AppUsageState.UNKNOWN) { if (optimizationMode == BatteryOptimizeUtils.MODE_OPTIMIZED
|| optimizationMode == BatteryOptimizeUtils.MODE_UNKNOWN) {
continue; continue;
} }
final String packageOptimizeMode = info.packageName + DELIMITER_MODE + state; final String packageOptimizeMode =
info.packageName + DELIMITER_MODE + optimizationMode;
builder.append(packageOptimizeMode + DELIMITER); builder.append(packageOptimizeMode + DELIMITER);
debugLog(packageOptimizeMode); debugLog(packageOptimizeMode);
} }

View File

@@ -16,6 +16,7 @@
package com.android.settings.fuelgauge; package com.android.settings.fuelgauge;
import android.annotation.IntDef;
import android.app.AppOpsManager; import android.app.AppOpsManager;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
@@ -24,6 +25,9 @@ import androidx.annotation.VisibleForTesting;
import com.android.settingslib.fuelgauge.PowerAllowlistBackend; import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/** A utility class for application usage operation. */ /** A utility class for application usage operation. */
public class BatteryOptimizeUtils { public class BatteryOptimizeUtils {
private static final String TAG = "BatteryOptimizeUtils"; private static final String TAG = "BatteryOptimizeUtils";
@@ -32,21 +36,27 @@ public class BatteryOptimizeUtils {
@VisibleForTesting AppOpsManager mAppOpsManager; @VisibleForTesting AppOpsManager mAppOpsManager;
@VisibleForTesting BatteryUtils mBatteryUtils; @VisibleForTesting BatteryUtils mBatteryUtils;
@VisibleForTesting PowerAllowlistBackend mPowerAllowListBackend; @VisibleForTesting PowerAllowlistBackend mPowerAllowListBackend;
private final String mPackageName; private final String mPackageName;
private final int mUid; private final int mUid;
private int mMode; private int mMode;
private boolean mAllowListed; private boolean mAllowListed;
/** // Optimization modes.
* Usage type of application. static final int MODE_UNKNOWN = 0;
*/ static final int MODE_RESTRICTED = 1;
public enum AppUsageState { static final int MODE_UNRESTRICTED = 2;
UNKNOWN, static final int MODE_OPTIMIZED = 3;
RESTRICTED,
UNRESTRICTED, @IntDef(prefix = {"MODE_"}, value = {
OPTIMIZED, MODE_UNKNOWN,
} MODE_RESTRICTED,
MODE_UNRESTRICTED,
MODE_OPTIMIZED,
})
@Retention(RetentionPolicy.SOURCE)
static @interface OptimizationMode {}
public BatteryOptimizeUtils(Context context, int uid, String packageName) { public BatteryOptimizeUtils(Context context, int uid, String packageName) {
mUid = uid; mUid = uid;
@@ -59,41 +69,44 @@ public class BatteryOptimizeUtils {
mAllowListed = mPowerAllowListBackend.isAllowlisted(mPackageName); mAllowListed = mPowerAllowListBackend.isAllowlisted(mPackageName);
} }
/** Gets the {@link AppUsageState} based on mode and allowed list. */ /** Gets the {@link OptimizationMode} based on mode and allowed list. */
public static AppUsageState getAppUsageState(int mode, boolean isAllowListed) { @OptimizationMode
public static int getAppOptimizationMode(int mode, boolean isAllowListed) {
if (!isAllowListed && mode == AppOpsManager.MODE_IGNORED) { if (!isAllowListed && mode == AppOpsManager.MODE_IGNORED) {
return AppUsageState.RESTRICTED; return MODE_RESTRICTED;
} else if (isAllowListed && mode == AppOpsManager.MODE_ALLOWED) { } else if (isAllowListed && mode == AppOpsManager.MODE_ALLOWED) {
return AppUsageState.UNRESTRICTED; return MODE_UNRESTRICTED;
} else if (!isAllowListed && mode == AppOpsManager.MODE_ALLOWED) { } else if (!isAllowListed && mode == AppOpsManager.MODE_ALLOWED) {
return AppUsageState.OPTIMIZED; return MODE_OPTIMIZED;
} else { } else {
return AppUsageState.UNKNOWN; return MODE_UNKNOWN;
} }
} }
/** Gets the current {@link AppUsageState}. */ /** Gets the {@link OptimizationMode} for associated app. */
public AppUsageState getAppUsageState() { @OptimizationMode
public int getAppOptimizationMode() {
refreshState(); refreshState();
return getAppUsageState(mMode, mAllowListed); return getAppOptimizationMode(mMode, mAllowListed);
} }
public void setAppUsageState(AppUsageState state) { /** Sets the {@link OptimizationMode} for associated app. */
switch (state) { public void setAppOptimizationMode(@OptimizationMode int mode) {
case RESTRICTED: switch (mode) {
case MODE_RESTRICTED:
mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_IGNORED); mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_IGNORED);
mPowerAllowListBackend.removeApp(mPackageName); mPowerAllowListBackend.removeApp(mPackageName);
break; break;
case UNRESTRICTED: case MODE_UNRESTRICTED:
mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_ALLOWED); mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_ALLOWED);
mPowerAllowListBackend.addApp(mPackageName); mPowerAllowListBackend.addApp(mPackageName);
break; break;
case OPTIMIZED: case MODE_OPTIMIZED:
mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_ALLOWED); mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_ALLOWED);
mPowerAllowListBackend.removeApp(mPackageName); mPowerAllowListBackend.removeApp(mPackageName);
break; break;
default: default:
Log.d(TAG, "set unknown app usage state."); Log.d(TAG, "set unknown app optimization mode.");
} }
} }

View File

@@ -16,8 +16,6 @@
package com.android.settings.fuelgauge; package com.android.settings.fuelgauge;
import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.OPTIMIZED;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
@@ -59,7 +57,8 @@ public class OptimizedPreferenceController extends AbstractPreferenceController
Log.d(TAG, "is system or default app, disable pref"); Log.d(TAG, "is system or default app, disable pref");
((SelectorWithWidgetPreference) preference).setChecked(false); ((SelectorWithWidgetPreference) preference).setChecked(false);
preference.setEnabled(false); preference.setEnabled(false);
} else if (mBatteryOptimizeUtils.getAppUsageState() == OPTIMIZED) { } else if (mBatteryOptimizeUtils.getAppOptimizationMode()
== BatteryOptimizeUtils.MODE_OPTIMIZED) {
Log.d(TAG, "is optimized states"); Log.d(TAG, "is optimized states");
((SelectorWithWidgetPreference) preference).setChecked(true); ((SelectorWithWidgetPreference) preference).setChecked(true);
} else { } else {
@@ -78,7 +77,7 @@ public class OptimizedPreferenceController extends AbstractPreferenceController
return false; return false;
} }
mBatteryOptimizeUtils.setAppUsageState(OPTIMIZED); mBatteryOptimizeUtils.setAppOptimizationMode(BatteryOptimizeUtils.MODE_OPTIMIZED);
Log.d(TAG, "Set optimized"); Log.d(TAG, "Set optimized");
return true; return true;
} }

View File

@@ -17,8 +17,6 @@
package com.android.settings.fuelgauge; package com.android.settings.fuelgauge;
import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.RESTRICTED;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
@@ -57,7 +55,8 @@ public class RestrictedPreferenceController extends AbstractPreferenceController
Log.d(TAG, "is system or default app, disable pref"); Log.d(TAG, "is system or default app, disable pref");
((SelectorWithWidgetPreference) preference).setChecked(false); ((SelectorWithWidgetPreference) preference).setChecked(false);
preference.setEnabled(false); preference.setEnabled(false);
} else if (mBatteryOptimizeUtils.getAppUsageState() == RESTRICTED) { } else if (mBatteryOptimizeUtils.getAppOptimizationMode()
== BatteryOptimizeUtils.MODE_RESTRICTED) {
Log.d(TAG, "is restricted states"); Log.d(TAG, "is restricted states");
((SelectorWithWidgetPreference) preference).setChecked(true); ((SelectorWithWidgetPreference) preference).setChecked(true);
} else { } else {
@@ -81,7 +80,7 @@ public class RestrictedPreferenceController extends AbstractPreferenceController
return false; return false;
} }
mBatteryOptimizeUtils.setAppUsageState(RESTRICTED); mBatteryOptimizeUtils.setAppOptimizationMode(BatteryOptimizeUtils.MODE_RESTRICTED);
Log.d(TAG, "Set restricted"); Log.d(TAG, "Set restricted");
return true; return true;
} }

View File

@@ -16,8 +16,6 @@
package com.android.settings.fuelgauge; package com.android.settings.fuelgauge;
import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.UNRESTRICTED;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
@@ -55,7 +53,8 @@ public class UnrestrictedPreferenceController extends AbstractPreferenceControll
if (mBatteryOptimizeUtils.isSystemOrDefaultApp()) { if (mBatteryOptimizeUtils.isSystemOrDefaultApp()) {
Log.d(TAG, "is system or default app, unrestricted states only"); Log.d(TAG, "is system or default app, unrestricted states only");
((SelectorWithWidgetPreference) preference).setChecked(true); ((SelectorWithWidgetPreference) preference).setChecked(true);
} else if (mBatteryOptimizeUtils.getAppUsageState() == UNRESTRICTED) { } else if (mBatteryOptimizeUtils.getAppOptimizationMode()
== BatteryOptimizeUtils.MODE_UNRESTRICTED) {
Log.d(TAG, "is unrestricted states"); Log.d(TAG, "is unrestricted states");
((SelectorWithWidgetPreference) preference).setChecked(true); ((SelectorWithWidgetPreference) preference).setChecked(true);
} else { } else {
@@ -79,7 +78,7 @@ public class UnrestrictedPreferenceController extends AbstractPreferenceControll
return false; return false;
} }
mBatteryOptimizeUtils.setAppUsageState(UNRESTRICTED); mBatteryOptimizeUtils.setAppOptimizationMode(BatteryOptimizeUtils.MODE_UNRESTRICTED);
Log.d(TAG, "Set unrestricted"); Log.d(TAG, "Set unrestricted");
return true; return true;
} }

View File

@@ -180,8 +180,8 @@ public final class BatteryBackupHelperTest {
mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps); mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps);
final String expectedResult = // 2 for UNRESTRICTED mode and 1 for RESTRICTED mode.
packageName1 + "|UNRESTRICTED," + packageName2 + "|RESTRICTED,"; final String expectedResult = packageName1 + "|2," + packageName2 + "|1,";
final byte[] expectedBytes = expectedResult.getBytes(); final byte[] expectedBytes = expectedResult.getBytes();
verify(mBackupDataOutput).writeEntityHeader( verify(mBackupDataOutput).writeEntityHeader(
BatteryBackupHelper.KEY_OPTIMIZATION_LIST, expectedBytes.length); BatteryBackupHelper.KEY_OPTIMIZATION_LIST, expectedBytes.length);

View File

@@ -16,9 +16,9 @@
package com.android.settings.fuelgauge; package com.android.settings.fuelgauge;
import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.OPTIMIZED; import static com.android.settings.fuelgauge.BatteryOptimizeUtils.MODE_OPTIMIZED;
import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.RESTRICTED; import static com.android.settings.fuelgauge.BatteryOptimizeUtils.MODE_RESTRICTED;
import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.UNRESTRICTED; import static com.android.settings.fuelgauge.BatteryOptimizeUtils.MODE_UNRESTRICTED;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
@@ -65,30 +65,33 @@ public class BatteryOptimizeUtilsTest {
} }
@Test @Test
public void testGetAppUsageState_returnRestricted() { public void testGetAppOptimizationMode_returnRestricted() {
when(mockBackend.isAllowlisted(anyString())).thenReturn(false); when(mockBackend.isAllowlisted(anyString())).thenReturn(false);
when(mockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString())) when(mockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_IGNORED); .thenReturn(AppOpsManager.MODE_IGNORED);
assertThat(mBatteryOptimizeUtils.getAppUsageState()).isEqualTo(RESTRICTED); assertThat(mBatteryOptimizeUtils.getAppOptimizationMode())
.isEqualTo(MODE_RESTRICTED);
} }
@Test @Test
public void testGetAppUsageState_returnUnrestricted() { public void testGetAppOptimizationMode_returnUnrestricted() {
when(mockBackend.isAllowlisted(anyString())).thenReturn(true); when(mockBackend.isAllowlisted(anyString())).thenReturn(true);
when(mockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString())) when(mockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_ALLOWED); .thenReturn(AppOpsManager.MODE_ALLOWED);
assertThat(mBatteryOptimizeUtils.getAppUsageState()).isEqualTo(UNRESTRICTED); assertThat(mBatteryOptimizeUtils.getAppOptimizationMode())
.isEqualTo(MODE_UNRESTRICTED);
} }
@Test @Test
public void testGetAppUsageState_returnOptimized() { public void testGetAppOptimizationMode_returnOptimized() {
when(mockBackend.isAllowlisted(anyString())).thenReturn(false); when(mockBackend.isAllowlisted(anyString())).thenReturn(false);
when(mockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString())) when(mockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_ALLOWED); .thenReturn(AppOpsManager.MODE_ALLOWED);
assertThat(mBatteryOptimizeUtils.getAppUsageState()).isEqualTo(OPTIMIZED); assertThat(mBatteryOptimizeUtils.getAppOptimizationMode())
.isEqualTo(MODE_OPTIMIZED);
} }
@Test @Test
@@ -118,8 +121,8 @@ public class BatteryOptimizeUtilsTest {
} }
@Test @Test
public void testSetAppUsageState_Restricted_verifyAction() { public void testSetAppOptimizationMode_Restricted_verifyAction() {
mBatteryOptimizeUtils.setAppUsageState(RESTRICTED); mBatteryOptimizeUtils.setAppOptimizationMode(MODE_RESTRICTED);
verify(mockBatteryUtils).setForceAppStandby(UID, verify(mockBatteryUtils).setForceAppStandby(UID,
PACKAGE_NAME, AppOpsManager.MODE_IGNORED); PACKAGE_NAME, AppOpsManager.MODE_IGNORED);
@@ -127,8 +130,8 @@ public class BatteryOptimizeUtilsTest {
} }
@Test @Test
public void testSetAppUsageState_Unrestricted_verifyAction() { public void testSetAppOptimizationMode_Unrestricted_verifyAction() {
mBatteryOptimizeUtils.setAppUsageState(UNRESTRICTED); mBatteryOptimizeUtils.setAppOptimizationMode(MODE_UNRESTRICTED);
verify(mockBatteryUtils).setForceAppStandby(UID, verify(mockBatteryUtils).setForceAppStandby(UID,
PACKAGE_NAME, AppOpsManager.MODE_ALLOWED); PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
@@ -136,8 +139,8 @@ public class BatteryOptimizeUtilsTest {
} }
@Test @Test
public void testSetAppUsageState_Optimized_verifyAction() { public void testSetAppOptimizationMode_Optimized_verifyAction() {
mBatteryOptimizeUtils.setAppUsageState(OPTIMIZED); mBatteryOptimizeUtils.setAppOptimizationMode(MODE_OPTIMIZED);
verify(mockBatteryUtils).setForceAppStandby(UID, verify(mockBatteryUtils).setForceAppStandby(UID,
PACKAGE_NAME, AppOpsManager.MODE_ALLOWED); PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);

View File

@@ -76,8 +76,8 @@ public class OptimizedPreferenceControllerTest {
@Test @Test
public void testUpdateState_isOptimizedStates_prefChecked() { public void testUpdateState_isOptimizedStates_prefChecked() {
when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true);
when(mockBatteryOptimizeUtils.getAppUsageState()).thenReturn( when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(
BatteryOptimizeUtils.AppUsageState.OPTIMIZED); BatteryOptimizeUtils.MODE_OPTIMIZED);
mController.updateState(mPreference); mController.updateState(mPreference);
@@ -98,8 +98,8 @@ public class OptimizedPreferenceControllerTest {
mPreference.setKey(mController.KEY_OPTIMIZED_PREF); mPreference.setKey(mController.KEY_OPTIMIZED_PREF);
mController.handlePreferenceTreeClick(mPreference); mController.handlePreferenceTreeClick(mPreference);
verify(mockBatteryOptimizeUtils).setAppUsageState( verify(mockBatteryOptimizeUtils).setAppOptimizationMode(
BatteryOptimizeUtils.AppUsageState.OPTIMIZED); BatteryOptimizeUtils.MODE_OPTIMIZED);
} }
@Test @Test

View File

@@ -84,8 +84,8 @@ public class RestrictedPreferenceControllerTest {
@Test @Test
public void testUpdateState_isRestrictedStates_prefChecked() { public void testUpdateState_isRestrictedStates_prefChecked() {
when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true);
when(mockBatteryOptimizeUtils.getAppUsageState()).thenReturn( when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(
BatteryOptimizeUtils.AppUsageState.RESTRICTED); BatteryOptimizeUtils.MODE_RESTRICTED);
mController.updateState(mPreference); mController.updateState(mPreference);
@@ -106,8 +106,8 @@ public class RestrictedPreferenceControllerTest {
mPreference.setKey(mController.KEY_RESTRICTED_PREF); mPreference.setKey(mController.KEY_RESTRICTED_PREF);
mController.handlePreferenceTreeClick(mPreference); mController.handlePreferenceTreeClick(mPreference);
verify(mockBatteryOptimizeUtils).setAppUsageState( verify(mockBatteryOptimizeUtils).setAppOptimizationMode(
BatteryOptimizeUtils.AppUsageState.RESTRICTED); BatteryOptimizeUtils.MODE_RESTRICTED);
} }
@Test @Test

View File

@@ -84,8 +84,8 @@ public class UnrestrictedPreferenceControllerTest {
@Test @Test
public void testUpdateState_isUnrestrictedStates_prefChecked() { public void testUpdateState_isUnrestrictedStates_prefChecked() {
when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true);
when(mockBatteryOptimizeUtils.getAppUsageState()).thenReturn( when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(
BatteryOptimizeUtils.AppUsageState.UNRESTRICTED); BatteryOptimizeUtils.MODE_UNRESTRICTED);
mController.updateState(mPreference); mController.updateState(mPreference);
@@ -106,8 +106,8 @@ public class UnrestrictedPreferenceControllerTest {
mPreference.setKey(mController.KEY_UNRESTRICTED_PREF); mPreference.setKey(mController.KEY_UNRESTRICTED_PREF);
mController.handlePreferenceTreeClick(mPreference); mController.handlePreferenceTreeClick(mPreference);
verify(mockBatteryOptimizeUtils).setAppUsageState( verify(mockBatteryOptimizeUtils).setAppOptimizationMode(
BatteryOptimizeUtils.AppUsageState.UNRESTRICTED); BatteryOptimizeUtils.MODE_UNRESTRICTED);
} }
@Test @Test