1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.app.tare; 18 19 import android.annotation.IntDef; 20 import android.annotation.Nullable; 21 import android.annotation.SystemService; 22 import android.annotation.TestApi; 23 import android.content.Context; 24 import android.os.RemoteException; 25 import android.util.Log; 26 27 import java.lang.annotation.Retention; 28 import java.lang.annotation.RetentionPolicy; 29 30 /** 31 * Provides access to the resource economy service. 32 * 33 * @hide 34 */ 35 @TestApi 36 @SystemService(Context.RESOURCE_ECONOMY_SERVICE) 37 public class EconomyManager { 38 private static final String TAG = "TARE-" + EconomyManager.class.getSimpleName(); 39 40 /** 41 * 1 ARC = 1 GIGA-CAKE! 42 * 43 * @hide 44 */ 45 public static final long CAKE_IN_ARC = 1_000_000_000L; 46 47 /** @hide */ arcToCake(int arcs)48 public static long arcToCake(int arcs) { 49 return arcs * CAKE_IN_ARC; 50 } 51 52 /** 53 * Parses a configuration string to get the value in cakes. 54 * 55 * @hide 56 */ parseCreditValue(@ullable final String val, final long defaultValCakes)57 public static long parseCreditValue(@Nullable final String val, final long defaultValCakes) { 58 String trunc; 59 if (val == null || (trunc = val.trim()).isEmpty()) { 60 return defaultValCakes; 61 } 62 long multiplier; 63 if (trunc.endsWith("c")) { 64 trunc = trunc.substring(0, trunc.length() - 1); 65 multiplier = 1; 66 } else if (trunc.endsWith("ck")) { 67 trunc = trunc.substring(0, trunc.length() - 2); 68 multiplier = 1; 69 } else if (trunc.endsWith("A")) { 70 trunc = trunc.substring(0, trunc.length() - 1); 71 multiplier = CAKE_IN_ARC; 72 } else if (trunc.endsWith("ARC")) { 73 trunc = trunc.substring(0, trunc.length() - 3); 74 multiplier = CAKE_IN_ARC; 75 } else { 76 // Don't risk using the wrong units 77 Log.e(TAG, "Couldn't determine units of credit value: " + val); 78 return defaultValCakes; 79 } 80 81 // Allow people to shorten notation (eg. Mc for Megacake). 82 if (trunc.endsWith("k")) { 83 trunc = trunc.substring(0, trunc.length() - 1); 84 multiplier *= 1_000; 85 } else if (trunc.endsWith("M")) { 86 trunc = trunc.substring(0, trunc.length() - 1); 87 multiplier *= 1_000_000; 88 } else if (trunc.endsWith("G")) { 89 trunc = trunc.substring(0, trunc.length() - 1); 90 multiplier *= 1_000_000_000; 91 } 92 93 try { 94 return Long.parseLong(trunc) * multiplier; 95 } catch (NumberFormatException e) { 96 Log.e(TAG, "Malformed config string: " + val + " to " + trunc, e); 97 return defaultValCakes; 98 } 99 } 100 101 /** @hide */ 102 @TestApi 103 public static final int ENABLED_MODE_OFF = 0; 104 /** @hide */ 105 public static final int ENABLED_MODE_ON = 1; 106 /** 107 * Go through the motions, tracking events, updating balances and other TARE state values, 108 * but don't use TARE to affect actual device behavior. 109 * @hide 110 */ 111 @TestApi 112 public static final int ENABLED_MODE_SHADOW = 2; 113 114 /** @hide */ 115 @IntDef(prefix = {"ENABLED_MODE_"}, value = { 116 ENABLED_MODE_OFF, 117 ENABLED_MODE_ON, 118 ENABLED_MODE_SHADOW, 119 }) 120 @Retention(RetentionPolicy.SOURCE) 121 public @interface EnabledMode { 122 } 123 124 /** @hide */ enabledModeToString(@nabledMode int mode)125 public static String enabledModeToString(@EnabledMode int mode) { 126 switch (mode) { 127 case ENABLED_MODE_OFF: return "ENABLED_MODE_OFF"; 128 case ENABLED_MODE_ON: return "ENABLED_MODE_ON"; 129 case ENABLED_MODE_SHADOW: return "ENABLED_MODE_SHADOW"; 130 default: return "ENABLED_MODE_" + mode; 131 } 132 } 133 134 /** @hide */ 135 @TestApi 136 public static final String KEY_ENABLE_TARE_MODE = "enable_tare_mode"; 137 /** @hide */ 138 public static final String KEY_ENABLE_POLICY_ALARM = "enable_policy_alarm"; 139 /** @hide */ 140 public static final String KEY_ENABLE_POLICY_JOB_SCHEDULER = "enable_policy_job"; 141 /** @hide */ 142 public static final int DEFAULT_ENABLE_TARE_MODE = ENABLED_MODE_OFF; 143 /** @hide */ 144 public static final boolean DEFAULT_ENABLE_POLICY_ALARM = true; 145 /** @hide */ 146 public static final boolean DEFAULT_ENABLE_POLICY_JOB_SCHEDULER = true; 147 148 // Keys for AlarmManager TARE factors 149 /** @hide */ 150 public static final String KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED = 151 "am_min_satiated_balance_exempted"; 152 /** @hide */ 153 public static final String KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP = 154 "am_min_satiated_balance_headless_system_app"; 155 /** @hide */ 156 public static final String KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP = 157 "am_min_satiated_balance_other_app"; 158 /** @hide */ 159 public static final String KEY_AM_MAX_SATIATED_BALANCE = "am_max_satiated_balance"; 160 /** @hide */ 161 public static final String KEY_AM_INITIAL_CONSUMPTION_LIMIT = "am_initial_consumption_limit"; 162 /** @hide */ 163 public static final String KEY_AM_MIN_CONSUMPTION_LIMIT = "am_minimum_consumption_limit"; 164 /** @hide */ 165 public static final String KEY_AM_MAX_CONSUMPTION_LIMIT = "am_maximum_consumption_limit"; 166 // TODO: Add AlarmManager modifier keys 167 /** @hide */ 168 public static final String KEY_AM_REWARD_TOP_ACTIVITY_INSTANT = 169 "am_reward_top_activity_instant"; 170 /** @hide */ 171 public static final String KEY_AM_REWARD_TOP_ACTIVITY_ONGOING = 172 "am_reward_top_activity_ongoing"; 173 /** @hide */ 174 public static final String KEY_AM_REWARD_TOP_ACTIVITY_MAX = "am_reward_top_activity_max"; 175 /** @hide */ 176 public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_INSTANT = 177 "am_reward_notification_seen_instant"; 178 /** @hide */ 179 public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_ONGOING = 180 "am_reward_notification_seen_ongoing"; 181 /** @hide */ 182 public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_MAX = 183 "am_reward_notification_seen_max"; 184 /** @hide */ 185 public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_INSTANT = 186 "am_reward_notification_seen_within_15_instant"; 187 /** @hide */ 188 public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_ONGOING = 189 "am_reward_notification_seen_within_15_ongoing"; 190 /** @hide */ 191 public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_MAX = 192 "am_reward_notification_seen_within_15_max"; 193 /** @hide */ 194 public static final String KEY_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT = 195 "am_reward_notification_interaction_instant"; 196 /** @hide */ 197 public static final String KEY_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING = 198 "am_reward_notification_interaction_ongoing"; 199 /** @hide */ 200 public static final String KEY_AM_REWARD_NOTIFICATION_INTERACTION_MAX = 201 "am_reward_notification_interaction_max"; 202 /** @hide */ 203 public static final String KEY_AM_REWARD_WIDGET_INTERACTION_INSTANT = 204 "am_reward_widget_interaction_instant"; 205 /** @hide */ 206 public static final String KEY_AM_REWARD_WIDGET_INTERACTION_ONGOING = 207 "am_reward_widget_interaction_ongoing"; 208 /** @hide */ 209 public static final String KEY_AM_REWARD_WIDGET_INTERACTION_MAX = 210 "am_reward_widget_interaction_max"; 211 /** @hide */ 212 public static final String KEY_AM_REWARD_OTHER_USER_INTERACTION_INSTANT = 213 "am_reward_other_user_interaction_instant"; 214 /** @hide */ 215 public static final String KEY_AM_REWARD_OTHER_USER_INTERACTION_ONGOING = 216 "am_reward_other_user_interaction_ongoing"; 217 /** @hide */ 218 public static final String KEY_AM_REWARD_OTHER_USER_INTERACTION_MAX = 219 "am_reward_other_user_interaction_max"; 220 /** @hide */ 221 public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP = 222 "am_action_alarm_allow_while_idle_exact_wakeup_ctp"; 223 /** @hide */ 224 public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP = 225 "am_action_alarm_allow_while_idle_inexact_wakeup_ctp"; 226 /** @hide */ 227 public static final String KEY_AM_ACTION_ALARM_EXACT_WAKEUP_CTP = 228 "am_action_alarm_exact_wakeup_ctp"; 229 /** @hide */ 230 public static final String KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP = 231 "am_action_alarm_inexact_wakeup_ctp"; 232 /** @hide */ 233 public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP = 234 "am_action_alarm_allow_while_idle_exact_nonwakeup_ctp"; 235 /** @hide */ 236 public static final String KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP = 237 "am_action_alarm_exact_nonwakeup_ctp"; 238 /** @hide */ 239 public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP = 240 "am_action_alarm_allow_while_idle_inexact_nonwakeup_ctp"; 241 /** @hide */ 242 public static final String KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP = 243 "am_action_alarm_inexact_nonwakeup_ctp"; 244 /** @hide */ 245 public static final String KEY_AM_ACTION_ALARM_ALARMCLOCK_CTP = 246 "am_action_alarm_alarmclock_ctp"; 247 /** @hide */ 248 public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE = 249 "am_action_alarm_allow_while_idle_exact_wakeup_base_price"; 250 /** @hide */ 251 public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE = 252 "am_action_alarm_allow_while_idle_inexact_wakeup_base_price"; 253 /** @hide */ 254 public static final String KEY_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE = 255 "am_action_alarm_exact_wakeup_base_price"; 256 /** @hide */ 257 public static final String KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE = 258 "am_action_alarm_inexact_wakeup_base_price"; 259 /** @hide */ 260 public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE = 261 "am_action_alarm_allow_while_idle_exact_nonwakeup_base_price"; 262 /** @hide */ 263 public static final String KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE = 264 "am_action_alarm_exact_nonwakeup_base_price"; 265 /** @hide */ 266 public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE = 267 "am_action_alarm_allow_while_idle_inexact_nonwakeup_base_price"; 268 /** @hide */ 269 public static final String KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE = 270 "am_action_alarm_inexact_nonwakeup_base_price"; 271 /** @hide */ 272 public static final String KEY_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE = 273 "am_action_alarm_alarmclock_base_price"; 274 275 // Keys for JobScheduler TARE factors 276 /** @hide */ 277 public static final String KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED = 278 "js_min_satiated_balance_exempted"; 279 /** @hide */ 280 public static final String KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP = 281 "js_min_satiated_balance_headless_system_app"; 282 /** @hide */ 283 public static final String KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP = 284 "js_min_satiated_balance_other_app"; 285 /** @hide */ 286 public static final String KEY_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER = 287 "js_min_satiated_balance_increment_updater"; 288 /** @hide */ 289 public static final String KEY_JS_MAX_SATIATED_BALANCE = 290 "js_max_satiated_balance"; 291 /** @hide */ 292 public static final String KEY_JS_INITIAL_CONSUMPTION_LIMIT = "js_initial_consumption_limit"; 293 /** @hide */ 294 public static final String KEY_JS_MIN_CONSUMPTION_LIMIT = "js_minimum_consumption_limit"; 295 /** @hide */ 296 public static final String KEY_JS_MAX_CONSUMPTION_LIMIT = "js_maximum_consumption_limit"; 297 // TODO: Add JobScheduler modifier keys 298 /** @hide */ 299 public static final String KEY_JS_REWARD_APP_INSTALL_INSTANT = 300 "js_reward_app_install_instant"; 301 /** @hide */ 302 public static final String KEY_JS_REWARD_APP_INSTALL_ONGOING = 303 "js_reward_app_install_ongoing"; 304 /** @hide */ 305 public static final String KEY_JS_REWARD_APP_INSTALL_MAX = 306 "js_reward_app_install_max"; 307 /** @hide */ 308 public static final String KEY_JS_REWARD_TOP_ACTIVITY_INSTANT = 309 "js_reward_top_activity_instant"; 310 /** @hide */ 311 public static final String KEY_JS_REWARD_TOP_ACTIVITY_ONGOING = 312 "js_reward_top_activity_ongoing"; 313 /** @hide */ 314 public static final String KEY_JS_REWARD_TOP_ACTIVITY_MAX = 315 "js_reward_top_activity_max"; 316 /** @hide */ 317 public static final String KEY_JS_REWARD_NOTIFICATION_SEEN_INSTANT = 318 "js_reward_notification_seen_instant"; 319 /** @hide */ 320 public static final String KEY_JS_REWARD_NOTIFICATION_SEEN_ONGOING = 321 "js_reward_notification_seen_ongoing"; 322 /** @hide */ 323 public static final String KEY_JS_REWARD_NOTIFICATION_SEEN_MAX = 324 "js_reward_notification_seen_max"; 325 /** @hide */ 326 public static final String KEY_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT = 327 "js_reward_notification_interaction_instant"; 328 /** @hide */ 329 public static final String KEY_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING = 330 "js_reward_notification_interaction_ongoing"; 331 /** @hide */ 332 public static final String KEY_JS_REWARD_NOTIFICATION_INTERACTION_MAX = 333 "js_reward_notification_interaction_max"; 334 /** @hide */ 335 public static final String KEY_JS_REWARD_WIDGET_INTERACTION_INSTANT = 336 "js_reward_widget_interaction_instant"; 337 /** @hide */ 338 public static final String KEY_JS_REWARD_WIDGET_INTERACTION_ONGOING = 339 "js_reward_widget_interaction_ongoing"; 340 /** @hide */ 341 public static final String KEY_JS_REWARD_WIDGET_INTERACTION_MAX = 342 "js_reward_widget_interaction_max"; 343 /** @hide */ 344 public static final String KEY_JS_REWARD_OTHER_USER_INTERACTION_INSTANT = 345 "js_reward_other_user_interaction_instant"; 346 /** @hide */ 347 public static final String KEY_JS_REWARD_OTHER_USER_INTERACTION_ONGOING = 348 "js_reward_other_user_interaction_ongoing"; 349 /** @hide */ 350 public static final String KEY_JS_REWARD_OTHER_USER_INTERACTION_MAX = 351 "js_reward_other_user_interaction_max"; 352 /** @hide */ 353 public static final String KEY_JS_ACTION_JOB_MAX_START_CTP = "js_action_job_max_start_ctp"; 354 /** @hide */ 355 public static final String KEY_JS_ACTION_JOB_MAX_RUNNING_CTP = "js_action_job_max_running_ctp"; 356 /** @hide */ 357 public static final String KEY_JS_ACTION_JOB_HIGH_START_CTP = "js_action_job_high_start_ctp"; 358 /** @hide */ 359 public static final String KEY_JS_ACTION_JOB_HIGH_RUNNING_CTP = 360 "js_action_job_high_running_ctp"; 361 /** @hide */ 362 public static final String KEY_JS_ACTION_JOB_DEFAULT_START_CTP = 363 "js_action_job_default_start_ctp"; 364 /** @hide */ 365 public static final String KEY_JS_ACTION_JOB_DEFAULT_RUNNING_CTP = 366 "js_action_job_default_running_ctp"; 367 /** @hide */ 368 public static final String KEY_JS_ACTION_JOB_LOW_START_CTP = "js_action_job_low_start_ctp"; 369 /** @hide */ 370 public static final String KEY_JS_ACTION_JOB_LOW_RUNNING_CTP = "js_action_job_low_running_ctp"; 371 /** @hide */ 372 public static final String KEY_JS_ACTION_JOB_MIN_START_CTP = "js_action_job_min_start_ctp"; 373 /** @hide */ 374 public static final String KEY_JS_ACTION_JOB_MIN_RUNNING_CTP = "js_action_job_min_running_ctp"; 375 /** @hide */ 376 public static final String KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP = 377 "js_action_job_timeout_penalty_ctp"; 378 /** @hide */ 379 public static final String KEY_JS_ACTION_JOB_MAX_START_BASE_PRICE = 380 "js_action_job_max_start_base_price"; 381 /** @hide */ 382 public static final String KEY_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE = 383 "js_action_job_max_running_base_price"; 384 /** @hide */ 385 public static final String KEY_JS_ACTION_JOB_HIGH_START_BASE_PRICE = 386 "js_action_job_high_start_base_price"; 387 /** @hide */ 388 public static final String KEY_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE = 389 "js_action_job_high_running_base_price"; 390 /** @hide */ 391 public static final String KEY_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE = 392 "js_action_job_default_start_base_price"; 393 /** @hide */ 394 public static final String KEY_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE = 395 "js_action_job_default_running_base_price"; 396 /** @hide */ 397 public static final String KEY_JS_ACTION_JOB_LOW_START_BASE_PRICE = 398 "js_action_job_low_start_base_price"; 399 /** @hide */ 400 public static final String KEY_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE = 401 "js_action_job_low_running_base_price"; 402 /** @hide */ 403 public static final String KEY_JS_ACTION_JOB_MIN_START_BASE_PRICE = 404 "js_action_job_min_start_base_price"; 405 /** @hide */ 406 public static final String KEY_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE = 407 "js_action_job_min_running_base_price"; 408 /** @hide */ 409 public static final String KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE = 410 "js_action_job_timeout_penalty_base_price"; 411 412 // Default values AlarmManager factors 413 /** @hide */ 414 public static final long DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES = arcToCake(500); 415 /** @hide */ 416 public static final long DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES = 417 arcToCake(256); 418 /** @hide */ 419 public static final long DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES = arcToCake(160); 420 /** @hide */ 421 public static final long DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES = arcToCake(960); 422 /** @hide */ 423 public static final long DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES = arcToCake(2880); 424 /** @hide */ 425 public static final long DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES = arcToCake(1440); 426 /** @hide */ 427 public static final long DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES = arcToCake(15_000); 428 // TODO: add AlarmManager modifier default values 429 /** @hide */ 430 public static final long DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT_CAKES = arcToCake(0); 431 /** @hide */ 432 // 10 megacakes = .01 ARC 433 public static final long DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING_CAKES = 10_000_000; 434 /** @hide */ 435 public static final long DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX_CAKES = arcToCake(500); 436 /** @hide */ 437 public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES = arcToCake(3); 438 /** @hide */ 439 public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES = arcToCake(0); 440 /** @hide */ 441 public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_MAX_CAKES = arcToCake(60); 442 /** @hide */ 443 public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_INSTANT_CAKES = 444 arcToCake(5); 445 /** @hide */ 446 public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_ONGOING_CAKES = 447 arcToCake(0); 448 /** @hide */ 449 public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_MAX_CAKES = 450 arcToCake(500); 451 /** @hide */ 452 public static final long DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES = 453 arcToCake(5); 454 /** @hide */ 455 public static final long DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES = 456 arcToCake(0); 457 /** @hide */ 458 public static final long DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES = arcToCake(500); 459 /** @hide */ 460 public static final long DEFAULT_AM_REWARD_WIDGET_INTERACTION_INSTANT_CAKES = arcToCake(10); 461 /** @hide */ 462 public static final long DEFAULT_AM_REWARD_WIDGET_INTERACTION_ONGOING_CAKES = arcToCake(0); 463 /** @hide */ 464 public static final long DEFAULT_AM_REWARD_WIDGET_INTERACTION_MAX_CAKES = arcToCake(500); 465 /** @hide */ 466 public static final long DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES = arcToCake(10); 467 /** @hide */ 468 public static final long DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES = arcToCake(0); 469 /** @hide */ 470 public static final long DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_MAX_CAKES = arcToCake(500); 471 /** @hide */ 472 public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP_CAKES = 473 arcToCake(3); 474 /** @hide */ 475 public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP_CAKES = 476 arcToCake(3); 477 /** @hide */ 478 public static final long DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_CTP_CAKES = arcToCake(3); 479 /** @hide */ 480 public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP_CAKES = arcToCake(3); 481 /** @hide */ 482 public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP_CAKES = 483 arcToCake(1); 484 /** @hide */ 485 public static final long DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP_CAKES = arcToCake(1); 486 /** @hide */ 487 public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP_CAKES = 488 arcToCake(1); 489 /** @hide */ 490 public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP_CAKES = arcToCake(1); 491 /** @hide */ 492 public static final long DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_CTP_CAKES = arcToCake(5); 493 /** @hide */ 494 public static final long 495 DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(5); 496 /** @hide */ 497 public static final long 498 DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(4); 499 /** @hide */ 500 public static final long DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(4); 501 /** @hide */ 502 public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(3); 503 /** @hide */ 504 public static final long 505 DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE_CAKES = 506 arcToCake(3); 507 /** @hide */ 508 public static final long DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE_CAKES = 509 arcToCake(2); 510 /** @hide */ 511 public static final long 512 DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES = 513 arcToCake(2); 514 /** @hide */ 515 public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE_CAKES = 516 arcToCake(1); 517 /** @hide */ 518 public static final long DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE_CAKES = arcToCake(10); 519 520 // Default values JobScheduler factors 521 // TODO: add time_since_usage variable to min satiated balance factors 522 /** @hide */ 523 public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES = arcToCake(15000); 524 /** @hide */ 525 public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES = 526 arcToCake(7500); 527 /** @hide */ 528 public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES = arcToCake(2000); 529 /** @hide */ 530 public static final long DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES = arcToCake(60000); 531 /** @hide */ 532 public static final long DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES = arcToCake(29_000); 533 /** @hide */ 534 public static final long DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES = arcToCake(17_000); 535 /** @hide */ 536 // TODO: set maximum limit based on device type (phone vs tablet vs etc) + battery size 537 public static final long DEFAULT_JS_MAX_CONSUMPTION_LIMIT_CAKES = arcToCake(250_000); 538 // TODO: add JobScheduler modifier default values 539 /** @hide */ 540 public static final long DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES = arcToCake(408); 541 /** @hide */ 542 public static final long DEFAULT_JS_REWARD_APP_INSTALL_ONGOING_CAKES = arcToCake(0); 543 /** @hide */ 544 public static final long DEFAULT_JS_REWARD_APP_INSTALL_MAX_CAKES = arcToCake(4000); 545 /** @hide */ 546 public static final long DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT_CAKES = arcToCake(0); 547 /** @hide */ 548 public static final long DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING_CAKES = CAKE_IN_ARC / 2; 549 /** @hide */ 550 public static final long DEFAULT_JS_REWARD_TOP_ACTIVITY_MAX_CAKES = arcToCake(15000); 551 /** @hide */ 552 public static final long DEFAULT_JS_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES = arcToCake(1); 553 /** @hide */ 554 public static final long DEFAULT_JS_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES = arcToCake(0); 555 /** @hide */ 556 public static final long DEFAULT_JS_REWARD_NOTIFICATION_SEEN_MAX_CAKES = arcToCake(10); 557 /** @hide */ 558 public static final long DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES = 559 arcToCake(5); 560 /** @hide */ 561 public static final long DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES = 562 arcToCake(0); 563 /** @hide */ 564 public static final long DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES = arcToCake(5000); 565 /** @hide */ 566 public static final long DEFAULT_JS_REWARD_WIDGET_INTERACTION_INSTANT_CAKES = arcToCake(10); 567 /** @hide */ 568 public static final long DEFAULT_JS_REWARD_WIDGET_INTERACTION_ONGOING_CAKES = arcToCake(0); 569 /** @hide */ 570 public static final long DEFAULT_JS_REWARD_WIDGET_INTERACTION_MAX_CAKES = arcToCake(5000); 571 /** @hide */ 572 public static final long DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES = arcToCake(10); 573 /** @hide */ 574 public static final long DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES = arcToCake(0); 575 /** @hide */ 576 public static final long DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_MAX_CAKES = arcToCake(5000); 577 /** 578 * How many credits to increase the updating app's min satiated balance by for each app that it 579 * is responsible for updating. 580 * @hide 581 */ 582 public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER_CAKES = 583 // Research indicates that the median time between popular app updates is 13-14 days, 584 // so adjust by 14 to amortize over that time. 585 DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES / 14; 586 /** @hide */ 587 public static final long DEFAULT_JS_ACTION_JOB_MAX_START_CTP_CAKES = arcToCake(3); 588 /** @hide */ 589 public static final long DEFAULT_JS_ACTION_JOB_MAX_RUNNING_CTP_CAKES = arcToCake(2); 590 /** @hide */ 591 public static final long DEFAULT_JS_ACTION_JOB_HIGH_START_CTP_CAKES = arcToCake(3); 592 /** @hide */ 593 public static final long DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_CTP_CAKES = arcToCake(2); 594 /** @hide */ 595 public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_START_CTP_CAKES = arcToCake(3); 596 /** @hide */ 597 public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_CTP_CAKES = arcToCake(2); 598 /** @hide */ 599 public static final long DEFAULT_JS_ACTION_JOB_LOW_START_CTP_CAKES = arcToCake(3); 600 /** @hide */ 601 public static final long DEFAULT_JS_ACTION_JOB_LOW_RUNNING_CTP_CAKES = arcToCake(2); 602 /** @hide */ 603 public static final long DEFAULT_JS_ACTION_JOB_MIN_START_CTP_CAKES = arcToCake(3); 604 /** @hide */ 605 public static final long DEFAULT_JS_ACTION_JOB_MIN_RUNNING_CTP_CAKES = arcToCake(2); 606 /** @hide */ 607 public static final long DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP_CAKES = arcToCake(30); 608 /** @hide */ 609 public static final long DEFAULT_JS_ACTION_JOB_MAX_START_BASE_PRICE_CAKES = arcToCake(10); 610 /** @hide */ 611 public static final long DEFAULT_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE_CAKES = arcToCake(5); 612 /** @hide */ 613 public static final long DEFAULT_JS_ACTION_JOB_HIGH_START_BASE_PRICE_CAKES = arcToCake(8); 614 /** @hide */ 615 public static final long DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE_CAKES = arcToCake(4); 616 /** @hide */ 617 public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE_CAKES = arcToCake(6); 618 /** @hide */ 619 public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE_CAKES = arcToCake(3); 620 /** @hide */ 621 public static final long DEFAULT_JS_ACTION_JOB_LOW_START_BASE_PRICE_CAKES = arcToCake(4); 622 /** @hide */ 623 public static final long DEFAULT_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE_CAKES = arcToCake(2); 624 /** @hide */ 625 public static final long DEFAULT_JS_ACTION_JOB_MIN_START_BASE_PRICE_CAKES = arcToCake(2); 626 /** @hide */ 627 public static final long DEFAULT_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE_CAKES = arcToCake(1); 628 /** @hide */ 629 public static final long DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE_CAKES = arcToCake(60); 630 631 //////// APIs below //////// 632 633 private final IEconomyManager mService; 634 635 /** @hide */ EconomyManager(IEconomyManager service)636 public EconomyManager(IEconomyManager service) { 637 mService = service; 638 } 639 640 /** 641 * Returns the current enabled status of TARE. 642 * @hide 643 */ 644 @EnabledMode 645 @TestApi getEnabledMode()646 public int getEnabledMode() { 647 try { 648 return mService.getEnabledMode(); 649 } catch (RemoteException e) { 650 throw e.rethrowFromSystemServer(); 651 } 652 } 653 } 654