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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowsreActionsTabModelSelector.java

Issue 2984453002: Add Browser Actions tab model selector and open a tab through it if ChromeTabbedActivity is not ava…
Patch Set: Created 3 years, 5 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/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);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698