summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/res/res/values/strings.xml2
-rw-r--r--services/core/java/com/android/server/media/MediaButtonReceiverHolder.java14
-rw-r--r--services/core/java/com/android/server/media/MediaSessionConfig.java101
-rw-r--r--services/core/java/com/android/server/media/MediaSessionService.java16
4 files changed, 114 insertions, 19 deletions
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index dd647508338f..b834a069c5b7 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -5924,7 +5924,7 @@ ul.</string>
<!-- Notification title to prompt the user that new magnification feature is available. [CHAR LIMIT=50] -->
<string name="window_magnification_prompt_title">New magnification settings</string>
<!-- Notification content to prompt the user that new magnification feature is available. [CHAR LIMIT=NONE] -->
- <string name="window_magnification_prompt_content">You can now magnify part of your screen.</string>
+ <string name="window_magnification_prompt_content">You can now magnify part of your screen</string>
<!-- Notification action to bring the user to magnification settings page. [CHAR LIMIT=50] -->
<string name="turn_on_magnification_settings_action">Turn on in Settings</string>
<!-- Notification action to dismiss. [CHAR LIMIT=50] -->
diff --git a/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java b/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java
index cb0a668871e0..bb996a07ba66 100644
--- a/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java
+++ b/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java
@@ -64,13 +64,6 @@ final class MediaButtonReceiverHolder {
private static final int PACKAGE_MANAGER_COMMON_FLAGS =
PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
- /**
- * Denotes the duration during which a media button receiver will be exempted from
- * FGS-from-BG restriction and so will be allowed to start an FGS even if it is in the
- * background state while it receives a media key event.
- */
- private static final long FGS_STARTS_TEMP_ALLOWLIST_DURATION_MS = 10_000;
-
private final int mUserId;
private final PendingIntent mPendingIntent;
private final ComponentName mComponentName;
@@ -185,10 +178,13 @@ final class MediaButtonReceiverHolder {
* Ignored if there's no valid pending intent.
* @param handler handler to be used to call onFinishedListener
* Ignored if there's no valid pending intent.
+ * @param fgsAllowlistDurationMs duration for which the media button receiver will be
+ * allowed to start FGS from BG.
* @see PendingIntent#send(Context, int, Intent, PendingIntent.OnFinished, Handler)
*/
public boolean send(Context context, KeyEvent keyEvent, String callingPackageName,
- int resultCode, PendingIntent.OnFinished onFinishedListener, Handler handler) {
+ int resultCode, PendingIntent.OnFinished onFinishedListener, Handler handler,
+ long fgsAllowlistDurationMs) {
Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
mediaButtonIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
mediaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
@@ -196,7 +192,7 @@ final class MediaButtonReceiverHolder {
mediaButtonIntent.putExtra(Intent.EXTRA_PACKAGE_NAME, callingPackageName);
final BroadcastOptions options = BroadcastOptions.makeBasic();
- options.setTemporaryAppAllowlist(FGS_STARTS_TEMP_ALLOWLIST_DURATION_MS,
+ options.setTemporaryAppAllowlist(fgsAllowlistDurationMs,
PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED,
PowerWhitelistManager.REASON_MEDIA_BUTTON, "");
if (mPendingIntent != null) {
diff --git a/services/core/java/com/android/server/media/MediaSessionConfig.java b/services/core/java/com/android/server/media/MediaSessionConfig.java
new file mode 100644
index 000000000000..a866b0d4a38b
--- /dev/null
+++ b/services/core/java/com/android/server/media/MediaSessionConfig.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.media;
+
+import android.content.Context;
+import android.provider.DeviceConfig;
+import android.text.TextUtils;
+
+import java.io.PrintWriter;
+import java.util.Set;
+
+class MediaSessionConfig {
+ /**
+ * Denotes the duration for which a media button receiver will be exempted from
+ * FGS-from-BG restriction and so will be allowed to start an FGS even if it is in the
+ * background state while it receives a media key event.
+ */
+ private static final String KEY_MEDIA_BUTTON_RECEIVER_FGS_ALLOWLIST_DURATION_MS =
+ "media_button_receiver_fgs_allowlist_duration_ms";
+ private static final long DEFAULT_MEDIA_BUTTON_RECEIVER_FGS_ALLOWLIST_DURATION_MS = 10_000;
+ private static volatile long sMediaButtonReceiverFgsAllowlistDurationMs =
+ DEFAULT_MEDIA_BUTTON_RECEIVER_FGS_ALLOWLIST_DURATION_MS;
+
+ /**
+ * Denotes the duration for which an app receiving a media session callback will be
+ * exempted from FGS-from-BG restriction and so will be allowed to start an FGS even if
+ * it is in the background state while it receives a media session callback.
+ */
+ private static final String KEY_MEDIA_SESSION_CALLBACK_FGS_ALLOWLIST_DURATION_MS =
+ "media_session_calback_fgs_allowlist_duration_ms";
+ private static final long DEFAULT_MEDIA_SESSION_CALLBACK_FGS_ALLOWLIST_DURATION_MS = 10_000;
+ private static volatile long sMediaSessionCallbackFgsAllowlistDurationMs =
+ DEFAULT_MEDIA_SESSION_CALLBACK_FGS_ALLOWLIST_DURATION_MS;
+
+ private static void refresh(DeviceConfig.Properties properties) {
+ final Set<String> keys = properties.getKeyset();
+ properties.getKeyset().forEach(key -> {
+ switch (key) {
+ case KEY_MEDIA_BUTTON_RECEIVER_FGS_ALLOWLIST_DURATION_MS:
+ sMediaButtonReceiverFgsAllowlistDurationMs = properties.getLong(key,
+ DEFAULT_MEDIA_BUTTON_RECEIVER_FGS_ALLOWLIST_DURATION_MS);
+ break;
+ case KEY_MEDIA_SESSION_CALLBACK_FGS_ALLOWLIST_DURATION_MS:
+ sMediaSessionCallbackFgsAllowlistDurationMs = properties.getLong(key,
+ DEFAULT_MEDIA_SESSION_CALLBACK_FGS_ALLOWLIST_DURATION_MS);
+ break;
+ }
+ });
+ }
+
+ public static void initialize(Context context) {
+ DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_MEDIA,
+ context.getMainExecutor(), properties -> refresh(properties));
+ refresh(DeviceConfig.getProperties(DeviceConfig.NAMESPACE_MEDIA));
+ }
+
+ /**
+ * Returns the duration for which a media button receiver will be exempted from
+ * FGS-from-BG restriction and so will be allowed to start an FGS even if it is in the
+ * background state while it receives a media key event.
+ */
+ public static long getMediaButtonReceiverFgsAllowlistDurationMs() {
+ return sMediaButtonReceiverFgsAllowlistDurationMs;
+ }
+
+ /**
+ * Returns the duration for which an app receiving a media session callback will be
+ * exempted from FGS-from-BG restriction and so will be allowed to start an FGS even if
+ * it is in the background state while it receives a media session callback.
+ */
+ public static long getMediaSessionCallbackFgsAllowlistDurationMs() {
+ return sMediaSessionCallbackFgsAllowlistDurationMs;
+ }
+
+ public static void dump(PrintWriter pw, String prefix) {
+ pw.println("Media session config:");
+ final String dumpFormat = prefix + " %s: [cur: %s, def: %s]";
+ pw.println(TextUtils.formatSimple(dumpFormat,
+ KEY_MEDIA_BUTTON_RECEIVER_FGS_ALLOWLIST_DURATION_MS,
+ sMediaButtonReceiverFgsAllowlistDurationMs,
+ DEFAULT_MEDIA_BUTTON_RECEIVER_FGS_ALLOWLIST_DURATION_MS));
+ pw.println(TextUtils.formatSimple(dumpFormat,
+ KEY_MEDIA_SESSION_CALLBACK_FGS_ALLOWLIST_DURATION_MS,
+ sMediaSessionCallbackFgsAllowlistDurationMs,
+ DEFAULT_MEDIA_SESSION_CALLBACK_FGS_ALLOWLIST_DURATION_MS));
+ }
+}
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index a30d993136a7..aefdbca779e6 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -117,13 +117,6 @@ public class MediaSessionService extends SystemService implements Monitor {
*/
private static final String MEDIA_BUTTON_RECEIVER = "media_button_receiver";
- /**
- * Denotes the duration during which an app receiving a media session callback will be
- * exempted from FGS-from-BG restriction and so will be allowed to start an FGS even if it is
- * in the background state while it receives a media session callback.
- */
- private static final long FGS_STARTS_TEMP_ALLOWLIST_DURATION_MS = 10_000;
-
private final Context mContext;
private final SessionManagerImpl mSessionManagerImpl;
private final MessageHandler mHandler = new MessageHandler();
@@ -244,6 +237,9 @@ public class MediaSessionService extends SystemService implements Monitor {
mCommunicationManager.registerSessionCallback(new HandlerExecutor(mHandler),
mSession2TokenCallback);
break;
+ case PHASE_ACTIVITY_MANAGER_READY:
+ MediaSessionConfig.initialize(mContext);
+ break;
}
}
@@ -564,7 +560,7 @@ public class MediaSessionService extends SystemService implements Monitor {
PowerExemptionManager.class);
powerExemptionManager.addToTemporaryAllowList(targetPackage,
PowerExemptionManager.REASON_MEDIA_SESSION_CALLBACK, reason,
- FGS_STARTS_TEMP_ALLOWLIST_DURATION_MS);
+ MediaSessionConfig.getMediaSessionCallbackFgsAllowlistDurationMs());
}
} finally {
Binder.restoreCallingIdentity(token);
@@ -1979,6 +1975,7 @@ public class MediaSessionService extends SystemService implements Monitor {
}
mAudioPlayerStateMonitor.dump(mContext, pw, "");
}
+ MediaSessionConfig.dump(pw, "");
}
/**
@@ -2262,7 +2259,8 @@ public class MediaSessionService extends SystemService implements Monitor {
boolean sent = mediaButtonReceiverHolder.send(
mContext, keyEvent, callingPackageName,
needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1, mKeyEventReceiver,
- mHandler);
+ mHandler,
+ MediaSessionConfig.getMediaButtonReceiverFgsAllowlistDurationMs());
if (sent) {
String pkgName = mediaButtonReceiverHolder.getPackageName();
for (FullUserRecord.OnMediaKeyEventDispatchedListenerRecord cr