diff options
Diffstat (limited to 'TestMediaApp/src/com')
-rw-r--r-- | TestMediaApp/src/com/android/car/media/testmediaapp/MediaKeys.java | 4 | ||||
-rw-r--r-- | TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java | 7 | ||||
-rw-r--r-- | TestMediaApp/src/com/android/car/media/testmediaapp/TmaPlayer.java | 4 | ||||
-rw-r--r-- | TestMediaApp/src/com/android/car/media/testmediaapp/TmaPublicProvider.java (renamed from TestMediaApp/src/com/android/car/media/testmediaapp/TmaAssetProvider.java) | 75 | ||||
-rw-r--r-- | TestMediaApp/src/com/android/car/media/testmediaapp/loader/TmaMediaMetadataReader.java | 4 |
5 files changed, 78 insertions, 16 deletions
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; |