Cleanup after ActivityView

- Release Surface and VirtualDisplay when shutting down ActivityView.
- Shut down child stacks when relaunching parent activity.

Change-Id: I60314b2b43bd2da5406cf6ec871293b5baca157c
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java
index fef4597..25cde8c 100644
--- a/core/java/android/app/ActivityView.java
+++ b/core/java/android/app/ActivityView.java
@@ -24,6 +24,7 @@
 import android.os.RemoteException;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
+import android.util.Log;
 import android.view.Surface;
 import android.view.TextureView;
 import android.view.TextureView.SurfaceTextureListener;
@@ -31,12 +32,15 @@
 import android.view.WindowManager;
 
 public class ActivityView extends ViewGroup {
+    private final String TAG = "ActivityView";
+
     private final TextureView mTextureView;
     private IActivityContainer mActivityContainer;
     private Activity mActivity;
     private boolean mAttached;
     private int mWidth;
     private int mHeight;
+    private Surface mSurface;
 
     public ActivityView(Context context) {
         this(context, null);
@@ -83,20 +87,18 @@
 
         final SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
         if (surfaceTexture != null) {
-            createActivityView(surfaceTexture);
+            attachToSurface(surfaceTexture);
         }
     }
 
     @Override
     protected void onDetachedFromWindow() {
-        if (mActivityContainer != null) {
-            try {
-                mActivityContainer.deleteActivityView();
-            } catch (RemoteException e) {
-            }
-            mActivityContainer = null;
-        }
-        mAttached = false;
+        detachFromSurface();
+    }
+
+    @Override
+    public boolean isAttachedToWindow() {
+        return mAttached;
     }
 
     public void startActivity(Intent intent) {
@@ -110,22 +112,41 @@
     }
 
     /** Call when both mActivityContainer and mTextureView's SurfaceTexture are not null */
-    private void createActivityView(SurfaceTexture surfaceTexture) {
+    private void attachToSurface(SurfaceTexture surfaceTexture) {
         WindowManager wm = (WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE);
         DisplayMetrics metrics = new DisplayMetrics();
         wm.getDefaultDisplay().getMetrics(metrics);
 
+        mSurface = new Surface(surfaceTexture);
         try {
-            mActivityContainer.createActivityView(new Surface(surfaceTexture), mWidth, mHeight,
+            mActivityContainer.attachToSurface(mSurface, mWidth, mHeight,
                     metrics.densityDpi);
         } catch (RemoteException e) {
             mActivityContainer = null;
+            mSurface.release();
+            mSurface = null;
+            mAttached = false;
             throw new IllegalStateException(
                     "ActivityView: Unable to create ActivityContainer. " + e);
         }
         mAttached = true;
     }
 
+    private void detachFromSurface() {
+        if (mActivityContainer != null) {
+            try {
+                mActivityContainer.detachFromDisplay();
+            } catch (RemoteException e) {
+            }
+            mActivityContainer = null;
+        }
+        if (mSurface != null) {
+            mSurface.release();
+            mSurface = null;
+        }
+        mAttached = false;
+    }
+
     private class ActivityViewSurfaceTextureListener implements SurfaceTextureListener {
         @Override
         public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,
@@ -133,30 +154,26 @@
             mWidth = width;
             mHeight = height;
             if (mActivityContainer != null) {
-                createActivityView(surfaceTexture);
+                attachToSurface(surfaceTexture);
             }
         }
 
         @Override
         public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width,
                 int height) {
+            Log.d(TAG, "onSurfaceTextureSizeChanged: w=" + width + " h=" + height);
         }
 
         @Override
         public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
-            try {
-                mActivityContainer.deleteActivityView();
-                // TODO: Add binderDied to handle this nullification.
-                mActivityContainer = null;
-            } catch (RemoteException r) {
-            }
-            mAttached = false;
-            return false;
+            Log.d(TAG, "onSurfaceTextureDestroyed");
+            detachFromSurface();
+            return true;
         }
 
         @Override
         public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
-
+//            Log.d(TAG, "onSurfaceTextureUpdated");
         }
 
     }