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..7274418b09caa72a50f1ba13f45b02209130fb2c 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,43 @@ 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.InvocationTargetException; |
+import java.lang.reflect.Method; |
import java.util.HashMap; |
@JNINamespace("media") |
class MediaPlayerBridge { |
+ |
+ private static final String TAG = "MediaPlayerBridge"; |
+ |
+ private static class AllowedOperations { |
+ 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 +61,49 @@ 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 (NoSuchMethodException e) { |
+ Log.e(TAG, "Cannot find getMetadata() method: " + e); |
+ } catch (InvocationTargetException e) { |
+ Log.e(TAG, "Cannot invoke MediaPlayer.getMetadata() method: " + e); |
+ } catch (IllegalAccessException e) { |
+ Log.e(TAG, "Cannot access metadata: " + e); |
+ } catch (NoSuchFieldException e) { |
+ Log.e(TAG, "Cannot find matching fields in Metadata class: " + e); |
+ } |
+ return new AllowedOperations(canPause, canSeekForward, canSeekBackward); |
+ } |
} |