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:
@@ -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);
|
||||
}
|
||||
|
@@ -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.");
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user