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)); |
+ } |
+ } |
+} |