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 = [
"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/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/metrics/ActivityTabStartupMetricsTracker.java",
"java/src/org/chromium/chrome/browser/metrics/BackgroundTaskMemoryMetricsEmitter.java",
......
......@@ -10,10 +10,11 @@ import com.google.android.gms.cast.CastDevice;
import com.google.android.gms.cast.MediaStatus;
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.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.components.browser_ui.media.MediaNotificationListener;
import org.chromium.components.browser_ui.media.MediaNotificationManager;
import org.chromium.services.media_session.MediaMetadata;
/** Base controller for updating media notification for Casting and MediaFling. */
......@@ -45,7 +46,7 @@ public abstract class BaseNotificationController
.setListener(this);
updateNotificationMetadata();
MediaNotificationManager.show(mNotificationBuilder.build());
ChromeMediaNotificationManager.show(mNotificationBuilder.build());
}
@Override
......@@ -72,7 +73,7 @@ public abstract class BaseNotificationController
} else {
mNotificationBuilder.setActions(MediaNotificationInfo.ACTION_STOP);
}
MediaNotificationManager.show(mNotificationBuilder.build());
ChromeMediaNotificationManager.show(mNotificationBuilder.build());
}
/** Called when media metadata updated. */
......@@ -80,7 +81,7 @@ public abstract class BaseNotificationController
public void onMetadataUpdated() {
if (mNotificationBuilder == null) return;
updateNotificationMetadata();
MediaNotificationManager.show(mNotificationBuilder.build());
ChromeMediaNotificationManager.show(mNotificationBuilder.build());
}
private void updateNotificationMetadata() {
......
......@@ -25,6 +25,7 @@ import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
import org.chromium.chrome.browser.notifications.NotificationWrapperBuilderFactory;
import org.chromium.chrome.browser.notifications.channels.ChromeChannelDefinitions;
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.NotificationMetadata;
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;
import org.chromium.chrome.browser.ui.favicon.LargeIconBridge;
import org.chromium.components.browser_ui.media.MediaNotificationImageUtils;
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.content_public.browser.WebContents;
......@@ -116,7 +117,7 @@ public class MediaSessionTabHelper implements MediaSessionHelper.Delegate {
@Override
public void showMediaNotification(MediaNotificationInfo notificationInfo) {
MediaNotificationManager.show(notificationInfo);
ChromeMediaNotificationManager.show(notificationInfo);
}
@Override
......
......@@ -27,6 +27,7 @@ import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.test.ChromeActivityTestRule;
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.JavaScriptUtils;
import org.chromium.net.test.EmbeddedTestServer;
......@@ -56,7 +57,7 @@ public class AutoplayMutedNotificationTest {
}
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 {
......
......@@ -30,6 +30,7 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.util.NewTabPageTestUtils;
import org.chromium.chrome.test.util.browser.TabLoadObserver;
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.url_formatter.SchemeDisplay;
import org.chromium.components.url_formatter.UrlFormatter;
......@@ -118,8 +119,7 @@ public class MediaSessionTest {
private void waitForNotificationReady() {
CriteriaHelper.pollInstrumentationThread(() -> {
return MediaNotificationManager.hasControllerForTesting(
R.id.media_playback_notification);
return MediaNotificationManager.getController(R.id.media_playback_notification) != null;
});
}
......
......@@ -39,6 +39,7 @@ import org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerDel
import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
import org.chromium.components.browser_ui.media.MediaNotificationController;
import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.components.browser_ui.media.MediaNotificationManager;
import org.chromium.services.media_session.MediaMetadata;
/**
......
......@@ -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.MediaNotificationInfo;
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.NotificationWrapper;
import org.chromium.media_session.mojom.MediaSessionAction;
......
......@@ -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/MediaNotificationInfo.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/MediaSessionHelper.java",
"java/src/org/chromium/components/browser_ui/media/MediaSessionUma.java",
......
......@@ -2,14 +2,13 @@
// 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;
package org.chromium.components.browser_ui.media;
import android.util.SparseArray;
import androidx.annotation.VisibleForTesting;
import org.chromium.components.browser_ui.media.MediaNotificationController;
import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.base.supplier.Supplier;
/**
* A class that manages the services/notifications for various media types.
......@@ -34,12 +33,14 @@ public class MediaNotificationManager {
* mismatches |mMediaNotificationInfo.isPaused|, it is also no-op.
*
* @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);
if (controller == null) {
controller = new MediaNotificationController(
new ChromeMediaNotificationControllerDelegate(notificationInfo.id));
controller = new MediaNotificationController(delegateFactory.get());
sControllers.put(notificationInfo.id, controller);
}
......@@ -85,18 +86,12 @@ public class MediaNotificationManager {
controller.activateAndroidMediaSession(tabId);
}
@VisibleForTesting
static MediaNotificationController getController(int notificationId) {
public static MediaNotificationController getController(int notificationId) {
return sControllers.get(notificationId);
}
@VisibleForTesting
static boolean hasControllerForTesting(int notificationId) {
return getController(notificationId) != null;
}
@VisibleForTesting
static void setControllerForTesting(
public static void setControllerForTesting(
int notificationId, MediaNotificationController controller) {
sControllers.put(notificationId, controller);
}
......
......@@ -4,13 +4,13 @@
package org.chromium.weblayer_private;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.support.v4.media.session.MediaSessionCompat;
import org.chromium.components.browser_ui.media.MediaNotificationController;
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.notifications.ForegroundServiceUtils;
import org.chromium.components.browser_ui.notifications.NotificationMetadata;
......@@ -24,14 +24,11 @@ import org.chromium.components.browser_ui.notifications.NotificationWrapperBuild
* associated with the notification.
*/
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;
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
// notification hasn't been shown. See similar logic in {@link
......@@ -45,8 +42,9 @@ class MediaSessionManager {
}
static void serviceDestroyed() {
if (sController != null) sController.onServiceDestroyed();
sController = null;
MediaNotificationController controller = getController();
if (controller != null) controller.onServiceDestroyed();
MediaNotificationManager.clear(getNotificationId());
}
static MediaSessionHelper.Delegate createMediaSessionHelperDelegate(int tabId) {
......@@ -64,29 +62,25 @@ class MediaSessionManager {
@Override
public MediaNotificationInfo.Builder createMediaNotificationInfoBuilder() {
ensureNotificationId();
return new MediaNotificationInfo.Builder().setInstanceId(tabId).setId(
sNotificationId);
getNotificationId());
}
@Override
public void showMediaNotification(MediaNotificationInfo notificationInfo) {
assert notificationInfo.id == sNotificationId;
if (sController == null) {
sController = new MediaNotificationController(
new WebLayerMediaNotificationControllerDelegate());
}
sController.mThrottler.queueNotification(notificationInfo);
assert notificationInfo.id == getNotificationId();
MediaNotificationManager.show(notificationInfo,
() -> { return new WebLayerMediaNotificationControllerDelegate(); });
}
@Override
public void hideMediaNotification() {
if (sController != null) sController.hideNotification(tabId);
MediaNotificationManager.hide(tabId, getNotificationId());
}
@Override
public void activateAndroidMediaSession() {
if (sController != null) sController.activateAndroidMediaSession(tabId);
MediaNotificationManager.activateAndroidMediaSession(tabId, getNotificationId());
}
};
}
......@@ -123,18 +117,21 @@ class MediaSessionManager {
}
private static NotificationWrapperBuilder createNotificationWrapperBuilder() {
ensureNotificationId();
// 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
// display a paused state (no foreground service) will not be identified as the same one
// that's used with the foreground service.
return WebLayerNotificationWrapperBuilder.create(
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();
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