Index: chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
index 05424a1ee0886db14bf52e7539ab60ca7f6bc69c..eafaeaf75927fc98547989d0a8e6aed58362cf82 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
@@ -87,6 +87,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector; |
import org.chromium.chrome.browser.tabmodel.TabReparentingParams; |
import org.chromium.chrome.browser.util.ColorUtils; |
import org.chromium.chrome.browser.util.FeatureUtilities; |
+import org.chromium.chrome.browser.widget.textbubble.TextBubble; |
import org.chromium.chrome.browser.widget.textbubble.ViewAnchoredTextBubble; |
import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; |
import org.chromium.components.feature_engagement_tracker.EventConstants; |
@@ -382,6 +383,11 @@ public class Tab |
private ChromeDownloadDelegate mDownloadDelegate; |
+ /** |
+ * The Text bubble used to display In Product help widget for download feature on videos. |
+ */ |
+ private TextBubble mDownloadIPHBubble; |
+ |
/** Whether or not the tab closing the tab can send the user back to the app that opened it. */ |
private boolean mIsAllowedToReturnToExternalApp; |
@@ -1856,6 +1862,8 @@ public class Tab |
for (TabObserver observer : mObservers) observer.onDestroyed(this); |
mObservers.clear(); |
+ hideMediaDownloadInProductHelp(); |
+ |
NativePage currentNativePage = mNativePage; |
mNativePage = null; |
destroyNativePageInternal(currentNativePage); |
@@ -3104,6 +3112,50 @@ public class Tab |
nativeEnableEmbeddedMediaExperience(mNativeTabAndroid, enabled); |
} |
+ @CalledByNative |
+ private void showMediaDownloadInProductHelp(int x, int y, int width, int height) { |
+ // If we are not currently showing the widget, ask the tracker if we can show it. |
+ if (mDownloadIPHBubble == null) { |
+ FeatureEngagementTracker tracker = |
+ FeatureEngagementTrackerFactory.getFeatureEngagementTrackerForProfile( |
+ getProfile()); |
+ tracker.notifyEvent(EventConstants.MEDIA_DOWNLOAD_BUTTON_DISPLAYED); |
+ if (tracker.shouldTriggerHelpUI(FeatureConstants.MEDIA_DOWNLOAD_FEATURE)) { |
+ mDownloadIPHBubble = new TextBubble(getApplicationContext(), |
+ mContentViewCore.getContainerView(), R.string.iph_media_download_text, |
+ R.string.iph_media_download_accessibility_text); |
+ mDownloadIPHBubble.setDismissOnTouchInteraction(true); |
+ mDownloadIPHBubble.addOnDismissListener(new OnDismissListener() { |
+ @Override |
+ public void onDismiss() { |
+ hideMediaDownloadInProductHelp(); |
+ } |
+ }); |
+ mDownloadIPHBubble.show(); |
+ } else { |
+ // Inform native that the button was dismissed to notify the renderer that the |
+ // request was rejected. |
+ nativeDownloadMediaInProductHelpDismissed(mNativeTabAndroid); |
+ return; |
+ } |
+ } |
+ |
+ Rect rect = new Rect(x, y, x + width, y + height); |
+ mDownloadIPHBubble.setAnchorRect(rect); |
+ } |
+ |
+ @CalledByNative |
+ private void hideMediaDownloadInProductHelp() { |
+ if (mDownloadIPHBubble == null) return; |
+ |
+ mDownloadIPHBubble.dismiss(); |
+ mDownloadIPHBubble = null; |
+ FeatureEngagementTracker tracker = |
+ FeatureEngagementTrackerFactory.getFeatureEngagementTrackerForProfile(getProfile()); |
+ tracker.dismissed(FeatureConstants.MEDIA_DOWNLOAD_FEATURE); |
+ nativeDownloadMediaInProductHelpDismissed(mNativeTabAndroid); |
+ } |
+ |
private native void nativeInit(); |
private native void nativeDestroy(long nativeTabAndroid); |
private native void nativeInitWebContents(long nativeTabAndroid, boolean incognito, |
@@ -3136,4 +3188,5 @@ public class Tab |
private native void nativeSetWebappManifestScope(long nativeTabAndroid, String scope); |
private native void nativeEnableEmbeddedMediaExperience(long nativeTabAndroid, boolean enabled); |
private native void nativeAttachDetachedTab(long nativeTabAndroid); |
+ private native void nativeDownloadMediaInProductHelpDismissed(long nativeTabAndroid); |
} |