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

Commit e717ac53 authored by Bryce Lee's avatar Bryce Lee Committed by Android (Google) Code Review
Browse files

Merge "Retain Future for Surface Request."

parents 9312e1ad c2b8ad9b
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);
    }
}