diff --git a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java index cef065ddac9e5..0e9efbcc98b87 100644 --- a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java +++ b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java @@ -1536,13 +1536,14 @@ public class DeviceIdleController extends SystemService @VisibleForTesting static final int MSG_REPORT_STATIONARY_STATUS = 7; private static final int MSG_FINISH_IDLE_OP = 8; - private static final int MSG_REPORT_TEMP_APP_WHITELIST_CHANGED_TO_NPMS = 9; private static final int MSG_SEND_CONSTRAINT_MONITORING = 10; @VisibleForTesting static final int MSG_UPDATE_PRE_IDLE_TIMEOUT_FACTOR = 11; @VisibleForTesting static final int MSG_RESET_PRE_IDLE_TIMEOUT_FACTOR = 12; private static final int MSG_REPORT_TEMP_APP_WHITELIST_CHANGED = 13; + private static final int MSG_REPORT_TEMP_APP_WHITELIST_ADDED_TO_NPMS = 14; + private static final int MSG_REPORT_TEMP_APP_WHITELIST_REMOVED_TO_NPMS = 15; final class MyHandler extends Handler { MyHandler(Looper looper) { @@ -1659,10 +1660,17 @@ public class DeviceIdleController extends SystemService } } } break; - case MSG_REPORT_TEMP_APP_WHITELIST_CHANGED_TO_NPMS: { + case MSG_REPORT_TEMP_APP_WHITELIST_ADDED_TO_NPMS: { final int appId = msg.arg1; - final boolean added = (msg.arg2 == 1); - mNetworkPolicyManagerInternal.onTempPowerSaveWhitelistChange(appId, added); + final int reasonCode = msg.arg2; + final String reason = (String) msg.obj; + mNetworkPolicyManagerInternal.onTempPowerSaveWhitelistChange(appId, true, + reasonCode, reason); + } break; + case MSG_REPORT_TEMP_APP_WHITELIST_REMOVED_TO_NPMS: { + final int appId = msg.arg1; + mNetworkPolicyManagerInternal.onTempPowerSaveWhitelistChange(appId, false, + REASON_UNKNOWN, /* reason= */ null); } break; case MSG_SEND_CONSTRAINT_MONITORING: { final IDeviceIdleConstraint constraint = (IDeviceIdleConstraint) msg.obj; @@ -2811,14 +2819,15 @@ public class DeviceIdleController extends SystemService // NPMS needs to update its state synchronously in certain situations so we // can't have it use the TempAllowlistChangeListener path right now. // TODO: see if there's a way to simplify/consolidate - mHandler.obtainMessage(MSG_REPORT_TEMP_APP_WHITELIST_CHANGED_TO_NPMS, appId, 1) - .sendToTarget(); + mHandler.obtainMessage(MSG_REPORT_TEMP_APP_WHITELIST_ADDED_TO_NPMS, appId, + reasonCode, reason).sendToTarget(); } reportTempWhitelistChangedLocked(uid, true); } } if (informWhitelistChanged) { - mNetworkPolicyManagerInternal.onTempPowerSaveWhitelistChange(appId, true); + mNetworkPolicyManagerInternal.onTempPowerSaveWhitelistChange(appId, true, + reasonCode, reason); } } @@ -2890,8 +2899,8 @@ public class DeviceIdleController extends SystemService final int appId = UserHandle.getAppId(uid); updateTempWhitelistAppIdsLocked(uid, false, 0, 0, REASON_UNKNOWN, reason, INVALID_UID); - mHandler.obtainMessage(MSG_REPORT_TEMP_APP_WHITELIST_CHANGED_TO_NPMS, appId, 0) - .sendToTarget(); + mHandler.obtainMessage(MSG_REPORT_TEMP_APP_WHITELIST_REMOVED_TO_NPMS, appId, + /* unused= */ 0).sendToTarget(); reportTempWhitelistChangedLocked(uid, false); try { mBatteryStats.noteEvent(BatteryStats.HistoryItem.EVENT_TEMP_WHITELIST_FINISH, diff --git a/services/core/java/com/android/server/net/NetworkPolicyLogger.java b/services/core/java/com/android/server/net/NetworkPolicyLogger.java index 4b4146683a09a..654b17fb97547 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyLogger.java +++ b/services/core/java/com/android/server/net/NetworkPolicyLogger.java @@ -26,6 +26,7 @@ import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_POWERSAVE; import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_RESTRICTED; import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_STANDBY; import static android.net.NetworkPolicyManager.FIREWALL_RULE_DEFAULT; +import static android.os.PowerExemptionManager.reasonCodeToString; import static android.os.Process.INVALID_UID; import android.app.ActivityManager; @@ -192,13 +193,12 @@ public class NetworkPolicyLogger { } } - void tempPowerSaveWlChanged(int appId, boolean added) { + void tempPowerSaveWlChanged(int appId, boolean added, int reasonCode, String reason) { synchronized (mLock) { if (LOGV || appId == UserHandle.getAppId(mDebugUid)) { - Slog.v(TAG, - getTempPowerSaveWlChangedLog(appId, added)); + Slog.v(TAG, getTempPowerSaveWlChangedLog(appId, added, reasonCode, reason)); } - mEventsBuffer.tempPowerSaveWlChanged(appId, added); + mEventsBuffer.tempPowerSaveWlChanged(appId, added, reasonCode, reason); } } @@ -326,8 +326,10 @@ public class NetworkPolicyLogger { return "Parole state: " + paroleOn; } - private static String getTempPowerSaveWlChangedLog(int appId, boolean added) { - return "temp-power-save whitelist for " + appId + " changed to: " + added; + private static String getTempPowerSaveWlChangedLog(int appId, boolean added, + int reasonCode, String reason) { + return "temp-power-save whitelist for " + appId + " changed to: " + added + + "; reason=" + reasonCodeToString(reasonCode) + " <" + reason + ">"; } private static String getUidFirewallRuleChangedLog(int chain, int uid, int rule) { @@ -497,14 +499,17 @@ public class NetworkPolicyLogger { data.timeStamp = System.currentTimeMillis(); } - public void tempPowerSaveWlChanged(int appId, boolean added) { + public void tempPowerSaveWlChanged(int appId, boolean added, + int reasonCode, String reason) { final Data data = getNextSlot(); if (data == null) return; data.reset(); data.type = EVENT_TEMP_POWER_SAVE_WL_CHANGED; data.ifield1 = appId; + data.ifield2 = reasonCode; data.bfield1 = added; + data.sfield1 = reason; data.timeStamp = System.currentTimeMillis(); } @@ -571,7 +576,8 @@ public class NetworkPolicyLogger { case EVENT_PAROLE_STATE_CHANGED: return getParoleStateChanged(data.bfield1); case EVENT_TEMP_POWER_SAVE_WL_CHANGED: - return getTempPowerSaveWlChangedLog(data.ifield1, data.bfield1); + return getTempPowerSaveWlChangedLog(data.ifield1, data.bfield1, + data.ifield2, data.sfield1); case EVENT_UID_FIREWALL_RULE_CHANGED: return getUidFirewallRuleChangedLog(data.ifield1, data.ifield2, data.ifield3); case EVENT_FIREWALL_CHAIN_ENABLED: diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java b/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java index 2e4d41c7d3649..03a63b9058a8f 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java @@ -17,9 +17,11 @@ package com.android.server.net; import android.annotation.NonNull; +import android.annotation.Nullable; import android.net.Network; import android.net.NetworkTemplate; import android.net.netstats.provider.NetworkStatsProvider; +import android.os.PowerExemptionManager.ReasonCode; import android.telephony.SubscriptionPlan; import java.util.Set; @@ -41,9 +43,13 @@ public abstract class NetworkPolicyManagerInternal { * that network rules for that appId can be updated. * * @param appId The appId which has been updated in the allowlist. - * @param added Denotes whether the {@param appId} has been added or removed from the allowlist. + * @param added Denotes whether the {@code appId} has been added or removed from the allowlist. + * @param reasonCode one of {@link ReasonCode} indicating the reason for the change. + * Only valid when {@code added} is {@code true}. + * @param reason an optional human-readable reason explaining why the app is temp allow-listed. */ - public abstract void onTempPowerSaveWhitelistChange(int appId, boolean added); + public abstract void onTempPowerSaveWhitelistChange(int appId, boolean added, + @ReasonCode int reasonCode, @Nullable String reason); /** * Return the active {@link SubscriptionPlan} for the given network. diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index cfd575080d972..21f68aecd25b2 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -211,6 +211,7 @@ import android.os.Message; import android.os.MessageQueue.IdleHandler; import android.os.ParcelFileDescriptor; import android.os.PersistableBundle; +import android.os.PowerExemptionManager.ReasonCode; import android.os.PowerManager; import android.os.PowerManager.ServiceType; import android.os.PowerManagerInternal; @@ -5743,12 +5744,13 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } @Override - public void onTempPowerSaveWhitelistChange(int appId, boolean added) { + public void onTempPowerSaveWhitelistChange(int appId, boolean added, + @ReasonCode int reasonCode, @Nullable String reason) { synchronized (mUidRulesFirstLock) { if (!mSystemReady) { return; } - mLogger.tempPowerSaveWlChanged(appId, added); + mLogger.tempPowerSaveWlChanged(appId, added, reasonCode, reason); if (added) { mPowerSaveTempWhitelistAppIds.put(appId, true); } else {