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

Commit c2b8ad9b authored by Bryce Lee's avatar Bryce Lee
Browse files

Retain Future for Surface Request.

This change retains the future returned from requesting
the communal surface so that it can be canceled if
superseded by another request.

Bug: 194939230
Test: atest CommunalSurfaceViewControllerTest#testCancelRequest
Change-Id: I1ca903532133cd5055facee1d3eb76d87286dd42
parent 9f446be5
Loading
Loading
Loading
Loading
+23 −8
Original line number Diff line number Diff line
@@ -51,6 +51,9 @@ public class CommunalSurfaceViewController extends ViewController<SurfaceView> {

    private int mCurrentState;

    // The current in-flight request for a surface package.
    private ListenableFuture<SurfaceControlViewHost.SurfacePackage> mCurrentSurfaceFuture;

    private final SurfaceHolder.Callback mSurfaceHolderCallback = new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(@NonNull SurfaceHolder holder) {
@@ -99,20 +102,30 @@ public class CommunalSurfaceViewController extends ViewController<SurfaceView> {

        mCurrentState = newState;

        if (newState == STATE_CAN_SHOW_SURFACE) {
            showSurface();
        }
        showSurface(newState == STATE_CAN_SHOW_SURFACE);
    }

    private void showSurface() {
    private void showSurface(boolean show) {
        mView.setWillNotDraw(false);

        final ListenableFuture<SurfaceControlViewHost.SurfacePackage> surfaceFuture =
                mSource.requestCommunalSurface(mView.getHostToken(),
        if (!show) {
            // If the surface is no longer showing, cancel any in-flight requests.
            if (mCurrentSurfaceFuture != null) {
                mCurrentSurfaceFuture.cancel(true);
                mCurrentSurfaceFuture = null;
            }

            mView.setWillNotDraw(true);
            return;
        }

        // Since this method is only called when the state has changed, mCurrentSurfaceFuture should
        // be null here.
        mCurrentSurfaceFuture = mSource.requestCommunalSurface(mView.getHostToken(),
                        mView.getDisplay().getDisplayId(), mView.getMeasuredWidth(),
                        mView.getMeasuredHeight());

        surfaceFuture.addListener(new Runnable() {
        mCurrentSurfaceFuture.addListener(new Runnable() {
            @Override
            public void run() {
                try {
@@ -121,7 +134,9 @@ public class CommunalSurfaceViewController extends ViewController<SurfaceView> {
                        return;
                    }

                    SurfaceControlViewHost.SurfacePackage surfacePackage = surfaceFuture.get();
                    SurfaceControlViewHost.SurfacePackage surfacePackage =
                            mCurrentSurfaceFuture.get();
                    mCurrentSurfaceFuture = null;

                    if (DEBUG) {
                        Log.d(TAG, "Received surface package:" + surfacePackage);
+45 −0
Original line number Diff line number Diff line
@@ -16,8 +16,10 @@

package com.android.systemui.communal.service;

import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -109,6 +111,8 @@ public class CommunalSurfaceViewControllerTest extends SysuiTestCase {
        verify(mCommunalSource, times(0))
                .requestCommunalSurface(any(), anyInt(), anyInt(), anyInt());

        clearInvocations(mSurfaceView);

        // Request surface view once all conditions are met.
        mCallback.surfaceCreated(mSurfaceHolder);
        verify(mCommunalSource)
@@ -126,4 +130,45 @@ public class CommunalSurfaceViewControllerTest extends SysuiTestCase {
        verify(mSurfaceView).setZOrderOnTop(true);
        verify(mSurfaceView).setWillNotDraw(false);
    }

    // Invoked to setup surface view package.
    private void givenSurfacePresent() {
        mController.onViewAttached();
        mCallback.surfaceCreated(mSurfaceHolder);
        when(mSurfaceView.isAttachedToWindow()).thenReturn(true);
        mPackageFuture.set(mSurfacePackage);
        mFakeExecutor.runAllReady();
        clearInvocations(mSurfaceView);
    }

    @Test
    public void testClearOnDetach() {
        givenSurfacePresent();
        when(mSurfaceView.isAttachedToWindow()).thenReturn(false);
        mController.onViewDetached();
        verify(mSurfaceView).setWillNotDraw(true);
    }

    @Test
    public void testClearOnSurfaceDestroyed() {
        givenSurfacePresent();
        mCallback.surfaceDestroyed(mSurfaceHolder);
        verify(mSurfaceView).setWillNotDraw(true);
    }

    @Test
    public void testCancelRequest() {
        mController.onViewAttached();
        mCallback.surfaceCreated(mSurfaceHolder);
        when(mSurfaceView.isAttachedToWindow()).thenReturn(true);
        mFakeExecutor.runAllReady();
        clearInvocations(mSurfaceView);

        verify(mCommunalSource, times(1))
                .requestCommunalSurface(mHostToken, DISPLAY_ID, MEASURED_WIDTH, MEASURED_HEIGHT);

        mController.onViewDetached();
        assertTrue(mPackageFuture.isCancelled());
        verify(mSurfaceView).setWillNotDraw(true);
    }
}