Index: ui/android/view_android.cc |
diff --git a/ui/android/view_android.cc b/ui/android/view_android.cc |
index 3771c37282d3359e8febec8ebcbb99db1b53a260..8adbe2f5e9ccbaa9ce1f8bd3a81ecfd1ba224d9f 100644 |
--- a/ui/android/view_android.cc |
+++ b/ui/android/view_android.cc |
@@ -8,6 +8,9 @@ |
#include "base/android/jni_android.h" |
#include "cc/layers/layer.h" |
+#include "jni/ViewAndroid_jni.h" |
+#include "ui/android/window_android.h" |
+#include "ui/gfx/android/device_display_info.h" |
namespace ui { |
@@ -15,12 +18,22 @@ using base::android::AttachCurrentThread; |
using base::android::JavaRef; |
using base::android::ScopedJavaLocalRef; |
-ViewAndroid::ViewAndroid(const JavaRef<jobject>& delegate, |
+ViewAndroid::ViewAndroid(const JavaRef<jobject>& context, |
+ const JavaRef<jobject>& delegate, |
WindowAndroid* root_window) |
- : parent_(nullptr), window_(root_window), delegate_(delegate) {} |
+ : parent_(nullptr) |
+ , window_(root_window) |
+ , java_ref_(Java_ViewAndroid_create(base::android::AttachCurrentThread(), |
+ context.obj(), |
+ delegate.obj())) |
+ , delegate_(delegate) {} |
ViewAndroid::ViewAndroid() : parent_(nullptr), window_(nullptr) {} |
+bool ViewAndroid::RegisterWindowAndroid(JNIEnv* env) { |
+ return RegisterNativesImpl(env); |
+} |
+ |
ViewAndroid::~ViewAndroid() { |
if (parent_) |
parent_->RemoveChild(this); |
@@ -55,6 +68,42 @@ void ViewAndroid::RemoveChild(ViewAndroid* child) { |
child->parent_ = nullptr; |
} |
+ScopedJavaLocalRef<jobject> |
+ViewAndroid::AcquireAnchorView() { |
+ if (delegate_.is_null()) |
no sievers
2016/07/14 23:14:32
Doesn't it need to go to the parent's delegate if
Jinsuk Kim
2016/07/15 05:46:27
Makes sense. In fact other methods |SetAnchorRect|
|
+ return base::android::ScopedJavaLocalRef<jobject>(); |
+ |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ return ScopedJavaLocalRef<jobject>( |
+ Java_ViewAndroid_acquireAnchorView(env, |
+ java_ref_.obj())); |
+} |
+ |
+void ViewAndroid::SetAnchorRect(const jobject& anchor, |
+ const gfx::RectF& bounds) { |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ gfx::DeviceDisplayInfo device_info; |
+ float scale = device_info.GetDIPScale(); |
+ int left_margin = std::round(bounds.x() * scale); |
+ float content_offset_y_pix = GetWindowAndroid()->content_offset().y(); |
no sievers
2016/07/14 23:14:32
nit: can you put a TODO? content_offset() should b
Jinsuk Kim
2016/07/15 05:46:27
Meant to do it in this CL but it involved changes
|
+ int top_margin = std::round(content_offset_y_pix + bounds.y() * scale); |
+ Java_ViewAndroid_setAnchorViewPosition(env, |
+ java_ref_.obj(), |
+ anchor, |
+ bounds.x(), |
+ bounds.y(), |
+ bounds.width(), |
+ bounds.height(), |
+ scale, |
+ left_margin, |
+ top_margin); |
+} |
+ |
+void ViewAndroid::RemoveAnchorView(const jobject& anchor) { |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ Java_ViewAndroid_removeAnchorView(env, java_ref_.obj(), anchor); |
+} |
+ |
WindowAndroid* ViewAndroid::GetWindowAndroid() const { |
if (window_) |
return window_; |
@@ -67,14 +116,6 @@ void ViewAndroid::SetWindowAndroid(WindowAndroid* root_window) { |
DCHECK(parent_ == nullptr) << "Children shouldn't have a root window"; |
} |
-const JavaRef<jobject>& ViewAndroid::GetViewAndroidDelegate() |
- const { |
- if (!delegate_.is_null()) |
- return delegate_; |
- |
- return parent_ ? parent_->GetViewAndroidDelegate() : delegate_; |
no sievers
2016/07/14 23:14:32
see above, I think you want to keep the recursion
Jinsuk Kim
2016/07/15 05:46:27
Done.
|
-} |
- |
cc::Layer* ViewAndroid::GetLayer() const { |
return layer_.get(); |
} |