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

Unified Diff: chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/NativePageFactory.java

Issue 1141283003: Upstream oodles of Chrome for Android code into Chromium. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: final patch? Created 5 years, 7 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: chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/NativePageFactory.java
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/NativePageFactory.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/NativePageFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..148fdda27c57292ac9bd142f9dbdc2cc4428349a
--- /dev/null
+++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/NativePageFactory.java
@@ -0,0 +1,153 @@
+// Copyright 2015 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.chrome.browser.ntp;
+
+import android.app.Activity;
+import android.net.Uri;
+
+import org.chromium.base.VisibleForTesting;
+import org.chromium.chrome.browser.NativePage;
+import org.chromium.chrome.browser.Tab;
+import org.chromium.chrome.browser.UrlConstants;
+import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkPage;
+import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkUtils;
+import org.chromium.chrome.browser.tabmodel.TabModelSelector;
+import org.chromium.chrome.browser.util.FeatureUtilities;
+import org.chromium.ui.base.DeviceFormFactor;
+
+/**
+ * Creates NativePage objects to show chrome-native:// URLs using the native Android view system.
+ */
+public class NativePageFactory {
+
+ public static final String CHROME_NATIVE_SCHEME = "chrome-native";
+
+ private static NativePageBuilder sNativePageBuilder = new NativePageBuilder();
+
+ @VisibleForTesting
+ static class NativePageBuilder {
+ protected NativePage buildNewTabPage(Activity activity, Tab tab,
+ TabModelSelector tabModelSelector) {
+ if (tab.isIncognito()) {
+ return new IncognitoNewTabPage(activity, tab);
+ } else if (FeatureUtilities.isDocumentMode(activity)) {
+ return new DocumentNewTabPage(activity, tab, tabModelSelector);
+ } else {
+ return new NewTabPage(activity, tab, tabModelSelector);
+ }
+ }
+
+ protected NativePage buildBookmarksPage(Activity activity, Tab tab,
+ TabModelSelector tabModelSelector) {
+ if (EnhancedBookmarkUtils.isEnhancedBookmarkEnabled(
+ tab.getProfile().getOriginalProfile()) && DeviceFormFactor.isTablet(activity)) {
+ return EnhancedBookmarkPage.buildPage(activity, tab);
+ } else {
+ return BookmarksPage.buildPage(activity, tab, tabModelSelector);
+ }
+ }
+
+ protected NativePage buildRecentTabsPage(Activity activity, Tab tab) {
+ RecentTabsManager recentTabsManager = FeatureUtilities.isDocumentMode(activity)
+ ? new DocumentRecentTabsManager(tab, activity, false)
+ : new RecentTabsManager(tab, tab.getProfile(), activity);
+ return new RecentTabsPage(activity, recentTabsManager);
+ }
+ }
+
+ enum NativePageType {
+ NONE, CANDIDATE, NTP, BOOKMARKS, RECENT_TABS
+ }
+
+ private static NativePageType nativePageType(String url, NativePage candidatePage,
+ boolean isIncognito) {
+ if (url == null) return NativePageType.NONE;
+
+ Uri uri = Uri.parse(url);
+ if (!CHROME_NATIVE_SCHEME.equals(uri.getScheme())) {
+ return NativePageType.NONE;
+ }
+
+ String host = uri.getHost();
+ if (candidatePage != null && candidatePage.getHost().equals(host)) {
+ return NativePageType.CANDIDATE;
+ }
+
+ if (UrlConstants.NTP_HOST.equals(host)) {
+ return NativePageType.NTP;
+ } else if (UrlConstants.BOOKMARKS_HOST.equals(host)) {
+ return NativePageType.BOOKMARKS;
+ } else if (UrlConstants.RECENT_TABS_HOST.equals(host) && !isIncognito) {
+ return NativePageType.RECENT_TABS;
+ } else {
+ return NativePageType.NONE;
+ }
+ }
+
+ /**
+ * Returns a NativePage for displaying the given URL if the URL is a valid chrome-native URL,
+ * or null otherwise. If candidatePage is non-null and corresponds to the URL, it will be
+ * returned. Otherwise, a new NativePage will be constructed.
+ *
+ * @param url The URL to be handled.
+ * @param candidatePage A NativePage to be reused if it matches the url, or null.
+ * @param tab The Tab that will show the page.
+ * @param tabModelSelector The TabModelSelector containing the tab.
+ * @param activity The activity used to create the views for the page.
+ * @return A NativePage showing the specified url or null.
+ */
+ public static NativePage createNativePageForURL(String url, NativePage candidatePage,
+ Tab tab, TabModelSelector tabModelSelector, Activity activity) {
+ return createNativePageForURL(url, candidatePage, tab, tabModelSelector, activity,
+ tab.isIncognito());
+ }
+
+ @VisibleForTesting
+ static NativePage createNativePageForURL(String url, NativePage candidatePage,
+ Tab tab, TabModelSelector tabModelSelector, Activity activity,
+ boolean isIncognito) {
+ NativePage page;
+
+ switch (nativePageType(url, candidatePage, isIncognito)) {
+ case NONE:
+ return null;
+ case CANDIDATE:
+ page = candidatePage;
+ break;
+ case NTP:
+ page = sNativePageBuilder.buildNewTabPage(activity, tab, tabModelSelector);
+ break;
+ case BOOKMARKS:
+ page = sNativePageBuilder.buildBookmarksPage(activity, tab, tabModelSelector);
+ if (page == null) return null; // Enhanced Bookmarks page is not shown on phone
+ break;
+ case RECENT_TABS:
+ page = sNativePageBuilder.buildRecentTabsPage(activity, tab);
+ break;
+ default:
+ assert false;
+ return null;
+ }
+ page.updateForUrl(url);
+ return page;
+ }
+
+ /**
+ * Returns whether the URL would navigate to a native page.
+ *
+ * @param url The URL to be checked.
+ * @param isIncognito Whether the page will be displayed in incognito mode.
+ * @return Whether the host and the scheme of the passed in URL matches one of the supported
+ * native pages.
+ */
+ public static boolean isNativePageUrl(String url, boolean isIncognito) {
+ return nativePageType(url, null, isIncognito) != NativePageType.NONE;
+ }
+
+ @VisibleForTesting
+ static void setNativePageBuilderForTesting(NativePageBuilder builder) {
+ sNativePageBuilder = builder;
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698