Chromium Code Reviews| Index: media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java |
| diff --git a/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java b/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java |
| index 1bf800585ae85de7015d52b73ec06a4f44ace56e..41221a550c3444aa4a9414ed222c0837d60a6db2 100644 |
| --- a/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java |
| +++ b/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java |
| @@ -8,14 +8,39 @@ import android.content.Context; |
| import android.media.MediaPlayer; |
| import android.net.Uri; |
| import android.text.TextUtils; |
| +import android.util.Log; |
| import org.chromium.base.CalledByNative; |
| import org.chromium.base.JNINamespace; |
| +import java.io.Serializable; |
| +import java.lang.reflect.Method; |
| import java.util.HashMap; |
| @JNINamespace("media") |
| class MediaPlayerBridge { |
| + private static class AllowedOperations implements Serializable { |
|
bulach
2013/03/14 09:59:07
is Serializable needed?
qinmin
2013/03/14 18:53:03
no, removed
On 2013/03/14 09:59:07, bulach wrote:
|
| + private final boolean mCanPause; |
| + private final boolean mCanSeekForward; |
| + private final boolean mCanSeekBackward; |
| + |
| + private AllowedOperations(boolean canPause, boolean canSeekForward, |
| + boolean canSeekBackward) { |
| + mCanPause = canPause; |
| + mCanSeekForward = canSeekForward; |
| + mCanSeekBackward = canSeekBackward; |
| + } |
| + |
| + @CalledByNative("AllowedOperations") |
| + private boolean canPause() { return mCanPause; } |
| + |
| + @CalledByNative("AllowedOperations") |
| + private boolean canSeekForward() { return mCanSeekForward; } |
| + |
| + @CalledByNative("AllowedOperations") |
| + private boolean canSeekBackward() { return mCanSeekBackward; } |
| + } |
| + |
| @CalledByNative |
| private static boolean setDataSource(MediaPlayer player, Context context, String url, |
| String cookies, boolean hideUrlLog) { |
| @@ -32,4 +57,43 @@ class MediaPlayerBridge { |
| return false; |
| } |
| } |
| + |
| + /** |
| + * Returns an AllowedOperations object to show all the operations that are |
| + * allowed on the media player. |
| + */ |
| + @CalledByNative |
| + private static AllowedOperations getAllowedOperations(MediaPlayer player) { |
| + boolean canPause = true; |
| + boolean canSeekForward = true; |
| + boolean canSeekBackward = true; |
| + try { |
| + Method getMetadata = player.getClass().getDeclaredMethod( |
| + "getMetadata", boolean.class, boolean.class); |
| + getMetadata.setAccessible(true); |
| + Object data = getMetadata.invoke(player, false, false); |
| + if (data != null) { |
| + Class<?> metadataClass = data.getClass(); |
| + Method hasMethod = metadataClass.getDeclaredMethod("has", int.class); |
| + Method getBooleanMethod = metadataClass.getDeclaredMethod("getBoolean", int.class); |
| + |
| + int pause = (Integer) metadataClass.getField("PAUSE_AVAILABLE").get(null); |
| + int seekForward = |
| + (Integer) metadataClass.getField("SEEK_FORWARD_AVAILABLE").get(null); |
| + int seekBackward = |
| + (Integer) metadataClass.getField("SEEK_BACKWARD_AVAILABLE").get(null); |
| + hasMethod.setAccessible(true); |
| + getBooleanMethod.setAccessible(true); |
| + canPause = !((Boolean) hasMethod.invoke(data, pause)) |
| + || ((Boolean) getBooleanMethod.invoke(data, pause)); |
| + canSeekForward = !((Boolean) hasMethod.invoke(data, seekForward)) |
| + || ((Boolean) getBooleanMethod.invoke(data, seekForward)); |
| + canSeekBackward = !((Boolean) hasMethod.invoke(data, seekBackward)) |
| + || ((Boolean) getBooleanMethod.invoke(data, seekBackward)); |
| + } |
| + } catch (Exception e) { |
| + Log.e("MediaPlayerBridge", "Cannot get metadata from the player: " + e); |
| + } |
| + return new AllowedOperations(canPause, canSeekForward, canSeekBackward); |
| + } |
| } |