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