Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Unified Diff: chromecast/browser/android/apk/src/org/chromium/chromecast/shell/ExternalVideoSurfaceContainer.java

Issue 815933002: [WebView] Move external video surface across container views. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2214
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chromecast/browser/android/apk/src/org/chromium/chromecast/shell/ExternalVideoSurfaceContainer.java
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/ExternalVideoSurfaceContainer.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/ExternalVideoSurfaceContainer.java
index d7484028592f1aac1f8f428a057c3c980fac9512..4df7024aa20235e1c93d2d58b6313fc30ffa8a0d 100644
--- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/ExternalVideoSurfaceContainer.java
+++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/ExternalVideoSurfaceContainer.java
@@ -14,11 +14,13 @@ import android.view.ViewGroup;
import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
import org.chromium.base.VisibleForTesting;
+import org.chromium.content.browser.ContainerViewObserver;
import org.chromium.content.browser.ContentViewCore;
import org.chromium.content.browser.RenderCoordinates;
import java.lang.ref.WeakReference;
+//TODO(gunsch): componentize this class.
/**
* This is a container for external video surfaces.
* The object is owned by the native peer and it is owned by WebContents.
@@ -47,10 +49,13 @@ import java.lang.ref.WeakReference;
public class ExternalVideoSurfaceContainer implements SurfaceHolder.Callback {
protected static final int INVALID_PLAYER_ID = -1;
- // Because WebView does hole-punching by itself, instead, the hole-punching logic
- // in SurfaceView can clear out some web elements like media control or subtitle.
- // So we need to disable its hole-punching logic.
- private static class NoPunchingSurfaceView extends SurfaceView {
+ /**
+ * Because WebView does hole-punching by itself, instead, the hole-punching logic
+ * in SurfaceView can clear out some web elements like media control or subtitle.
+ * So we need to disable its hole-punching logic.
+ */
+ @VisibleForTesting
+ public static class NoPunchingSurfaceView extends SurfaceView {
public NoPunchingSurfaceView(Context context) {
super(context);
}
@@ -70,6 +75,8 @@ public class ExternalVideoSurfaceContainer implements SurfaceHolder.Callback {
private final long mNativeExternalVideoSurfaceContainer;
private final ContentViewCore mContentViewCore;
+ private ViewGroup mContainerView;
+ private ContainerViewObserver mContainerViewObserver;
private int mPlayerId = INVALID_PLAYER_ID;
private SurfaceView mSurfaceView;
@@ -175,18 +182,39 @@ public class ExternalVideoSurfaceContainer implements SurfaceHolder.Callback {
}
private void createSurfaceView() {
+ assert mContainerView == null;
+ assert mContainerViewObserver == null;
+
mSurfaceView = new NoPunchingSurfaceView(mContentViewCore.getContext());
mSurfaceView.getHolder().addCallback(this);
// SurfaceHoder.surfaceCreated() will be called after the SurfaceView is attached to
// the Window and becomes visible.
- mContentViewCore.getContainerView().addView(mSurfaceView);
+ mContainerView = mContentViewCore.getContainerView();
+ mContainerView.addView(mSurfaceView);
+ mContainerViewObserver = new ContainerViewObserver() {
+ @Override
+ public void onContainerViewChanged(ViewGroup newContainerView) {
+ mContainerView.removeView(mSurfaceView);
+ mContainerView = newContainerView;
+ mContainerView.addView(mSurfaceView);
+ }
+ };
+ mContentViewCore.addContainerViewObserver(mContainerViewObserver);
}
private void removeSurfaceView() {
+ assert mSurfaceView != null;
+ assert mContainerView != null;
+ assert mContainerViewObserver != null;
+
// SurfaceHoder.surfaceDestroyed() will be called in ViewGroup.removeView()
// as soon as the SurfaceView is detached from the Window.
- mContentViewCore.getContainerView().removeView(mSurfaceView);
+ mContentViewCore.removeContainerViewObserver(mContainerViewObserver);
+ mContainerView.removeView(mSurfaceView);
+
+ mContainerViewObserver = null;
mSurfaceView = null;
+ mContainerView = null;
}
/**

Powered by Google App Engine
This is Rietveld 408576698