Commit 0a348eea authored by horo's avatar horo Committed by Commit bot

Use MediaMetadataRetriever.setDataSource(Context, Uri) for "content" scheme.

This cl will fix the bug reported at https://crbug.com/253465#c26.
With this patch, MediaMetadataRetriever can get the metadata of the local video file which is selected with the file input element.

BUG=253465

Review URL: https://codereview.chromium.org/1626283002

Cr-Commit-Position: refs/heads/master@{#371786}
parent 12017303
......@@ -10,6 +10,7 @@ import android.content.pm.PackageManager;
import android.media.MediaMetadataRetriever;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.text.TextUtils;
......@@ -32,8 +33,7 @@ import java.util.Map;
*/
@JNINamespace("content")
class MediaResourceGetter {
private static final String TAG = "cr.MediaResourceGetter";
private static final String TAG = "cr_MediaResource";
private static final MediaMetadata EMPTY_METADATA = new MediaMetadata(0, 0, 0, false);
private final MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
......@@ -195,7 +195,7 @@ class MediaResourceGetter {
Log.d(TAG, "extracted valid metadata: %s", result);
return result;
} catch (RuntimeException e) {
Log.e(TAG, "Unable to extract metadata: %s", e.getMessage());
Log.e(TAG, "Unable to extract metadata: %s", e);
return EMPTY_METADATA;
}
}
......@@ -206,7 +206,7 @@ class MediaResourceGetter {
try {
uri = URI.create(url);
} catch (IllegalArgumentException e) {
Log.e(TAG, "Cannot parse uri: %s", e.getMessage());
Log.e(TAG, "Cannot parse uri: %s", e);
return false;
}
String scheme = uri.getScheme();
......@@ -224,7 +224,16 @@ class MediaResourceGetter {
configure(file.getAbsolutePath());
return true;
} catch (RuntimeException e) {
Log.e(TAG, "Error configuring data source: %s", e.getMessage());
Log.e(TAG, "Error configuring data source: %s", e);
return false;
}
}
if (scheme.equals("content")) {
try {
configure(context, Uri.parse(uri.toString()));
return true;
} catch (RuntimeException e) {
Log.e(TAG, "Error configuring data source: %s", e);
return false;
}
}
......@@ -248,7 +257,7 @@ class MediaResourceGetter {
configure(url, headersMap);
return true;
} catch (RuntimeException e) {
Log.e(TAG, "Error configuring data source: %s", e.getMessage());
Log.e(TAG, "Error configuring data source: %s", e);
return false;
}
}
......@@ -397,6 +406,11 @@ class MediaResourceGetter {
mRetriever.setDataSource(path);
}
@VisibleForTesting
void configure(Context context, Uri uri) {
mRetriever.setDataSource(context, uri);
}
@VisibleForTesting
String extractMetadata(int key) {
return mRetriever.extractMetadata(key);
......
......@@ -9,6 +9,7 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.media.MediaMetadataRetriever;
import android.net.ConnectivityManager;
import android.net.Uri;
import android.test.InstrumentationTestCase;
import android.test.mock.MockContext;
import android.test.suitebuilder.annotation.SmallTest;
......@@ -32,6 +33,8 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
+ "(KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36";
private static final String TEST_FILE_PATH = "/mnt/sdcard/test";
private static final String TEST_FILE_URL = "file://" + TEST_FILE_PATH;
private static final String TEST_CONTENT_URI =
"content://com.android.providers.media.documents/document/video:113";
private static final String TEST_COOKIES = "yum yum yum!";
private static final MediaMetadata sEmptyMetadata = new MediaMetadata(0, 0, 0, false);
private static final String sExternalStorageDirectory = "/test_external_storage";
......@@ -97,6 +100,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
String mUri = null;
Map<String, String> mHeaders = null;
String mPath = null;
String mContentUri = null;
int mFd;
long mOffset;
long mLength;
......@@ -138,6 +142,15 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
mPath = path;
}
// Can't use a real MediaMetadataRetriever as we have no media
@Override
public void configure(Context context, Uri uri) {
if (mThrowExceptionInConfigure) {
throw new RuntimeException("test exception");
}
mContentUri = uri.toString();
}
// Can't use a real MediaMetadataRetriever as we have no media
@Override
public String extractMetadata(int key) {
......@@ -295,6 +308,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
assertEquals(sHeadersCookieOnly, mFakeMRG.mHeaders);
assertNull(mFakeMRG.mPath);
assertNull(mFakeMRG.mContentUri);
}
@SmallTest
......@@ -306,6 +320,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
assertEquals(sHeadersCookieOnly, mFakeMRG.mHeaders);
assertNull(mFakeMRG.mPath);
assertNull(mFakeMRG.mContentUri);
}
@SmallTest
......@@ -317,6 +332,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
assertEquals(Collections.emptyMap(), mFakeMRG.mHeaders);
assertNull(mFakeMRG.mPath);
assertNull(mFakeMRG.mContentUri);
}
@SmallTest
......@@ -328,6 +344,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
assertEquals(sHeadersCookieAndUA, mFakeMRG.mHeaders);
assertNull(mFakeMRG.mPath);
assertNull(mFakeMRG.mContentUri);
}
@SmallTest
......@@ -339,6 +356,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
assertEquals(sHeadersUAOnly, mFakeMRG.mHeaders);
assertNull(mFakeMRG.mPath);
assertNull(mFakeMRG.mContentUri);
}
@SmallTest
......@@ -367,6 +385,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertEquals(localHostUrl, mFakeMRG.mUri);
assertEquals(sHeadersCookieAndUA, mFakeMRG.mHeaders);
assertNull(mFakeMRG.mPath);
assertNull(mFakeMRG.mContentUri);
}
}
......@@ -378,6 +397,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertTrue(mFakeMRG.configure(mMockContext, url, "", null));
assertEquals(path, mFakeMRG.mPath);
assertNull(mFakeMRG.mUri);
assertNull(mFakeMRG.mContentUri);
assertNull(mFakeMRG.mHeaders);
}
......@@ -389,6 +409,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertTrue(mFakeMRG.configure(mMockContext, url, "", null));
assertEquals(path, mFakeMRG.mPath);
assertNull(mFakeMRG.mUri);
assertNull(mFakeMRG.mContentUri);
assertNull(mFakeMRG.mHeaders);
}
......@@ -409,6 +430,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertTrue(mFakeMRG.configure(mMockContext, url, "", null));
assertEquals(path, mFakeMRG.mPath);
assertNull(mFakeMRG.mUri);
assertNull(mFakeMRG.mContentUri);
assertNull(mFakeMRG.mHeaders);
}
......@@ -480,6 +502,23 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertNull(mFakeMRG.mPath);
}
@SmallTest
public void testConfigure_Content_Uri_Allowed() {
assertTrue(mFakeMRG.configure(mMockContext, TEST_CONTENT_URI, "", null));
assertNull(mFakeMRG.mPath);
assertNull(mFakeMRG.mUri);
assertEquals(TEST_CONTENT_URI, mFakeMRG.mContentUri);
}
@SmallTest
public void testConfigure_Content_Uri_Disallowed() {
mFakeMRG.mThrowExceptionInConfigure = true;
assertFalse(mFakeMRG.configure(mMockContext, TEST_CONTENT_URI, "", null));
assertNull(mFakeMRG.mPath);
assertNull(mFakeMRG.mUri);
assertNull(mFakeMRG.mContentUri);
}
@SmallTest
public void testExtract_NoMetadata() {
mFakeMRG.mFileExists = true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment