Index: chrome/android/java/src/org/chromium/chrome/browser/media/MediaNotificationService.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaNotificationService.java |
deleted file mode 100644 |
index 5495b19399c62587a736276df04f91f3aba65d59..0000000000000000000000000000000000000000 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaNotificationService.java |
+++ /dev/null |
@@ -1,304 +0,0 @@ |
-// Copyright 2015 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-package org.chromium.chrome.browser.media; |
- |
-import android.app.Notification; |
-import android.app.NotificationManager; |
-import android.app.PendingIntent; |
-import android.app.Service; |
-import android.content.Context; |
-import android.content.Intent; |
-import android.content.SharedPreferences; |
-import android.os.IBinder; |
-import android.preference.PreferenceManager; |
-import android.support.v4.app.NotificationCompat; |
-import android.util.Log; |
-import android.util.SparseIntArray; |
- |
-import org.chromium.chrome.R; |
-import org.chromium.chrome.browser.tab.Tab; |
- |
-import java.net.MalformedURLException; |
-import java.net.URL; |
-import java.util.HashSet; |
-import java.util.Iterator; |
-import java.util.Set; |
- |
-/** |
- * Service that creates/destroys media related notifications. |
- * There are two kinds of notifications: |
- * 1. The WebRTC notification when media capture starts/stops. |
- * 2. The audio playback notification when a tab is playing audio. |
- * These notifications are made mutually exclusive: there can be |
- * only one media notification for a tab. |
- */ |
-public class MediaNotificationService extends Service { |
- |
- private static final String NOTIFICATION_NAMESPACE = "MediaNotificationService"; |
- |
- 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 MEDIA_NOTIFICATION_IDS = "WebRTCNotificationIds"; |
- private static final String LOG_TAG = "MediaNotificationService"; |
- |
- private static final int MEDIATYPE_NO_MEDIA = 0; |
- private static final int MEDIATYPE_AUDIO_AND_VIDEO_CAPTURE = 1; |
- private static final int MEDIATYPE_VIDEO_CAPTURE_ONLY = 2; |
- private static final int MEDIATYPE_AUDIO_CAPTURE_ONLY = 3; |
- private static final int MEDIATYPE_AUDIO_PLAYBACK = 4; |
- |
- private NotificationManager mNotificationManager; |
- private Context mContext; |
- private SharedPreferences mSharedPreferences; |
- private final SparseIntArray mNotifications = new SparseIntArray(); |
- |
- @Override |
- public void onCreate() { |
- mContext = getApplicationContext(); |
- mNotificationManager = (NotificationManager) mContext.getSystemService( |
- Context.NOTIFICATION_SERVICE); |
- mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); |
- super.onCreate(); |
- } |
- |
- /** |
- * @param notificationId Unique id of the notification. |
- * @param mediaType Media type of the notification. |
- * @return Whether the notification has already been created for provided notification id and |
- * mediaType. |
- */ |
- private boolean doesNotificationNeedUpdate(int notificationId, int mediaType) { |
- return mNotifications.get(notificationId) != mediaType; |
- } |
- |
- /** |
- * @param notificationId Unique id of the notification. |
- * @return Whether the notification has already been created for the provided notification id. |
- */ |
- private boolean doesNotificationExist(int notificationId) { |
- return mNotifications.indexOfKey(notificationId) >= 0; |
- } |
- |
- @Override |
- public int onStartCommand(Intent intent, int flags, int startId) { |
- if (intent == null || intent.getExtras() == null) { |
- 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)); |
- } |
- return super.onStartCommand(intent, flags, startId); |
- } |
- |
- /** |
- * Cancel all previously existing notifications. Essential while doing a clean start (may be |
- * after a browser crash which caused old notifications to exist). |
- */ |
- private void cancelPreviousWebRtcNotifications() { |
- Set<String> notificationIds = |
- mSharedPreferences.getStringSet(MEDIA_NOTIFICATION_IDS, null); |
- if (notificationIds == null) return; |
- Iterator<String> iterator = notificationIds.iterator(); |
- while (iterator.hasNext()) { |
- mNotificationManager.cancel(NOTIFICATION_NAMESPACE, Integer.parseInt(iterator.next())); |
- } |
- SharedPreferences.Editor sharedPreferenceEditor = mSharedPreferences.edit(); |
- sharedPreferenceEditor.remove(MediaNotificationService.MEDIA_NOTIFICATION_IDS); |
- sharedPreferenceEditor.apply(); |
- } |
- |
- /** |
- * Updates the extisting notification or creates one if none exist for the provided |
- * notificationId and mediaType. |
- * @param notificationId Unique id of the notification. |
- * @param mediaType Media type of the notification. |
- * @param url Url of the current webrtc call. |
- */ |
- private void updateNotification(int notificationId, int mediaType, String url) { |
- if (doesNotificationExist(notificationId) |
- && !doesNotificationNeedUpdate(notificationId, mediaType)) { |
- return; |
- } |
- destroyNotification(notificationId); |
- if (mediaType != MEDIATYPE_NO_MEDIA) { |
- createNotification(notificationId, mediaType, url); |
- } |
- if (mNotifications.size() == 0) stopSelf(); |
- } |
- |
- /** |
- * Destroys the notification for the id notificationId. |
- * @param notificationId Unique id of the notification. |
- */ |
- private void destroyNotification(int notificationId) { |
- if (doesNotificationExist(notificationId)) { |
- mNotificationManager.cancel(NOTIFICATION_NAMESPACE, notificationId); |
- mNotifications.delete(notificationId); |
- updateSharedPreferencesEntry(notificationId, true); |
- } |
- } |
- |
- /** |
- * Creates a notification for the provided notificationId and mediaType. |
- * @param notificationId Unique id of the notification. |
- * @param mediaType Media type of the notification. |
- * @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_CAPTURE) { |
- notificationContentTextId = R.string.video_audio_call_notification_text_2; |
- notificationIconId = R.drawable.webrtc_video; |
- } else if (mediaType == MEDIATYPE_VIDEO_CAPTURE_ONLY) { |
- notificationContentTextId = R.string.video_call_notification_text_2; |
- notificationIconId = R.drawable.webrtc_video; |
- } else if (mediaType == MEDIATYPE_AUDIO_CAPTURE_ONLY) { |
- notificationContentTextId = R.string.audio_call_notification_text_2; |
- notificationIconId = R.drawable.webrtc_audio; |
- } else if (mediaType == MEDIATYPE_AUDIO_PLAYBACK) { |
- notificationContentTextId = R.string.audio_playback_notification_text; |
- notificationIconId = R.drawable.audio_playing; |
- } |
- |
- Intent tabIntent = Tab.createBringTabToFrontIntent(notificationId); |
- PendingIntent contentIntent = PendingIntent.getActivity( |
- mContext, notificationId, tabIntent, 0); |
- String contentText = mContext.getResources().getString(notificationContentTextId) + ". " |
- + mContext.getResources().getString( |
- R.string.media_notification_link_text, url); |
- |
- NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext) |
- .setAutoCancel(false) |
- .setOngoing(true) |
- .setContentIntent(contentIntent) |
- .setContentTitle(mContext.getString(R.string.app_name)) |
- .setContentText(contentText) |
- .setSmallIcon(notificationIconId) |
- .setLocalOnly(true); |
- |
- Notification notification = new NotificationCompat.BigTextStyle(builder) |
- .bigText(contentText).build(); |
- mNotificationManager.notify(NOTIFICATION_NAMESPACE, notificationId, notification); |
- mNotifications.put(notificationId, mediaType); |
- updateSharedPreferencesEntry(notificationId, false); |
- } |
- |
- /** |
- * 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. |
- */ |
- private void updateSharedPreferencesEntry(int notificationId, boolean remove) { |
- Set<String> notificationIds = |
- new HashSet<String>(mSharedPreferences.getStringSet(MEDIA_NOTIFICATION_IDS, |
- new HashSet<String>())); |
- if (remove && !notificationIds.isEmpty() |
- && notificationIds.contains(String.valueOf(notificationId))) { |
- notificationIds.remove(String.valueOf(notificationId)); |
- } else if (!remove) { |
- notificationIds.add(String.valueOf(notificationId)); |
- } |
- SharedPreferences.Editor sharedPreferenceEditor = mSharedPreferences.edit(); |
- sharedPreferenceEditor.putStringSet(MEDIA_NOTIFICATION_IDS, notificationIds); |
- sharedPreferenceEditor.apply(); |
- } |
- |
- @Override |
- public void onDestroy() { |
- cancelPreviousWebRtcNotifications(); |
- super.onDestroy(); |
- } |
- |
- @Override |
- public boolean onUnbind(Intent intent) { |
- cancelPreviousWebRtcNotifications(); |
- return super.onUnbind(intent); |
- } |
- |
- @Override |
- public IBinder onBind(Intent intent) { |
- return null; |
- } |
- |
- /** |
- * @param audio If audio is being captured. |
- * @param video If video is being captured. |
- * @return A constant identify what media is being captured. |
- */ |
- public static int getMediaType(boolean audioCapture, |
- boolean videoCapture, boolean audioPlayback) { |
- if (audioCapture && videoCapture) { |
- return MEDIATYPE_AUDIO_AND_VIDEO_CAPTURE; |
- } else if (audioCapture) { |
- return MEDIATYPE_AUDIO_CAPTURE_ONLY; |
- } else if (videoCapture) { |
- return MEDIATYPE_VIDEO_CAPTURE_ONLY; |
- } else if (audioPlayback) { |
- return MEDIATYPE_AUDIO_PLAYBACK; |
- } else { |
- return MEDIATYPE_NO_MEDIA; |
- } |
- } |
- |
- private static boolean shouldStartService(Context context, int mediaType, int tabId) { |
- if (mediaType != MEDIATYPE_NO_MEDIA) return true; |
- SharedPreferences sharedPreferences = |
- PreferenceManager.getDefaultSharedPreferences(context); |
- Set<String> notificationIds = |
- sharedPreferences.getStringSet(MEDIA_NOTIFICATION_IDS, null); |
- if (notificationIds != null |
- && !notificationIds.isEmpty() |
- && notificationIds.contains(String.valueOf(tabId))) { |
- return true; |
- } |
- return false; |
- } |
- |
- /** |
- * Send an intent to MediaNotificationService 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 fullUrl Url of the current webrtc call. |
- */ |
- public static void updateMediaNotificationForTab(Context context, int tabId, |
- boolean audioCapture, boolean videoCapture, boolean audioPlayback, |
- String fullUrl) { |
- int mediaType = getMediaType(audioCapture, videoCapture, audioPlayback); |
- if (!shouldStartService(context, mediaType, tabId)) return; |
- Intent intent = new Intent(context, MediaNotificationService.class); |
- intent.putExtra(NOTIFICATION_ID_EXTRA, tabId); |
- String baseUrl = fullUrl; |
- try { |
- URL url = new URL(fullUrl); |
- baseUrl = url.getProtocol() + "://" + url.getHost(); |
- } catch (MalformedURLException e) { |
- Log.w(LOG_TAG, "Error parsing the webrtc url " + fullUrl); |
- } |
- intent.putExtra(NOTIFICATION_MEDIA_URL_EXTRA, baseUrl); |
- intent.putExtra(NOTIFICATION_MEDIA_TYPE_EXTRA, mediaType); |
- context.startService(intent); |
- } |
- |
- /** |
- * Clear any previous media notifications. |
- */ |
- public static void clearMediaNotifications(Context context) { |
- SharedPreferences sharedPreferences = |
- PreferenceManager.getDefaultSharedPreferences(context); |
- Set<String> notificationIds = |
- sharedPreferences.getStringSet(MEDIA_NOTIFICATION_IDS, null); |
- if (notificationIds == null || notificationIds.isEmpty()) return; |
- |
- context.startService(new Intent(context, MediaNotificationService.class)); |
- } |
-} |