Commit 4c5bf665 authored by Wei-Yin Chen (陳威尹)'s avatar Wei-Yin Chen (陳威尹) Committed by Commit Bot

Add an util observer for TabGroup IPH

Add a TabModelSelectorTabObserver for IPH_TabGroupsQuicklyComparePages
and plumb SearchableFormURL to Java NavigationHandle.

TBR=michaelbai@chromium.org

Bug: 930970
Change-Id: I857d0119ebc7ffc0bdcf09373696d8970556815f
Reviewed-on: https://chromium-review.googlesource.com/c/1492933
Commit-Queue: Wei-Yin Chen (陳威尹) <wychen@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Reviewed-by: default avatarYusuf Ozuysal <yusufo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#636692}
parent 313413d9
...@@ -192,7 +192,8 @@ public class AwWebContentsObserverTest { ...@@ -192,7 +192,8 @@ public class AwWebContentsObserverTest {
mWebContentsObserver.didStartNavigation(navigation); mWebContentsObserver.didStartNavigation(navigation);
navigation.didFinish(url, isErrorPage, true /* hasCommitted */, isFragmentNavigation, navigation.didFinish(url, isErrorPage, true /* hasCommitted */, isFragmentNavigation,
false /* isDownload */, transition, 0 /* errorCode*/, 200 /* httpStatusCode*/); false /* isDownload */, false /* isValidSearchFormUrl */, transition,
0 /* errorCode*/, 200 /* httpStatusCode*/);
mWebContentsObserver.didFinishNavigation(navigation); mWebContentsObserver.didFinishNavigation(navigation);
} }
} }
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
package org.chromium.chrome.browser.tasks.tab_groups; package org.chromium.chrome.browser.tasks.tab_groups;
import android.content.res.Resources;
import android.support.annotation.StringRes; import android.support.annotation.StringRes;
import android.view.View; import android.view.View;
...@@ -12,30 +11,40 @@ import org.chromium.chrome.R; ...@@ -12,30 +11,40 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver;
import org.chromium.chrome.browser.widget.textbubble.TextBubble; import org.chromium.chrome.browser.widget.textbubble.TextBubble;
import org.chromium.components.feature_engagement.FeatureConstants; import org.chromium.components.feature_engagement.FeatureConstants;
import org.chromium.components.feature_engagement.Tracker; import org.chromium.components.feature_engagement.Tracker;
import org.chromium.content_public.browser.NavigationHandle;
import org.chromium.ui.base.PageTransition;
import org.chromium.ui.widget.ViewRectProvider; import org.chromium.ui.widget.ViewRectProvider;
/** /**
* Helper class to handle tab groups related utilities. * Helper class to handle tab groups related utilities.
*/ */
public class TabGroupUtils { public class TabGroupUtils {
private static TabModelSelectorTabObserver sTabModelSelectorTabObserver;
public static void maybeShowIPH(@FeatureConstants String featureName, View view) { public static void maybeShowIPH(@FeatureConstants String featureName, View view) {
if (!ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_GROUPS_ANDROID)) return; if (!ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_GROUPS_ANDROID)) return;
Resources res = view.getContext().getResources();
@StringRes @StringRes
int textId; int textId;
if (featureName.equals(FeatureConstants.TAB_GROUPS_QUICKLY_COMPARE_PAGES_FEATURE)) { switch (featureName) {
textId = R.string.iph_tab_groups_quickly_compare_pages_text; case FeatureConstants.TAB_GROUPS_QUICKLY_COMPARE_PAGES_FEATURE:
} else if (featureName.equals(FeatureConstants.TAB_GROUPS_TAP_TO_SEE_ANOTHER_TAB_FEATURE)) { textId = R.string.iph_tab_groups_quickly_compare_pages_text;
textId = R.string.iph_tab_groups_tap_to_see_another_tab_text; break;
} else if (featureName.equals(FeatureConstants.TAB_GROUPS_YOUR_TABS_ARE_TOGETHER_FEATURE)) { case FeatureConstants.TAB_GROUPS_TAP_TO_SEE_ANOTHER_TAB_FEATURE:
textId = R.string.iph_tab_groups_your_tabs_together_text; textId = R.string.iph_tab_groups_tap_to_see_another_tab_text;
} else { break;
assert false; case FeatureConstants.TAB_GROUPS_YOUR_TABS_ARE_TOGETHER_FEATURE:
return; textId = R.string.iph_tab_groups_your_tabs_together_text;
break;
default:
assert false;
return;
} }
final Tracker tracker = TrackerFactory.getTrackerForProfile( final Tracker tracker = TrackerFactory.getTrackerForProfile(
...@@ -50,4 +59,29 @@ public class TabGroupUtils { ...@@ -50,4 +59,29 @@ public class TabGroupUtils {
textBubble.addOnDismissListener(() -> tracker.dismissed(featureName)); textBubble.addOnDismissListener(() -> tracker.dismissed(featureName));
textBubble.show(); textBubble.show();
} }
/**
* Start a TabModelSelectorTabObserver to show IPH for TabGroups.
* @param selector The selector that owns the Tabs that should be observed.
*/
public static void startObservingForTabGroupsIPH(TabModelSelector selector) {
if (sTabModelSelectorTabObserver != null) return;
sTabModelSelectorTabObserver = new TabModelSelectorTabObserver(selector) {
@Override
public void onDidFinishNavigation(Tab tab, NavigationHandle navigationHandle) {
if (!navigationHandle.isInMainFrame()) return;
if (tab.isIncognito()) return;
int coreTransitionType =
navigationHandle.pageTransition() & PageTransition.CORE_MASK;
// Searching from omnibox results in PageTransition.GENERATED.
if (navigationHandle.isValidSearchFormUrl()
|| coreTransitionType == PageTransition.GENERATED) {
maybeShowIPH(FeatureConstants.TAB_GROUPS_QUICKLY_COMPARE_PAGES_FEATURE,
tab.getView());
sTabModelSelectorTabObserver.destroy();
}
}
};
}
} }
...@@ -237,8 +237,9 @@ public class TrustedWebActivityVerifierTest { ...@@ -237,8 +237,9 @@ public class TrustedWebActivityVerifierTest {
} }
navigation.didFinish(url, false /* isErrorPage */, true /* hasCommitted */, navigation.didFinish(url, false /* isErrorPage */, true /* hasCommitted */,
false /* isFragmentNavigation */, false /* isDownload */, 0 /* pageTransition */, false /* isFragmentNavigation */, false /* isDownload */,
0 /* errorCode*/, 200 /* httpStatusCode*/); false /* isValidSearchFormUrl */, 0 /* pageTransition */, 0 /* errorCode*/,
200 /* httpStatusCode*/);
for (TabObserver tabObserver : mTabObserverCaptor.getAllValues()) { for (TabObserver tabObserver : mTabObserverCaptor.getAllValues()) {
tabObserver.onDidFinishNavigation(mTab, navigation); tabObserver.onDidFinishNavigation(mTab, navigation);
} }
......
...@@ -104,8 +104,9 @@ public class MediaNotificationTestTabHolder { ...@@ -104,8 +104,9 @@ public class MediaNotificationTestTabHolder {
mMediaSessionTabHelper.mTabObserver.onDidStartNavigation(mTab, navigation); mMediaSessionTabHelper.mTabObserver.onDidStartNavigation(mTab, navigation);
navigation.didFinish(url, false /* isErrorPage */, true /* hasCommitted */, navigation.didFinish(url, false /* isErrorPage */, true /* hasCommitted */,
false /* isFragmentNavigation */, false /* isDownload */, 0 /* pageTransition */, false /* isFragmentNavigation */, false /* isDownload */,
0 /* errorCode */, 200 /* httpStatusCode */); false /* isValidSearchFormUrl */, 0 /* pageTransition */, 0 /* errorCode */,
200 /* httpStatusCode */);
mMediaSessionTabHelper.mTabObserver.onDidFinishNavigation(mTab, navigation); mMediaSessionTabHelper.mTabObserver.onDidFinishNavigation(mTab, navigation);
} }
} }
...@@ -59,11 +59,16 @@ void NavigationHandleProxy::DidFinish() { ...@@ -59,11 +59,16 @@ void NavigationHandleProxy::DidFinish() {
is_fragment_navigation &= urls_same_ignoring_fragment; is_fragment_navigation &= urls_same_ignoring_fragment;
} }
bool is_valid_search_form_url =
cpp_navigation_handle_->GetSearchableFormURL() != nullptr
? cpp_navigation_handle_->GetSearchableFormURL().is_valid()
: false;
Java_NavigationHandle_didFinish( Java_NavigationHandle_didFinish(
env, java_navigation_handle_, jstring_url, env, java_navigation_handle_, jstring_url,
cpp_navigation_handle_->IsErrorPage(), cpp_navigation_handle_->IsErrorPage(),
cpp_navigation_handle_->HasCommitted(), is_fragment_navigation, cpp_navigation_handle_->HasCommitted(), is_fragment_navigation,
cpp_navigation_handle_->IsDownload(), cpp_navigation_handle_->IsDownload(), is_valid_search_form_url,
cpp_navigation_handle_->HasCommitted() cpp_navigation_handle_->HasCommitted()
? cpp_navigation_handle_->GetPageTransition() ? cpp_navigation_handle_->GetPageTransition()
: -1, : -1,
......
...@@ -22,6 +22,7 @@ public class NavigationHandle { ...@@ -22,6 +22,7 @@ public class NavigationHandle {
private boolean mIsDownload; private boolean mIsDownload;
private boolean mIsErrorPage; private boolean mIsErrorPage;
private boolean mIsFragmentNavigation; private boolean mIsFragmentNavigation;
private boolean mIsValidSearchFormUrl;
private int mErrorCode; private int mErrorCode;
private int mHttpStatusCode; private int mHttpStatusCode;
...@@ -49,13 +50,14 @@ public class NavigationHandle { ...@@ -49,13 +50,14 @@ public class NavigationHandle {
*/ */
@CalledByNative @CalledByNative
public void didFinish(String url, boolean isErrorPage, boolean hasCommitted, public void didFinish(String url, boolean isErrorPage, boolean hasCommitted,
boolean isFragmentNavigation, boolean isDownload, int transition, int errorCode, boolean isFragmentNavigation, boolean isDownload, boolean isValidSearchFormUrl,
int httpStatuscode) { int transition, int errorCode, int httpStatuscode) {
mUrl = url; mUrl = url;
mIsErrorPage = isErrorPage; mIsErrorPage = isErrorPage;
mHasCommitted = hasCommitted; mHasCommitted = hasCommitted;
mIsFragmentNavigation = isFragmentNavigation; mIsFragmentNavigation = isFragmentNavigation;
mIsDownload = isDownload; mIsDownload = isDownload;
mIsValidSearchFormUrl = isValidSearchFormUrl;
mPageTransition = transition == -1 ? null : transition; mPageTransition = transition == -1 ? null : transition;
mErrorCode = errorCode; mErrorCode = errorCode;
mHttpStatusCode = httpStatuscode; mHttpStatusCode = httpStatuscode;
...@@ -179,6 +181,13 @@ public class NavigationHandle { ...@@ -179,6 +181,13 @@ public class NavigationHandle {
return mIsDownload; return mIsDownload;
} }
/**
* Returns true if the navigation is a search.
*/
public boolean isValidSearchFormUrl() {
return mIsValidSearchFormUrl;
}
/** /**
* Set request's header. If the header is already present, its value is overwritten. When * Set request's header. If the header is already present, its value is overwritten. When
* modified during a navigation start, the headers will be applied to the initial network * modified during a navigation start, the headers will be applied to the initial network
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment