diff options
Diffstat (limited to 'chromium/ui/gfx/android/view_configuration.cc')
-rw-r--r-- | chromium/ui/gfx/android/view_configuration.cc | 196 |
1 files changed, 175 insertions, 21 deletions
diff --git a/chromium/ui/gfx/android/view_configuration.cc b/chromium/ui/gfx/android/view_configuration.cc index 63657178b15..16c8617ed6b 100644 --- a/chromium/ui/gfx/android/view_configuration.cc +++ b/chromium/ui/gfx/android/view_configuration.cc @@ -1,52 +1,206 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ui/gfx/android/view_configuration.h" #include "base/android/jni_android.h" -#include "jni/ViewConfiguration_jni.h" +#include "base/lazy_instance.h" +#include "base/threading/non_thread_safe.h" +#include "jni/ViewConfigurationHelper_jni.h" -using namespace JNI_ViewConfiguration; using base::android::AttachCurrentThread; using base::android::GetApplicationContext; namespace gfx { +namespace { + +struct ViewConfigurationData { + ViewConfigurationData() + : double_tap_timeout_in_ms_(0), + long_press_timeout_in_ms_(0), + tap_timeout_in_ms_(0), + scroll_friction_(1.f), + max_fling_velocity_in_pixels_s_(0), + min_fling_velocity_in_pixels_s_(0), + touch_slop_in_pixels_(0), + double_tap_slop_in_pixels_(0), + min_scaling_span_in_pixels_(0), + min_scaling_touch_major_in_pixels_(0) { + JNIEnv* env = AttachCurrentThread(); + j_view_configuration_helper_.Reset( + Java_ViewConfigurationHelper_createWithListener( + env, base::android::GetApplicationContext())); + + double_tap_timeout_in_ms_ = + Java_ViewConfigurationHelper_getDoubleTapTimeout(env); + long_press_timeout_in_ms_ = + Java_ViewConfigurationHelper_getLongPressTimeout(env); + tap_timeout_in_ms_ = Java_ViewConfigurationHelper_getTapTimeout(env); + scroll_friction_ = Java_ViewConfigurationHelper_getScrollFriction(env); + + jobject obj = j_view_configuration_helper_.obj(); + Update( + Java_ViewConfigurationHelper_getScaledMaximumFlingVelocity(env, obj), + Java_ViewConfigurationHelper_getScaledMinimumFlingVelocity(env, obj), + Java_ViewConfigurationHelper_getScaledTouchSlop(env, obj), + Java_ViewConfigurationHelper_getScaledDoubleTapSlop(env, obj), + Java_ViewConfigurationHelper_getScaledMinScalingSpan(env, obj), + Java_ViewConfigurationHelper_getScaledMinScalingTouchMajor(env, obj)); + } + + ~ViewConfigurationData() {} + + void SynchronizedUpdate(int scaled_maximum_fling_velocity, + int scaled_minimum_fling_velocity, + int scaled_touch_slop, + int scaled_double_tap_slop, + int scaled_min_scaling_span, + int scaled_min_scaling_touch_major) { + base::AutoLock autolock(lock_); + Update(scaled_maximum_fling_velocity, + scaled_minimum_fling_velocity, + scaled_touch_slop, + scaled_double_tap_slop, + scaled_min_scaling_span, + scaled_min_scaling_touch_major); + } + + int double_tap_timeout_in_ms() const { return double_tap_timeout_in_ms_; } + int long_press_timeout_in_ms() const { return long_press_timeout_in_ms_; } + int tap_timeout_in_ms() const { return tap_timeout_in_ms_; } + float scroll_friction() const { return scroll_friction_; } + + int max_fling_velocity_in_pixels_s() { + base::AutoLock autolock(lock_); + return max_fling_velocity_in_pixels_s_; + } + + int min_fling_velocity_in_pixels_s() { + base::AutoLock autolock(lock_); + return min_fling_velocity_in_pixels_s_; + } + + int touch_slop_in_pixels() { + base::AutoLock autolock(lock_); + return touch_slop_in_pixels_; + } + + int double_tap_slop_in_pixels() { + base::AutoLock autolock(lock_); + return double_tap_slop_in_pixels_; + } + + int min_scaling_span_in_pixels() { + base::AutoLock autolock(lock_); + return min_scaling_span_in_pixels_; + } + + int min_scaling_touch_major_in_pixels() { + base::AutoLock autolock(lock_); + return min_scaling_touch_major_in_pixels_; + } + + private: + void Update(int scaled_maximum_fling_velocity, + int scaled_minimum_fling_velocity, + int scaled_touch_slop, + int scaled_double_tap_slop, + int scaled_min_scaling_span, + int scaled_min_scaling_touch_major) { + DCHECK_LE(scaled_minimum_fling_velocity, scaled_maximum_fling_velocity); + max_fling_velocity_in_pixels_s_ = scaled_maximum_fling_velocity; + min_fling_velocity_in_pixels_s_ = scaled_minimum_fling_velocity; + touch_slop_in_pixels_ = scaled_touch_slop; + double_tap_slop_in_pixels_ = scaled_double_tap_slop; + min_scaling_span_in_pixels_ = scaled_min_scaling_span; + min_scaling_touch_major_in_pixels_ = scaled_min_scaling_touch_major; + } + + base::Lock lock_; + base::android::ScopedJavaGlobalRef<jobject> j_view_configuration_helper_; + + // These values will remain constant throughout the lifetime of the app, so + // read-access needn't be synchronized. + int double_tap_timeout_in_ms_; + int long_press_timeout_in_ms_; + int tap_timeout_in_ms_; + float scroll_friction_; + + // These values may vary as view-specific parameters (DPI scale) are changed, + // so read/write access must be synchronized. + int max_fling_velocity_in_pixels_s_; + int min_fling_velocity_in_pixels_s_; + int touch_slop_in_pixels_; + int double_tap_slop_in_pixels_; + int min_scaling_span_in_pixels_; + int min_scaling_touch_major_in_pixels_; + + private: + DISALLOW_COPY_AND_ASSIGN(ViewConfigurationData); +}; + +// Leaky to allow access from any thread. +base::LazyInstance<ViewConfigurationData>::Leaky g_view_configuration = + LAZY_INSTANCE_INITIALIZER; + +} // namespace + +static void 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) { + g_view_configuration.Get().SynchronizedUpdate(scaled_maximum_fling_velocity, + scaled_minimum_fling_velocity, + scaled_touch_slop, + scaled_double_tap_slop, + scaled_min_scaling_span, + scaled_min_scaling_touch_major); +} + int ViewConfiguration::GetDoubleTapTimeoutInMs() { - JNIEnv* env = AttachCurrentThread(); - return Java_ViewConfiguration_getDoubleTapTimeout(env); + return g_view_configuration.Get().double_tap_timeout_in_ms(); } int ViewConfiguration::GetLongPressTimeoutInMs() { - JNIEnv* env = AttachCurrentThread(); - return Java_ViewConfiguration_getLongPressTimeout(env); + return g_view_configuration.Get().long_press_timeout_in_ms(); } int ViewConfiguration::GetTapTimeoutInMs() { - JNIEnv* env = AttachCurrentThread(); - return Java_ViewConfiguration_getTapTimeout(env); + return g_view_configuration.Get().tap_timeout_in_ms(); +} + +float ViewConfiguration::GetScrollFriction() { + return g_view_configuration.Get().scroll_friction(); } int ViewConfiguration::GetMaximumFlingVelocityInPixelsPerSecond() { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef<jobject> view = - Java_ViewConfiguration_get(env, GetApplicationContext()); - return Java_ViewConfiguration_getScaledMaximumFlingVelocity(env, view.obj()); + return g_view_configuration.Get().max_fling_velocity_in_pixels_s(); } int ViewConfiguration::GetMinimumFlingVelocityInPixelsPerSecond() { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef<jobject> view = - Java_ViewConfiguration_get(env, GetApplicationContext()); - return Java_ViewConfiguration_getScaledMinimumFlingVelocity(env, view.obj()); + return g_view_configuration.Get().min_fling_velocity_in_pixels_s(); } int ViewConfiguration::GetTouchSlopInPixels() { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef<jobject> view = - Java_ViewConfiguration_get(env, GetApplicationContext()); - return Java_ViewConfiguration_getScaledTouchSlop(env, view.obj()); + return g_view_configuration.Get().touch_slop_in_pixels(); +} + +int ViewConfiguration::GetDoubleTapSlopInPixels() { + return g_view_configuration.Get().double_tap_slop_in_pixels(); +} + +int ViewConfiguration::GetMinScalingSpanInPixels() { + return g_view_configuration.Get().min_scaling_span_in_pixels(); +} + +int ViewConfiguration::GetMinScalingTouchMajorInPixels() { + return g_view_configuration.Get().min_scaling_touch_major_in_pixels(); } bool ViewConfiguration::RegisterViewConfiguration(JNIEnv* env) { |