From c55d812c87738d68012d58bf042245e0ec71c5df Mon Sep 17 00:00:00 2001 From: alinasuarez Date: Mon, 9 Aug 2021 17:21:39 +0000 Subject: [PATCH] Listener on system side & Return correct values A listener is needed on the system side to make sure the CompleteEconomicPolicy class is updated when any factor in the JobSchedulerEconomicPolicy or AlarmManagerEconomicPolicy is updated by the user. Both economic policy classes should also return the correct values for their factors: the value inputted by the user or the default value if the user has not put in a new value. Bug: 196083166 Test: Visually check output of 'adb shell dumpsys tare' Change-Id: I0dbef4cb23fcfefeeee444bdca26015840270d3e --- .../java/android/app/tare/EconomyManager.java | 4 +- .../tare/AlarmManagerEconomicPolicy.java | 275 +++++++++++++++-- .../server/tare/CompleteEconomicPolicy.java | 8 + .../tare/JobSchedulerEconomicPolicy.java | 281 +++++++++++++++--- 4 files changed, 499 insertions(+), 69 deletions(-) diff --git a/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java b/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java index 4053bddd7883f..8c8d2bfe16e3f 100644 --- a/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java +++ b/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java @@ -285,7 +285,7 @@ public class EconomyManager { /** @hide */ public static final int DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT = 0; /** @hide */ - public static final double DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING = 0.01; + public static final float DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING = 0.01f; /** @hide */ public static final int DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX = 500; /** @hide */ @@ -372,7 +372,7 @@ public class EconomyManager { /** @hide */ public static final int DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT = 0; /** @hide */ - public static final double DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING = 0.5; + public static final float DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING = 0.5f; /** @hide */ public static final int DEFAULT_JS_REWARD_TOP_ACTIVITY_MAX = 15000; /** @hide */ diff --git a/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java index acdf6898b3cc9..6ef945684f76c 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java @@ -16,6 +16,79 @@ package com.android.server.tare; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_CTP; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_CTP; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP; +import static android.app.tare.EconomyManager.DEFAULT_AM_MAX_CIRCULATION; +import static android.app.tare.EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE; +import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_SEEN_INSTANT; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_SEEN_MAX; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_SEEN_ONGOING; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_INSTANT; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_MAX; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_ONGOING; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_WIDGET_INTERACTION_INSTANT; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_WIDGET_INTERACTION_MAX; +import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_WIDGET_INTERACTION_ONGOING; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALARMCLOCK_CTP; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_WAKEUP_CTP; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP; +import static android.app.tare.EconomyManager.KEY_AM_MAX_CIRCULATION; +import static android.app.tare.EconomyManager.KEY_AM_MAX_SATIATED_BALANCE; +import static android.app.tare.EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_INTERACTION_MAX; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_SEEN_INSTANT; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_SEEN_MAX; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_SEEN_ONGOING; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_OTHER_USER_INTERACTION_INSTANT; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_OTHER_USER_INTERACTION_MAX; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_OTHER_USER_INTERACTION_ONGOING; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_TOP_ACTIVITY_INSTANT; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_TOP_ACTIVITY_MAX; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_TOP_ACTIVITY_ONGOING; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_WIDGET_INTERACTION_INSTANT; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_WIDGET_INTERACTION_MAX; +import static android.app.tare.EconomyManager.KEY_AM_REWARD_WIDGET_INTERACTION_ONGOING; +import static android.provider.Settings.Global.TARE_ALARM_MANAGER_CONSTANTS; + 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; @@ -24,6 +97,13 @@ import static com.android.server.tare.TareUtils.arcToNarc; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.ContentResolver; +import android.database.ContentObserver; +import android.os.Handler; +import android.os.UserHandle; +import android.provider.Settings; +import android.util.KeyValueListParser; +import android.util.Slog; import android.util.SparseArray; /** @@ -31,6 +111,8 @@ import android.util.SparseArray; * AlarmManager. */ public class AlarmManagerEconomicPolicy extends EconomicPolicy { + private static final String TAG = "TARE- " + AlarmManagerEconomicPolicy.class.getSimpleName(); + public static final int ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE = TYPE_ACTION | POLICY_AM | 0; public static final int ACTION_ALARM_WAKEUP_EXACT = @@ -57,30 +139,50 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy { COST_MODIFIER_PROCESS_STATE }; + private long mMinSatiatedBalance; + private long mMaxSatiatedBalance; + private long mMaxSatiatedCirculation; + + private final KeyValueListParser mParser = new KeyValueListParser(','); + private final SettingsObserver mSettingsObserver; + private final InternalResourceService mInternalResourceService; + private final SparseArray mActions = new SparseArray<>(); private final SparseArray mRewards = new SparseArray<>(); AlarmManagerEconomicPolicy(InternalResourceService irs) { super(irs); - loadActions(); - loadRewards(); + mInternalResourceService = irs; + mSettingsObserver = new SettingsObserver(TareHandlerThread.getHandler()); + loadConstants(""); + } + + @Override + void setup() { + super.setup(); + ContentResolver resolver = mInternalResourceService.getContext().getContentResolver(); + resolver.registerContentObserver( + Settings.Global.getUriFor(TARE_ALARM_MANAGER_CONSTANTS), + false, mSettingsObserver, UserHandle.USER_ALL); + loadConstants(Settings.Global.getString( + mInternalResourceService.getContext().getContentResolver(), + TARE_ALARM_MANAGER_CONSTANTS)); } @Override long getMinSatiatedBalance(final int userId, @NonNull final String pkgName) { // TODO: take exemption into account - return arcToNarc(160); + return mMinSatiatedBalance; } @Override long getMaxSatiatedBalance() { - return arcToNarc(1440); + return mMaxSatiatedBalance; } - @Override long getMaxSatiatedCirculation() { - return arcToNarc(52000); + return mMaxSatiatedCirculation; } @NonNull @@ -101,43 +203,162 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy { return mRewards.get(rewardId); } - private void loadActions() { + private void loadConstants(String policyValuesString) { + mActions.clear(); + mRewards.clear(); + + try { + mParser.setString(policyValuesString); + } catch (IllegalArgumentException e) { + Slog.e(TAG, "Global setting key incorrect: ", e); + } + + mMinSatiatedBalance = arcToNarc(mParser.getInt(KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, + DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP)); + mMaxSatiatedBalance = arcToNarc(mParser.getInt(KEY_AM_MAX_SATIATED_BALANCE, + DEFAULT_AM_MAX_SATIATED_BALANCE)); + mMaxSatiatedCirculation = arcToNarc(mParser.getInt(KEY_AM_MAX_CIRCULATION, + DEFAULT_AM_MAX_CIRCULATION)); + + final long exactAllowWhileIdleWakeupBasePrice = arcToNarc( + mParser.getInt(KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE, + DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE)); + mActions.put(ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE, - new Action(ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE, arcToNarc(3), arcToNarc(5))); + new Action(ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE, + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP, + DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP)), + exactAllowWhileIdleWakeupBasePrice)); mActions.put(ACTION_ALARM_WAKEUP_EXACT, - new Action(ACTION_ALARM_WAKEUP_EXACT, arcToNarc(3), arcToNarc(4))); + new Action(ACTION_ALARM_WAKEUP_EXACT, + arcToNarc(mParser.getInt(KEY_AM_ACTION_ALARM_EXACT_WAKEUP_CTP, + DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_CTP)), + arcToNarc(mParser.getInt(KEY_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE, + DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE)))); + + final long inexactAllowWhileIdleWakeupBasePrice = + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE, + DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE)); + mActions.put(ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE, new Action(ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE, - arcToNarc(3), arcToNarc(4))); + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP, + DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP)), + inexactAllowWhileIdleWakeupBasePrice)); mActions.put(ACTION_ALARM_WAKEUP_INEXACT, - new Action(ACTION_ALARM_WAKEUP_INEXACT, arcToNarc(3), arcToNarc(3))); + new Action(ACTION_ALARM_WAKEUP_INEXACT, + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP, + DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP)), + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE, + DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE)))); + + final long exactAllowWhileIdleNonWakeupBasePrice = + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE, + DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE)); + mActions.put(ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE, new Action(ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE, - arcToNarc(1), arcToNarc(3))); + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP, + DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP)), + exactAllowWhileIdleNonWakeupBasePrice)); mActions.put(ACTION_ALARM_NONWAKEUP_EXACT, - new Action(ACTION_ALARM_NONWAKEUP_EXACT, arcToNarc(1), arcToNarc(2))); + new Action(ACTION_ALARM_NONWAKEUP_EXACT, + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP, + DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP)), + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE, + DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE)))); + + final long inexactAllowWhileIdleNonWakeupBasePrice = + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE, + DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE)); + mActions.put(ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE, new Action(ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE, - arcToNarc(1), arcToNarc(2))); + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP, + DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP)), + inexactAllowWhileIdleNonWakeupBasePrice)); mActions.put(ACTION_ALARM_NONWAKEUP_INEXACT, - new Action(ACTION_ALARM_NONWAKEUP_INEXACT, arcToNarc(1), arcToNarc(1))); + new Action(ACTION_ALARM_NONWAKEUP_INEXACT, + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP, + DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP)), + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE, + DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE)))); mActions.put(ACTION_ALARM_CLOCK, - new Action(ACTION_ALARM_CLOCK, arcToNarc(5), arcToNarc(10))); - } + new Action(ACTION_ALARM_CLOCK, + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_ALARMCLOCK_CTP, + DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_CTP)), + arcToNarc(mParser.getInt( + KEY_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE, + DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE)))); - private void loadRewards() { - mRewards.put(REWARD_TOP_ACTIVITY, - new Reward(REWARD_TOP_ACTIVITY, - arcToNarc(0), /* .01 arcs */ arcToNarc(1) / 100, arcToNarc(500))); - mRewards.put(REWARD_NOTIFICATION_SEEN, - new Reward(REWARD_NOTIFICATION_SEEN, arcToNarc(3), arcToNarc(0), arcToNarc(60))); + mRewards.put(REWARD_TOP_ACTIVITY, new Reward(REWARD_TOP_ACTIVITY, + arcToNarc(mParser.getInt(KEY_AM_REWARD_TOP_ACTIVITY_INSTANT, + DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT)), + (long) (arcToNarc(1) * mParser.getFloat(KEY_AM_REWARD_TOP_ACTIVITY_ONGOING, + DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING)), + arcToNarc(mParser.getInt(KEY_AM_REWARD_TOP_ACTIVITY_MAX, + DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX)))); + mRewards.put(REWARD_NOTIFICATION_SEEN, new Reward(REWARD_NOTIFICATION_SEEN, + arcToNarc(mParser.getInt(KEY_AM_REWARD_NOTIFICATION_SEEN_INSTANT, + DEFAULT_AM_REWARD_NOTIFICATION_SEEN_INSTANT)), + arcToNarc(mParser.getInt(KEY_AM_REWARD_NOTIFICATION_SEEN_ONGOING, + DEFAULT_AM_REWARD_NOTIFICATION_SEEN_ONGOING)), + arcToNarc(mParser.getInt(KEY_AM_REWARD_NOTIFICATION_SEEN_MAX, + DEFAULT_AM_REWARD_NOTIFICATION_SEEN_MAX)))); mRewards.put(REWARD_NOTIFICATION_INTERACTION, new Reward(REWARD_NOTIFICATION_INTERACTION, - arcToNarc(5), arcToNarc(0), arcToNarc(500))); - mRewards.put(REWARD_WIDGET_INTERACTION, - new Reward(REWARD_WIDGET_INTERACTION, arcToNarc(10), arcToNarc(0), arcToNarc(500))); + arcToNarc(mParser.getInt( + KEY_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT, + DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT)), + arcToNarc(mParser.getInt( + KEY_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING, + DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING)), + arcToNarc(mParser.getInt( + KEY_AM_REWARD_NOTIFICATION_INTERACTION_MAX, + DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX)))); + mRewards.put(REWARD_WIDGET_INTERACTION, new Reward(REWARD_WIDGET_INTERACTION, + arcToNarc(mParser.getInt(KEY_AM_REWARD_WIDGET_INTERACTION_INSTANT, + DEFAULT_AM_REWARD_WIDGET_INTERACTION_INSTANT)), + arcToNarc(mParser.getInt(KEY_AM_REWARD_WIDGET_INTERACTION_ONGOING, + DEFAULT_AM_REWARD_WIDGET_INTERACTION_ONGOING)), + arcToNarc(mParser.getInt(KEY_AM_REWARD_WIDGET_INTERACTION_MAX, + DEFAULT_AM_REWARD_WIDGET_INTERACTION_MAX)))); mRewards.put(REWARD_OTHER_USER_INTERACTION, new Reward(REWARD_OTHER_USER_INTERACTION, - arcToNarc(10), arcToNarc(0), arcToNarc(500))); + arcToNarc(mParser.getInt(KEY_AM_REWARD_OTHER_USER_INTERACTION_INSTANT, + DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_INSTANT)), + arcToNarc(mParser.getInt( + KEY_AM_REWARD_OTHER_USER_INTERACTION_ONGOING, + DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_ONGOING)), + arcToNarc(mParser.getInt( + KEY_AM_REWARD_OTHER_USER_INTERACTION_MAX, + DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_MAX)))); + } + + private final class SettingsObserver extends ContentObserver { + SettingsObserver(Handler handler) { + super(handler); + } + + @Override + public void onChange(boolean selfChange) { + loadConstants(Settings.Global.getString( + mInternalResourceService.getContext().getContentResolver(), + TARE_ALARM_MANAGER_CONSTANTS)); + } } } diff --git a/apex/jobscheduler/service/java/com/android/server/tare/CompleteEconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/CompleteEconomicPolicy.java index 8c56c61715086..f05e5c9afd1d0 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/CompleteEconomicPolicy.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/CompleteEconomicPolicy.java @@ -66,6 +66,14 @@ public class CompleteEconomicPolicy extends EconomicPolicy { mMaxSatiatedCirculation = max; } + @Override + void setup() { + super.setup(); + for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) { + mEnabledEconomicPolicies.valueAt(i).setup(); + } + } + @Override public long getMinSatiatedBalance(final int userId, @NonNull final String pkgName) { long min = 0; diff --git a/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java index ff008a2f3b60b..e339650fabe18 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java @@ -16,6 +16,88 @@ package com.android.server.tare; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_CTP; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_DEFAULT_START_CTP; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_CTP; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_HIGH_START_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_HIGH_START_CTP; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_LOW_RUNNING_CTP; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_LOW_START_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_LOW_START_CTP; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MAX_RUNNING_CTP; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MAX_START_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MAX_START_CTP; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MIN_RUNNING_CTP; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MIN_START_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MIN_START_CTP; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE; +import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP; +import static android.app.tare.EconomyManager.DEFAULT_JS_MAX_CIRCULATION; +import static android.app.tare.EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE; +import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_MAX; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_SEEN_INSTANT; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_SEEN_MAX; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_SEEN_ONGOING; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_INSTANT; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_MAX; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_ONGOING; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_TOP_ACTIVITY_MAX; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_WIDGET_INTERACTION_INSTANT; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_WIDGET_INTERACTION_MAX; +import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_WIDGET_INTERACTION_ONGOING; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_DEFAULT_RUNNING_CTP; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_DEFAULT_START_CTP; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_HIGH_RUNNING_CTP; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_HIGH_START_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_HIGH_START_CTP; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_LOW_RUNNING_CTP; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_LOW_START_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_LOW_START_CTP; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MAX_RUNNING_CTP; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MAX_START_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MAX_START_CTP; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MIN_RUNNING_CTP; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MIN_START_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MIN_START_CTP; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE; +import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP; +import static android.app.tare.EconomyManager.KEY_JS_MAX_CIRCULATION; +import static android.app.tare.EconomyManager.KEY_JS_MAX_SATIATED_BALANCE; +import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_INTERACTION_MAX; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_SEEN_INSTANT; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_SEEN_MAX; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_SEEN_ONGOING; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_OTHER_USER_INTERACTION_INSTANT; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_OTHER_USER_INTERACTION_MAX; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_OTHER_USER_INTERACTION_ONGOING; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_TOP_ACTIVITY_INSTANT; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_TOP_ACTIVITY_MAX; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_TOP_ACTIVITY_ONGOING; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_WIDGET_INTERACTION_INSTANT; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_WIDGET_INTERACTION_MAX; +import static android.app.tare.EconomyManager.KEY_JS_REWARD_WIDGET_INTERACTION_ONGOING; +import static android.provider.Settings.Global.TARE_JOB_SCHEDULER_CONSTANTS; + 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; @@ -24,6 +106,13 @@ import static com.android.server.tare.TareUtils.arcToNarc; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.ContentResolver; +import android.database.ContentObserver; +import android.os.Handler; +import android.os.UserHandle; +import android.provider.Settings; +import android.util.KeyValueListParser; +import android.util.Slog; import android.util.SparseArray; /** @@ -31,6 +120,8 @@ import android.util.SparseArray; * JobScheduler. */ public class JobSchedulerEconomicPolicy extends EconomicPolicy { + private static final String TAG = "TARE- " + JobSchedulerEconomicPolicy.class.getSimpleName(); + public static final int ACTION_JOB_MAX_START = TYPE_ACTION | POLICY_JS | 0; public static final int ACTION_JOB_MAX_RUNNING = TYPE_ACTION | POLICY_JS | 1; public static final int ACTION_JOB_HIGH_START = TYPE_ACTION | POLICY_JS | 2; @@ -50,29 +141,50 @@ public class JobSchedulerEconomicPolicy extends EconomicPolicy { COST_MODIFIER_PROCESS_STATE }; + private long mMinSatiatedBalance; + private long mMaxSatiatedBalance; + private long mMaxSatiatedCirculation; + + private final KeyValueListParser mParser = new KeyValueListParser(','); + private final SettingsObserver mSettingsObserver; + private final InternalResourceService mInternalResourceService; + private final SparseArray mActions = new SparseArray<>(); private final SparseArray mRewards = new SparseArray<>(); JobSchedulerEconomicPolicy(InternalResourceService irs) { super(irs); - loadActions(); - loadRewards(); + mInternalResourceService = irs; + mSettingsObserver = new SettingsObserver(TareHandlerThread.getHandler()); + loadConstants(""); + } + + @Override + void setup() { + super.setup(); + ContentResolver resolver = mInternalResourceService.getContext().getContentResolver(); + resolver.registerContentObserver( + Settings.Global.getUriFor(TARE_JOB_SCHEDULER_CONSTANTS), + false, mSettingsObserver, UserHandle.USER_ALL); + loadConstants(Settings.Global.getString( + mInternalResourceService.getContext().getContentResolver(), + TARE_JOB_SCHEDULER_CONSTANTS)); } @Override long getMinSatiatedBalance(final int userId, @NonNull final String pkgName) { // TODO: incorporate time since usage - return arcToNarc(2000); + return mMinSatiatedBalance; } @Override long getMaxSatiatedBalance() { - return arcToNarc(60000); + return mMaxSatiatedBalance; } @Override long getMaxSatiatedCirculation() { - return arcToNarc(691200); + return mMaxSatiatedCirculation; } @NonNull @@ -93,45 +205,134 @@ public class JobSchedulerEconomicPolicy extends EconomicPolicy { return mRewards.get(rewardId); } - private void loadActions() { - mActions.put(ACTION_JOB_MAX_START, - new Action(ACTION_JOB_MAX_START, arcToNarc(3), arcToNarc(10))); - mActions.put(ACTION_JOB_MAX_RUNNING, - new Action(ACTION_JOB_MAX_RUNNING, arcToNarc(2), arcToNarc(5))); - mActions.put(ACTION_JOB_HIGH_START, - new Action(ACTION_JOB_HIGH_START, arcToNarc(3), arcToNarc(8))); - mActions.put(ACTION_JOB_HIGH_RUNNING, - new Action(ACTION_JOB_HIGH_RUNNING, arcToNarc(2), arcToNarc(4))); - mActions.put(ACTION_JOB_DEFAULT_START, - new Action(ACTION_JOB_DEFAULT_START, arcToNarc(3), arcToNarc(6))); - mActions.put(ACTION_JOB_DEFAULT_RUNNING, - new Action(ACTION_JOB_DEFAULT_RUNNING, arcToNarc(2), arcToNarc(3))); - mActions.put(ACTION_JOB_LOW_START, - new Action(ACTION_JOB_LOW_START, arcToNarc(3), arcToNarc(4))); - mActions.put(ACTION_JOB_LOW_RUNNING, - new Action(ACTION_JOB_LOW_RUNNING, arcToNarc(2), arcToNarc(2))); - mActions.put(ACTION_JOB_MIN_START, - new Action(ACTION_JOB_MIN_START, arcToNarc(3), arcToNarc(2))); - mActions.put(ACTION_JOB_MIN_RUNNING, - new Action(ACTION_JOB_MIN_RUNNING, arcToNarc(2), arcToNarc(1))); - mActions.put(ACTION_JOB_TIMEOUT, - new Action(ACTION_JOB_TIMEOUT, arcToNarc(30), arcToNarc(60))); - } + private void loadConstants(String policyValuesString) { + mActions.clear(); + mRewards.clear(); - private void loadRewards() { - mRewards.put(REWARD_TOP_ACTIVITY, - new Reward(REWARD_TOP_ACTIVITY, - arcToNarc(0), /* .5 arcs */ arcToNarc(5) / 10, arcToNarc(15000))); - mRewards.put(REWARD_NOTIFICATION_SEEN, - new Reward(REWARD_NOTIFICATION_SEEN, arcToNarc(1), arcToNarc(0), arcToNarc(10))); + try { + mParser.setString(policyValuesString); + } catch (IllegalArgumentException e) { + Slog.e(TAG, "Global setting key incorrect: ", e); + } + + mMinSatiatedBalance = arcToNarc( + mParser.getInt(KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP, + DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP)); + mMaxSatiatedBalance = arcToNarc(mParser.getInt(KEY_JS_MAX_SATIATED_BALANCE, + DEFAULT_JS_MAX_SATIATED_BALANCE)); + mMaxSatiatedCirculation = arcToNarc(mParser.getInt(KEY_JS_MAX_CIRCULATION, + DEFAULT_JS_MAX_CIRCULATION)); + + mActions.put(ACTION_JOB_MAX_START, new Action(ACTION_JOB_MAX_START, + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_MAX_START_CTP, + DEFAULT_JS_ACTION_JOB_MAX_START_CTP)), + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_MAX_START_BASE_PRICE, + DEFAULT_JS_ACTION_JOB_MAX_START_BASE_PRICE)))); + mActions.put(ACTION_JOB_MAX_RUNNING, new Action(ACTION_JOB_MAX_RUNNING, + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_MAX_RUNNING_CTP, + DEFAULT_JS_ACTION_JOB_MAX_RUNNING_CTP)), + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE, + DEFAULT_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE)))); + mActions.put(ACTION_JOB_HIGH_START, new Action(ACTION_JOB_HIGH_START, + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_HIGH_START_CTP, + DEFAULT_JS_ACTION_JOB_HIGH_START_CTP)), + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_HIGH_START_BASE_PRICE, + DEFAULT_JS_ACTION_JOB_HIGH_START_BASE_PRICE)))); + mActions.put(ACTION_JOB_HIGH_RUNNING, new Action(ACTION_JOB_HIGH_RUNNING, + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_HIGH_RUNNING_CTP, + DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_CTP)), + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE, + DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE)))); + mActions.put(ACTION_JOB_DEFAULT_START, new Action(ACTION_JOB_DEFAULT_START, + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_DEFAULT_START_CTP, + DEFAULT_JS_ACTION_JOB_DEFAULT_START_CTP)), + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE, + DEFAULT_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE)))); + mActions.put(ACTION_JOB_DEFAULT_RUNNING, new Action(ACTION_JOB_DEFAULT_RUNNING, + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_DEFAULT_RUNNING_CTP, + DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_CTP)), + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE, + DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE)))); + mActions.put(ACTION_JOB_LOW_START, new Action(ACTION_JOB_LOW_START, + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_LOW_START_CTP, + DEFAULT_JS_ACTION_JOB_LOW_START_CTP)), + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_LOW_START_BASE_PRICE, + DEFAULT_JS_ACTION_JOB_LOW_START_BASE_PRICE)))); + mActions.put(ACTION_JOB_LOW_RUNNING, new Action(ACTION_JOB_LOW_RUNNING, + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_LOW_RUNNING_CTP, + DEFAULT_JS_ACTION_JOB_LOW_RUNNING_CTP)), + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE, + DEFAULT_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE)))); + mActions.put(ACTION_JOB_MIN_START, new Action(ACTION_JOB_MIN_START, + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_MIN_START_CTP, + DEFAULT_JS_ACTION_JOB_MIN_START_CTP)), + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_MIN_START_BASE_PRICE, + DEFAULT_JS_ACTION_JOB_MIN_START_BASE_PRICE)))); + mActions.put(ACTION_JOB_MIN_RUNNING, new Action(ACTION_JOB_MIN_RUNNING, + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_MIN_RUNNING_CTP, + DEFAULT_JS_ACTION_JOB_MIN_RUNNING_CTP)), + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE, + DEFAULT_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE)))); + mActions.put(ACTION_JOB_TIMEOUT, new Action(ACTION_JOB_TIMEOUT, + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP, + DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP)), + arcToNarc(mParser.getInt(KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE, + DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE)))); + + mRewards.put(REWARD_TOP_ACTIVITY, new Reward(REWARD_TOP_ACTIVITY, + arcToNarc(mParser.getInt(KEY_JS_REWARD_TOP_ACTIVITY_INSTANT, + DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT)), + (long) (arcToNarc(1) * mParser.getFloat(KEY_JS_REWARD_TOP_ACTIVITY_ONGOING, + DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING)), + arcToNarc(mParser.getInt(KEY_JS_REWARD_TOP_ACTIVITY_MAX, + DEFAULT_JS_REWARD_TOP_ACTIVITY_MAX)))); + mRewards.put(REWARD_NOTIFICATION_SEEN, new Reward(REWARD_NOTIFICATION_SEEN, + arcToNarc(mParser.getInt(KEY_JS_REWARD_NOTIFICATION_SEEN_INSTANT, + DEFAULT_JS_REWARD_NOTIFICATION_SEEN_INSTANT)), + arcToNarc(mParser.getInt(KEY_JS_REWARD_NOTIFICATION_SEEN_ONGOING, + DEFAULT_JS_REWARD_NOTIFICATION_SEEN_ONGOING)), + arcToNarc(mParser.getInt(KEY_JS_REWARD_NOTIFICATION_SEEN_MAX, + DEFAULT_JS_REWARD_NOTIFICATION_SEEN_MAX)))); mRewards.put(REWARD_NOTIFICATION_INTERACTION, new Reward(REWARD_NOTIFICATION_INTERACTION, - arcToNarc(5), arcToNarc(0), arcToNarc(5000))); - mRewards.put(REWARD_WIDGET_INTERACTION, - new Reward(REWARD_WIDGET_INTERACTION, - arcToNarc(10), arcToNarc(0), arcToNarc(5000))); + arcToNarc(mParser.getInt( + KEY_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT, + DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT)), + arcToNarc(mParser.getInt( + KEY_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING, + DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING)), + arcToNarc(mParser.getInt( + KEY_JS_REWARD_NOTIFICATION_INTERACTION_MAX, + DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_MAX)))); + mRewards.put(REWARD_WIDGET_INTERACTION, new Reward(REWARD_WIDGET_INTERACTION, + arcToNarc(mParser.getInt(KEY_JS_REWARD_WIDGET_INTERACTION_INSTANT, + DEFAULT_JS_REWARD_WIDGET_INTERACTION_INSTANT)), + arcToNarc(mParser.getInt(KEY_JS_REWARD_WIDGET_INTERACTION_ONGOING, + DEFAULT_JS_REWARD_WIDGET_INTERACTION_ONGOING)), + arcToNarc(mParser.getInt(KEY_JS_REWARD_WIDGET_INTERACTION_MAX, + DEFAULT_JS_REWARD_WIDGET_INTERACTION_MAX)))); mRewards.put(REWARD_OTHER_USER_INTERACTION, new Reward(REWARD_OTHER_USER_INTERACTION, - arcToNarc(10), arcToNarc(0), arcToNarc(5000))); + arcToNarc(mParser.getInt(KEY_JS_REWARD_OTHER_USER_INTERACTION_INSTANT, + DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_INSTANT)), + arcToNarc(mParser.getInt( + KEY_JS_REWARD_OTHER_USER_INTERACTION_ONGOING, + DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_ONGOING)), + arcToNarc(mParser.getInt( + KEY_JS_REWARD_OTHER_USER_INTERACTION_MAX, + DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_MAX)))); + } + + private final class SettingsObserver extends ContentObserver { + SettingsObserver(Handler handler) { + super(handler); + } + + @Override + public void onChange(boolean selfChange) { + loadConstants(Settings.Global.getString( + mInternalResourceService.getContext().getContentResolver(), + TARE_JOB_SCHEDULER_CONSTANTS)); + } } }