Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0ab0a3af authored by ykhung's avatar ykhung Committed by YUKAI HUNG
Browse files

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
Merged-In: I4b22f0abde7f4ce2c3a0b076db786e619783d93e
parent a1b8347a
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -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);
        }
+37 −24
Original line number Diff line number Diff line
@@ -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.");
        }
    }

+3 −4
Original line number Diff line number Diff line
@@ -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");
            ((RadioButtonPreference) preference).setChecked(false);
            preference.setEnabled(false);
        } else if (mBatteryOptimizeUtils.getAppUsageState() == OPTIMIZED) {
        } else if (mBatteryOptimizeUtils.getAppOptimizationMode()
                == BatteryOptimizeUtils.MODE_OPTIMIZED) {
            Log.d(TAG, "is optimized states");
            ((RadioButtonPreference) 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;
    }
+3 −4
Original line number Diff line number Diff line
@@ -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");
            ((RadioButtonPreference) preference).setChecked(false);
            preference.setEnabled(false);
        } else if (mBatteryOptimizeUtils.getAppUsageState() == RESTRICTED) {
        } else if (mBatteryOptimizeUtils.getAppOptimizationMode()
                == BatteryOptimizeUtils.MODE_RESTRICTED) {
            Log.d(TAG, "is restricted states");
            ((RadioButtonPreference) 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;
    }
+3 −4
Original line number Diff line number Diff line
@@ -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");
            ((RadioButtonPreference) preference).setChecked(true);
        } else if (mBatteryOptimizeUtils.getAppUsageState() == UNRESTRICTED) {
        } else if (mBatteryOptimizeUtils.getAppOptimizationMode()
                == BatteryOptimizeUtils.MODE_UNRESTRICTED) {
            Log.d(TAG, "is unrestricted states");
            ((RadioButtonPreference) 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;
    }
Loading