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

Unified Diff: android_webview/java/src/org/chromium/android_webview/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
« no previous file with comments | « no previous file | android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientFullScreenTest.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: android_webview/java/src/org/chromium/android_webview/ExternalVideoSurfaceContainer.java
diff --git a/android_webview/java/src/org/chromium/android_webview/ExternalVideoSurfaceContainer.java b/android_webview/java/src/org/chromium/android_webview/ExternalVideoSurfaceContainer.java
index 86f75808ac68715b2b2459232553c2a65cd86df6..4527262fdb137c8c806079cba2095545d0cd362c 100644
--- a/android_webview/java/src/org/chromium/android_webview/ExternalVideoSurfaceContainer.java
+++ b/android_webview/java/src/org/chromium/android_webview/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.
@@ -41,10 +43,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);
}
@@ -64,6 +69,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;
@@ -169,18 +176,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;
}
/**
« no previous file with comments | « no previous file | android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientFullScreenTest.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698