Bug 1306185-[Part1] Provide Java interface to bridge Gecko's gmp-decryption-like API and MediaDrm API
MozReview-Commit-ID: 3jxofUxcTA9
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/media/GeckoMediaDrm.java
@@ -0,0 +1,35 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.media;
+
+import android.media.MediaCrypto;
+
+public interface GeckoMediaDrm {
+ public interface Callbacks {
+ void onSessionCreated(int createSessionToken,
+ int promiseId,
+ byte[] sessionId,
+ byte[] request);
+ void onSessionUpdated(int promiseId, byte[] sessionId);
+ void onSessionClosed(int promiseId, byte[] sessionId);
+ void onSessionMessage(byte[] sessionId,
+ int sessionMessageType,
+ byte[] request);
+ void onSessionError(byte[] sessionId, String message);
+ void onSessionBatchedKeyChanged(byte[] sessionId,
+ SessionKeyInfo[] keyInfos);
+ // All failure cases should go through this function.
+ void onRejectPromise(int promiseId, String message);
+ }
+ void setCallbacks(Callbacks callbacks);
+ void createSession(int createSessionToken,
+ int promiseId,
+ String initDataType,
+ byte[] initData);
+ void updateSession(int promiseId, String sessionId, byte[] response);
+ void closeSession(int promiseId, String sessionId);
+ void release();
+ MediaCrypto getMediaCrypto();
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/media/SessionKeyInfo.java
@@ -0,0 +1,18 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.media;
+
+import org.mozilla.gecko.annotation.WrapForJNI;
+
+@WrapForJNI
+public final class SessionKeyInfo {
+ public byte[] keyId;
+ public int status;
+
+ public SessionKeyInfo(byte[] keyId, int status) {
+ this.keyId = keyId;
+ this.status = status;
+ }
+}
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -550,23 +550,25 @@ gbjar.sources += ['java/org/mozilla/geck
'lwt/LightweightThemeDrawable.java',
'mdns/MulticastDNSManager.java',
'media/AsyncCodec.java',
'media/AsyncCodecFactory.java',
'media/AudioFocusAgent.java',
'media/Codec.java',
'media/CodecProxy.java',
'media/FormatParam.java',
+ 'media/GeckoMediaDrm.java',
'media/JellyBeanAsyncCodec.java',
'media/MediaControlService.java',
'media/MediaDrmProxy.java',
'media/MediaManager.java',
'media/RemoteManager.java',
'media/Sample.java',
'media/SamplePool.java',
+ 'media/SessionKeyInfo.java',
'media/VideoPlayer.java',
'MediaCastingBar.java',
'MemoryMonitor.java',
'menu/GeckoMenu.java',
'menu/GeckoMenuInflater.java',
'menu/GeckoMenuItem.java',
'menu/GeckoSubMenu.java',
'menu/MenuItemActionBar.java',
--- a/widget/android/fennec/FennecJNIWrappers.cpp
+++ b/widget/android/fennec/FennecJNIWrappers.cpp
@@ -306,16 +306,53 @@ auto Sample::Info() const -> mozilla::jn
return mozilla::jni::Field<Info_t>::Get(Sample::mCtx, nullptr);
}
auto Sample::Info(mozilla::jni::Object::Param a0) const -> void
{
return mozilla::jni::Field<Info_t>::Set(Sample::mCtx, nullptr, a0);
}
+const char SessionKeyInfo::name[] =
+ "org/mozilla/gecko/media/SessionKeyInfo";
+
+constexpr char SessionKeyInfo::New_t::name[];
+constexpr char SessionKeyInfo::New_t::signature[];
+
+auto SessionKeyInfo::New(mozilla::jni::ByteArray::Param a0, int32_t a1) -> SessionKeyInfo::LocalRef
+{
+ return mozilla::jni::Constructor<New_t>::Call(SessionKeyInfo::Context(), nullptr, a0, a1);
+}
+
+constexpr char SessionKeyInfo::KeyId_t::name[];
+constexpr char SessionKeyInfo::KeyId_t::signature[];
+
+auto SessionKeyInfo::KeyId() const -> mozilla::jni::ByteArray::LocalRef
+{
+ return mozilla::jni::Field<KeyId_t>::Get(SessionKeyInfo::mCtx, nullptr);
+}
+
+auto SessionKeyInfo::KeyId(mozilla::jni::ByteArray::Param a0) const -> void
+{
+ return mozilla::jni::Field<KeyId_t>::Set(SessionKeyInfo::mCtx, nullptr, a0);
+}
+
+constexpr char SessionKeyInfo::Status_t::name[];
+constexpr char SessionKeyInfo::Status_t::signature[];
+
+auto SessionKeyInfo::Status() const -> int32_t
+{
+ return mozilla::jni::Field<Status_t>::Get(SessionKeyInfo::mCtx, nullptr);
+}
+
+auto SessionKeyInfo::Status(int32_t a0) const -> void
+{
+ return mozilla::jni::Field<Status_t>::Set(SessionKeyInfo::mCtx, nullptr, a0);
+}
+
const char Restrictions::name[] =
"org/mozilla/gecko/restrictions/Restrictions";
constexpr char Restrictions::IsAllowed_t::name[];
constexpr char Restrictions::IsAllowed_t::signature[];
auto Restrictions::IsAllowed(int32_t a0, mozilla::jni::String::Param a1) -> bool
{
--- a/widget/android/fennec/FennecJNIWrappers.h
+++ b/widget/android/fennec/FennecJNIWrappers.h
@@ -1055,16 +1055,91 @@ public:
auto Info(mozilla::jni::Object::Param) const -> void;
static const mozilla::jni::CallingThread callingThread =
mozilla::jni::CallingThread::ANY;
};
+class SessionKeyInfo : public mozilla::jni::ObjectBase<SessionKeyInfo>
+{
+public:
+ static const char name[];
+
+ explicit SessionKeyInfo(const Context& ctx) : ObjectBase<SessionKeyInfo>(ctx) {}
+
+ struct New_t {
+ typedef SessionKeyInfo Owner;
+ typedef SessionKeyInfo::LocalRef ReturnType;
+ typedef SessionKeyInfo::Param SetterType;
+ typedef mozilla::jni::Args<
+ mozilla::jni::ByteArray::Param,
+ int32_t> Args;
+ static constexpr char name[] = "<init>";
+ static constexpr char signature[] =
+ "([BI)V";
+ static const bool isStatic = false;
+ static const mozilla::jni::ExceptionMode exceptionMode =
+ mozilla::jni::ExceptionMode::ABORT;
+ static const mozilla::jni::CallingThread callingThread =
+ mozilla::jni::CallingThread::ANY;
+ static const mozilla::jni::DispatchTarget dispatchTarget =
+ mozilla::jni::DispatchTarget::CURRENT;
+ };
+
+ static auto New(mozilla::jni::ByteArray::Param, int32_t) -> SessionKeyInfo::LocalRef;
+
+ struct KeyId_t {
+ typedef SessionKeyInfo Owner;
+ typedef mozilla::jni::ByteArray::LocalRef ReturnType;
+ typedef mozilla::jni::ByteArray::Param SetterType;
+ typedef mozilla::jni::Args<> Args;
+ static constexpr char name[] = "keyId";
+ static constexpr char signature[] =
+ "[B";
+ static const bool isStatic = false;
+ static const mozilla::jni::ExceptionMode exceptionMode =
+ mozilla::jni::ExceptionMode::ABORT;
+ static const mozilla::jni::CallingThread callingThread =
+ mozilla::jni::CallingThread::ANY;
+ static const mozilla::jni::DispatchTarget dispatchTarget =
+ mozilla::jni::DispatchTarget::CURRENT;
+ };
+
+ auto KeyId() const -> mozilla::jni::ByteArray::LocalRef;
+
+ auto KeyId(mozilla::jni::ByteArray::Param) const -> void;
+
+ struct Status_t {
+ typedef SessionKeyInfo Owner;
+ typedef int32_t ReturnType;
+ typedef int32_t SetterType;
+ typedef mozilla::jni::Args<> Args;
+ static constexpr char name[] = "status";
+ static constexpr char signature[] =
+ "I";
+ static const bool isStatic = false;
+ static const mozilla::jni::ExceptionMode exceptionMode =
+ mozilla::jni::ExceptionMode::ABORT;
+ static const mozilla::jni::CallingThread callingThread =
+ mozilla::jni::CallingThread::ANY;
+ static const mozilla::jni::DispatchTarget dispatchTarget =
+ mozilla::jni::DispatchTarget::CURRENT;
+ };
+
+ auto Status() const -> int32_t;
+
+ auto Status(int32_t) const -> void;
+
+ static const mozilla::jni::CallingThread callingThread =
+ mozilla::jni::CallingThread::ANY;
+
+};
+
class Restrictions : public mozilla::jni::ObjectBase<Restrictions>
{
public:
static const char name[];
explicit Restrictions(const Context& ctx) : ObjectBase<Restrictions>(ctx) {}
struct IsAllowed_t {