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() {