Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 package org.chromium.chrome.browser.browseractions; | |
| 6 | |
| 7 import android.app.NotificationManager; | |
| 8 import android.app.PendingIntent; | |
| 9 import android.app.Service; | |
| 10 import android.content.Context; | |
| 11 import android.content.Intent; | |
| 12 import android.os.IBinder; | |
| 13 import android.text.TextUtils; | |
| 14 | |
| 15 import org.chromium.base.ContextUtils; | |
| 16 import org.chromium.chrome.R; | |
| 17 import org.chromium.chrome.browser.document.ChromeLauncherActivity; | |
| 18 import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder; | |
| 19 import org.chromium.chrome.browser.notifications.NotificationBuilderFactory; | |
| 20 import org.chromium.chrome.browser.notifications.NotificationConstants; | |
| 21 import org.chromium.chrome.browser.notifications.NotificationUmaTracker; | |
| 22 import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions; | |
| 23 import org.chromium.chrome.browser.tab.Tab; | |
| 24 import org.chromium.chrome.browser.util.IntentUtils; | |
| 25 | |
| 26 /** | |
| 27 * Service responsible for creating background tabs and notifications for Browse r Actions. | |
| 28 */ | |
| 29 public class BrowserActionsTabCreationService extends Service { | |
|
Yusuf
2017/07/19 00:13:00
BrowserActionsService is cleaner I think.
ltian
2017/08/07 23:24:11
Done.
| |
| 30 public static final String ACTION_TAB_CREATION_START = | |
|
Yusuf
2017/07/19 00:13:00
Some name clarification here:
TAB_CREATION_START
ltian
2017/08/07 23:24:11
Yes, TAB_CREATION_START means start creating a tab
| |
| 31 "org.chromium.chrome.browser.browseractions.ACTION_TAB_CREATION_STAR T"; | |
| 32 public static final String ACTION_TAB_CREATION_UPDATE = | |
| 33 "org.chromium.chrome.browser.browseractions.ACTION_TAB_CREATION_UPDA TE"; | |
| 34 public static final String ACTION_TAB_CREATION_FINISH = | |
| 35 "org.chromium.chrome.browser.browseractions.ACTION_TAB_CREATION_FINI SH"; | |
| 36 | |
| 37 /** | |
| 38 * Action to request open ChromeTabbedActivity in tab switcher mode. | |
| 39 */ | |
| 40 public static final String ACTION_BROWSER_ACTIONS_OPEN_IN_BACKGROUND = | |
| 41 "org.chromium.chrome.browser.browseractions.browser_action_open_in_b ackground"; | |
| 42 | |
| 43 public static final String PREF_HAS_BROWSER_ACTIONS_NOTIFICATION = | |
| 44 "org.chromium.chrome.browser.browseractions.HAS_BROWSER_ACTIONS_NOTI FICATION"; | |
| 45 | |
| 46 /** | |
| 47 * Extra that indicates whether to show a Tab for single url or the tab swit cher for | |
| 48 * multiple urls. | |
| 49 */ | |
| 50 public static final String EXTRA_IS_SINGLE_URL = | |
| 51 "org.chromium.chrome.browser.browseractions.is_single_url"; | |
| 52 | |
| 53 private int mTitleResId = R.string.browser_actions_single_link_open_notifica tion_title; | |
| 54 | |
| 55 @Override | |
| 56 public IBinder onBind(Intent intent) { | |
| 57 return null; | |
| 58 } | |
| 59 | |
| 60 @Override | |
| 61 public int onStartCommand(Intent intent, int flags, int startId) { | |
|
Yusuf
2017/07/19 00:13:00
Note that onStartCommand is on the main thread and
ltian
2017/08/07 23:24:11
The problem for IntentService is it is not a foreg
| |
| 62 if (TextUtils.equals(intent.getAction(), ACTION_TAB_CREATION_START)) { | |
| 63 sendBrowserActionsNotification(Tab.INVALID_TAB_ID); | |
| 64 ContextUtils.getAppSharedPreferences() | |
| 65 .edit() | |
| 66 .putBoolean(PREF_HAS_BROWSER_ACTIONS_NOTIFICATION, true) | |
| 67 .apply(); | |
| 68 NotificationUmaTracker.getInstance().onNotificationShown( | |
| 69 NotificationUmaTracker.BROWSER_ACTIONS, ChannelDefinitions.C HANNEL_ID_BROWSER); | |
| 70 } else if (TextUtils.equals(intent.getAction(), ACTION_TAB_CREATION_UPDA TE)) { | |
| 71 int tabId = IntentUtils.safeGetIntExtra( | |
| 72 intent, BrowserActionsContextMenuItemDelegate.EXTRA_TAB_ID, Tab.INVALID_TAB_ID); | |
| 73 sendBrowserActionsNotification(tabId); | |
| 74 } else if (TextUtils.equals(intent.getAction(), ACTION_TAB_CREATION_FINI SH)) { | |
| 75 stopForeground(false); | |
| 76 } | |
| 77 // The service will not be restarted if Chrome get killed. | |
| 78 return START_NOT_STICKY; | |
| 79 } | |
| 80 | |
| 81 private void sendBrowserActionsNotification(int tabId) { | |
| 82 ChromeNotificationBuilder builder = createNotificationBuilder(tabId); | |
| 83 startForeground(NotificationConstants.NOTIFICATION_ID_BROWSER_ACTIONS, b uilder.build()); | |
| 84 } | |
| 85 | |
| 86 private ChromeNotificationBuilder createNotificationBuilder(int tabId) { | |
| 87 ChromeNotificationBuilder builder = | |
| 88 NotificationBuilderFactory | |
| 89 .createChromeNotificationBuilder( | |
| 90 true /* preferCompat */, ChannelDefinitions.CHAN NEL_ID_BROWSER) | |
| 91 .setSmallIcon(R.drawable.infobar_chrome) | |
| 92 .setLocalOnly(true) | |
| 93 .setAutoCancel(true) | |
| 94 .setContentText(this.getString(R.string.browser_actions_ notification_text)); | |
| 95 if (tabId == Tab.INVALID_TAB_ID) { | |
| 96 mTitleResId = hasBrowserActionsNotification() | |
| 97 ? R.string.browser_actions_multi_links_open_notification_tit le | |
| 98 : R.string.browser_actions_single_link_open_notification_tit le; | |
| 99 } | |
| 100 builder.setContentTitle(this.getString(mTitleResId)); | |
| 101 Intent intent = buildNotificationIntent(tabId); | |
| 102 PendingIntent notifyPendingIntent = | |
| 103 PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UP DATE_CURRENT); | |
| 104 builder.setContentIntent(notifyPendingIntent); | |
| 105 return builder; | |
| 106 } | |
| 107 | |
| 108 private Intent buildNotificationIntent(int tabId) { | |
| 109 boolean multipleUrls = hasBrowserActionsNotification(); | |
| 110 if (!multipleUrls && tabId != Tab.INVALID_TAB_ID) { | |
| 111 return Tab.createBringTabToFrontIntent(tabId); | |
| 112 } | |
| 113 Intent intent = new Intent(this, ChromeLauncherActivity.class); | |
| 114 intent.setAction(ACTION_BROWSER_ACTIONS_OPEN_IN_BACKGROUND); | |
| 115 intent.putExtra(EXTRA_IS_SINGLE_URL, !multipleUrls); | |
| 116 return intent; | |
| 117 } | |
| 118 | |
| 119 private boolean hasBrowserActionsNotification() { | |
| 120 return ContextUtils.getAppSharedPreferences().getBoolean( | |
| 121 PREF_HAS_BROWSER_ACTIONS_NOTIFICATION, false); | |
| 122 } | |
| 123 | |
| 124 /** | |
| 125 * Cancel Browser Actions notification. | |
| 126 */ | |
| 127 public static void cancelBrowserActionsNotification() { | |
| 128 NotificationManager notificationManager = | |
| 129 (NotificationManager) ContextUtils.getApplicationContext().getSy stemService( | |
| 130 Context.NOTIFICATION_SERVICE); | |
| 131 notificationManager.cancel(NotificationConstants.NOTIFICATION_ID_BROWSER _ACTIONS); | |
| 132 ContextUtils.getAppSharedPreferences() | |
| 133 .edit() | |
| 134 .putBoolean(PREF_HAS_BROWSER_ACTIONS_NOTIFICATION, false) | |
| 135 .apply(); | |
| 136 } | |
| 137 | |
| 138 /** | |
| 139 * Checks whether Chrome should display tab switcher via Browser Actions Int ent. | |
| 140 * @param intent The intent to open the Chrome. | |
| 141 * @param isOverviewVisible Whether tab switcher is shown. | |
| 142 */ | |
| 143 public static boolean toggleOverviewByBrowserActions(Intent intent, boolean isOverviewVisible) { | |
| 144 boolean fromBrowserActions = isStartedByBrowserActions(intent); | |
| 145 boolean isSingleUrl = IntentUtils.safeGetBooleanExtra(intent, EXTRA_IS_S INGLE_URL, false); | |
| 146 if (fromBrowserActions) { | |
| 147 return isSingleUrl == isOverviewVisible; | |
| 148 } | |
| 149 return false; | |
| 150 } | |
| 151 | |
| 152 private static boolean isStartedByBrowserActions(Intent intent) { | |
| 153 if (ACTION_BROWSER_ACTIONS_OPEN_IN_BACKGROUND.equals(intent.getAction()) ) { | |
| 154 return true; | |
| 155 } | |
| 156 return false; | |
| 157 } | |
| 158 | |
| 159 /** | |
| 160 * Returns {@link Intent} to update the notification and the status of the s ervice. | |
| 161 * @param action The actions of the Intent. | |
| 162 */ | |
| 163 public static Intent getTabCreationIntent(String action) { | |
|
Yusuf
2017/07/19 00:13:00
this can handle all that is necessary in itself, t
ltian
2017/08/07 23:24:11
Done.
| |
| 164 Intent intent = new Intent( | |
| 165 ContextUtils.getApplicationContext(), BrowserActionsTabCreationS ervice.class); | |
| 166 intent.setAction(action); | |
| 167 return intent; | |
| 168 } | |
| 169 } | |
| OLD | NEW |