From fb5d4b598cd218d66f2880a9eed5bef61e26bec5 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Tue, 16 May 2017 17:03:44 -0700 Subject: [PATCH] Work on issue #36891897: Need to ensure foreground services... ...can't hide themselves Propagate to notification manager the apps that are causing the "running in background" notification to be shown. Also hopefully this time fix the problem with the notification being stuck. (We were mixing elapsed time in the state management with uptime in the message scheduling.) Test: manual Change-Id: I9e38bff5fe69fa75b418e34c84d4e704ef70f460 --- core/java/android/app/Notification.java | 10 +++++++++ .../com/android/server/am/ActiveServices.java | 22 ++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 8a15b1fd13166..3ed174b2d46f8 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -1112,6 +1112,16 @@ public class Notification implements Parcelable @SystemApi public static final String EXTRA_SUBSTITUTE_APP_NAME = "android.substName"; + /** + * This is set on the notification shown by the activity manager about all apps + * running in the background. It indicates that the notification should be shown + * only if any of the given apps do not already have a {@link #FLAG_FOREGROUND_SERVICE} + * notification currently visible to the user. This is a string array of all + * package names of the apps. + * @hide + */ + public static final String EXTRA_FOREGROUND_APPS = "android.foregroundApps"; + private Icon mSmallIcon; private Icon mLargeIcon; diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 5e03508580526..2680b425ff3cd 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -780,7 +780,8 @@ public final class ActiveServices { smap.removeMessages(ServiceMap.MSG_UPDATE_FOREGROUND_APPS); if (nextUpdateTime < Long.MAX_VALUE) { Message msg = smap.obtainMessage(); - smap.sendMessageAtTime(msg, nextUpdateTime); + smap.sendMessageAtTime(msg, nextUpdateTime + + SystemClock.uptimeMillis() - SystemClock.elapsedRealtime()); } } if (!smap.mActiveForegroundAppsChanged) { @@ -811,30 +812,35 @@ public final class ActiveServices { Intent intent; String title; String msg; + String[] pkgs; if (active.size() == 1) { intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.fromParts("package", active.get(0).mPackageName, null)); title = context.getString( R.string.foreground_service_app_in_background, active.get(0).mLabel); msg = context.getString(R.string.foreground_service_tap_for_details); + pkgs = new String[] { active.get(0).mPackageName }; } else { intent = new Intent(Settings.ACTION_FOREGROUND_SERVICES_SETTINGS); - String[] pkgs = new String[active.size()]; + pkgs = new String[active.size()]; for (int i = 0; i < active.size(); i++) { pkgs[i] = active.get(i).mPackageName; } intent.putExtra("packages", pkgs); title = context.getString( R.string.foreground_service_apps_in_background, active.size()); - msg = active.get(0).mLabel.toString(); + msg = active.get(0).mLabel.toString(); for (int i = 1; i < active.size(); i++) { msg = context.getString(R.string.foreground_service_multiple_separator, msg, active.get(i).mLabel); } } + Bundle notificationBundle = new Bundle(); + notificationBundle.putStringArray(Notification.EXTRA_FOREGROUND_APPS, pkgs); Notification.Builder n = new Notification.Builder(context, SystemNotificationChannels.FOREGROUND_SERVICE) + .addExtras(notificationBundle) .setSmallIcon(R.drawable.ic_check_circle_24px) .setOngoing(true) .setShowWhen(false) @@ -854,10 +860,11 @@ public final class ActiveServices { } } - private void requestUpdateActiveForegroundAppsLocked(ServiceMap smap, long time) { + private void requestUpdateActiveForegroundAppsLocked(ServiceMap smap, long timeElapsed) { Message msg = smap.obtainMessage(ServiceMap.MSG_UPDATE_FOREGROUND_APPS); - if (time != 0) { - smap.sendMessageAtTime(msg, time); + if (timeElapsed != 0) { + smap.sendMessageAtTime(msg, + timeElapsed + SystemClock.uptimeMillis() - SystemClock.elapsedRealtime()); } else { smap.mActiveForegroundAppsChanged = true; smap.sendMessage(msg); @@ -909,6 +916,9 @@ public final class ActiveServices { if (changed) { requestUpdateActiveForegroundAppsLocked(smap, nowElapsed + mAm.mConstants.FOREGROUND_SERVICE_UI_MIN_TIME); + } else if (smap.mActiveForegroundApps.size() > 0) { + // Just being paranoid. + requestUpdateActiveForegroundAppsLocked(smap, 0); } } }