media_drm_credential_manager.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/browser/media/android/media_drm_credential_manager.h"
6
7#include "base/android/jni_android.h"
8#include "base/android/scoped_java_ref.h"
9#include "base/bind.h"
10#include "base/callback_helpers.h"
11#include "base/location.h"
12#include "base/message_loop/message_loop_proxy.h"
13#include "jni/MediaDrmCredentialManager_jni.h"
14#include "media/base/android/media_drm_bridge.h"
15#include "url/gurl.h"
16
17#include "widevine_cdm_version.h"  // In SHARED_INTERMEDIATE_DIR.
18
19using base::android::ScopedJavaGlobalRef;
20
21namespace {
22
23void MediaDrmCredentialManagerCallback(
24    const ScopedJavaGlobalRef<jobject>& j_media_drm_credential_manager_callback,
25    bool succeeded) {
26  JNIEnv* env = base::android::AttachCurrentThread();
27  content::Java_MediaDrmCredentialManagerCallback_onCredentialResetFinished(
28      env, j_media_drm_credential_manager_callback.obj(), succeeded);
29}
30
31}  // namespace
32
33namespace content {
34
35MediaDrmCredentialManager::MediaDrmCredentialManager() {};
36
37MediaDrmCredentialManager::~MediaDrmCredentialManager() {};
38
39// static
40MediaDrmCredentialManager* MediaDrmCredentialManager::GetInstance() {
41  return Singleton<MediaDrmCredentialManager>::get();
42}
43
44void MediaDrmCredentialManager::ResetCredentials(
45    const ResetCredentialsCB& reset_credentials_cb) {
46  // Ignore reset request if one is already in progress.
47  if (!reset_credentials_cb_.is_null())
48    return;
49
50  reset_credentials_cb_ = reset_credentials_cb;
51
52  // First reset the L3 credential.
53  if (!ResetCredentialsInternal(media::MediaDrmBridge::SECURITY_LEVEL_3)) {
54    // TODO(qinmin): We should post a task instead.
55    base::ResetAndReturn(&reset_credentials_cb_).Run(false);
56  }
57}
58
59// static
60void ResetCredentials(
61    JNIEnv* env,
62    jclass clazz,
63    jobject j_media_drm_credential_manager_callback) {
64  MediaDrmCredentialManager* media_drm_credential_manager =
65      MediaDrmCredentialManager::GetInstance();
66
67  ScopedJavaGlobalRef<jobject> j_scoped_media_drm_credential_manager_callback;
68  j_scoped_media_drm_credential_manager_callback.Reset(
69      env, j_media_drm_credential_manager_callback);
70
71  MediaDrmCredentialManager::ResetCredentialsCB callback_runner =
72      base::Bind(&MediaDrmCredentialManagerCallback,
73                 j_scoped_media_drm_credential_manager_callback);
74
75  media_drm_credential_manager->ResetCredentials(callback_runner);
76}
77
78void MediaDrmCredentialManager::OnResetCredentialsCompleted(
79    SecurityLevel security_level, bool success) {
80  if (security_level == media::MediaDrmBridge::SECURITY_LEVEL_3 && success) {
81    if (ResetCredentialsInternal(media::MediaDrmBridge::SECURITY_LEVEL_1))
82      return;
83    success = false;
84  }
85
86  base::ResetAndReturn(&reset_credentials_cb_).Run(success);
87  media_drm_bridge_.reset();
88}
89
90bool MediaDrmCredentialManager::ResetCredentialsInternal(
91    SecurityLevel security_level) {
92  media_drm_bridge_ =
93      media::MediaDrmBridge::Create(0, kWidevineKeySystem, GURL(), NULL);
94  if (!media_drm_bridge_)
95    return false;
96
97  ResetCredentialsCB reset_credentials_cb =
98      base::Bind(&MediaDrmCredentialManager::OnResetCredentialsCompleted,
99                 base::Unretained(this), security_level);
100
101  if (!media_drm_bridge_->SetSecurityLevel(security_level)) {
102    // No need to reset credentials for unsupported |security_level|.
103    base::MessageLoopProxy::current()->PostTask(
104        FROM_HERE, base::Bind(reset_credentials_cb, true));
105    return true;
106  }
107
108  media_drm_bridge_->ResetDeviceCredentials(reset_credentials_cb);
109  return true;
110}
111
112// static
113bool MediaDrmCredentialManager::RegisterMediaDrmCredentialManager(JNIEnv* env) {
114  return RegisterNativesImpl(env);
115}
116
117}  // namespace content
118