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 "ui/gfx/android/view_configuration.h"
6
7 #include "base/android/jni_android.h"
8 #include "base/lazy_instance.h"
9 #include "base/threading/non_thread_safe.h"
10 #include "jni/ViewConfigurationHelper_jni.h"
11
12 using base::android::AttachCurrentThread;
13 using base::android::GetApplicationContext;
14
15 namespace gfx {
16
17 namespace {
18
19 struct ViewConfigurationData {
ViewConfigurationDatagfx::__anonf95f7dd90111::ViewConfigurationData20 ViewConfigurationData()
21 : double_tap_timeout_in_ms_(0),
22 long_press_timeout_in_ms_(0),
23 tap_timeout_in_ms_(0),
24 scroll_friction_(1.f),
25 max_fling_velocity_in_pixels_s_(0),
26 min_fling_velocity_in_pixels_s_(0),
27 touch_slop_in_pixels_(0),
28 double_tap_slop_in_pixels_(0),
29 min_scaling_span_in_pixels_(0),
30 min_scaling_touch_major_in_pixels_(0) {
31 JNIEnv* env = AttachCurrentThread();
32 j_view_configuration_helper_.Reset(
33 Java_ViewConfigurationHelper_createWithListener(
34 env, base::android::GetApplicationContext()));
35
36 double_tap_timeout_in_ms_ =
37 Java_ViewConfigurationHelper_getDoubleTapTimeout(env);
38 long_press_timeout_in_ms_ =
39 Java_ViewConfigurationHelper_getLongPressTimeout(env);
40 tap_timeout_in_ms_ = Java_ViewConfigurationHelper_getTapTimeout(env);
41 scroll_friction_ = Java_ViewConfigurationHelper_getScrollFriction(env);
42
43 jobject obj = j_view_configuration_helper_.obj();
44 Update(
45 Java_ViewConfigurationHelper_getScaledMaximumFlingVelocity(env, obj),
46 Java_ViewConfigurationHelper_getScaledMinimumFlingVelocity(env, obj),
47 Java_ViewConfigurationHelper_getScaledTouchSlop(env, obj),
48 Java_ViewConfigurationHelper_getScaledDoubleTapSlop(env, obj),
49 Java_ViewConfigurationHelper_getScaledMinScalingSpan(env, obj),
50 Java_ViewConfigurationHelper_getScaledMinScalingTouchMajor(env, obj));
51 }
52
~ViewConfigurationDatagfx::__anonf95f7dd90111::ViewConfigurationData53 ~ViewConfigurationData() {}
54
SynchronizedUpdategfx::__anonf95f7dd90111::ViewConfigurationData55 void SynchronizedUpdate(int scaled_maximum_fling_velocity,
56 int scaled_minimum_fling_velocity,
57 int scaled_touch_slop,
58 int scaled_double_tap_slop,
59 int scaled_min_scaling_span,
60 int scaled_min_scaling_touch_major) {
61 base::AutoLock autolock(lock_);
62 Update(scaled_maximum_fling_velocity,
63 scaled_minimum_fling_velocity,
64 scaled_touch_slop,
65 scaled_double_tap_slop,
66 scaled_min_scaling_span,
67 scaled_min_scaling_touch_major);
68 }
69
double_tap_timeout_in_msgfx::__anonf95f7dd90111::ViewConfigurationData70 int double_tap_timeout_in_ms() const { return double_tap_timeout_in_ms_; }
long_press_timeout_in_msgfx::__anonf95f7dd90111::ViewConfigurationData71 int long_press_timeout_in_ms() const { return long_press_timeout_in_ms_; }
tap_timeout_in_msgfx::__anonf95f7dd90111::ViewConfigurationData72 int tap_timeout_in_ms() const { return tap_timeout_in_ms_; }
scroll_frictiongfx::__anonf95f7dd90111::ViewConfigurationData73 float scroll_friction() const { return scroll_friction_; }
74
max_fling_velocity_in_pixels_sgfx::__anonf95f7dd90111::ViewConfigurationData75 int max_fling_velocity_in_pixels_s() {
76 base::AutoLock autolock(lock_);
77 return max_fling_velocity_in_pixels_s_;
78 }
79
min_fling_velocity_in_pixels_sgfx::__anonf95f7dd90111::ViewConfigurationData80 int min_fling_velocity_in_pixels_s() {
81 base::AutoLock autolock(lock_);
82 return min_fling_velocity_in_pixels_s_;
83 }
84
touch_slop_in_pixelsgfx::__anonf95f7dd90111::ViewConfigurationData85 int touch_slop_in_pixels() {
86 base::AutoLock autolock(lock_);
87 return touch_slop_in_pixels_;
88 }
89
double_tap_slop_in_pixelsgfx::__anonf95f7dd90111::ViewConfigurationData90 int double_tap_slop_in_pixels() {
91 base::AutoLock autolock(lock_);
92 return double_tap_slop_in_pixels_;
93 }
94
min_scaling_span_in_pixelsgfx::__anonf95f7dd90111::ViewConfigurationData95 int min_scaling_span_in_pixels() {
96 base::AutoLock autolock(lock_);
97 return min_scaling_span_in_pixels_;
98 }
99
min_scaling_touch_major_in_pixelsgfx::__anonf95f7dd90111::ViewConfigurationData100 int min_scaling_touch_major_in_pixels() {
101 base::AutoLock autolock(lock_);
102 return min_scaling_touch_major_in_pixels_;
103 }
104
105 private:
Updategfx::__anonf95f7dd90111::ViewConfigurationData106 void Update(int scaled_maximum_fling_velocity,
107 int scaled_minimum_fling_velocity,
108 int scaled_touch_slop,
109 int scaled_double_tap_slop,
110 int scaled_min_scaling_span,
111 int scaled_min_scaling_touch_major) {
112 DCHECK_LE(scaled_minimum_fling_velocity, scaled_maximum_fling_velocity);
113 max_fling_velocity_in_pixels_s_ = scaled_maximum_fling_velocity;
114 min_fling_velocity_in_pixels_s_ = scaled_minimum_fling_velocity;
115 touch_slop_in_pixels_ = scaled_touch_slop;
116 double_tap_slop_in_pixels_ = scaled_double_tap_slop;
117 min_scaling_span_in_pixels_ = scaled_min_scaling_span;
118 min_scaling_touch_major_in_pixels_ = scaled_min_scaling_touch_major;
119 }
120
121 base::Lock lock_;
122 base::android::ScopedJavaGlobalRef<jobject> j_view_configuration_helper_;
123
124 // These values will remain constant throughout the lifetime of the app, so
125 // read-access needn't be synchronized.
126 int double_tap_timeout_in_ms_;
127 int long_press_timeout_in_ms_;
128 int tap_timeout_in_ms_;
129 float scroll_friction_;
130
131 // These values may vary as view-specific parameters (DPI scale) are changed,
132 // so read/write access must be synchronized.
133 int max_fling_velocity_in_pixels_s_;
134 int min_fling_velocity_in_pixels_s_;
135 int touch_slop_in_pixels_;
136 int double_tap_slop_in_pixels_;
137 int min_scaling_span_in_pixels_;
138 int min_scaling_touch_major_in_pixels_;
139
140 private:
141 DISALLOW_COPY_AND_ASSIGN(ViewConfigurationData);
142 };
143
144 // Leaky to allow access from any thread.
145 base::LazyInstance<ViewConfigurationData>::Leaky g_view_configuration =
146 LAZY_INSTANCE_INITIALIZER;
147
148 } // namespace
149
UpdateSharedViewConfiguration(JNIEnv * env,jobject obj,jint scaled_maximum_fling_velocity,jint scaled_minimum_fling_velocity,jint scaled_touch_slop,jint scaled_double_tap_slop,jint scaled_min_scaling_span,jint scaled_min_scaling_touch_major)150 static void UpdateSharedViewConfiguration(JNIEnv* env,
151 jobject obj,
152 jint scaled_maximum_fling_velocity,
153 jint scaled_minimum_fling_velocity,
154 jint scaled_touch_slop,
155 jint scaled_double_tap_slop,
156 jint scaled_min_scaling_span,
157 jint scaled_min_scaling_touch_major) {
158 g_view_configuration.Get().SynchronizedUpdate(scaled_maximum_fling_velocity,
159 scaled_minimum_fling_velocity,
160 scaled_touch_slop,
161 scaled_double_tap_slop,
162 scaled_min_scaling_span,
163 scaled_min_scaling_touch_major);
164 }
165
GetDoubleTapTimeoutInMs()166 int ViewConfiguration::GetDoubleTapTimeoutInMs() {
167 return g_view_configuration.Get().double_tap_timeout_in_ms();
168 }
169
GetLongPressTimeoutInMs()170 int ViewConfiguration::GetLongPressTimeoutInMs() {
171 return g_view_configuration.Get().long_press_timeout_in_ms();
172 }
173
GetTapTimeoutInMs()174 int ViewConfiguration::GetTapTimeoutInMs() {
175 return g_view_configuration.Get().tap_timeout_in_ms();
176 }
177
GetScrollFriction()178 float ViewConfiguration::GetScrollFriction() {
179 return g_view_configuration.Get().scroll_friction();
180 }
181
GetMaximumFlingVelocityInPixelsPerSecond()182 int ViewConfiguration::GetMaximumFlingVelocityInPixelsPerSecond() {
183 return g_view_configuration.Get().max_fling_velocity_in_pixels_s();
184 }
185
GetMinimumFlingVelocityInPixelsPerSecond()186 int ViewConfiguration::GetMinimumFlingVelocityInPixelsPerSecond() {
187 return g_view_configuration.Get().min_fling_velocity_in_pixels_s();
188 }
189
GetTouchSlopInPixels()190 int ViewConfiguration::GetTouchSlopInPixels() {
191 return g_view_configuration.Get().touch_slop_in_pixels();
192 }
193
GetDoubleTapSlopInPixels()194 int ViewConfiguration::GetDoubleTapSlopInPixels() {
195 return g_view_configuration.Get().double_tap_slop_in_pixels();
196 }
197
GetMinScalingSpanInPixels()198 int ViewConfiguration::GetMinScalingSpanInPixels() {
199 return g_view_configuration.Get().min_scaling_span_in_pixels();
200 }
201
GetMinScalingTouchMajorInPixels()202 int ViewConfiguration::GetMinScalingTouchMajorInPixels() {
203 return g_view_configuration.Get().min_scaling_touch_major_in_pixels();
204 }
205
RegisterViewConfiguration(JNIEnv * env)206 bool ViewConfiguration::RegisterViewConfiguration(JNIEnv* env) {
207 return RegisterNativesImpl(env);
208 }
209
210 } // namespace gfx
211