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

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

Issue 490603002: Chromecast: initial checkin of Android-based cast shell. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: added android DEPS (git cl presubmit doesn't check Java DEPS?) Created 6 years, 3 months 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/shell/android/apk/src/org/chromium/chromecast/shell/CastWindowAndroid.java
diff --git a/chromecast/shell/android/apk/src/org/chromium/chromecast/shell/CastWindowAndroid.java b/chromecast/shell/android/apk/src/org/chromium/chromecast/shell/CastWindowAndroid.java
new file mode 100644
index 0000000000000000000000000000000000000000..057f812734600fb95533fdcd8f66053c21f9705e
--- /dev/null
+++ b/chromecast/shell/android/apk/src/org/chromium/chromecast/shell/CastWindowAndroid.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.content.Intent;
+import android.net.Uri;
+import android.support.v4.content.LocalBroadcastManager;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+
+import org.chromium.base.CalledByNative;
+import org.chromium.base.JNINamespace;
+import org.chromium.content.browser.ContentView;
+import org.chromium.content.browser.ContentViewCore;
+import org.chromium.content.browser.ContentViewRenderView;
+import org.chromium.content.browser.WebContentsObserverAndroid;
+import org.chromium.content_public.browser.LoadUrlParams;
+import org.chromium.ui.base.WindowAndroid;
+
+/**
+ * Container for the various UI components that make up a shell window.
+ */
+@JNINamespace("chromecast::shell")
+public class CastWindowAndroid extends LinearLayout {
+ public static final String TAG = "CastWindowAndroid";
+
+ public static final String ACTION_PAGE_LOADED = "castPageLoaded";
+ public static final String ACTION_ENABLE_DEV_TOOLS = "castEnableDevTools";
+ public static final String ACTION_DISABLE_DEV_TOOLS = "castDisableDevTools";
+
+ private ContentViewCore mContentViewCore;
+ private ContentViewRenderView mContentViewRenderView;
+ private WebContentsObserverAndroid mWebContentsObserver;
+ private WindowAndroid mWindow;
+
+ /**
+ * Constructor for inflating via XML.
+ */
+ public CastWindowAndroid(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ /**
+ * Set the SurfaceView being renderered to as soon as it is available.
+ */
+ public void setContentViewRenderView(ContentViewRenderView contentViewRenderView) {
+ FrameLayout contentViewHolder = (FrameLayout) findViewById(R.id.contentview_holder);
+ if (contentViewRenderView == null) {
+ if (mContentViewRenderView != null) {
+ contentViewHolder.removeView(mContentViewRenderView);
+ }
+ } else {
+ contentViewHolder.addView(contentViewRenderView,
+ new FrameLayout.LayoutParams(
+ FrameLayout.LayoutParams.MATCH_PARENT,
+ FrameLayout.LayoutParams.MATCH_PARENT));
+ }
+ mContentViewRenderView = contentViewRenderView;
+ }
+
+ /**
+ * @param window The owning window for this shell.
+ */
+ public void setWindow(WindowAndroid window) {
+ mWindow = window;
+ }
+
+ /**
+ * Loads an URL. This will perform minimal amounts of sanitizing of the URL to attempt to
+ * make it valid.
+ *
+ * @param url The URL to be loaded by the shell.
+ */
+ public void loadUrl(String url) {
+ if (url == null) return;
+
+ if (TextUtils.equals(url, mContentViewCore.getUrl())) {
+ mContentViewCore.reload(true);
+ } else {
+ mContentViewCore.loadUrl(new LoadUrlParams(normalizeUrl(url)));
+ }
+
+ // TODO(aurimas): Remove this when crbug.com/174541 is fixed.
+ mContentViewCore.getContainerView().clearFocus();
+ mContentViewCore.getContainerView().requestFocus();
+ }
+
+ /**
+ * Given a URI String, performs minimal normalization to attempt to build a usable URL from it.
+ * @param uriString The passed-in path to be normalized.
+ * @return The normalized URL, as a string.
+ */
+ private static String normalizeUrl(String uriString) {
+ if (uriString == null) return uriString;
+ Uri uri = Uri.parse(uriString);
+ if (uri.getScheme() == null) {
+ uri = Uri.parse("http://" + uriString);
+ }
+ return uri.toString();
+ }
+
+ /**
+ * Initializes the ContentView based on the native tab contents pointer passed in.
+ * @param nativeWebContents The pointer to the native tab contents object.
+ */
+ @SuppressWarnings("unused")
+ @CalledByNative
+ private void initFromNativeWebContents(long nativeWebContents) {
+ Context context = getContext();
+ mContentViewCore = new ContentViewCore(context);
+ ContentView view = ContentView.newInstance(context, mContentViewCore);
+ mContentViewCore.initialize(view, view, nativeWebContents, mWindow);
+
+ if (getParent() != null) mContentViewCore.onShow();
+ ((FrameLayout) findViewById(R.id.contentview_holder)).addView(view,
+ new FrameLayout.LayoutParams(
+ FrameLayout.LayoutParams.MATCH_PARENT,
+ FrameLayout.LayoutParams.MATCH_PARENT));
+ view.requestFocus();
+ mContentViewRenderView.setCurrentContentViewCore(mContentViewCore);
+
+ mWebContentsObserver = new WebContentsObserverAndroid(mContentViewCore.getWebContents()) {
+ @Override
+ public void didStopLoading(String url) {
+ Uri intentUri = Uri.parse(mContentViewCore
+ .getOriginalUrlForActiveNavigationEntry());
+ Log.v(TAG, "Broadcast ACTION_PAGE_LOADED: scheme=" + intentUri.getScheme()
+ + ", host=" + intentUri.getHost());
+ LocalBroadcastManager.getInstance(getContext()).sendBroadcast(
+ new Intent(ACTION_PAGE_LOADED, intentUri));
+ }
+ };
+ }
+
+ /**
+ * @return The {@link ViewGroup} currently shown by this Shell.
+ */
+ public ViewGroup getContentView() {
+ return mContentViewCore.getContainerView();
+ }
+
+ /**
+ * @return The {@link ContentViewCore} currently managing the view shown by this Shell.
+ */
+ public ContentViewCore getContentViewCore() {
+ return mContentViewCore;
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698