diff options
Diffstat (limited to 'TestMediaApp')
13 files changed, 227 insertions, 63 deletions
diff --git a/TestMediaApp/AndroidManifest.xml b/TestMediaApp/AndroidManifest.xml index 09e850c..911145e 100644 --- a/TestMediaApp/AndroidManifest.xml +++ b/TestMediaApp/AndroidManifest.xml @@ -28,10 +28,11 @@ android:supportsRtl="true" android:theme="@style/TestMediaAppTheme" > + <!-- This provider is read-only, only returns album art, and is not a security risk --> <provider - android:name=".TmaAssetProvider" + android:name=".TmaPublicProvider" android:exported="true" - android:authorities="com.android.car.media.testmediaapp.assets"/> + android:authorities="com.android.car.media.testmediaapp.public"/> <service android:name=".TmaBrowser" diff --git a/TestMediaApp/assets/media_items/album_art/art_nodes.json b/TestMediaApp/assets/media_items/album_art/art_nodes.json index 434ed23..974268b 100644 --- a/TestMediaApp/assets/media_items/album_art/art_nodes.json +++ b/TestMediaApp/assets/media_items/album_art/art_nodes.json @@ -52,6 +52,15 @@ "DISPLAY_TITLE": "Nature 1024" }, "INCLUDE":"media_items/album_art/nature/art_nature_1024.json" + }, + { + "FLAGS": "browsable", + "PLAYABLE_HINT": "GRID", + "METADATA": { + "MEDIA_ID": "album_art/art_nodes nature files", + "DISPLAY_TITLE": "Nature files" + }, + "INCLUDE":"media_items/album_art/nature/art_nature_files.json" } ] }
\ No newline at end of file diff --git a/TestMediaApp/assets/media_items/album_art/nature/art_nature_1024.json b/TestMediaApp/assets/media_items/album_art/nature/art_nature_1024.json index b1759f2..c34ed80 100644 --- a/TestMediaApp/assets/media_items/album_art/nature/art_nature_1024.json +++ b/TestMediaApp/assets/media_items/album_art/nature/art_nature_1024.json @@ -13,7 +13,7 @@ "MEDIA_ID": "art_nature_1024_leaves bee", "DISPLAY_TITLE": "Bee", "DURATION": 10000, - "ART_URI": "bitmaps/nature-1024/bee.jpg" + "ART_URI": "assets/bitmaps/nature-1024/bee.jpg" } }, { @@ -22,7 +22,7 @@ "MEDIA_ID": "art_nature_1024_leaves clouds", "DISPLAY_TITLE": "Clouds", "DURATION": 10000, - "ART_URI": "bitmaps/nature-1024/clouds.jpg" + "ART_URI": "assets/bitmaps/nature-1024/clouds.jpg" } }, { @@ -31,7 +31,7 @@ "MEDIA_ID": "art_nature_1024_leaves flower1", "DISPLAY_TITLE": "Flower 1", "DURATION": 10000, - "ART_URI": "bitmaps/nature-1024/flower1.jpg" + "ART_URI": "assets/bitmaps/nature-1024/flower1.jpg" } }, { @@ -40,7 +40,7 @@ "MEDIA_ID": "art_nature_1024_leaves flower2", "DISPLAY_TITLE": "Flower 2", "DURATION": 10000, - "ART_URI": "bitmaps/nature-1024/flower2.jpg" + "ART_URI": "assets/bitmaps/nature-1024/flower2.jpg" } }, { @@ -49,7 +49,7 @@ "MEDIA_ID": "art_nature_1024_leaves flower3", "DISPLAY_TITLE": "Flower3 ", "DURATION": 10000, - "ART_URI": "bitmaps/nature-1024/flower3.jpg" + "ART_URI": "assets/bitmaps/nature-1024/flower3.jpg" } }, { @@ -58,7 +58,7 @@ "MEDIA_ID": "art_nature_1024_leaves flowers", "DISPLAY_TITLE": "Flowers", "DURATION": 10000, - "ART_URI": "bitmaps/nature-1024/flowers.jpg" + "ART_URI": "assets/bitmaps/nature-1024/flowers.jpg" } }, { @@ -67,7 +67,7 @@ "MEDIA_ID": "art_nature_1024_leaves leaves", "DISPLAY_TITLE": "Leaves", "DURATION": 10000, - "ART_URI": "bitmaps/nature-1024/leaves.jpg" + "ART_URI": "assets/bitmaps/nature-1024/leaves.jpg" } }, { @@ -76,7 +76,7 @@ "MEDIA_ID": "art_nature_1024_leaves sage", "DISPLAY_TITLE": "Sage", "DURATION": 10000, - "ART_URI": "bitmaps/nature-1024/sage.jpg" + "ART_URI": "assets/bitmaps/nature-1024/sage.jpg" } }, { @@ -85,7 +85,7 @@ "MEDIA_ID": "art_nature_1024_leaves tree", "DISPLAY_TITLE": "Tree", "DURATION": 10000, - "ART_URI": "bitmaps/nature-1024/tree.jpg" + "ART_URI": "assets/bitmaps/nature-1024/tree.jpg" } } ] diff --git a/TestMediaApp/assets/media_items/album_art/nature/art_nature_128.json b/TestMediaApp/assets/media_items/album_art/nature/art_nature_128.json index 0fdd629..67200e8 100644 --- a/TestMediaApp/assets/media_items/album_art/nature/art_nature_128.json +++ b/TestMediaApp/assets/media_items/album_art/nature/art_nature_128.json @@ -13,7 +13,7 @@ "MEDIA_ID": "art_nature_128 bee", "DISPLAY_TITLE": "Bee", "DURATION": 10000, - "ART_URI": "bitmaps/nature-128/bee.jpg" + "ART_URI": "assets/bitmaps/nature-128/bee.jpg" } }, { @@ -22,7 +22,7 @@ "MEDIA_ID": "art_nature_128 clouds", "DISPLAY_TITLE": "Clouds", "DURATION": 10000, - "ART_URI": "bitmaps/nature-128/clouds.jpg" + "ART_URI": "assets/bitmaps/nature-128/clouds.jpg" } }, { @@ -31,7 +31,7 @@ "MEDIA_ID": "art_nature_128 flower1", "DISPLAY_TITLE": "Flower 1", "DURATION": 10000, - "ART_URI": "bitmaps/nature-128/flower1.jpg" + "ART_URI": "assets/bitmaps/nature-128/flower1.jpg" } }, { @@ -40,7 +40,7 @@ "MEDIA_ID": "art_nature_128 flower2", "DISPLAY_TITLE": "Flower 2", "DURATION": 10000, - "ART_URI": "bitmaps/nature-128/flower2.jpg" + "ART_URI": "assets/bitmaps/nature-128/flower2.jpg" } }, { @@ -49,7 +49,7 @@ "MEDIA_ID": "art_nature_128 flower3", "DISPLAY_TITLE": "Flower3 ", "DURATION": 10000, - "ART_URI": "bitmaps/nature-128/flower3.jpg" + "ART_URI": "assets/bitmaps/nature-128/flower3.jpg" } }, { @@ -58,7 +58,7 @@ "MEDIA_ID": "art_nature_128 flowers", "DISPLAY_TITLE": "Flowers", "DURATION": 10000, - "ART_URI": "bitmaps/nature-128/flowers.jpg" + "ART_URI": "assets/bitmaps/nature-128/flowers.jpg" } }, { @@ -67,7 +67,7 @@ "MEDIA_ID": "art_nature_128 leaves", "DISPLAY_TITLE": "Leaves", "DURATION": 10000, - "ART_URI": "bitmaps/nature-128/leaves.jpg" + "ART_URI": "assets/bitmaps/nature-128/leaves.jpg" } }, { @@ -76,7 +76,7 @@ "MEDIA_ID": "art_nature_128 sage", "DISPLAY_TITLE": "Sage", "DURATION": 10000, - "ART_URI": "bitmaps/nature-128/sage.jpg" + "ART_URI": "assets/bitmaps/nature-128/sage.jpg" } }, { @@ -85,7 +85,7 @@ "MEDIA_ID": "art_nature_128 tree", "DISPLAY_TITLE": "Tree", "DURATION": 10000, - "ART_URI": "bitmaps/nature-128/tree.jpg" + "ART_URI": "assets/bitmaps/nature-128/tree.jpg" } } ] diff --git a/TestMediaApp/assets/media_items/album_art/nature/art_nature_256.json b/TestMediaApp/assets/media_items/album_art/nature/art_nature_256.json index 200ecc1..719665e 100644 --- a/TestMediaApp/assets/media_items/album_art/nature/art_nature_256.json +++ b/TestMediaApp/assets/media_items/album_art/nature/art_nature_256.json @@ -13,7 +13,7 @@ "MEDIA_ID": "art_nature_256 bee", "DISPLAY_TITLE": "Bee", "DURATION": 10000, - "ART_URI": "bitmaps/nature-256/bee.jpg" + "ART_URI": "assets/bitmaps/nature-256/bee.jpg" } }, { @@ -22,7 +22,7 @@ "MEDIA_ID": "art_nature_256 clouds", "DISPLAY_TITLE": "Clouds", "DURATION": 10000, - "ART_URI": "bitmaps/nature-256/clouds.jpg" + "ART_URI": "assets/bitmaps/nature-256/clouds.jpg" } }, { @@ -31,7 +31,7 @@ "MEDIA_ID": "art_nature_256 flower1", "DISPLAY_TITLE": "Flower 1", "DURATION": 10000, - "ART_URI": "bitmaps/nature-256/flower1.jpg" + "ART_URI": "assets/bitmaps/nature-256/flower1.jpg" } }, { @@ -40,7 +40,7 @@ "MEDIA_ID": "art_nature_256 flower2", "DISPLAY_TITLE": "Flower 2", "DURATION": 10000, - "ART_URI": "bitmaps/nature-256/flower2.jpg" + "ART_URI": "assets/bitmaps/nature-256/flower2.jpg" } }, { @@ -49,7 +49,7 @@ "MEDIA_ID": "art_nature_256 flower3", "DISPLAY_TITLE": "Flower3 ", "DURATION": 10000, - "ART_URI": "bitmaps/nature-256/flower3.jpg" + "ART_URI": "assets/bitmaps/nature-256/flower3.jpg" } }, { @@ -58,7 +58,7 @@ "MEDIA_ID": "art_nature_256 flowers", "DISPLAY_TITLE": "Flowers", "DURATION": 10000, - "ART_URI": "bitmaps/nature-256/flowers.jpg" + "ART_URI": "assets/bitmaps/nature-256/flowers.jpg" } }, { @@ -67,7 +67,7 @@ "MEDIA_ID": "art_nature_256 leaves", "DISPLAY_TITLE": "Leaves", "DURATION": 10000, - "ART_URI": "bitmaps/nature-256/leaves.jpg" + "ART_URI": "assets/bitmaps/nature-256/leaves.jpg" } }, { @@ -76,7 +76,7 @@ "MEDIA_ID": "art_nature_256 sage", "DISPLAY_TITLE": "Sage", "DURATION": 10000, - "ART_URI": "bitmaps/nature-256/sage.jpg" + "ART_URI": "assets/bitmaps/nature-256/sage.jpg" } }, { @@ -85,7 +85,7 @@ "MEDIA_ID": "art_nature_256 tree", "DISPLAY_TITLE": "Tree", "DURATION": 10000, - "ART_URI": "bitmaps/nature-256/tree.jpg" + "ART_URI": "assets/bitmaps/nature-256/tree.jpg" } } ] diff --git a/TestMediaApp/assets/media_items/album_art/nature/art_nature_512.json b/TestMediaApp/assets/media_items/album_art/nature/art_nature_512.json index 56bb6a4..29cb783 100644 --- a/TestMediaApp/assets/media_items/album_art/nature/art_nature_512.json +++ b/TestMediaApp/assets/media_items/album_art/nature/art_nature_512.json @@ -13,7 +13,7 @@ "MEDIA_ID": "art_nature_512 bee", "DISPLAY_TITLE": "Bee", "DURATION": 10000, - "ART_URI": "bitmaps/nature-512/bee.jpg" + "ART_URI": "assets/bitmaps/nature-512/bee.jpg" } }, { @@ -22,7 +22,7 @@ "MEDIA_ID": "art_nature_512 clouds", "DISPLAY_TITLE": "Clouds", "DURATION": 10000, - "ART_URI": "bitmaps/nature-512/clouds.jpg" + "ART_URI": "assets/bitmaps/nature-512/clouds.jpg" } }, { @@ -31,7 +31,7 @@ "MEDIA_ID": "art_nature_512 flower1", "DISPLAY_TITLE": "Flower 1", "DURATION": 10000, - "ART_URI": "bitmaps/nature-512/flower1.jpg" + "ART_URI": "assets/bitmaps/nature-512/flower1.jpg" } }, { @@ -40,7 +40,7 @@ "MEDIA_ID": "art_nature_512 flower2", "DISPLAY_TITLE": "Flower 2", "DURATION": 10000, - "ART_URI": "bitmaps/nature-512/flower2.jpg" + "ART_URI": "assets/bitmaps/nature-512/flower2.jpg" } }, { @@ -49,7 +49,7 @@ "MEDIA_ID": "art_nature_512 flower3", "DISPLAY_TITLE": "Flower3 ", "DURATION": 10000, - "ART_URI": "bitmaps/nature-512/flower3.jpg" + "ART_URI": "assets/bitmaps/nature-512/flower3.jpg" } }, { @@ -58,7 +58,7 @@ "MEDIA_ID": "art_nature_512 flowers", "DISPLAY_TITLE": "Flowers", "DURATION": 10000, - "ART_URI": "bitmaps/nature-512/flowers.jpg" + "ART_URI": "assets/bitmaps/nature-512/flowers.jpg" } }, { @@ -67,7 +67,7 @@ "MEDIA_ID": "art_nature_512 leaves", "DISPLAY_TITLE": "Leaves", "DURATION": 10000, - "ART_URI": "bitmaps/nature-512/leaves.jpg" + "ART_URI": "assets/bitmaps/nature-512/leaves.jpg" } }, { @@ -76,7 +76,7 @@ "MEDIA_ID": "art_nature_512 sage", "DISPLAY_TITLE": "Sage", "DURATION": 10000, - "ART_URI": "bitmaps/nature-512/sage.jpg" + "ART_URI": "assets/bitmaps/nature-512/sage.jpg" } }, { @@ -85,7 +85,7 @@ "MEDIA_ID": "art_nature_512 tree", "DISPLAY_TITLE": "Tree", "DURATION": 10000, - "ART_URI": "bitmaps/nature-512/tree.jpg" + "ART_URI": "assets/bitmaps/nature-512/tree.jpg" } } ] diff --git a/TestMediaApp/assets/media_items/album_art/nature/art_nature_64.json b/TestMediaApp/assets/media_items/album_art/nature/art_nature_64.json index 913dd07..72a3f41 100644 --- a/TestMediaApp/assets/media_items/album_art/nature/art_nature_64.json +++ b/TestMediaApp/assets/media_items/album_art/nature/art_nature_64.json @@ -13,7 +13,7 @@ "MEDIA_ID": "art_nature_64 bee", "DISPLAY_TITLE": "Bee", "DURATION": 10000, - "ART_URI": "bitmaps/nature-64/bee.jpg" + "ART_URI": "assets/bitmaps/nature-64/bee.jpg" } }, { @@ -22,7 +22,7 @@ "MEDIA_ID": "art_nature_64 clouds", "DISPLAY_TITLE": "Clouds", "DURATION": 10000, - "ART_URI": "bitmaps/nature-64/clouds.jpg" + "ART_URI": "assets/bitmaps/nature-64/clouds.jpg" } }, { @@ -31,7 +31,7 @@ "MEDIA_ID": "art_nature_64 flower1", "DISPLAY_TITLE": "Flower 1", "DURATION": 10000, - "ART_URI": "bitmaps/nature-64/flower1.jpg" + "ART_URI": "assets/bitmaps/nature-64/flower1.jpg" } }, { @@ -40,7 +40,7 @@ "MEDIA_ID": "art_nature_64 flower2", "DISPLAY_TITLE": "Flower 2", "DURATION": 10000, - "ART_URI": "bitmaps/nature-64/flower2.jpg" + "ART_URI": "assets/bitmaps/nature-64/flower2.jpg" } }, { @@ -49,7 +49,7 @@ "MEDIA_ID": "art_nature_64 flower3", "DISPLAY_TITLE": "Flower3 ", "DURATION": 10000, - "ART_URI": "bitmaps/nature-64/flower3.jpg" + "ART_URI": "assets/bitmaps/nature-64/flower3.jpg" } }, { @@ -58,7 +58,7 @@ "MEDIA_ID": "art_nature_64 flowers", "DISPLAY_TITLE": "Flowers", "DURATION": 10000, - "ART_URI": "bitmaps/nature-64/flowers.jpg" + "ART_URI": "assets/bitmaps/nature-64/flowers.jpg" } }, { @@ -67,7 +67,7 @@ "MEDIA_ID": "art_nature_64 leaves", "DISPLAY_TITLE": "Leaves", "DURATION": 10000, - "ART_URI": "bitmaps/nature-64/leaves.jpg" + "ART_URI": "assets/bitmaps/nature-64/leaves.jpg" } }, { @@ -76,7 +76,7 @@ "MEDIA_ID": "art_nature_64 sage", "DISPLAY_TITLE": "Sage", "DURATION": 10000, - "ART_URI": "bitmaps/nature-64/sage.jpg" + "ART_URI": "assets/bitmaps/nature-64/sage.jpg" } }, { @@ -85,7 +85,7 @@ "MEDIA_ID": "art_nature_64 tree", "DISPLAY_TITLE": "Tree", "DURATION": 10000, - "ART_URI": "bitmaps/nature-64/tree.jpg" + "ART_URI": "assets/bitmaps/nature-64/tree.jpg" } } ] diff --git a/TestMediaApp/assets/media_items/album_art/nature/art_nature_files.json b/TestMediaApp/assets/media_items/album_art/nature/art_nature_files.json new file mode 100644 index 0000000..2643829 --- /dev/null +++ b/TestMediaApp/assets/media_items/album_art/nature/art_nature_files.json @@ -0,0 +1,92 @@ +{ + "FLAGS": "browsable", + + "METADATA": { + "MEDIA_ID": "art_nature_files_leaves", + "DISPLAY_TITLE": "Art nature files" + }, + + "CHILDREN": [ + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "art_nature_files_leaves bee", + "DISPLAY_TITLE": "Bee", + "DURATION": 10000, + "ART_URI": "files/bitmaps/nature-1024/bee.jpg" + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "art_nature_files_leaves clouds", + "DISPLAY_TITLE": "Clouds", + "DURATION": 10000, + "ART_URI": "files/bitmaps/nature-1024/clouds.jpg" + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "art_nature_files_leaves flower1", + "DISPLAY_TITLE": "Flower 1", + "DURATION": 10000, + "ART_URI": "files/bitmaps/nature-1024/flower1.jpg" + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "art_nature_files_leaves flower2", + "DISPLAY_TITLE": "Flower 2", + "DURATION": 10000, + "ART_URI": "files/bitmaps/nature-1024/flower2.jpg" + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "art_nature_files_leaves flower3", + "DISPLAY_TITLE": "Flower3 ", + "DURATION": 10000, + "ART_URI": "files/bitmaps/nature-1024/flower3.jpg" + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "art_nature_files_leaves flowers", + "DISPLAY_TITLE": "Flowers", + "DURATION": 10000, + "ART_URI": "files/bitmaps/nature-1024/flowers.jpg" + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "art_nature_files_leaves leaves", + "DISPLAY_TITLE": "Leaves", + "DURATION": 10000, + "ART_URI": "files/bitmaps/nature-1024/leaves.jpg" + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "art_nature_files_leaves sage", + "DISPLAY_TITLE": "Sage", + "DURATION": 10000, + "ART_URI": "files/bitmaps/nature-1024/sage.jpg" + } + }, + { + "FLAGS": "playable", + "METADATA": { + "MEDIA_ID": "art_nature_files_leaves tree", + "DISPLAY_TITLE": "Tree", + "DURATION": 10000, + "ART_URI": "files/bitmaps/nature-1024/tree.jpg" + } + } + ] +}
\ No newline at end of file diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/MediaKeys.java b/TestMediaApp/src/com/android/car/media/testmediaapp/MediaKeys.java index 8506b6b..9c58483 100644 --- a/TestMediaApp/src/com/android/car/media/testmediaapp/MediaKeys.java +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/MediaKeys.java @@ -22,6 +22,10 @@ package com.android.car.media.testmediaapp; */ public class MediaKeys { + /** Integer extra indicating the recommended size (in pixels) for media art bitmaps. */ + public static final String EXTRA_MEDIA_ART_SIZE_HINT_PIXELS = + "android.media.extras.MEDIA_ART_SIZE_HINT_PIXELS"; + /** * Bundle extra holding the Pending Intent to launch to let users resolve the current error. * See {@link #ERROR_RESOLUTION_ACTION_LABEL} for more details. diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java index 82de542..6aeac39 100644 --- a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java @@ -26,6 +26,7 @@ import android.os.Handler; import android.support.v4.media.MediaBrowserCompat.MediaItem; import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.media.session.PlaybackStateCompat; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -49,6 +50,7 @@ import java.util.List; * {@link TmaPlayer}. */ public class TmaBrowser extends MediaBrowserServiceCompat { + private static final String TAG = "TmaBrowser"; private static final String MEDIA_SESSION_TAG = "TEST_MEDIA_SESSION"; private static final String ROOT_ID = "_ROOT_ID_"; @@ -99,6 +101,8 @@ public class TmaBrowser extends MediaBrowserServiceCompat { Bundle browserRootExtras = new Bundle(); browserRootExtras.putBoolean(SEARCH_SUPPORTED, true); mRoot = new BrowserRoot(ROOT_ID, browserRootExtras); + + updatePlaybackState(mPrefs.mAccountType.getValue()); } @Override @@ -136,6 +140,7 @@ public class TmaBrowser extends MediaBrowserServiceCompat { // TODO don't reset error in all cases... PlaybackStateCompat.Builder playbackState = new PlaybackStateCompat.Builder(); playbackState.setState(PlaybackStateCompat.STATE_PAUSED, 0, 0); + playbackState.setActions(PlaybackStateCompat.ACTION_PREPARE); mSession.setPlaybackState(playbackState.build()); } } @@ -147,6 +152,8 @@ public class TmaBrowser extends MediaBrowserServiceCompat { @Override public BrowserRoot onGetRoot( @NonNull String clientPackageName, int clientUid, Bundle rootHints) { + Log.i(TAG, "onGetroot client: " + clientPackageName + " EXTRA_MEDIA_ART_SIZE_HINT_PIXELS: " + + rootHints.getInt(MediaKeys.EXTRA_MEDIA_ART_SIZE_HINT_PIXELS, 0)); return mRoot; } diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaPlayer.java b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaPlayer.java index 2938a37..d8fab6c 100644 --- a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaPlayer.java +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaPlayer.java @@ -21,6 +21,7 @@ import static android.media.AudioManager.AUDIOFOCUS_REQUEST_GRANTED; import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PAUSE; import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PLAY; import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PLAY_FROM_MEDIA_ID; +import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PREPARE; import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SEEK_TO; import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_NEXT; import static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS; @@ -345,7 +346,8 @@ public class TmaPlayer extends MediaSessionCompat.Callback { } private long addActions(long actions) { - actions |= ACTION_PLAY_FROM_MEDIA_ID | ACTION_SKIP_TO_QUEUE_ITEM | ACTION_SEEK_TO; + actions |= ACTION_PLAY_FROM_MEDIA_ID | ACTION_SKIP_TO_QUEUE_ITEM | ACTION_SEEK_TO + | ACTION_PREPARE; if (mActiveItem != null) { if (mActiveItem.getNext() != null) { diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaAssetProvider.java b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaPublicProvider.java index fc9fd49..e7eb31b 100644 --- a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaAssetProvider.java +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaPublicProvider.java @@ -21,56 +21,105 @@ import android.content.ContentValues; import android.content.res.AssetFileDescriptor; import android.database.Cursor; import android.net.Uri; +import android.os.ParcelFileDescriptor; import android.text.TextUtils; import android.util.Log; import com.android.car.media.testmediaapp.prefs.TmaPrefs; +import java.io.File; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; -public class TmaAssetProvider extends ContentProvider { +public class TmaPublicProvider extends ContentProvider { private static final String TAG = "TmaAssetProvider"; - private static final String PACKAGE_NAME = "com.android.car.media.testmediaapp"; + private static final int DEFAULT_BUFFER_SIZE = 1024 * 4; - private static final String ASSET_URI_PREFIX = - ContentResolver.SCHEME_CONTENT + "://" + PACKAGE_NAME + ".assets/"; + private static final String AUTHORITY = "com.android.car.media.testmediaapp.public"; + + private static final String FILES = "/files/"; + private static final String ASSETS = "/assets/"; + + private static final String CONTENT_URI_PREFIX = + ContentResolver.SCHEME_CONTENT + "://" + AUTHORITY + "/"; private static final String RESOURCE_URI_PREFIX = - ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + PACKAGE_NAME + "/"; + ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + AUTHORITY + "/"; public static String buildUriString(String localArt) { - String prefix = localArt.startsWith("drawable") ? RESOURCE_URI_PREFIX : ASSET_URI_PREFIX; + String prefix = localArt.startsWith("drawable") ? RESOURCE_URI_PREFIX : CONTENT_URI_PREFIX; return prefix + localArt; } private int mAssetDelay = 0; + + @Override + public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { + String path = uri.getPath(); + + if (TextUtils.isEmpty(path) || !path.startsWith(FILES)) { + throw new FileNotFoundException(path); + } + + Log.i(TAG, "TmaAssetProvider#openFile uri: " + uri + " path: " + path); + + File localFile = new File(getContext().getFilesDir(), path); + if (!localFile.exists()) { + downloadFile(localFile, path.substring(FILES.length())); + } + + return ParcelFileDescriptor.open(localFile,ParcelFileDescriptor.MODE_READ_ONLY); + } + @Override public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException { - Log.i(TAG, "TmaAssetProvider#openAssetFile " + uri); + String path = uri.getPath(); + if (TextUtils.isEmpty(path) || !path.startsWith(ASSETS)) { + // The ImageDecoder and media center code always try to open as asset first, but + // super delegates to openFile... + return super.openAssetFile(uri, mode); + } + + Log.i(TAG, "TmaAssetProvider#openAssetFile uri: " + uri + " path: " + path); try { Thread.sleep(mAssetDelay + (int)(mAssetDelay * (Math.random()))); } catch (InterruptedException ignored) { } - String file_path = uri.getPath(); - if (TextUtils.isEmpty(file_path)) throw new FileNotFoundException(); try { - if (file_path.startsWith("/")) { - file_path = file_path.substring(1); - } - return getContext().getAssets().openFd(file_path); + return getContext().getAssets().openFd(path.substring(ASSETS.length())); } catch (IOException e) { Log.e(TAG, "openAssetFile failed: " + e); return null; } } + private void downloadFile(File localFile, String assetsPath) { + try { + localFile.getParentFile().mkdirs(); + + InputStream input = getContext().getAssets().open(assetsPath); + OutputStream output = new FileOutputStream(localFile); + + byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; + int n; + while (-1 != (n = input.read(buffer))) { + output.write(buffer, 0, n); + } + + } catch (IOException e) { + Log.e(TAG, "downloadFile failed: " + e); + } + } + @Override public boolean onCreate() { TmaPrefs.getInstance(getContext()).mAssetReplyDelay.registerChangeListener( diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/loader/TmaMediaMetadataReader.java b/TestMediaApp/src/com/android/car/media/testmediaapp/loader/TmaMediaMetadataReader.java index 5a4a217..8cc4843 100644 --- a/TestMediaApp/src/com/android/car/media/testmediaapp/loader/TmaMediaMetadataReader.java +++ b/TestMediaApp/src/com/android/car/media/testmediaapp/loader/TmaMediaMetadataReader.java @@ -53,7 +53,7 @@ import static com.android.car.media.testmediaapp.loader.TmaLoaderUtils.enumNames import android.support.v4.media.MediaMetadataCompat; import android.util.Log; -import com.android.car.media.testmediaapp.TmaAssetProvider; +import com.android.car.media.testmediaapp.TmaPublicProvider; import org.json.JSONException; import org.json.JSONObject; @@ -153,7 +153,7 @@ class TmaMediaMetadataReader { case TEXT: String value = object.getString(jsonKey); if (mUriKeys.contains(key)) { - value = TmaAssetProvider.buildUriString(value); + value = TmaPublicProvider.buildUriString(value); } builder.putString(key.mLongName, value); break; |