Index: chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c68e582f7508fc9467d596ea824cec5a5974fd60 |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java |
@@ -0,0 +1,129 @@ |
+// 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.ui; |
+ |
+import org.chromium.base.ApplicationStatus; |
+import org.chromium.base.Log; |
+import org.chromium.chrome.browser.EmptyTabObserver; |
+import org.chromium.chrome.browser.Tab; |
+import org.chromium.chrome.browser.TabObserver; |
+import org.chromium.chrome.browser.UrlUtilities; |
+import org.chromium.content_public.browser.WebContents; |
+import org.chromium.content_public.browser.WebContentsObserver; |
+ |
+import java.net.URI; |
+import java.net.URISyntaxException; |
+ |
+/** |
+ * A tab helper responsible for enabling/disabling media controls and passing |
+ * media actions from the controls to the {@link org.chromium.content.browser.MediaSession} |
+ */ |
+public class MediaSessionTabHelper { |
+ private static final String TAG = "cr.MediaSession"; |
+ |
+ private Tab mTab; |
+ private WebContents mWebContents; |
+ private WebContentsObserver mWebContentsObserver; |
+ |
+ private MediaPlaybackListener mControlsListener = new MediaPlaybackListener() { |
+ @Override |
+ public void onPlay() { |
+ assert mWebContents != null; |
+ mWebContents.resumeMediaSession(); |
+ } |
+ |
+ @Override |
+ public void onPause() { |
+ assert mWebContents != null; |
+ mWebContents.suspendMediaSession(); |
+ } |
+ }; |
+ |
+ private WebContentsObserver createWebContentsObserver(WebContents webContents) { |
+ return new WebContentsObserver(webContents) { |
+ @Override |
+ public void destroy() { |
+ if (mTab == null) { |
+ NotificationMediaPlaybackControls.clear(); |
+ } else { |
+ NotificationMediaPlaybackControls.hide(mTab.getId()); |
+ } |
+ super.destroy(); |
+ } |
+ |
+ @Override |
+ public void mediaSessionStateChanged(boolean isControllable, boolean isPaused) { |
+ assert mTab != null; |
+ if (!isControllable) { |
+ NotificationMediaPlaybackControls.hide(mTab.getId()); |
+ return; |
+ } |
+ String origin = mTab.getUrl(); |
+ try { |
+ origin = UrlUtilities.getOriginForDisplay(new URI(origin), true); |
+ } catch (URISyntaxException e) { |
+ Log.e(TAG, "Unable to parse the origin from the URL. " |
+ + "Showing the full URL instead."); |
+ } |
+ NotificationMediaPlaybackControls.show( |
+ ApplicationStatus.getApplicationContext(), |
+ new MediaInfo( |
+ mTab.getTitle(), |
+ isPaused, |
+ origin, |
+ mTab.getId(), |
+ mControlsListener)); |
+ } |
+ }; |
+ |
+ } |
+ |
+ private void setWebContents(WebContents webContents) { |
+ if (mWebContents == webContents) return; |
+ |
+ cleanupWebContents(); |
+ mWebContents = webContents; |
+ if (mWebContents != null) mWebContentsObserver = createWebContentsObserver(mWebContents); |
+ } |
+ |
+ private void cleanupWebContents() { |
+ if (mWebContentsObserver != null) mWebContentsObserver.destroy(); |
+ mWebContentsObserver = null; |
+ mWebContents = null; |
+ } |
+ |
+ private final TabObserver mTabObserver = new EmptyTabObserver() { |
+ @Override |
+ public void onContentChanged(Tab tab) { |
+ assert tab == mTab; |
+ setWebContents(tab.getWebContents()); |
+ } |
+ |
+ @Override |
+ public void onDestroyed(Tab tab) { |
+ assert mTab == tab; |
+ |
+ cleanupWebContents(); |
+ |
+ NotificationMediaPlaybackControls.hide(mTab.getId()); |
+ mTab.removeObserver(this); |
+ mTab = null; |
+ } |
+ }; |
+ |
+ private MediaSessionTabHelper(Tab tab) { |
+ mTab = tab; |
+ mTab.addObserver(mTabObserver); |
+ if (mTab.getWebContents() != null) setWebContents(tab.getWebContents()); |
+ } |
+ |
+ /** |
+ * Creates the {@link MediaSessionTabHelper} for the given {@link Tab}. |
+ * @param tab the tab to attach the helper to. |
+ */ |
+ public static void createForTab(Tab tab) { |
+ new MediaSessionTabHelper(tab); |
+ } |
+} |