Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java | 
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java | 
| index 44e8838341b16c7dc730d63d857e565bf488c85d..4035ab656cdc8792960399abfda51e3aeb009386 100644 | 
| --- a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java | 
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java | 
| @@ -19,6 +19,7 @@ import org.chromium.base.ContextUtils; | 
| import org.chromium.base.Log; | 
| import org.chromium.chrome.R; | 
| import org.chromium.chrome.browser.tab.Tab; | 
| +import org.chromium.chrome.browser.tab.TabWebContentsDelegateAndroid; | 
| import java.net.MalformedURLException; | 
| import java.net.URL; | 
| @@ -36,6 +37,10 @@ public class MediaCaptureNotificationService extends Service { | 
| private static final String NOTIFICATION_ID_EXTRA = "NotificationId"; | 
| private static final String NOTIFICATION_MEDIA_TYPE_EXTRA = "NotificationMediaType"; | 
| private static final String NOTIFICATION_MEDIA_URL_EXTRA = "NotificationMediaUrl"; | 
| + private static final String ACTION_MEDIA_CAPTURE_UPDATE = | 
| 
 
gone
2016/08/10 19:04:02
nit: Alphabetize these.
 
braveyao
2016/08/12 23:37:44
Done.
 
 | 
| + "org.chromium.chrome.browser.media.SCREEN_CAPTURE_UPDATE"; | 
| + private static final String ACTION_SCREEN_CAPTURE_STOP = | 
| + "org.chromium.chrome.browser.media.SCREEN_CAPTURE_STOP"; | 
| private static final String WEBRTC_NOTIFICATION_IDS = "WebRTCNotificationIds"; | 
| private static final String TAG = "MediaCapture"; | 
| @@ -44,6 +49,7 @@ public class MediaCaptureNotificationService extends Service { | 
| private static final int MEDIATYPE_AUDIO_AND_VIDEO = 1; | 
| private static final int MEDIATYPE_VIDEO_ONLY = 2; | 
| private static final int MEDIATYPE_AUDIO_ONLY = 3; | 
| + private static final int MEDIATYPE_SCREEN_CAPTURE = 4; | 
| private NotificationManager mNotificationManager; | 
| private Context mContext; | 
| @@ -83,10 +89,25 @@ public class MediaCaptureNotificationService extends Service { | 
| cancelPreviousWebRtcNotifications(); | 
| stopSelf(); | 
| } else { | 
| - updateNotification( | 
| - intent.getIntExtra(NOTIFICATION_ID_EXTRA, Tab.INVALID_TAB_ID), | 
| - intent.getIntExtra(NOTIFICATION_MEDIA_TYPE_EXTRA, MEDIATYPE_NO_MEDIA), | 
| - intent.getStringExtra(NOTIFICATION_MEDIA_URL_EXTRA)); | 
| + String action = intent.getAction(); | 
| + int notificationId = intent.getIntExtra(NOTIFICATION_ID_EXTRA, Tab.INVALID_TAB_ID); | 
| + int mediaType = intent.getIntExtra(NOTIFICATION_MEDIA_TYPE_EXTRA, MEDIATYPE_NO_MEDIA); | 
| + String url = intent.getStringExtra(NOTIFICATION_MEDIA_URL_EXTRA); | 
| + | 
| + switch (action) { | 
| + case ACTION_MEDIA_CAPTURE_UPDATE: | 
| + updateNotification(notificationId, mediaType, url); | 
| + break; | 
| + | 
| + case ACTION_SCREEN_CAPTURE_STOP: | 
| + // Notify native to stop screen capture when the STOP button in notification | 
| + // is clicked. | 
| + TabWebContentsDelegateAndroid.notifyStopped(notificationId); | 
| + break; | 
| + | 
| + default: | 
| + break; | 
| + } | 
| } | 
| return super.onStartCommand(intent, flags, startId); | 
| } | 
| @@ -122,7 +143,7 @@ public class MediaCaptureNotificationService extends Service { | 
| } | 
| destroyNotification(notificationId); | 
| if (mediaType != MEDIATYPE_NO_MEDIA) { | 
| - createNotification(notificationId, mediaType, url); | 
| + createNotification(notificationId, mediaType, url, true); | 
| } | 
| if (mNotifications.size() == 0) stopSelf(); | 
| } | 
| @@ -145,7 +166,7 @@ public class MediaCaptureNotificationService extends Service { | 
| * @param mediaType Media type of the notification. | 
| * @param url Url of the current webrtc call. | 
| */ | 
| - private void createNotification(int notificationId, int mediaType, String url) { | 
| + private void createNotification(int notificationId, int mediaType, String url, boolean headup) { | 
| int notificationContentTextId = 0; | 
| int notificationIconId = 0; | 
| if (mediaType == MEDIATYPE_AUDIO_AND_VIDEO) { | 
| @@ -157,6 +178,9 @@ public class MediaCaptureNotificationService extends Service { | 
| } else if (mediaType == MEDIATYPE_AUDIO_ONLY) { | 
| notificationContentTextId = R.string.audio_call_notification_text_2; | 
| notificationIconId = R.drawable.webrtc_audio; | 
| + } else if (mediaType == MEDIATYPE_SCREEN_CAPTURE) { | 
| + notificationContentTextId = R.string.screen_capture_notification_text; | 
| + notificationIconId = R.drawable.webrtc_video; | 
| } | 
| NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext) | 
| @@ -166,15 +190,29 @@ public class MediaCaptureNotificationService extends Service { | 
| .setSmallIcon(notificationIconId) | 
| .setLocalOnly(true); | 
| - StringBuilder contentText = new StringBuilder( | 
| - mContext.getResources().getString(notificationContentTextId)).append('.'); | 
| + StringBuilder contentText = | 
| + new StringBuilder(mContext.getResources().getString(notificationContentTextId, url)) | 
| + .append('.'); | 
| Intent tabIntent = Tab.createBringTabToFrontIntent(notificationId); | 
| if (tabIntent != null) { | 
| PendingIntent contentIntent = PendingIntent.getActivity( | 
| mContext, notificationId, tabIntent, 0); | 
| builder.setContentIntent(contentIntent); | 
| - contentText.append( | 
| - mContext.getResources().getString(R.string.media_notification_link_text, url)); | 
| + if (mediaType == MEDIATYPE_SCREEN_CAPTURE) { | 
| + // To screen capture notification, add Stop action button and enable head up | 
| 
 
gone
2016/08/10 19:04:02
1) Add a "Stop" button to the screen capture notif
 
braveyao
2016/08/12 23:37:43
Done.
 
 | 
| + // notification if needed. | 
| + if (headup) { | 
| + // Enable the head up notification. | 
| 
 
gone
2016/08/10 19:04:02
nit: Don't need to say that you're enabling the he
 
braveyao
2016/08/12 23:37:44
Done.
 
 | 
| + builder.setPriority(Notification.PRIORITY_HIGH); | 
| + builder.setVibrate(new long[0]); | 
| + } | 
| + builder.addAction(R.drawable.ic_vidcontrol_stop, "Stop", | 
| + buildPendingIntent(ACTION_SCREEN_CAPTURE_STOP, notificationId, mediaType, | 
| + url)); | 
| + } else { | 
| + contentText.append(mContext.getResources().getString( | 
| + R.string.media_notification_link_text, url)); | 
| + } | 
| } else { | 
| contentText.append(" ").append(url); | 
| } | 
| @@ -227,10 +265,13 @@ public class MediaCaptureNotificationService extends Service { | 
| /** | 
| * @param audio If audio is being captured. | 
| * @param video If video is being captured. | 
| + * @param screen If screen is being captured. | 
| * @return A constant identify what media is being captured. | 
| */ | 
| - public static int getMediaType(boolean audio, boolean video) { | 
| - if (audio && video) { | 
| + public static int getMediaType(boolean audio, boolean video, boolean screen) { | 
| + if (screen) { | 
| + return MEDIATYPE_SCREEN_CAPTURE; | 
| + } else if (audio && video) { | 
| return MEDIATYPE_AUDIO_AND_VIDEO; | 
| } else if (audio) { | 
| return MEDIATYPE_AUDIO_ONLY; | 
| @@ -264,10 +305,10 @@ public class MediaCaptureNotificationService extends Service { | 
| * @param fullUrl Url of the current webrtc call. | 
| */ | 
| public static void updateMediaNotificationForTab( | 
| - Context context, int tabId, boolean audio, boolean video, String fullUrl) { | 
| - int mediaType = getMediaType(audio, video); | 
| + Context context, int tabId, int mediaType, String fullUrl) { | 
| if (!shouldStartService(context, mediaType, tabId)) return; | 
| Intent intent = new Intent(context, MediaCaptureNotificationService.class); | 
| + intent.setAction(ACTION_MEDIA_CAPTURE_UPDATE); | 
| intent.putExtra(NOTIFICATION_ID_EXTRA, tabId); | 
| String baseUrl = fullUrl; | 
| try { | 
| @@ -293,4 +334,18 @@ public class MediaCaptureNotificationService extends Service { | 
| context.startService(new Intent(context, MediaCaptureNotificationService.class)); | 
| } | 
| + | 
| + /** | 
| + * Build PendingIntent for the actions of screen capture notification. | 
| + */ | 
| + private PendingIntent buildPendingIntent( | 
| + String action, int notificationId, int mediaType, String url) { | 
| + Intent intent = new Intent(this, MediaCaptureNotificationService.class); | 
| + intent.setAction(action); | 
| + intent.putExtra(NOTIFICATION_ID_EXTRA, notificationId); | 
| + intent.putExtra(NOTIFICATION_MEDIA_TYPE_EXTRA, mediaType); | 
| + intent.putExtra(NOTIFICATION_MEDIA_URL_EXTRA, url); | 
| + return PendingIntent.getService( | 
| + mContext, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT); | 
| + } | 
| } |