From c4d5d02667af6989a3121072871f6a4b1e68b594 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Thu, 21 May 2009 17:32:42 -0700 Subject: [PATCH] Add new window manager type for a hacking second-level media surface. This adds a new window type that is a surface that sits between the current media type and the application window, in theory allowing you to have two surface views in your hierarchy and control their Z-ordering. There is also another hidden API on SurfaceView to set the type of your window. All a big hack, but for the good of the commonwealth! --- core/java/android/view/SurfaceView.java | 13 ++++++++++++- core/java/android/view/Window.java | 6 ++++++ core/java/android/view/WindowManager.java | 9 +++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 3d023f7a96910..0dc257027065e 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -100,6 +100,8 @@ public class SurfaceView extends View { static final int KEEP_SCREEN_ON_MSG = 1; static final int GET_NEW_SURFACE_MSG = 2; + int mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA; + boolean mIsCreating = false; final Handler mHandler = new Handler() { @@ -285,6 +287,15 @@ public class SurfaceView extends View { super.dispatchDraw(canvas); } + /** + * Hack to allow special layering of windows. The type is one of the + * types in WindowManager.LayoutParams. This is a hack so: + * @hide + */ + public void setWindowType(int type) { + mWindowType = type; + } + private void updateWindow(boolean force) { if (!mHaveFrame) { return; @@ -342,7 +353,7 @@ public class SurfaceView extends View { if (mWindow == null) { mWindow = new MyWindow(this); - mLayout.type = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA; + mLayout.type = mWindowType; mLayout.gravity = Gravity.LEFT|Gravity.TOP; mSession.add(mWindow, mLayout, mVisible ? VISIBLE : GONE, mContentInsets); diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index b0e738cf879a5..d7457a030468e 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -376,8 +376,14 @@ public abstract class Window { String title; if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA) { title="Media"; + } else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY) { + title="MediaOvr"; } else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) { title="Panel"; + } else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL) { + title="SubPanel"; + } else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG) { + title="AtchDlg"; } else { title=Integer.toString(wp.type); } diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 72ef0ada1837e..ec2069ccc28ef 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -209,6 +209,15 @@ public interface WindowManager extends ViewManager { */ public static final int TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW+3; + /** + * Window type: window for showing overlays on top of media windows. + * These windows are displayed between TYPE_APPLICATION_MEDIA and the + * application window. They should be translucent to be useful. This + * is a big ugly hack so: + * @hide + */ + public static final int TYPE_APPLICATION_MEDIA_OVERLAY = FIRST_SUB_WINDOW+4; + /** * End of types of sub-windows. */