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

Commit 6fc8f328 authored by dakinola's avatar dakinola Committed by Daniel Akinola
Browse files

Always updateRecording in ContentRecordingController#setContentRecordingSession

Race condition in DisplayManagerService meant that sometimes the boolean check gating updateRecording was unintentionally false, so now we always updateRecording to ensure that there is always an attempt to add new content to a freshly created DisplayContent used for mirroring.

Bug: 290911074
Test: atest CtsSurfaceControlTests:android.view.surfacecontrol.cts.SurfaceViewSyncTest#testSurfaceViewFixedSizeChanges --iterations 10
Test: atest CtsWindowManagerDeviceTestCases:android.server.wm.SurfaceSyncGroupContinuousTest#testSurfaceControlViewHostIPCSync_Slow --iterations 10
Test: atest WmTests:ContentRecorderTests
Test: atest WmTests:ContentRecordingControllerTests
Change-Id: I0db6f4fdb173fdab704f8cc93556ea65bc50d84c
parent d414349d
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -117,11 +117,12 @@ final class ContentRecordingController {
            }
            incomingDisplayContent.setContentRecordingSession(incomingSession);
            // Updating scenario: Explicitly ask ContentRecorder to update, since no config or
            // display change will trigger an update from the DisplayContent.
            if (hasSessionUpdatedWithConsent) {
            // display change will trigger an update from the DisplayContent. There exists a
            // scenario where a DisplayContent is created, but it's ContentRecordingSession hasn't
            // been set yet due to a race condition. On creation, updateRecording fails to start
            // recording, so now this call guarantees recording will be started from somewhere.
            incomingDisplayContent.updateRecording();
        }
        }
        // Takeover and stopping scenario: stop recording on the pre-existing session.
        if (mSession != null && !hasSessionUpdatedWithConsent) {
            ProtoLog.v(WM_DEBUG_CONTENT_RECORDING,
+2 −1
Original line number Diff line number Diff line
@@ -123,6 +123,7 @@ public class ContentRecordingControllerTests extends WindowTestsBase {
        controller.setContentRecordingSessionLocked(mWaitingDisplaySession, mWm);
        verify(mVirtualDisplayContent, atLeastOnce()).setContentRecordingSession(
                mWaitingDisplaySession);
        verify(mVirtualDisplayContent).updateRecording();

        // WHEN updating the session on the same display, so no longer waiting to record.
        ContentRecordingSession sessionUpdate = ContentRecordingSession.createTaskSession(
@@ -135,7 +136,7 @@ public class ContentRecordingControllerTests extends WindowTestsBase {
        // THEN the session was accepted.
        assertThat(resultingSession).isEqualTo(sessionUpdate);
        verify(mVirtualDisplayContent, atLeastOnce()).setContentRecordingSession(sessionUpdate);
        verify(mVirtualDisplayContent).updateRecording();
        verify(mVirtualDisplayContent, atLeastOnce()).updateRecording();
    }

    @Test