Index: media/base/android/dialog_surface_holder.cc |
diff --git a/media/base/android/dialog_surface_holder.cc b/media/base/android/dialog_surface_holder.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..be0a63829bd6bbd67c6c2055db4efe158571a006 |
--- /dev/null |
+++ b/media/base/android/dialog_surface_holder.cc |
@@ -0,0 +1,82 @@ |
+// Copyright 2016 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 "media/base/android/dialog_surface_holder.h" |
+ |
+#include <algorithm> |
+#include <limits> |
+#include <map> |
+#include <memory> |
+#include <utility> |
+ |
+#include "base/android/build_info.h" |
+#include "base/android/jni_android.h" |
+#include "base/android/jni_array.h" |
+#include "base/android/jni_string.h" |
+#include "base/lazy_instance.h" |
+#include "base/logging.h" |
+#include "base/numerics/safe_conversions.h" |
+#include "base/strings/string_util.h" |
+#include "base/synchronization/lock.h" |
+#include "base/synchronization/waitable_event.h" |
+#include "jni/DialogSurfaceHolderWrapper_jni.h" |
+#include "media/base/android/dialog_surface_callback.h" |
+#include "media/base/android/dialog_surface_manager.h" |
+#include "media/base/bind_to_current_loop.h" |
+#include "media/base/bit_reader.h" |
+#include "media/base/decrypt_config.h" |
+ |
+using base::android::AttachCurrentThread; |
+using base::android::JavaRef; |
+using base::android::ScopedJavaLocalRef; |
+ |
+namespace media { |
+ |
+DialogSurfaceHolder::DialogSurfaceHolder( |
+ const JavaRef<jobject>& unwrapped_holder, |
+ std::unique_ptr<DialogSurfaceCallback>&& wrapped_callback) |
+ : wrapped_callback_(std::move(wrapped_callback)) { |
+ JNIEnv* env = AttachCurrentThread(); |
+ CHECK(env); |
+ j_wrapped_surface_.Reset( |
+ env, |
+ Java_DialogSurfaceHolderWrapper_wrap(env, unwrapped_holder.obj()).obj()); |
+} |
+ |
+DialogSurfaceHolder::~DialogSurfaceHolder() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ JNIEnv* env = AttachCurrentThread(); |
+ CHECK(env); |
+ if (j_wrapped_surface_.obj()) |
+ Java_DialogSurfaceHolderWrapper_release(env, j_wrapped_surface_.obj()); |
+} |
+ |
+void DialogSurfaceHolder::ScheduleLayout(const Config& config) { |
+ DCHECK(CalledOnValidThread()); |
+ JNIEnv* env = AttachCurrentThread(); |
+ CHECK(env); |
+ Java_DialogSurfaceHolderWrapper_scheduleLayoutSurface( |
+ env, j_wrapped_surface_.obj(), config.rect.x(), config.rect.y(), |
+ config.rect.width(), config.rect.height()); |
+} |
+ |
+gl::ScopedJavaSurface DialogSurfaceHolder::GetSurface() { |
+ DCHECK(CalledOnValidThread()); |
+ JNIEnv* env = AttachCurrentThread(); |
+ CHECK(env); |
+ ScopedJavaLocalRef<jobject> surface( |
+ Java_DialogSurfaceHolderWrapper_getSurface(env, |
+ j_wrapped_surface_.obj())); |
+ if (surface.obj() == nullptr) |
+ return gl::ScopedJavaSurface(); |
+ |
+ return gl::ScopedJavaSurface::AcquireExternalSurface(surface.obj()); |
+} |
+ |
+bool DialogSurfaceHolder::CalledOnValidThread() const { |
+ return thread_checker_.CalledOnValidThread(); |
+} |
+ |
+} // namespace media |