diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 2bacc443c3877..e553075580c4b 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -14991,6 +14991,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } private void setNetworkLoggingActiveInternal(boolean active) { + final boolean[] shouldSendNotification = new boolean[] {false}; synchronized (getLockObject()) { mInjector.binderWithCleanCallingIdentity(() -> { if (active) { @@ -15007,17 +15008,23 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { + " service not being available yet."); } maybePauseDeviceWideLoggingLocked(); - sendNetworkLoggingNotificationLocked(); + shouldSendNotification[0] = shouldSendNetworkLoggingNotificationLocked(); } else { if (mNetworkLogger != null && !mNetworkLogger.stopNetworkLogging()) { Slogf.wtf(LOG_TAG, "Network logging could not be stopped due to the logging" + " service not being available yet."); } mNetworkLogger = null; - mInjector.getNotificationManager().cancel(SystemMessage.NOTE_NETWORK_LOGGING); } }); } + if (active) { + if (shouldSendNotification[0]) { + sendNetworkLoggingNotification(); + } + } else { + mInjector.getNotificationManager().cancel(SystemMessage.NOTE_NETWORK_LOGGING); + } } private @UserIdInt int getNetworkLoggingAffectedUser() { @@ -15175,20 +15182,25 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } - private void sendNetworkLoggingNotificationLocked() { + /** + * Returns whether it's time to post another network logging notification. When returning true, + * this method has the side-effect of updating the recorded last network logging notification + * time to now. + */ + private boolean shouldSendNetworkLoggingNotificationLocked() { ensureLocked(); // Send a network logging notification if the admin is a device owner, not profile owner. final ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked(); if (deviceOwner == null || !deviceOwner.isNetworkLoggingEnabled) { - return; + return false; } if (deviceOwner.numNetworkLoggingNotifications >= ActiveAdmin.DEF_MAXIMUM_NETWORK_LOGGING_NOTIFICATIONS_SHOWN) { - return; + return false; } final long now = System.currentTimeMillis(); if (now - deviceOwner.lastNetworkLoggingNotificationTimeMs < MS_PER_DAY) { - return; + return false; } deviceOwner.numNetworkLoggingNotifications++; if (deviceOwner.numNetworkLoggingNotifications @@ -15197,6 +15209,11 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } else { deviceOwner.lastNetworkLoggingNotificationTimeMs = now; } + saveSettingsLocked(deviceOwner.getUserHandle().getIdentifier()); + return true; + } + + private void sendNetworkLoggingNotification() { final PackageManagerInternal pm = mInjector.getPackageManagerInternal(); final Intent intent = new Intent(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG); intent.setPackage(pm.getSystemUiServiceComponent().getPackageName()); @@ -15215,7 +15232,6 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { .bigText(mContext.getString(R.string.network_logging_notification_text))) .build(); mInjector.getNotificationManager().notify(SystemMessage.NOTE_NETWORK_LOGGING, notification); - saveSettingsLocked(deviceOwner.getUserHandle().getIdentifier()); } /**