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

Commit 9889b084 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[MediaProjection] Unregister IMediaProjectionCallback for the...

Merge "[MediaProjection] Unregister IMediaProjectionCallback for the VirtualDisplay" into tm-qpr-dev
parents 33ee3b71 9390121f
Loading
Loading
Loading
Loading
+29 −4
Original line number Original line Diff line number Diff line
@@ -35,6 +35,7 @@ import static com.android.server.display.DisplayDeviceInfo.FLAG_OWN_DISPLAY_GROU
import static com.android.server.display.DisplayDeviceInfo.FLAG_TOUCH_FEEDBACK_DISABLED;
import static com.android.server.display.DisplayDeviceInfo.FLAG_TOUCH_FEEDBACK_DISABLED;
import static com.android.server.display.DisplayDeviceInfo.FLAG_TRUSTED;
import static com.android.server.display.DisplayDeviceInfo.FLAG_TRUSTED;


import android.annotation.Nullable;
import android.content.Context;
import android.content.Context;
import android.graphics.Point;
import android.graphics.Point;
import android.hardware.display.IVirtualDisplayCallback;
import android.hardware.display.IVirtualDisplayCallback;
@@ -110,15 +111,20 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
        } else {
        } else {
            uniqueId = UNIQUE_ID_PREFIX + ownerPackageName + ":" + uniqueId;
            uniqueId = UNIQUE_ID_PREFIX + ownerPackageName + ":" + uniqueId;
        }
        }
        MediaProjectionCallback mediaProjectionCallback =  null;
        if (projection != null) {
            mediaProjectionCallback = new MediaProjectionCallback(appToken);
        }
        VirtualDisplayDevice device = new VirtualDisplayDevice(displayToken, appToken,
        VirtualDisplayDevice device = new VirtualDisplayDevice(displayToken, appToken,
                ownerUid, ownerPackageName, surface, flags, new Callback(callback, mHandler),
                ownerUid, ownerPackageName, surface, flags,
                new Callback(callback, mHandler), projection, mediaProjectionCallback,
                uniqueId, uniqueIndex, virtualDisplayConfig);
                uniqueId, uniqueIndex, virtualDisplayConfig);


        mVirtualDisplayDevices.put(appToken, device);
        mVirtualDisplayDevices.put(appToken, device);


        try {
        try {
            if (projection != null) {
            if (projection != null) {
                projection.registerCallback(new MediaProjectionCallback(appToken));
                projection.registerCallback(mediaProjectionCallback);
            }
            }
            appToken.linkToDeath(device, 0);
            appToken.linkToDeath(device, 0);
        } catch (RemoteException ex) {
        } catch (RemoteException ex) {
@@ -203,7 +209,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
    }
    }


    private void handleMediaProjectionStoppedLocked(IBinder appToken) {
    private void handleMediaProjectionStoppedLocked(IBinder appToken) {
        VirtualDisplayDevice device = mVirtualDisplayDevices.remove(appToken);
        VirtualDisplayDevice device = mVirtualDisplayDevices.get(appToken);
        if (device != null) {
        if (device != null) {
            Slog.i(TAG, "Virtual display device released because media projection stopped: "
            Slog.i(TAG, "Virtual display device released because media projection stopped: "
                    + device.mName);
                    + device.mName);
@@ -223,6 +229,8 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
        final String mName;
        final String mName;
        private final int mFlags;
        private final int mFlags;
        private final Callback mCallback;
        private final Callback mCallback;
        @Nullable private final IMediaProjection mProjection;
        @Nullable private final IMediaProjectionCallback mMediaProjectionCallback;


        private int mWidth;
        private int mWidth;
        private int mHeight;
        private int mHeight;
@@ -240,7 +248,8 @@ public class VirtualDisplayAdapter extends DisplayAdapter {


        public VirtualDisplayDevice(IBinder displayToken, IBinder appToken,
        public VirtualDisplayDevice(IBinder displayToken, IBinder appToken,
                int ownerUid, String ownerPackageName, Surface surface, int flags,
                int ownerUid, String ownerPackageName, Surface surface, int flags,
                Callback callback, String uniqueId, int uniqueIndex,
                Callback callback, IMediaProjection projection,
                IMediaProjectionCallback mediaProjectionCallback, String uniqueId, int uniqueIndex,
                VirtualDisplayConfig virtualDisplayConfig) {
                VirtualDisplayConfig virtualDisplayConfig) {
            super(VirtualDisplayAdapter.this, displayToken, uniqueId, getContext());
            super(VirtualDisplayAdapter.this, displayToken, uniqueId, getContext());
            mAppToken = appToken;
            mAppToken = appToken;
@@ -254,6 +263,8 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
            mSurface = surface;
            mSurface = surface;
            mFlags = flags;
            mFlags = flags;
            mCallback = callback;
            mCallback = callback;
            mProjection = projection;
            mMediaProjectionCallback = mediaProjectionCallback;
            mDisplayState = Display.STATE_UNKNOWN;
            mDisplayState = Display.STATE_UNKNOWN;
            mPendingChanges |= PENDING_SURFACE_CHANGE;
            mPendingChanges |= PENDING_SURFACE_CHANGE;
            mUniqueIndex = uniqueIndex;
            mUniqueIndex = uniqueIndex;
@@ -269,6 +280,13 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
                Slog.i(TAG, "Virtual display device released because application token died: "
                Slog.i(TAG, "Virtual display device released because application token died: "
                    + mOwnerPackageName);
                    + mOwnerPackageName);
                destroyLocked(false);
                destroyLocked(false);
                if (mProjection != null && mMediaProjectionCallback != null) {
                    try {
                        mProjection.unregisterCallback(mMediaProjectionCallback);
                    } catch (RemoteException e) {
                        Slog.w(TAG, "Failed to unregister callback in binderDied", e);
                    }
                }
                sendDisplayDeviceEventLocked(this, DISPLAY_DEVICE_EVENT_REMOVED);
                sendDisplayDeviceEventLocked(this, DISPLAY_DEVICE_EVENT_REMOVED);
            }
            }
        }
        }
@@ -279,6 +297,13 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
                mSurface = null;
                mSurface = null;
            }
            }
            SurfaceControl.destroyDisplay(getDisplayTokenLocked());
            SurfaceControl.destroyDisplay(getDisplayTokenLocked());
            if (mProjection != null && mMediaProjectionCallback != null) {
                try {
                    mProjection.unregisterCallback(mMediaProjectionCallback);
                } catch (RemoteException e) {
                    Slog.w(TAG, "Failed to unregister callback in destroy", e);
                }
            }
            if (binderAlive) {
            if (binderAlive) {
                mCallback.dispatchDisplayStopped();
                mCallback.dispatchDisplayStopped();
            }
            }