Loading apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java +173 −86 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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 = Loading Loading @@ -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); } apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java +149 −128 File changed.Preview size limit exceeded, changes collapsed. Show changes apex/jobscheduler/service/java/com/android/server/tare/CompleteEconomicPolicy.java +4 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } Loading apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java +21 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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 "); Loading apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java +17 −3 Original line number Diff line number Diff line Loading @@ -731,7 +731,7 @@ public class InternalResourceService extends SystemService { registerListeners(); mCurrentBatteryLevel = getCurrentBatteryLevel(); mHandler.post(this::setupHeavyWork); mCompleteEconomicPolicy.setup(); mCompleteEconomicPolicy.setup(mConfigObserver.getAllDeviceConfigProperties()); } } Loading Loading @@ -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))) { Loading @@ -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) { Loading @@ -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; } } } } Loading Loading @@ -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 Loading
apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java +173 −86 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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 = Loading Loading @@ -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); }
apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java +149 −128 File changed.Preview size limit exceeded, changes collapsed. Show changes
apex/jobscheduler/service/java/com/android/server/tare/CompleteEconomicPolicy.java +4 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } Loading
apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java +21 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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 "); Loading
apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java +17 −3 Original line number Diff line number Diff line Loading @@ -731,7 +731,7 @@ public class InternalResourceService extends SystemService { registerListeners(); mCurrentBatteryLevel = getCurrentBatteryLevel(); mHandler.post(this::setupHeavyWork); mCompleteEconomicPolicy.setup(); mCompleteEconomicPolicy.setup(mConfigObserver.getAllDeviceConfigProperties()); } } Loading Loading @@ -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))) { Loading @@ -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) { Loading @@ -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; } } } } Loading Loading @@ -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