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.
5 #include "ui/gfx/android/view_configuration.h"
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"
12 using base::android::AttachCurrentThread
;
13 using base::android::GetApplicationContext
;
19 struct ViewConfigurationData
{
20 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()));
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 should_use_touch_major_in_scaling_span_
=
43 Java_ViewConfigurationHelper_shouldUseTouchMajorInScalingSpan(env
);
45 jobject obj
= j_view_configuration_helper_
.obj();
47 Java_ViewConfigurationHelper_getScaledMaximumFlingVelocity(env
, obj
),
48 Java_ViewConfigurationHelper_getScaledMinimumFlingVelocity(env
, obj
),
49 Java_ViewConfigurationHelper_getScaledTouchSlop(env
, obj
),
50 Java_ViewConfigurationHelper_getScaledDoubleTapSlop(env
, obj
),
51 Java_ViewConfigurationHelper_getScaledMinScalingSpan(env
, obj
),
52 Java_ViewConfigurationHelper_getScaledMinScalingTouchMajor(env
, obj
));
55 ~ViewConfigurationData() {}
57 void SynchronizedUpdate(int scaled_maximum_fling_velocity
,
58 int scaled_minimum_fling_velocity
,
59 int scaled_touch_slop
,
60 int scaled_double_tap_slop
,
61 int scaled_min_scaling_span
,
62 int scaled_min_scaling_touch_major
) {
63 base::AutoLock
autolock(lock_
);
64 Update(scaled_maximum_fling_velocity
,
65 scaled_minimum_fling_velocity
,
67 scaled_double_tap_slop
,
68 scaled_min_scaling_span
,
69 scaled_min_scaling_touch_major
);
72 int double_tap_timeout_in_ms() const { return double_tap_timeout_in_ms_
; }
73 int long_press_timeout_in_ms() const { return long_press_timeout_in_ms_
; }
74 int tap_timeout_in_ms() const { return tap_timeout_in_ms_
; }
75 float scroll_friction() const { return scroll_friction_
; }
76 bool should_use_touch_major_in_scaling_span() const {
77 return should_use_touch_major_in_scaling_span_
;
80 int max_fling_velocity_in_pixels_s() {
81 base::AutoLock
autolock(lock_
);
82 return max_fling_velocity_in_pixels_s_
;
85 int min_fling_velocity_in_pixels_s() {
86 base::AutoLock
autolock(lock_
);
87 return min_fling_velocity_in_pixels_s_
;
90 int touch_slop_in_pixels() {
91 base::AutoLock
autolock(lock_
);
92 return touch_slop_in_pixels_
;
95 int double_tap_slop_in_pixels() {
96 base::AutoLock
autolock(lock_
);
97 return double_tap_slop_in_pixels_
;
100 int min_scaling_span_in_pixels() {
101 base::AutoLock
autolock(lock_
);
102 return min_scaling_span_in_pixels_
;
105 int min_scaling_touch_major_in_pixels() {
106 base::AutoLock
autolock(lock_
);
107 return min_scaling_touch_major_in_pixels_
;
111 void Update(int scaled_maximum_fling_velocity
,
112 int scaled_minimum_fling_velocity
,
113 int scaled_touch_slop
,
114 int scaled_double_tap_slop
,
115 int scaled_min_scaling_span
,
116 int scaled_min_scaling_touch_major
) {
117 DCHECK_LE(scaled_minimum_fling_velocity
, scaled_maximum_fling_velocity
);
118 max_fling_velocity_in_pixels_s_
= scaled_maximum_fling_velocity
;
119 min_fling_velocity_in_pixels_s_
= scaled_minimum_fling_velocity
;
120 touch_slop_in_pixels_
= scaled_touch_slop
;
121 double_tap_slop_in_pixels_
= scaled_double_tap_slop
;
122 min_scaling_span_in_pixels_
= scaled_min_scaling_span
;
123 min_scaling_touch_major_in_pixels_
= scaled_min_scaling_touch_major
;
127 base::android::ScopedJavaGlobalRef
<jobject
> j_view_configuration_helper_
;
129 // These values will remain constant throughout the lifetime of the app, so
130 // read-access needn't be synchronized.
131 int double_tap_timeout_in_ms_
;
132 int long_press_timeout_in_ms_
;
133 int tap_timeout_in_ms_
;
134 float scroll_friction_
;
135 bool should_use_touch_major_in_scaling_span_
;
137 // These values may vary as view-specific parameters (DPI scale) are changed,
138 // so read/write access must be synchronized.
139 int max_fling_velocity_in_pixels_s_
;
140 int min_fling_velocity_in_pixels_s_
;
141 int touch_slop_in_pixels_
;
142 int double_tap_slop_in_pixels_
;
143 int min_scaling_span_in_pixels_
;
144 int min_scaling_touch_major_in_pixels_
;
147 DISALLOW_COPY_AND_ASSIGN(ViewConfigurationData
);
150 // Leaky to allow access from any thread.
151 base::LazyInstance
<ViewConfigurationData
>::Leaky g_view_configuration
=
152 LAZY_INSTANCE_INITIALIZER
;
156 static void UpdateSharedViewConfiguration(JNIEnv
* env
,
158 jint scaled_maximum_fling_velocity
,
159 jint scaled_minimum_fling_velocity
,
160 jint scaled_touch_slop
,
161 jint scaled_double_tap_slop
,
162 jint scaled_min_scaling_span
,
163 jint scaled_min_scaling_touch_major
) {
164 g_view_configuration
.Get().SynchronizedUpdate(scaled_maximum_fling_velocity
,
165 scaled_minimum_fling_velocity
,
167 scaled_double_tap_slop
,
168 scaled_min_scaling_span
,
169 scaled_min_scaling_touch_major
);
172 int ViewConfiguration::GetDoubleTapTimeoutInMs() {
173 return g_view_configuration
.Get().double_tap_timeout_in_ms();
176 int ViewConfiguration::GetLongPressTimeoutInMs() {
177 return g_view_configuration
.Get().long_press_timeout_in_ms();
180 int ViewConfiguration::GetTapTimeoutInMs() {
181 return g_view_configuration
.Get().tap_timeout_in_ms();
184 float ViewConfiguration::GetScrollFriction() {
185 return g_view_configuration
.Get().scroll_friction();
188 int ViewConfiguration::GetMaximumFlingVelocityInPixelsPerSecond() {
189 return g_view_configuration
.Get().max_fling_velocity_in_pixels_s();
192 int ViewConfiguration::GetMinimumFlingVelocityInPixelsPerSecond() {
193 return g_view_configuration
.Get().min_fling_velocity_in_pixels_s();
196 int ViewConfiguration::GetTouchSlopInPixels() {
197 return g_view_configuration
.Get().touch_slop_in_pixels();
200 int ViewConfiguration::GetDoubleTapSlopInPixels() {
201 return g_view_configuration
.Get().double_tap_slop_in_pixels();
204 int ViewConfiguration::GetMinScalingSpanInPixels() {
205 return g_view_configuration
.Get().min_scaling_span_in_pixels();
208 int ViewConfiguration::GetMinScalingTouchMajorInPixels() {
209 return g_view_configuration
.Get().min_scaling_touch_major_in_pixels();
212 bool ViewConfiguration::ShouldUseTouchMajorInScalingSpan() {
213 return g_view_configuration
.Get().should_use_touch_major_in_scaling_span();
216 bool ViewConfiguration::RegisterViewConfiguration(JNIEnv
* env
) {
217 return RegisterNativesImpl(env
);