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

Commit 859b2f6c authored by Kweku Adams's avatar Kweku Adams Committed by Automerger Merge Worker
Browse files

Merge "Make TARE DeviceConfig-urable." into tm-dev am: bed9d116

parents a55d87bb bed9d116
Loading
Loading
Loading
Loading
+173 −86
Original line number Diff line number Diff line
@@ -16,8 +16,10 @@

package android.app.tare;

import android.annotation.Nullable;
import android.annotation.SystemService;
import android.content.Context;
import android.util.Log;

/**
 * Provides access to the resource economy service.
@@ -26,6 +28,69 @@ import android.content.Context;
 */
@SystemService(Context.RESOURCE_ECONOMY_SERVICE)
public class EconomyManager {
    private static final String TAG = "TARE-" + EconomyManager.class.getSimpleName();

    /**
     * 1 ARC = 1 GIGA-CAKE!
     *
     * @hide
     */
    public static final long CAKE_IN_ARC = 1_000_000_000L;

    /** @hide */
    public static long arcToCake(int arcs) {
        return arcs * CAKE_IN_ARC;
    }

    /**
     * Parses a configuration string to get the value in cakes.
     *
     * @hide
     */
    public static long parseCreditValue(@Nullable final String val, final long defaultValCakes) {
        String trunc;
        if (val == null || (trunc = val.trim()).isEmpty()) {
            return defaultValCakes;
        }
        long multiplier;
        if (trunc.endsWith("c")) {
            trunc = trunc.substring(0, trunc.length() - 1);
            multiplier = 1;
        } else if (trunc.endsWith("ck")) {
            trunc = trunc.substring(0, trunc.length() - 2);
            multiplier = 1;
        } else if (trunc.endsWith("A")) {
            trunc = trunc.substring(0, trunc.length() - 1);
            multiplier = CAKE_IN_ARC;
        } else if (trunc.endsWith("ARC")) {
            trunc = trunc.substring(0, trunc.length() - 3);
            multiplier = CAKE_IN_ARC;
        } else {
            // Don't risk using the wrong units
            Log.e(TAG, "Couldn't determine units of credit value: " + val);
            return defaultValCakes;
        }

        // Allow people to shorten notation (eg. Mc for Megacake).
        if (trunc.endsWith("k")) {
            trunc = trunc.substring(0, trunc.length() - 1);
            multiplier *= 1_000;
        } else if (trunc.endsWith("M")) {
            trunc = trunc.substring(0, trunc.length() - 1);
            multiplier *= 1_000_000;
        } else if (trunc.endsWith("G")) {
            trunc = trunc.substring(0, trunc.length() - 1);
            multiplier *= 1_000_000_000;
        }

        try {
            return Long.parseLong(trunc) * multiplier;
        } catch (NumberFormatException e) {
            Log.e(TAG, "Malformed config string: " + val + " to " + trunc, e);
            return defaultValCakes;
        }
    }

    // Keys for AlarmManager TARE factors
    /** @hide */
    public static final String KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED =
@@ -276,179 +341,201 @@ public class EconomyManager {

    // Default values AlarmManager factors
    /** @hide */
    public static final int DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED = 500;
    public static final long DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES = arcToCake(500);
    /** @hide */
    public static final int DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP = 200;
    public static final long DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES =
            arcToCake(256);
    /** @hide */
    public static final int DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP = 160;
    public static final long DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES = arcToCake(160);
    /** @hide */
    public static final int DEFAULT_AM_MAX_SATIATED_BALANCE = 1440;
    public static final long DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES = arcToCake(960);
    /** @hide */
    public static final int DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT = 4000;
    public static final long DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES = arcToCake(2880);
    /** @hide */
    public static final int DEFAULT_AM_HARD_CONSUMPTION_LIMIT = 28_800;
    public static final long DEFAULT_AM_HARD_CONSUMPTION_LIMIT_CAKES = arcToCake(15_000);
    // TODO: add AlarmManager modifier default values
    /** @hide */
    public static final int DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT = 0;
    public static final long DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT_CAKES = arcToCake(0);
    /** @hide */
    public static final float DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING = 0.01f;
    // 10 megacakes = .01 ARC
    public static final long DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING_CAKES = 10_000_000;
    /** @hide */
    public static final int DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX = 500;
    public static final long DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX_CAKES = arcToCake(500);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_NOTIFICATION_SEEN_INSTANT = 3;
    public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES = arcToCake(3);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_NOTIFICATION_SEEN_ONGOING = 0;
    public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES = arcToCake(0);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_NOTIFICATION_SEEN_MAX = 60;
    public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_MAX_CAKES = arcToCake(60);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_INSTANT = 5;
    public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_INSTANT_CAKES =
            arcToCake(5);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_ONGOING = 0;
    public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_ONGOING_CAKES =
            arcToCake(0);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_MAX = 500;
    public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_MAX_CAKES =
            arcToCake(500);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT = 5;
    public static final long DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES =
            arcToCake(5);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING = 0;
    public static final long DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES =
            arcToCake(0);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX = 500;
    public static final long DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES = arcToCake(500);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_WIDGET_INTERACTION_INSTANT = 10;
    public static final long DEFAULT_AM_REWARD_WIDGET_INTERACTION_INSTANT_CAKES = arcToCake(10);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_WIDGET_INTERACTION_ONGOING = 0;
    public static final long DEFAULT_AM_REWARD_WIDGET_INTERACTION_ONGOING_CAKES = arcToCake(0);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_WIDGET_INTERACTION_MAX = 500;
    public static final long DEFAULT_AM_REWARD_WIDGET_INTERACTION_MAX_CAKES = arcToCake(500);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_INSTANT = 10;
    public static final long DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES = arcToCake(10);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_ONGOING = 0;
    public static final long DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES = arcToCake(0);
    /** @hide */
    public static final int DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_MAX = 500;
    public static final long DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_MAX_CAKES = arcToCake(500);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP = 3;
    public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP_CAKES =
            arcToCake(3);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP = 3;
    public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP_CAKES =
            arcToCake(3);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_CTP = 3;
    public static final long DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_CTP_CAKES = arcToCake(3);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP = 3;
    public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP_CAKES = arcToCake(3);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP = 1;
    public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP_CAKES =
            arcToCake(1);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP = 1;
    public static final long DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP_CAKES = arcToCake(1);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP = 1;
    public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP_CAKES =
            arcToCake(1);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP = 1;
    public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP_CAKES = arcToCake(1);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_CTP = 5;
    public static final long DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_CTP_CAKES = arcToCake(5);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE = 5;
    public static final long
            DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(5);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE = 4;
    public static final long
            DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(4);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE = 4;
    public static final long DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(4);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE = 3;
    public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(3);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE = 3;
    public static final long
            DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE_CAKES =
            arcToCake(3);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE = 2;
    public static final long DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE_CAKES =
            arcToCake(2);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE =
            2;
    public static final long
            DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES =
            arcToCake(2);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE = 1;
    public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE_CAKES =
            arcToCake(1);
    /** @hide */
    public static final int DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE = 10;
    public static final long DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE_CAKES = arcToCake(10);

    // Default values JobScheduler factors
    // TODO: add time_since_usage variable to min satiated balance factors
    /** @hide */
    public static final int DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED = 20000;
    public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES = arcToCake(15000);
    /** @hide */
    public static final int DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP = 10000;
    public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES =
            arcToCake(7500);
    /** @hide */
    public static final int DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP = 2000;
    public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES = arcToCake(2000);
    /** @hide */
    public static final int DEFAULT_JS_MAX_SATIATED_BALANCE = 60000;
    public static final long DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES = arcToCake(60000);
    /** @hide */
    public static final int DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT = 100_000;
    public static final long DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES = arcToCake(29_000);
    /** @hide */
    public static final int DEFAULT_JS_HARD_CONSUMPTION_LIMIT = 460_000;
    // TODO: set hard limit based on device type (phone vs tablet vs etc) + battery size
    public static final long DEFAULT_JS_HARD_CONSUMPTION_LIMIT_CAKES = arcToCake(250_000);
    // TODO: add JobScheduler modifier default values
    /** @hide */
    public static final int DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT = 0;
    public static final long DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT_CAKES = arcToCake(0);
    /** @hide */
    public static final float DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING = 0.5f;
    public static final long DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING_CAKES = CAKE_IN_ARC / 2;
    /** @hide */
    public static final int DEFAULT_JS_REWARD_TOP_ACTIVITY_MAX = 15000;
    public static final long DEFAULT_JS_REWARD_TOP_ACTIVITY_MAX_CAKES = arcToCake(15000);
    /** @hide */
    public static final int DEFAULT_JS_REWARD_NOTIFICATION_SEEN_INSTANT = 1;
    public static final long DEFAULT_JS_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES = arcToCake(1);
    /** @hide */
    public static final int DEFAULT_JS_REWARD_NOTIFICATION_SEEN_ONGOING = 0;
    public static final long DEFAULT_JS_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES = arcToCake(0);
    /** @hide */
    public static final int DEFAULT_JS_REWARD_NOTIFICATION_SEEN_MAX = 10;
    public static final long DEFAULT_JS_REWARD_NOTIFICATION_SEEN_MAX_CAKES = arcToCake(10);
    /** @hide */
    public static final int DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT = 5;
    public static final long DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES =
            arcToCake(5);
    /** @hide */
    public static final int DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING = 0;
    public static final long DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES =
            arcToCake(0);
    /** @hide */
    public static final int DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_MAX = 5000;
    public static final long DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES = arcToCake(5000);
    /** @hide */
    public static final int DEFAULT_JS_REWARD_WIDGET_INTERACTION_INSTANT = 10;
    public static final long DEFAULT_JS_REWARD_WIDGET_INTERACTION_INSTANT_CAKES = arcToCake(10);
    /** @hide */
    public static final int DEFAULT_JS_REWARD_WIDGET_INTERACTION_ONGOING = 0;
    public static final long DEFAULT_JS_REWARD_WIDGET_INTERACTION_ONGOING_CAKES = arcToCake(0);
    /** @hide */
    public static final int DEFAULT_JS_REWARD_WIDGET_INTERACTION_MAX = 5000;
    public static final long DEFAULT_JS_REWARD_WIDGET_INTERACTION_MAX_CAKES = arcToCake(5000);
    /** @hide */
    public static final int DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_INSTANT = 10;
    public static final long DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES = arcToCake(10);
    /** @hide */
    public static final int DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_ONGOING = 0;
    public static final long DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES = arcToCake(0);
    /** @hide */
    public static final int DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_MAX = 5000;
    public static final long DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_MAX_CAKES = arcToCake(5000);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_MAX_START_CTP = 3;
    public static final long DEFAULT_JS_ACTION_JOB_MAX_START_CTP_CAKES = arcToCake(3);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_MAX_RUNNING_CTP = 2;
    public static final long DEFAULT_JS_ACTION_JOB_MAX_RUNNING_CTP_CAKES = arcToCake(2);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_HIGH_START_CTP = 3;
    public static final long DEFAULT_JS_ACTION_JOB_HIGH_START_CTP_CAKES = arcToCake(3);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_CTP = 2;
    public static final long DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_CTP_CAKES = arcToCake(2);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_DEFAULT_START_CTP = 3;
    public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_START_CTP_CAKES = arcToCake(3);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_CTP = 2;
    public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_CTP_CAKES = arcToCake(2);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_LOW_START_CTP = 3;
    public static final long DEFAULT_JS_ACTION_JOB_LOW_START_CTP_CAKES = arcToCake(3);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_LOW_RUNNING_CTP = 2;
    public static final long DEFAULT_JS_ACTION_JOB_LOW_RUNNING_CTP_CAKES = arcToCake(2);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_MIN_START_CTP = 3;
    public static final long DEFAULT_JS_ACTION_JOB_MIN_START_CTP_CAKES = arcToCake(3);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_MIN_RUNNING_CTP = 2;
    public static final long DEFAULT_JS_ACTION_JOB_MIN_RUNNING_CTP_CAKES = arcToCake(2);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP = 30;
    public static final long DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP_CAKES = arcToCake(30);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_MAX_START_BASE_PRICE = 10;
    public static final long DEFAULT_JS_ACTION_JOB_MAX_START_BASE_PRICE_CAKES = arcToCake(10);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE = 5;
    public static final long DEFAULT_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE_CAKES = arcToCake(5);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_HIGH_START_BASE_PRICE = 8;
    public static final long DEFAULT_JS_ACTION_JOB_HIGH_START_BASE_PRICE_CAKES = arcToCake(8);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE = 4;
    public static final long DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE_CAKES = arcToCake(4);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE = 6;
    public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE_CAKES = arcToCake(6);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE = 3;
    public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE_CAKES = arcToCake(3);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_LOW_START_BASE_PRICE = 4;
    public static final long DEFAULT_JS_ACTION_JOB_LOW_START_BASE_PRICE_CAKES = arcToCake(4);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE = 2;
    public static final long DEFAULT_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE_CAKES = arcToCake(2);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_MIN_START_BASE_PRICE = 2;
    public static final long DEFAULT_JS_ACTION_JOB_MIN_START_BASE_PRICE_CAKES = arcToCake(2);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE = 1;
    public static final long DEFAULT_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE_CAKES = arcToCake(1);
    /** @hide */
    public static final int DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE = 60;
    public static final long DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE_CAKES = arcToCake(60);
}
+149 −128

File changed.

Preview size limit exceeded, changes collapsed.

+4 −3
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.tare;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.provider.DeviceConfig;
import android.util.ArraySet;
import android.util.IndentingPrintWriter;
import android.util.SparseArray;
@@ -57,10 +58,10 @@ public class CompleteEconomicPolicy extends EconomicPolicy {
    }

    @Override
    void setup() {
        super.setup();
    void setup(@NonNull DeviceConfig.Properties properties) {
        super.setup(properties);
        for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
            mEnabledEconomicPolicies.valueAt(i).setup();
            mEnabledEconomicPolicies.valueAt(i).setup(properties);
        }
        updateMaxBalances();
    }
+21 −1
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.tare;

import static android.app.tare.EconomyManager.parseCreditValue;

import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING;
import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE;
import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE;
@@ -27,7 +29,9 @@ import android.annotation.CallSuper;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.provider.DeviceConfig;
import android.util.IndentingPrintWriter;
import android.util.KeyValueListParser;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -170,7 +174,7 @@ public abstract class EconomicPolicy {
    }

    @CallSuper
    void setup() {
    void setup(@NonNull DeviceConfig.Properties properties) {
        for (int i = 0; i < NUM_COST_MODIFIERS; ++i) {
            final Modifier modifier = COST_MODIFIER_BY_INDEX[i];
            if (modifier != null) {
@@ -409,6 +413,22 @@ public abstract class EconomicPolicy {
        return "UNKNOWN_REWARD:" + Integer.toHexString(eventId);
    }

    protected long getConstantAsCake(@NonNull KeyValueListParser parser,
            @Nullable DeviceConfig.Properties properties, String key, long defaultValCake) {
        // Don't cross the streams! Mixing Settings/local user config changes with DeviceConfig
        // config can cause issues since the scales may be different, so use one or the other.
        if (parser.size() > 0) {
            // User settings take precedence. Just stick with the Settings constants, even if there
            // are invalid values. It's not worth the time to evaluate all the key/value pairs to
            // make sure there are valid ones before deciding.
            return parseCreditValue(parser.getString(key, null), defaultValCake);
        }
        if (properties != null) {
            return parseCreditValue(properties.getString(key, null), defaultValCake);
        }
        return defaultValCake;
    }

    protected static void dumpActiveModifiers(IndentingPrintWriter pw) {
        for (int i = 0; i < NUM_COST_MODIFIERS; ++i) {
            pw.print("Modifier ");
+17 −3
Original line number Diff line number Diff line
@@ -731,7 +731,7 @@ public class InternalResourceService extends SystemService {
            registerListeners();
            mCurrentBatteryLevel = getCurrentBatteryLevel();
            mHandler.post(this::setupHeavyWork);
            mCompleteEconomicPolicy.setup();
            mCompleteEconomicPolicy.setup(mConfigObserver.getAllDeviceConfigProperties());
        }
    }

@@ -1014,10 +1014,17 @@ public class InternalResourceService extends SystemService {
                    Settings.Global.getUriFor(TARE_ALARM_MANAGER_CONSTANTS), false, this);
            mContentResolver.registerContentObserver(
                    Settings.Global.getUriFor(TARE_JOB_SCHEDULER_CONSTANTS), false, this);
            onPropertiesChanged(DeviceConfig.getProperties(DeviceConfig.NAMESPACE_TARE));
            onPropertiesChanged(getAllDeviceConfigProperties());
            updateEnabledStatus();
        }

        @NonNull
        DeviceConfig.Properties getAllDeviceConfigProperties() {
            // Don't want to cache the Properties object locally in case it ends up being large,
            // especially since it'll only be used once/infrequently (during setup or on a change).
            return DeviceConfig.getProperties(DeviceConfig.NAMESPACE_TARE);
        }

        @Override
        public void onChange(boolean selfChange, Uri uri) {
            if (uri.equals(Settings.Global.getUriFor(Settings.Global.ENABLE_TARE))) {
@@ -1030,6 +1037,7 @@ public class InternalResourceService extends SystemService {

        @Override
        public void onPropertiesChanged(DeviceConfig.Properties properties) {
            boolean economicPolicyUpdated = false;
            synchronized (mLock) {
                for (String name : properties.getKeyset()) {
                    if (name == null) {
@@ -1039,6 +1047,12 @@ public class InternalResourceService extends SystemService {
                        case KEY_DC_ENABLE_TARE:
                            updateEnabledStatus();
                            break;
                        default:
                            if (!economicPolicyUpdated
                                    && (name.startsWith("am") || name.startsWith("js"))) {
                                updateEconomicPolicy();
                                economicPolicyUpdated = true;
                            }
                    }
                }
            }
@@ -1072,7 +1086,7 @@ public class InternalResourceService extends SystemService {
                mCompleteEconomicPolicy.tearDown();
                mCompleteEconomicPolicy = new CompleteEconomicPolicy(InternalResourceService.this);
                if (mIsEnabled && mBootPhase >= PHASE_SYSTEM_SERVICES_READY) {
                    mCompleteEconomicPolicy.setup();
                    mCompleteEconomicPolicy.setup(getAllDeviceConfigProperties());
                    if (initialLimit != mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit()
                            || hardLimit
                            != mCompleteEconomicPolicy.getHardSatiatedConsumptionLimit()) {
Loading