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

Commit 883aa6ce authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "System UI: Add config boolean to enable screen capture on desktop" into main

parents 54488259 c968696c
Loading
Loading
Loading
Loading
+83 −1
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import static org.junit.Assert.assertFalse;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -33,6 +34,7 @@ import static org.mockito.Mockito.when;
import android.app.Dialog;
import android.media.projection.StopReason;
import android.os.Handler;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.FlagsParameterization;
import android.service.quicksettings.Tile;
@@ -44,6 +46,7 @@ import com.android.internal.logging.MetricsLogger;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.DialogTransitionAnimator;
import com.android.systemui.classifier.FalsingManagerFake;
import com.android.systemui.Flags;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger;
import com.android.systemui.plugins.ActivityStarter;
@@ -216,6 +219,86 @@ public class ScreenRecordTileTest extends SysuiTestCase {
        verify(mController, times(1)).cancelCountdown();
    }

    // Test that clicking the tile is NOP if opened from desktop.
    @Test
    @EnableFlags(Flags.FLAG_DESKTOP_SCREEN_CAPTURE)
    public void testClickFromDesktop() {
        when(mController.isStarting()).thenReturn(false);
        when(mController.isRecording()).thenReturn(false);

        mTile.refreshState();
        mTestableLooper.processAllMessages();

        // Override the resource to enable desktop features.
        overrideResource(R.bool.config_enableDesktopScreenCapture, true);

        mTile.handleClick(null /* view */);
        mTestableLooper.processAllMessages();
        verify(mController, never()).createScreenRecordDialog(null);
    }

    // Test that clicking the tile in desktop opens the recording dialog if flag is disabled.
    @Test
    @DisableFlags(Flags.FLAG_DESKTOP_SCREEN_CAPTURE)
    public void testClickFromDesktopFlagDisabled() {
        when(mController.isStarting()).thenReturn(false);
        when(mController.isRecording()).thenReturn(false);

        mTile.refreshState();
        mTestableLooper.processAllMessages();

        // Override the resource to enable desktop features.
        overrideResource(R.bool.config_enableDesktopScreenCapture, true);

        mTile.handleClick(null /* view */);
        mTestableLooper.processAllMessages();

        ArgumentCaptor<Runnable> onStartRecordingClicked = ArgumentCaptor.forClass(Runnable.class);
        verify(mController).createScreenRecordDialog(onStartRecordingClicked.capture());
    }

    // Test that clicking the tile not in desktop opens the recording dialog even if flag is
    // enabled.
    @Test
    @EnableFlags(Flags.FLAG_DESKTOP_SCREEN_CAPTURE)
    public void testClickNotFromDesktopFlagEnabled() {
        when(mController.isStarting()).thenReturn(false);
        when(mController.isRecording()).thenReturn(false);

        mTile.refreshState();
        mTestableLooper.processAllMessages();

        // Override the resource to disable desktop features.
        overrideResource(R.bool.config_enableDesktopScreenCapture, false);

        mTile.handleClick(null /* view */);
        mTestableLooper.processAllMessages();

        ArgumentCaptor<Runnable> onStartRecordingClicked = ArgumentCaptor.forClass(Runnable.class);
        verify(mController).createScreenRecordDialog(onStartRecordingClicked.capture());
    }

    // Test that clicking the tile not in desktop opens the recording dialog when the flag is
    // disabled.
    @Test
    @DisableFlags(Flags.FLAG_DESKTOP_SCREEN_CAPTURE)
    public void testClickNotFromDesktopFlagDisabled() {
        when(mController.isStarting()).thenReturn(false);
        when(mController.isRecording()).thenReturn(false);

        mTile.refreshState();
        mTestableLooper.processAllMessages();

        // Override the resource to disable desktop features.
        overrideResource(R.bool.config_enableDesktopScreenCapture, false);

        mTile.handleClick(null /* view */);
        mTestableLooper.processAllMessages();

        ArgumentCaptor<Runnable> onStartRecordingClicked = ArgumentCaptor.forClass(Runnable.class);
        verify(mController).createScreenRecordDialog(onStartRecordingClicked.capture());
    }

    // Test that the tile is active and labeled correctly when the controller is recording
    @Test
    public void testIsRecording() {
@@ -379,5 +462,4 @@ public class ScreenRecordTileTest extends SysuiTestCase {
            return QSTileImpl.ResourceIcon.get(resId);
        }
    }

}
+68 −0
Original line number Diff line number Diff line
@@ -19,8 +19,11 @@ package com.android.systemui.qs.tiles.impl.screenrecord.domain.interactor
import android.app.Dialog
import android.media.projection.StopReason
import android.os.UserHandle
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.DialogTransitionAnimator
import com.android.systemui.animation.Expandable
@@ -31,6 +34,7 @@ import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger
import com.android.systemui.plugins.ActivityStarter.OnDismissAction
import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor
import com.android.systemui.qs.tiles.base.domain.model.QSTileInputTestKtx
import com.android.systemui.res.R
import com.android.systemui.screenrecord.ScreenRecordUxController
import com.android.systemui.screenrecord.data.model.ScreenRecordModel
import com.android.systemui.screenrecord.data.repository.ScreenRecordRepositoryImpl
@@ -39,6 +43,7 @@ import com.android.systemui.testKosmos
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
@@ -67,6 +72,7 @@ class ScreenRecordTileUserActionInteractorTest : SysuiTestCase() {

    private val underTest =
        ScreenRecordTileUserActionInteractor(
            context,
            testScope.testScheduler,
            testScope.testScheduler,
            screenRecordRepository,
@@ -87,6 +93,68 @@ class ScreenRecordTileUserActionInteractorTest : SysuiTestCase() {
        verify(screenRecordUxController).cancelCountdown()
    }

    // Test that clicking the tile is NOP if opened from desktop.
    @Test
    @EnableFlags(Flags.FLAG_DESKTOP_SCREEN_CAPTURE)
    fun handleClick_fromDesktop_flagEnabled_isNOP() = runTest {
        val recordingModel = ScreenRecordModel.DoingNothing

        // Override the resource to enable desktop features.
        underTest.apply { overrideResource(R.bool.config_enableDesktopScreenCapture, true) }

        underTest.handleInput(QSTileInputTestKtx.click(recordingModel))
        val onStartRecordingClickedCaptor = argumentCaptor<Runnable>()
        verify(screenRecordUxController, never())
            .createScreenRecordDialog(onStartRecordingClickedCaptor.capture())
    }

    // Test that clicking the tile in desktop opens the recording dialog if flag is disabled.
    @Test
    @DisableFlags(Flags.FLAG_DESKTOP_SCREEN_CAPTURE)
    fun handleClick_fromDesktop_flagDisabled_opensRecordingDialog() = runTest {
        val recordingModel = ScreenRecordModel.DoingNothing

        // Override the resource to enable desktop features.
        underTest.apply { overrideResource(R.bool.config_enableDesktopScreenCapture, true) }

        underTest.handleInput(QSTileInputTestKtx.click(recordingModel))
        val onStartRecordingClickedCaptor = argumentCaptor<Runnable>()
        verify(screenRecordUxController)
            .createScreenRecordDialog(onStartRecordingClickedCaptor.capture())
    }

    // Test that clicking the tile not in desktop opens the recording dialog even if flag is
    // enabled.
    @Test
    @EnableFlags(Flags.FLAG_DESKTOP_SCREEN_CAPTURE)
    fun handleClick_notFromDesktop_flagEnabled_opensRecordingDialog() = runTest {
        val recordingModel = ScreenRecordModel.DoingNothing

        // Override the resource to disable desktop features.
        underTest.apply { overrideResource(R.bool.config_enableDesktopScreenCapture, false) }

        underTest.handleInput(QSTileInputTestKtx.click(recordingModel))
        val onStartRecordingClickedCaptor = argumentCaptor<Runnable>()
        verify(screenRecordUxController)
            .createScreenRecordDialog(onStartRecordingClickedCaptor.capture())
    }

    // Test that clicking the tile not in desktop opens the recording dialog when the flag is
    // disabled.
    @Test
    @DisableFlags(Flags.FLAG_DESKTOP_SCREEN_CAPTURE)
    fun handleClick_notFromDesktop_flagDisabled_opensRecordingDialog() = runTest {
        val recordingModel = ScreenRecordModel.DoingNothing

        // Override the resource to disable desktop features.
        underTest.apply { overrideResource(R.bool.config_enableDesktopScreenCapture, false) }

        underTest.handleInput(QSTileInputTestKtx.click(recordingModel))
        val onStartRecordingClickedCaptor = argumentCaptor<Runnable>()
        verify(screenRecordUxController)
            .createScreenRecordDialog(onStartRecordingClickedCaptor.capture())
    }

    @Test
    fun handleClick_whenRecording_stopRecording() = runTest {
        val recordingModel = ScreenRecordModel.Recording
+3 −0
Original line number Diff line number Diff line
@@ -1135,6 +1135,9 @@
    <!-- If AOD can show an ambient version of the wallpaper (-1 means ignore) -->
    <integer name="config_dozeSupportsAodWallpaperOverride">-1</integer>

    <!-- Whether to enable the desktop screen capture. -->
    <bool name="config_enableDesktopScreenCapture">false</bool>

    <!-- Whether to enable features improving large screen interaction -->
    <bool name="config_improveLargeScreenInteractionOnLockscreen">false</bool>
</resources>
+7 −2
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ import com.android.systemui.screenrecord.data.model.ScreenRecordModel;
import com.android.systemui.settings.UserContextProvider;
import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.Utils;

import java.util.function.Consumer;

@@ -127,9 +128,13 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState>

    @Override
    protected void handleClick(@Nullable Expandable expandable) {
        if (Utils.isDesktopScreenCaptureEnabled(mContext)) {
            // TODO(b/412723197): open screen capture toolbar when it becomes available.
        } else {
            // TODO(b/409330121): call mController.onScreenRecordQsTileClick() instead.
            handleClick(() -> showDialog(expandable));
        }
    }

    private void showDialog(@Nullable Expandable expandable) {
        final Dialog dialog = mController.createScreenRecordDialog(
+21 −14
Original line number Diff line number Diff line
@@ -16,12 +16,14 @@

package com.android.systemui.qs.tiles.impl.screenrecord.domain.interactor

import android.content.Context
import android.media.projection.StopReason
import android.util.Log
import com.android.internal.jank.InteractionJankMonitor
import com.android.systemui.animation.DialogCuj
import com.android.systemui.animation.DialogTransitionAnimator
import com.android.systemui.animation.Expandable
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
@@ -35,6 +37,7 @@ import com.android.systemui.screenrecord.ScreenRecordUxController
import com.android.systemui.screenrecord.data.model.ScreenRecordModel
import com.android.systemui.screenrecord.data.repository.ScreenRecordRepository
import com.android.systemui.statusbar.phone.KeyguardDismissUtil
import com.android.systemui.util.Utils
import javax.inject.Inject
import kotlin.coroutines.CoroutineContext
import kotlinx.coroutines.withContext
@@ -43,6 +46,7 @@ import kotlinx.coroutines.withContext
class ScreenRecordTileUserActionInteractor
@Inject
constructor(
    @Application private val context: Context,
    @Main private val mainContext: CoroutineContext,
    @Background private val backgroundContext: CoroutineContext,
    private val screenRecordRepository: ScreenRecordRepository,
@@ -57,6 +61,9 @@ constructor(
        with(input) {
            when (action) {
                is QSTileUserAction.Click -> {
                    if (Utils.isDesktopScreenCaptureEnabled(context)) {
                        // TODO(b/412723197): open screen capture toolbar when it becomes available.
                    } else {
                        when (data) {
                            is ScreenRecordModel.Starting -> {
                                Log.d(TAG, "Cancelling countdown")
@@ -73,6 +80,7 @@ constructor(
                                }
                        }
                    }
                }
                is QSTileUserAction.LongClick -> {} // no-op
                is QSTileUserAction.ToggleClick -> {}
            }
@@ -96,8 +104,7 @@ constructor(
        }

        // We animate from the touched expandable only if we are not on the keyguard, given that if
        // we
        // are we will dismiss it which will also collapse the shade.
        // we are we will dismiss it which will also collapse the shade.
        val shouldAnimateFromExpandable =
            expandable != null && !keyguardInteractor.isKeyguardCurrentlyShowing()
        val dismissAction =
Loading