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; ...@@ -10,6 +10,7 @@ import android.content.pm.PackageManager;
import android.media.MediaMetadataRetriever; import android.media.MediaMetadataRetriever;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.Uri;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.text.TextUtils; import android.text.TextUtils;
...@@ -32,8 +33,7 @@ import java.util.Map; ...@@ -32,8 +33,7 @@ import java.util.Map;
*/ */
@JNINamespace("content") @JNINamespace("content")
class MediaResourceGetter { class MediaResourceGetter {
private static final String TAG = "cr_MediaResource";
private static final String TAG = "cr.MediaResourceGetter";
private static final MediaMetadata EMPTY_METADATA = new MediaMetadata(0, 0, 0, false); private static final MediaMetadata EMPTY_METADATA = new MediaMetadata(0, 0, 0, false);
private final MediaMetadataRetriever mRetriever = new MediaMetadataRetriever(); private final MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
...@@ -195,7 +195,7 @@ class MediaResourceGetter { ...@@ -195,7 +195,7 @@ class MediaResourceGetter {
Log.d(TAG, "extracted valid metadata: %s", result); Log.d(TAG, "extracted valid metadata: %s", result);
return result; return result;
} catch (RuntimeException e) { } 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; return EMPTY_METADATA;
} }
} }
...@@ -206,7 +206,7 @@ class MediaResourceGetter { ...@@ -206,7 +206,7 @@ class MediaResourceGetter {
try { try {
uri = URI.create(url); uri = URI.create(url);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
Log.e(TAG, "Cannot parse uri: %s", e.getMessage()); Log.e(TAG, "Cannot parse uri: %s", e);
return false; return false;
} }
String scheme = uri.getScheme(); String scheme = uri.getScheme();
...@@ -224,7 +224,16 @@ class MediaResourceGetter { ...@@ -224,7 +224,16 @@ class MediaResourceGetter {
configure(file.getAbsolutePath()); configure(file.getAbsolutePath());
return true; return true;
} catch (RuntimeException e) { } 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; return false;
} }
} }
...@@ -248,7 +257,7 @@ class MediaResourceGetter { ...@@ -248,7 +257,7 @@ class MediaResourceGetter {
configure(url, headersMap); configure(url, headersMap);
return true; return true;
} catch (RuntimeException e) { } catch (RuntimeException e) {
Log.e(TAG, "Error configuring data source: %s", e.getMessage()); Log.e(TAG, "Error configuring data source: %s", e);
return false; return false;
} }
} }
...@@ -397,6 +406,11 @@ class MediaResourceGetter { ...@@ -397,6 +406,11 @@ class MediaResourceGetter {
mRetriever.setDataSource(path); mRetriever.setDataSource(path);
} }
@VisibleForTesting
void configure(Context context, Uri uri) {
mRetriever.setDataSource(context, uri);
}
@VisibleForTesting @VisibleForTesting
String extractMetadata(int key) { String extractMetadata(int key) {
return mRetriever.extractMetadata(key); return mRetriever.extractMetadata(key);
......
...@@ -9,6 +9,7 @@ import android.content.Context; ...@@ -9,6 +9,7 @@ import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.media.MediaMetadataRetriever; import android.media.MediaMetadataRetriever;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.Uri;
import android.test.InstrumentationTestCase; import android.test.InstrumentationTestCase;
import android.test.mock.MockContext; import android.test.mock.MockContext;
import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest;
...@@ -32,6 +33,8 @@ public class MediaResourceGetterTest extends InstrumentationTestCase { ...@@ -32,6 +33,8 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
+ "(KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36"; + "(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_PATH = "/mnt/sdcard/test";
private static final String TEST_FILE_URL = "file://" + TEST_FILE_PATH; 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 String TEST_COOKIES = "yum yum yum!";
private static final MediaMetadata sEmptyMetadata = new MediaMetadata(0, 0, 0, false); private static final MediaMetadata sEmptyMetadata = new MediaMetadata(0, 0, 0, false);
private static final String sExternalStorageDirectory = "/test_external_storage"; private static final String sExternalStorageDirectory = "/test_external_storage";
...@@ -97,6 +100,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase { ...@@ -97,6 +100,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
String mUri = null; String mUri = null;
Map<String, String> mHeaders = null; Map<String, String> mHeaders = null;
String mPath = null; String mPath = null;
String mContentUri = null;
int mFd; int mFd;
long mOffset; long mOffset;
long mLength; long mLength;
...@@ -138,6 +142,15 @@ public class MediaResourceGetterTest extends InstrumentationTestCase { ...@@ -138,6 +142,15 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
mPath = path; 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 // Can't use a real MediaMetadataRetriever as we have no media
@Override @Override
public String extractMetadata(int key) { public String extractMetadata(int key) {
...@@ -295,6 +308,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase { ...@@ -295,6 +308,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertEquals(TEST_HTTP_URL, mFakeMRG.mUri); assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
assertEquals(sHeadersCookieOnly, mFakeMRG.mHeaders); assertEquals(sHeadersCookieOnly, mFakeMRG.mHeaders);
assertNull(mFakeMRG.mPath); assertNull(mFakeMRG.mPath);
assertNull(mFakeMRG.mContentUri);
} }
@SmallTest @SmallTest
...@@ -306,6 +320,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase { ...@@ -306,6 +320,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertEquals(TEST_HTTP_URL, mFakeMRG.mUri); assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
assertEquals(sHeadersCookieOnly, mFakeMRG.mHeaders); assertEquals(sHeadersCookieOnly, mFakeMRG.mHeaders);
assertNull(mFakeMRG.mPath); assertNull(mFakeMRG.mPath);
assertNull(mFakeMRG.mContentUri);
} }
@SmallTest @SmallTest
...@@ -317,6 +332,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase { ...@@ -317,6 +332,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertEquals(TEST_HTTP_URL, mFakeMRG.mUri); assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
assertEquals(Collections.emptyMap(), mFakeMRG.mHeaders); assertEquals(Collections.emptyMap(), mFakeMRG.mHeaders);
assertNull(mFakeMRG.mPath); assertNull(mFakeMRG.mPath);
assertNull(mFakeMRG.mContentUri);
} }
@SmallTest @SmallTest
...@@ -328,6 +344,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase { ...@@ -328,6 +344,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertEquals(TEST_HTTP_URL, mFakeMRG.mUri); assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
assertEquals(sHeadersCookieAndUA, mFakeMRG.mHeaders); assertEquals(sHeadersCookieAndUA, mFakeMRG.mHeaders);
assertNull(mFakeMRG.mPath); assertNull(mFakeMRG.mPath);
assertNull(mFakeMRG.mContentUri);
} }
@SmallTest @SmallTest
...@@ -339,6 +356,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase { ...@@ -339,6 +356,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertEquals(TEST_HTTP_URL, mFakeMRG.mUri); assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
assertEquals(sHeadersUAOnly, mFakeMRG.mHeaders); assertEquals(sHeadersUAOnly, mFakeMRG.mHeaders);
assertNull(mFakeMRG.mPath); assertNull(mFakeMRG.mPath);
assertNull(mFakeMRG.mContentUri);
} }
@SmallTest @SmallTest
...@@ -367,6 +385,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase { ...@@ -367,6 +385,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertEquals(localHostUrl, mFakeMRG.mUri); assertEquals(localHostUrl, mFakeMRG.mUri);
assertEquals(sHeadersCookieAndUA, mFakeMRG.mHeaders); assertEquals(sHeadersCookieAndUA, mFakeMRG.mHeaders);
assertNull(mFakeMRG.mPath); assertNull(mFakeMRG.mPath);
assertNull(mFakeMRG.mContentUri);
} }
} }
...@@ -378,6 +397,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase { ...@@ -378,6 +397,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertTrue(mFakeMRG.configure(mMockContext, url, "", null)); assertTrue(mFakeMRG.configure(mMockContext, url, "", null));
assertEquals(path, mFakeMRG.mPath); assertEquals(path, mFakeMRG.mPath);
assertNull(mFakeMRG.mUri); assertNull(mFakeMRG.mUri);
assertNull(mFakeMRG.mContentUri);
assertNull(mFakeMRG.mHeaders); assertNull(mFakeMRG.mHeaders);
} }
...@@ -389,6 +409,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase { ...@@ -389,6 +409,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertTrue(mFakeMRG.configure(mMockContext, url, "", null)); assertTrue(mFakeMRG.configure(mMockContext, url, "", null));
assertEquals(path, mFakeMRG.mPath); assertEquals(path, mFakeMRG.mPath);
assertNull(mFakeMRG.mUri); assertNull(mFakeMRG.mUri);
assertNull(mFakeMRG.mContentUri);
assertNull(mFakeMRG.mHeaders); assertNull(mFakeMRG.mHeaders);
} }
...@@ -409,6 +430,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase { ...@@ -409,6 +430,7 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertTrue(mFakeMRG.configure(mMockContext, url, "", null)); assertTrue(mFakeMRG.configure(mMockContext, url, "", null));
assertEquals(path, mFakeMRG.mPath); assertEquals(path, mFakeMRG.mPath);
assertNull(mFakeMRG.mUri); assertNull(mFakeMRG.mUri);
assertNull(mFakeMRG.mContentUri);
assertNull(mFakeMRG.mHeaders); assertNull(mFakeMRG.mHeaders);
} }
...@@ -480,6 +502,23 @@ public class MediaResourceGetterTest extends InstrumentationTestCase { ...@@ -480,6 +502,23 @@ public class MediaResourceGetterTest extends InstrumentationTestCase {
assertNull(mFakeMRG.mPath); 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 @SmallTest
public void testExtract_NoMetadata() { public void testExtract_NoMetadata() {
mFakeMRG.mFileExists = true; 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