WIP Move window handling to framework

Change-Id: I0d0398843da6a74193ababad6402e80fc298c686
diff --git a/src/java/cyanogenmod/externalviews/ExternalView.java b/src/java/cyanogenmod/externalviews/ExternalView.java
index ac415f2..3931a27 100644
--- a/src/java/cyanogenmod/externalviews/ExternalView.java
+++ b/src/java/cyanogenmod/externalviews/ExternalView.java
@@ -14,6 +14,8 @@
 import android.util.AttributeSet;
 import android.view.View;
 import android.view.ViewTreeObserver;
+import android.view.WindowManager;
+import android.view.WindowManagerGlobal;
 import cyanogenmod.platform.R;
 import java.util.LinkedList;
 
@@ -28,6 +30,7 @@
     private boolean mBound;
     private LinkedList<Runnable> mQueue = new LinkedList<Runnable>();
     private IExternalViewProvider mExternalViewProvider;
+    private final IBinder mRemoteWindowToken;
 
     private static ComponentName getComponentFromAttribute(Context context, AttributeSet attrs) {
         String componentString = attrs.getAttributeValue(sAttributeNameSpace, "componentName");
@@ -52,6 +55,7 @@
         mExtensionComponent = componentName;
         mActivity.getApplication().registerActivityLifecycleCallbacks(this);
         getViewTreeObserver().addOnScrollChangedListener(this);
+        mRemoteWindowToken = WindowManagerGlobal.getInstance().createRemoteWindowToken(getApplicationWindowToken());
         bind();
     }
 
@@ -114,6 +118,15 @@
 
     @Override
     public void onActivityResumed(Activity activity) {
+        boolean visible = false;
+        if (getVisibility() == VISIBLE) {
+            final Rect hitRect = new Rect();
+            mActivity.getWindow().getDecorView().getHitRect(hitRect);
+            visible = getLocalVisibleRect(hitRect);
+        }
+
+        WindowManagerGlobal.getInstance().setRemoteWindowVisbility(visible, mRemoteWindowToken, getApplicationWindowToken());
+
         performAction(new Runnable() {
             @Override
             public void run() {
@@ -127,6 +140,8 @@
 
     @Override
     public void onActivityPaused(Activity activity) {
+        WindowManagerGlobal.getInstance().setRemoteWindowVisbility(false, mRemoteWindowToken, getApplicationWindowToken());
+
         performAction(new Runnable() {
             @Override
             public void run() {
@@ -165,22 +180,15 @@
         super.onLayout(changed, left, top, right, bottom);
         int[] screenCords = new int[2];
         getLocationOnScreen(screenCords);
-        final Rect hitRect = new Rect();
-        mActivity.getWindow().getDecorView().getHitRect(hitRect);
-        final int x = screenCords[0];
-        final int y = screenCords[1];
-        final int width = getWidth();
-        final int height = getHeight();
-        performAction(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    mExternalViewProvider.alterWindow(x, y, width, height,
-                            getLocalVisibleRect(hitRect));
-                } catch (RemoteException e) {
-                }
-            }
-        });
+
+        WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
+        mParams.x = screenCords[0];
+        mParams.y = screenCords[1];
+        mParams.width = getWidth();
+        mParams.height = getHeight();
+
+        WindowManagerGlobal.getInstance().updateRemoteWindow(mParams, WindowManager.LayoutParams.LAYOUT_CHANGED,
+                mRemoteWindowToken, getApplicationWindowToken());
     }
 
     @Override
@@ -189,20 +197,17 @@
         getLocationOnScreen(screenCords);
         final Rect hitRect = new Rect();
         mActivity.getWindow().getDecorView().getHitRect(hitRect);
-        final int x = screenCords[0];
-        final int y = screenCords[1];
-        final int width = getWidth();
-        final int height = getHeight();
-        performAction(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    mExternalViewProvider.alterWindow(x, y, width, height,
-                            getLocalVisibleRect(hitRect));
-                } catch (RemoteException e) {
-                }
-            }
-        });
+
+        WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
+
+        mParams.x = screenCords[0];
+        mParams.y = screenCords[1];
+        mParams.width = getWidth();
+        mParams.height = getHeight();
+        mParams.visibility = getLocalVisibleRect(hitRect);
+
+        WindowManagerGlobal.getInstance().updateRemoteWindow(mParams, WindowManager.LayoutParams.LAYOUT_CHANGED,
+                mRemoteWindowToken, getApplicationWindowToken());
     }
 
     // Placeholder callbacks
@@ -227,7 +232,7 @@
             @Override
             public void run() {
                 try {
-                    mExternalViewProvider.onAttach(null);
+                    mExternalViewProvider.onAttach(mRemoteWindowToken);
                 } catch (RemoteException e) {
                 }
             }
diff --git a/src/java/cyanogenmod/externalviews/ExternalViewProvider.java b/src/java/cyanogenmod/externalviews/ExternalViewProvider.java
index faa78bc..7d9896b 100644
--- a/src/java/cyanogenmod/externalviews/ExternalViewProvider.java
+++ b/src/java/cyanogenmod/externalviews/ExternalViewProvider.java
@@ -24,9 +24,6 @@
     private final Window mWindow;
     private final WindowManager.LayoutParams mParams;
 
-    private boolean mShouldShow = true;
-    private boolean mAskedShow = false;
-
     public ExternalViewProvider(Context context) {
         mContext = context;
 
@@ -45,10 +42,11 @@
 
     private final class Provider extends IExternalViewProvider.Stub {
         @Override
-        public void onAttach(IBinder windowToken) throws RemoteException {
+        public void onAttach(final IBinder remoteWindowToken) throws RemoteException {
             mHandler.post(new Runnable() {
                 @Override
                 public void run() {
+                    mParams.token = remoteWindowToken;
                     mWindowManager.addView(mWindow.getDecorView(), mParams);
 
                     ExternalViewProvider.this.onAttach();
@@ -71,10 +69,6 @@
             mHandler.post(new Runnable() {
                 @Override
                 public void run() {
-                    mShouldShow = true;
-
-                    updateVisibility();
-
                     ExternalViewProvider.this.onResume();
                 }
             });
@@ -85,10 +79,6 @@
             mHandler.post(new Runnable() {
                 @Override
                 public void run() {
-                    mShouldShow = false;
-
-                    updateVisibility();
-
                     ExternalViewProvider.this.onPause();
                 }
             });
@@ -117,33 +107,6 @@
                 }
             });
         }
-
-        @Override
-        public void alterWindow(final int x, final int y, final int width, final int height, final boolean visible) {
-            mHandler.post(new Runnable() {
-                @Override
-                public void run() {
-                    mParams.x = x;
-                    mParams.y = y;
-                    mParams.width = width;
-                    mParams.height = height;
-
-                    Log.d(TAG, mParams.toString());
-
-                    mAskedShow = visible;
-
-                    updateVisibility();
-
-                    if (mWindow.getDecorView().getVisibility() != View.GONE)
-                        mWindowManager.updateViewLayout(mWindow.getDecorView(), mParams);
-                }
-            });
-        }
-
-        private void updateVisibility() {
-            Log.d(TAG, "shouldShow = " + mShouldShow + " askedShow = " + mAskedShow);
-            mWindow.getDecorView().setVisibility(mShouldShow && mAskedShow ? View.VISIBLE : View.GONE);
-        }
     }
 
     public IBinder getBinder() {