| Index: content/browser/android/popup_touch_handle_drawable.cc
|
| diff --git a/content/browser/android/popup_touch_handle_drawable.cc b/content/browser/android/popup_touch_handle_drawable.cc
|
| index aef23f8fb0f9696f94bcf038d5320cd64fa345c6..7791ddfe452faf63e9b81d2133e810f86057b0f1 100644
|
| --- a/content/browser/android/popup_touch_handle_drawable.cc
|
| +++ b/content/browser/android/popup_touch_handle_drawable.cc
|
| @@ -4,59 +4,89 @@
|
|
|
| #include "content/browser/android/popup_touch_handle_drawable.h"
|
|
|
| +#include "content/public/browser/android/content_view_core.h"
|
| #include "jni/PopupTouchHandleDrawable_jni.h"
|
|
|
| namespace content {
|
|
|
| -PopupTouchHandleDrawable::PopupTouchHandleDrawable(
|
| - base::android::ScopedJavaLocalRef<jobject> drawable,
|
| - float dpi_scale)
|
| - : dpi_scale_(dpi_scale), drawable_(drawable) {
|
| - DCHECK(drawable.obj());
|
| +// static
|
| +scoped_ptr<PopupTouchHandleDrawable> PopupTouchHandleDrawable::Create(
|
| + ContentViewCore* content_view_core) {
|
| + DCHECK(content_view_core);
|
| + base::android::ScopedJavaLocalRef<jobject> content_view_core_obj =
|
| + content_view_core->GetJavaObject();
|
| + if (content_view_core_obj.is_null())
|
| + return nullptr;
|
| + JNIEnv* env = base::android::AttachCurrentThread();
|
| + base::android::ScopedJavaLocalRef<jobject> drawable_obj(
|
| + Java_PopupTouchHandleDrawable_create(env, content_view_core_obj.obj()));
|
| + return scoped_ptr<PopupTouchHandleDrawable>(new PopupTouchHandleDrawable(
|
| + env, drawable_obj.obj(), content_view_core->GetDpiScale()));
|
| +}
|
| +
|
| +PopupTouchHandleDrawable::PopupTouchHandleDrawable(JNIEnv* env,
|
| + jobject obj,
|
| + float dpi_scale)
|
| + : java_ref_(env, obj), dpi_scale_(dpi_scale) {
|
| + DCHECK(!java_ref_.is_empty());
|
| }
|
|
|
| PopupTouchHandleDrawable::~PopupTouchHandleDrawable() {
|
| - // Explicitly disabling ensures that any external references to the Java
|
| - // object are cleared, allowing it to be GC'ed in a timely fashion.
|
| - SetEnabled(false);
|
| + JNIEnv* env = base::android::AttachCurrentThread();
|
| + ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
|
| + if (!obj.is_null())
|
| + Java_PopupTouchHandleDrawable_destroy(env, obj.obj());
|
| }
|
|
|
| void PopupTouchHandleDrawable::SetEnabled(bool enabled) {
|
| JNIEnv* env = base::android::AttachCurrentThread();
|
| + ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
|
| + if (obj.is_null())
|
| + return;
|
| if (enabled)
|
| - Java_PopupTouchHandleDrawable_show(env, drawable_.obj());
|
| + Java_PopupTouchHandleDrawable_show(env, obj.obj());
|
| else
|
| - Java_PopupTouchHandleDrawable_hide(env, drawable_.obj());
|
| + Java_PopupTouchHandleDrawable_hide(env, obj.obj());
|
| }
|
|
|
| void PopupTouchHandleDrawable::SetOrientation(
|
| ui::TouchHandleOrientation orientation) {
|
| JNIEnv* env = base::android::AttachCurrentThread();
|
| - jobject obj = drawable_.obj();
|
| - Java_PopupTouchHandleDrawable_setOrientation(env, obj,
|
| - static_cast<int>(orientation));
|
| + ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
|
| + if (!obj.is_null()) {
|
| + Java_PopupTouchHandleDrawable_setOrientation(env, obj.obj(),
|
| + static_cast<int>(orientation));
|
| + }
|
| }
|
|
|
| void PopupTouchHandleDrawable::SetAlpha(float alpha) {
|
| JNIEnv* env = base::android::AttachCurrentThread();
|
| + ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
|
| bool visible = alpha > 0;
|
| - Java_PopupTouchHandleDrawable_setVisible(env, drawable_.obj(), visible);
|
| + if (!obj.is_null())
|
| + Java_PopupTouchHandleDrawable_setVisible(env, obj.obj(), visible);
|
| }
|
|
|
| void PopupTouchHandleDrawable::SetFocus(const gfx::PointF& position) {
|
| const gfx::PointF position_pix = gfx::ScalePoint(position, dpi_scale_);
|
| JNIEnv* env = base::android::AttachCurrentThread();
|
| - Java_PopupTouchHandleDrawable_setFocus(
|
| - env, drawable_.obj(), position_pix.x(), position_pix.y());
|
| + ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
|
| + if (!obj.is_null()) {
|
| + Java_PopupTouchHandleDrawable_setFocus(env, obj.obj(), position_pix.x(),
|
| + position_pix.y());
|
| + }
|
| }
|
|
|
| gfx::RectF PopupTouchHandleDrawable::GetVisibleBounds() const {
|
| JNIEnv* env = base::android::AttachCurrentThread();
|
| + ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
|
| + if (obj.is_null())
|
| + return gfx::RectF();
|
| gfx::RectF unscaled_rect(
|
| - Java_PopupTouchHandleDrawable_getPositionX(env, drawable_.obj()),
|
| - Java_PopupTouchHandleDrawable_getPositionY(env, drawable_.obj()),
|
| - Java_PopupTouchHandleDrawable_getVisibleWidth(env, drawable_.obj()),
|
| - Java_PopupTouchHandleDrawable_getVisibleHeight(env, drawable_.obj()));
|
| + Java_PopupTouchHandleDrawable_getPositionX(env, obj.obj()),
|
| + Java_PopupTouchHandleDrawable_getPositionY(env, obj.obj()),
|
| + Java_PopupTouchHandleDrawable_getVisibleWidth(env, obj.obj()),
|
| + Java_PopupTouchHandleDrawable_getVisibleHeight(env, obj.obj()));
|
| return gfx::ScaleRect(unscaled_rect, 1.f / dpi_scale_);
|
| }
|
|
|
|
|