Index: chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowsreActionsTabModelSelector.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowsreActionsTabModelSelector.java b/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowsreActionsTabModelSelector.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..18d58e0f0db3c32938072147779338609780e821 |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowsreActionsTabModelSelector.java |
@@ -0,0 +1,191 @@ |
+// Copyright 2017 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.browseractions; |
+ |
+import android.app.Activity; |
+import android.content.Intent; |
+ |
+import org.chromium.base.ContextUtils; |
+import org.chromium.base.ThreadUtils; |
+import org.chromium.chrome.browser.browseractions.BrowserActionsTabCreatorManager.BrowserActionsTabCreator; |
+import org.chromium.chrome.browser.tab.Tab; |
+import org.chromium.chrome.browser.tabmodel.IncognitoTabModel; |
+import org.chromium.chrome.browser.tabmodel.IncognitoTabModelImplCreator; |
+import org.chromium.chrome.browser.tabmodel.TabCreatorManager; |
+import org.chromium.chrome.browser.tabmodel.TabModel; |
+import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
+import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; |
+import org.chromium.chrome.browser.tabmodel.TabModelDelegate; |
+import org.chromium.chrome.browser.tabmodel.TabModelImpl; |
+import org.chromium.chrome.browser.tabmodel.TabModelOrderController; |
+import org.chromium.chrome.browser.tabmodel.TabModelSelectorBase; |
+import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver; |
+import org.chromium.chrome.browser.tabmodel.TabModelSelectorUma; |
+import org.chromium.chrome.browser.tabmodel.TabPersistencePolicy; |
+import org.chromium.chrome.browser.tabmodel.TabPersistentStore; |
+import org.chromium.chrome.browser.tabmodel.TabPersistentStore.TabPersistentStoreObserver; |
+import org.chromium.content_public.browser.LoadUrlParams; |
+ |
+import java.util.concurrent.atomic.AtomicBoolean; |
+ |
+/** |
+ * The tab model selector creates Tabs for Browser Actions. Tabs created by it are not shown in the |
+ * foreground and don't need {@link TabContentMananger}. |
+ */ |
+public class BrowsreActionsTabModelSelector |
Yusuf
2017/07/18 22:59:47
I wonder if we should just move this to tabmodel/
Yusuf
2017/07/18 22:59:47
name typo
ltian
2017/08/07 23:24:12
Looks like the only thing need to change to public
ltian
2017/08/07 23:24:12
Ops, sorry.
|
+ extends TabModelSelectorBase implements TabModelDelegate { |
+ /** The singleton reference. */ |
+ private static BrowsreActionsTabModelSelector sInstance; |
+ |
+ private final TabCreatorManager mTabCreatorManager; |
+ |
+ private final TabPersistentStore mTabSaver; |
+ |
+ private final TabModelOrderController mOrderController; |
+ |
+ private final TabModelSelectorUma mUma; |
+ |
+ /** Flag set to false when the asynchronous loading of tabs is finished. */ |
+ private final AtomicBoolean mSessionRestoreInProgress = new AtomicBoolean(true); |
+ |
+ // This flag signifies the object has gotten an onNativeReady callback and |
Yusuf
2017/07/18 22:59:47
/** as well
ltian
2017/08/07 23:24:11
Done.
|
+ // has not been destroyed. |
+ private boolean mActiveState; |
+ |
+ /** |
+ * Builds a {@link BrowsreActionsTabModelSelector} instance. |
+ * |
+ * @param activity An {@link Activity} instance. |
+ * @param tabCreatorManager A {@link TabCreatorManager} instance. |
+ * @param persistencePolicy A {@link TabPersistencePolicy} instance. |
+ */ |
+ private BrowsreActionsTabModelSelector(Activity activity, TabCreatorManager tabCreatorManager, |
+ TabPersistencePolicy persistencePolicy) { |
+ super(); |
+ mTabCreatorManager = tabCreatorManager; |
+ mUma = new TabModelSelectorUma(activity); |
+ final TabPersistentStoreObserver persistentStoreObserver = |
+ new TabPersistentStoreObserver() { |
+ @Override |
+ public void onStateLoaded() { |
+ markTabStateInitialized(); |
+ } |
+ }; |
+ mTabSaver = new TabPersistentStore( |
+ persistencePolicy, this, mTabCreatorManager, persistentStoreObserver); |
Yusuf
2017/07/18 22:59:47
if we are going to just provide a new one in getIn
ltian
2017/08/07 23:24:11
Done.
|
+ mOrderController = new TabModelOrderController(this); |
+ } |
+ |
+ /** |
+ * @return The singleton instance of {@link BrowsreActionsTabModelSelector}. |
+ */ |
+ public static BrowsreActionsTabModelSelector getInstance( |
+ Activity activity, TabCreatorManager tabCreatorManager) { |
+ ThreadUtils.assertOnUiThread(); |
+ if (sInstance == null) { |
+ BrowserActionsTabPersistencePolicy persistencePolicy = |
+ new BrowserActionsTabPersistencePolicy(); |
+ sInstance = new BrowsreActionsTabModelSelector( |
+ activity, tabCreatorManager, persistencePolicy); |
+ } |
+ return sInstance; |
+ } |
+ |
+ @Override |
+ public void markTabStateInitialized() { |
+ super.markTabStateInitialized(); |
+ if (!mSessionRestoreInProgress.getAndSet(false)) return; |
+ |
+ // This is the first time we set |
+ // |mSessionRestoreInProgress|, so we need to broadcast. |
+ TabModelImpl model = (TabModelImpl) getModel(false); |
Yusuf
2017/07/18 22:59:47
override getModel return value explicitly instead
ltian
2017/08/07 23:24:11
Done.
|
+ |
+ if (model != null) { |
+ model.broadcastSessionRestoreComplete(); |
+ } else { |
+ assert false : "Normal tab model is null after tab state loaded."; |
+ } |
+ } |
+ |
+ public void initializeSelector() { |
Yusuf
2017/07/18 22:59:47
javadoc
ltian
2017/08/07 23:24:11
Done.
|
+ assert !mActiveState : "onNativeLibraryReady called twice!"; |
+ BrowserActionsTabCreator regularTabCreator = |
+ (BrowserActionsTabCreator) mTabCreatorManager.getTabCreator(false); |
+ BrowserActionsTabCreator incognitoTabCreator = |
+ (BrowserActionsTabCreator) mTabCreatorManager.getTabCreator(true); |
+ TabModelImpl normalModel = new TabModelImpl(false, false, regularTabCreator, |
+ incognitoTabCreator, mUma, mOrderController, null, mTabSaver, this, false); |
+ TabModel incognitoModel = |
Yusuf
2017/07/18 22:59:47
we should make sure at least in first implementati
ltian
2017/08/07 23:24:11
This implementation initializes the incognito tab
|
+ new IncognitoTabModel(new IncognitoTabModelImplCreator(regularTabCreator, |
+ incognitoTabCreator, mUma, mOrderController, null, mTabSaver, this)); |
+ initialize(isIncognitoSelected(), normalModel, incognitoModel); |
+ mActiveState = true; |
+ new TabModelSelectorTabObserver(this) { |
+ @Override |
+ public void onLoadStopped(Tab tab, boolean toDifferentDocument) { |
+ if (tab != null) mTabSaver.addTabToSaveQueue(tab); |
+ Intent intent = BrowserActionsTabCreationService.getTabCreationIntent( |
+ BrowserActionsTabCreationService.ACTION_TAB_CREATION_FINISH); |
+ ContextUtils.getApplicationContext().startService(intent); |
+ } |
+ }; |
+ } |
+ |
+ /** |
+ * @return Whether the selector has been initialized. |
+ */ |
+ public boolean isActiveState() { |
+ return mActiveState; |
+ } |
+ |
+ @Override |
+ public Tab openNewTab( |
+ LoadUrlParams loadUrlParams, TabLaunchType type, Tab parent, boolean incognito) { |
+ return mTabCreatorManager.getTabCreator(incognito).createNewTab( |
+ loadUrlParams, type, parent); |
+ } |
+ |
+ @Override |
+ public void requestToShowTab(Tab tab, TabSelectionType type) {} |
+ |
+ @Override |
+ public boolean closeAllTabsRequest(boolean incognito) { |
+ return false; |
+ } |
+ |
+ @Override |
+ public boolean isInOverviewMode() { |
+ return false; |
+ } |
+ |
+ @Override |
+ public boolean isSessionRestoreInProgress() { |
+ return mSessionRestoreInProgress.get(); |
+ } |
+ |
+ public void saveState() { |
+ commitAllTabClosures(); |
+ mTabSaver.saveState(); |
+ } |
+ |
+ /** |
+ * Load the saved tab state. This should be called before any new tabs are created. The saved |
+ * tabs shall not be restored until {@link #restoreTabs} is called. |
+ * @param ignoreIncognitoFiles Whether to skip loading incognito tabs. |
+ */ |
+ public void loadState(boolean ignoreIncognitoFiles) { |
+ mTabSaver.loadState(ignoreIncognitoFiles); |
+ } |
+ |
+ /** |
+ * Restore the saved tabs which were loaded by {@link #loadState}. |
+ * |
+ * @param setActiveTab If true, synchronously load saved active tab and set it as the current |
+ * active tab. |
+ */ |
+ public void restoreTabs(boolean setActiveTab) { |
+ mTabSaver.restoreTabs(setActiveTab); |
+ } |
+} |