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

Commit 9654d698 authored by Chris Göllner's avatar Chris Göllner
Browse files

[Media Projection] Finish server side logging of CAPTURE IN PROGRESS

Test: atest FrameworksServicesTests:MediaProjectionManagerServiceTest
Test: atest FrameworksServicesTests:MediaProjectionMetricsLoggerTest
Fixes: 304731666
Change-Id: I819a8b2ac93a0b78f50f222b2960258ec32c761d
parent 359bdc62
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -76,7 +76,6 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FrameworkStatsLog;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.Watchdog;
@@ -385,10 +384,12 @@ public final class MediaProjectionManagerService extends SystemService
            if (mProjectionGrant != null) {
                // Cache the session details.
                mProjectionGrant.mSession = incomingSession;
                mMediaProjectionMetricsLogger.notifyProjectionStateChange(
                        mProjectionGrant.uid,
                        FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_CAPTURING_IN_PROGRESS,
                        FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__CREATION_SOURCE__CREATION_SOURCE_UNKNOWN);
                if (incomingSession != null) {
                    // Only log in progress when session is not null.
                    // setContentRecordingSession is called with a null session for the stop case.
                    mMediaProjectionMetricsLogger.logInProgress(
                            mProjectionGrant.uid, incomingSession.getTargetUid());
                }
                dispatchSessionSet(mProjectionGrant.getProjectionInfo(), incomingSession);
            }
            return true;
+19 −6
Original line number Diff line number Diff line
@@ -16,6 +16,11 @@

package com.android.server.media.projection;

import static com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__CREATION_SOURCE__CREATION_SOURCE_UNKNOWN;
import static com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_CAPTURING_IN_PROGRESS;
import static com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_INITIATED;
import static com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_STOPPED;

import android.content.Context;

import com.android.internal.util.FrameworkStatsLog;
@@ -82,25 +87,33 @@ public class MediaProjectionMetricsLogger {
                        : (int) durationSinceLastActiveSession.toSeconds();
        write(
                mSessionIdGenerator.createAndGetNewSessionId(),
                FrameworkStatsLog
                        .MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_INITIATED,
                MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_INITIATED,
                hostUid,
                TARGET_UID_UNKNOWN,
                timeSinceLastActiveInSeconds,
                sessionCreationSource);
    }

    /** Logs that the virtual display is created and capturing the selected region begins. */
    public void logInProgress(int hostUid, int targetUid) {
        write(
                mSessionIdGenerator.getCurrentSessionId(),
                MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_CAPTURING_IN_PROGRESS,
                hostUid,
                targetUid,
                TIME_SINCE_LAST_ACTIVE_UNKNOWN,
                MEDIA_PROJECTION_STATE_CHANGED__CREATION_SOURCE__CREATION_SOURCE_UNKNOWN);
    }

    /** Logs that the capturing stopped, either normally or because of error. */
    public void logStopped(int hostUid, int targetUid) {
        write(
                mSessionIdGenerator.getCurrentSessionId(),
                FrameworkStatsLog
                        .MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_STOPPED,
                MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_STOPPED,
                hostUid,
                targetUid,
                TIME_SINCE_LAST_ACTIVE_UNKNOWN,
                FrameworkStatsLog
                        .MEDIA_PROJECTION_STATE_CHANGED__CREATION_SOURCE__CREATION_SOURCE_UNKNOWN);
                MEDIA_PROJECTION_STATE_CHANGED__CREATION_SOURCE__CREATION_SOURCE_UNKNOWN);
        mTimestampStore.registerActiveSessionEnded();
    }

+63 −6
Original line number Diff line number Diff line
@@ -26,11 +26,10 @@ import static android.media.projection.ReviewGrantedConsentResult.UNKNOWN;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;

import static com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_CAPTURING_IN_PROGRESS;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atLeastOnce;
@@ -69,7 +68,6 @@ import androidx.test.filters.FlakyTest;
import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;

import com.android.internal.util.FrameworkStatsLog;
import com.android.server.LocalServices;
import com.android.server.testutils.OffsettableClock;
import com.android.server.wm.WindowManagerInternal;
@@ -837,10 +835,69 @@ public class MediaProjectionManagerServiceTest {

        service.setContentRecordingSession(DISPLAY_SESSION);

        verify(mMediaProjectionMetricsLogger).notifyProjectionStateChange(
        verify(mMediaProjectionMetricsLogger).logInProgress(
                projection.uid,
                MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_CAPTURING_IN_PROGRESS,
                FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__CREATION_SOURCE__CREATION_SOURCE_UNKNOWN
                DISPLAY_SESSION.getTargetUid()
        );
    }

    @Test
    public void setContentRecordingSession_taskSession_logsCaptureInProgressWithTargetUid()
            throws Exception {
        mService.addCallback(mWatcherCallback);
        MediaProjectionManagerService service =
                new MediaProjectionManagerService(mContext, mMediaProjectionMetricsLoggerInjector);
        MediaProjectionManagerService.MediaProjection projection =
                startProjectionPreconditions(service);
        projection.start(mIMediaProjectionCallback);
        doReturn(true)
                .when(mWindowManagerInternal)
                .setContentRecordingSession(any(ContentRecordingSession.class));
        int targetUid = 123455;

        ContentRecordingSession taskSession =
                ContentRecordingSession.createTaskSession(mock(IBinder.class), targetUid);
        service.setContentRecordingSession(taskSession);

        verify(mMediaProjectionMetricsLogger).logInProgress(projection.uid, targetUid);
    }

    @Test
    public void setContentRecordingSession_failure_doesNotLogCaptureInProgress() throws Exception {
        mService.addCallback(mWatcherCallback);
        MediaProjectionManagerService service =
                new MediaProjectionManagerService(mContext, mMediaProjectionMetricsLoggerInjector);
        MediaProjectionManagerService.MediaProjection projection =
                startProjectionPreconditions(service);
        projection.start(mIMediaProjectionCallback);
        doReturn(false).when(mWindowManagerInternal).setContentRecordingSession(
                any(ContentRecordingSession.class));

        service.setContentRecordingSession(DISPLAY_SESSION);

        verify(mMediaProjectionMetricsLogger, never()).logInProgress(
                anyInt(),
                anyInt()
        );
    }

    @Test
    public void setContentRecordingSession_sessionNull_doesNotLogCaptureInProgress()
            throws Exception {
        mService.addCallback(mWatcherCallback);
        MediaProjectionManagerService service =
                new MediaProjectionManagerService(mContext, mMediaProjectionMetricsLoggerInjector);
        MediaProjectionManagerService.MediaProjection projection =
                startProjectionPreconditions(service);
        projection.start(mIMediaProjectionCallback);
        doReturn(true).when(mWindowManagerInternal).setContentRecordingSession(
                any(ContentRecordingSession.class));

        service.setContentRecordingSession(null);

        verify(mMediaProjectionMetricsLogger, never()).logInProgress(
                anyInt(),
                anyInt()
        );
    }

+74 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.media.projection;

import static com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__CREATION_SOURCE__CREATION_SOURCE_UNKNOWN;
import static com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_CAPTURING_IN_PROGRESS;
import static com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_INITIATED;
import static com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_STOPPED;
import static com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_UNKNOWN;
@@ -233,6 +234,79 @@ public class MediaProjectionMetricsLoggerTest {
        inOrder.verify(mTimestampStore).registerActiveSessionEnded();
    }

    @Test
    public void logInProgress_logsStateChangedAtomId() {
        mLogger.logInProgress(TEST_HOST_UID, TEST_TARGET_UID);

        verifyStateChangedAtomIdLogged();
    }

    @Test
    public void logInProgress_logsCurrentSessionId() {
        int currentSessionId = 987;
        when(mSessionIdGenerator.getCurrentSessionId()).thenReturn(currentSessionId);

        mLogger.logInProgress(TEST_HOST_UID, TEST_TARGET_UID);

        verifySessionIdLogged(currentSessionId);
    }

    @Test
    public void logInProgress_logsStateInProgress() {
        mLogger.logInProgress(TEST_HOST_UID, TEST_TARGET_UID);

        verifyStateLogged(
                MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_CAPTURING_IN_PROGRESS);
    }

    @Test
    public void logInProgress_logsHostUid() {
        mLogger.logInProgress(TEST_HOST_UID, TEST_TARGET_UID);

        verifyHostUidLogged(TEST_HOST_UID);
    }

    @Test
    public void logInProgress_logsTargetUid() {
        mLogger.logInProgress(TEST_HOST_UID, TEST_TARGET_UID);

        verifyTargetUidLogged(TEST_TARGET_UID);
    }

    @Test
    public void logInProgress_logsUnknownTimeSinceLastActive() {
        mLogger.logInProgress(TEST_HOST_UID, TEST_TARGET_UID);

        verifyTimeSinceLastActiveSessionLogged(-1);
    }

    @Test
    public void logInProgress_logsUnknownSessionCreationSource() {
        mLogger.logInProgress(TEST_HOST_UID, TEST_TARGET_UID);

        verifyCreationSourceLogged(
                MEDIA_PROJECTION_STATE_CHANGED__CREATION_SOURCE__CREATION_SOURCE_UNKNOWN);
    }

    @Test
    public void logInProgress_logsPreviousState() {
        mLogger.logInitiated(TEST_HOST_UID, TEST_CREATION_SOURCE);
        verifyPreviousStateLogged(
                MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_UNKNOWN);

        mLogger.logInProgress(TEST_HOST_UID, TEST_TARGET_UID);
        verifyPreviousStateLogged(
                MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_INITIATED);

        mLogger.logStopped(TEST_HOST_UID, TEST_CREATION_SOURCE);
        verifyPreviousStateLogged(
                MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_CAPTURING_IN_PROGRESS);

        mLogger.logInProgress(TEST_HOST_UID, TEST_CREATION_SOURCE);
        verifyPreviousStateLogged(
                MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_STOPPED);
    }

    private void verifyStateChangedAtomIdLogged() {
        verify(mFrameworkStatsLogWrapper)
                .write(