Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java |
| index 560c3030fb240b4584d0d25ef99cbcabda797b7f..0a4f8248400ffa1629b27b2636feb856059f0a8e 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java |
| @@ -18,6 +18,7 @@ import android.view.View.OnAttachStateChangeListener; |
| import android.view.View.OnClickListener; |
| import android.view.ViewGroup.MarginLayoutParams; |
| import android.widget.FrameLayout; |
| +import android.widget.PopupWindow.OnDismissListener; |
| import org.chromium.base.ApiCompatibilityUtils; |
| import org.chromium.base.Callback; |
| @@ -27,6 +28,7 @@ import org.chromium.base.metrics.RecordHistogram; |
| import org.chromium.base.metrics.RecordUserAction; |
| import org.chromium.chrome.R; |
| import org.chromium.chrome.browser.ChromeActivity; |
| +import org.chromium.chrome.browser.ChromeTabbedActivity; |
| import org.chromium.chrome.browser.NativePage; |
| import org.chromium.chrome.browser.TabLoadStatus; |
| import org.chromium.chrome.browser.UrlConstants; |
| @@ -43,6 +45,8 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutManager; |
| import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; |
| import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver; |
| import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver; |
| +import org.chromium.chrome.browser.download.DownloadUtils; |
| +import org.chromium.chrome.browser.feature_engagement_tracker.FeatureEngagementTrackerFactory; |
| import org.chromium.chrome.browser.fullscreen.BrowserStateBrowserControlsVisibilityDelegate; |
| import org.chromium.chrome.browser.fullscreen.FullscreenManager; |
| import org.chromium.chrome.browser.ntp.IncognitoNewTabPage; |
| @@ -70,10 +74,15 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; |
| import org.chromium.chrome.browser.toolbar.ActionModeController.ActionBarDelegate; |
| import org.chromium.chrome.browser.widget.findinpage.FindToolbarManager; |
| import org.chromium.chrome.browser.widget.findinpage.FindToolbarObserver; |
| +import org.chromium.chrome.browser.widget.textbubble.ViewAnchoredTextBubble; |
| +import org.chromium.components.feature_engagement_tracker.EventConstants; |
| +import org.chromium.components.feature_engagement_tracker.FeatureConstants; |
| +import org.chromium.components.feature_engagement_tracker.FeatureEngagementTracker; |
| 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.net.NetError; |
| import org.chromium.ui.UiUtils; |
| import org.chromium.ui.base.DeviceFormFactor; |
| import org.chromium.ui.base.PageTransition; |
| @@ -108,6 +117,8 @@ public class ToolbarManager implements ToolbarTabController, UrlFocusChangeListe |
| private static final int MIN_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS = 1000; |
| private static final int MAX_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS = 30000; |
| + private static final int INITIAL_DELAY_IPH_DOWNLOAD_PAGE_MS = 500; |
| + private static final int CLEAR_MENU_ITEM_HIGHLIGHT_DELAY_MS = 20; |
|
David Trainor- moved to gerrit
2017/04/17 23:03:41
Do we have to delay here? Should we just post the
shaktisahu
2017/04/19 02:39:11
No, just posting the task seems sufficient.
|
| /** |
| * The minimum load progress that can be shown when a page is loading. This is not 0 so that |
| @@ -139,6 +150,7 @@ public class ToolbarManager implements ToolbarTabController, UrlFocusChangeListe |
| private final ActionModeController mActionModeController; |
| private final LoadProgressSimulator mLoadProgressSimulator; |
| private final Callback<Boolean> mUrlFocusChangedCallback; |
| + private final Handler mHandler = new Handler(); |
| private BrowserStateBrowserControlsVisibilityDelegate mControlsVisibilityDelegate; |
| private int mFullscreenFocusToken = FullscreenManager.INVALID_TOKEN; |
| @@ -153,6 +165,8 @@ public class ToolbarManager implements ToolbarTabController, UrlFocusChangeListe |
| private AppMenuButtonHelper mAppMenuButtonHelper; |
| + private ViewAnchoredTextBubble mTextBubble; |
| + |
| private HomepageStateListener mHomepageStateListener; |
| private boolean mInitializedWithNative; |
| @@ -470,6 +484,8 @@ public class ToolbarManager implements ToolbarTabController, UrlFocusChangeListe |
| mToolbar.onNavigatedToDifferentPage(); |
| } |
| + displayFeatureEngagementTextBubbleIfNecessary(tab, errorCode); |
| + |
| // If the load failed due to a different navigation, there is no need to reset the |
| // location bar animations. |
| if (errorCode != 0 && isInMainFrame && !hasPendingNonNtpNavigation(tab)) { |
| @@ -481,6 +497,59 @@ public class ToolbarManager implements ToolbarTabController, UrlFocusChangeListe |
| if (mToolbar.getProgressBar() != null) mToolbar.getProgressBar().finish(false); |
| } |
| } |
| + |
| + private void displayFeatureEngagementTextBubbleIfNecessary( |
| + final Tab tab, int errorCode) { |
| + if (mTextBubble != null) { |
| + mTextBubble.dismiss(); |
| + mTextBubble = null; |
| + return; |
| + } |
| + |
| + if (!(activity instanceof ChromeTabbedActivity) |
|
David Trainor- moved to gerrit
2017/04/17 23:03:41
Add a TODO and a bug to key this off of whether or
shaktisahu
2017/04/19 02:39:11
Done. Added below.
|
| + || DeviceFormFactor.isTablet(mToolbar.getContext()) |
| + || activity.isInOverviewMode()) { |
| + return; |
| + } |
| + |
| + final FeatureEngagementTracker tracker = |
| + FeatureEngagementTrackerFactory.getFeatureEngagementTrackerForProfile( |
| + tab.getProfile()); |
| + |
| + if (errorCode == NetError.ERR_INTERNET_DISCONNECTED) { |
| + tracker.notifyEvent(EventConstants.USER_HAS_SEEN_DINO); |
| + } |
| + |
| + if (errorCode != 0) return; |
| + |
| + mHandler.postDelayed(new Runnable() { |
| + @Override |
| + public void run() { |
| + if (!DownloadUtils.isAllowedToDownloadPage(tab)) return; |
| + if (!tracker.shouldTriggerHelpUI(FeatureConstants.DOWNLOAD_PAGE_FEATURE)) { |
| + return; |
| + } |
| + |
| + mTextBubble = new ViewAnchoredTextBubble(mToolbar.getContext(), |
| + getMenuAnchor(), R.string.iph_download_page_for_offline_usage_text); |
| + mTextBubble.setDismissOnTouchInteraction(true); |
| + mTextBubble.addOnDismissListener(new OnDismissListener() { |
| + @Override |
| + public void onDismiss() { |
| + mHandler.postDelayed(new Runnable() { |
| + @Override |
| + public void run() { |
| + tracker.dismissed(); |
| + activity.getAppMenuHandler().setMenuHighlight(0); |
| + } |
| + }, CLEAR_MENU_ITEM_HIGHLIGHT_DELAY_MS); |
| + } |
| + }); |
| + activity.getAppMenuHandler().setMenuHighlight(R.id.offline_page_id); |
| + mTextBubble.show(); |
| + } |
| + }, INITIAL_DELAY_IPH_DOWNLOAD_PAGE_MS); |
|
David Trainor- moved to gerrit
2017/04/17 23:03:41
Why do we delay the show call again?
shaktisahu
2017/04/19 02:39:11
Removed this delay. Moved trigger part of this fun
|
| + } |
| }; |
| mBookmarksObserver = new BookmarkBridge.BookmarkModelObserver() { |