Merge "Make a couple of constants in MediaSessionService configurable." into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
a8c60abc86
@@ -64,13 +64,6 @@ final class MediaButtonReceiverHolder {
|
|||||||
private static final int PACKAGE_MANAGER_COMMON_FLAGS =
|
private static final int PACKAGE_MANAGER_COMMON_FLAGS =
|
||||||
PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
|
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 int mUserId;
|
||||||
private final PendingIntent mPendingIntent;
|
private final PendingIntent mPendingIntent;
|
||||||
private final ComponentName mComponentName;
|
private final ComponentName mComponentName;
|
||||||
@@ -185,10 +178,13 @@ final class MediaButtonReceiverHolder {
|
|||||||
* Ignored if there's no valid pending intent.
|
* Ignored if there's no valid pending intent.
|
||||||
* @param handler handler to be used to call onFinishedListener
|
* @param handler handler to be used to call onFinishedListener
|
||||||
* Ignored if there's no valid pending intent.
|
* 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)
|
* @see PendingIntent#send(Context, int, Intent, PendingIntent.OnFinished, Handler)
|
||||||
*/
|
*/
|
||||||
public boolean send(Context context, KeyEvent keyEvent, String callingPackageName,
|
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);
|
Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
|
||||||
mediaButtonIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
|
mediaButtonIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
|
||||||
mediaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
|
mediaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
|
||||||
@@ -196,7 +192,7 @@ final class MediaButtonReceiverHolder {
|
|||||||
mediaButtonIntent.putExtra(Intent.EXTRA_PACKAGE_NAME, callingPackageName);
|
mediaButtonIntent.putExtra(Intent.EXTRA_PACKAGE_NAME, callingPackageName);
|
||||||
|
|
||||||
final BroadcastOptions options = BroadcastOptions.makeBasic();
|
final BroadcastOptions options = BroadcastOptions.makeBasic();
|
||||||
options.setTemporaryAppAllowlist(FGS_STARTS_TEMP_ALLOWLIST_DURATION_MS,
|
options.setTemporaryAppAllowlist(fgsAllowlistDurationMs,
|
||||||
PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED,
|
PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED,
|
||||||
PowerWhitelistManager.REASON_MEDIA_BUTTON, "");
|
PowerWhitelistManager.REASON_MEDIA_BUTTON, "");
|
||||||
if (mPendingIntent != null) {
|
if (mPendingIntent != null) {
|
||||||
|
|||||||
@@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -117,13 +117,6 @@ public class MediaSessionService extends SystemService implements Monitor {
|
|||||||
*/
|
*/
|
||||||
private static final String MEDIA_BUTTON_RECEIVER = "media_button_receiver";
|
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 Context mContext;
|
||||||
private final SessionManagerImpl mSessionManagerImpl;
|
private final SessionManagerImpl mSessionManagerImpl;
|
||||||
private final MessageHandler mHandler = new MessageHandler();
|
private final MessageHandler mHandler = new MessageHandler();
|
||||||
@@ -244,6 +237,9 @@ public class MediaSessionService extends SystemService implements Monitor {
|
|||||||
mCommunicationManager.registerSessionCallback(new HandlerExecutor(mHandler),
|
mCommunicationManager.registerSessionCallback(new HandlerExecutor(mHandler),
|
||||||
mSession2TokenCallback);
|
mSession2TokenCallback);
|
||||||
break;
|
break;
|
||||||
|
case PHASE_ACTIVITY_MANAGER_READY:
|
||||||
|
MediaSessionConfig.initialize(mContext);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -564,7 +560,7 @@ public class MediaSessionService extends SystemService implements Monitor {
|
|||||||
PowerExemptionManager.class);
|
PowerExemptionManager.class);
|
||||||
powerExemptionManager.addToTemporaryAllowList(targetPackage,
|
powerExemptionManager.addToTemporaryAllowList(targetPackage,
|
||||||
PowerExemptionManager.REASON_MEDIA_SESSION_CALLBACK, reason,
|
PowerExemptionManager.REASON_MEDIA_SESSION_CALLBACK, reason,
|
||||||
FGS_STARTS_TEMP_ALLOWLIST_DURATION_MS);
|
MediaSessionConfig.getMediaSessionCallbackFgsAllowlistDurationMs());
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
Binder.restoreCallingIdentity(token);
|
Binder.restoreCallingIdentity(token);
|
||||||
@@ -1979,6 +1975,7 @@ public class MediaSessionService extends SystemService implements Monitor {
|
|||||||
}
|
}
|
||||||
mAudioPlayerStateMonitor.dump(mContext, pw, "");
|
mAudioPlayerStateMonitor.dump(mContext, pw, "");
|
||||||
}
|
}
|
||||||
|
MediaSessionConfig.dump(pw, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2262,7 +2259,8 @@ public class MediaSessionService extends SystemService implements Monitor {
|
|||||||
boolean sent = mediaButtonReceiverHolder.send(
|
boolean sent = mediaButtonReceiverHolder.send(
|
||||||
mContext, keyEvent, callingPackageName,
|
mContext, keyEvent, callingPackageName,
|
||||||
needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1, mKeyEventReceiver,
|
needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1, mKeyEventReceiver,
|
||||||
mHandler);
|
mHandler,
|
||||||
|
MediaSessionConfig.getMediaButtonReceiverFgsAllowlistDurationMs());
|
||||||
if (sent) {
|
if (sent) {
|
||||||
String pkgName = mediaButtonReceiverHolder.getPackageName();
|
String pkgName = mediaButtonReceiverHolder.getPackageName();
|
||||||
for (FullUserRecord.OnMediaKeyEventDispatchedListenerRecord cr
|
for (FullUserRecord.OnMediaKeyEventDispatchedListenerRecord cr
|
||||||
|
|||||||
Reference in New Issue
Block a user