SurfaceFlinger Input: Shrink frame by surfaceInsets.

Probably best explained by the comment in InputWindow.h. We can't
use touchable region because we need to shift the coordinate space.
As a follow-up I'm going to look in to shifting the coordinate space
on the client but it was very non obvious where to do so.

Test: Manual
Bug: 80101428
Bug: 113136004
Bug: 111440400
Change-Id: Ibbaffa89a80f3a047c716265251f547631bdf802
diff --git a/include/input/InputWindow.h b/include/input/InputWindow.h
index 1a46825..df401f0 100644
--- a/include/input/InputWindow.h
+++ b/include/input/InputWindow.h
@@ -116,17 +116,36 @@
         INPUT_FEATURE_NO_INPUT_CHANNEL = 0x00000002,
         INPUT_FEATURE_DISABLE_USER_ACTIVITY = 0x00000004,
     };
-
+    
+    /* These values are filled in by the WM and passed through SurfaceFlinger
+     * unless specified otherwise.
+     */
     sp<IBinder> token;
     std::string name;
     int32_t layoutParamsFlags;
     int32_t layoutParamsType;
     nsecs_t dispatchingTimeout;
+
+    /* These values are filled in by SurfaceFlinger. */
     int32_t frameLeft;
     int32_t frameTop;
     int32_t frameRight;
     int32_t frameBottom;
+
+    /*
+     * SurfaceFlinger consumes this value to shrink the computed frame. This is
+     * different from shrinking the touchable region in that it DOES shift the coordinate
+     * space where-as the touchable region does not and is more like "cropping". This
+     * is used for window shadows.
+     */
+    int32_t surfaceInset = 0;
+
     float scaleFactor;
+
+    /*
+     * This is filled in by the WM relative to the frame and then translated
+     * to absolute coordinates by SurfaceFlinger once the frame is computed.
+     */
     Region touchableRegion;
     bool visible;
     bool canReceiveKeys;
diff --git a/libs/input/InputWindow.cpp b/libs/input/InputWindow.cpp
index b1d9d6a..e6bb255 100644
--- a/libs/input/InputWindow.cpp
+++ b/libs/input/InputWindow.cpp
@@ -81,6 +81,7 @@
     output.writeInt32(frameTop);
     output.writeInt32(frameRight);
     output.writeInt32(frameBottom);
+    output.writeInt32(surfaceInset);
     output.writeFloat(scaleFactor);
     output.writeBool(visible);
     output.writeBool(canReceiveKeys);
@@ -119,6 +120,7 @@
     ret.frameTop = from.readInt32();
     ret.frameRight = from.readInt32();
     ret.frameBottom = from.readInt32();
+    ret.surfaceInset = from.readInt32();
     ret.scaleFactor = from.readFloat();
     ret.visible = from.readBool();
     ret.canReceiveKeys = from.readBool();
diff --git a/libs/input/tests/InputWindow_test.cpp b/libs/input/tests/InputWindow_test.cpp
index ea98f8a..cc6962f 100644
--- a/libs/input/tests/InputWindow_test.cpp
+++ b/libs/input/tests/InputWindow_test.cpp
@@ -47,6 +47,7 @@
     i.frameTop = 34;
     i.frameRight = 16;
     i.frameBottom = 19;
+    i.surfaceInset = 17;
     i.scaleFactor = 0.3;
     i.visible = false;
     i.canReceiveKeys = false;
@@ -73,6 +74,7 @@
     ASSERT_EQ(i.frameTop, i2.frameTop);
     ASSERT_EQ(i.frameRight, i2.frameRight);
     ASSERT_EQ(i.frameBottom, i2.frameBottom);
+    ASSERT_EQ(i.surfaceInset, i2.surfaceInset);
     ASSERT_EQ(i.scaleFactor, i2.scaleFactor);
     ASSERT_EQ(i.visible, i2.visible);
     ASSERT_EQ(i.canReceiveKeys, i2.canReceiveKeys);
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 3c37cf8..bfae03d 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -2069,12 +2069,12 @@
 
 InputWindowInfo Layer::fillInputInfo(const Rect& screenBounds) {
     InputWindowInfo info = mDrawingState.inputInfo;
-    info.frameLeft = screenBounds.left;
-    info.inputInfo.frameTop = screenBounds.top;
-    info.inputInfo.frameRight = screenBounds.right;
-    info.inputInfo.frameBottom = screenBounds.bottom;
+    info.frameLeft = screenBounds.left + info.surfaceInset;
+    info.frameTop = screenBounds.top + info.surfaceInset;
+    info.frameRight = screenBounds.right - info.surfaceInset;
+    info.frameBottom = screenBounds.bottom - info.surfaceInset;
 
-    info.touchableRegion = mDrawingState.inputInfo.touchableRegion.translate(
+    info.touchableRegion = info.touchableRegion.translate(
             screenBounds.left,
             screenBounds.top);
     info.visible = isVisible();