Chromium Code Reviews| Index: ui/android/view_android.cc |
| diff --git a/ui/android/view_android.cc b/ui/android/view_android.cc |
| index 6334526014b0a0450834a4ab4b2ce0189d5342f3..1530fe31120c7a86bc5f4bfcd71547f4587025da 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/ViewAndroidDelegate_jni.h" |
| +#include "ui/android/window_android.h" |
| +#include "ui/base/layout.h" |
| namespace ui { |
| @@ -15,12 +18,47 @@ using base::android::AttachCurrentThread; |
| using base::android::JavaRef; |
| using base::android::ScopedJavaLocalRef; |
| +ViewAndroid::ScopedAnchorView::ScopedAnchorView( |
| + const JavaRef<jobject>& jview, |
| + const JavaRef<jobject>& jdelegate) |
| + : view_(jview), delegate_(jdelegate) { } |
|
no sievers
2016/07/19 22:29:30
nit: DCHECK(!jdelegate.is_null() || jview.is_null(
Jinsuk Kim
2016/07/20 00:55:18
Done.
|
| + |
| +ViewAndroid::ScopedAnchorView::ScopedAnchorView() |
| + : ScopedAnchorView(nullptr, nullptr) { } |
| + |
| +ViewAndroid::ScopedAnchorView::ScopedAnchorView(ScopedAnchorView&& other) { |
| + JNIEnv* env = base::android::AttachCurrentThread(); |
| + view_.Reset(env, other.view_.Release()); |
| + delegate_.Reset(env, other.delegate_.Release()); |
| +} |
| + |
| +ViewAndroid::ScopedAnchorView& |
| +ViewAndroid::ScopedAnchorView::operator=(ScopedAnchorView&& other) { |
| + JNIEnv* env = base::android::AttachCurrentThread(); |
|
no sievers
2016/07/19 22:29:30
only assign if (this != &other)
Jinsuk Kim
2016/07/20 00:55:18
Done.
|
| + view_.Reset(env, other.view_.Release()); |
| + delegate_.Reset(env, other.delegate_.Release()); |
| + return *this; |
| +} |
| + |
| +ViewAndroid::ScopedAnchorView::~ScopedAnchorView() { |
| + JNIEnv* env = base::android::AttachCurrentThread(); |
| + if (!delegate_.is_null()) |
|
no sievers
2016/07/19 22:29:30
better to check if (!view_.is_null()) (and see DCH
Jinsuk Kim
2016/07/20 00:55:18
Done.
|
| + Java_ViewAndroidDelegate_removeView(env, delegate_.obj(), view_.obj()); |
| + view_.Reset(); |
| +} |
| + |
| ViewAndroid::ViewAndroid(const JavaRef<jobject>& delegate, |
| WindowAndroid* root_window) |
| - : parent_(nullptr), window_(root_window), delegate_(delegate) {} |
| + : parent_(nullptr) |
| + , window_(root_window) |
| + , delegate_(delegate) {} |
| ViewAndroid::ViewAndroid() : parent_(nullptr), window_(nullptr) {} |
| +bool ViewAndroid::RegisterViewAndroid(JNIEnv* env) { |
| + return RegisterNativesImpl(env); |
| +} |
| + |
| ViewAndroid::~ViewAndroid() { |
| if (parent_) |
| parent_->RemoveChild(this); |
| @@ -55,6 +93,52 @@ void ViewAndroid::RemoveChild(ViewAndroid* child) { |
| child->parent_ = nullptr; |
| } |
| + |
| +ViewAndroid::ScopedAnchorView ViewAndroid::AcquireAnchorView() { |
| + ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate()); |
| + if (delegate.is_null()) |
| + return ViewAndroid::ScopedAnchorView(); |
| + |
| + JNIEnv* env = base::android::AttachCurrentThread(); |
| + return ViewAndroid::ScopedAnchorView( |
| + Java_ViewAndroidDelegate_acquireView(env, delegate.obj()), |
| + delegate); |
| +} |
| + |
| +void ViewAndroid::SetAnchorRect(const JavaRef<jobject>& anchor, |
| + const gfx::RectF& bounds) { |
| + if (bounds.IsEmpty()) return; |
| + |
| + ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate()); |
| + if (delegate.is_null()) |
| + return; |
| + |
| + JNIEnv* env = base::android::AttachCurrentThread(); |
| + float scale = GetScaleFactorForNativeView(this); |
| + int left_margin = std::round(bounds.x() * scale); |
| + // TODO(jinsukkim): Move content_offset() to ViewAndroid, since it's |
| + // specific to a given web contents/render widget. |
| + float content_offset_y_pix = GetWindowAndroid()->content_offset().y(); |
| + int top_margin = std::round(content_offset_y_pix + bounds.y() * scale); |
| + Java_ViewAndroidDelegate_setViewPosition(env, |
| + delegate.obj(), |
| + anchor.obj(), |
| + bounds.x(), |
| + bounds.y(), |
| + bounds.width(), |
| + bounds.height(), |
| + scale, |
| + left_margin, |
| + top_margin); |
| +} |
| + |
| +const JavaRef<jobject>& ViewAndroid::GetViewAndroidDelegate() const { |
| + if (!delegate_.is_null()) |
| + return delegate_; |
| + |
| + return parent_ ? parent_->GetViewAndroidDelegate() : delegate_; |
| +} |
| + |
| WindowAndroid* ViewAndroid::GetWindowAndroid() const { |
| if (window_) |
| return window_; |
| @@ -67,14 +151,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_; |
| -} |
| - |
| cc::Layer* ViewAndroid::GetLayer() const { |
| return layer_.get(); |
| } |