Check raw coordinates in SurfaceControlViewHostTests

We use a view embedded in a SurfaceView that is positioned at
different locations to ensure that embedded input windows are
getting raw coordinates in display space.

Bug: 167737418
Test: atest SurfaceControlViewHostTests
Change-Id: Iaa60a3dbca17abbc20fc48394c6f4c4c2b2d2802
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlViewHostTests.java b/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlViewHostTests.java
index 0635661..2941e7c 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlViewHostTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlViewHostTests.java
@@ -33,23 +33,23 @@
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.Instrumentation;
+import android.app.UiAutomation;
 import android.content.ComponentName;
 import android.content.Context;
-import android.content.pm.ActivityInfo;
 import android.content.Intent;
+import android.content.pm.ActivityInfo;
 import android.content.pm.ConfigurationInfo;
 import android.content.pm.FeatureInfo;
 import android.content.res.Configuration;
-import android.content.res.Resources;
 import android.graphics.Color;
 import android.graphics.PixelFormat;
-import android.graphics.Rect;
 import android.graphics.Region;
 import android.os.Binder;
+import android.os.SystemClock;
 import android.platform.test.annotations.Presubmit;
 import android.platform.test.annotations.RequiresDevice;
-import android.server.wm.ActivityManagerTestBase;
 import android.server.wm.scvh.Components;
+import android.server.wm.shared.ICrossProcessSurfaceControlViewHostTestService;
 import android.util.ArrayMap;
 import android.view.Gravity;
 import android.view.MotionEvent;
@@ -65,22 +65,21 @@
 import android.widget.FrameLayout;
 import android.widget.PopupWindow;
 
-import android.server.wm.shared.ICrossProcessSurfaceControlViewHostTestService;
-
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.FlakyTest;
 import androidx.test.rule.ActivityTestRule;
 
 import com.android.compatibility.common.util.CtsTouchUtils;
 import com.android.compatibility.common.util.WidgetTestUtils;
-
 import com.android.cts.mockime.ImeEventStream;
 import com.android.cts.mockime.MockImeSession;
 
-import org.junit.Before;
 import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -159,14 +158,23 @@
     }
 
     private void addSurfaceView(int width, int height, boolean onTop) throws Throwable {
+        addSurfaceView(width, height, onTop, 0 /* leftMargin */, 0 /* topMargin */);
+    }
+
+    private void addSurfaceView(int width, int height, boolean onTop, int leftMargin, int topMargin)
+            throws Throwable {
         mActivityRule.runOnUiThread(() -> {
             final FrameLayout content = new FrameLayout(mActivity);
             mSurfaceView = new SurfaceView(mActivity);
             mSurfaceView.setZOrderOnTop(onTop);
-            content.addView(mSurfaceView, new FrameLayout.LayoutParams(
-                width, height, Gravity.LEFT | Gravity.TOP));
+            final FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
+                    width, height, Gravity.LEFT | Gravity.TOP);
+            lp.leftMargin = leftMargin;
+            lp.topMargin = topMargin;
+            content.addView(mSurfaceView, lp);
             mViewParent = content;
-            mActivity.setContentView(content, new ViewGroup.LayoutParams(width, height));
+            mActivity.setContentView(content,
+                    new ViewGroup.LayoutParams(width + leftMargin, height + topMargin));
             mSurfaceView.getHolder().addCallback(this);
         });
     }
@@ -277,6 +285,52 @@
         assertTrue(mClicked);
     }
 
+    @Test
+    public void testEmbeddedViewReceivesRawInputCoordinatesInDisplaySpace() throws Throwable {
+        final UiAutomation uiAutomation = mInstrumentation.getUiAutomation();
+        final int viewX = DEFAULT_SURFACE_VIEW_WIDTH / 2;
+        final int viewY = DEFAULT_SURFACE_VIEW_HEIGHT / 2;
+
+        // Verify the input coordinates received by the embedded view in three different locations.
+        for (int i = 0; i < 3; i++) {
+            final List<MotionEvent> events = new ArrayList<>();
+            mEmbeddedView = new View(mActivity);
+            mEmbeddedView.setOnTouchListener((v, e) -> events.add(e));
+
+            // Add a margin to the SurfaceView to offset the embedded view's location on the screen.
+            final int leftMargin = i * 20;
+            final int topMargin = i * 10;
+            addSurfaceView(DEFAULT_SURFACE_VIEW_WIDTH, DEFAULT_SURFACE_VIEW_HEIGHT, true /*onTop*/,
+                    leftMargin, topMargin);
+            mInstrumentation.waitForIdleSync();
+            waitUntilEmbeddedViewDrawn();
+
+            final int[] surfaceLocation = new int[2];
+            mSurfaceView.getLocationOnScreen(surfaceLocation);
+
+            final int displayX = surfaceLocation[0] + viewX;
+            final int displayY = surfaceLocation[1] + viewY;
+            final long downTime = SystemClock.uptimeMillis();
+            CtsTouchUtils.injectDownEvent(uiAutomation, downTime, displayX, displayY,
+                    null /*eventInjectionListener*/);
+            CtsTouchUtils.injectUpEvent(uiAutomation, downTime, true /*useCurrentEventTime*/,
+                    displayX, displayY, null /*eventInjectionListener*/);
+
+            assertEquals("Expected to capture all injected events.", 2, events.size());
+            final float epsilon = 0.001f;
+            events.forEach(e -> {
+                assertEquals("Expected to get the x coordinate in View space.",
+                        viewX, e.getX(), epsilon);
+                assertEquals("Expected to get the y coordinate in View space.",
+                        viewY, e.getY(), epsilon);
+                assertEquals("Expected to get raw x coordinate in Display space.",
+                        displayX, e.getRawX(), epsilon);
+                assertEquals("Expected to get raw y coordinate in Display space.",
+                        displayY, e.getRawY(), epsilon);
+            });
+        }
+    }
+
     private static int getGlEsVersion(Context context) {
         ActivityManager activityManager =
                 (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);