diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Agent.java b/apex/jobscheduler/service/java/com/android/server/tare/Agent.java index 02a9dcf21ac46..fc0fc53685913 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/Agent.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/Agent.java @@ -18,10 +18,14 @@ package com.android.server.tare; import static com.android.server.tare.EconomicPolicy.REGULATION_BASIC_INCOME; import static com.android.server.tare.EconomicPolicy.REGULATION_BIRTHRIGHT; +import static com.android.server.tare.EconomicPolicy.TYPE_ACTION; +import static com.android.server.tare.EconomicPolicy.TYPE_REWARD; import static com.android.server.tare.EconomicPolicy.eventToString; +import static com.android.server.tare.EconomicPolicy.getEventType; import static com.android.server.tare.TareUtils.narcToString; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.UserHandle; @@ -46,6 +50,7 @@ class Agent { private static final boolean DEBUG = InternalResourceService.DEBUG || Log.isLoggable(TAG, Log.DEBUG); + private final Object mLock; private final CompleteEconomicPolicy mCompleteEconomicPolicy; private final InternalResourceService mIrs; @@ -57,6 +62,7 @@ class Agent { Agent(@NonNull InternalResourceService irs, @NonNull CompleteEconomicPolicy completeEconomicPolicy) { + mLock = irs.getLock(); mIrs = irs; mCompleteEconomicPolicy = completeEconomicPolicy; } @@ -75,13 +81,45 @@ class Agent { /** Get an app's current balance, factoring in any currently ongoing events. */ @GuardedBy("mLock") - private long getBalanceLocked(final int userId, @NonNull final String pkgName) { + long getBalanceLocked(final int userId, @NonNull final String pkgName) { final Ledger ledger = getLedgerLocked(userId, pkgName); long balance = ledger.getCurrentBalance(); // TODO: add ongoing events return balance; } + @GuardedBy("mLock") + void noteInstantaneousEventLocked(final int userId, @NonNull final String pkgName, + final int eventId, @Nullable String tag) { + final long now = System.currentTimeMillis(); + final Ledger ledger = getLedgerLocked(userId, pkgName); + + final int eventType = getEventType(eventId); + switch (eventType) { + case TYPE_ACTION: + final long actionCost = + mCompleteEconomicPolicy.getCostOfAction(eventId, userId, pkgName); + + recordTransactionLocked(userId, pkgName, ledger, + new Ledger.Transaction(now, now, eventId, tag, -actionCost)); + break; + + case TYPE_REWARD: + final EconomicPolicy.Reward reward = mCompleteEconomicPolicy.getReward(eventId); + if (reward != null) { + final long rewardSum = ledger.get24HourSum(eventId, now); + final long rewardVal = Math.max(0, + Math.min(reward.maxDailyReward - rewardSum, reward.instantReward)); + recordTransactionLocked(userId, pkgName, ledger, + new Ledger.Transaction(now, now, eventId, tag, rewardVal)); + } + break; + + default: + Slog.w(TAG, "Unsupported event type: " + eventType); + } + } + @GuardedBy("mLock") private void recordTransactionLocked(final int userId, @NonNull final String pkgName, @NonNull Ledger ledger, @NonNull Ledger.Transaction transaction) { diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java index bb983fbd05c16..3ccf263e881cb 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java @@ -233,7 +233,7 @@ public class InternalResourceService extends SystemService { synchronized (mLock) { final int newBatteryLevel = getCurrentBatteryLevel(); if (newBatteryLevel > mCurrentBatteryLevel) { - mAgent.distributeBasicIncomeLocked(mCurrentBatteryLevel); + mAgent.distributeBasicIncomeLocked(newBatteryLevel); } mCurrentBatteryLevel = newBatteryLevel; } @@ -376,6 +376,9 @@ public class InternalResourceService extends SystemService { @Override public void noteInstantaneousEvent(int userId, @NonNull String pkgName, int eventId, @Nullable String tag) { + synchronized (mLock) { + mAgent.noteInstantaneousEventLocked(userId, pkgName, eventId, tag); + } } @Override