Commit 1dbea822 authored by Evan Stade's avatar Evan Stade Committed by Commit Bot

Move MediaNotificationManager.java to //components

Bug: 1057100
Change-Id: I76e10024a499eb65f4f0f217c25f571eccd1c542
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2373394Reviewed-by: default avatarMounir Lamouri <mlamouri@chromium.org>
Commit-Queue: Evan Stade <estade@chromium.org>
Cr-Commit-Position: refs/heads/master@{#802775}
parent b27c3351
...@@ -894,7 +894,7 @@ chrome_java_sources = [ ...@@ -894,7 +894,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/media/PictureInPictureController.java", "java/src/org/chromium/chrome/browser/media/PictureInPictureController.java",
"java/src/org/chromium/chrome/browser/media/remote/RecordCastAction.java", "java/src/org/chromium/chrome/browser/media/remote/RecordCastAction.java",
"java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationControllerDelegate.java", "java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationControllerDelegate.java",
"java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java", "java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationManager.java",
"java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java", "java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java",
"java/src/org/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker.java", "java/src/org/chromium/chrome/browser/metrics/ActivityTabStartupMetricsTracker.java",
"java/src/org/chromium/chrome/browser/metrics/BackgroundTaskMemoryMetricsEmitter.java", "java/src/org/chromium/chrome/browser/metrics/BackgroundTaskMemoryMetricsEmitter.java",
......
...@@ -10,10 +10,11 @@ import com.google.android.gms.cast.CastDevice; ...@@ -10,10 +10,11 @@ import com.google.android.gms.cast.CastDevice;
import com.google.android.gms.cast.MediaStatus; import com.google.android.gms.cast.MediaStatus;
import com.google.android.gms.cast.framework.media.RemoteMediaClient; import com.google.android.gms.cast.framework.media.RemoteMediaClient;
import org.chromium.chrome.browser.media.ui.MediaNotificationManager; import org.chromium.chrome.browser.media.ui.ChromeMediaNotificationManager;
import org.chromium.chrome.media.router.R; import org.chromium.chrome.media.router.R;
import org.chromium.components.browser_ui.media.MediaNotificationInfo; import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.components.browser_ui.media.MediaNotificationListener; import org.chromium.components.browser_ui.media.MediaNotificationListener;
import org.chromium.components.browser_ui.media.MediaNotificationManager;
import org.chromium.services.media_session.MediaMetadata; import org.chromium.services.media_session.MediaMetadata;
/** Base controller for updating media notification for Casting and MediaFling. */ /** Base controller for updating media notification for Casting and MediaFling. */
...@@ -45,7 +46,7 @@ public abstract class BaseNotificationController ...@@ -45,7 +46,7 @@ public abstract class BaseNotificationController
.setListener(this); .setListener(this);
updateNotificationMetadata(); updateNotificationMetadata();
MediaNotificationManager.show(mNotificationBuilder.build()); ChromeMediaNotificationManager.show(mNotificationBuilder.build());
} }
@Override @Override
...@@ -72,7 +73,7 @@ public abstract class BaseNotificationController ...@@ -72,7 +73,7 @@ public abstract class BaseNotificationController
} else { } else {
mNotificationBuilder.setActions(MediaNotificationInfo.ACTION_STOP); mNotificationBuilder.setActions(MediaNotificationInfo.ACTION_STOP);
} }
MediaNotificationManager.show(mNotificationBuilder.build()); ChromeMediaNotificationManager.show(mNotificationBuilder.build());
} }
/** Called when media metadata updated. */ /** Called when media metadata updated. */
...@@ -80,7 +81,7 @@ public abstract class BaseNotificationController ...@@ -80,7 +81,7 @@ public abstract class BaseNotificationController
public void onMetadataUpdated() { public void onMetadataUpdated() {
if (mNotificationBuilder == null) return; if (mNotificationBuilder == null) return;
updateNotificationMetadata(); updateNotificationMetadata();
MediaNotificationManager.show(mNotificationBuilder.build()); ChromeMediaNotificationManager.show(mNotificationBuilder.build());
} }
private void updateNotificationMetadata() { private void updateNotificationMetadata() {
......
...@@ -25,6 +25,7 @@ import org.chromium.chrome.browser.notifications.NotificationUmaTracker; ...@@ -25,6 +25,7 @@ import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
import org.chromium.chrome.browser.notifications.NotificationWrapperBuilderFactory; import org.chromium.chrome.browser.notifications.NotificationWrapperBuilderFactory;
import org.chromium.chrome.browser.notifications.channels.ChromeChannelDefinitions; import org.chromium.chrome.browser.notifications.channels.ChromeChannelDefinitions;
import org.chromium.components.browser_ui.media.MediaNotificationController; import org.chromium.components.browser_ui.media.MediaNotificationController;
import org.chromium.components.browser_ui.media.MediaNotificationManager;
import org.chromium.components.browser_ui.notifications.ForegroundServiceUtils; import org.chromium.components.browser_ui.notifications.ForegroundServiceUtils;
import org.chromium.components.browser_ui.notifications.NotificationMetadata; import org.chromium.components.browser_ui.notifications.NotificationMetadata;
import org.chromium.components.browser_ui.notifications.NotificationWrapper; import org.chromium.components.browser_ui.notifications.NotificationWrapper;
......
// Copyright 2020 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.ui;
import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.components.browser_ui.media.MediaNotificationManager;
/** Thin wrapper for {@link MediaNotificationManager}. */
public class ChromeMediaNotificationManager {
/**
* Shows a media notification. Passes through to {@link MediaNotificationManager}, utilizing a
* Chrome specific delegate.
*
* @param notificationInfo information to show in the notification
*/
public static void show(MediaNotificationInfo notificationInfo) {
MediaNotificationManager.show(notificationInfo, () -> {
return new ChromeMediaNotificationControllerDelegate(notificationInfo.id);
});
}
}
...@@ -18,6 +18,7 @@ import org.chromium.chrome.browser.tab.TabObserver; ...@@ -18,6 +18,7 @@ import org.chromium.chrome.browser.tab.TabObserver;
import org.chromium.chrome.browser.ui.favicon.LargeIconBridge; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge;
import org.chromium.components.browser_ui.media.MediaNotificationImageUtils; import org.chromium.components.browser_ui.media.MediaNotificationImageUtils;
import org.chromium.components.browser_ui.media.MediaNotificationInfo; import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.components.browser_ui.media.MediaNotificationManager;
import org.chromium.components.browser_ui.media.MediaSessionHelper; import org.chromium.components.browser_ui.media.MediaSessionHelper;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
...@@ -116,7 +117,7 @@ public class MediaSessionTabHelper implements MediaSessionHelper.Delegate { ...@@ -116,7 +117,7 @@ public class MediaSessionTabHelper implements MediaSessionHelper.Delegate {
@Override @Override
public void showMediaNotification(MediaNotificationInfo notificationInfo) { public void showMediaNotification(MediaNotificationInfo notificationInfo) {
MediaNotificationManager.show(notificationInfo); ChromeMediaNotificationManager.show(notificationInfo);
} }
@Override @Override
......
...@@ -27,6 +27,7 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; ...@@ -27,6 +27,7 @@ import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeActivityTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.components.browser_ui.media.MediaNotificationManager;
import org.chromium.content_public.browser.test.util.DOMUtils; import org.chromium.content_public.browser.test.util.DOMUtils;
import org.chromium.content_public.browser.test.util.JavaScriptUtils; import org.chromium.content_public.browser.test.util.JavaScriptUtils;
import org.chromium.net.test.EmbeddedTestServer; import org.chromium.net.test.EmbeddedTestServer;
...@@ -56,7 +57,7 @@ public class AutoplayMutedNotificationTest { ...@@ -56,7 +57,7 @@ public class AutoplayMutedNotificationTest {
} }
private boolean isMediaNotificationVisible() { private boolean isMediaNotificationVisible() {
return MediaNotificationManager.hasControllerForTesting(R.id.media_playback_notification); return MediaNotificationManager.getController(R.id.media_playback_notification) != null;
} }
private class MockAudioFocusChangeListener implements AudioManager.OnAudioFocusChangeListener { private class MockAudioFocusChangeListener implements AudioManager.OnAudioFocusChangeListener {
......
...@@ -30,6 +30,7 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner; ...@@ -30,6 +30,7 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.util.NewTabPageTestUtils; import org.chromium.chrome.test.util.NewTabPageTestUtils;
import org.chromium.chrome.test.util.browser.TabLoadObserver; import org.chromium.chrome.test.util.browser.TabLoadObserver;
import org.chromium.components.browser_ui.media.MediaNotificationController; import org.chromium.components.browser_ui.media.MediaNotificationController;
import org.chromium.components.browser_ui.media.MediaNotificationManager;
import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.components.url_formatter.SchemeDisplay; import org.chromium.components.url_formatter.SchemeDisplay;
import org.chromium.components.url_formatter.UrlFormatter; import org.chromium.components.url_formatter.UrlFormatter;
...@@ -118,8 +119,7 @@ public class MediaSessionTest { ...@@ -118,8 +119,7 @@ public class MediaSessionTest {
private void waitForNotificationReady() { private void waitForNotificationReady() {
CriteriaHelper.pollInstrumentationThread(() -> { CriteriaHelper.pollInstrumentationThread(() -> {
return MediaNotificationManager.hasControllerForTesting( return MediaNotificationManager.getController(R.id.media_playback_notification) != null;
R.id.media_playback_notification);
}); });
} }
......
...@@ -39,6 +39,7 @@ import org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerDel ...@@ -39,6 +39,7 @@ import org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerDel
import org.chromium.chrome.browser.notifications.NotificationUmaTracker; import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
import org.chromium.components.browser_ui.media.MediaNotificationController; import org.chromium.components.browser_ui.media.MediaNotificationController;
import org.chromium.components.browser_ui.media.MediaNotificationInfo; import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.components.browser_ui.media.MediaNotificationManager;
import org.chromium.services.media_session.MediaMetadata; import org.chromium.services.media_session.MediaMetadata;
/** /**
......
...@@ -39,6 +39,7 @@ import org.chromium.chrome.browser.notifications.NotificationUmaTracker; ...@@ -39,6 +39,7 @@ import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
import org.chromium.components.browser_ui.media.MediaNotificationController; import org.chromium.components.browser_ui.media.MediaNotificationController;
import org.chromium.components.browser_ui.media.MediaNotificationInfo; import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.components.browser_ui.media.MediaNotificationListener; import org.chromium.components.browser_ui.media.MediaNotificationListener;
import org.chromium.components.browser_ui.media.MediaNotificationManager;
import org.chromium.components.browser_ui.notifications.ForegroundServiceUtils; import org.chromium.components.browser_ui.notifications.ForegroundServiceUtils;
import org.chromium.components.browser_ui.notifications.NotificationWrapper; import org.chromium.components.browser_ui.notifications.NotificationWrapper;
import org.chromium.media_session.mojom.MediaSessionAction; import org.chromium.media_session.mojom.MediaSessionAction;
......
...@@ -12,6 +12,7 @@ android_library("java") { ...@@ -12,6 +12,7 @@ android_library("java") {
"java/src/org/chromium/components/browser_ui/media/MediaNotificationImageUtils.java", "java/src/org/chromium/components/browser_ui/media/MediaNotificationImageUtils.java",
"java/src/org/chromium/components/browser_ui/media/MediaNotificationInfo.java", "java/src/org/chromium/components/browser_ui/media/MediaNotificationInfo.java",
"java/src/org/chromium/components/browser_ui/media/MediaNotificationListener.java", "java/src/org/chromium/components/browser_ui/media/MediaNotificationListener.java",
"java/src/org/chromium/components/browser_ui/media/MediaNotificationManager.java",
"java/src/org/chromium/components/browser_ui/media/MediaNotificationUma.java", "java/src/org/chromium/components/browser_ui/media/MediaNotificationUma.java",
"java/src/org/chromium/components/browser_ui/media/MediaSessionHelper.java", "java/src/org/chromium/components/browser_ui/media/MediaSessionHelper.java",
"java/src/org/chromium/components/browser_ui/media/MediaSessionUma.java", "java/src/org/chromium/components/browser_ui/media/MediaSessionUma.java",
......
...@@ -2,14 +2,13 @@ ...@@ -2,14 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.chrome.browser.media.ui; package org.chromium.components.browser_ui.media;
import android.util.SparseArray; import android.util.SparseArray;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import org.chromium.components.browser_ui.media.MediaNotificationController; import org.chromium.base.supplier.Supplier;
import org.chromium.components.browser_ui.media.MediaNotificationInfo;
/** /**
* A class that manages the services/notifications for various media types. * A class that manages the services/notifications for various media types.
...@@ -34,12 +33,14 @@ public class MediaNotificationManager { ...@@ -34,12 +33,14 @@ public class MediaNotificationManager {
* mismatches |mMediaNotificationInfo.isPaused|, it is also no-op. * mismatches |mMediaNotificationInfo.isPaused|, it is also no-op.
* *
* @param notificationInfo information to show in the notification * @param notificationInfo information to show in the notification
* @param delegate a factory function for the delegate passed to new {@link
* MediaNotificatonController} instances.
*/ */
public static void show(MediaNotificationInfo notificationInfo) { public static void show(MediaNotificationInfo notificationInfo,
Supplier<MediaNotificationController.Delegate> delegateFactory) {
MediaNotificationController controller = sControllers.get(notificationInfo.id); MediaNotificationController controller = sControllers.get(notificationInfo.id);
if (controller == null) { if (controller == null) {
controller = new MediaNotificationController( controller = new MediaNotificationController(delegateFactory.get());
new ChromeMediaNotificationControllerDelegate(notificationInfo.id));
sControllers.put(notificationInfo.id, controller); sControllers.put(notificationInfo.id, controller);
} }
...@@ -85,18 +86,12 @@ public class MediaNotificationManager { ...@@ -85,18 +86,12 @@ public class MediaNotificationManager {
controller.activateAndroidMediaSession(tabId); controller.activateAndroidMediaSession(tabId);
} }
@VisibleForTesting public static MediaNotificationController getController(int notificationId) {
static MediaNotificationController getController(int notificationId) {
return sControllers.get(notificationId); return sControllers.get(notificationId);
} }
@VisibleForTesting @VisibleForTesting
static boolean hasControllerForTesting(int notificationId) { public static void setControllerForTesting(
return getController(notificationId) != null;
}
@VisibleForTesting
static void setControllerForTesting(
int notificationId, MediaNotificationController controller) { int notificationId, MediaNotificationController controller) {
sControllers.put(notificationId, controller); sControllers.put(notificationId, controller);
} }
......
...@@ -4,13 +4,13 @@ ...@@ -4,13 +4,13 @@
package org.chromium.weblayer_private; package org.chromium.weblayer_private;
import android.annotation.SuppressLint;
import android.app.Service; import android.app.Service;
import android.content.Intent; import android.content.Intent;
import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.media.session.MediaSessionCompat;
import org.chromium.components.browser_ui.media.MediaNotificationController; import org.chromium.components.browser_ui.media.MediaNotificationController;
import org.chromium.components.browser_ui.media.MediaNotificationInfo; import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.components.browser_ui.media.MediaNotificationManager;
import org.chromium.components.browser_ui.media.MediaSessionHelper; import org.chromium.components.browser_ui.media.MediaSessionHelper;
import org.chromium.components.browser_ui.notifications.ForegroundServiceUtils; import org.chromium.components.browser_ui.notifications.ForegroundServiceUtils;
import org.chromium.components.browser_ui.notifications.NotificationMetadata; import org.chromium.components.browser_ui.notifications.NotificationMetadata;
...@@ -24,14 +24,11 @@ import org.chromium.components.browser_ui.notifications.NotificationWrapperBuild ...@@ -24,14 +24,11 @@ import org.chromium.components.browser_ui.notifications.NotificationWrapperBuild
* associated with the notification. * associated with the notification.
*/ */
class MediaSessionManager { class MediaSessionManager {
// This is a singleton because there's only at most one MediaSession active at a time.
@SuppressLint("StaticFieldLeak")
static MediaNotificationController sController;
private static int sNotificationId; private static int sNotificationId;
static void serviceStarted(Service service, Intent intent) { static void serviceStarted(Service service, Intent intent) {
if (sController != null && sController.processIntent(service, intent)) return; MediaNotificationController controller = getController();
if (controller != null && controller.processIntent(service, intent)) return;
// The service has been started with startForegroundService() but the // The service has been started with startForegroundService() but the
// notification hasn't been shown. See similar logic in {@link // notification hasn't been shown. See similar logic in {@link
...@@ -45,8 +42,9 @@ class MediaSessionManager { ...@@ -45,8 +42,9 @@ class MediaSessionManager {
} }
static void serviceDestroyed() { static void serviceDestroyed() {
if (sController != null) sController.onServiceDestroyed(); MediaNotificationController controller = getController();
sController = null; if (controller != null) controller.onServiceDestroyed();
MediaNotificationManager.clear(getNotificationId());
} }
static MediaSessionHelper.Delegate createMediaSessionHelperDelegate(int tabId) { static MediaSessionHelper.Delegate createMediaSessionHelperDelegate(int tabId) {
...@@ -64,29 +62,25 @@ class MediaSessionManager { ...@@ -64,29 +62,25 @@ class MediaSessionManager {
@Override @Override
public MediaNotificationInfo.Builder createMediaNotificationInfoBuilder() { public MediaNotificationInfo.Builder createMediaNotificationInfoBuilder() {
ensureNotificationId();
return new MediaNotificationInfo.Builder().setInstanceId(tabId).setId( return new MediaNotificationInfo.Builder().setInstanceId(tabId).setId(
sNotificationId); getNotificationId());
} }
@Override @Override
public void showMediaNotification(MediaNotificationInfo notificationInfo) { public void showMediaNotification(MediaNotificationInfo notificationInfo) {
assert notificationInfo.id == sNotificationId; assert notificationInfo.id == getNotificationId();
if (sController == null) { MediaNotificationManager.show(notificationInfo,
sController = new MediaNotificationController( () -> { return new WebLayerMediaNotificationControllerDelegate(); });
new WebLayerMediaNotificationControllerDelegate());
}
sController.mThrottler.queueNotification(notificationInfo);
} }
@Override @Override
public void hideMediaNotification() { public void hideMediaNotification() {
if (sController != null) sController.hideNotification(tabId); MediaNotificationManager.hide(tabId, getNotificationId());
} }
@Override @Override
public void activateAndroidMediaSession() { public void activateAndroidMediaSession() {
if (sController != null) sController.activateAndroidMediaSession(tabId); MediaNotificationManager.activateAndroidMediaSession(tabId, getNotificationId());
} }
}; };
} }
...@@ -123,18 +117,21 @@ class MediaSessionManager { ...@@ -123,18 +117,21 @@ class MediaSessionManager {
} }
private static NotificationWrapperBuilder createNotificationWrapperBuilder() { private static NotificationWrapperBuilder createNotificationWrapperBuilder() {
ensureNotificationId();
// Only the null tag will work as expected, because {@link Service#startForeground()} only // Only the null tag will work as expected, because {@link Service#startForeground()} only
// takes an ID and no tag. If we pass a tag here, then the notification that's used to // takes an ID and no tag. If we pass a tag here, then the notification that's used to
// display a paused state (no foreground service) will not be identified as the same one // display a paused state (no foreground service) will not be identified as the same one
// that's used with the foreground service. // that's used with the foreground service.
return WebLayerNotificationWrapperBuilder.create( return WebLayerNotificationWrapperBuilder.create(
WebLayerNotificationChannels.ChannelId.MEDIA_PLAYBACK, WebLayerNotificationChannels.ChannelId.MEDIA_PLAYBACK,
new NotificationMetadata(0, null /*notificationTag*/, sNotificationId)); new NotificationMetadata(0, null /*notificationTag*/, getNotificationId()));
} }
private static void ensureNotificationId() { private static int getNotificationId() {
if (sNotificationId == 0) sNotificationId = WebLayerImpl.getMediaSessionNotificationId(); if (sNotificationId == 0) sNotificationId = WebLayerImpl.getMediaSessionNotificationId();
return sNotificationId;
}
private static MediaNotificationController getController() {
return MediaNotificationManager.getController(getNotificationId());
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment