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 package org.chromium.ui.gfx;
7 import android.content.ComponentCallbacks;
8 import android.content.Context;
9 import android.content.res.Configuration;
10 import android.content.res.Resources;
11 import android.util.TypedValue;
12 import android.view.ViewConfiguration;
14 import org.chromium.base.CalledByNative;
15 import org.chromium.base.JNINamespace;
16 import org.chromium.ui.R;
19 * This class facilitates access to ViewConfiguration-related properties, also
20 * providing native-code notifications when such properties have changed.
24 public class ViewConfigurationHelper {
26 // Fallback constants when resource lookup fails, see
27 // ui/android/java/res/values/dimens.xml.
28 private static final float MIN_SCALING_SPAN_MM = 27.0f;
29 private static final float MIN_SCALING_TOUCH_MAJOR_DIP = 48.0f;
31 private final Context mAppContext;
32 private ViewConfiguration mViewConfiguration;
34 private ViewConfigurationHelper(Context context) {
35 mAppContext = context.getApplicationContext();
36 mViewConfiguration = ViewConfiguration.get(mAppContext);
39 private void registerListener() {
40 mAppContext.registerComponentCallbacks(
41 new ComponentCallbacks() {
43 public void onConfigurationChanged(Configuration configuration) {
44 updateNativeViewConfigurationIfNecessary();
48 public void onLowMemory() {
53 private void updateNativeViewConfigurationIfNecessary() {
54 // The ViewConfiguration will differ only if the density has changed.
55 ViewConfiguration configuration = ViewConfiguration.get(mAppContext);
56 if (mViewConfiguration == configuration) return;
58 mViewConfiguration = configuration;
59 nativeUpdateSharedViewConfiguration(
60 getScaledMaximumFlingVelocity(),
61 getScaledMinimumFlingVelocity(),
63 getScaledDoubleTapSlop(),
64 getScaledMinScalingSpan(),
65 getScaledMinScalingTouchMajor());
69 private static int getDoubleTapTimeout() {
70 return ViewConfiguration.getDoubleTapTimeout();
74 private static int getLongPressTimeout() {
75 return ViewConfiguration.getLongPressTimeout();
79 private static int getTapTimeout() {
80 return ViewConfiguration.getTapTimeout();
84 private static float getScrollFriction() {
85 return ViewConfiguration.getScrollFriction();
89 private int getScaledMaximumFlingVelocity() {
90 return mViewConfiguration.getScaledMaximumFlingVelocity();
94 private int getScaledMinimumFlingVelocity() {
95 return mViewConfiguration.getScaledMinimumFlingVelocity();
99 private int getScaledTouchSlop() {
100 return mViewConfiguration.getScaledTouchSlop();
104 private int getScaledDoubleTapSlop() {
105 return mViewConfiguration.getScaledDoubleTapSlop();
109 private int getScaledMinScalingSpan() {
110 final Resources res = mAppContext.getResources();
111 int id = res.getIdentifier("config_minScalingSpan", "dimen", "android");
112 // Fall back to a sensible default if the internal identifier does not exist.
113 if (id == 0) id = R.dimen.config_min_scaling_span;
115 return res.getDimensionPixelSize(id);
116 } catch (Resources.NotFoundException e) {
117 assert false : "MinScalingSpan resource lookup failed.";
118 return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, MIN_SCALING_SPAN_MM,
119 res.getDisplayMetrics());
124 private int getScaledMinScalingTouchMajor() {
125 final Resources res = mAppContext.getResources();
126 int id = res.getIdentifier("config_minScalingTouchMajor", "dimen", "android");
127 // Fall back to a sensible default if the internal identifier does not exist.
128 if (id == 0) id = R.dimen.config_min_scaling_touch_major;
130 return res.getDimensionPixelSize(id);
131 } catch (Resources.NotFoundException e) {
132 assert false : "MinScalingTouchMajor resource lookup failed.";
133 return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
134 MIN_SCALING_TOUCH_MAJOR_DIP, res.getDisplayMetrics());
139 private static ViewConfigurationHelper createWithListener(Context context) {
140 ViewConfigurationHelper viewConfigurationHelper = new ViewConfigurationHelper(context);
141 viewConfigurationHelper.registerListener();
142 return viewConfigurationHelper;
145 private native void nativeUpdateSharedViewConfiguration(
146 int scaledMaximumFlingVelocity, int scaledMinimumFlingVelocity,
147 int scaledTouchSlop, int scaledDoubleTapSlop,
148 int scaledMinScalingSpan, int scaledMinScalingTouchMajor);