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

Unified Diff: chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/DocumentRecentTabsManager.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/DocumentRecentTabsManager.java
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/DocumentRecentTabsManager.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/DocumentRecentTabsManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b53458d043f7d149a3f37d5835329ed7a8d72a9
--- /dev/null
+++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/DocumentRecentTabsManager.java
@@ -0,0 +1,200 @@
+// 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.annotation.TargetApi;
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.ActivityManager.RecentTaskInfo;
+import android.app.Dialog;
+import android.content.Intent;
+import android.os.Build;
+import android.text.TextUtils;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.chrome.browser.ChromeMobileApplication;
+import org.chromium.chrome.browser.ForeignSessionHelper.ForeignSession;
+import org.chromium.chrome.browser.ForeignSessionHelper.ForeignSessionTab;
+import org.chromium.chrome.browser.IntentHandler;
+import org.chromium.chrome.browser.RecentlyClosedBridge.RecentlyClosedTab;
+import org.chromium.chrome.browser.Tab;
+import org.chromium.chrome.browser.UrlConstants;
+import org.chromium.chrome.browser.document.DocumentUtils;
+import org.chromium.chrome.browser.tabmodel.document.ActivityDelegate;
+import org.chromium.chrome.browser.tabmodel.document.DocumentTabModel;
+import org.chromium.chrome.browser.tabmodel.document.DocumentTabModelImpl;
+import org.chromium.ui.WindowOpenDisposition;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ChromeHome specific version of RecentTabsManager that allows opening new DocumentActivities
+ * instead of tabs.
+ */
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
+public class DocumentRecentTabsManager extends RecentTabsManager {
+ /**
+ * The number of ms to delay opening a new tab, so that we have time to hide dialog before
+ * the screenshot of the current page is taken.
+ */
+ private static final int NEW_TAB_DELAY_MS = 150;
+ private final Activity mActivity;
+ private final boolean mFinishActivityOnOpen;
+ private final List<CurrentlyOpenTab> mCurrentlyOpenTabs;
+ private final DocumentTabModel mTabModel;
+ private final DocumentTabModel.InitializationObserver mUpdateOpenTabsObserver;
+ private Dialog mDialog;
+
+ private boolean mShowingAllInCurrentTabs;
+
+ /**
+ * @param activity Activity that should be used to launch intents.
+ */
+ public DocumentRecentTabsManager(Tab tab, Activity activity, boolean finishActivityOnOpen) {
+ super(tab, tab.getProfile().getOriginalProfile(), activity);
+ mActivity = activity;
+ mFinishActivityOnOpen = finishActivityOnOpen;
+ mCurrentlyOpenTabs = new ArrayList<CurrentlyOpenTab>();
+ mTabModel =
+ ChromeMobileApplication.getDocumentTabModelSelector().getModel(tab.isIncognito());
+ mUpdateOpenTabsObserver = new DocumentTabModel.InitializationObserver(mTabModel) {
+ @Override
+ public boolean isSatisfied(int currentState) {
+ return currentState >= DocumentTabModelImpl.STATE_FULLY_LOADED;
+ }
+
+ @Override
+ public boolean isCanceled() {
+ return mActivity.isDestroyed() || mActivity.isFinishing();
+ }
+
+ @Override
+ protected void runImmediately() {
+ updateCurrentlyOpenTabsWhenDatabaseReady();
+ }
+ };
+ updateCurrentlyOpenTabs();
+ }
+
+ /**
+ * @param dialog Dialog that displays the RecentTabsPage and will be dismissed when
+ * a link is opened.
+ */
+ public void setDialog(Dialog dialog) {
+ mDialog = dialog;
+ }
+
+ @Override
+ public void destroy() {
+ super.destroy();
+ }
+
+ @Override
+ public void openForeignSessionTab(final ForeignSession session, final ForeignSessionTab tab,
+ int windowDisposition) {
+ // Hide the dialog for screenshot. We don't want to dismiss yet because that will destroy
+ // the NativePage objects we need in the delayed runnable.
+ if (mDialog != null) mDialog.hide();
+ ThreadUtils.postOnUiThreadDelayed(new Runnable() {
+ @Override
+ public void run() {
+ DocumentRecentTabsManager.super.openForeignSessionTab(
+ session, tab, WindowOpenDisposition.NEW_FOREGROUND_TAB);
+ if (mDialog != null) mDialog.dismiss();
+ if (mFinishActivityOnOpen) mActivity.finishAndRemoveTask();
+ }
+ }, NEW_TAB_DELAY_MS);
+ }
+
+ @Override
+ public void openRecentlyClosedTab(final RecentlyClosedTab tab, int windowDisposition) {
+ // Hide the dialog for screenshot. We don't want to dismiss yet because that will destroy
+ // the NativePage objects we need in the delayed runnable.
+ if (mDialog != null) mDialog.hide();
+ ThreadUtils.postOnUiThreadDelayed(new Runnable() {
+ @Override
+ public void run() {
+ DocumentRecentTabsManager.super.openRecentlyClosedTab(
+ tab, WindowOpenDisposition.NEW_FOREGROUND_TAB);
+ if (mDialog != null) mDialog.dismiss();
+ if (mFinishActivityOnOpen) mActivity.finishAndRemoveTask();
+ }
+ }, NEW_TAB_DELAY_MS);
+ }
+
+ @Override
+ public void openHistoryPage() {
+ if (mDialog != null) mDialog.dismiss();
+ super.openHistoryPage();
+ }
+
+ @Override
+ public List<CurrentlyOpenTab> getCurrentlyOpenTabs() {
+ return mCurrentlyOpenTabs;
+ }
+
+ @Override
+ public void setCurrentlyOpenTabsShowAll(boolean showingAll) {
+ mShowingAllInCurrentTabs = showingAll;
+ postUpdate();
+ }
+
+ @Override
+ public boolean isCurrentlyOpenTabsShowingAll() {
+ return mShowingAllInCurrentTabs;
+ }
+
+ @Override
+ protected void updateCurrentlyOpenTabs() {
+ mUpdateOpenTabsObserver.runWhenReady();
+ }
+
+ private void updateCurrentlyOpenTabsWhenDatabaseReady() {
+ final int currentTabId = ActivityDelegate.getTabIdFromIntent(mActivity.getIntent());
+
+ ActivityManager am = (ActivityManager) mActivity.getSystemService(
+ Activity.ACTIVITY_SERVICE);
+ List<ActivityManager.AppTask> taskList = am.getAppTasks();
+ for (int i = 0; i < taskList.size(); i++) {
+ RecentTaskInfo taskInfo = DocumentUtils.getTaskInfoFromTask(taskList.get(i));
+ if (taskInfo == null) continue;
+
+ final Intent baseIntent = taskInfo.baseIntent;
+ final int tabId = ActivityDelegate.getTabIdFromIntent(baseIntent);
+ String url = mTabModel.getCurrentUrlForDocument(tabId);
+ if (TextUtils.isEmpty(url) || url.startsWith(UrlConstants.CHROME_NATIVE_SCHEME)) {
+ continue;
+ }
+
+ CharSequence description = taskInfo.description;
+ String title = description != null ? description.toString() : "";
+
+ final Runnable startNewDocument = new Runnable() {
+ @Override
+ public void run() {
+ Intent newIntent = new Intent();
+ newIntent.setAction(Intent.ACTION_MAIN);
+ newIntent.setPackage(mActivity.getPackageName());
+ newIntent.putExtra(
+ IntentHandler.TabOpenType.BRING_TAB_TO_FRONT.name(), tabId);
+ newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
+ mActivity.startActivity(newIntent);
+ }
+ };
+
+ Runnable onClickRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (mDialog != null) mDialog.dismiss();
+ if (currentTabId != tabId) {
+ ThreadUtils.postOnUiThreadDelayed(startNewDocument, NEW_TAB_DELAY_MS);
+ }
+ }
+ };
+ mCurrentlyOpenTabs.add(new CurrentlyOpenTab(url, title, onClickRunnable));
+ }
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698