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 {
mWebContentsObserver.didStartNavigation(navigation);
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);
}
}
......@@ -4,7 +4,6 @@
package org.chromium.chrome.browser.tasks.tab_groups;
import android.content.res.Resources;
import android.support.annotation.StringRes;
import android.view.View;
......@@ -12,30 +11,40 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
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.components.feature_engagement.FeatureConstants;
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;
/**
* Helper class to handle tab groups related utilities.
*/
public class TabGroupUtils {
private static TabModelSelectorTabObserver sTabModelSelectorTabObserver;
public static void maybeShowIPH(@FeatureConstants String featureName, View view) {
if (!ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_GROUPS_ANDROID)) return;
Resources res = view.getContext().getResources();
@StringRes
int textId;
if (featureName.equals(FeatureConstants.TAB_GROUPS_QUICKLY_COMPARE_PAGES_FEATURE)) {
textId = R.string.iph_tab_groups_quickly_compare_pages_text;
} else if (featureName.equals(FeatureConstants.TAB_GROUPS_TAP_TO_SEE_ANOTHER_TAB_FEATURE)) {
textId = R.string.iph_tab_groups_tap_to_see_another_tab_text;
} else if (featureName.equals(FeatureConstants.TAB_GROUPS_YOUR_TABS_ARE_TOGETHER_FEATURE)) {
textId = R.string.iph_tab_groups_your_tabs_together_text;
} else {
assert false;
return;
switch (featureName) {
case FeatureConstants.TAB_GROUPS_QUICKLY_COMPARE_PAGES_FEATURE:
textId = R.string.iph_tab_groups_quickly_compare_pages_text;
break;
case FeatureConstants.TAB_GROUPS_TAP_TO_SEE_ANOTHER_TAB_FEATURE:
textId = R.string.iph_tab_groups_tap_to_see_another_tab_text;
break;
case FeatureConstants.TAB_GROUPS_YOUR_TABS_ARE_TOGETHER_FEATURE:
textId = R.string.iph_tab_groups_your_tabs_together_text;
break;
default:
assert false;
return;
}
final Tracker tracker = TrackerFactory.getTrackerForProfile(
......@@ -50,4 +59,29 @@ public class TabGroupUtils {
textBubble.addOnDismissListener(() -> tracker.dismissed(featureName));
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 {
}
navigation.didFinish(url, false /* isErrorPage */, true /* hasCommitted */,
false /* isFragmentNavigation */, false /* isDownload */, 0 /* pageTransition */,
0 /* errorCode*/, 200 /* httpStatusCode*/);
false /* isFragmentNavigation */, false /* isDownload */,
false /* isValidSearchFormUrl */, 0 /* pageTransition */, 0 /* errorCode*/,
200 /* httpStatusCode*/);
for (TabObserver tabObserver : mTabObserverCaptor.getAllValues()) {
tabObserver.onDidFinishNavigation(mTab, navigation);
}
......
......@@ -104,8 +104,9 @@ public class MediaNotificationTestTabHolder {
mMediaSessionTabHelper.mTabObserver.onDidStartNavigation(mTab, navigation);
navigation.didFinish(url, false /* isErrorPage */, true /* hasCommitted */,
false /* isFragmentNavigation */, false /* isDownload */, 0 /* pageTransition */,
0 /* errorCode */, 200 /* httpStatusCode */);
false /* isFragmentNavigation */, false /* isDownload */,
false /* isValidSearchFormUrl */, 0 /* pageTransition */, 0 /* errorCode */,
200 /* httpStatusCode */);
mMediaSessionTabHelper.mTabObserver.onDidFinishNavigation(mTab, navigation);
}
}
......@@ -59,11 +59,16 @@ void NavigationHandleProxy::DidFinish() {
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(
env, java_navigation_handle_, jstring_url,
cpp_navigation_handle_->IsErrorPage(),
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_->GetPageTransition()
: -1,
......
......@@ -22,6 +22,7 @@ public class NavigationHandle {
private boolean mIsDownload;
private boolean mIsErrorPage;
private boolean mIsFragmentNavigation;
private boolean mIsValidSearchFormUrl;
private int mErrorCode;
private int mHttpStatusCode;
......@@ -49,13 +50,14 @@ public class NavigationHandle {
*/
@CalledByNative
public void didFinish(String url, boolean isErrorPage, boolean hasCommitted,
boolean isFragmentNavigation, boolean isDownload, int transition, int errorCode,
int httpStatuscode) {
boolean isFragmentNavigation, boolean isDownload, boolean isValidSearchFormUrl,
int transition, int errorCode, int httpStatuscode) {
mUrl = url;
mIsErrorPage = isErrorPage;
mHasCommitted = hasCommitted;
mIsFragmentNavigation = isFragmentNavigation;
mIsDownload = isDownload;
mIsValidSearchFormUrl = isValidSearchFormUrl;
mPageTransition = transition == -1 ? null : transition;
mErrorCode = errorCode;
mHttpStatusCode = httpStatuscode;
......@@ -179,6 +181,13 @@ public class NavigationHandle {
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
* 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