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 com.android.server.tare; 18 19 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE_CAKES; 20 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_CTP_CAKES; 21 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP_CAKES; 22 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE_CAKES; 23 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP_CAKES; 24 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES; 25 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP_CAKES; 26 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE_CAKES; 27 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP_CAKES; 28 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE_CAKES; 29 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP_CAKES; 30 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE_CAKES; 31 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_CTP_CAKES; 32 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE_CAKES; 33 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP_CAKES; 34 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE_CAKES; 35 import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP_CAKES; 36 import static android.app.tare.EconomyManager.DEFAULT_AM_HARD_CONSUMPTION_LIMIT_CAKES; 37 import static android.app.tare.EconomyManager.DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES; 38 import static android.app.tare.EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES; 39 import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES; 40 import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES; 41 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES; 42 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES; 43 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES; 44 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES; 45 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_SEEN_MAX_CAKES; 46 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES; 47 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES; 48 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_MAX_CAKES; 49 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES; 50 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT_CAKES; 51 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX_CAKES; 52 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING_CAKES; 53 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_WIDGET_INTERACTION_INSTANT_CAKES; 54 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_WIDGET_INTERACTION_MAX_CAKES; 55 import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_WIDGET_INTERACTION_ONGOING_CAKES; 56 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE; 57 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALARMCLOCK_CTP; 58 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE; 59 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP; 60 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE; 61 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP; 62 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE; 63 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP; 64 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE; 65 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP; 66 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE; 67 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP; 68 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE; 69 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_WAKEUP_CTP; 70 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE; 71 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP; 72 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE; 73 import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP; 74 import static android.app.tare.EconomyManager.KEY_AM_HARD_CONSUMPTION_LIMIT; 75 import static android.app.tare.EconomyManager.KEY_AM_INITIAL_CONSUMPTION_LIMIT; 76 import static android.app.tare.EconomyManager.KEY_AM_MAX_SATIATED_BALANCE; 77 import static android.app.tare.EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED; 78 import static android.app.tare.EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP; 79 import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT; 80 import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_INTERACTION_MAX; 81 import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING; 82 import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_SEEN_INSTANT; 83 import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_SEEN_MAX; 84 import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_SEEN_ONGOING; 85 import static android.app.tare.EconomyManager.KEY_AM_REWARD_OTHER_USER_INTERACTION_INSTANT; 86 import static android.app.tare.EconomyManager.KEY_AM_REWARD_OTHER_USER_INTERACTION_MAX; 87 import static android.app.tare.EconomyManager.KEY_AM_REWARD_OTHER_USER_INTERACTION_ONGOING; 88 import static android.app.tare.EconomyManager.KEY_AM_REWARD_TOP_ACTIVITY_INSTANT; 89 import static android.app.tare.EconomyManager.KEY_AM_REWARD_TOP_ACTIVITY_MAX; 90 import static android.app.tare.EconomyManager.KEY_AM_REWARD_TOP_ACTIVITY_ONGOING; 91 import static android.app.tare.EconomyManager.KEY_AM_REWARD_WIDGET_INTERACTION_INSTANT; 92 import static android.app.tare.EconomyManager.KEY_AM_REWARD_WIDGET_INTERACTION_MAX; 93 import static android.app.tare.EconomyManager.KEY_AM_REWARD_WIDGET_INTERACTION_ONGOING; 94 import static android.provider.Settings.Global.TARE_ALARM_MANAGER_CONSTANTS; 95 96 import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING; 97 import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE; 98 import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE; 99 import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE; 100 import static com.android.server.tare.TareUtils.cakeToString; 101 102 import android.annotation.NonNull; 103 import android.annotation.Nullable; 104 import android.content.ContentResolver; 105 import android.provider.DeviceConfig; 106 import android.provider.Settings; 107 import android.util.IndentingPrintWriter; 108 import android.util.KeyValueListParser; 109 import android.util.Slog; 110 import android.util.SparseArray; 111 112 /** 113 * Policy defining pricing information and daily ARC requirements and suggestions for 114 * AlarmManager. 115 */ 116 public class AlarmManagerEconomicPolicy extends EconomicPolicy { 117 private static final String TAG = "TARE- " + AlarmManagerEconomicPolicy.class.getSimpleName(); 118 119 public static final int ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE = 120 TYPE_ACTION | POLICY_AM | 0; 121 public static final int ACTION_ALARM_WAKEUP_EXACT = 122 TYPE_ACTION | POLICY_AM | 1; 123 public static final int ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE = 124 TYPE_ACTION | POLICY_AM | 2; 125 public static final int ACTION_ALARM_WAKEUP_INEXACT = 126 TYPE_ACTION | POLICY_AM | 3; 127 public static final int ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE = 128 TYPE_ACTION | POLICY_AM | 4; 129 public static final int ACTION_ALARM_NONWAKEUP_EXACT = 130 TYPE_ACTION | POLICY_AM | 5; 131 public static final int ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE = 132 TYPE_ACTION | POLICY_AM | 6; 133 public static final int ACTION_ALARM_NONWAKEUP_INEXACT = 134 TYPE_ACTION | POLICY_AM | 7; 135 public static final int ACTION_ALARM_CLOCK = 136 TYPE_ACTION | POLICY_AM | 8; 137 138 private static final int[] COST_MODIFIERS = new int[]{ 139 COST_MODIFIER_CHARGING, 140 COST_MODIFIER_DEVICE_IDLE, 141 COST_MODIFIER_POWER_SAVE_MODE, 142 COST_MODIFIER_PROCESS_STATE 143 }; 144 145 private long mMinSatiatedBalanceExempted; 146 private long mMinSatiatedBalanceOther; 147 private long mMaxSatiatedBalance; 148 private long mInitialSatiatedConsumptionLimit; 149 private long mHardSatiatedConsumptionLimit; 150 151 private final KeyValueListParser mParser = new KeyValueListParser(','); 152 private final InternalResourceService mInternalResourceService; 153 154 private final SparseArray<Action> mActions = new SparseArray<>(); 155 private final SparseArray<Reward> mRewards = new SparseArray<>(); 156 AlarmManagerEconomicPolicy(InternalResourceService irs)157 AlarmManagerEconomicPolicy(InternalResourceService irs) { 158 super(irs); 159 mInternalResourceService = irs; 160 loadConstants("", null); 161 } 162 163 @Override setup(@onNull DeviceConfig.Properties properties)164 void setup(@NonNull DeviceConfig.Properties properties) { 165 super.setup(properties); 166 ContentResolver resolver = mInternalResourceService.getContext().getContentResolver(); 167 loadConstants(Settings.Global.getString(resolver, TARE_ALARM_MANAGER_CONSTANTS), 168 properties); 169 } 170 171 @Override getMinSatiatedBalance(final int userId, @NonNull final String pkgName)172 long getMinSatiatedBalance(final int userId, @NonNull final String pkgName) { 173 if (mInternalResourceService.isPackageExempted(userId, pkgName)) { 174 return mMinSatiatedBalanceExempted; 175 } 176 // TODO: take other exemptions into account 177 return mMinSatiatedBalanceOther; 178 } 179 180 @Override getMaxSatiatedBalance()181 long getMaxSatiatedBalance() { 182 // TODO(230501287): adjust balance based on whether the app has the SCHEDULE_EXACT_ALARM 183 // permission granted. Apps without the permission granted shouldn't need a high balance 184 // since they won't be able to use exact alarms. Apps with the permission granted could 185 // have a higher balance, or perhaps just those with the USE_EXACT_ALARM permission since 186 // that is limited to specific use cases. 187 return mMaxSatiatedBalance; 188 } 189 190 @Override getInitialSatiatedConsumptionLimit()191 long getInitialSatiatedConsumptionLimit() { 192 return mInitialSatiatedConsumptionLimit; 193 } 194 195 @Override getHardSatiatedConsumptionLimit()196 long getHardSatiatedConsumptionLimit() { 197 return mHardSatiatedConsumptionLimit; 198 } 199 200 @NonNull 201 @Override getCostModifiers()202 int[] getCostModifiers() { 203 return COST_MODIFIERS; 204 } 205 206 @Nullable 207 @Override getAction(@ppAction int actionId)208 Action getAction(@AppAction int actionId) { 209 return mActions.get(actionId); 210 } 211 212 @Nullable 213 @Override getReward(@tilityReward int rewardId)214 Reward getReward(@UtilityReward int rewardId) { 215 return mRewards.get(rewardId); 216 } 217 loadConstants(String policyValuesString, @Nullable DeviceConfig.Properties properties)218 private void loadConstants(String policyValuesString, 219 @Nullable DeviceConfig.Properties properties) { 220 mActions.clear(); 221 mRewards.clear(); 222 223 try { 224 mParser.setString(policyValuesString); 225 } catch (IllegalArgumentException e) { 226 Slog.e(TAG, "Global setting key incorrect: ", e); 227 } 228 229 mMinSatiatedBalanceExempted = getConstantAsCake(mParser, properties, 230 KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED, 231 DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES); 232 mMinSatiatedBalanceOther = getConstantAsCake(mParser, properties, 233 KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, 234 DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES); 235 mMaxSatiatedBalance = getConstantAsCake(mParser, properties, 236 KEY_AM_MAX_SATIATED_BALANCE, 237 DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES); 238 mInitialSatiatedConsumptionLimit = getConstantAsCake(mParser, properties, 239 KEY_AM_INITIAL_CONSUMPTION_LIMIT, DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES); 240 mHardSatiatedConsumptionLimit = Math.max(mInitialSatiatedConsumptionLimit, 241 getConstantAsCake(mParser, properties, 242 KEY_AM_HARD_CONSUMPTION_LIMIT, DEFAULT_AM_HARD_CONSUMPTION_LIMIT_CAKES)); 243 244 final long exactAllowWhileIdleWakeupBasePrice = getConstantAsCake(mParser, properties, 245 KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE, 246 DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE_CAKES); 247 248 mActions.put(ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE, 249 new Action(ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE, 250 getConstantAsCake(mParser, properties, 251 KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP, 252 DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP_CAKES), 253 exactAllowWhileIdleWakeupBasePrice)); 254 mActions.put(ACTION_ALARM_WAKEUP_EXACT, 255 new Action(ACTION_ALARM_WAKEUP_EXACT, 256 getConstantAsCake(mParser, properties, 257 KEY_AM_ACTION_ALARM_EXACT_WAKEUP_CTP, 258 DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_CTP_CAKES), 259 getConstantAsCake(mParser, properties, 260 KEY_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE, 261 DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE_CAKES))); 262 263 final long inexactAllowWhileIdleWakeupBasePrice = 264 getConstantAsCake(mParser, properties, 265 KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE, 266 DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE_CAKES); 267 268 mActions.put(ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE, 269 new Action(ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE, 270 getConstantAsCake(mParser, properties, 271 KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP, 272 DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP_CAKES), 273 inexactAllowWhileIdleWakeupBasePrice)); 274 mActions.put(ACTION_ALARM_WAKEUP_INEXACT, 275 new Action(ACTION_ALARM_WAKEUP_INEXACT, 276 getConstantAsCake(mParser, properties, 277 KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP, 278 DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP_CAKES), 279 getConstantAsCake(mParser, properties, 280 KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE, 281 DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE_CAKES))); 282 283 final long exactAllowWhileIdleNonWakeupBasePrice = getConstantAsCake(mParser, properties, 284 KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE, 285 DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES); 286 mActions.put(ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE, 287 new Action(ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE, 288 getConstantAsCake(mParser, properties, 289 KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP, 290 DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP_CAKES), 291 exactAllowWhileIdleNonWakeupBasePrice)); 292 293 mActions.put(ACTION_ALARM_NONWAKEUP_EXACT, 294 new Action(ACTION_ALARM_NONWAKEUP_EXACT, 295 getConstantAsCake(mParser, properties, 296 KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP, 297 DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP_CAKES), 298 getConstantAsCake(mParser, properties, 299 KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE, 300 DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE_CAKES))); 301 302 final long inexactAllowWhileIdleNonWakeupBasePrice = getConstantAsCake(mParser, properties, 303 KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE, 304 DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES); 305 final long inexactAllowWhileIdleNonWakeupCtp = getConstantAsCake(mParser, properties, 306 KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP, 307 DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP_CAKES); 308 mActions.put(ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE, 309 new Action(ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE, 310 inexactAllowWhileIdleNonWakeupCtp, 311 inexactAllowWhileIdleNonWakeupBasePrice)); 312 313 mActions.put(ACTION_ALARM_NONWAKEUP_INEXACT, 314 new Action(ACTION_ALARM_NONWAKEUP_INEXACT, 315 getConstantAsCake(mParser, properties, 316 KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP, 317 DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP_CAKES), 318 getConstantAsCake(mParser, properties, 319 KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE, 320 DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE_CAKES))); 321 mActions.put(ACTION_ALARM_CLOCK, 322 new Action(ACTION_ALARM_CLOCK, 323 getConstantAsCake(mParser, properties, 324 KEY_AM_ACTION_ALARM_ALARMCLOCK_CTP, 325 DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_CTP_CAKES), 326 getConstantAsCake(mParser, properties, 327 KEY_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE, 328 DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE_CAKES))); 329 330 mRewards.put(REWARD_TOP_ACTIVITY, new Reward(REWARD_TOP_ACTIVITY, 331 getConstantAsCake(mParser, properties, 332 KEY_AM_REWARD_TOP_ACTIVITY_INSTANT, 333 DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT_CAKES), 334 getConstantAsCake(mParser, properties, 335 KEY_AM_REWARD_TOP_ACTIVITY_ONGOING, 336 DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING_CAKES), 337 getConstantAsCake(mParser, properties, 338 KEY_AM_REWARD_TOP_ACTIVITY_MAX, 339 DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX_CAKES))); 340 mRewards.put(REWARD_NOTIFICATION_SEEN, new Reward(REWARD_NOTIFICATION_SEEN, 341 getConstantAsCake(mParser, properties, 342 KEY_AM_REWARD_NOTIFICATION_SEEN_INSTANT, 343 DEFAULT_AM_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES), 344 getConstantAsCake(mParser, properties, 345 KEY_AM_REWARD_NOTIFICATION_SEEN_ONGOING, 346 DEFAULT_AM_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES), 347 getConstantAsCake(mParser, properties, 348 KEY_AM_REWARD_NOTIFICATION_SEEN_MAX, 349 DEFAULT_AM_REWARD_NOTIFICATION_SEEN_MAX_CAKES))); 350 mRewards.put(REWARD_NOTIFICATION_INTERACTION, 351 new Reward(REWARD_NOTIFICATION_INTERACTION, 352 getConstantAsCake(mParser, properties, 353 KEY_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT, 354 DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES), 355 getConstantAsCake(mParser, properties, 356 KEY_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING, 357 DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES), 358 getConstantAsCake(mParser, properties, 359 KEY_AM_REWARD_NOTIFICATION_INTERACTION_MAX, 360 DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES))); 361 mRewards.put(REWARD_WIDGET_INTERACTION, new Reward(REWARD_WIDGET_INTERACTION, 362 getConstantAsCake(mParser, properties, 363 KEY_AM_REWARD_WIDGET_INTERACTION_INSTANT, 364 DEFAULT_AM_REWARD_WIDGET_INTERACTION_INSTANT_CAKES), 365 getConstantAsCake(mParser, properties, 366 KEY_AM_REWARD_WIDGET_INTERACTION_ONGOING, 367 DEFAULT_AM_REWARD_WIDGET_INTERACTION_ONGOING_CAKES), 368 getConstantAsCake(mParser, properties, 369 KEY_AM_REWARD_WIDGET_INTERACTION_MAX, 370 DEFAULT_AM_REWARD_WIDGET_INTERACTION_MAX_CAKES))); 371 mRewards.put(REWARD_OTHER_USER_INTERACTION, 372 new Reward(REWARD_OTHER_USER_INTERACTION, 373 getConstantAsCake(mParser, properties, 374 KEY_AM_REWARD_OTHER_USER_INTERACTION_INSTANT, 375 DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES), 376 getConstantAsCake(mParser, properties, 377 KEY_AM_REWARD_OTHER_USER_INTERACTION_ONGOING, 378 DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES), 379 getConstantAsCake(mParser, properties, 380 KEY_AM_REWARD_OTHER_USER_INTERACTION_MAX, 381 DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_MAX_CAKES))); 382 } 383 384 @Override dump(IndentingPrintWriter pw)385 void dump(IndentingPrintWriter pw) { 386 pw.println("Min satiated balances:"); 387 pw.increaseIndent(); 388 pw.print("Exempted", cakeToString(mMinSatiatedBalanceExempted)).println(); 389 pw.print("Other", cakeToString(mMinSatiatedBalanceOther)).println(); 390 pw.decreaseIndent(); 391 pw.print("Max satiated balance", cakeToString(mMaxSatiatedBalance)).println(); 392 pw.print("Consumption limits: ["); 393 pw.print(cakeToString(mInitialSatiatedConsumptionLimit)); 394 pw.print(", "); 395 pw.print(cakeToString(mHardSatiatedConsumptionLimit)); 396 pw.println("]"); 397 398 pw.println(); 399 pw.println("Actions:"); 400 pw.increaseIndent(); 401 for (int i = 0; i < mActions.size(); ++i) { 402 dumpAction(pw, mActions.valueAt(i)); 403 } 404 pw.decreaseIndent(); 405 406 pw.println(); 407 pw.println("Rewards:"); 408 pw.increaseIndent(); 409 for (int i = 0; i < mRewards.size(); ++i) { 410 dumpReward(pw, mRewards.valueAt(i)); 411 } 412 pw.decreaseIndent(); 413 } 414 } 415