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

Commit ca37e536 authored by Kweku Adams's avatar Kweku Adams
Browse files

Give the wellbeing package a higher min balance.

The wellbeing app is pre-set on the device, not expected to be
interacted with much by the user, but can be expected to do work
in the background on behalf of the user. As such, it's a
pseudo-headless system app, so treat it as a headless system app
and give it a higher minimum satiated balance.

Bug: 267655220
Test: atest FrameworksMockingServicesTests:AlarmManagerEconomicPolicyTest
Test: atest FrameworksMockingServicesTests:CompleteEconomicPolicyTest
Test: atest FrameworksMockingServicesTests:JobSchedulerEconomicPolicyTest
Change-Id: I0c26a31e52c8b28b396781957b0fcecaef13020c
parent e87bf3f9
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import static android.app.tare.EconomyManager.DEFAULT_AM_MAX_CONSUMPTION_LIMIT_C
import static android.app.tare.EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES;
import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES;
import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES;
import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES;
import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES;
import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES;
import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES;
@@ -77,6 +78,7 @@ import static android.app.tare.EconomyManager.KEY_AM_MAX_CONSUMPTION_LIMIT;
import static android.app.tare.EconomyManager.KEY_AM_MAX_SATIATED_BALANCE;
import static android.app.tare.EconomyManager.KEY_AM_MIN_CONSUMPTION_LIMIT;
import static android.app.tare.EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED;
import static android.app.tare.EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP;
import static android.app.tare.EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP;
import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT;
import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_INTERACTION_MAX;
@@ -145,6 +147,7 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy {
    };

    private long mMinSatiatedBalanceExempted;
    private long mMinSatiatedBalanceHeadlessSystemApp;
    private long mMinSatiatedBalanceOther;
    private long mMaxSatiatedBalance;
    private long mInitialSatiatedConsumptionLimit;
@@ -179,6 +182,9 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy {
        if (mIrs.isPackageExempted(userId, pkgName)) {
            return mMinSatiatedBalanceExempted;
        }
        if (mIrs.isHeadlessSystemApp(pkgName)) {
            return mMinSatiatedBalanceHeadlessSystemApp;
        }
        // TODO: take other exemptions into account
        return mMinSatiatedBalanceOther;
    }
@@ -242,9 +248,14 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy {

        mMinSatiatedBalanceOther = getConstantAsCake(mParser, properties,
            KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES);
        mMinSatiatedBalanceExempted = getConstantAsCake(mParser, properties,
            KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED, DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
        mMinSatiatedBalanceHeadlessSystemApp = getConstantAsCake(mParser, properties,
                KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
                DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES,
                mMinSatiatedBalanceOther);
        mMinSatiatedBalanceExempted = getConstantAsCake(mParser, properties,
                KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED,
                DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
                mMinSatiatedBalanceHeadlessSystemApp);
        mMaxSatiatedBalance = getConstantAsCake(mParser, properties,
            KEY_AM_MAX_SATIATED_BALANCE, DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
            Math.max(arcToCake(1), mMinSatiatedBalanceExempted));
+22 −0
Original line number Diff line number Diff line
@@ -205,6 +205,11 @@ public class InternalResourceService extends SystemService {
    @GuardedBy("mLock")
    private final SparseArrayMap<String, ArraySet<String>> mInstallers = new SparseArrayMap<>();

    /** The package name of the wellbeing app. */
    @GuardedBy("mLock")
    @Nullable
    private String mWellbeingPackage;

    private volatile boolean mHasBattery = true;
    @EconomyManager.EnabledMode
    private volatile int mEnabledMode;
@@ -496,6 +501,20 @@ public class InternalResourceService extends SystemService {
        }
    }

    boolean isHeadlessSystemApp(@NonNull String pkgName) {
        if (pkgName == null) {
            Slog.wtfStack(TAG, "isHeadlessSystemApp called with null package");
            return false;
        }
        synchronized (mLock) {
            // The wellbeing app is pre-set on the device, not expected to be interacted with
            // much by the user, but can be expected to do work in the background on behalf of
            // the user. As such, it's a pseudo-headless system app, so treat it as a headless
            // system app.
            return pkgName.equals(mWellbeingPackage);
        }
    }

    boolean isPackageExempted(final int userId, @NonNull String pkgName) {
        synchronized (mLock) {
            return mExemptedApps.contains(pkgName);
@@ -1097,6 +1116,9 @@ public class InternalResourceService extends SystemService {
        }
        synchronized (mLock) {
            registerListeners();
            // As of Android UDC, users can't change the wellbeing package, so load it once
            // as soon as possible and don't bother trying to update it afterwards.
            mWellbeingPackage = mPackageManager.getWellbeingPackageName();
            mCurrentBatteryLevel = getCurrentBatteryLevel();
            // Get the current battery presence, if available. This would succeed if TARE is
            // toggled long after boot.
+12 −2
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import static android.app.tare.EconomyManager.DEFAULT_JS_MAX_CONSUMPTION_LIMIT_C
import static android.app.tare.EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES;
import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES;
import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES;
import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES;
import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER_CAKES;
import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES;
import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES;
@@ -90,6 +91,7 @@ import static android.app.tare.EconomyManager.KEY_JS_MAX_CONSUMPTION_LIMIT;
import static android.app.tare.EconomyManager.KEY_JS_MAX_SATIATED_BALANCE;
import static android.app.tare.EconomyManager.KEY_JS_MIN_CONSUMPTION_LIMIT;
import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED;
import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP;
import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER;
import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP;
import static android.app.tare.EconomyManager.KEY_JS_REWARD_APP_INSTALL_INSTANT;
@@ -158,6 +160,7 @@ public class JobSchedulerEconomicPolicy extends EconomicPolicy {
    };

    private long mMinSatiatedBalanceExempted;
    private long mMinSatiatedBalanceHeadlessSystemApp;
    private long mMinSatiatedBalanceOther;
    private long mMinSatiatedBalanceIncrementalAppUpdater;
    private long mMaxSatiatedBalance;
@@ -194,6 +197,8 @@ public class JobSchedulerEconomicPolicy extends EconomicPolicy {
        final long baseBalance;
        if (mIrs.isPackageExempted(userId, pkgName)) {
            baseBalance = mMinSatiatedBalanceExempted;
        } else if (mIrs.isHeadlessSystemApp(pkgName)) {
            baseBalance = mMinSatiatedBalanceHeadlessSystemApp;
        } else {
            baseBalance = mMinSatiatedBalanceOther;
        }
@@ -276,9 +281,14 @@ public class JobSchedulerEconomicPolicy extends EconomicPolicy {

        mMinSatiatedBalanceOther = getConstantAsCake(mParser, properties,
            KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP, DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES);
        mMinSatiatedBalanceExempted = getConstantAsCake(mParser, properties,
            KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED, DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
        mMinSatiatedBalanceHeadlessSystemApp = getConstantAsCake(mParser, properties,
                KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
                DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES,
                mMinSatiatedBalanceOther);
        mMinSatiatedBalanceExempted = getConstantAsCake(mParser, properties,
                KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED,
                DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
                mMinSatiatedBalanceHeadlessSystemApp);
        mMinSatiatedBalanceIncrementalAppUpdater = getConstantAsCake(mParser, properties,
                KEY_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER,
                DEFAULT_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER_CAKES);
+28 −2
Original line number Diff line number Diff line
@@ -136,17 +136,30 @@ public class AlarmManagerEconomicPolicyTest {
                mEconomicPolicy.getMinSatiatedConsumptionLimit());
        assertEquals(EconomyManager.DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES,
                mEconomicPolicy.getMaxSatiatedConsumptionLimit());

        final String pkgRestricted = "com.pkg.restricted";
        when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
        assertEquals(0, mEconomicPolicy.getMinSatiatedBalance(0, pkgRestricted));
        assertEquals(0, mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
        assertEquals(EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
                mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));

        final String pkgExempted = "com.pkg.exempted";
        when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
        assertEquals(EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
                mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
        assertEquals(EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
                mEconomicPolicy.getMaxSatiatedBalance(0, pkgExempted));

        final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
        when(mIrs.isHeadlessSystemApp(eq(pkgHeadlessSystemApp))).thenReturn(true);
        assertEquals(EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES,
                mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
        assertEquals(EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
                mEconomicPolicy.getMaxSatiatedBalance(0, pkgHeadlessSystemApp));

        assertEquals(EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES,
                mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
        assertEquals(EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
                mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
    }

    @Test
@@ -156,6 +169,8 @@ public class AlarmManagerEconomicPolicyTest {
        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_CONSUMPTION_LIMIT, arcToCake(25));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_SATIATED_BALANCE, arcToCake(10));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(9));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
                arcToCake(8));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(7));

        assertEquals(arcToCake(5), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
@@ -168,6 +183,9 @@ public class AlarmManagerEconomicPolicyTest {
        final String pkgExempted = "com.pkg.exempted";
        when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
        assertEquals(arcToCake(9), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
        final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
        when(mIrs.isHeadlessSystemApp(eq(pkgHeadlessSystemApp))).thenReturn(true);
        assertEquals(arcToCake(8), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
        assertEquals(arcToCake(7), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
    }

@@ -179,6 +197,8 @@ public class AlarmManagerEconomicPolicyTest {
        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_CONSUMPTION_LIMIT, arcToCake(-5));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_SATIATED_BALANCE, arcToCake(-1));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(-2));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
                arcToCake(-3));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(-3));

        assertEquals(arcToCake(1), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
@@ -191,6 +211,9 @@ public class AlarmManagerEconomicPolicyTest {
        final String pkgExempted = "com.pkg.exempted";
        when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
        assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
        final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
        when(mIrs.isHeadlessSystemApp(eq(pkgHeadlessSystemApp))).thenReturn(true);
        assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
        assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));

        // Test min+max reversed.
@@ -199,6 +222,8 @@ public class AlarmManagerEconomicPolicyTest {
        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_CONSUMPTION_LIMIT, arcToCake(3));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_SATIATED_BALANCE, arcToCake(10));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(11));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
                arcToCake(12));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(13));

        assertEquals(arcToCake(5), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
@@ -207,6 +232,7 @@ public class AlarmManagerEconomicPolicyTest {
        assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
        assertEquals(arcToCake(13), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
        assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
        assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
        assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
    }
}
+7 −0
Original line number Diff line number Diff line
@@ -189,6 +189,10 @@ public class CompleteEconomicPolicyTest {
        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_SATIATED_BALANCE, arcToCake(11));
        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(8));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(5));
        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
                arcToCake(6));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
                arcToCake(4));
        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(3));
        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(2));

@@ -202,6 +206,9 @@ public class CompleteEconomicPolicyTest {
        final String pkgExempted = "com.pkg.exempted";
        when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
        assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
        final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
        when(mIrs.isHeadlessSystemApp(eq(pkgHeadlessSystemApp))).thenReturn(true);
        assertEquals(arcToCake(10), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
        assertEquals(arcToCake(5), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
    }

Loading