Upstream version 11.39.266.0
[platform/framework/web/crosswalk.git] / src / content / child / fling_animator_impl_android.cc
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
3 // found in the LICENSE file.
4
5 #include "content/child/fling_animator_impl_android.h"
6
7 #include "base/logging.h"
8 #include "third_party/WebKit/public/platform/WebFloatSize.h"
9 #include "third_party/WebKit/public/platform/WebGestureCurveTarget.h"
10 #include "ui/gfx/frame_time.h"
11 #include "ui/gfx/vector2d.h"
12
13 namespace content {
14
15 namespace {
16
17 // Value taken directly from Android's ViewConfiguration. As the value has not
18 // changed in 4+ years, and does not depend on any device-specific configuration
19 // parameters, copy it directly to avoid potential JNI interop issues in the
20 // render process (see crbug.com/362614).
21 const float kDefaultAndroidPlatformScrollFriction = 0.015f;
22
23 gfx::Scroller::Config GetScrollerConfig() {
24   gfx::Scroller::Config config;
25   config.flywheel_enabled = false;
26   config.fling_friction = kDefaultAndroidPlatformScrollFriction;
27   return config;
28 }
29
30 }  // namespace
31
32 FlingAnimatorImpl::FlingAnimatorImpl()
33     : is_active_(false),
34       scroller_(GetScrollerConfig()) {}
35
36 FlingAnimatorImpl::~FlingAnimatorImpl() {}
37
38 void FlingAnimatorImpl::StartFling(const gfx::PointF& velocity) {
39   // No bounds on the fling. See http://webkit.org/b/96403
40   // Instead, use the largest possible bounds for minX/maxX/minY/maxY. The
41   // compositor will ignore any attempt to scroll beyond the end of the page.
42
43   DCHECK(velocity.x() || velocity.y());
44   if (is_active_)
45     CancelFling();
46
47   is_active_ = true;
48   scroller_.Fling(0,
49                   0,
50                   velocity.x(),
51                   velocity.y(),
52                   INT_MIN,
53                   INT_MAX,
54                   INT_MIN,
55                   INT_MAX,
56                   base::TimeTicks());
57 }
58
59 void FlingAnimatorImpl::CancelFling() {
60   if (!is_active_)
61     return;
62
63   is_active_ = false;
64   scroller_.AbortAnimation();
65 }
66
67 bool FlingAnimatorImpl::apply(double time,
68                               blink::WebGestureCurveTarget* target) {
69   // If the fling has yet to start, simply return and report true to prevent
70   // fling termination.
71   if (time <= 0)
72     return true;
73
74   const base::TimeTicks time_ticks =
75       base::TimeTicks() + base::TimeDelta::FromMicroseconds(
76                               time * base::Time::kMicrosecondsPerSecond);
77   if (!scroller_.ComputeScrollOffset(time_ticks)) {
78     is_active_ = false;
79     return false;
80   }
81
82   gfx::PointF current_position(scroller_.GetCurrX(), scroller_.GetCurrY());
83   gfx::Vector2dF scroll_amount(current_position - last_position_);
84   last_position_ = current_position;
85
86   // scrollBy() could delete this curve if the animation is over, so don't touch
87   // any member variables after making that call.
88   return target->scrollBy(blink::WebFloatSize(scroll_amount),
89                           blink::WebFloatSize(scroller_.GetCurrVelocityX(),
90                                               scroller_.GetCurrVelocityY()));
91 }
92
93 FlingAnimatorImpl* FlingAnimatorImpl::CreateAndroidGestureCurve(
94     const blink::WebFloatPoint& velocity,
95     const blink::WebSize&) {
96   FlingAnimatorImpl* gesture_curve = new FlingAnimatorImpl();
97   gesture_curve->StartFling(velocity);
98   return gesture_curve;
99 }
100
101 }  // namespace content