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 com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -135,13 +133,16 @@ public final class BatteryBackupHelper implements BackupHelper {
for (ApplicationInfo info : applications) {
final int mode = appOps.checkOpNoThrow(
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));
// Ignores default optimized or unknown state.
if (state == AppUsageState.OPTIMIZED || state == AppUsageState.UNKNOWN) {
if (optimizationMode == BatteryOptimizeUtils.MODE_OPTIMIZED
|| optimizationMode == BatteryOptimizeUtils.MODE_UNKNOWN) {
continue;
}
final String packageOptimizeMode = info.packageName + DELIMITER_MODE + state;
final String packageOptimizeMode =
info.packageName + DELIMITER_MODE + optimizationMode;
builder.append(packageOptimizeMode + DELIMITER);
debugLog(packageOptimizeMode);
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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