| 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..f58c47939ca2446b90624df0e601d86a54658797 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;
|
| @@ -30,6 +31,10 @@ import java.util.Set;
|
| * Service that creates/destroys the WebRTC notification when media capture starts/stops.
|
| */
|
| public class MediaCaptureNotificationService extends Service {
|
| + private static final String ACTION_MEDIA_CAPTURE_UPDATE =
|
| + "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 NOTIFICATION_NAMESPACE = "MediaCaptureNotificationService";
|
|
|
| @@ -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,18 @@ 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);
|
| +
|
| + if (ACTION_MEDIA_CAPTURE_UPDATE.equals(action)) {
|
| + updateNotification(notificationId, mediaType, url);
|
| + } else if (ACTION_SCREEN_CAPTURE_STOP.equals(action)) {
|
| + // Notify native to stop screen capture when the STOP button in notification
|
| + // is clicked.
|
| + TabWebContentsDelegateAndroid.notifyStopped(notificationId);
|
| + }
|
| }
|
| return super.onStartCommand(intent, flags, startId);
|
| }
|
| @@ -146,35 +160,33 @@ public class MediaCaptureNotificationService extends Service {
|
| * @param url Url of the current webrtc call.
|
| */
|
| private void createNotification(int notificationId, int mediaType, String url) {
|
| - int notificationContentTextId = 0;
|
| - int notificationIconId = 0;
|
| - if (mediaType == MEDIATYPE_AUDIO_AND_VIDEO) {
|
| - notificationContentTextId = R.string.video_audio_call_notification_text_2;
|
| - notificationIconId = R.drawable.webrtc_video;
|
| - } else if (mediaType == MEDIATYPE_VIDEO_ONLY) {
|
| - notificationContentTextId = R.string.video_call_notification_text_2;
|
| - notificationIconId = R.drawable.webrtc_video;
|
| - } else if (mediaType == MEDIATYPE_AUDIO_ONLY) {
|
| - notificationContentTextId = R.string.audio_call_notification_text_2;
|
| - notificationIconId = R.drawable.webrtc_audio;
|
| - }
|
| + NotificationCompat.Builder builder =
|
| + new NotificationCompat.Builder(mContext)
|
| + .setAutoCancel(false)
|
| + .setOngoing(true)
|
| + .setContentTitle(mContext.getString(R.string.app_name))
|
| + .setSmallIcon(getNotificationIconId(mediaType))
|
| + .setLocalOnly(true);
|
|
|
| - NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext)
|
| - .setAutoCancel(false)
|
| - .setOngoing(true)
|
| - .setContentTitle(mContext.getString(R.string.app_name))
|
| - .setSmallIcon(notificationIconId)
|
| - .setLocalOnly(true);
|
| -
|
| - StringBuilder contentText = new StringBuilder(
|
| - mContext.getResources().getString(notificationContentTextId)).append('.');
|
| + StringBuilder contentText =
|
| + new StringBuilder(getNotificationContentText(mediaType, 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) {
|
| + // Add a "Stop" button to the screen capture notification and turn the notification
|
| + // into a high priority one.
|
| + builder.setPriority(Notification.PRIORITY_HIGH);
|
| + builder.setVibrate(new long[0]);
|
| + builder.addAction(R.drawable.ic_vidcontrol_stop,
|
| + mContext.getResources().getString(R.string.accessibility_stop),
|
| + buildStopCapturePendingIntent(notificationId));
|
| + } else {
|
| + contentText.append(mContext.getResources().getString(
|
| + R.string.media_notification_link_text, url));
|
| + }
|
| } else {
|
| contentText.append(" ").append(url);
|
| }
|
| @@ -188,6 +200,48 @@ public class MediaCaptureNotificationService extends Service {
|
| }
|
|
|
| /**
|
| + * Builds notification content text for the provided mediaType and url.
|
| + * @param mediaType Media type of the notification.
|
| + * @param url Url of the current webrtc call.
|
| + * @return A string builder initialized to the contents of the specified string.
|
| + */
|
| + private String getNotificationContentText(int mediaType, String url) {
|
| + if (mediaType == MEDIATYPE_SCREEN_CAPTURE) {
|
| + return mContext.getResources().getString(
|
| + R.string.screen_capture_notification_text, url);
|
| + }
|
| +
|
| + int notificationContentTextId = 0;
|
| + if (mediaType == MEDIATYPE_AUDIO_AND_VIDEO) {
|
| + notificationContentTextId = R.string.video_audio_call_notification_text_2;
|
| + } else if (mediaType == MEDIATYPE_VIDEO_ONLY) {
|
| + notificationContentTextId = R.string.video_call_notification_text_2;
|
| + } else if (mediaType == MEDIATYPE_AUDIO_ONLY) {
|
| + notificationContentTextId = R.string.audio_call_notification_text_2;
|
| + }
|
| +
|
| + return mContext.getResources().getString(notificationContentTextId);
|
| + }
|
| +
|
| + /**
|
| + * @param mediaType Media type of the notification.
|
| + * @return An icon id of the provided mediaType.
|
| + */
|
| + private int getNotificationIconId(int mediaType) {
|
| + int notificationIconId = 0;
|
| + if (mediaType == MEDIATYPE_AUDIO_AND_VIDEO) {
|
| + notificationIconId = R.drawable.webrtc_video;
|
| + } else if (mediaType == MEDIATYPE_VIDEO_ONLY) {
|
| + notificationIconId = R.drawable.webrtc_video;
|
| + } else if (mediaType == MEDIATYPE_AUDIO_ONLY) {
|
| + notificationIconId = R.drawable.webrtc_audio;
|
| + } else if (mediaType == MEDIATYPE_SCREEN_CAPTURE) {
|
| + notificationIconId = R.drawable.webrtc_video;
|
| + }
|
| + return notificationIconId;
|
| + }
|
| +
|
| + /**
|
| * Update shared preferences entry with ids of the visible notifications.
|
| * @param notificationId Id of the notification.
|
| * @param remove Boolean describing if the notification was added or removed.
|
| @@ -227,10 +281,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;
|
| @@ -259,15 +316,14 @@ public class MediaCaptureNotificationService extends Service {
|
| * Send an intent to MediaCaptureNotificationService to either create, update or destroy the
|
| * notification identified by tabId.
|
| * @param tabId Unique notification id.
|
| - * @param audio If audio is being captured.
|
| - * @param video If video is being captured.
|
| + * @param mediaType The media type that is being captured.
|
| * @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 +349,15 @@ public class MediaCaptureNotificationService extends Service {
|
|
|
| context.startService(new Intent(context, MediaCaptureNotificationService.class));
|
| }
|
| +
|
| + /**
|
| + * Build PendingIntent for the actions of screen capture notification.
|
| + */
|
| + private PendingIntent buildStopCapturePendingIntent(int notificationId) {
|
| + Intent intent = new Intent(this, MediaCaptureNotificationService.class);
|
| + intent.setAction(ACTION_SCREEN_CAPTURE_STOP);
|
| + intent.putExtra(NOTIFICATION_ID_EXTRA, notificationId);
|
| + return PendingIntent.getService(
|
| + mContext, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
| + }
|
| }
|
|
|