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

Commit 9aa4e4b2 authored by Matt Casey's avatar Matt Casey Committed by Android (Google) Code Review
Browse files

Merge "Send context URL as EXTRA_TEXT when available." into main

parents e34b13de 883cbe7d
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -659,6 +659,13 @@ flag {
    bug: "365597999"
}

flag {
    name: "screenshot_context_url"
    namespace: "systemui"
    description: "Include optional app-provided context URL when sharing a screenshot."
    bug: "242791070"
}

flag {
   name: "run_fingerprint_detect_on_dismissible_keyguard"
   namespace: "systemui"
+18 −7
Original line number Diff line number Diff line
@@ -18,13 +18,16 @@ package com.android.systemui.screenshot

import android.app.assist.AssistContent
import android.content.Context
import android.net.Uri
import android.util.Log
import androidx.appcompat.content.res.AppCompatResources
import com.android.internal.logging.UiEventLogger
import com.android.systemui.Flags.screenshotContextUrl
import com.android.systemui.log.DebugLogger.debugLog
import com.android.systemui.res.R
import com.android.systemui.screenshot.ActionIntentCreator.createEdit
import com.android.systemui.screenshot.ActionIntentCreator.createShareWithSubject
import com.android.systemui.screenshot.ActionIntentCreator.createShareWithText
import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_EDIT_TAPPED
import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_PREVIEW_TAPPED
import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_SHARE_TAPPED
@@ -76,6 +79,7 @@ constructor(
    private var onScrollClick: Runnable? = null
    private var pendingAction: ((ScreenshotSavedResult) -> Unit)? = null
    private var result: ScreenshotSavedResult? = null
    private var webUri: Uri? = null

    init {
        actionsCallback.providePreviewAction(
@@ -86,7 +90,7 @@ constructor(
                    actionExecutor.startSharedTransition(
                        createEdit(result.uri, context),
                        result.user,
                        true
                        true,
                    )
                }
            }
@@ -103,11 +107,14 @@ constructor(
            debugLog(LogConfig.DEBUG_ACTIONS) { "Share tapped" }
            uiEventLogger.log(SCREENSHOT_SHARE_TAPPED, 0, request.packageNameString)
            onDeferrableActionTapped { result ->
                actionExecutor.startSharedTransition(
                    createShareWithSubject(result.uri, result.subject),
                    result.user,
                    false
                )
                val uri = webUri
                val shareIntent =
                    if (screenshotContextUrl() && uri != null) {
                        createShareWithText(result.uri, extraText = uri.toString())
                    } else {
                        createShareWithSubject(result.uri, result.subject)
                    }
                actionExecutor.startSharedTransition(shareIntent, result.user, false)
            }
        }

@@ -125,7 +132,7 @@ constructor(
                actionExecutor.startSharedTransition(
                    createEdit(result.uri, context),
                    result.user,
                    true
                    true,
                )
            }
        }
@@ -161,6 +168,10 @@ constructor(
        pendingAction?.invoke(result)
    }

    override fun onAssistContent(assistContent: AssistContent?) {
        webUri = assistContent?.webUri
    }

    private fun onDeferrableActionTapped(onResult: (ScreenshotSavedResult) -> Unit) {
        result?.let { onResult.invoke(it) } ?: run { pendingAction = onResult }
    }
+36 −10
Original line number Diff line number Diff line
@@ -16,31 +16,32 @@

package com.android.systemui.screenshot

import android.app.assist.AssistContent
import android.content.Intent
import android.net.Uri
import android.os.Process
import android.os.UserHandle
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import android.platform.test.annotations.EnableFlags
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.internal.logging.UiEventLogger
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.screenshot.ui.viewmodel.PreviewAction
import com.google.common.truth.Truth.assertThat
import java.util.UUID
import kotlin.test.Test
import kotlinx.coroutines.test.runTest
import org.junit.runner.RunWith
import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
import org.mockito.kotlin.times
import org.mockito.kotlin.verify

@RunWith(AndroidTestingRunner::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
class DefaultScreenshotActionsProviderTest : SysuiTestCase() {
    private val actionExecutor = mock<ActionExecutor>()
    private val uiEventLogger = mock<UiEventLogger>()
@@ -76,7 +77,7 @@ class DefaultScreenshotActionsProviderTest : SysuiTestCase() {
    }

    @Test
    fun actionAccessed_withResult_launchesIntent() = runTest {
    fun actionAccessed_withResult_launchesIntent() {
        actionsProvider = createActionsProvider()

        actionsProvider.setCompletedScreenshot(validResult)
@@ -94,7 +95,32 @@ class DefaultScreenshotActionsProviderTest : SysuiTestCase() {
    }

    @Test
    fun actionAccessed_whilePending_launchesMostRecentAction() = runTest {
    @EnableFlags(Flags.FLAG_SCREENSHOT_CONTEXT_URL)
    fun shareAction_includesAssistContentUri() {
        actionsProvider = createActionsProvider()

        actionsProvider.setCompletedScreenshot(validResult)

        val uri = Uri.parse("http://www.android.com")
        val assistContent = mock<AssistContent>() { on { webUri } doReturn uri }

        actionsProvider.onAssistContent(assistContent)

        val actionButtonCaptor = argumentCaptor<() -> Unit>()
        verify(actionsCallback, times(2))
            .provideActionButton(any(), any(), actionButtonCaptor.capture())
        actionButtonCaptor.firstValue.invoke()

        val intentCaptor = argumentCaptor<Intent>()
        verify(actionExecutor)
            .startSharedTransition(intentCaptor.capture(), eq(Process.myUserHandle()), eq(false))
        val innerIntent =
            intentCaptor.lastValue.extras?.getParcelable(Intent.EXTRA_INTENT, Intent::class.java)
        assertThat(innerIntent?.getStringExtra(Intent.EXTRA_TEXT)).isEqualTo(uri.toString())
    }

    @Test
    fun actionAccessed_whilePending_launchesMostRecentAction() {
        actionsProvider = createActionsProvider()

        val previewActionCaptor = argumentCaptor<PreviewAction>()
@@ -116,7 +142,7 @@ class DefaultScreenshotActionsProviderTest : SysuiTestCase() {
    }

    @Test
    fun scrollChipClicked_callsOnClick() = runTest {
    fun scrollChipClicked_callsOnClick() {
        actionsProvider = createActionsProvider()

        val onScrollClick = mock<Runnable>()
@@ -131,7 +157,7 @@ class DefaultScreenshotActionsProviderTest : SysuiTestCase() {
    }

    @Test
    fun scrollChipClicked_afterInvalidate_doesNothing() = runTest {
    fun scrollChipClicked_afterInvalidate_doesNothing() {
        actionsProvider = createActionsProvider()

        val onScrollClick = mock<Runnable>()
@@ -147,7 +173,7 @@ class DefaultScreenshotActionsProviderTest : SysuiTestCase() {
    }

    @Test
    fun scrollChipClicked_afterUpdate_runsNewAction() = runTest {
    fun scrollChipClicked_afterUpdate_runsNewAction() {
        actionsProvider = createActionsProvider()

        val onScrollClick = mock<Runnable>()