diff options
Diffstat (limited to 'car-broadcastradio-support/src/com')
6 files changed, 96 insertions, 78 deletions
diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.java index af57c90..21f3cdf 100644 --- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.java +++ b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/Program.java @@ -16,14 +16,15 @@ package com.android.car.broadcastradio.support; -import android.annotation.NonNull; -import android.annotation.Nullable; import android.graphics.Bitmap; import android.hardware.radio.ProgramSelector; import android.hardware.radio.RadioManager.ProgramInfo; import android.os.Parcel; import android.os.Parcelable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import com.android.car.broadcastradio.support.platform.ProgramInfoExt; import java.util.Objects; diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/media/BrowseTree.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/media/BrowseTree.java index 39d23dc..4d6624b 100644 --- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/media/BrowseTree.java +++ b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/media/BrowseTree.java @@ -16,23 +16,24 @@ package com.android.car.broadcastradio.support.media; -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.annotation.StringRes; import android.graphics.Bitmap; import android.hardware.radio.ProgramList; import android.hardware.radio.ProgramSelector; import android.hardware.radio.RadioManager; import android.hardware.radio.RadioManager.BandDescriptor; import android.hardware.radio.RadioMetadata; -import android.media.MediaDescription; -import android.media.browse.MediaBrowser.MediaItem; import android.os.Bundle; -import android.service.media.MediaBrowserService; -import android.service.media.MediaBrowserService.BrowserRoot; -import android.service.media.MediaBrowserService.Result; +import android.support.v4.media.MediaBrowserCompat.MediaItem; +import android.support.v4.media.MediaDescriptionCompat; import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.media.MediaBrowserServiceCompat; +import androidx.media.MediaBrowserServiceCompat.BrowserRoot; +import androidx.media.MediaBrowserServiceCompat.Result; + import com.android.car.broadcastradio.support.Program; import com.android.car.broadcastradio.support.R; import com.android.car.broadcastradio.support.platform.ImageResolver; @@ -133,7 +134,7 @@ public class BrowseTree { private final BrowserRoot mRoot = new BrowserRoot(NODE_ROOT, null); private final Object mLock = new Object(); - private final @NonNull MediaBrowserService mBrowserService; + private final @NonNull MediaBrowserServiceCompat mBrowserService; private final @Nullable ImageResolver mImageResolver; private List<MediaItem> mRootChildren; @@ -155,7 +156,7 @@ public class BrowseTree { @Nullable Set<Program> mFavorites; @Nullable private List<MediaItem> mFavoritesCache; - public BrowseTree(@NonNull MediaBrowserService browserService, + public BrowseTree(@NonNull MediaBrowserServiceCompat browserService, @Nullable ImageResolver imageResolver) { mBrowserService = Objects.requireNonNull(browserService); mImageResolver = imageResolver; @@ -165,9 +166,10 @@ public class BrowseTree { return mRoot; } - private static MediaItem createChild(MediaDescription.Builder descBuilder, - String mediaId, String title, ProgramSelector sel, Bitmap icon) { - MediaDescription desc = descBuilder + private static MediaItem createChild( + MediaDescriptionCompat.Builder descBuilder, String mediaId, String title, + ProgramSelector sel, Bitmap icon) { + MediaDescriptionCompat desc = descBuilder .setMediaId(mediaId) .setMediaUri(ProgramSelectorExt.toUri(sel)) .setTitle(title) @@ -176,13 +178,13 @@ public class BrowseTree { return new MediaItem(desc, MediaItem.FLAG_PLAYABLE); } - private static MediaItem createFolder(MediaDescription.Builder descBuilder, String mediaId, - String title, boolean isBrowseable, boolean isPlayable, long folderType, - Bundle extras) { + private static MediaItem createFolder( + MediaDescriptionCompat.Builder descBuilder, String mediaId, String title, + boolean isBrowseable, boolean isPlayable, long folderType, Bundle extras) { if (extras == null) extras = new Bundle(); extras.putLong(EXTRA_BCRADIO_FOLDER_TYPE, folderType); - MediaDescription desc = descBuilder + MediaDescriptionCompat desc = descBuilder .setMediaId(mediaId).setTitle(title).setExtras(extras).build(); int flags = 0; @@ -273,7 +275,7 @@ public class BrowseTree { if (mProgramListCache != null) return mProgramListCache; mProgramListCache = new ArrayList<>(); - MediaDescription.Builder dbld = new MediaDescription.Builder(); + MediaDescriptionCompat.Builder dbld = new MediaDescriptionCompat.Builder(); for (RadioManager.ProgramInfo program : mProgramListSnapshot) { ProgramSelector sel = program.getSelector(); @@ -330,7 +332,7 @@ public class BrowseTree { if (mFavoritesCache != null) return mFavoritesCache; mFavoritesCache = new ArrayList<>(); - MediaDescription.Builder dbld = new MediaDescription.Builder(); + MediaDescriptionCompat.Builder dbld = new MediaDescriptionCompat.Builder(); for (Program fav : mFavorites) { ProgramSelector sel = fav.getSelector(); @@ -348,7 +350,7 @@ public class BrowseTree { if (mRootChildren != null) return mRootChildren; mRootChildren = new ArrayList<>(); - MediaDescription.Builder dbld = new MediaDescription.Builder(); + MediaDescriptionCompat.Builder dbld = new MediaDescriptionCompat.Builder(); if (mProgramList != null) { mRootChildren.add(createFolder(dbld, NODE_PROGRAMS, mBrowserService.getString(R.string.program_list_text), @@ -409,7 +411,7 @@ public class BrowseTree { if (isEmpty()) return null; Bundle extras = new Bundle(); extras.putString(EXTRA_BCRADIO_BAND_NAME_EN, mBandNameEn); - return createFolder(new MediaDescription.Builder(), mMediaId, + return createFolder(new MediaDescriptionCompat.Builder(), mMediaId, mBrowserService.getString(mBandName), true, true, BCRADIO_FOLDER_TYPE_BAND, extras); } @@ -420,7 +422,7 @@ public class BrowseTree { if (isEmpty()) return null; mChannels = new ArrayList<>(); - MediaDescription.Builder dbld = new MediaDescription.Builder(); + MediaDescriptionCompat.Builder dbld = new MediaDescriptionCompat.Builder(); for (BandDescriptor band : mBands) { final int lowerLimit = band.getLowerLimit(); diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ImageResolver.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ImageResolver.java index 5538a58..fd14045 100644 --- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ImageResolver.java +++ b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ImageResolver.java @@ -16,9 +16,10 @@ package com.android.car.broadcastradio.support.platform; -import android.annotation.Nullable; import android.graphics.Bitmap; +import androidx.annotation.Nullable; + /** * Resolves metadata images. */ diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java index c96521a..a48dec2 100644 --- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java +++ b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramInfoExt.java @@ -16,18 +16,20 @@ package com.android.car.broadcastradio.support.platform; -import android.annotation.IntDef; -import android.annotation.NonNull; -import android.annotation.Nullable; import android.graphics.Bitmap; import android.hardware.radio.ProgramSelector; import android.hardware.radio.RadioManager; import android.hardware.radio.RadioManager.ProgramInfo; import android.hardware.radio.RadioMetadata; -import android.media.MediaMetadata; -import android.media.Rating; +import android.support.v4.media.MediaMetadataCompat; +import android.support.v4.media.RatingCompat; +import android.support.v4.media.session.MediaSessionCompat; import android.util.Log; +import androidx.annotation.IntDef; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Comparator; @@ -50,9 +52,9 @@ public class ProgramInfoExt { /** * Flags to control how to fetch program name with {@link #getProgramName}. * - * Lower 16 bits are reserved for {@link ProgramSelectorExt#NameFlag}. + * Lower 16 bits are reserved for {@link ProgramSelectorExt.NameFlag}. */ - @IntDef(prefix = { "NAME_" }, flag = true, value = { + @IntDef(flag = true, value = { ProgramSelectorExt.NAME_NO_MODULATION, ProgramSelectorExt.NAME_MODULATION_ONLY, NAME_NO_CHANNEL_FALLBACK, @@ -128,7 +130,7 @@ public class ProgramInfoExt { } /** - * Proposed reimplementation of {@link RadioManager#ProgramInfo#getMetadata}. + * Proposed reimplementation of {@link RadioManager.ProgramInfo#getMetadata}. * * As opposed to the original implementation, it never returns null. */ @@ -142,35 +144,35 @@ public class ProgramInfoExt { } /** - * Converts {@link ProgramInfo} to {@link MediaMetadata} for displaying. + * Converts {@link ProgramInfo} to {@link MediaMetadataCompat} for displaying. * * <p>This method is meant to be used for displaying the currently playing station in - * {@link MediaSession}, only a subset of keys populated in {@link ProgramInfo#toMediaMetadata} + * {@link MediaSessionCompat}, only a subset of keys populated in {@link #toMediaMetadata} * will be populated in this method. * * <ul> - * The following keys will be populated in the {@link MediaMetadata}: - * <li>{@link MediaMetadata#METADATA_KEY_DISPLAY_TITLE}</li> - * <li>{@link MediaMetadata#METADATA_KEY_DISPLAY_SUBTITLE}</li> - * <li>{@link MediaMetadata#METADATA_KEY_ALBUM_ART}</li> - * <li>{@link MediaMetadata#METADATA_KEY_USER_RATING}</li> + * The following keys will be populated in the {@link MediaMetadataCompat}: + * <li>{@link MediaMetadataCompat#METADATA_KEY_DISPLAY_TITLE}</li> + * <li>{@link MediaMetadataCompat#METADATA_KEY_DISPLAY_SUBTITLE}</li> + * <li>{@link MediaMetadataCompat#METADATA_KEY_ALBUM_ART}</li> + * <li>{@link MediaMetadataCompat#METADATA_KEY_USER_RATING}</li> * <ul/> * * @param info {@link ProgramInfo} to convert * @param isFavorite {@code true}, if a given program is a favorite * @param imageResolver metadata images resolver/cache * @param programNameOrder order of keys to look for program name in {@link ProgramInfo} - * @return {@link MediaMetadata} object + * @return {@link MediaMetadataCompat} object */ @NonNull - public static MediaMetadata toMediaDisplayMetadata(@NonNull ProgramInfo info, + public static MediaMetadataCompat toMediaDisplayMetadata(@NonNull ProgramInfo info, boolean isFavorite, @NonNull ImageResolver imageResolver, @NonNull String[] programNameOrder) { Objects.requireNonNull(info, "info can not be null."); Objects.requireNonNull(imageResolver, "imageResolver can not be null."); Objects.requireNonNull(programNameOrder, "programNameOrder can not be null."); - MediaMetadata.Builder bld = new MediaMetadata.Builder(); + MediaMetadataCompat.Builder bld = new MediaMetadataCompat.Builder(); ProgramSelector selector; ProgramSelector.Identifier logicallyTunedTo = info.getLogicallyTunedTo(); @@ -181,58 +183,60 @@ public class ProgramInfoExt { selector = info.getSelector(); } String displayTitle = ProgramSelectorExt.getDisplayName(selector, info.getChannel()); - bld.putString(MediaMetadata.METADATA_KEY_DISPLAY_TITLE, displayTitle); + bld.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, displayTitle); String subtitle = getProgramName(info, /* flags= */ 0, programNameOrder); - bld.putString(MediaMetadata.METADATA_KEY_DISPLAY_SUBTITLE, subtitle); + bld.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, subtitle); Bitmap bm = resolveAlbumArtBitmap(info.getMetadata(), imageResolver); - if (bm != null) bld.putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, bm); + if (bm != null) bld.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bm); - bld.putRating(MediaMetadata.METADATA_KEY_USER_RATING, Rating.newHeartRating(isFavorite)); + bld.putRating(MediaMetadataCompat.METADATA_KEY_USER_RATING, + RatingCompat.newHeartRating(isFavorite)); return bld.build(); } /** - * Converts {@link ProgramInfo} to {@link MediaMetadata}. + * Converts {@link ProgramInfo} to {@link MediaMetadataCompat}. * - * <p>This method is meant to be used for currently playing station in {@link MediaSession}. + * <p>This method is meant to be used for currently playing station in + * {@link MediaSessionCompat}. * * <ul> - * The following keys will be populated in the {@link MediaMetadata}: - * <li>{@link MediaMetadata#METADATA_KEY_DISPLAY_TITLE}</li> - * <li>{@link MediaMetadata#METADATA_KEY_TITLE}</li> - * <li>{@link MediaMetadata#METADATA_KEY_ARTIST}</li> - * <li>{@link MediaMetadata#METADATA_KEY_ALBUM}</li> - * <li>{@link MediaMetadata#METADATA_KEY_DISPLAY_SUBTITLE}</li> - * <li>{@link MediaMetadata#METADATA_KEY_ALBUM_ART}</li> - * <li>{@link MediaMetadata#METADATA_KEY_USER_RATING}</li> + * The following keys will be populated in the {@link MediaMetadataCompat}: + * <li>{@link MediaMetadataCompat#METADATA_KEY_DISPLAY_TITLE}</li> + * <li>{@link MediaMetadataCompat#METADATA_KEY_TITLE}</li> + * <li>{@link MediaMetadataCompat#METADATA_KEY_ARTIST}</li> + * <li>{@link MediaMetadataCompat#METADATA_KEY_ALBUM}</li> + * <li>{@link MediaMetadataCompat#METADATA_KEY_DISPLAY_SUBTITLE}</li> + * <li>{@link MediaMetadataCompat#METADATA_KEY_ALBUM_ART}</li> + * <li>{@link MediaMetadataCompat#METADATA_KEY_USER_RATING}</li> * <ul/> * * @param info {@link ProgramInfo} to convert * @param isFavorite {@code true}, if a given program is a favorite * @param imageResolver metadata images resolver/cache - * @return {@link MediaMetadata} object + * @return {@link MediaMetadataCompat} object */ - public static @NonNull MediaMetadata toMediaMetadata(@NonNull ProgramInfo info, + public static @NonNull MediaMetadataCompat toMediaMetadata(@NonNull ProgramInfo info, boolean isFavorite, @Nullable ImageResolver imageResolver) { - MediaMetadata.Builder bld = new MediaMetadata.Builder(); + MediaMetadataCompat.Builder bld = new MediaMetadataCompat.Builder(); - bld.putString(MediaMetadata.METADATA_KEY_DISPLAY_TITLE, getProgramName(info, 0)); + bld.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, getProgramName(info, 0)); RadioMetadata meta = info.getMetadata(); if (meta != null) { String title = meta.getString(RadioMetadata.METADATA_KEY_TITLE); if (title != null) { - bld.putString(MediaMetadata.METADATA_KEY_TITLE, title); + bld.putString(MediaMetadataCompat.METADATA_KEY_TITLE, title); } String artist = meta.getString(RadioMetadata.METADATA_KEY_ARTIST); if (artist != null) { - bld.putString(MediaMetadata.METADATA_KEY_ARTIST, artist); + bld.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, artist); } String album = meta.getString(RadioMetadata.METADATA_KEY_ALBUM); if (album != null) { - bld.putString(MediaMetadata.METADATA_KEY_ALBUM, album); + bld.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, album); } if (title != null || artist != null) { String subtitle; @@ -243,14 +247,15 @@ public class ProgramInfoExt { } else { subtitle = title + TITLE_SEPARATOR + artist; } - bld.putString(MediaMetadata.METADATA_KEY_DISPLAY_SUBTITLE, subtitle); + bld.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, subtitle); } Bitmap bm = resolveAlbumArtBitmap(meta, imageResolver); - if (bm != null) bld.putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, bm); + if (bm != null) bld.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bm); } - bld.putRating(MediaMetadata.METADATA_KEY_USER_RATING, Rating.newHeartRating(isFavorite)); + bld.putRating(MediaMetadataCompat.METADATA_KEY_USER_RATING, + RatingCompat.newHeartRating(isFavorite)); return bld.build(); } diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java index 555176d..c0a4390 100644 --- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java +++ b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/ProgramSelectorExt.java @@ -16,15 +16,16 @@ package com.android.car.broadcastradio.support.platform; -import android.annotation.IntDef; -import android.annotation.NonNull; -import android.annotation.Nullable; import android.hardware.radio.ProgramSelector; import android.hardware.radio.ProgramSelector.Identifier; import android.hardware.radio.RadioManager; import android.net.Uri; import android.util.Log; +import androidx.annotation.IntDef; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.text.DecimalFormat; @@ -73,9 +74,9 @@ public class ProgramSelectorExt { /** * Flags to control how channel values are converted to string with {@link #getDisplayName}. * - * Upper 16 bits are reserved for {@link ProgramInfoExt#NameFlag}. + * Upper 16 bits are reserved for {@link ProgramInfoExt.NameFlag}. */ - @IntDef(prefix = { "NAME_" }, flag = true, value = { + @IntDef(flag = true, value = { NAME_NO_MODULATION, NAME_MODULATION_ONLY, }) @@ -113,7 +114,7 @@ public class ProgramSelectorExt { } // when pushed to the framework, remove similar code from HAL 2.0 service - private static @ProgramSelector.ProgramType int identifierToProgramType( + private static int identifierToProgramType( @NonNull Identifier primaryId) { int idType = primaryId.getType(); switch (idType) { @@ -230,8 +231,7 @@ public class ProgramSelectorExt { * @param type identifier type to check for * @return true, if sel contains any identifier of a given type */ - public static boolean hasId(@NonNull ProgramSelector sel, - @ProgramSelector.IdentifierType int type) { + public static boolean hasId(@NonNull ProgramSelector sel, int type) { try { sel.getFirstId(type); return true; @@ -533,7 +533,7 @@ public class ProgramSelectorExt { } public long getStationId() { - return mValue & 0xFFFFFFFF; + return mValue & 0xFFFFFFFFL; } public int getSubchannel() { diff --git a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/RadioMetadataExt.java b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/RadioMetadataExt.java index e7b6f3b..4192e83 100644 --- a/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/RadioMetadataExt.java +++ b/car-broadcastradio-support/src/com/android/car/broadcastradio/support/platform/RadioMetadataExt.java @@ -16,9 +16,13 @@ package com.android.car.broadcastradio.support.platform; -import android.annotation.NonNull; +import static android.hardware.radio.RadioMetadata.METADATA_KEY_ART; +import static android.hardware.radio.RadioMetadata.METADATA_KEY_ICON; + import android.hardware.radio.RadioMetadata; +import androidx.annotation.NonNull; + /** * Proposed extensions to android.hardware.radio.RadioMetadata. * @@ -43,7 +47,7 @@ public class RadioMetadataExt { * deprecation here and jump straight to the correct solution. */ public static long getGlobalBitmapId(@NonNull RadioMetadata meta, @NonNull String key) { - int localId = meta.getBitmapId(key); + int localId = getBitmapId(meta, key); if (localId == 0) return 0; /* When generating global bitmap ID, we want them to remain stable between sessions @@ -57,4 +61,9 @@ public class RadioMetadataExt { */ return ((long) sModuleId << 32) | localId; } + + private static int getBitmapId(@NonNull RadioMetadata meta, @NonNull String key) { + if (!METADATA_KEY_ICON.equals(key) && !METADATA_KEY_ART.equals(key)) return 0; + return meta.getInt(key); + } } |