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

Side by Side Diff: content/browser/android/overscroll_controller_android.cc

Issue 2884423003: Use scroll-boundary-behavior to control overscroll-refresh/glow on android. (Closed)
Patch Set: Mark OverscrollRefresh() as protected. Created 3 years, 4 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "content/browser/android/overscroll_controller_android.h" 5 #include "content/browser/android/overscroll_controller_android.h"
6 6
7 #include "base/android/build_info.h" 7 #include "base/android/build_info.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "cc/layers/layer.h" 10 #include "cc/layers/layer.h"
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 88 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
89 switches::kDisablePullToRefreshEffect)) { 89 switches::kDisablePullToRefreshEffect)) {
90 return nullptr; 90 return nullptr;
91 } 91 }
92 92
93 return base::MakeUnique<OverscrollRefresh>(overscroll_refresh_handler); 93 return base::MakeUnique<OverscrollRefresh>(overscroll_refresh_handler);
94 } 94 }
95 95
96 } // namespace 96 } // namespace
97 97
98 // static
99 OverscrollControllerAndroid* OverscrollControllerAndroid::CreateForTests(
100 ui::WindowAndroidCompositor* compositor,
101 float dpi_scale,
102 std::unique_ptr<ui::OverscrollGlow> glow_effect,
103 std::unique_ptr<ui::OverscrollRefresh> refresh_effect) {
104 return (new OverscrollControllerAndroid(compositor, dpi_scale,
105 std::move(glow_effect),
106 std::move(refresh_effect)));
107 }
108
109 OverscrollControllerAndroid::OverscrollControllerAndroid(
110 ui::WindowAndroidCompositor* compositor,
111 float dpi_scale,
112 std::unique_ptr<ui::OverscrollGlow> glow_effect,
113 std::unique_ptr<ui::OverscrollRefresh> refresh_effect)
114 : compositor_(compositor),
115 dpi_scale_(dpi_scale),
116 enabled_(true),
117 glow_effect_(std::move(glow_effect)),
118 refresh_effect_(std::move(refresh_effect)) {}
119
98 OverscrollControllerAndroid::OverscrollControllerAndroid( 120 OverscrollControllerAndroid::OverscrollControllerAndroid(
99 ui::OverscrollRefreshHandler* overscroll_refresh_handler, 121 ui::OverscrollRefreshHandler* overscroll_refresh_handler,
100 ui::WindowAndroidCompositor* compositor, 122 ui::WindowAndroidCompositor* compositor,
101 float dpi_scale) 123 float dpi_scale)
102 : compositor_(compositor), 124 : compositor_(compositor),
103 dpi_scale_(dpi_scale), 125 dpi_scale_(dpi_scale),
104 enabled_(true), 126 enabled_(true),
105 glow_effect_(CreateGlowEffect(this, dpi_scale_)), 127 glow_effect_(CreateGlowEffect(this, dpi_scale_)),
106 refresh_effect_(CreateRefreshEffect(overscroll_refresh_handler)) { 128 refresh_effect_(CreateRefreshEffect(overscroll_refresh_handler)) {
107 DCHECK(compositor_); 129 DCHECK(compositor_);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 // sent from the renderer compositor. 204 // sent from the renderer compositor.
183 if (event.GetType() == blink::WebInputEvent::kGestureScrollEnd || 205 if (event.GetType() == blink::WebInputEvent::kGestureScrollEnd ||
184 event.GetType() == blink::WebInputEvent::kGestureFlingStart) { 206 event.GetType() == blink::WebInputEvent::kGestureFlingStart) {
185 OnOverscrolled(DidOverscrollParams()); 207 OnOverscrolled(DidOverscrollParams());
186 } 208 }
187 209
188 if (event.GetType() == blink::WebInputEvent::kGestureScrollUpdate && 210 if (event.GetType() == blink::WebInputEvent::kGestureScrollUpdate &&
189 refresh_effect_) { 211 refresh_effect_) {
190 // The effect should only be allowed if both the causal touch events go 212 // The effect should only be allowed if both the causal touch events go
191 // unconsumed and the generated scroll events go unconsumed. 213 // unconsumed and the generated scroll events go unconsumed.
192 bool consumed = 214 if (ack_result == INPUT_EVENT_ACK_STATE_CONSUMED ||
193 ack_result == INPUT_EVENT_ACK_STATE_CONSUMED || 215 event.data.scroll_update.previous_update_in_sequence_prevented) {
194 event.data.scroll_update.previous_update_in_sequence_prevented; 216 refresh_effect_->Reset();
195 refresh_effect_->OnScrollUpdateAck(consumed); 217 }
196 } 218 }
197 } 219 }
198 220
199 void OverscrollControllerAndroid::OnOverscrolled( 221 void OverscrollControllerAndroid::OnOverscrolled(
200 const DidOverscrollParams& params) { 222 const DidOverscrollParams& params) {
201 if (!enabled_) 223 if (!enabled_)
202 return; 224 return;
203 225
204 if (refresh_effect_ && (refresh_effect_->IsActive() || 226 if (refresh_effect_) {
205 refresh_effect_->IsAwaitingScrollUpdateAck())) { 227 if (params.scroll_boundary_behavior.y !=
206 // An active (or potentially active) refresh effect should always pre-empt 228 cc::ScrollBoundaryBehavior::ScrollBoundaryBehaviorType::
207 // the passive glow effect. 229 kScrollBoundaryBehaviorTypeAuto)
208 return; 230 refresh_effect_->Reset();
231 else
232 refresh_effect_->OnOverscrolled();
233
234 if (refresh_effect_->IsActive() ||
235 refresh_effect_->IsAwaitingScrollUpdateAck()) {
236 // An active (or potentially active) refresh effect should always pre-empt
237 // the passive glow effect.
238 return;
239 }
209 } 240 }
210 241
211 if (glow_effect_ && 242 gfx::Vector2dF accumulated_overscroll =
212 glow_effect_->OnOverscrolled( 243 gfx::ScaleVector2d(params.accumulated_overscroll, dpi_scale_);
213 base::TimeTicks::Now(), 244 gfx::Vector2dF latest_overscroll_delta =
214 gfx::ScaleVector2d(params.accumulated_overscroll, dpi_scale_), 245 gfx::ScaleVector2d(params.latest_overscroll_delta, dpi_scale_);
215 gfx::ScaleVector2d(params.latest_overscroll_delta, dpi_scale_), 246 gfx::Vector2dF current_fling_velocity =
216 gfx::ScaleVector2d(params.current_fling_velocity, dpi_scale_), 247 gfx::ScaleVector2d(params.current_fling_velocity, dpi_scale_);
217 gfx::ScaleVector2d( 248 gfx::Vector2dF overscroll_location = gfx::ScaleVector2d(
218 params.causal_event_viewport_point.OffsetFromOrigin(), 249 params.causal_event_viewport_point.OffsetFromOrigin(), dpi_scale_);
219 dpi_scale_))) { 250
251 if (params.scroll_boundary_behavior.x ==
252 cc::ScrollBoundaryBehavior::ScrollBoundaryBehaviorType::
253 kScrollBoundaryBehaviorTypeNone) {
254 accumulated_overscroll.set_x(0);
255 latest_overscroll_delta.set_x(0);
256 current_fling_velocity.set_x(0);
257 }
258
259 if (params.scroll_boundary_behavior.y ==
260 cc::ScrollBoundaryBehavior::ScrollBoundaryBehaviorType::
261 kScrollBoundaryBehaviorTypeNone) {
262 accumulated_overscroll.set_y(0);
263 latest_overscroll_delta.set_y(0);
264 current_fling_velocity.set_y(0);
265 }
266
267 if (glow_effect_ && glow_effect_->OnOverscrolled(
268 base::TimeTicks::Now(), accumulated_overscroll,
269 latest_overscroll_delta, current_fling_velocity,
270 overscroll_location)) {
220 SetNeedsAnimate(); 271 SetNeedsAnimate();
221 } 272 }
222 } 273 }
223 274
224 bool OverscrollControllerAndroid::Animate(base::TimeTicks current_time, 275 bool OverscrollControllerAndroid::Animate(base::TimeTicks current_time,
225 cc::Layer* parent_layer) { 276 cc::Layer* parent_layer) {
226 DCHECK(parent_layer); 277 DCHECK(parent_layer);
227 if (!enabled_ || !glow_effect_) 278 if (!enabled_ || !glow_effect_)
228 return false; 279 return false;
229 280
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 std::unique_ptr<EdgeEffectBase> 325 std::unique_ptr<EdgeEffectBase>
275 OverscrollControllerAndroid::CreateEdgeEffect() { 326 OverscrollControllerAndroid::CreateEdgeEffect() {
276 return CreateGlowEdgeEffect(&compositor_->GetResourceManager(), dpi_scale_); 327 return CreateGlowEdgeEffect(&compositor_->GetResourceManager(), dpi_scale_);
277 } 328 }
278 329
279 void OverscrollControllerAndroid::SetNeedsAnimate() { 330 void OverscrollControllerAndroid::SetNeedsAnimate() {
280 compositor_->SetNeedsAnimate(); 331 compositor_->SetNeedsAnimate();
281 } 332 }
282 333
283 } // namespace content 334 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698