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

Commit 62e9e374 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Merge cherrypicks of ['googleplex-android-review.googlesource.com/28132924',...

Merge cherrypicks of ['googleplex-android-review.googlesource.com/28132924', 'googleplex-android-review.googlesource.com/28576528', 'googleplex-android-review.googlesource.com/28576529'] into 24Q3-release.

Change-Id: I109078bc1f0a2a8b48920b725d0645555631356f
parents 2da5f73e 07590dec
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -634,6 +634,13 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
            return;
        }

        // bail early if leash is null
        if (mLeash == null) {
            ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
                    "exitPip: leash is null");
            return;
        }

        final Rect destinationBounds = new Rect(getExitDestinationBounds());
        final int direction = syncWithSplitScreenBounds(destinationBounds, requestEnterSplit)
                ? TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN
+11 −4
Original line number Diff line number Diff line
@@ -107,7 +107,8 @@ public final class MediaRouter2 {
     * #SCANNING_STATE_WHILE_INTERACTIVE}.
     *
     * <p>Routers requesting unrestricted scanning must hold {@link
     * Manifest.permission#MEDIA_ROUTING_CONTROL}.
     * Manifest.permission#MEDIA_ROUTING_CONTROL} or {@link
     * Manifest.permission#MEDIA_CONTENT_CONTROL}.
     *
     * @hide
     */
@@ -522,11 +523,16 @@ public final class MediaRouter2 {
     *
     * <p>{@code scanRequest} specifies relevant scanning options, like whether the system should
     * scan with the screen off. Screen off scanning requires {@link
     * Manifest.permission#MEDIA_ROUTING_CONTROL}
     * Manifest.permission#MEDIA_ROUTING_CONTROL} or {@link
     * Manifest.permission#MEDIA_CONTENT_CONTROL}.
     *
     * <p>Proxy routers use the registered {@link RouteDiscoveryPreference} of their target routers.
     *
     * @return A unique {@link ScanToken} that identifies the scan request.
     * @throws SecurityException If a {@link ScanRequest} with {@link
     *     ScanRequest.Builder#setScreenOffScan} true is passed, while not holding {@link
     *     Manifest.permission#MEDIA_ROUTING_CONTROL} or {@link
     *     Manifest.permission#MEDIA_CONTENT_CONTROL}.
     */
    @FlaggedApi(FLAG_ENABLE_SCREEN_OFF_SCANNING)
    @NonNull
@@ -1745,8 +1751,9 @@ public final class MediaRouter2 {

            /**
             * Sets whether the app is requesting to scan even while the screen is off, bypassing
             * default scanning restrictions. Only companion apps holding {@link
             * Manifest.permission#MEDIA_ROUTING_CONTROL} should set this to {@code true}.
             * default scanning restrictions. Only apps holding {@link
             * Manifest.permission#MEDIA_ROUTING_CONTROL} or {@link
             * Manifest.permission#MEDIA_CONTENT_CONTROL} should set this to {@code true}.
             *
             * @see #requestScan(ScanRequest)
             */
+10 −0
Original line number Diff line number Diff line
@@ -134,3 +134,13 @@ flag {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "enable_full_scan_with_media_content_control"
    namespace: "media_better_together"
    description: "Allows holders of the MEDIA_CONTENT_CONTROL permission to scan for routes while not in the foreground."
    bug: "352401364"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}
+29 −3
Original line number Diff line number Diff line
@@ -288,7 +288,7 @@ class MediaRouter2ServiceImpl {
                        == PackageManager.PERMISSION_GRANTED;
        final boolean hasModifyAudioRoutingPermission =
                checkCallerHasModifyAudioRoutingPermission(pid, uid);

        boolean hasMediaContentControlPermission = checkMediaContentControlPermission(uid, pid);
        boolean hasMediaRoutingControlPermission =
                checkMediaRoutingControlPermission(uid, pid, packageName);

@@ -303,6 +303,7 @@ class MediaRouter2ServiceImpl {
                        userId,
                        hasConfigureWifiDisplayPermission,
                        hasModifyAudioRoutingPermission,
                        hasMediaContentControlPermission,
                        hasMediaRoutingControlPermission);
            }
        } finally {
@@ -323,6 +324,12 @@ class MediaRouter2ServiceImpl {
        }
    }

    @RequiresPermission(
            anyOf = {
                Manifest.permission.MEDIA_ROUTING_CONTROL,
                Manifest.permission.MEDIA_CONTENT_CONTROL
            },
            conditional = true)
    public void updateScanningState(
            @NonNull IMediaRouter2 router, @ScanningState int scanningState) {
        Objects.requireNonNull(router, "router must not be null");
@@ -1129,6 +1136,7 @@ class MediaRouter2ServiceImpl {
            int userId,
            boolean hasConfigureWifiDisplayPermission,
            boolean hasModifyAudioRoutingPermission,
            boolean hasMediaContentControlPermission,
            boolean hasMediaRoutingControlPermission) {
        final IBinder binder = router.asBinder();
        if (mAllRouterRecords.get(binder) != null) {
@@ -1147,6 +1155,7 @@ class MediaRouter2ServiceImpl {
                        packageName,
                        hasConfigureWifiDisplayPermission,
                        hasModifyAudioRoutingPermission,
                        hasMediaContentControlPermission,
                        hasMediaRoutingControlPermission);
        try {
            binder.linkToDeath(routerRecord, 0);
@@ -1209,6 +1218,12 @@ class MediaRouter2ServiceImpl {
        disposeUserIfNeededLocked(userRecord); // since router removed from user
    }

    @RequiresPermission(
            anyOf = {
                Manifest.permission.MEDIA_ROUTING_CONTROL,
                Manifest.permission.MEDIA_CONTENT_CONTROL
            },
            conditional = true)
    @GuardedBy("mLock")
    private void updateScanningStateLocked(
            @NonNull IMediaRouter2 router, @ScanningState int scanningState) {
@@ -1219,7 +1234,11 @@ class MediaRouter2ServiceImpl {
            return;
        }

        boolean enableScanViaMediaContentControl =
                Flags.enableFullScanWithMediaContentControl()
                        && routerRecord.mHasMediaContentControlPermission;
        if (scanningState == SCANNING_STATE_SCANNING_FULL
                && !enableScanViaMediaContentControl
                && !routerRecord.mHasMediaRoutingControl) {
            throw new SecurityException("Screen off scan requires MEDIA_ROUTING_CONTROL");
        }
@@ -1672,7 +1691,11 @@ class MediaRouter2ServiceImpl {
            return;
        }

        boolean enableScanViaMediaContentControl =
                Flags.enableFullScanWithMediaContentControl()
                        && managerRecord.mHasMediaContentControl;
        if (!managerRecord.mHasMediaRoutingControl
                && !enableScanViaMediaContentControl
                && scanningState == SCANNING_STATE_SCANNING_FULL) {
            throw new SecurityException("Screen off scan requires MEDIA_ROUTING_CONTROL");
        }
@@ -2063,9 +2086,10 @@ class MediaRouter2ServiceImpl {
        public final int mPid;
        public final boolean mHasConfigureWifiDisplayPermission;
        public final boolean mHasModifyAudioRoutingPermission;
        public final boolean mHasMediaContentControlPermission;
        public final boolean mHasMediaRoutingControl;
        public final AtomicBoolean mHasBluetoothRoutingPermission;
        public final int mRouterId;
        public final boolean mHasMediaRoutingControl;
        public @ScanningState int mScanningState = SCANNING_STATE_NOT_SCANNING;

        public RouteDiscoveryPreference mDiscoveryPreference;
@@ -2079,6 +2103,7 @@ class MediaRouter2ServiceImpl {
                String packageName,
                boolean hasConfigureWifiDisplayPermission,
                boolean hasModifyAudioRoutingPermission,
                boolean hasMediaContentControlPermission,
                boolean hasMediaRoutingControl) {
            mUserRecord = userRecord;
            mPackageName = packageName;
@@ -2089,9 +2114,10 @@ class MediaRouter2ServiceImpl {
            mPid = pid;
            mHasConfigureWifiDisplayPermission = hasConfigureWifiDisplayPermission;
            mHasModifyAudioRoutingPermission = hasModifyAudioRoutingPermission;
            mHasMediaContentControlPermission = hasMediaContentControlPermission;
            mHasMediaRoutingControl = hasMediaRoutingControl;
            mHasBluetoothRoutingPermission =
                    new AtomicBoolean(checkCallerHasBluetoothPermissions(mPid, mUid));
            mHasMediaRoutingControl = hasMediaRoutingControl;
            mRouterId = mNextRouterOrManagerId.getAndIncrement();
        }

+6 −0
Original line number Diff line number Diff line
@@ -443,6 +443,12 @@ public final class MediaRouterService extends IMediaRouterService.Stub

    // Binder call
    @Override
    @RequiresPermission(
            anyOf = {
                Manifest.permission.MEDIA_ROUTING_CONTROL,
                Manifest.permission.MEDIA_CONTENT_CONTROL
            },
            conditional = true)
    public void updateScanningStateWithRouter2(
            IMediaRouter2 router, @ScanningState int scanningState) {
        mService2.updateScanningState(router, scanningState);