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

Commit 9405a43f authored by Vishwajeet Rana's avatar Vishwajeet Rana Committed by Android (Google) Code Review
Browse files

Merge "1. Make media projection stop-dialogs non-remote controllable 2. This...

Merge "1. Make media projection stop-dialogs non-remote controllable 2. This change does not impact accessibility tools like TalkBack. Users can continue interacting with stop dialog as before. 3. The one-time stop dialog displayed at call end will now also prevent dismissal when tapping outside the dialog." into main
parents 48ed9e63 5b07c5a0
Loading
Loading
Loading
Loading
+37 −2
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@

package com.android.systemui.statusbar.chips.casttootherdevice.ui.view

import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.runner.RunWith
import android.content.ComponentName
import android.content.DialogInterface
import android.content.Intent
@@ -25,6 +23,11 @@ import android.content.applicationContext
import android.content.packageManager
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.view.View
import android.view.Window
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.Kosmos
@@ -43,10 +46,12 @@ import kotlin.test.Test
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever

@@ -250,6 +255,36 @@ class EndCastScreenToOtherDeviceDialogDelegateTest : SysuiTestCase() {
            assertThat(kosmos.fakeMediaProjectionRepository.stopProjectingInvoked).isTrue()
        }

    @Test
    @EnableFlags(com.android.media.projection.flags.Flags.FLAG_SHOW_STOP_DIALOG_POST_CALL_END)
    fun accessibilityDataSensitive_flagEnabled_appliesSetting() {
        createAndSetDelegate(ENTIRE_SCREEN)

        val window = mock<Window>()
        val decorView = mock<View>()
        whenever(sysuiDialog.window).thenReturn(window)
        whenever(window.decorView).thenReturn(decorView)

        underTest.beforeCreate(sysuiDialog, /* savedInstanceState= */ null)

        verify(decorView).setAccessibilityDataSensitive(View.ACCESSIBILITY_DATA_SENSITIVE_YES)
    }

    @Test
    @DisableFlags(com.android.media.projection.flags.Flags.FLAG_SHOW_STOP_DIALOG_POST_CALL_END)
    fun accessibilityDataSensitive_flagDisabled_doesNotApplySetting() {
        createAndSetDelegate(ENTIRE_SCREEN)

        val window = mock<Window>()
        val decorView = mock<View>()
        whenever(sysuiDialog.window).thenReturn(window)
        whenever(window.decorView).thenReturn(decorView)

        underTest.beforeCreate(sysuiDialog, /* savedInstanceState= */ null)

        verify(decorView, never()).setAccessibilityDataSensitive(any())
    }

    private fun createAndSetDelegate(state: MediaProjectionState.Projecting) {
        underTest =
            EndCastScreenToOtherDeviceDialogDelegate(
+38 −1
Original line number Diff line number Diff line
@@ -18,6 +18,10 @@ package com.android.systemui.statusbar.chips.casttootherdevice.ui.view

import android.content.DialogInterface
import android.content.applicationContext
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.view.View
import android.view.Window
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -37,10 +41,13 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever

@SmallTest
@RunWith(AndroidJUnit4::class)
@@ -132,7 +139,7 @@ class EndGenericCastToOtherDeviceDialogDelegateTest : SysuiTestCase() {
            verify(sysuiDialog)
                .setPositiveButton(
                    eq(R.string.cast_to_other_device_stop_dialog_button),
                    clickListener.capture()
                    clickListener.capture(),
                )

            // Verify that clicking the button stops the recording
@@ -144,6 +151,36 @@ class EndGenericCastToOtherDeviceDialogDelegateTest : SysuiTestCase() {
            assertThat(kosmos.fakeMediaRouterRepository.lastStoppedDevice).isEqualTo(device)
        }

    @Test
    @EnableFlags(com.android.media.projection.flags.Flags.FLAG_SHOW_STOP_DIALOG_POST_CALL_END)
    fun accessibilityDataSensitive_flagEnabled_appliesSetting() {
        createAndSetDelegate()

        val window = mock<Window>()
        val decorView = mock<View>()
        whenever(sysuiDialog.window).thenReturn(window)
        whenever(window.decorView).thenReturn(decorView)

        underTest.beforeCreate(sysuiDialog, /* savedInstanceState= */ null)

        verify(decorView).setAccessibilityDataSensitive(View.ACCESSIBILITY_DATA_SENSITIVE_YES)
    }

    @Test
    @DisableFlags(com.android.media.projection.flags.Flags.FLAG_SHOW_STOP_DIALOG_POST_CALL_END)
    fun accessibilityDataSensitive_flagDisabled_doesNotApplySetting() {
        createAndSetDelegate()

        val window = mock<Window>()
        val decorView = mock<View>()
        whenever(sysuiDialog.window).thenReturn(window)
        whenever(window.decorView).thenReturn(decorView)

        underTest.beforeCreate(sysuiDialog, /* savedInstanceState= */ null)

        verify(decorView, never()).setAccessibilityDataSensitive(any())
    }

    private fun createAndSetDelegate(deviceName: String? = null) {
        underTest =
            EndGenericCastToOtherDeviceDialogDelegate(
+36 −1
Original line number Diff line number Diff line
@@ -23,6 +23,10 @@ import android.content.Intent
import android.content.applicationContext
import android.content.packageManager
import android.content.pm.ApplicationInfo
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.view.View
import android.view.Window
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -45,6 +49,7 @@ import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever

@@ -130,7 +135,7 @@ class EndScreenRecordingDialogDelegateTest : SysuiTestCase() {
            verify(sysuiDialog)
                .setPositiveButton(
                    eq(R.string.screenrecord_stop_dialog_button),
                    clickListener.capture()
                    clickListener.capture(),
                )

            // Verify that clicking the button stops the recording
@@ -142,6 +147,36 @@ class EndScreenRecordingDialogDelegateTest : SysuiTestCase() {
            assertThat(kosmos.screenRecordRepository.stopRecordingInvoked).isTrue()
        }

    @Test
    @EnableFlags(com.android.media.projection.flags.Flags.FLAG_SHOW_STOP_DIALOG_POST_CALL_END)
    fun accessibilityDataSensitive_flagEnabled_appliesSetting() {
        createAndSetDelegate(recordedTask = null)

        val window = mock<Window>()
        val decorView = mock<View>()
        whenever(sysuiDialog.window).thenReturn(window)
        whenever(window.decorView).thenReturn(decorView)

        underTest.beforeCreate(sysuiDialog, /* savedInstanceState= */ null)

        verify(decorView).setAccessibilityDataSensitive(View.ACCESSIBILITY_DATA_SENSITIVE_YES)
    }

    @Test
    @DisableFlags(com.android.media.projection.flags.Flags.FLAG_SHOW_STOP_DIALOG_POST_CALL_END)
    fun accessibilityDataSensitive_flagDisabled_doesNotApplySetting() {
        createAndSetDelegate(recordedTask = null)

        val window = mock<Window>()
        val decorView = mock<View>()
        whenever(sysuiDialog.window).thenReturn(window)
        whenever(window.decorView).thenReturn(decorView)

        underTest.beforeCreate(sysuiDialog, /* savedInstanceState= */ null)

        verify(decorView, never()).setAccessibilityDataSensitive(any())
    }

    private fun createAndSetDelegate(recordedTask: ActivityManager.RunningTaskInfo?) {
        underTest =
            EndScreenRecordingDialogDelegate(
+50 −6
Original line number Diff line number Diff line
@@ -18,6 +18,11 @@ package com.android.systemui.statusbar.chips.sharetoapp.ui.view

import android.content.DialogInterface
import android.content.applicationContext
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.view.View
import android.view.Window
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.testScope
@@ -31,26 +36,26 @@ import kotlin.test.Test
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever

@SmallTest
@OptIn(ExperimentalCoroutinesApi::class)
@RunWith(AndroidJUnit4::class)
class EndGenericShareToAppDialogDelegateTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val sysuiDialog = mock<SystemUIDialog>()
    private val underTest =
        EndGenericShareToAppDialogDelegate(
            kosmos.endMediaProjectionDialogHelper,
            kosmos.applicationContext,
            stopAction = kosmos.mediaProjectionChipInteractor::stopProjecting,
        )
    private lateinit var underTest: EndGenericShareToAppDialogDelegate

    @Test
    fun positiveButton_clickStopsRecording() =
        kosmos.testScope.runTest {
            createAndSetDelegate()
            underTest.beforeCreate(sysuiDialog, /* savedInstanceState= */ null)

            assertThat(kosmos.fakeMediaProjectionRepository.stopProjectingInvoked).isFalse()
@@ -62,4 +67,43 @@ class EndGenericShareToAppDialogDelegateTest : SysuiTestCase() {

            assertThat(kosmos.fakeMediaProjectionRepository.stopProjectingInvoked).isTrue()
        }

    @Test
    @EnableFlags(com.android.media.projection.flags.Flags.FLAG_SHOW_STOP_DIALOG_POST_CALL_END)
    fun accessibilityDataSensitive_flagEnabled_appliesSetting() {
        createAndSetDelegate()

        val window = mock<Window>()
        val decorView = mock<View>()
        whenever(sysuiDialog.window).thenReturn(window)
        whenever(window.decorView).thenReturn(decorView)

        underTest.beforeCreate(sysuiDialog, /* savedInstanceState= */ null)

        verify(decorView).setAccessibilityDataSensitive(View.ACCESSIBILITY_DATA_SENSITIVE_YES)
    }

    @Test
    @DisableFlags(com.android.media.projection.flags.Flags.FLAG_SHOW_STOP_DIALOG_POST_CALL_END)
    fun accessibilityDataSensitive_flagDisabled_doesNotApplySetting() {
        createAndSetDelegate()

        val window = mock<Window>()
        val decorView = mock<View>()
        whenever(sysuiDialog.window).thenReturn(window)
        whenever(window.decorView).thenReturn(decorView)

        underTest.beforeCreate(sysuiDialog, /* savedInstanceState= */ null)

        verify(decorView, never()).setAccessibilityDataSensitive(any())
    }

    private fun createAndSetDelegate() {
        underTest =
            EndGenericShareToAppDialogDelegate(
                kosmos.endMediaProjectionDialogHelper,
                kosmos.applicationContext,
                stopAction = kosmos.mediaProjectionChipInteractor::stopProjecting,
            )
    }
}
+42 −0
Original line number Diff line number Diff line
@@ -23,6 +23,11 @@ import android.content.applicationContext
import android.content.packageManager
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.view.View
import android.view.Window
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.Kosmos
@@ -41,15 +46,18 @@ import kotlin.test.Test
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever

@SmallTest
@OptIn(ExperimentalCoroutinesApi::class)
@RunWith(AndroidJUnit4::class)
class EndShareScreenToAppDialogDelegateTest : SysuiTestCase() {
    private val kosmos = Kosmos().also { it.testCase = this }
    private val sysuiDialog = mock<SystemUIDialog>()
@@ -193,6 +201,40 @@ class EndShareScreenToAppDialogDelegateTest : SysuiTestCase() {
            assertThat(kosmos.fakeMediaProjectionRepository.stopProjectingInvoked).isTrue()
        }

    @Test
    @EnableFlags(com.android.media.projection.flags.Flags.FLAG_SHOW_STOP_DIALOG_POST_CALL_END)
    fun accessibilityDataSensitive_flagEnabled_appliesSetting() {
        createAndSetDelegate(ENTIRE_SCREEN)
        whenever(kosmos.packageManager.getApplicationInfo(eq(HOST_PACKAGE), any<Int>()))
            .thenThrow(PackageManager.NameNotFoundException())

        val window = mock<Window>()
        val decorView = mock<View>()
        whenever(sysuiDialog.window).thenReturn(window)
        whenever(window.decorView).thenReturn(decorView)

        underTest.beforeCreate(sysuiDialog, /* savedInstanceState= */ null)

        verify(decorView).setAccessibilityDataSensitive(View.ACCESSIBILITY_DATA_SENSITIVE_YES)
    }

    @Test
    @DisableFlags(com.android.media.projection.flags.Flags.FLAG_SHOW_STOP_DIALOG_POST_CALL_END)
    fun accessibilityDataSensitive_flagDisabled_doesNotApplySetting() {
        createAndSetDelegate(ENTIRE_SCREEN)
        whenever(kosmos.packageManager.getApplicationInfo(eq(HOST_PACKAGE), any<Int>()))
            .thenThrow(PackageManager.NameNotFoundException())

        val window = mock<Window>()
        val decorView = mock<View>()
        whenever(sysuiDialog.window).thenReturn(window)
        whenever(window.decorView).thenReturn(decorView)

        underTest.beforeCreate(sysuiDialog, /* savedInstanceState= */ null)

        verify(decorView, never()).setAccessibilityDataSensitive(any())
    }

    private fun createAndSetDelegate(state: MediaProjectionState.Projecting) {
        underTest =
            EndShareScreenToAppDialogDelegate(
Loading