| // Copyright 2013 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. |
| |
| #include "content/browser/media/android/media_drm_credential_manager.h" |
| |
| #include "base/android/jni_android.h" |
| #include "base/android/scoped_java_ref.h" |
| #include "base/bind.h" |
| #include "base/callback_helpers.h" |
| #include "base/location.h" |
| #include "base/message_loop/message_loop_proxy.h" |
| #include "jni/MediaDrmCredentialManager_jni.h" |
| #include "media/base/android/media_drm_bridge.h" |
| #include "url/gurl.h" |
| |
| #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. |
| |
| using base::android::ScopedJavaGlobalRef; |
| |
| namespace { |
| |
| void MediaDrmCredentialManagerCallback( |
| const ScopedJavaGlobalRef<jobject>& j_media_drm_credential_manager_callback, |
| bool succeeded) { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| content::Java_MediaDrmCredentialManagerCallback_onCredentialResetFinished( |
| env, j_media_drm_credential_manager_callback.obj(), succeeded); |
| } |
| |
| } // namespace |
| |
| namespace content { |
| |
| MediaDrmCredentialManager::MediaDrmCredentialManager() {}; |
| |
| MediaDrmCredentialManager::~MediaDrmCredentialManager() {}; |
| |
| // static |
| MediaDrmCredentialManager* MediaDrmCredentialManager::GetInstance() { |
| return Singleton<MediaDrmCredentialManager>::get(); |
| } |
| |
| void MediaDrmCredentialManager::ResetCredentials( |
| const ResetCredentialsCB& reset_credentials_cb) { |
| // Ignore reset request if one is already in progress. |
| if (!reset_credentials_cb_.is_null()) |
| return; |
| |
| reset_credentials_cb_ = reset_credentials_cb; |
| |
| // First reset the L3 credential. |
| if (!ResetCredentialsInternal(media::MediaDrmBridge::SECURITY_LEVEL_3)) { |
| // TODO(qinmin): We should post a task instead. |
| base::ResetAndReturn(&reset_credentials_cb_).Run(false); |
| } |
| } |
| |
| // static |
| void ResetCredentials( |
| JNIEnv* env, |
| jclass clazz, |
| jobject j_media_drm_credential_manager_callback) { |
| MediaDrmCredentialManager* media_drm_credential_manager = |
| MediaDrmCredentialManager::GetInstance(); |
| |
| ScopedJavaGlobalRef<jobject> j_scoped_media_drm_credential_manager_callback; |
| j_scoped_media_drm_credential_manager_callback.Reset( |
| env, j_media_drm_credential_manager_callback); |
| |
| MediaDrmCredentialManager::ResetCredentialsCB callback_runner = |
| base::Bind(&MediaDrmCredentialManagerCallback, |
| j_scoped_media_drm_credential_manager_callback); |
| |
| media_drm_credential_manager->ResetCredentials(callback_runner); |
| } |
| |
| void MediaDrmCredentialManager::OnResetCredentialsCompleted( |
| SecurityLevel security_level, bool success) { |
| if (security_level == media::MediaDrmBridge::SECURITY_LEVEL_3 && success) { |
| if (ResetCredentialsInternal(media::MediaDrmBridge::SECURITY_LEVEL_1)) |
| return; |
| success = false; |
| } |
| |
| base::ResetAndReturn(&reset_credentials_cb_).Run(success); |
| media_drm_bridge_.reset(); |
| } |
| |
| bool MediaDrmCredentialManager::ResetCredentialsInternal( |
| SecurityLevel security_level) { |
| media_drm_bridge_ = |
| media::MediaDrmBridge::CreateSessionless(kWidevineKeySystem); |
| if (!media_drm_bridge_) |
| return false; |
| |
| ResetCredentialsCB reset_credentials_cb = |
| base::Bind(&MediaDrmCredentialManager::OnResetCredentialsCompleted, |
| base::Unretained(this), security_level); |
| |
| if (!media_drm_bridge_->SetSecurityLevel(security_level)) { |
| // No need to reset credentials for unsupported |security_level|. |
| base::MessageLoopProxy::current()->PostTask( |
| FROM_HERE, base::Bind(reset_credentials_cb, true)); |
| return true; |
| } |
| |
| media_drm_bridge_->ResetDeviceCredentials(reset_credentials_cb); |
| return true; |
| } |
| |
| // static |
| bool MediaDrmCredentialManager::RegisterMediaDrmCredentialManager(JNIEnv* env) { |
| return RegisterNativesImpl(env); |
| } |
| |
| } // namespace content |