Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 32b6528e authored by Pradeep Sawlani's avatar Pradeep Sawlani
Browse files

Use compat framework to gate system managed media service transitions.



Changes in this commit introduces compat framework which allows:
a. enable/disable change per app.
b. report changes which help root cause issue.

Test: atest cts/tests/app/src/android/app/cts/ActivityManagerNotifyMediaFGSTypeTest.java
Flag: com.android.media.flags.enable_notifying_activity_manager_with_media_session_status_change
BUG: 281762171

Change-Id: I46cce41630ad6305754ea00438768fdd376c022b
Signed-off-by: default avatarPradeep Sawlani <sawlani@google.com>
parent 52cd98cc
Loading
Loading
Loading
Loading
+42 −17
Original line number Diff line number Diff line
@@ -387,6 +387,15 @@ public final class ActiveServices {
    @Overridable
    public static final long FGS_SAW_RESTRICTIONS = 319471980L;

    /**
     * Allows system to manage foreground state of service with type
     * <li>{@link android.content.pm.ServiceInfo#FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK}</li>
     */
    @ChangeId
    @EnabledSince(targetSdkVersion = VERSION_CODES.VANILLA_ICE_CREAM)
    @Overridable
    public static final long MEDIA_FGS_STATE_TRANSITION = 281762171L;

    final ActivityManagerService mAm;

    // Maximum number of services that we allow to start in the background
@@ -9341,16 +9350,20 @@ public final class ActiveServices {
                        == ServiceInfo.FOREGROUND_SERVICE_TYPE_NONE
                        && sr.foregroundId == notificationId) {
                    // check if service is explicitly requested by app to not be in foreground.
                    if (sr.systemRequestedFgToBg) {
                    if (sr.systemRequestedFgToBg && CompatChanges.isChangeEnabled(
                            MEDIA_FGS_STATE_TRANSITION, sr.appInfo.uid)) {
                        if (DEBUG_FOREGROUND_SERVICE) {
                            Slog.d(TAG,
                                    "System initiated service transition to foreground "
                                            + "for package "
                                            + packageName);
                        }
                        setServiceForegroundInnerLocked(sr, sr.foregroundId,
                                sr.foregroundNoti, /* flags */ 0,
                                ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK,
                                /* callingUidStart */ 0, /* systemRequestedTransition */ true);
                    } else {
                        if (DEBUG_FOREGROUND_SERVICE) {
                            Slog.d(TAG,
                                    "Ignoring system initiated foreground service transition for "
                                            + "package "
@@ -9360,6 +9373,7 @@ public final class ActiveServices {
                }
            }
        }
    }

    /**
     * Handles notifications from MediaSessionService about inactive media foreground services.
@@ -9388,14 +9402,25 @@ public final class ActiveServices {
                if (sr.foregroundServiceType
                        == ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
                        && sr.foregroundId == notificationId) {
                    if (CompatChanges.isChangeEnabled(MEDIA_FGS_STATE_TRANSITION, sr.appInfo.uid)) {
                        if (DEBUG_FOREGROUND_SERVICE) {
                            Slog.d(TAG,
                            "System initiated transition of foreground service(type:media) to bg "
                                    "System initiated transition of foreground service"
                                            + "(type:media) to"
                                            + " bg "
                                            + "for package "
                                            + packageName);
                        }
                        setServiceForegroundInnerLocked(sr, /* id */ 0,
                                /* notification */ null, /* flags */ 0,
                                /* foregroundServiceType */ 0, /* callingUidStart */ 0,
                                /* systemRequestedTransition */ true);
                    } else {
                        if (DEBUG_FOREGROUND_SERVICE) {
                            Slog.d(TAG, "Ignoring system initiated transition of foreground"
                                    + " service(type:media)to bg for package " + packageName);
                        }
                    }
                }
            }
        }