| Index: chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
|
| index 97a091c6681a7874e37bdc1fb8193fdfe8999ca9..9ac0f6779abbe40ea0807eefc5572ae9aefe0a66 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
|
| @@ -8,18 +8,12 @@ import android.content.Context;
|
| import android.text.TextUtils;
|
|
|
| import org.chromium.base.CommandLine;
|
| -import org.chromium.base.SysUtils;
|
| -import org.chromium.base.VisibleForTesting;
|
| import org.chromium.base.library_loader.LibraryLoader;
|
| import org.chromium.base.metrics.RecordHistogram;
|
| import org.chromium.chrome.browser.ChromeActivity;
|
| import org.chromium.chrome.browser.ChromeSwitches;
|
| -import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.PanelState;
|
| import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason;
|
| -import org.chromium.chrome.browser.compositor.bottombar.readermode.ReaderModePanel;
|
| -import org.chromium.chrome.browser.infobar.InfoBar;
|
| -import org.chromium.chrome.browser.infobar.InfoBarContainer;
|
| -import org.chromium.chrome.browser.infobar.InfoBarContainer.InfoBarContainerObserver;
|
| +import org.chromium.chrome.browser.infobar.ReaderModeInfoBar;
|
| import org.chromium.chrome.browser.rappor.RapporServiceBridge;
|
| import org.chromium.chrome.browser.tab.Tab;
|
| import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
|
| @@ -27,14 +21,14 @@ import org.chromium.chrome.browser.tabmodel.TabModel;
|
| import org.chromium.chrome.browser.tabmodel.TabModelSelector;
|
| import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver;
|
| import org.chromium.chrome.browser.util.AccessibilityUtil;
|
| -import org.chromium.chrome.browser.widget.findinpage.FindToolbarObserver;
|
| import org.chromium.components.dom_distiller.content.DistillablePageUtils;
|
| import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
|
| import org.chromium.content_public.browser.LoadUrlParams;
|
| +import org.chromium.content_public.browser.NavigationController;
|
| +import org.chromium.content_public.browser.NavigationEntry;
|
| import org.chromium.content_public.browser.WebContents;
|
| import org.chromium.content_public.browser.WebContentsObserver;
|
| import org.chromium.ui.UiUtils;
|
| -import org.chromium.ui.base.DeviceFormFactor;
|
| import org.chromium.ui.base.PageTransition;
|
|
|
| import java.util.HashMap;
|
| @@ -46,59 +40,37 @@ import java.util.concurrent.TimeUnit;
|
| * reader mode and reader mode preferences toolbar icon and hiding the
|
| * browser controls when a reader mode page has finished loading.
|
| */
|
| -public class ReaderModeManager extends TabModelSelectorTabObserver
|
| - implements InfoBarContainerObserver, ReaderModeManagerDelegate {
|
| -
|
| - /**
|
| - * POSSIBLE means reader mode can be entered.
|
| - */
|
| +public class ReaderModeManager
|
| + extends TabModelSelectorTabObserver implements ReaderModeManagerDelegate {
|
| + /** POSSIBLE means reader mode can be entered. */
|
| public static final int POSSIBLE = 0;
|
|
|
| - /**
|
| - * NOT_POSSIBLE means reader mode cannot be entered.
|
| - */
|
| + /** NOT_POSSIBLE means reader mode cannot be entered. */
|
| public static final int NOT_POSSIBLE = 1;
|
|
|
| - /**
|
| - * STARTED means reader mode is currently in reader mode.
|
| - */
|
| + /** STARTED means reader mode is currently in reader mode. */
|
| public static final int STARTED = 2;
|
|
|
| - // The url of the last page visited if the last page was reader mode page. Otherwise null.
|
| + /** The url of the last page visited if the last page was reader mode page. Otherwise null. */
|
| private String mReaderModePageUrl;
|
|
|
| - // Whether the fact that the current web page was distillable or not has been recorded.
|
| + /** Whether the fact that the current web page was distillable or not has been recorded. */
|
| private boolean mIsUmaRecorded;
|
|
|
| - // The per-tab state of distillation.
|
| + /** The per-tab state of distillation. */
|
| protected Map<Integer, ReaderModeTabInfo> mTabStatusMap;
|
|
|
| - // The current tab ID. This will change as the user switches between tabs.
|
| - private int mTabId;
|
| -
|
| - // The ReaderModePanel that this class is managing.
|
| - protected ReaderModePanel mReaderModePanel;
|
| -
|
| - // The ChromeActivity that this panel exists in.
|
| + /** The ChromeActivity that this infobar exists in. */
|
| private ChromeActivity mChromeActivity;
|
|
|
| - // The primary means of getting the currently active tab.
|
| + /** The primary means of getting the currently active tab. */
|
| private TabModelSelector mTabModelSelector;
|
|
|
| - private boolean mIsFullscreenModeEntered;
|
| - private boolean mIsFindToolbarShowing;
|
| - private boolean mIsKeyboardShowing;
|
| -
|
| - // InfoBar tracking.
|
| - private boolean mIsInfoBarContainerShown;
|
| -
|
| - // If Reader Mode is detecting all pages as distillable.
|
| + /** If Reader Mode is detecting all pages as distillable. */
|
| private boolean mIsReaderHeuristicAlwaysTrue;
|
|
|
| -
|
| public ReaderModeManager(TabModelSelector selector, ChromeActivity activity) {
|
| super(selector);
|
| - mTabId = Tab.INVALID_TAB_ID;
|
| mTabModelSelector = selector;
|
| mChromeActivity = activity;
|
| mTabStatusMap = new HashMap<>();
|
| @@ -129,29 +101,9 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| DomDistillerUIUtils.destroy(this);
|
|
|
| mChromeActivity = null;
|
| - mReaderModePanel = null;
|
| mTabModelSelector = null;
|
| }
|
|
|
| - /**
|
| - * @return A FindToolbarObserver capable of hiding the Reader Mode panel.
|
| - */
|
| - public FindToolbarObserver getFindToolbarObserver() {
|
| - return new FindToolbarObserver() {
|
| - @Override
|
| - public void onFindToolbarShown() {
|
| - mIsFindToolbarShowing = true;
|
| - closeReaderPanel(StateChangeReason.UNKNOWN, true);
|
| - }
|
| -
|
| - @Override
|
| - public void onFindToolbarHidden() {
|
| - mIsFindToolbarShowing = false;
|
| - requestReaderPanelShow(StateChangeReason.UNKNOWN);
|
| - }
|
| - };
|
| - }
|
| -
|
| // TabModelSelectorTabObserver:
|
|
|
| @Override
|
| @@ -159,10 +111,8 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| if (mTabModelSelector == null) return;
|
|
|
| int shownTabId = shownTab.getId();
|
| - Tab previousTab = mTabModelSelector.getTabById(mTabId);
|
| - mTabId = shownTabId;
|
|
|
| - // If the reader panel was dismissed, stop here.
|
| + // If the reader infobar was dismissed, stop here.
|
| if (mTabStatusMap.containsKey(shownTabId)
|
| && mTabStatusMap.get(shownTabId).isDismissed()) {
|
| return;
|
| @@ -171,20 +121,6 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| // Set this manager as the active one for the UI utils.
|
| DomDistillerUIUtils.setReaderModeManagerDelegate(this);
|
|
|
| - // Update infobar state based on current tab.
|
| - if (shownTab.getInfoBarContainer() != null) {
|
| - mIsInfoBarContainerShown = shownTab.getInfoBarContainer().hasInfoBars();
|
| - }
|
| -
|
| - // Remove the infobar observer from the previous tab and attach it to the current one.
|
| - if (previousTab != null && previousTab.getInfoBarContainer() != null) {
|
| - previousTab.getInfoBarContainer().removeObserver(this);
|
| - }
|
| -
|
| - if (shownTab.getInfoBarContainer() != null) {
|
| - shownTab.getInfoBarContainer().addObserver(this);
|
| - }
|
| -
|
| // If there is no state info for this tab, create it.
|
| ReaderModeTabInfo tabInfo = mTabStatusMap.get(shownTabId);
|
| if (tabInfo == null) {
|
| @@ -194,6 +130,11 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| mTabStatusMap.put(shownTabId, tabInfo);
|
| }
|
|
|
| + if (DomDistillerUrlUtils.isDistilledPage(shownTab.getUrl())
|
| + && !tabInfo.isViewingReaderModePage()) {
|
| + tabInfo.onStartedReaderMode();
|
| + }
|
| +
|
| // Make sure there is a WebContentsObserver on this tab's WebContents.
|
| if (tabInfo.getWebContentsObserver() == null) {
|
| tabInfo.setWebContentsObserver(createWebContentsObserver(shownTab.getWebContents()));
|
| @@ -202,24 +143,33 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| // Make sure there is a distillability delegate set on the WebContents.
|
| setDistillabilityCallback(shownTabId);
|
|
|
| - requestReaderPanelShow(StateChangeReason.UNKNOWN);
|
| + tryShowingInfoBar();
|
| }
|
|
|
| @Override
|
| public void onHidden(Tab tab) {
|
| closeReaderPanel(StateChangeReason.UNKNOWN, false);
|
| + ReaderModeTabInfo info = mTabStatusMap.get(tab.getId());
|
| + if (info != null && info.isViewingReaderModePage()) {
|
| + long timeMs = info.onExitReaderMode();
|
| + recordReaderModeViewDuration(timeMs);
|
| + }
|
| }
|
|
|
| @Override
|
| public void onDestroyed(Tab tab) {
|
| if (tab == null) return;
|
| - if (tab.getInfoBarContainer() != null) {
|
| - tab.getInfoBarContainer().removeObserver(this);
|
| - }
|
| - // If the panel was not shown for the previous navigation, record it now.
|
| +
|
| + // If the infobar was not shown for the previous navigation, record it now.
|
| ReaderModeTabInfo info = mTabStatusMap.get(tab.getId());
|
| - if (info != null && !info.isPanelShowRecorded()) {
|
| - recordPanelVisibilityForNavigation(false);
|
| + if (info != null) {
|
| + if (!info.isInfoBarShowRecorded()) {
|
| + recordInfoBarVisibilityForNavigation(false);
|
| + }
|
| + if (info.isViewingReaderModePage()) {
|
| + long timeMs = info.onExitReaderMode();
|
| + recordReaderModeViewDuration(timeMs);
|
| + }
|
| }
|
| removeTabState(tab.getId());
|
| }
|
| @@ -239,20 +189,23 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
|
|
| @Override
|
| public void onContentChanged(Tab tab) {
|
| - // Only listen to events on the currently active tab.
|
| - if (tab.getId() != mTabId) return;
|
| - closeReaderPanel(StateChangeReason.UNKNOWN, false);
|
| -
|
| - if (mTabStatusMap.containsKey(mTabId)) {
|
| - // If the panel was closed using the "x" icon, don't show it again for this tab.
|
| - if (mTabStatusMap.get(mTabId).isDismissed()) return;
|
| - removeTabState(mTabId);
|
| + // If the content change was because of distiller switching web contents or Reader Mode has
|
| + // already been dismissed for this tab do nothing.
|
| + if (mTabStatusMap.containsKey(tab.getId()) && mTabStatusMap.get(tab.getId()).isDismissed()
|
| + && !DomDistillerUrlUtils.isDistilledPage(tab.getUrl())) {
|
| + return;
|
| }
|
|
|
| - ReaderModeTabInfo tabInfo = new ReaderModeTabInfo();
|
| + ReaderModeTabInfo tabInfo = mTabStatusMap.get(tab.getId());
|
| + if (!mTabStatusMap.containsKey(tab.getId())) {
|
| + tabInfo = new ReaderModeTabInfo();
|
| + mTabStatusMap.put(tab.getId(), tabInfo);
|
| + }
|
| + // If the tab state already existed, only reset the relevant data. Things like view duration
|
| + // need to be preserved.
|
| tabInfo.setStatus(NOT_POSSIBLE);
|
| tabInfo.setUrl(tab.getUrl());
|
| - mTabStatusMap.put(tab.getId(), tabInfo);
|
| + tabInfo.setIsCallbackSet(false);
|
|
|
| if (tab.getWebContents() != null) {
|
| tabInfo.setWebContentsObserver(createWebContentsObserver(tab.getWebContents()));
|
| @@ -264,62 +217,10 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| // Make sure there is a distillability delegate set on the WebContents.
|
| setDistillabilityCallback(tab.getId());
|
| }
|
| -
|
| - if (tab.getInfoBarContainer() != null) tab.getInfoBarContainer().addObserver(this);
|
| - }
|
| -
|
| - @Override
|
| - public void onToggleFullscreenMode(Tab tab, boolean enable) {
|
| - // Temporarily hide the reader mode panel while fullscreen is enabled.
|
| - if (enable) {
|
| - mIsFullscreenModeEntered = true;
|
| - closeReaderPanel(StateChangeReason.FULLSCREEN_ENTERED, false);
|
| - } else {
|
| - mIsFullscreenModeEntered = false;
|
| - requestReaderPanelShow(StateChangeReason.FULLSCREEN_EXITED);
|
| - }
|
| - }
|
| -
|
| - // InfoBarContainerObserver:
|
| -
|
| - @Override
|
| - public void onAddInfoBar(InfoBarContainer container, InfoBar infoBar, boolean isFirst) {
|
| - mIsInfoBarContainerShown = true;
|
| - // If the panel is opened past the peeking state, obscure the infobar.
|
| - if (mReaderModePanel != null && mReaderModePanel.isPanelOpened() && container != null) {
|
| - container.setIsObscuredByOtherView(true);
|
| - } else if (isFirst) {
|
| - // Temporarily hides the reader mode button while the infobars are shown.
|
| - closeReaderPanel(StateChangeReason.INFOBAR_SHOWN, false);
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void onRemoveInfoBar(InfoBarContainer container, InfoBar infoBar, boolean isLast) {
|
| - // Re-shows the reader mode button if necessary once the infobars are dismissed.
|
| - if (isLast) {
|
| - mIsInfoBarContainerShown = false;
|
| - requestReaderPanelShow(StateChangeReason.INFOBAR_HIDDEN);
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void onInfoBarContainerAttachedToWindow(boolean hasInfoBars) {
|
| - mIsInfoBarContainerShown = hasInfoBars;
|
| - if (mIsInfoBarContainerShown) {
|
| - closeReaderPanel(StateChangeReason.INFOBAR_SHOWN, false);
|
| - } else {
|
| - requestReaderPanelShow(StateChangeReason.INFOBAR_HIDDEN);
|
| - }
|
| }
|
|
|
| // ReaderModeManagerDelegate:
|
|
|
| - @Override
|
| - public void setReaderModePanel(ReaderModePanel panel) {
|
| - mReaderModePanel = panel;
|
| - }
|
| -
|
| @Override
|
| public ChromeActivity getChromeActivity() {
|
| return mChromeActivity;
|
| @@ -331,9 +232,9 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| int tabId = mTabModelSelector.getCurrentTabId();
|
|
|
| ReaderModeTabInfo info = mTabStatusMap.get(tabId);
|
| - if (info != null && !info.isPanelShowRecorded()) {
|
| - info.setIsPanelShowRecorded(true);
|
| - recordPanelVisibilityForNavigation(true);
|
| + if (info != null && !info.isInfoBarShowRecorded()) {
|
| + info.setIsInfoBarShowRecorded(true);
|
| + recordInfoBarVisibilityForNavigation(true);
|
| if (LibraryLoader.isInitialized()) {
|
| RapporServiceBridge.sampleDomainAndRegistryFromURL(
|
| "DomDistiller.PromptPanel", info.getUrl());
|
| @@ -342,60 +243,24 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| }
|
|
|
| /**
|
| - * Record if the panel became visible on the current page. This can be overridden for testing.
|
| - * @param visible If the panel was visible at any time.
|
| + * Record if the infobar became visible on the current page. This can be overridden for testing.
|
| + * @param visible If the infobar was visible at any time.
|
| */
|
| - protected void recordPanelVisibilityForNavigation(boolean visible) {
|
| + protected void recordInfoBarVisibilityForNavigation(boolean visible) {
|
| RecordHistogram.recordBooleanHistogram("DomDistiller.ReaderShownForPageLoad", visible);
|
| }
|
|
|
| @Override
|
| public void onClosed(StateChangeReason reason) {
|
| - if (mReaderModePanel == null || mTabModelSelector == null) return;
|
| -
|
| - restoreInfobars();
|
| -
|
| - // Only dismiss the panel if the close was a result of user interaction.
|
| - if (reason != StateChangeReason.FLING && reason != StateChangeReason.SWIPE
|
| - && reason != StateChangeReason.CLOSE_BUTTON) {
|
| - return;
|
| - }
|
| + if (mTabModelSelector == null) return;
|
|
|
| - // Record close button usage.
|
| - if (reason == StateChangeReason.CLOSE_BUTTON) {
|
| - RecordHistogram.recordBooleanHistogram("DomDistiller.BarCloseButtonUsage",
|
| - mReaderModePanel.getPanelState() == PanelState.EXPANDED
|
| - || mReaderModePanel.getPanelState() == PanelState.MAXIMIZED);
|
| - }
|
| + RecordHistogram.recordBooleanHistogram("DomDistiller.InfoBarUsage", false);
|
|
|
| int currentTabId = mTabModelSelector.getCurrentTabId();
|
| if (!mTabStatusMap.containsKey(currentTabId)) return;
|
| mTabStatusMap.get(currentTabId).setIsDismissed(true);
|
| }
|
|
|
| - @Override
|
| - public void onPeek() {
|
| - restoreInfobars();
|
| - }
|
| -
|
| - /**
|
| - * Restore any infobars that may have been hidden by Reader Mode.
|
| - */
|
| - private void restoreInfobars() {
|
| - if (!mIsInfoBarContainerShown) return;
|
| -
|
| - Tab curTab = mTabModelSelector.getCurrentTab();
|
| - if (curTab == null) return;
|
| -
|
| - InfoBarContainer container = curTab.getInfoBarContainer();
|
| - if (container == null) return;
|
| -
|
| - container.setIsObscuredByOtherView(false);
|
| -
|
| - // Temporarily hides the reader mode button while the infobars are shown.
|
| - closeReaderPanel(StateChangeReason.INFOBAR_SHOWN, false);
|
| - }
|
| -
|
| @Override
|
| public WebContents getBasePageWebContents() {
|
| Tab tab = mTabModelSelector.getCurrentTab();
|
| @@ -406,8 +271,7 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
|
|
| @Override
|
| public void closeReaderPanel(StateChangeReason reason, boolean animate) {
|
| - if (mReaderModePanel == null) return;
|
| - mReaderModePanel.closePanel(reason, animate);
|
| + // TODO(mdjones): Remove this method and dependencies.
|
| }
|
|
|
| @Override
|
| @@ -416,17 +280,6 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| timeMs, TimeUnit.MILLISECONDS);
|
| }
|
|
|
| - @Override
|
| - public void onLayoutChanged() {
|
| - if (isKeyboardShowing()) {
|
| - mIsKeyboardShowing = true;
|
| - closeReaderPanel(StateChangeReason.KEYBOARD_SHOWN, false);
|
| - } else if (mIsKeyboardShowing) {
|
| - mIsKeyboardShowing = false;
|
| - requestReaderPanelShow(StateChangeReason.KEYBOARD_HIDDEN);
|
| - }
|
| - }
|
| -
|
| /**
|
| * @return True if the keyboard might be showing. This is not 100% accurate; see
|
| * UiUtils.isKeyboardShowing(...).
|
| @@ -436,15 +289,33 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| mChromeActivity.findViewById(android.R.id.content));
|
| }
|
|
|
| - protected WebContentsObserver createWebContentsObserver(WebContents webContents) {
|
| + protected WebContentsObserver createWebContentsObserver(final WebContents webContents) {
|
| final int readerTabId = mTabModelSelector.getCurrentTabId();
|
| if (readerTabId == Tab.INVALID_TAB_ID) return null;
|
|
|
| return new WebContentsObserver(webContents) {
|
| + /** Whether or not the previous navigation should be removed. */
|
| + private boolean mShouldRemovePreviousNavigation;
|
| +
|
| + /** The index of the last committed distiller page in history. */
|
| + private int mLastDistillerPageIndex;
|
| +
|
| @Override
|
| public void didStartNavigation(String url, boolean isInMainFrame,
|
| boolean isSameDocument, boolean isErrorPage) {
|
| if (!isInMainFrame || isSameDocument) return;
|
| +
|
| + // Reader Mode should not pollute the navigation stack. To avoid this, watch for
|
| + // navigations and prepare to remove any that are "chrome-distiller" urls.
|
| + NavigationController controller = webContents.getNavigationController();
|
| + int index = controller.getLastCommittedEntryIndex();
|
| + NavigationEntry entry = controller.getEntryAtIndex(index);
|
| +
|
| + if (entry != null && DomDistillerUrlUtils.isDistilledPage(entry.getUrl())) {
|
| + mShouldRemovePreviousNavigation = true;
|
| + mLastDistillerPageIndex = index;
|
| + }
|
| +
|
| // If there is a navigation in the current tab, hide the bar. It will show again
|
| // once the distillability test is successful.
|
| if (readerTabId == mTabModelSelector.getCurrentTabId()) {
|
| @@ -470,7 +341,12 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| // TODO(cjhopman): This should possibly ignore navigations that replace the entry
|
| // (like those from history.replaceState()).
|
| if (!hasCommitted || !isInMainFrame || isSameDocument) return;
|
| - if (DomDistillerUrlUtils.isDistilledPage(url)) return;
|
| +
|
| + if (mShouldRemovePreviousNavigation) {
|
| + mShouldRemovePreviousNavigation = false;
|
| + NavigationController controller = webContents.getNavigationController();
|
| + controller.removeEntryAtIndex(mLastDistillerPageIndex);
|
| + }
|
|
|
| // Make sure the tab was not destroyed.
|
| ReaderModeTabInfo tabInfo = mTabStatusMap.get(readerTabId);
|
| @@ -488,7 +364,7 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| if (tabInfo.getStatus() != POSSIBLE) {
|
| closeReaderPanel(StateChangeReason.UNKNOWN, false);
|
| } else {
|
| - requestReaderPanelShow(StateChangeReason.UNKNOWN);
|
| + tryShowingInfoBar();
|
| }
|
| }
|
|
|
| @@ -501,22 +377,35 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| // happening.
|
| tabInfo.setIsDismissed(false);
|
|
|
| - // If the panel was not shown for the previous navigation, record it now.
|
| + // If the infobar was not shown for the previous navigation, record it now.
|
| Tab curTab = mTabModelSelector.getTabById(readerTabId);
|
| if (curTab != null && !curTab.isNativePage() && !curTab.isBeingRestored()) {
|
| - recordPanelVisibilityForNavigation(false);
|
| + recordInfoBarVisibilityForNavigation(false);
|
| + }
|
| + tabInfo.setIsInfoBarShowRecorded(false);
|
| +
|
| + if (curTab != null && !DomDistillerUrlUtils.isDistilledPage(curTab.getUrl())
|
| + && tabInfo.isViewingReaderModePage()) {
|
| + long timeMs = tabInfo.onExitReaderMode();
|
| + recordReaderModeViewDuration(timeMs);
|
| }
|
| - tabInfo.setIsPanelShowRecorded(false);
|
| }
|
| };
|
| }
|
|
|
| /**
|
| - * This is a wrapper for "requestPanelShow" that checks if reader mode is possible before
|
| - * showing.
|
| - * @param reason The reason the panel is requesting to be shown.
|
| + * Record the amount of time the user spent in Reader Mode.
|
| + * @param timeMs The amount of time in ms that the user spent in Reader Mode.
|
| */
|
| - protected void requestReaderPanelShow(StateChangeReason reason) {
|
| + private void recordReaderModeViewDuration(long timeMs) {
|
| + RecordHistogram.recordLongTimesHistogram(
|
| + "DomDistiller.Time.ViewingReaderModePage", timeMs, TimeUnit.MILLISECONDS);
|
| + }
|
| +
|
| + /**
|
| + * Try showing the reader mode infobar.
|
| + */
|
| + protected void tryShowingInfoBar() {
|
| if (mTabModelSelector == null) return;
|
|
|
| int currentTabId = mTabModelSelector.getCurrentTabId();
|
| @@ -528,23 +417,36 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| && getBasePageWebContents().getNavigationController().getUseDesktopUserAgent()
|
| && !mIsReaderHeuristicAlwaysTrue;
|
|
|
| - if (mReaderModePanel == null || !mTabStatusMap.containsKey(currentTabId)
|
| - || usingRequestDesktopSite
|
| + if (!mTabStatusMap.containsKey(currentTabId) || usingRequestDesktopSite
|
| || mTabStatusMap.get(currentTabId).getStatus() != POSSIBLE
|
| || mTabStatusMap.get(currentTabId).isDismissed()
|
| - || mIsInfoBarContainerShown
|
| - || mIsFindToolbarShowing
|
| - || mIsFullscreenModeEntered
|
| - || mIsKeyboardShowing
|
| || AccessibilityUtil.isAccessibilityEnabled()) {
|
| return;
|
| }
|
|
|
| - mReaderModePanel.requestPanelShow(reason);
|
| + ReaderModeInfoBar.showReaderModeInfoBar(mTabModelSelector.getCurrentTab(), this);
|
| + }
|
| +
|
| + /**
|
| + * Navigate the current tab to a Reader Mode URL.
|
| + */
|
| + public void navigateToReaderMode() {
|
| + RecordHistogram.recordBooleanHistogram("DomDistiller.InfoBarUsage", true);
|
| +
|
| + WebContents baseWebContents = getBasePageWebContents();
|
| + if (baseWebContents == null || mChromeActivity == null || mTabModelSelector == null) return;
|
| +
|
| + String url = baseWebContents.getUrl();
|
| + if (url == null) return;
|
| +
|
| + ReaderModeTabInfo info = mTabStatusMap.get(mTabModelSelector.getCurrentTabId());
|
| + if (info != null) info.onStartedReaderMode();
|
| +
|
| + DomDistillerTabUtils.distillCurrentPageAndView(getBasePageWebContents());
|
| }
|
|
|
| /**
|
| - * Open a link from the panel in a new tab.
|
| + * Open a link from the infobar in a new tab.
|
| * @param url The URL to load.
|
| */
|
| @Override
|
| @@ -562,22 +464,6 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| TabModel.TabLaunchType.FROM_LINK, mChromeActivity.getActivityTab());
|
| }
|
|
|
| - /**
|
| - * @return Whether the Reader Mode panel is opened (state is EXPANDED or MAXIMIZED).
|
| - */
|
| - public boolean isPanelOpened() {
|
| - if (mReaderModePanel == null) return false;
|
| - return mReaderModePanel.isPanelOpened();
|
| - }
|
| -
|
| - /**
|
| - * @return The ReaderModePanel for testing.
|
| - */
|
| - @VisibleForTesting
|
| - public ReaderModePanel getPanelForTesting() {
|
| - return mReaderModePanel;
|
| - }
|
| -
|
| /**
|
| * Set the callback for updating reader mode status based on whether or not the page should
|
| * be viewed in reader mode.
|
| @@ -617,8 +503,7 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| tabInfo.setStatus(POSSIBLE);
|
| // The user may have changed tabs.
|
| if (tabId == mTabModelSelector.getCurrentTabId()) {
|
| - // TODO(mdjones): Add reason DISTILLER_STATE_CHANGE.
|
| - requestReaderPanelShow(StateChangeReason.UNKNOWN);
|
| + tryShowingInfoBar();
|
| }
|
| } else {
|
| tabInfo.setStatus(NOT_POSSIBLE);
|
| @@ -644,9 +529,7 @@ public class ReaderModeManager extends TabModelSelectorTabObserver
|
| boolean enabled = CommandLine.getInstance().hasSwitch(ChromeSwitches.ENABLE_DOM_DISTILLER)
|
| && !CommandLine.getInstance().hasSwitch(
|
| ChromeSwitches.DISABLE_READER_MODE_BOTTOM_BAR)
|
| - && !DeviceFormFactor.isTablet()
|
| - && DomDistillerTabUtils.isDistillerHeuristicsEnabled()
|
| - && !SysUtils.isLowEndDevice();
|
| + && DomDistillerTabUtils.isDistillerHeuristicsEnabled();
|
| return enabled;
|
| }
|
| }
|
|
|