Chromium Code Reviews| Index: chromecast/shell/android/apk/src/org/chromium/chromecast/shell/CastWindowManager.java |
| diff --git a/chromecast/shell/android/apk/src/org/chromium/chromecast/shell/CastWindowManager.java b/chromecast/shell/android/apk/src/org/chromium/chromecast/shell/CastWindowManager.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..4b84f27eb7b66f9d6fbf88eb76d4c6367d64aae2 |
| --- /dev/null |
| +++ b/chromecast/shell/android/apk/src/org/chromium/chromecast/shell/CastWindowManager.java |
| @@ -0,0 +1,155 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package org.chromium.chromecast.shell; |
| + |
| +import android.content.Context; |
| +import android.graphics.Color; |
| +import android.util.AttributeSet; |
| +import android.view.LayoutInflater; |
| +import android.widget.FrameLayout; |
| + |
| +import org.chromium.base.CalledByNative; |
| +import org.chromium.base.JNINamespace; |
| +import org.chromium.content.browser.ContentViewCore; |
| +import org.chromium.content.browser.ContentViewRenderView; |
| +import org.chromium.ui.base.WindowAndroid; |
| + |
| +/** |
| + * Container and generator of CastWindow instances. |
| + */ |
| +@JNINamespace("chromecast::shell") |
| +public class CastWindowManager extends FrameLayout { |
| + private static final String TAG = "CastWindowManager"; |
| + |
| + private WindowAndroid mWindow; |
| + private CastWindowAndroid mActiveCastWindow; |
| + |
| + // The target for all content rendering. |
| + private ContentViewRenderView mContentViewRenderView; |
| + |
| + /** |
| + * Delegate to deliver events from the native window. |
| + */ |
| + public static class Delegate { |
|
Yaron
2014/09/06 01:10:14
Why isn't this an interface? Without multiple inhe
gunsch
2014/09/08 19:42:23
Done.
|
| + protected void onCreated() {} |
| + protected void onClosed() {} |
| + } |
| + private Delegate mDelegate; |
| + |
| + /** |
| + * Constructor for inflating via XML. |
| + */ |
| + public CastWindowManager(Context context, AttributeSet attrs) { |
| + super(context, attrs); |
| + nativeInit(this); |
| + } |
| + |
| + /** |
| + * @param delegate Delegate to handle events. |
| + */ |
| + public void setDelegate(Delegate delegate) { |
| + mDelegate = delegate; |
| + } |
| + |
| + /** |
| + * @param window Represents the activity window. |
| + */ |
| + public void setWindow(WindowAndroid window) { |
| + assert window != null; |
| + mWindow = window; |
| + mContentViewRenderView = new ContentViewRenderView(getContext()) { |
| + @Override |
| + protected void onReadyToRender() { |
| + setOverlayVideoMode(true); |
| + } |
| + }; |
| + mContentViewRenderView.onNativeLibraryLoaded(window); |
| + // Setting the background color to black avoids rendering a white splash screen |
| + // before the players are loaded. See crbug/307113 for details. |
| + mContentViewRenderView.setSurfaceViewBackgroundColor(Color.BLACK); |
| + } |
| + |
| + /** |
| + * @return The window used to generate all shells. |
| + */ |
| + public WindowAndroid getWindow() { |
| + return mWindow; |
| + } |
| + |
| + /** |
| + * @return The currently visible shell view or null if one is not showing. |
| + */ |
| + public CastWindowAndroid getActiveCastWindow() { |
| + return mActiveCastWindow; |
| + } |
| + |
| + /** |
| + * Creates a new shell pointing to the specified URL. |
| + * @param url The URL the shell should load upon creation. |
| + * @return Pointer of native cast shell instance. |
| + */ |
| + public long launchCastWindow(String url) { |
| + return nativeLaunchCastWindow(url); |
| + } |
| + |
| + /** |
| + * Stops a native cast shell instance created by {@link #launchCastWindow(String)}. |
| + * @param nativeCastWindow Pointer of native cast shell instance returned |
| + * by {@link #launchCastWindow(String)}. |
| + * @see #launchCastWindow(String) |
| + */ |
| + public void stopCastWindow(long nativeCastWindow) { |
| + nativeStopCastWindow(nativeCastWindow); |
| + } |
| + |
| + @SuppressWarnings("unused") |
| + @CalledByNative |
| + private Object createCastWindow() { |
| + assert mContentViewRenderView != null; |
| + LayoutInflater inflater = |
| + (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); |
| + CastWindowAndroid shellView = |
| + (CastWindowAndroid) inflater.inflate(R.layout.cast_window_view, null); |
| + shellView.setWindow(mWindow); |
| + |
| + if (mActiveCastWindow != null) closeCastWindow(mActiveCastWindow); |
| + |
| + shellView.setContentViewRenderView(mContentViewRenderView); |
| + addView(shellView, new FrameLayout.LayoutParams( |
| + FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); |
| + mActiveCastWindow = shellView; |
| + ContentViewCore contentViewCore = mActiveCastWindow.getContentViewCore(); |
| + if (contentViewCore != null) { |
| + mContentViewRenderView.setCurrentContentViewCore(contentViewCore); |
| + contentViewCore.onShow(); |
| + } |
| + |
| + if (mDelegate != null) { |
| + mDelegate.onCreated(); |
| + } |
| + |
| + return shellView; |
| + } |
| + |
| + @SuppressWarnings("unused") |
| + @CalledByNative |
| + private void closeCastWindow(CastWindowAndroid shellView) { |
| + if (shellView == mActiveCastWindow) mActiveCastWindow = null; |
| + ContentViewCore contentViewCore = shellView.getContentViewCore(); |
| + if (contentViewCore != null) contentViewCore.onHide(); |
| + shellView.setContentViewRenderView(null); |
| + shellView.setWindow(null); |
| + removeView(shellView); |
| + |
| + if (mDelegate != null) { |
| + mDelegate.onClosed(); |
| + } |
| + } |
| + |
| + private static native void nativeInit(Object shellManagerInstance); |
| + private static native long nativeLaunchCastWindow(String url); |
| + private static native void nativeStopCastWindow(long pointerOfNativeCastWindow); |
| + public static native void nativeEnableDevTools(boolean enable); |
| +} |