| Index: media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
|
| diff --git a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
|
| index f54bde42d1eef2a12d284504f93f4aefbf0ac2df..c84061cdc0e57e2d3c67304840cfd5a21b64ed98 100644
|
| --- a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
|
| +++ b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
|
| @@ -83,6 +83,9 @@ public class MediaDrmBridge {
|
| // associated meta data, e.g. mime types, key types.
|
| private MediaDrmSessionManager mSessionManager;
|
|
|
| + // The persistent storage to record origin provisioning informations.
|
| + private MediaDrmStorageBridge mStorage;
|
| +
|
| // The queue of all pending createSession() data.
|
| private ArrayDeque<PendingCreateSessionData> mPendingCreateSessionDataQueue;
|
|
|
| @@ -91,6 +94,9 @@ public class MediaDrmBridge {
|
| // MediaDrmBridge is waiting for provisioning response from the server.
|
| private boolean mProvisioningPending;
|
|
|
| + // Boolean to track if 'ORIGIN' is set in MediaDrm.
|
| + private boolean mOriginSet = false;
|
| +
|
| /**
|
| * An equivalent of MediaDrm.KeyStatus, which is only available on M+.
|
| */
|
| @@ -196,15 +202,17 @@ public class MediaDrmBridge {
|
| }
|
|
|
| @TargetApi(Build.VERSION_CODES.M)
|
| - private MediaDrmBridge(UUID schemeUUID, long nativeMediaDrmBridge)
|
| - throws android.media.UnsupportedSchemeException {
|
| + private MediaDrmBridge(UUID schemeUUID, long nativeMediaDrmBridge,
|
| + long nativeMediaDrmStorageBridge) throws android.media.UnsupportedSchemeException {
|
| mSchemeUUID = schemeUUID;
|
| mMediaDrm = new MediaDrm(schemeUUID);
|
|
|
| mNativeMediaDrmBridge = nativeMediaDrmBridge;
|
| assert isNativeMediaDrmBridgeValid();
|
|
|
| - mSessionManager = new MediaDrmSessionManager();
|
| + mStorage = new MediaDrmStorageBridge(nativeMediaDrmStorageBridge);
|
| + mSessionManager = new MediaDrmSessionManager(mStorage);
|
| +
|
| mPendingCreateSessionDataQueue = new ArrayDeque<PendingCreateSessionData>();
|
| mResetDeviceCredentialsPending = false;
|
| mProvisioningPending = false;
|
| @@ -330,10 +338,11 @@ public class MediaDrmBridge {
|
| * @param securityOrigin Security origin. Empty value means no need for origin isolated storage.
|
| * @param securityLevel Security level. If empty, the default one should be used.
|
| * @param nativeMediaDrmBridge Native object of this class.
|
| + * @param nativeMediaDrmStorageBridge Native object of persistent storage.
|
| */
|
| @CalledByNative
|
| private static MediaDrmBridge create(byte[] schemeUUID, String securityOrigin,
|
| - String securityLevel, long nativeMediaDrmBridge) {
|
| + String securityLevel, long nativeMediaDrmBridge, long nativeMediaDrmStorageBridge) {
|
| UUID cryptoScheme = getUUIDFromBytes(schemeUUID);
|
| if (cryptoScheme == null || !MediaDrm.isCryptoSchemeSupported(cryptoScheme)) {
|
| return null;
|
| @@ -341,7 +350,8 @@ public class MediaDrmBridge {
|
|
|
| MediaDrmBridge mediaDrmBridge = null;
|
| try {
|
| - mediaDrmBridge = new MediaDrmBridge(cryptoScheme, nativeMediaDrmBridge);
|
| + mediaDrmBridge = new MediaDrmBridge(
|
| + cryptoScheme, nativeMediaDrmBridge, nativeMediaDrmStorageBridge);
|
| Log.d(TAG, "MediaDrmBridge successfully created.");
|
| } catch (android.media.UnsupportedSchemeException e) {
|
| Log.e(TAG, "Unsupported DRM scheme", e);
|
| @@ -386,6 +396,7 @@ public class MediaDrmBridge {
|
|
|
| try {
|
| mMediaDrm.setPropertyString(ORIGIN, origin);
|
| + mOriginSet = true;
|
| return true;
|
| } catch (java.lang.IllegalArgumentException e) {
|
| Log.e(TAG, "Failed to set security origin %s", origin, e);
|
| @@ -513,7 +524,7 @@ public class MediaDrmBridge {
|
| closeSessionNoException(sessionId);
|
| onSessionClosed(sessionId);
|
| }
|
| - mSessionManager = new MediaDrmSessionManager();
|
| + mSessionManager = new MediaDrmSessionManager(mStorage);
|
|
|
| // Close mMediaCryptoSession if it's open or notify MediaCrypto
|
| // creation failure if it's never successfully opened.
|
| @@ -917,7 +928,23 @@ public class MediaDrmBridge {
|
| return;
|
| }
|
|
|
| - processPendingCreateSessionData();
|
| + if (!mOriginSet) {
|
| + processPendingCreateSessionData();
|
| + return;
|
| + }
|
| +
|
| + mStorage.onProvisioned(new Callback<Boolean>() {
|
| + @Override
|
| + public void onResult(Boolean initSuccess) {
|
| + if (!initSuccess) {
|
| + Log.e(TAG, "Failed to initialize storage for origin");
|
| + release();
|
| + return;
|
| + }
|
| +
|
| + processPendingCreateSessionData();
|
| + }
|
| + });
|
| }
|
|
|
| /**
|
|
|