update to new SurfaceComposerClient API

Change-Id: I8f2c96df56fe3a851b8ec03bb8734db0b6bea3d5
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 6616894..db05e10 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -262,12 +262,8 @@
             IBinder displayToken, SurfaceTexture surfaceTexture);
     private static native void nativeSetDisplayLayerStack(
             IBinder displayToken, int layerStack);
-    private static native void nativeSetDisplayOrientation(
-            IBinder displayToken, int orientation);
-    private static native void nativeSetDisplayViewport(
-            IBinder displayToken, Rect viewport);
-    private static native void nativeSetDisplayFrame(
-            IBinder displayToken, Rect frame);
+    private static native void nativeSetDisplayProjection(
+            IBinder displayToken, int orientation, Rect layerStackRect, Rect displayRect);
     private static native boolean nativeGetDisplayInfo(
             IBinder displayToken, PhysicalDisplayInfo outInfo);
 
@@ -617,33 +613,18 @@
     }
 
     /** @hide */
-    public static void setDisplayOrientation(IBinder displayToken, int orientation) {
+    public static void setDisplayProjection(IBinder displayToken,
+            int orientation, Rect layerStackRect, Rect displayRect) {
         if (displayToken == null) {
             throw new IllegalArgumentException("displayToken must not be null");
         }
-        nativeSetDisplayOrientation(displayToken, orientation);
-    }
-
-    /** @hide */
-    public static void setDisplayViewport(IBinder displayToken, Rect viewport) {
-        if (displayToken == null) {
-            throw new IllegalArgumentException("displayToken must not be null");
+        if (layerStackRect == null) {
+            throw new IllegalArgumentException("layerStackRect must not be null");
         }
-        if (viewport == null) {
-            throw new IllegalArgumentException("viewport must not be null");
+        if (displayRect == null) {
+            throw new IllegalArgumentException("displayRect must not be null");
         }
-        nativeSetDisplayViewport(displayToken, viewport);
-    }
-
-    /** @hide */
-    public static void setDisplayFrame(IBinder displayToken, Rect frame) {
-        if (displayToken == null) {
-            throw new IllegalArgumentException("displayToken must not be null");
-        }
-        if (frame == null) {
-            throw new IllegalArgumentException("frame must not be null");
-        }
-        nativeSetDisplayFrame(displayToken, frame);
+        nativeSetDisplayProjection(displayToken, orientation, layerStackRect, displayRect);
     }
 
     /** @hide */
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index 4d5e680..4fbfab6 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -647,38 +647,24 @@
     SurfaceComposerClient::setDisplayLayerStack(token, layerStack);
 }
 
-static void nativeSetDisplayOrientation(JNIEnv* env, jclass clazz,
-        jobject tokenObj, jint orientation) {
+static void nativeSetDisplayProjection(JNIEnv* env, jclass clazz,
+        jobject tokenObj, jint orientation, jobject rect1Obj, jobject rect2Obj) {
     sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
     if (token == NULL) return;
 
-    SurfaceComposerClient::setDisplayOrientation(token, orientation);
-}
+    Rect rect1;
+    rect1.left = env->GetIntField(rect1Obj, gRectClassInfo.left);
+    rect1.top = env->GetIntField(rect1Obj, gRectClassInfo.top);
+    rect1.right = env->GetIntField(rect1Obj, gRectClassInfo.right);
+    rect1.bottom = env->GetIntField(rect1Obj, gRectClassInfo.bottom);
 
-static void nativeSetDisplayViewport(JNIEnv* env, jclass clazz,
-        jobject tokenObj, jobject rectObj) {
-    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
-    if (token == NULL) return;
+    Rect rect2;
+    rect2.left = env->GetIntField(rect2Obj, gRectClassInfo.left);
+    rect2.top = env->GetIntField(rect2Obj, gRectClassInfo.top);
+    rect2.right = env->GetIntField(rect2Obj, gRectClassInfo.right);
+    rect2.bottom = env->GetIntField(rect2Obj, gRectClassInfo.bottom);
 
-    Rect rect;
-    rect.left = env->GetIntField(rectObj, gRectClassInfo.left);
-    rect.top = env->GetIntField(rectObj, gRectClassInfo.top);
-    rect.right = env->GetIntField(rectObj, gRectClassInfo.right);
-    rect.bottom = env->GetIntField(rectObj, gRectClassInfo.bottom);
-    SurfaceComposerClient::setDisplayViewport(token, rect);
-}
-
-static void nativeSetDisplayFrame(JNIEnv* env, jclass clazz,
-        jobject tokenObj, jobject rectObj) {
-    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
-    if (token == NULL) return;
-
-    Rect rect;
-    rect.left = env->GetIntField(rectObj, gRectClassInfo.left);
-    rect.top = env->GetIntField(rectObj, gRectClassInfo.top);
-    rect.right = env->GetIntField(rectObj, gRectClassInfo.right);
-    rect.bottom = env->GetIntField(rectObj, gRectClassInfo.bottom);
-    SurfaceComposerClient::setDisplayFrame(token, rect);
+    SurfaceComposerClient::setDisplayProjection(token, orientation, rect1, rect2);
 }
 
 static jboolean nativeGetDisplayInfo(JNIEnv* env, jclass clazz,
@@ -818,12 +804,8 @@
             (void*)nativeSetDisplaySurface },
     {"nativeSetDisplayLayerStack", "(Landroid/os/IBinder;I)V",
             (void*)nativeSetDisplayLayerStack },
-    {"nativeSetDisplayOrientation", "(Landroid/os/IBinder;I)V",
-            (void*)nativeSetDisplayOrientation },
-    {"nativeSetDisplayViewport", "(Landroid/os/IBinder;Landroid/graphics/Rect;)V",
-            (void*)nativeSetDisplayViewport },
-    {"nativeSetDisplayFrame", "(Landroid/os/IBinder;Landroid/graphics/Rect;)V",
-            (void*)nativeSetDisplayFrame },
+    {"nativeSetDisplayProjection", "(Landroid/os/IBinder;ILandroid/graphics/Rect;Landroid/graphics/Rect;)V",
+            (void*)nativeSetDisplayProjection },
     {"nativeGetDisplayInfo", "(Landroid/os/IBinder;Landroid/view/Surface$PhysicalDisplayInfo;)Z",
             (void*)nativeGetDisplayInfo },
     {"nativeCopyFrom", "(Landroid/view/Surface;)V",
diff --git a/services/java/com/android/server/display/DisplayDevice.java b/services/java/com/android/server/display/DisplayDevice.java
index 69d8385..bdc87f9 100644
--- a/services/java/com/android/server/display/DisplayDevice.java
+++ b/services/java/com/android/server/display/DisplayDevice.java
@@ -38,8 +38,8 @@
     // the display manager service.  The display device shouldn't really be looking at these.
     private int mCurrentLayerStack = -1;
     private int mCurrentOrientation = -1;
-    private Rect mCurrentViewport;
-    private Rect mCurrentFrame;
+    private Rect mCurrentLayerStackRect;
+    private Rect mCurrentDisplayRect;
 
     // The display device does own its surface texture, but it should only set it
     // within a transaction from performTraversalInTransactionLocked.
@@ -117,44 +117,26 @@
     }
 
     /**
-     * Sets the display orientation while in a transaction.
+     * Sets the display projection while in a transaction.
+     *
+     * @param orientation defines the display's orientation
+     * @param layerStackRect defines which area of the window manager coordinate
+     *            space will be used
+     * @param displayRect defines where on the display will layerStackRect be
+     *            mapped to. displayRect is specified post-orientation, that is
+     *            it uses the orientation seen by the end-user
      */
-    public final void setOrientationInTransactionLocked(int orientation) {
-        if (mCurrentOrientation == orientation) {
-            return;
-        }
+    public final void setProjectionInTransactionLocked(int orientation, Rect layerStackRect, Rect displayRect) {
         mCurrentOrientation = orientation;
-        Surface.setDisplayOrientation(mDisplayToken, orientation);
-    }
-
-    /**
-     * Sets the display viewport while in a transaction.
-     */
-    public final void setViewportInTransactionLocked(Rect viewport) {
-        if (mCurrentViewport != null) {
-            if (mCurrentViewport.equals(viewport)) {
-                return;
-            }
-        } else {
-            mCurrentViewport = new Rect();
+        if (mCurrentLayerStackRect == null) {
+            mCurrentLayerStackRect = new Rect();
         }
-        mCurrentViewport.set(viewport);
-        Surface.setDisplayViewport(mDisplayToken, viewport);
-    }
-
-    /**
-     * Sets the display frame while in a transaction.
-     */
-    public final void setFrameInTransactionLocked(Rect frame) {
-        if (mCurrentFrame != null) {
-            if (mCurrentFrame.equals(frame)) {
-                return;
-            }
-        } else {
-            mCurrentFrame = new Rect();
+        mCurrentLayerStackRect.set(layerStackRect);
+        if (mCurrentDisplayRect == null) {
+            mCurrentDisplayRect = new Rect();
         }
-        mCurrentFrame.set(frame);
-        Surface.setDisplayFrame(mDisplayToken, frame);
+        mCurrentDisplayRect.set(displayRect);
+        Surface.setDisplayProjection(mDisplayToken, orientation, layerStackRect, displayRect);
     }
 
     /**
@@ -176,8 +158,8 @@
         pw.println("mAdapter=" + mDisplayAdapter.getName());
         pw.println("mCurrentLayerStack=" + mCurrentLayerStack);
         pw.println("mCurrentOrientation=" + mCurrentOrientation);
-        pw.println("mCurrentViewport=" + mCurrentViewport);
-        pw.println("mCurrentFrame=" + mCurrentFrame);
+        pw.println("mCurrentViewport=" + mCurrentLayerStackRect);
+        pw.println("mCurrentFrame=" + mCurrentDisplayRect);
         pw.println("mCurrentSurfaceTexture=" + mCurrentSurfaceTexture);
     }
 }
diff --git a/services/java/com/android/server/display/LogicalDisplay.java b/services/java/com/android/server/display/LogicalDisplay.java
index 32ca1c5..c864189 100644
--- a/services/java/com/android/server/display/LogicalDisplay.java
+++ b/services/java/com/android/server/display/LogicalDisplay.java
@@ -64,7 +64,8 @@
     private DisplayDeviceInfo mPrimaryDisplayDeviceInfo;
 
     // Temporary rectangle used when needed.
-    private final Rect mTempRect = new Rect();
+    private final Rect mTempLayerStackRect = new Rect();
+    private final Rect mTempDisplayRect = new Rect();
 
     public LogicalDisplay(int layerStack, DisplayDevice primaryDisplayDevice) {
         mLayerStack = layerStack;
@@ -208,8 +209,7 @@
         // Set the viewport.
         // This is the area of the logical display that we intend to show on the
         // display device.  For now, it is always the full size of the logical display.
-        mTempRect.set(0, 0, displayInfo.logicalWidth, displayInfo.logicalHeight);
-        device.setViewportInTransactionLocked(mTempRect);
+        mTempLayerStackRect.set(0, 0, displayInfo.logicalWidth, displayInfo.logicalHeight);
 
         // Set the orientation.
         // The orientation specifies how the physical coordinate system of the display
@@ -219,7 +219,6 @@
                 && (displayDeviceInfo.flags & DisplayDeviceInfo.FLAG_SUPPORTS_ROTATION) != 0) {
             orientation = displayInfo.rotation;
         }
-        device.setOrientationInTransactionLocked(orientation);
 
         // Set the frame.
         // The frame specifies the rotated physical coordinates into which the viewport
@@ -238,21 +237,23 @@
         // We avoid a division (and possible floating point imprecision) here by
         // multiplying the fractions by the product of their denominators before
         // comparing them.
-        int frameWidth, frameHeight;
+        int displayRectWidth, displayRectHeight;
         if (physWidth * displayInfo.logicalHeight
                 < physHeight * displayInfo.logicalWidth) {
             // Letter box.
-            frameWidth = physWidth;
-            frameHeight = displayInfo.logicalHeight * physWidth / displayInfo.logicalWidth;
+            displayRectWidth = physWidth;
+            displayRectHeight = displayInfo.logicalHeight * physWidth / displayInfo.logicalWidth;
         } else {
             // Pillar box.
-            frameWidth = displayInfo.logicalWidth * physHeight / displayInfo.logicalHeight;
-            frameHeight = physHeight;
+            displayRectWidth = displayInfo.logicalWidth * physHeight / displayInfo.logicalHeight;
+            displayRectHeight = physHeight;
         }
-        int frameTop = (physHeight - frameHeight) / 2;
-        int frameLeft = (physWidth - frameWidth) / 2;
-        mTempRect.set(frameLeft, frameTop, frameLeft + frameWidth, frameTop + frameHeight);
-        device.setFrameInTransactionLocked(mTempRect);
+        int displayRectTop = (physHeight - displayRectHeight) / 2;
+        int displayRectLeft = (physWidth - displayRectWidth) / 2;
+        mTempDisplayRect.set(displayRectLeft, displayRectTop,
+                displayRectLeft + displayRectWidth, displayRectTop + displayRectHeight);
+
+        device.setProjectionInTransactionLocked(orientation, mTempLayerStackRect, mTempDisplayRect);
     }
 
     public void dumpLocked(PrintWriter pw) {