summaryrefslogtreecommitdiffstats
path: root/chromium/ui/gfx/android/view_configuration.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/gfx/android/view_configuration.cc')
-rw-r--r--chromium/ui/gfx/android/view_configuration.cc196
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) {