Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / ui / base / android / window_android.cc
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 "ui/base/android/window_android.h"
6
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_array.h"
9 #include "base/android/jni_weak_ref.h"
10 #include "base/android/scoped_java_ref.h"
11 #include "jni/WindowAndroid_jni.h"
12 #include "ui/base/android/window_android_compositor.h"
13 #include "ui/base/android/window_android_observer.h"
14
15 namespace ui {
16
17 using base::android::AttachCurrentThread;
18 using base::android::ScopedJavaLocalRef;
19
20 WindowAndroid::WindowAndroid(JNIEnv* env, jobject obj, jlong vsync_period)
21   : weak_java_window_(env, obj),
22     compositor_(NULL),
23     vsync_period_(base::TimeDelta::FromInternalValue(vsync_period)) {
24 }
25
26 void WindowAndroid::Destroy(JNIEnv* env, jobject obj) {
27   delete this;
28 }
29
30 ScopedJavaLocalRef<jobject> WindowAndroid::GetJavaObject() {
31   return weak_java_window_.get(AttachCurrentThread());
32 }
33
34 bool WindowAndroid::RegisterWindowAndroid(JNIEnv* env) {
35   return RegisterNativesImpl(env);
36 }
37
38 WindowAndroid::~WindowAndroid() {
39   DCHECK(!compositor_);
40   FOR_EACH_OBSERVER(
41       WindowAndroidObserver, observer_list_, OnWillDestroyWindow());
42 }
43
44 bool WindowAndroid::GrabSnapshot(
45     int content_x, int content_y, int width, int height,
46     std::vector<unsigned char>* png_representation) {
47   JNIEnv* env = AttachCurrentThread();
48   ScopedJavaLocalRef<jbyteArray> result =
49       Java_WindowAndroid_grabSnapshot(env, GetJavaObject().obj(),
50                                       content_x + content_offset_.x(),
51                                       content_y + content_offset_.y(),
52                                       width, height);
53   if (result.is_null())
54     return false;
55   base::android::JavaByteArrayToByteVector(
56       env, result.obj(), png_representation);
57   return true;
58 }
59
60 void WindowAndroid::OnCompositingDidCommit() {
61   FOR_EACH_OBSERVER(WindowAndroidObserver,
62                     observer_list_,
63                     OnCompositingDidCommit());
64 }
65
66 void WindowAndroid::AddObserver(WindowAndroidObserver* observer) {
67   if (!observer_list_.HasObserver(observer))
68     observer_list_.AddObserver(observer);
69 }
70
71 void WindowAndroid::RemoveObserver(WindowAndroidObserver* observer) {
72   observer_list_.RemoveObserver(observer);
73 }
74
75 void WindowAndroid::AttachCompositor(WindowAndroidCompositor* compositor) {
76   if (compositor_ && compositor != compositor_)
77     DetachCompositor();
78
79   compositor_ = compositor;
80   FOR_EACH_OBSERVER(WindowAndroidObserver,
81                     observer_list_,
82                     OnAttachCompositor());
83 }
84
85 void WindowAndroid::DetachCompositor() {
86   compositor_ = NULL;
87   FOR_EACH_OBSERVER(WindowAndroidObserver,
88                     observer_list_,
89                     OnDetachCompositor());
90   observer_list_.Clear();
91 }
92
93 void WindowAndroid::RequestVSyncUpdate() {
94   JNIEnv* env = AttachCurrentThread();
95   Java_WindowAndroid_requestVSyncUpdate(env, GetJavaObject().obj());
96 }
97
98 void WindowAndroid::OnVSync(JNIEnv* env, jobject obj, jlong time_micros) {
99   FOR_EACH_OBSERVER(
100       WindowAndroidObserver,
101       observer_list_,
102       OnVSync(base::TimeTicks::FromInternalValue(time_micros), vsync_period_));
103 }
104
105 // ----------------------------------------------------------------------------
106 // Native JNI methods
107 // ----------------------------------------------------------------------------
108
109 jlong Init(JNIEnv* env, jobject obj, jlong vsync_period) {
110   WindowAndroid* window = new WindowAndroid(env, obj, vsync_period);
111   return reinterpret_cast<intptr_t>(window);
112 }
113
114 }  // namespace ui