summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--media/java/android/media/tv/TvView.java61
1 files changed, 58 insertions, 3 deletions
diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java
index 0959800d4807..82761ec37573 100644
--- a/media/java/android/media/tv/TvView.java
+++ b/media/java/android/media/tv/TvView.java
@@ -63,6 +63,10 @@ public class TvView extends ViewGroup {
private static final int VIDEO_SIZE_VALUE_UNKNOWN = 0;
+ private static final int ZORDER_MEDIA = 0;
+ private static final int ZORDER_MEDIA_OVERLAY = 1;
+ private static final int ZORDER_ON_TOP = 2;
+
private static final Object sMainTvViewLock = new Object();
private static TvView sMainTvView;
@@ -86,6 +90,7 @@ public class TvView extends ViewGroup {
private int mSurfaceHeight;
private final AttributeSet mAttrs;
private final int mDefStyleAttr;
+ private int mWindowZOrder;
private final SurfaceHolder.Callback mSurfaceHolderCallback = new SurfaceHolder.Callback() {
@Override
@@ -185,6 +190,51 @@ public class TvView extends ViewGroup {
}
/**
+ * Sets the Z order of a window owning the surface of this TvView above the normal TvView
+ * but below an application.
+ *
+ * @see SurfaceView#setZOrderMediaOverlay
+ * @hide
+ */
+ @SystemApi
+ public void setZOrderMediaOverlay(boolean isMediaOverlay) {
+ if (isMediaOverlay) {
+ mWindowZOrder = ZORDER_MEDIA_OVERLAY;
+ removeSessionOverlayView();
+ } else {
+ mWindowZOrder = ZORDER_MEDIA;
+ createSessionOverlayView();
+ }
+ if (mSurfaceView != null) {
+ // ZOrderOnTop(false) removes WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+ // from WindowLayoutParam as well as changes window type.
+ mSurfaceView.setZOrderOnTop(false);
+ mSurfaceView.setZOrderMediaOverlay(isMediaOverlay);
+ }
+ }
+
+ /**
+ * Sets the Z order of a window owning the surface of this TvView on top of an application.
+ *
+ * @see SurfaceView#setZOrderOnTop
+ * @hide
+ */
+ @SystemApi
+ public void setZOrderOnTop(boolean onTop) {
+ if (onTop) {
+ mWindowZOrder = ZORDER_ON_TOP;
+ removeSessionOverlayView();
+ } else {
+ mWindowZOrder = ZORDER_MEDIA;
+ createSessionOverlayView();
+ }
+ if (mSurfaceView != null) {
+ mSurfaceView.setZOrderMediaOverlay(false);
+ mSurfaceView.setZOrderOnTop(onTop);
+ }
+ }
+
+ /**
* Sets the relative stream volume of this session to handle a change of audio focus.
*
* @param volume A volume value between 0.0f to 1.0f.
@@ -522,6 +572,11 @@ public class TvView extends ViewGroup {
relayoutSessionOverlayView();
}};
mSurfaceView.getHolder().addCallback(mSurfaceHolderCallback);
+ if (mWindowZOrder == ZORDER_MEDIA_OVERLAY) {
+ mSurfaceView.setZOrderMediaOverlay(true);
+ } else if (mWindowZOrder == ZORDER_ON_TOP) {
+ mSurfaceView.setZOrderOnTop(true);
+ }
addView(mSurfaceView);
}
@@ -549,7 +604,7 @@ public class TvView extends ViewGroup {
private void createSessionOverlayView() {
if (mSession == null || !isAttachedToWindow()
- || mOverlayViewCreated) {
+ || mOverlayViewCreated || mWindowZOrder != ZORDER_MEDIA) {
return;
}
mOverlayViewFrame = getViewFrameOnScreen();
@@ -567,8 +622,8 @@ public class TvView extends ViewGroup {
}
private void relayoutSessionOverlayView() {
- if (mSession == null || !isAttachedToWindow()
- || !mOverlayViewCreated) {
+ if (mSession == null || !isAttachedToWindow() || !mOverlayViewCreated
+ || mWindowZOrder != ZORDER_MEDIA) {
return;
}
Rect viewFrame = getViewFrameOnScreen();