| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package org.chromium.media; |
| |
| import android.annotation.TargetApi; |
| import android.os.Build; |
| |
| import org.chromium.base.Callback; |
| import org.chromium.base.annotations.CalledByNative; |
| import org.chromium.base.annotations.JNINamespace; |
| import org.chromium.base.annotations.MainDex; |
| import org.chromium.base.annotations.NativeMethods; |
| |
| /** |
| * Origin isolated media drm scope id storage. Isolated origin is guranteed by native |
| * implementation. Thus no origin information is stored here. |
| */ |
| @JNINamespace("media") |
| @MainDex |
| @TargetApi(Build.VERSION_CODES.M) |
| class MediaDrmStorageBridge { |
| private static final long INVALID_NATIVE_MEDIA_DRM_STORAGE_BRIDGE = -1; |
| |
| private long mNativeMediaDrmStorageBridge; |
| |
| /** |
| * Information that need to be persistent on the device. Exposed to JNI. |
| */ |
| static class PersistentInfo { |
| // EME session ID, which is generated randomly. |
| private final byte[] mEmeId; |
| |
| // Key set ID used to identify persistent license in MediaDrm. |
| private final byte[] mKeySetId; |
| |
| // Mime type for the license. |
| private final String mMimeType; |
| |
| // Key type of session. It can be any value. Caller should check it before actual using it. |
| private final int mKeyType; |
| |
| @CalledByNative("PersistentInfo") |
| private static PersistentInfo create( |
| byte[] emeId, byte[] keySetId, String mime, int keyType) { |
| return new PersistentInfo(emeId, keySetId, mime, keyType); |
| } |
| |
| PersistentInfo(byte[] emeId, byte[] keySetId, String mime, int keyType) { |
| mEmeId = emeId; |
| mKeySetId = keySetId; |
| mMimeType = mime; |
| mKeyType = keyType; |
| } |
| |
| @CalledByNative("PersistentInfo") |
| byte[] emeId() { |
| return mEmeId; |
| } |
| |
| @CalledByNative("PersistentInfo") |
| byte[] keySetId() { |
| return mKeySetId; |
| } |
| |
| @CalledByNative("PersistentInfo") |
| String mimeType() { |
| return mMimeType; |
| } |
| |
| @CalledByNative("PersistentInfo") |
| int keyType() { |
| return mKeyType; |
| } |
| } |
| |
| MediaDrmStorageBridge(long nativeMediaDrmStorageBridge) { |
| mNativeMediaDrmStorageBridge = nativeMediaDrmStorageBridge; |
| assert isNativeMediaDrmStorageValid(); |
| } |
| |
| /** |
| * Called when device provisioning is finished. |
| */ |
| void onProvisioned(Callback<Boolean> cb) { |
| if (isNativeMediaDrmStorageValid()) { |
| MediaDrmStorageBridgeJni.get().onProvisioned( |
| mNativeMediaDrmStorageBridge, MediaDrmStorageBridge.this, cb); |
| } else { |
| cb.onResult(true); |
| } |
| } |
| |
| /** |
| * Load |emeId|'s storage into memory. |
| */ |
| void loadInfo(byte[] emeId, Callback<PersistentInfo> cb) { |
| if (isNativeMediaDrmStorageValid()) { |
| MediaDrmStorageBridgeJni.get().onLoadInfo( |
| mNativeMediaDrmStorageBridge, MediaDrmStorageBridge.this, emeId, cb); |
| } else { |
| cb.onResult(null); |
| } |
| } |
| |
| /** |
| * Save persistent information. Override the existing value. |
| */ |
| void saveInfo(PersistentInfo info, Callback<Boolean> cb) { |
| if (isNativeMediaDrmStorageValid()) { |
| MediaDrmStorageBridgeJni.get().onSaveInfo( |
| mNativeMediaDrmStorageBridge, MediaDrmStorageBridge.this, info, cb); |
| } else { |
| cb.onResult(false); |
| } |
| } |
| |
| /** |
| * Remove persistent information related |emeId|. |
| */ |
| void clearInfo(byte[] emeId, Callback<Boolean> cb) { |
| if (isNativeMediaDrmStorageValid()) { |
| MediaDrmStorageBridgeJni.get().onClearInfo( |
| mNativeMediaDrmStorageBridge, MediaDrmStorageBridge.this, emeId, cb); |
| } else { |
| cb.onResult(true); |
| } |
| } |
| |
| private boolean isNativeMediaDrmStorageValid() { |
| return mNativeMediaDrmStorageBridge != INVALID_NATIVE_MEDIA_DRM_STORAGE_BRIDGE; |
| } |
| |
| @NativeMethods |
| interface Natives { |
| void onProvisioned(long nativeMediaDrmStorageBridge, MediaDrmStorageBridge caller, |
| Callback<Boolean> cb); |
| void onLoadInfo(long nativeMediaDrmStorageBridge, MediaDrmStorageBridge caller, |
| byte[] sessionId, Callback<PersistentInfo> cb); |
| void onSaveInfo(long nativeMediaDrmStorageBridge, MediaDrmStorageBridge caller, |
| PersistentInfo info, Callback<Boolean> cb); |
| void onClearInfo(long nativeMediaDrmStorageBridge, MediaDrmStorageBridge caller, |
| byte[] sessionId, Callback<Boolean> cb); |
| } |
| } |