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

Commit 03e0f1c3 authored by Nicolò Mazzucato's avatar Nicolò Mazzucato Committed by Android (Google) Code Review
Browse files

Merge "Remove unused screenshot related code" into main

parents 6d8ff0fc 954562a9
Loading
Loading
Loading
Loading
+0 −60
Original line number Diff line number Diff line
@@ -16,10 +16,8 @@

package com.android.systemui.screenshot

import android.graphics.Insets
import android.util.Log
import android.view.WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE
import com.android.internal.util.ScreenshotRequest
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.flags.FeatureFlags
@@ -49,64 +47,6 @@ class RequestProcessor @Inject constructor(
        /** For the Java Async version, to invoke the callback. */
        @Application private val mainScope: CoroutineScope
) : ScreenshotRequestProcessor {
    /**
     * Inspects the incoming request, returning a potentially modified request depending on policy.
     *
     * @param request the request to process
     */
    // TODO: Delete once SCREENSHOT_METADATA flag is launched
    suspend fun process(request: ScreenshotRequest): ScreenshotRequest {
        var result = request

        // Apply work profile screenshots policy:
        //
        // If the focused app belongs to a work profile, transforms a full screen
        // (or partial) screenshot request to a task snapshot (provided image) screenshot.

        // Whenever displayContentInfo is fetched, the topComponent is also populated
        // regardless of the managed profile status.

        if (request.type != TAKE_SCREENSHOT_PROVIDED_IMAGE) {
            val info = policy.findPrimaryContent(policy.getDefaultDisplayId())
            Log.d(TAG, "findPrimaryContent: $info")

            result = if (policy.isManagedProfile(info.user.identifier)) {
                val image = capture.captureTask(info.taskId)
                        ?: error("Task snapshot returned a null Bitmap!")

                // Provide the task snapshot as the screenshot
                ScreenshotRequest.Builder(TAKE_SCREENSHOT_PROVIDED_IMAGE, request.source)
                        .setTopComponent(info.component)
                        .setTaskId(info.taskId)
                        .setUserId(info.user.identifier)
                        .setBitmap(image)
                        .setBoundsOnScreen(info.bounds)
                        .setInsets(Insets.NONE)
                        .build()
            } else {
                // Create a new request of the same type which includes the top component
                ScreenshotRequest.Builder(request.type, request.source)
                        .setTopComponent(info.component).build()
            }
        }

        return result
    }

    /**
     * Note: This is for compatibility with existing Java. Prefer the suspending function when
     * calling from a Coroutine context.
     *
     * @param request the request to process
     * @param callback the callback to provide the processed request, invoked from the main thread
     */
    // TODO: Delete once SCREENSHOT_METADATA flag is launched
    fun processAsync(request: ScreenshotRequest, callback: Consumer<ScreenshotRequest>) {
        mainScope.launch {
            val result = process(request)
            callback.accept(result)
        }
    }

    override suspend fun process(screenshot: ScreenshotData): ScreenshotData {
        var result = screenshot
+1 −58
Original line number Diff line number Diff line
@@ -49,30 +49,6 @@ class RequestProcessorTest {
    private val policy = FakeScreenshotPolicy()
    private val flags = FakeFeatureFlags()

    /** Tests the Java-compatible function wrapper, ensures callback is invoked. */
    @Test
    fun testProcessAsync() {
        val request =
            ScreenshotRequest.Builder(TAKE_SCREENSHOT_PROVIDED_IMAGE, SCREENSHOT_KEY_OTHER)
                .setBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888))
                .build()
        val processor = RequestProcessor(imageCapture, policy, flags, scope)

        var result: ScreenshotRequest? = null
        var callbackCount = 0
        val callback: (ScreenshotRequest) -> Unit = { processedRequest: ScreenshotRequest ->
            result = processedRequest
            callbackCount++
        }

        // runs synchronously, using Unconfined Dispatcher
        processor.processAsync(request, callback)

        // Callback invoked once returning the same request (no changes)
        assertThat(callbackCount).isEqualTo(1)
        assertThat(result).isEqualTo(request)
    }

    /** Tests the Java-compatible function wrapper, ensures callback is invoked. */
    @Test
    fun testProcessAsync_ScreenshotData() {
@@ -112,13 +88,6 @@ class RequestProcessorTest {
            ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_OTHER).build()
        val processor = RequestProcessor(imageCapture, policy, flags, scope)

        val processedRequest = processor.process(request)

        // Request has topComponent added, but otherwise unchanged.
        assertThat(processedRequest.type).isEqualTo(TAKE_SCREENSHOT_FULLSCREEN)
        assertThat(processedRequest.source).isEqualTo(SCREENSHOT_OTHER)
        assertThat(processedRequest.topComponent).isEqualTo(component)

        val processedData = processor.process(ScreenshotData.fromRequest(request))

        // Request has topComponent added, but otherwise unchanged.
@@ -144,18 +113,6 @@ class RequestProcessorTest {
            ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER).build()
        val processor = RequestProcessor(imageCapture, policy, flags, scope)

        val processedRequest = processor.process(request)

        // Expect a task snapshot is taken, overriding the full screen mode
        assertThat(processedRequest.type).isEqualTo(TAKE_SCREENSHOT_PROVIDED_IMAGE)
        assertThat(bitmap.equalsHardwareBitmap(processedRequest.bitmap)).isTrue()
        assertThat(processedRequest.boundsInScreen).isEqualTo(bounds)
        assertThat(processedRequest.insets).isEqualTo(Insets.NONE)
        assertThat(processedRequest.taskId).isEqualTo(TASK_ID)
        assertThat(imageCapture.requestedTaskId).isEqualTo(TASK_ID)
        assertThat(processedRequest.userId).isEqualTo(USER_ID)
        assertThat(processedRequest.topComponent).isEqualTo(component)

        val processedData = processor.process(ScreenshotData.fromRequest(request))

        // Expect a task snapshot is taken, overriding the full screen mode
@@ -165,8 +122,6 @@ class RequestProcessorTest {
        assertThat(processedData.insets).isEqualTo(Insets.NONE)
        assertThat(processedData.taskId).isEqualTo(TASK_ID)
        assertThat(imageCapture.requestedTaskId).isEqualTo(TASK_ID)
        assertThat(processedRequest.userId).isEqualTo(USER_ID)
        assertThat(processedRequest.topComponent).isEqualTo(component)
    }

    @Test
@@ -185,9 +140,6 @@ class RequestProcessorTest {
            ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER).build()
        val processor = RequestProcessor(imageCapture, policy, flags, scope)

        Assert.assertThrows(IllegalStateException::class.java) {
            runBlocking { processor.process(request) }
        }
        Assert.assertThrows(IllegalStateException::class.java) {
            runBlocking { processor.process(ScreenshotData.fromRequest(request)) }
        }
@@ -212,11 +164,6 @@ class RequestProcessorTest {
                .setInsets(Insets.NONE)
                .build()

        val processedRequest = processor.process(request)

        // No changes
        assertThat(processedRequest).isEqualTo(request)

        val screenshotData = ScreenshotData.fromRequest(request)
        val processedData = processor.process(screenshotData)

@@ -243,14 +190,10 @@ class RequestProcessorTest {
                .setInsets(Insets.NONE)
                .build()

        val processedRequest = processor.process(request)

        // Work profile, but already a task snapshot, so no changes
        assertThat(processedRequest).isEqualTo(request)

        val screenshotData = ScreenshotData.fromRequest(request)
        val processedData = processor.process(screenshotData)

        // Work profile, but already a task snapshot, so no changes
        assertThat(processedData).isEqualTo(screenshotData)
    }

+0 −32
Original line number Diff line number Diff line
@@ -20,10 +20,6 @@ import android.app.admin.DevicePolicyManager
import android.app.admin.DevicePolicyResources.Strings.SystemUi.SCREENSHOT_BLOCKED_BY_ADMIN
import android.app.admin.DevicePolicyResourcesManager
import android.content.ComponentName
import android.graphics.Bitmap
import android.graphics.Bitmap.Config.HARDWARE
import android.graphics.ColorSpace
import android.hardware.HardwareBuffer
import android.os.UserHandle
import android.os.UserManager
import android.testing.AndroidTestingRunner
@@ -93,14 +89,6 @@ class TakeScreenshotServiceTest : SysuiTestCase() {
        whenever(controllerFactory.create(any())).thenReturn(controller)

        // Stub request processor as a synchronous no-op for tests with the flag enabled
        doAnswer {
                val request: ScreenshotRequest = it.getArgument(0) as ScreenshotRequest
                val consumer: Consumer<ScreenshotRequest> = it.getArgument(1)
                consumer.accept(request)
            }
            .whenever(requestProcessor)
            .processAsync(/* request= */ any(ScreenshotRequest::class.java), /* callback= */ any())

        doAnswer {
                val request: ScreenshotData = it.getArgument(0) as ScreenshotData
                val consumer: Consumer<ScreenshotData> = it.getArgument(1)
@@ -353,23 +341,3 @@ class TakeScreenshotServiceTest : SysuiTestCase() {
        return service
    }
}

private fun Bitmap.equalsHardwareBitmap(other: Bitmap): Boolean {
    return config == HARDWARE &&
        other.config == HARDWARE &&
        hardwareBuffer == other.hardwareBuffer &&
        colorSpace == other.colorSpace
}

/** A hardware Bitmap is mandated by use of ScreenshotHelper.HardwareBitmapBundler */
private fun makeHardwareBitmap(width: Int, height: Int): Bitmap {
    val buffer =
        HardwareBuffer.create(
            width,
            height,
            HardwareBuffer.RGBA_8888,
            1,
            HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE
        )
    return Bitmap.wrapHardwareBuffer(buffer, ColorSpace.get(ColorSpace.Named.SRGB))!!
}