| 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
|
| index 56e26b285f0398969b2b19491324df1a23e8e505..04d3061dbddddf48b5cb4477b99387f510113d4f 100644
|
| --- 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
|
| @@ -5,12 +5,15 @@
|
| package org.chromium.chrome.browser.media.ui;
|
|
|
| import android.app.Activity;
|
| +import android.graphics.Bitmap;
|
| import android.media.AudioManager;
|
| +import android.os.Build;
|
| import android.text.TextUtils;
|
|
|
| import org.chromium.base.ApplicationStatus;
|
| import org.chromium.base.Log;
|
| import org.chromium.chrome.R;
|
| +import org.chromium.chrome.browser.ChromeFeatureList;
|
| import org.chromium.chrome.browser.metrics.MediaSessionUMA;
|
| import org.chromium.chrome.browser.tab.EmptyTabObserver;
|
| import org.chromium.chrome.browser.tab.Tab;
|
| @@ -34,6 +37,8 @@ public class MediaSessionTabHelper {
|
| private static final String UNICODE_PLAY_CHARACTER = "\u25B6";
|
|
|
| private Tab mTab;
|
| + private Bitmap mFavicon = null;
|
| + private String mOrigin = null;
|
| private WebContents mWebContents;
|
| private WebContentsObserver mWebContentsObserver;
|
| private int mPreviousVolumeControlStream = AudioManager.USE_DEFAULT_STREAM_TYPE;
|
| @@ -93,13 +98,6 @@ public class MediaSessionTabHelper {
|
| hideNotification();
|
| return;
|
| }
|
| - String origin = mTab.getUrl();
|
| - try {
|
| - origin = UrlUtilities.formatUrlForSecurityDisplay(new URI(origin), true);
|
| - } catch (URISyntaxException e) {
|
| - Log.e(TAG, "Unable to parse the origin from the URL. "
|
| - + "Showing the full URL instead.");
|
| - }
|
|
|
| mFallbackMetadata = null;
|
|
|
| @@ -113,18 +111,20 @@ public class MediaSessionTabHelper {
|
| metadata = mFallbackMetadata;
|
| }
|
|
|
| - mNotificationInfoBuilder = new MediaNotificationInfo.Builder()
|
| - .setMetadata(metadata)
|
| - .setPaused(isPaused)
|
| - .setOrigin(origin)
|
| - .setTabId(mTab.getId())
|
| - .setPrivate(mTab.isIncognito())
|
| - .setIcon(R.drawable.audio_playing)
|
| - .setActions(MediaNotificationInfo.ACTION_PLAY_PAUSE
|
| - | MediaNotificationInfo.ACTION_SWIPEAWAY)
|
| - .setContentIntent(Tab.createBringTabToFrontIntent(mTab.getId()))
|
| - .setId(R.id.media_playback_notification)
|
| - .setListener(mControlsListener);
|
| + mNotificationInfoBuilder =
|
| + new MediaNotificationInfo.Builder()
|
| + .setMetadata(metadata)
|
| + .setPaused(isPaused)
|
| + .setOrigin(mOrigin)
|
| + .setTabId(mTab.getId())
|
| + .setPrivate(mTab.isIncognito())
|
| + .setIcon(R.drawable.audio_playing)
|
| + .setLargeIcon(mFavicon)
|
| + .setActions(MediaNotificationInfo.ACTION_PLAY_PAUSE
|
| + | MediaNotificationInfo.ACTION_SWIPEAWAY)
|
| + .setContentIntent(Tab.createBringTabToFrontIntent(mTab.getId()))
|
| + .setId(R.id.media_playback_notification)
|
| + .setListener(mControlsListener);
|
|
|
| MediaNotificationManager.show(ApplicationStatus.getApplicationContext(),
|
| mNotificationInfoBuilder.build());
|
| @@ -159,6 +159,46 @@ public class MediaSessionTabHelper {
|
| }
|
|
|
| @Override
|
| + public void onFaviconUpdated(Tab tab, Bitmap icon) {
|
| + assert tab == mTab;
|
| + // Don't update the large icon if using customized notification. Otherwise, the
|
| + // lockscreen art will be the favicon.
|
| + if (!ChromeFeatureList.isEnabled(ChromeFeatureList.MEDIA_STYLE_NOTIFICATION)) return;
|
| +
|
| + if (!updateFavicon(icon)) return;
|
| +
|
| + if (mNotificationInfoBuilder == null) return;
|
| +
|
| + mNotificationInfoBuilder.setLargeIcon(mFavicon);
|
| + MediaNotificationManager.show(
|
| + ApplicationStatus.getApplicationContext(), mNotificationInfoBuilder.build());
|
| + }
|
| +
|
| + @Override
|
| + public void onUrlUpdated(Tab tab) {
|
| + assert tab == mTab;
|
| +
|
| + String origin = mTab.getUrl();
|
| + try {
|
| + origin = UrlUtilities.formatUrlForSecurityDisplay(new URI(origin), true);
|
| + } catch (URISyntaxException e) {
|
| + Log.e(TAG, "Unable to parse the origin from the URL. "
|
| + + "Using the full URL instead.");
|
| + }
|
| +
|
| + if (mOrigin != null && mOrigin.equals(origin)) return;
|
| + mOrigin = origin;
|
| + mFavicon = null;
|
| +
|
| + if (mNotificationInfoBuilder == null) return;
|
| +
|
| + mNotificationInfoBuilder.setOrigin(mOrigin);
|
| + mNotificationInfoBuilder.setLargeIcon(mFavicon);
|
| + MediaNotificationManager.show(
|
| + ApplicationStatus.getApplicationContext(), mNotificationInfoBuilder.build());
|
| + }
|
| +
|
| + @Override
|
| public void onTitleUpdated(Tab tab) {
|
| assert tab == mTab;
|
| if (mNotificationInfoBuilder == null || mFallbackMetadata == null) return;
|
| @@ -240,4 +280,31 @@ public class MediaSessionTabHelper {
|
|
|
| return windowAndroid.getActivity().get();
|
| }
|
| +
|
| + /**
|
| + * Updates the best favicon if the given icon is better.
|
| + * @return whether the best favicon is updated.
|
| + */
|
| + private boolean updateFavicon(Bitmap icon) {
|
| + if (icon == null) return false;
|
| +
|
| + int largeIconSizeInDp = 0;
|
| + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
|
| + largeIconSizeInDp = 128;
|
| + } else {
|
| + // TODO(zqzhang): Get this value via Resource.getDimension() if N has a resource id.
|
| + largeIconSizeInDp = 96;
|
| + }
|
| + int minimalIconSizeInPx = Math.round(largeIconSizeInDp * 0.75f);
|
| +
|
| + if (icon.getWidth() < minimalIconSizeInPx || icon.getHeight() < minimalIconSizeInPx) {
|
| + return false;
|
| + }
|
| + if (mFavicon != null && (icon.getWidth() < mFavicon.getWidth()
|
| + || icon.getHeight() < mFavicon.getHeight())) {
|
| + return false;
|
| + }
|
| + mFavicon = icon;
|
| + return true;
|
| + }
|
| }
|
|
|