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

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

Merge changes I47e07f87,I9f3542d6,I3c5cae3f into 24D1-dev

* changes:
  Allow touches to pass through screenshot shelf view
  Call back ScreenshotActionsProvider with null content if none is available.
  Allow action visibility to be toggled.
parents dab290ec 41384567
Loading
Loading
Loading
Loading
+5 −10
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
 */

package com.android.systemui.screenshot;
import android.annotation.Nullable;
import android.app.ActivityTaskManager;
import android.app.IActivityTaskManager;
import android.app.IAssistDataReceiver;
@@ -55,7 +56,7 @@ public class AssistContentRequester {
         * Called when the {@link android.app.assist.AssistContent} of the requested task is
         * available.
         **/
        void onAssistContentAvailable(AssistContent assistContent);
        void onAssistContentAvailable(@Nullable AssistContent assistContent);
    }

    private final IActivityTaskManager mActivityTaskManager;
@@ -117,15 +118,9 @@ public class AssistContentRequester {

        @Override
        public void onHandleAssistData(Bundle data) {
            if (data == null) {
                return;
            }

            final AssistContent content = data.getParcelable(ASSIST_KEY_CONTENT);
            if (content == null) {
                Log.e(TAG, "Received AssistData, but no AssistContent found");
                return;
            }
            final AssistContent content = (data == null) ? null
                    : data.getParcelable(
                            ASSIST_KEY_CONTENT, AssistContent.class);

            AssistContentRequester requester = mParentRef.get();
            if (requester != null) {
+5 −1
Original line number Diff line number Diff line
@@ -42,7 +42,11 @@ interface ScreenshotActionsProvider {
    fun onScrollChipReady(onClick: Runnable)
    fun setCompletedScreenshot(result: ScreenshotSavedResult)

    fun onAssistContentAvailable(assistContent: AssistContent) {}
    /**
     * Provide the AssistContent for the focused task if available, null if the focused task isn't
     * known or didn't return data.
     */
    fun onAssistContent(assistContent: AssistContent?) {}

    interface Factory {
        fun create(
+3 −3
Original line number Diff line number Diff line
@@ -412,9 +412,9 @@ public class ScreenshotController {

            if (screenshot.getTaskId() >= 0) {
                mAssistContentRequester.requestAssistContent(screenshot.getTaskId(),
                        assistContent -> {
                            mActionsProvider.onAssistContentAvailable(assistContent);
                        });
                        assistContent -> mActionsProvider.onAssistContent(assistContent));
            } else {
                mActionsProvider.onAssistContent(null);
            }
        } else {
            saveScreenshotInWorkerThread(screenshot.getUserHandle(), finisher,
+13 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.view.ScrollCaptureResponse
import android.view.View
import android.view.ViewTreeObserver
import android.view.WindowInsets
import android.view.WindowManager
import android.window.OnBackInvokedCallback
import android.window.OnBackInvokedDispatcher
import com.android.internal.logging.UiEventLogger
@@ -53,6 +54,7 @@ class ScreenshotShelfViewProxy
constructor(
    private val logger: UiEventLogger,
    private val viewModel: ScreenshotViewModel,
    private val windowManager: WindowManager,
    @Assisted private val context: Context,
    @Assisted private val displayId: Int
) : ScreenshotViewProxy {
@@ -79,6 +81,16 @@ constructor(
        addPredictiveBackListener { requestDismissal(SCREENSHOT_DISMISSED_OTHER) }
        setOnKeyListener { requestDismissal(SCREENSHOT_DISMISSED_OTHER) }
        debugLog(DEBUG_WINDOW) { "adding OnComputeInternalInsetsListener" }
        view.viewTreeObserver.addOnComputeInternalInsetsListener { info ->
            val touchableRegion =
                view.getTouchRegion(
                    windowManager.currentWindowMetrics.windowInsets.getInsets(
                        WindowInsets.Type.systemGestures()
                    )
                )
            info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION)
            info.touchableRegion.set(touchableRegion)
        }
        screenshotPreview = view.screenshotPreview
    }

@@ -194,6 +206,7 @@ constructor(
            }
        )
    }

    private fun setOnKeyListener(onDismissRequested: (ScreenshotEvent) -> Unit) {
        view.setOnKeyListener(
            object : View.OnKeyListener {
+53 −0
Original line number Diff line number Diff line
@@ -17,17 +17,70 @@
package com.android.systemui.screenshot.ui

import android.content.Context
import android.graphics.Insets
import android.graphics.Rect
import android.graphics.Region
import android.util.AttributeSet
import android.view.View
import android.widget.ImageView
import androidx.constraintlayout.widget.ConstraintLayout
import com.android.systemui.res.R
import com.android.systemui.screenshot.FloatingWindowUtil

class ScreenshotShelfView(context: Context, attrs: AttributeSet? = null) :
    ConstraintLayout(context, attrs) {
    lateinit var screenshotPreview: ImageView

    private val displayMetrics = context.resources.displayMetrics
    private val tmpRect = Rect()
    private lateinit var actionsContainerBackground: View
    private lateinit var dismissButton: View

    override fun onFinishInflate() {
        super.onFinishInflate()
        screenshotPreview = requireViewById(R.id.screenshot_preview)
        actionsContainerBackground = requireViewById(R.id.actions_container_background)
        dismissButton = requireViewById(R.id.screenshot_dismiss_button)
    }

    fun getTouchRegion(gestureInsets: Insets): Region {
        val region = getSwipeRegion()

        // Receive touches in gesture insets so they don't cause TOUCH_OUTSIDE
        // left edge gesture region
        val insetRect = Rect(0, 0, gestureInsets.left, displayMetrics.heightPixels)
        region.op(insetRect, Region.Op.UNION)
        // right edge gesture region
        insetRect.set(
            displayMetrics.widthPixels - gestureInsets.right,
            0,
            displayMetrics.widthPixels,
            displayMetrics.heightPixels
        )
        region.op(insetRect, Region.Op.UNION)

        return region
    }

    private fun getSwipeRegion(): Region {
        val swipeRegion = Region()
        val padding = FloatingWindowUtil.dpToPx(displayMetrics, -1 * TOUCH_PADDING_DP).toInt()
        swipeRegion.addInsetView(screenshotPreview, padding)
        swipeRegion.addInsetView(actionsContainerBackground, padding)
        swipeRegion.addInsetView(dismissButton, padding)
        findViewById<View>(R.id.screenshot_message_container)?.let {
            swipeRegion.addInsetView(it, padding)
        }
        return swipeRegion
    }

    private fun Region.addInsetView(view: View, padding: Int = 0) {
        view.getBoundsOnScreen(tmpRect)
        tmpRect.inset(padding, padding)
        this.op(tmpRect, Region.Op.UNION)
    }

    companion object {
        private const val TOUCH_PADDING_DP = 12f
    }
}
Loading