Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: ui/android/view_android.cc

Issue 2702413004: Revert "ViewRoot class for event forwarding on Android" (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/android/view_android.h ('k') | ui/android/view_android_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/android/view_android.h" 5 #include "ui/android/view_android.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/android/jni_android.h" 9 #include "base/android/jni_android.h"
10 #include "cc/layers/layer.h" 10 #include "cc/layers/layer.h"
11 #include "jni/ViewAndroidDelegate_jni.h" 11 #include "jni/ViewAndroidDelegate_jni.h"
12 #include "ui/android/window_android.h" 12 #include "ui/android/window_android.h"
13 #include "ui/display/display.h" 13 #include "ui/display/display.h"
14 #include "ui/display/screen.h" 14 #include "ui/display/screen.h"
15 15
16 namespace ui { 16 namespace ui {
17 17
18 using base::android::JavaRef; 18 using base::android::JavaRef;
19 using base::android::ScopedJavaLocalRef; 19 using base::android::ScopedJavaLocalRef;
20 20
21 // ViewAndroid::ScopedAndroidView
22 ViewAndroid::ScopedAnchorView::ScopedAnchorView( 21 ViewAndroid::ScopedAnchorView::ScopedAnchorView(
23 JNIEnv* env, 22 JNIEnv* env,
24 const JavaRef<jobject>& jview, 23 const JavaRef<jobject>& jview,
25 const JavaRef<jobject>& jdelegate) 24 const JavaRef<jobject>& jdelegate)
26 : view_(env, jview.obj()), delegate_(env, jdelegate.obj()) { 25 : view_(env, jview.obj()), delegate_(env, jdelegate.obj()) {
27 // If there's a view, then we need a delegate to remove it. 26 // If there's a view, then we need a delegate to remove it.
28 DCHECK(!jdelegate.is_null() || jview.is_null()); 27 DCHECK(!jdelegate.is_null() || jview.is_null());
29 } 28 }
30 29
31 ViewAndroid::ScopedAnchorView::ScopedAnchorView() { } 30 ViewAndroid::ScopedAnchorView::ScopedAnchorView() { }
(...skipping 30 matching lines...) Expand all
62 view_.reset(); 61 view_.reset();
63 delegate_.reset(); 62 delegate_.reset();
64 } 63 }
65 64
66 const base::android::ScopedJavaLocalRef<jobject> 65 const base::android::ScopedJavaLocalRef<jobject>
67 ViewAndroid::ScopedAnchorView::view() const { 66 ViewAndroid::ScopedAnchorView::view() const {
68 JNIEnv* env = base::android::AttachCurrentThread(); 67 JNIEnv* env = base::android::AttachCurrentThread();
69 return view_.get(env); 68 return view_.get(env);
70 } 69 }
71 70
72 // ViewAndroid 71 ViewAndroid::ViewAndroid(const JavaRef<jobject>& delegate)
73 ViewAndroid::ViewAndroid(ViewClient* client) : parent_(nullptr), 72 : parent_(nullptr),
74 client_(client) {} 73 delegate_(base::android::AttachCurrentThread(), delegate.obj()) {}
75 ViewAndroid::ViewAndroid() : ViewAndroid(nullptr) {} 74
75 ViewAndroid::ViewAndroid() : parent_(nullptr) {}
76 76
77 ViewAndroid::~ViewAndroid() { 77 ViewAndroid::~ViewAndroid() {
78 RemoveFromParent(); 78 RemoveFromParent();
79 79
80 auto children_copy = std::list<ViewAndroid*>(children_); 80 for (std::list<ViewAndroid*>::iterator it = children_.begin();
81 for (auto& child : children_copy) 81 it != children_.end(); it++) {
82 RemoveChild(child); 82 DCHECK_EQ((*it)->parent_, this);
83 (*it)->parent_ = nullptr;
84 }
83 } 85 }
84 86
85 void ViewAndroid::SetDelegate(const JavaRef<jobject>& delegate) { 87 void ViewAndroid::SetDelegate(const JavaRef<jobject>& delegate) {
86 // A ViewAndroid may have its own delegate or otherwise will
87 // use the next available parent's delegate.
88 JNIEnv* env = base::android::AttachCurrentThread(); 88 JNIEnv* env = base::android::AttachCurrentThread();
89 delegate_ = JavaObjectWeakGlobalRef(env, delegate); 89 delegate_ = JavaObjectWeakGlobalRef(env, delegate);
90 } 90 }
91 91
92 void ViewAndroid::AddChild(ViewAndroid* child) { 92 void ViewAndroid::AddChild(ViewAndroid* child) {
93 DCHECK(child); 93 DCHECK(child);
94 DCHECK(!child->IsViewRoot()); // ViewRoot cannot be a child.
95 DCHECK(std::find(children_.begin(), children_.end(), child) == 94 DCHECK(std::find(children_.begin(), children_.end(), child) ==
96 children_.end()); 95 children_.end());
97 96
98 // The new child goes to the top, which is the end of the list.
99 children_.push_back(child); 97 children_.push_back(child);
100 if (child->parent_) 98 if (child->parent_)
101 child->RemoveFromParent(); 99 child->RemoveFromParent();
102 child->parent_ = this; 100 child->parent_ = this;
103 } 101 }
104 102
105 void ViewAndroid::MoveToTop(ViewAndroid* child) {
106 DCHECK(child);
107 auto it = std::find(children_.begin(), children_.end(), child);
108 DCHECK(it != children_.end());
109
110 // Top element is placed at the end of the list.
111 if (*it != children_.back())
112 children_.splice(children_.rbegin().base(), children_, it);
113 }
114
115 void ViewAndroid::RemoveFromParent() { 103 void ViewAndroid::RemoveFromParent() {
116 if (parent_) 104 if (parent_)
117 parent_->RemoveChild(this); 105 parent_->RemoveChild(this);
118 } 106 }
119 107
120 void ViewAndroid::SetLayout(int x,
121 int y,
122 int width,
123 int height,
124 bool match_parent) {
125 DCHECK(!match_parent || (x == 0 && y == 0 && width == 0 && height == 0));
126 origin_.SetPoint(x, y);
127 size_.SetSize(width, height);
128 match_parent_ = match_parent;
129 }
130
131 ViewAndroid::ScopedAnchorView ViewAndroid::AcquireAnchorView() { 108 ViewAndroid::ScopedAnchorView ViewAndroid::AcquireAnchorView() {
132 ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate()); 109 ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate());
133 if (delegate.is_null()) 110 if (delegate.is_null())
134 return ViewAndroid::ScopedAnchorView(); 111 return ViewAndroid::ScopedAnchorView();
135 112
136 JNIEnv* env = base::android::AttachCurrentThread(); 113 JNIEnv* env = base::android::AttachCurrentThread();
137 return ViewAndroid::ScopedAnchorView( 114 return ViewAndroid::ScopedAnchorView(
138 env, Java_ViewAndroidDelegate_acquireView(env, delegate), delegate); 115 env, Java_ViewAndroidDelegate_acquireView(env, delegate), delegate);
139 } 116 }
140 117
141 float ViewAndroid::GetDipScale() {
142 return display::Screen::GetScreen()
143 ->GetDisplayNearestWindow(this)
144 .device_scale_factor();
145 }
146
147 void ViewAndroid::SetAnchorRect(const JavaRef<jobject>& anchor, 118 void ViewAndroid::SetAnchorRect(const JavaRef<jobject>& anchor,
148 const gfx::RectF& bounds) { 119 const gfx::RectF& bounds) {
149 ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate()); 120 ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate());
150 if (delegate.is_null()) 121 if (delegate.is_null())
151 return; 122 return;
152 123
153 float scale = GetDipScale(); 124 float scale = display::Screen::GetScreen()
125 ->GetDisplayNearestWindow(this)
126 .device_scale_factor();
154 int left_margin = std::round(bounds.x() * scale); 127 int left_margin = std::round(bounds.x() * scale);
155 int top_margin = std::round((content_offset().y() + bounds.y()) * scale); 128 int top_margin = std::round((content_offset().y() + bounds.y()) * scale);
156 JNIEnv* env = base::android::AttachCurrentThread(); 129 JNIEnv* env = base::android::AttachCurrentThread();
157 Java_ViewAndroidDelegate_setViewPosition( 130 Java_ViewAndroidDelegate_setViewPosition(
158 env, delegate, anchor, bounds.x(), bounds.y(), bounds.width(), 131 env, delegate, anchor, bounds.x(), bounds.y(), bounds.width(),
159 bounds.height(), scale, left_margin, top_margin); 132 bounds.height(), scale, left_margin, top_margin);
160 } 133 }
161 134
162 ScopedJavaLocalRef<jobject> ViewAndroid::GetContainerView() { 135 ScopedJavaLocalRef<jobject> ViewAndroid::GetContainerView() {
163 ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate()); 136 ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate());
(...skipping 30 matching lines...) Expand all
194 } 167 }
195 168
196 cc::Layer* ViewAndroid::GetLayer() const { 169 cc::Layer* ViewAndroid::GetLayer() const {
197 return layer_.get(); 170 return layer_.get();
198 } 171 }
199 172
200 void ViewAndroid::SetLayer(scoped_refptr<cc::Layer> layer) { 173 void ViewAndroid::SetLayer(scoped_refptr<cc::Layer> layer) {
201 layer_ = layer; 174 layer_ = layer;
202 } 175 }
203 176
204 ViewAndroid* ViewAndroid::GetViewRoot() {
205 return parent_ ? parent_->GetViewRoot() : nullptr;
206 }
207
208 bool ViewAndroid::IsViewRoot() {
209 return GetViewRoot() == this;
210 }
211
212 bool ViewAndroid::StartDragAndDrop(const JavaRef<jstring>& jtext, 177 bool ViewAndroid::StartDragAndDrop(const JavaRef<jstring>& jtext,
213 const JavaRef<jobject>& jimage) { 178 const JavaRef<jobject>& jimage) {
214 ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate()); 179 ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate());
215 if (delegate.is_null()) 180 if (delegate.is_null())
216 return false; 181 return false;
217 JNIEnv* env = base::android::AttachCurrentThread(); 182 JNIEnv* env = base::android::AttachCurrentThread();
218 return Java_ViewAndroidDelegate_startDragAndDrop(env, delegate, jtext, 183 return Java_ViewAndroidDelegate_startDragAndDrop(env, delegate, jtext,
219 jimage); 184 jimage);
220 } 185 }
221 186
222 bool ViewAndroid::OnTouchEventInternal(const MotionEventData& event) {
223 if (!children_.empty()) {
224 const MotionEventData& e =
225 origin_.IsOrigin() ? event : event.Offset(-origin_.x(), -origin_.y());
226
227 for (auto it = children_.rbegin(); it != children_.rend(); ++it) {
228 bool matched = (*it)->match_parent_;
229 if (!matched) {
230 gfx::Rect bound((*it)->origin_, (*it)->size_);
231 matched = bound.Contains(e.GetX(), e.GetY());
232 }
233 if (matched && (*it)->OnTouchEventInternal(e))
234 return true;
235 }
236 }
237
238 if (client_ && client_->OnTouchEvent(event))
239 return true;
240
241 return false;
242 }
243
244 } // namespace ui 187 } // namespace ui
OLDNEW
« no previous file with comments | « ui/android/view_android.h ('k') | ui/android/view_android_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698