aboutsummaryrefslogtreecommitdiff
path: root/TestMediaApp/src/com/android/car/media/testmediaapp
diff options
context:
space:
mode:
authorArnaud Berry <arnaudberry@google.com>2019-10-22 13:35:16 -0700
committerArnaud Berry <arnaudberry@google.com>2019-10-23 12:14:50 -0700
commiteebf07f42ba33d549af66ce0703443022f4e5a90 (patch)
tree71e1dc27fc771a17aff51b05bf4eda092bb02344 /TestMediaApp/src/com/android/car/media/testmediaapp
parentcdd24fd5db74e0dab20445465aef708bdc29ace0 (diff)
downloadtests-eebf07f42ba33d549af66ce0703443022f4e5a90.tar.gz
Add the option to create local files for the album art
The data for those files still comes from the application's assets, but this illustrates what to do with bytes that would be received from a remote uri. Test: manual Change-Id: I5fa590d632df477df215231319e40bd05f5eb90b
Diffstat (limited to 'TestMediaApp/src/com/android/car/media/testmediaapp')
-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.java4
2 files changed, 64 insertions, 15 deletions
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;