Add a method to hide/show a SurfaceView's surface.

This can be used to move a surface offscreen to avoid the cost of compositing it.
This preserves the window and therefore the OpenGL context when used in h/w
accelerated apps.

Change-Id: I280295376601b17989d0fc8a271af66650016f09
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 2a3f032..53f0c2e 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -16,6 +16,7 @@
 
 package android.view;
 
+import android.util.DisplayMetrics;
 import com.android.internal.view.BaseIWindow;
 
 import android.content.Context;
@@ -212,6 +213,46 @@
         mRequestedVisible = mWindowVisibility && mViewVisibility;
         updateWindow(false);
     }
+
+    /**
+     * This method is not intended for general use. It was created
+     * temporarily to improve performance of 3D layers in Launcher
+     * and should be removed and fixed properly.
+     * 
+     * Do not call this method. Ever.
+     * 
+     * @hide
+     */
+    protected void showSurface() {
+        if (mSession != null) {
+            updateWindow(true);
+        }
+    }
+
+    /**
+     * This method is not intended for general use. It was created
+     * temporarily to improve performance of 3D layers in Launcher
+     * and should be removed and fixed properly.
+     * 
+     * Do not call this method. Ever.
+     * 
+     * @hide
+     */
+    protected void hideSurface() {
+        if (mSession != null && mWindow != null) {
+            mSurfaceLock.lock();
+            try {
+                DisplayMetrics metrics = getResources().getDisplayMetrics();
+                mLayout.x = metrics.widthPixels * 3;
+                mSession.relayout(mWindow, mLayout, mWidth, mHeight, VISIBLE, false,
+                        mWinFrame, mContentInsets, mVisibleInsets, mConfiguration, mSurface);
+            } catch (RemoteException e) {
+                // Ignore
+            } finally {
+                mSurfaceLock.unlock();
+            }
+        }
+    }
     
     @Override
     protected void onDetachedFromWindow() {