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