// 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 "base/lazy_instance.h" #include "base/threading/non_thread_safe.h" #include "jni/ViewConfigurationHelper_jni.h" 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 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::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() { return g_view_configuration.Get().double_tap_timeout_in_ms(); } int ViewConfiguration::GetLongPressTimeoutInMs() { return g_view_configuration.Get().long_press_timeout_in_ms(); } int ViewConfiguration::GetTapTimeoutInMs() { return g_view_configuration.Get().tap_timeout_in_ms(); } float ViewConfiguration::GetScrollFriction() { return g_view_configuration.Get().scroll_friction(); } int ViewConfiguration::GetMaximumFlingVelocityInPixelsPerSecond() { return g_view_configuration.Get().max_fling_velocity_in_pixels_s(); } int ViewConfiguration::GetMinimumFlingVelocityInPixelsPerSecond() { return g_view_configuration.Get().min_fling_velocity_in_pixels_s(); } int ViewConfiguration::GetTouchSlopInPixels() { 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) { return RegisterNativesImpl(env); } } // namespace gfx