Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionsContextMenuItemDelegate.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionsContextMenuItemDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionsContextMenuItemDelegate.java |
| index f2d52cd5a8434e2f85bf1f47524c7616c9269394..4de574759b1830c917e824ebc9a2a59173baceb1 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionsContextMenuItemDelegate.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionsContextMenuItemDelegate.java |
| @@ -16,9 +16,11 @@ import android.content.SharedPreferences; |
| import android.net.Uri; |
| import android.provider.Browser; |
| +import org.chromium.base.ApplicationStatus; |
| import org.chromium.base.ContextUtils; |
| import org.chromium.base.Log; |
| import org.chromium.chrome.R; |
| +import org.chromium.chrome.browser.ChromeTabbedActivity; |
| import org.chromium.chrome.browser.IntentHandler; |
| import org.chromium.chrome.browser.document.ChromeLauncherActivity; |
| import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder; |
| @@ -28,10 +30,15 @@ import org.chromium.chrome.browser.notifications.NotificationUmaTracker; |
| import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions; |
| import org.chromium.chrome.browser.share.ShareHelper; |
| import org.chromium.chrome.browser.share.ShareParams; |
| +import org.chromium.chrome.browser.tab.Tab; |
| import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
| import org.chromium.chrome.browser.util.IntentUtils; |
| +import org.chromium.content_public.browser.LoadUrlParams; |
| +import org.chromium.content_public.common.Referrer; |
| import org.chromium.ui.widget.Toast; |
| +import java.lang.ref.WeakReference; |
| + |
| /** |
| * A delegate responsible for taking actions based on browser action context menu selections. |
| */ |
| @@ -53,14 +60,20 @@ public class BrowserActionsContextMenuItemDelegate { |
| public static final String EXTRA_IS_SINGLE_URL = |
| "org.chromium.chrome.browser.browseractions.is_single_url"; |
| + /** |
| + * Extra stores the id of a Tab to be displayed for single url notification. |
| + */ |
| + public static final String EXTRA_ACTIVE_TAB_ID = |
|
Yusuf
2017/06/29 19:05:26
I see this getting confused with IntentHandler.EXT
ltian
2017/06/30 23:57:56
I am not quite sure whether they are the same. Thi
|
| + "org.chromium.chrome.browser.browseractions.active_tab_id"; |
| + |
| private final Context mContext; |
| private final NotificationManager mNotificationManager; |
| private final SharedPreferences mSharedPreferences; |
| private final String mSourcePackageName; |
| private final Activity mActivity; |
| - private void sendBrowserActionsNotification() { |
| - ChromeNotificationBuilder builder = createNotificationBuilder(); |
| + private void sendBrowserActionsNotification(int tabId) { |
| + ChromeNotificationBuilder builder = createNotificationBuilder(tabId); |
| mNotificationManager.notify( |
| NotificationConstants.NOTIFICATION_ID_BROWSER_ACTIONS, builder.build()); |
| mSharedPreferences.edit().putBoolean(PREF_HAS_BROWSER_ACTIONS_NOTIFICATION, true).apply(); |
| @@ -68,7 +81,7 @@ public class BrowserActionsContextMenuItemDelegate { |
| NotificationUmaTracker.BROWSER_ACTIONS, ChannelDefinitions.CHANNEL_ID_BROWSER); |
| } |
| - private ChromeNotificationBuilder createNotificationBuilder() { |
| + private ChromeNotificationBuilder createNotificationBuilder(int tabId) { |
| ChromeNotificationBuilder builder = |
| NotificationBuilderFactory |
| .createChromeNotificationBuilder( |
| @@ -82,17 +95,21 @@ public class BrowserActionsContextMenuItemDelegate { |
| ? R.string.browser_actions_multi_links_open_notification_title |
| : R.string.browser_actions_single_link_open_notification_title; |
| builder.setContentTitle(mContext.getString(titleResId)); |
| - Intent intent = buildNotificationIntent(); |
| + Intent intent = buildNotificationIntent(tabId); |
| PendingIntent notifyPendingIntent = |
| PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); |
| builder.setContentIntent(notifyPendingIntent); |
| return builder; |
| } |
| - private Intent buildNotificationIntent() { |
| + private Intent buildNotificationIntent(int tabId) { |
| + boolean forMultiUrls = hasBrowserActionsNotification(); |
| + if (!forMultiUrls && tabId != Tab.INVALID_TAB_ID) { |
| + return Tab.createBringTabToFrontIntent(tabId); |
| + } |
| Intent intent = new Intent(mContext, ChromeLauncherActivity.class); |
| intent.setAction(ACTION_BROWSER_ACTIONS_OPEN_IN_BACKGROUND); |
| - intent.putExtra(EXTRA_IS_SINGLE_URL, !hasBrowserActionsNotification()); |
| + intent.putExtra(EXTRA_IS_SINGLE_URL, !forMultiUrls); |
| return intent; |
| } |
| @@ -100,6 +117,27 @@ public class BrowserActionsContextMenuItemDelegate { |
| return mSharedPreferences.getBoolean(PREF_HAS_BROWSER_ACTIONS_NOTIFICATION, false); |
| } |
| + private int openTabInBackground(String linkUrl) { |
| + int tabId = Tab.INVALID_TAB_ID; |
| + Referrer referrer = IntentHandler.constructValidReferrerForAuthority(mSourcePackageName); |
| + LoadUrlParams loadUrlParams = new LoadUrlParams(linkUrl); |
| + loadUrlParams.setReferrer(referrer); |
| + for (WeakReference<Activity> ref : ApplicationStatus.getRunningActivities()) { |
| + if (!(ref.get() instanceof ChromeTabbedActivity)) continue; |
| + |
| + ChromeTabbedActivity activity = (ChromeTabbedActivity) ref.get(); |
| + if (activity == null) continue; |
| + if (activity.getTabModelSelector() != null) { |
| + Tab tab = activity.getTabModelSelector().openNewTab( |
| + loadUrlParams, TabLaunchType.FROM_BROWSER_ACTIONS, null, false); |
| + if (tab != null) { |
|
Yusuf
2017/06/29 19:05:26
one line
ltian
2017/06/30 23:57:56
Also, the "git cl format" forces this to be into m
|
| + tabId = tab.getId(); |
| + } |
| + } |
| + } |
| + return tabId; |
| + } |
| + |
| /** |
| * Builds a {@link BrowserActionsContextMenuItemDelegate} instance. |
| */ |
| @@ -144,10 +182,19 @@ public class BrowserActionsContextMenuItemDelegate { |
| * @param linkUrl The url to open. |
| */ |
| public void onOpenInBackground(String linkUrl) { |
| - sendBrowserActionsNotification(); |
| - Toast.makeText(mContext, R.string.browser_actions_open_in_background_toast_message, |
| - Toast.LENGTH_SHORT) |
| - .show(); |
| + int tabId = openTabInBackground(linkUrl); |
| + if (tabId != Tab.INVALID_TAB_ID) { |
| + sendBrowserActionsNotification(tabId); |
| + Toast.makeText(mContext, R.string.browser_actions_open_in_background_toast_message, |
| + Toast.LENGTH_SHORT) |
| + .show(); |
| + } else { |
| + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(linkUrl)); |
| + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
| + intent.setClass(mContext, ChromeLauncherActivity.class); |
| + intent.putExtra(ChromeLauncherActivity.EXTRA_IS_ALLOWED_TO_RETURN_TO_PARENT, false); |
| + IntentUtils.safeStartActivity(mContext, intent); |
| + } |
| } |
| /** |