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!
This commit is contained in:
@@ -100,6 +100,8 @@ public class SurfaceView extends View {
|
|||||||
static final int KEEP_SCREEN_ON_MSG = 1;
|
static final int KEEP_SCREEN_ON_MSG = 1;
|
||||||
static final int GET_NEW_SURFACE_MSG = 2;
|
static final int GET_NEW_SURFACE_MSG = 2;
|
||||||
|
|
||||||
|
int mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
|
||||||
|
|
||||||
boolean mIsCreating = false;
|
boolean mIsCreating = false;
|
||||||
|
|
||||||
final Handler mHandler = new Handler() {
|
final Handler mHandler = new Handler() {
|
||||||
@@ -285,6 +287,15 @@ public class SurfaceView extends View {
|
|||||||
super.dispatchDraw(canvas);
|
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) {
|
private void updateWindow(boolean force) {
|
||||||
if (!mHaveFrame) {
|
if (!mHaveFrame) {
|
||||||
return;
|
return;
|
||||||
@@ -342,7 +353,7 @@ public class SurfaceView extends View {
|
|||||||
|
|
||||||
if (mWindow == null) {
|
if (mWindow == null) {
|
||||||
mWindow = new MyWindow(this);
|
mWindow = new MyWindow(this);
|
||||||
mLayout.type = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
|
mLayout.type = mWindowType;
|
||||||
mLayout.gravity = Gravity.LEFT|Gravity.TOP;
|
mLayout.gravity = Gravity.LEFT|Gravity.TOP;
|
||||||
mSession.add(mWindow, mLayout,
|
mSession.add(mWindow, mLayout,
|
||||||
mVisible ? VISIBLE : GONE, mContentInsets);
|
mVisible ? VISIBLE : GONE, mContentInsets);
|
||||||
|
|||||||
@@ -376,8 +376,14 @@ public abstract class Window {
|
|||||||
String title;
|
String title;
|
||||||
if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA) {
|
if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA) {
|
||||||
title="Media";
|
title="Media";
|
||||||
|
} else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY) {
|
||||||
|
title="MediaOvr";
|
||||||
} else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) {
|
} else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) {
|
||||||
title="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 {
|
} else {
|
||||||
title=Integer.toString(wp.type);
|
title=Integer.toString(wp.type);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -209,6 +209,15 @@ public interface WindowManager extends ViewManager {
|
|||||||
*/
|
*/
|
||||||
public static final int TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW+3;
|
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.
|
* End of types of sub-windows.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user