Merge "Add isPivotSet/resetPivot" into pi-dev
diff --git a/api/current.txt b/api/current.txt
index dc3ab4f..323947c 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -47548,6 +47548,7 @@
     method public boolean isOpaque();
     method protected boolean isPaddingOffsetRequired();
     method public boolean isPaddingRelative();
+    method public boolean isPivotSet();
     method public boolean isPressed();
     method public boolean isSaveEnabled();
     method public boolean isSaveFromParentEnabled();
@@ -47666,6 +47667,7 @@
     method public boolean requestRectangleOnScreen(android.graphics.Rect, boolean);
     method public final void requestUnbufferedDispatch(android.view.MotionEvent);
     method public final <T extends android.view.View> T requireViewById(int);
+    method public void resetPivot();
     method public static int resolveSize(int, int);
     method public static int resolveSizeAndState(int, int, int);
     method public boolean restoreDefaultFocus();
diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java
index ce7e8f3..7c25fac 100644
--- a/core/java/android/view/RenderNode.java
+++ b/core/java/android/view/RenderNode.java
@@ -687,6 +687,11 @@
         return nIsPivotExplicitlySet(mNativeRenderNode);
     }
 
+    /** lint */
+    public boolean resetPivot() {
+        return nResetPivot(mNativeRenderNode);
+    }
+
     /**
      * Sets the camera distance for the display list. Refer to
      * {@link View#setCameraDistance(float)} for more information on how to
@@ -903,6 +908,8 @@
     @CriticalNative
     private static native boolean nSetPivotX(long renderNode, float pivotX);
     @CriticalNative
+    private static native boolean nResetPivot(long renderNode);
+    @CriticalNative
     private static native boolean nSetLayerType(long renderNode, int layerType);
     @CriticalNative
     private static native boolean nSetLayerPaint(long renderNode, long paint);
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index afff19b..18c3d76 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -14843,6 +14843,28 @@
     }
 
     /**
+     * Returns whether or not a pivot has been set by a call to {@link #setPivotX(float)} or
+     * {@link #setPivotY(float)}. If no pivot has been set then the pivot will be the center
+     * of the view.
+     *
+     * @return True if a pivot has been set, false if the default pivot is being used
+     */
+    public boolean isPivotSet() {
+        return mRenderNode.isPivotExplicitlySet();
+    }
+
+    /**
+     * Clears any pivot previously set by a call to  {@link #setPivotX(float)} or
+     * {@link #setPivotY(float)}. After calling this {@link #isPivotSet()} will be false
+     * and the pivot used for rotation will return to default of being centered on the view.
+     */
+    public void resetPivot() {
+        if (mRenderNode.resetPivot()) {
+            invalidateViewProperty(false, false);
+        }
+    }
+
+    /**
      * The opacity of the view. This is a value from 0 to 1, where 0 means the view is
      * completely transparent and 1 means the view is completely opaque.
      *
diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp
index 8770d78..37ea810 100644
--- a/core/jni/android_view_RenderNode.cpp
+++ b/core/jni/android_view_RenderNode.cpp
@@ -266,6 +266,10 @@
     return SET_AND_DIRTY(setPivotY, py, RenderNode::GENERIC);
 }
 
+static jboolean android_view_RenderNode_resetPivot(jlong renderNodePtr) {
+    return SET_AND_DIRTY(resetPivot, /* void */, RenderNode::GENERIC);
+}
+
 static jboolean android_view_RenderNode_setCameraDistance(jlong renderNodePtr, float distance) {
     return SET_AND_DIRTY(setCameraDistance, distance, RenderNode::GENERIC);
 }
@@ -613,6 +617,7 @@
     { "nSetScaleY",            "(JF)Z",  (void*) android_view_RenderNode_setScaleY },
     { "nSetPivotX",            "(JF)Z",  (void*) android_view_RenderNode_setPivotX },
     { "nSetPivotY",            "(JF)Z",  (void*) android_view_RenderNode_setPivotY },
+    { "nResetPivot",           "(J)Z",   (void*) android_view_RenderNode_resetPivot },
     { "nSetCameraDistance",    "(JF)Z",  (void*) android_view_RenderNode_setCameraDistance },
     { "nSetLeft",              "(JI)Z",  (void*) android_view_RenderNode_setLeft },
     { "nSetTop",               "(JI)Z",  (void*) android_view_RenderNode_setTop },
diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h
index 0742de9..6470d4c 100644
--- a/libs/hwui/RenderProperties.h
+++ b/libs/hwui/RenderProperties.h
@@ -328,6 +328,10 @@
 
     bool isPivotExplicitlySet() const { return mPrimitiveFields.mPivotExplicitlySet; }
 
+    bool resetPivot() {
+        return RP_SET_AND_DIRTY(mPrimitiveFields.mPivotExplicitlySet, false);
+    }
+
     bool setCameraDistance(float distance) {
         if (distance != getCameraDistance()) {
             mPrimitiveFields.mMatrixOrPivotDirty = true;