1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.view;
18 
19 import android.annotation.TestApi;
20 import android.app.AppGlobals;
21 import android.content.Context;
22 import android.content.res.Configuration;
23 import android.content.res.Resources;
24 import android.graphics.Point;
25 import android.os.RemoteException;
26 import android.provider.Settings;
27 import android.util.DisplayMetrics;
28 import android.util.SparseArray;
29 
30 /**
31  * Contains methods to standard constants used in the UI for timeouts, sizes, and distances.
32  */
33 public class ViewConfiguration {
34     /**
35      * Defines the width of the horizontal scrollbar and the height of the vertical scrollbar in
36      * dips
37      */
38     private static final int SCROLL_BAR_SIZE = 4;
39 
40     /**
41      * Duration of the fade when scrollbars fade away in milliseconds
42      */
43     private static final int SCROLL_BAR_FADE_DURATION = 250;
44 
45     /**
46      * Default delay before the scrollbars fade in milliseconds
47      */
48     private static final int SCROLL_BAR_DEFAULT_DELAY = 300;
49 
50     /**
51      * Defines the length of the fading edges in dips
52      */
53     private static final int FADING_EDGE_LENGTH = 12;
54 
55     /**
56      * Defines the duration in milliseconds of the pressed state in child
57      * components.
58      */
59     private static final int PRESSED_STATE_DURATION = 64;
60 
61     /**
62      * Defines the default duration in milliseconds before a press turns into
63      * a long press
64      */
65     private static final int DEFAULT_LONG_PRESS_TIMEOUT = 500;
66 
67     /**
68      * Defines the default duration in milliseconds between the first tap's up event and the second
69      * tap's down event for an interaction to be considered part of the same multi-press.
70      */
71     private static final int DEFAULT_MULTI_PRESS_TIMEOUT = 300;
72 
73     /**
74      * Defines the time between successive key repeats in milliseconds.
75      */
76     private static final int KEY_REPEAT_DELAY = 50;
77 
78     /**
79      * Defines the duration in milliseconds a user needs to hold down the
80      * appropriate button to bring up the global actions dialog (power off,
81      * lock screen, etc).
82      */
83     private static final int GLOBAL_ACTIONS_KEY_TIMEOUT = 500;
84 
85     /**
86      * Defines the duration in milliseconds a user needs to hold down the
87      * appropriate button to bring up the accessibility shortcut for the first time
88      */
89     private static final int A11Y_SHORTCUT_KEY_TIMEOUT = 3000;
90 
91     /**
92      * Defines the duration in milliseconds a user needs to hold down the
93      * appropriate button to enable the accessibility shortcut once it's configured.
94      */
95     private static final int A11Y_SHORTCUT_KEY_TIMEOUT_AFTER_CONFIRMATION = 1000;
96 
97     /**
98      * Defines the duration in milliseconds we will wait to see if a touch event
99      * is a tap or a scroll. If the user does not move within this interval, it is
100      * considered to be a tap.
101      */
102     private static final int TAP_TIMEOUT = 100;
103 
104     /**
105      * Defines the duration in milliseconds we will wait to see if a touch event
106      * is a jump tap. If the user does not complete the jump tap within this interval, it is
107      * considered to be a tap.
108      */
109     private static final int JUMP_TAP_TIMEOUT = 500;
110 
111     /**
112      * Defines the duration in milliseconds between the first tap's up event and
113      * the second tap's down event for an interaction to be considered a
114      * double-tap.
115      */
116     private static final int DOUBLE_TAP_TIMEOUT = 300;
117 
118     /**
119      * Defines the minimum duration in milliseconds between the first tap's up event and
120      * the second tap's down event for an interaction to be considered a
121      * double-tap.
122      */
123     private static final int DOUBLE_TAP_MIN_TIME = 40;
124 
125     /**
126      * Defines the maximum duration in milliseconds between a touch pad
127      * touch and release for a given touch to be considered a tap (click) as
128      * opposed to a hover movement gesture.
129      */
130     private static final int HOVER_TAP_TIMEOUT = 150;
131 
132     /**
133      * Defines the maximum distance in pixels that a touch pad touch can move
134      * before being released for it to be considered a tap (click) as opposed
135      * to a hover movement gesture.
136      */
137     private static final int HOVER_TAP_SLOP = 20;
138 
139     /**
140      * Defines the duration in milliseconds we want to display zoom controls in response
141      * to a user panning within an application.
142      */
143     private static final int ZOOM_CONTROLS_TIMEOUT = 3000;
144 
145     /**
146      * Inset in dips to look for touchable content when the user touches the edge of the screen
147      */
148     private static final int EDGE_SLOP = 12;
149 
150     /**
151      * Distance a touch can wander before we think the user is scrolling in dips.
152      * Note that this value defined here is only used as a fallback by legacy/misbehaving
153      * applications that do not provide a Context for determining density/configuration-dependent
154      * values.
155      *
156      * To alter this value, see the configuration resource config_viewConfigurationTouchSlop
157      * in frameworks/base/core/res/res/values/config.xml or the appropriate device resource overlay.
158      * It may be appropriate to tweak this on a device-specific basis in an overlay based on
159      * the characteristics of the touch panel and firmware.
160      */
161     private static final int TOUCH_SLOP = 8;
162 
163     /**
164      * Defines the minimum size of the touch target for a scrollbar in dips
165      */
166     private static final int MIN_SCROLLBAR_TOUCH_TARGET = 48;
167 
168     /**
169      * Distance the first touch can wander before we stop considering this event a double tap
170      * (in dips)
171      */
172     private static final int DOUBLE_TAP_TOUCH_SLOP = TOUCH_SLOP;
173 
174     /**
175      * Distance a touch can wander before we think the user is attempting a paged scroll
176      * (in dips)
177      *
178      * Note that this value defined here is only used as a fallback by legacy/misbehaving
179      * applications that do not provide a Context for determining density/configuration-dependent
180      * values.
181      *
182      * See the note above on {@link #TOUCH_SLOP} regarding the dimen resource
183      * config_viewConfigurationTouchSlop. ViewConfiguration will report a paging touch slop of
184      * config_viewConfigurationTouchSlop * 2 when provided with a Context.
185      */
186     private static final int PAGING_TOUCH_SLOP = TOUCH_SLOP * 2;
187 
188     /**
189      * Distance in dips between the first touch and second touch to still be considered a double tap
190      */
191     private static final int DOUBLE_TAP_SLOP = 100;
192 
193     /**
194      * Distance in dips a touch needs to be outside of a window's bounds for it to
195      * count as outside for purposes of dismissing the window.
196      */
197     private static final int WINDOW_TOUCH_SLOP = 16;
198 
199     /**
200      * Minimum velocity to initiate a fling, as measured in dips per second
201      */
202     private static final int MINIMUM_FLING_VELOCITY = 50;
203 
204     /**
205      * Maximum velocity to initiate a fling, as measured in dips per second
206      */
207     private static final int MAXIMUM_FLING_VELOCITY = 8000;
208 
209     /**
210      * Delay before dispatching a recurring accessibility event in milliseconds.
211      * This delay guarantees that a recurring event will be send at most once
212      * during the {@link #SEND_RECURRING_ACCESSIBILITY_EVENTS_INTERVAL_MILLIS} time
213      * frame.
214      */
215     private static final long SEND_RECURRING_ACCESSIBILITY_EVENTS_INTERVAL_MILLIS = 100;
216 
217     /**
218      * The maximum size of View's drawing cache, expressed in bytes. This size
219      * should be at least equal to the size of the screen in ARGB888 format.
220      */
221     @Deprecated
222     private static final int MAXIMUM_DRAWING_CACHE_SIZE = 480 * 800 * 4; // ARGB8888
223 
224     /**
225      * The coefficient of friction applied to flings/scrolls.
226      */
227     private static final float SCROLL_FRICTION = 0.015f;
228 
229     /**
230      * Max distance in dips to overscroll for edge effects
231      */
232     private static final int OVERSCROLL_DISTANCE = 0;
233 
234     /**
235      * Max distance in dips to overfling for edge effects
236      */
237     private static final int OVERFLING_DISTANCE = 6;
238 
239     /**
240      * Amount to scroll in response to a horizontal {@link MotionEvent#ACTION_SCROLL} event,
241      * in dips per axis value.
242      */
243     private static final float HORIZONTAL_SCROLL_FACTOR = 64;
244 
245     /**
246      * Amount to scroll in response to a vertical {@link MotionEvent#ACTION_SCROLL} event,
247      * in dips per axis value.
248      */
249     private static final float VERTICAL_SCROLL_FACTOR = 64;
250 
251     /**
252      * Default duration to hide an action mode for.
253      */
254     private static final long ACTION_MODE_HIDE_DURATION_DEFAULT = 2000;
255 
256     /**
257      * Defines the duration in milliseconds before an end of a long press causes a tooltip to be
258      * hidden.
259      */
260     private static final int LONG_PRESS_TOOLTIP_HIDE_TIMEOUT = 1500;
261 
262     /**
263      * Defines the duration in milliseconds before a hover event causes a tooltip to be shown.
264      */
265     private static final int HOVER_TOOLTIP_SHOW_TIMEOUT = 500;
266 
267     /**
268      * Defines the duration in milliseconds before mouse inactivity causes a tooltip to be hidden.
269      * (default variant to be used when {@link View#SYSTEM_UI_FLAG_LOW_PROFILE} is not set).
270      */
271     private static final int HOVER_TOOLTIP_HIDE_TIMEOUT = 15000;
272 
273     /**
274      * Defines the duration in milliseconds before mouse inactivity causes a tooltip to be hidden
275      * (short version to be used when {@link View#SYSTEM_UI_FLAG_LOW_PROFILE} is set).
276      */
277     private static final int HOVER_TOOLTIP_HIDE_SHORT_TIMEOUT = 3000;
278 
279     /**
280      * Configuration values for overriding {@link #hasPermanentMenuKey()} behavior.
281      * These constants must match the definition in res/values/config.xml.
282      */
283     private static final int HAS_PERMANENT_MENU_KEY_AUTODETECT = 0;
284     private static final int HAS_PERMANENT_MENU_KEY_TRUE = 1;
285     private static final int HAS_PERMANENT_MENU_KEY_FALSE = 2;
286 
287     private final int mEdgeSlop;
288     private final int mFadingEdgeLength;
289     private final int mMinimumFlingVelocity;
290     private final int mMaximumFlingVelocity;
291     private final int mScrollbarSize;
292     private final int mTouchSlop;
293     private final int mHoverSlop;
294     private final int mMinScrollbarTouchTarget;
295     private final int mDoubleTapTouchSlop;
296     private final int mPagingTouchSlop;
297     private final int mDoubleTapSlop;
298     private final int mWindowTouchSlop;
299     private final int mMaximumDrawingCacheSize;
300     private final int mOverscrollDistance;
301     private final int mOverflingDistance;
302     private final boolean mFadingMarqueeEnabled;
303     private final long mGlobalActionsKeyTimeout;
304     private final float mVerticalScrollFactor;
305     private final float mHorizontalScrollFactor;
306     private final boolean mShowMenuShortcutsWhenKeyboardPresent;
307 
308     private boolean sHasPermanentMenuKey;
309     private boolean sHasPermanentMenuKeySet;
310 
311     static final SparseArray<ViewConfiguration> sConfigurations =
312             new SparseArray<ViewConfiguration>(2);
313 
314     /**
315      * @deprecated Use {@link android.view.ViewConfiguration#get(android.content.Context)} instead.
316      */
317     @Deprecated
ViewConfiguration()318     public ViewConfiguration() {
319         mEdgeSlop = EDGE_SLOP;
320         mFadingEdgeLength = FADING_EDGE_LENGTH;
321         mMinimumFlingVelocity = MINIMUM_FLING_VELOCITY;
322         mMaximumFlingVelocity = MAXIMUM_FLING_VELOCITY;
323         mScrollbarSize = SCROLL_BAR_SIZE;
324         mTouchSlop = TOUCH_SLOP;
325         mHoverSlop = TOUCH_SLOP / 2;
326         mMinScrollbarTouchTarget = MIN_SCROLLBAR_TOUCH_TARGET;
327         mDoubleTapTouchSlop = DOUBLE_TAP_TOUCH_SLOP;
328         mPagingTouchSlop = PAGING_TOUCH_SLOP;
329         mDoubleTapSlop = DOUBLE_TAP_SLOP;
330         mWindowTouchSlop = WINDOW_TOUCH_SLOP;
331         //noinspection deprecation
332         mMaximumDrawingCacheSize = MAXIMUM_DRAWING_CACHE_SIZE;
333         mOverscrollDistance = OVERSCROLL_DISTANCE;
334         mOverflingDistance = OVERFLING_DISTANCE;
335         mFadingMarqueeEnabled = true;
336         mGlobalActionsKeyTimeout = GLOBAL_ACTIONS_KEY_TIMEOUT;
337         mHorizontalScrollFactor = HORIZONTAL_SCROLL_FACTOR;
338         mVerticalScrollFactor = VERTICAL_SCROLL_FACTOR;
339         mShowMenuShortcutsWhenKeyboardPresent = false;
340     }
341 
342     /**
343      * Creates a new configuration for the specified context. The configuration depends on
344      * various parameters of the context, like the dimension of the display or the density
345      * of the display.
346      *
347      * @param context The application context used to initialize this view configuration.
348      *
349      * @see #get(android.content.Context)
350      * @see android.util.DisplayMetrics
351      */
ViewConfiguration(Context context)352     private ViewConfiguration(Context context) {
353         final Resources res = context.getResources();
354         final DisplayMetrics metrics = res.getDisplayMetrics();
355         final Configuration config = res.getConfiguration();
356         final float density = metrics.density;
357         final float sizeAndDensity;
358         if (config.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_XLARGE)) {
359             sizeAndDensity = density * 1.5f;
360         } else {
361             sizeAndDensity = density;
362         }
363 
364         mEdgeSlop = (int) (sizeAndDensity * EDGE_SLOP + 0.5f);
365         mFadingEdgeLength = (int) (sizeAndDensity * FADING_EDGE_LENGTH + 0.5f);
366         mScrollbarSize = res.getDimensionPixelSize(
367                 com.android.internal.R.dimen.config_scrollbarSize);
368         mDoubleTapSlop = (int) (sizeAndDensity * DOUBLE_TAP_SLOP + 0.5f);
369         mWindowTouchSlop = (int) (sizeAndDensity * WINDOW_TOUCH_SLOP + 0.5f);
370 
371         // Size of the screen in bytes, in ARGB_8888 format
372         final WindowManager win = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
373         final Display display = win.getDefaultDisplay();
374         final Point size = new Point();
375         display.getRealSize(size);
376         mMaximumDrawingCacheSize = 4 * size.x * size.y;
377 
378         mOverscrollDistance = (int) (sizeAndDensity * OVERSCROLL_DISTANCE + 0.5f);
379         mOverflingDistance = (int) (sizeAndDensity * OVERFLING_DISTANCE + 0.5f);
380 
381         if (!sHasPermanentMenuKeySet) {
382             final int configVal = res.getInteger(
383                     com.android.internal.R.integer.config_overrideHasPermanentMenuKey);
384 
385             switch (configVal) {
386                 default:
387                 case HAS_PERMANENT_MENU_KEY_AUTODETECT: {
388                     IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
389                     try {
390                         sHasPermanentMenuKey = !wm.hasNavigationBar();
391                         sHasPermanentMenuKeySet = true;
392                     } catch (RemoteException ex) {
393                         sHasPermanentMenuKey = false;
394                     }
395                 }
396                 break;
397 
398                 case HAS_PERMANENT_MENU_KEY_TRUE:
399                     sHasPermanentMenuKey = true;
400                     sHasPermanentMenuKeySet = true;
401                     break;
402 
403                 case HAS_PERMANENT_MENU_KEY_FALSE:
404                     sHasPermanentMenuKey = false;
405                     sHasPermanentMenuKeySet = true;
406                     break;
407             }
408         }
409 
410         mFadingMarqueeEnabled = res.getBoolean(
411                 com.android.internal.R.bool.config_ui_enableFadingMarquee);
412         mTouchSlop = res.getDimensionPixelSize(
413                 com.android.internal.R.dimen.config_viewConfigurationTouchSlop);
414         mHoverSlop = res.getDimensionPixelSize(
415                 com.android.internal.R.dimen.config_viewConfigurationHoverSlop);
416         mMinScrollbarTouchTarget = res.getDimensionPixelSize(
417                 com.android.internal.R.dimen.config_minScrollbarTouchTarget);
418         mPagingTouchSlop = mTouchSlop * 2;
419 
420         mDoubleTapTouchSlop = mTouchSlop;
421 
422         mMinimumFlingVelocity = res.getDimensionPixelSize(
423                 com.android.internal.R.dimen.config_viewMinFlingVelocity);
424         mMaximumFlingVelocity = res.getDimensionPixelSize(
425                 com.android.internal.R.dimen.config_viewMaxFlingVelocity);
426         mGlobalActionsKeyTimeout = res.getInteger(
427                 com.android.internal.R.integer.config_globalActionsKeyTimeout);
428 
429         mHorizontalScrollFactor = res.getDimensionPixelSize(
430                 com.android.internal.R.dimen.config_horizontalScrollFactor);
431         mVerticalScrollFactor = res.getDimensionPixelSize(
432                 com.android.internal.R.dimen.config_verticalScrollFactor);
433 
434         mShowMenuShortcutsWhenKeyboardPresent = res.getBoolean(
435             com.android.internal.R.bool.config_showMenuShortcutsWhenKeyboardPresent);
436 
437     }
438 
439     /**
440      * Returns a configuration for the specified context. The configuration depends on
441      * various parameters of the context, like the dimension of the display or the
442      * density of the display.
443      *
444      * @param context The application context used to initialize the view configuration.
445      */
get(Context context)446     public static ViewConfiguration get(Context context) {
447         final DisplayMetrics metrics = context.getResources().getDisplayMetrics();
448         final int density = (int) (100.0f * metrics.density);
449 
450         ViewConfiguration configuration = sConfigurations.get(density);
451         if (configuration == null) {
452             configuration = new ViewConfiguration(context);
453             sConfigurations.put(density, configuration);
454         }
455 
456         return configuration;
457     }
458 
459     /**
460      * @return The width of the horizontal scrollbar and the height of the vertical
461      *         scrollbar in dips
462      *
463      * @deprecated Use {@link #getScaledScrollBarSize()} instead.
464      */
465     @Deprecated
getScrollBarSize()466     public static int getScrollBarSize() {
467         return SCROLL_BAR_SIZE;
468     }
469 
470     /**
471      * @return The width of the horizontal scrollbar and the height of the vertical
472      *         scrollbar in pixels
473      */
getScaledScrollBarSize()474     public int getScaledScrollBarSize() {
475         return mScrollbarSize;
476     }
477 
478     /**
479      * @return the minimum size of the scrollbar thumb's touch target in pixels
480      * @hide
481      */
getScaledMinScrollbarTouchTarget()482     public int getScaledMinScrollbarTouchTarget() {
483         return mMinScrollbarTouchTarget;
484     }
485 
486     /**
487      * @return Duration of the fade when scrollbars fade away in milliseconds
488      */
getScrollBarFadeDuration()489     public static int getScrollBarFadeDuration() {
490         return SCROLL_BAR_FADE_DURATION;
491     }
492 
493     /**
494      * @return Default delay before the scrollbars fade in milliseconds
495      */
getScrollDefaultDelay()496     public static int getScrollDefaultDelay() {
497         return SCROLL_BAR_DEFAULT_DELAY;
498     }
499 
500     /**
501      * @return the length of the fading edges in dips
502      *
503      * @deprecated Use {@link #getScaledFadingEdgeLength()} instead.
504      */
505     @Deprecated
getFadingEdgeLength()506     public static int getFadingEdgeLength() {
507         return FADING_EDGE_LENGTH;
508     }
509 
510     /**
511      * @return the length of the fading edges in pixels
512      */
getScaledFadingEdgeLength()513     public int getScaledFadingEdgeLength() {
514         return mFadingEdgeLength;
515     }
516 
517     /**
518      * @return the duration in milliseconds of the pressed state in child
519      * components.
520      */
getPressedStateDuration()521     public static int getPressedStateDuration() {
522         return PRESSED_STATE_DURATION;
523     }
524 
525     /**
526      * @return the duration in milliseconds before a press turns into
527      * a long press
528      */
getLongPressTimeout()529     public static int getLongPressTimeout() {
530         return AppGlobals.getIntCoreSetting(Settings.Secure.LONG_PRESS_TIMEOUT,
531                 DEFAULT_LONG_PRESS_TIMEOUT);
532     }
533 
534     /**
535      * @return the duration in milliseconds between the first tap's up event and the second tap's
536      * down event for an interaction to be considered part of the same multi-press.
537      * @hide
538      */
getMultiPressTimeout()539     public static int getMultiPressTimeout() {
540         return AppGlobals.getIntCoreSetting(Settings.Secure.MULTI_PRESS_TIMEOUT,
541                 DEFAULT_MULTI_PRESS_TIMEOUT);
542     }
543 
544     /**
545      * @return the time before the first key repeat in milliseconds.
546      */
getKeyRepeatTimeout()547     public static int getKeyRepeatTimeout() {
548         return getLongPressTimeout();
549     }
550 
551     /**
552      * @return the time between successive key repeats in milliseconds.
553      */
getKeyRepeatDelay()554     public static int getKeyRepeatDelay() {
555         return KEY_REPEAT_DELAY;
556     }
557 
558     /**
559      * @return the duration in milliseconds we will wait to see if a touch event
560      * is a tap or a scroll. If the user does not move within this interval, it is
561      * considered to be a tap.
562      */
getTapTimeout()563     public static int getTapTimeout() {
564         return TAP_TIMEOUT;
565     }
566 
567     /**
568      * @return the duration in milliseconds we will wait to see if a touch event
569      * is a jump tap. If the user does not move within this interval, it is
570      * considered to be a tap.
571      */
getJumpTapTimeout()572     public static int getJumpTapTimeout() {
573         return JUMP_TAP_TIMEOUT;
574     }
575 
576     /**
577      * @return the duration in milliseconds between the first tap's up event and
578      * the second tap's down event for an interaction to be considered a
579      * double-tap.
580      */
getDoubleTapTimeout()581     public static int getDoubleTapTimeout() {
582         return DOUBLE_TAP_TIMEOUT;
583     }
584 
585     /**
586      * @return the minimum duration in milliseconds between the first tap's
587      * up event and the second tap's down event for an interaction to be considered a
588      * double-tap.
589      *
590      * @hide
591      */
getDoubleTapMinTime()592     public static int getDoubleTapMinTime() {
593         return DOUBLE_TAP_MIN_TIME;
594     }
595 
596     /**
597      * @return the maximum duration in milliseconds between a touch pad
598      * touch and release for a given touch to be considered a tap (click) as
599      * opposed to a hover movement gesture.
600      * @hide
601      */
getHoverTapTimeout()602     public static int getHoverTapTimeout() {
603         return HOVER_TAP_TIMEOUT;
604     }
605 
606     /**
607      * @return the maximum distance in pixels that a touch pad touch can move
608      * before being released for it to be considered a tap (click) as opposed
609      * to a hover movement gesture.
610      * @hide
611      */
getHoverTapSlop()612     public static int getHoverTapSlop() {
613         return HOVER_TAP_SLOP;
614     }
615 
616     /**
617      * @return Inset in dips to look for touchable content when the user touches the edge of the
618      *         screen
619      *
620      * @deprecated Use {@link #getScaledEdgeSlop()} instead.
621      */
622     @Deprecated
getEdgeSlop()623     public static int getEdgeSlop() {
624         return EDGE_SLOP;
625     }
626 
627     /**
628      * @return Inset in pixels to look for touchable content when the user touches the edge of the
629      *         screen
630      */
getScaledEdgeSlop()631     public int getScaledEdgeSlop() {
632         return mEdgeSlop;
633     }
634 
635     /**
636      * @return Distance in dips a touch can wander before we think the user is scrolling
637      *
638      * @deprecated Use {@link #getScaledTouchSlop()} instead.
639      */
640     @Deprecated
getTouchSlop()641     public static int getTouchSlop() {
642         return TOUCH_SLOP;
643     }
644 
645     /**
646      * @return Distance in pixels a touch can wander before we think the user is scrolling
647      */
getScaledTouchSlop()648     public int getScaledTouchSlop() {
649         return mTouchSlop;
650     }
651 
652     /**
653      * @return Distance in pixels a hover can wander while it is still considered "stationary".
654      *
655      */
getScaledHoverSlop()656     public int getScaledHoverSlop() {
657         return mHoverSlop;
658     }
659 
660     /**
661      * @return Distance in pixels the first touch can wander before we do not consider this a
662      * potential double tap event
663      * @hide
664      */
getScaledDoubleTapTouchSlop()665     public int getScaledDoubleTapTouchSlop() {
666         return mDoubleTapTouchSlop;
667     }
668 
669     /**
670      * @return Distance in pixels a touch can wander before we think the user is scrolling a full
671      * page
672      */
getScaledPagingTouchSlop()673     public int getScaledPagingTouchSlop() {
674         return mPagingTouchSlop;
675     }
676 
677     /**
678      * @return Distance in dips between the first touch and second touch to still be
679      *         considered a double tap
680      * @deprecated Use {@link #getScaledDoubleTapSlop()} instead.
681      * @hide The only client of this should be GestureDetector, which needs this
682      *       for clients that still use its deprecated constructor.
683      */
684     @Deprecated
getDoubleTapSlop()685     public static int getDoubleTapSlop() {
686         return DOUBLE_TAP_SLOP;
687     }
688 
689     /**
690      * @return Distance in pixels between the first touch and second touch to still be
691      *         considered a double tap
692      */
getScaledDoubleTapSlop()693     public int getScaledDoubleTapSlop() {
694         return mDoubleTapSlop;
695     }
696 
697     /**
698      * Interval for dispatching a recurring accessibility event in milliseconds.
699      * This interval guarantees that a recurring event will be send at most once
700      * during the {@link #getSendRecurringAccessibilityEventsInterval()} time frame.
701      *
702      * @return The delay in milliseconds.
703      *
704      * @hide
705      */
getSendRecurringAccessibilityEventsInterval()706     public static long getSendRecurringAccessibilityEventsInterval() {
707         return SEND_RECURRING_ACCESSIBILITY_EVENTS_INTERVAL_MILLIS;
708     }
709 
710     /**
711      * @return Distance in dips a touch must be outside the bounds of a window for it
712      * to be counted as outside the window for purposes of dismissing that
713      * window.
714      *
715      * @deprecated Use {@link #getScaledWindowTouchSlop()} instead.
716      */
717     @Deprecated
getWindowTouchSlop()718     public static int getWindowTouchSlop() {
719         return WINDOW_TOUCH_SLOP;
720     }
721 
722     /**
723      * @return Distance in pixels a touch must be outside the bounds of a window for it
724      * to be counted as outside the window for purposes of dismissing that window.
725      */
getScaledWindowTouchSlop()726     public int getScaledWindowTouchSlop() {
727         return mWindowTouchSlop;
728     }
729 
730     /**
731      * @return Minimum velocity to initiate a fling, as measured in dips per second.
732      *
733      * @deprecated Use {@link #getScaledMinimumFlingVelocity()} instead.
734      */
735     @Deprecated
getMinimumFlingVelocity()736     public static int getMinimumFlingVelocity() {
737         return MINIMUM_FLING_VELOCITY;
738     }
739 
740     /**
741      * @return Minimum velocity to initiate a fling, as measured in pixels per second.
742      */
getScaledMinimumFlingVelocity()743     public int getScaledMinimumFlingVelocity() {
744         return mMinimumFlingVelocity;
745     }
746 
747     /**
748      * @return Maximum velocity to initiate a fling, as measured in dips per second.
749      *
750      * @deprecated Use {@link #getScaledMaximumFlingVelocity()} instead.
751      */
752     @Deprecated
getMaximumFlingVelocity()753     public static int getMaximumFlingVelocity() {
754         return MAXIMUM_FLING_VELOCITY;
755     }
756 
757     /**
758      * @return Maximum velocity to initiate a fling, as measured in pixels per second.
759      */
getScaledMaximumFlingVelocity()760     public int getScaledMaximumFlingVelocity() {
761         return mMaximumFlingVelocity;
762     }
763 
764     /**
765      * @return Amount to scroll in response to a {@link MotionEvent#ACTION_SCROLL} event. Multiply
766      * this by the event's axis value to obtain the number of pixels to be scrolled.
767      *
768      * @removed
769      */
getScaledScrollFactor()770     public int getScaledScrollFactor() {
771         return (int) mVerticalScrollFactor;
772     }
773 
774     /**
775      * @return Amount to scroll in response to a horizontal {@link MotionEvent#ACTION_SCROLL} event.
776      * Multiply this by the event's axis value to obtain the number of pixels to be scrolled.
777      */
getScaledHorizontalScrollFactor()778     public float getScaledHorizontalScrollFactor() {
779         return mHorizontalScrollFactor;
780     }
781 
782     /**
783      * @return Amount to scroll in response to a vertical {@link MotionEvent#ACTION_SCROLL} event.
784      * Multiply this by the event's axis value to obtain the number of pixels to be scrolled.
785      */
getScaledVerticalScrollFactor()786     public float getScaledVerticalScrollFactor() {
787         return mVerticalScrollFactor;
788     }
789 
790     /**
791      * The maximum drawing cache size expressed in bytes.
792      *
793      * @return the maximum size of View's drawing cache expressed in bytes
794      *
795      * @deprecated Use {@link #getScaledMaximumDrawingCacheSize()} instead.
796      */
797     @Deprecated
getMaximumDrawingCacheSize()798     public static int getMaximumDrawingCacheSize() {
799         //noinspection deprecation
800         return MAXIMUM_DRAWING_CACHE_SIZE;
801     }
802 
803     /**
804      * The maximum drawing cache size expressed in bytes.
805      *
806      * @return the maximum size of View's drawing cache expressed in bytes
807      */
getScaledMaximumDrawingCacheSize()808     public int getScaledMaximumDrawingCacheSize() {
809         return mMaximumDrawingCacheSize;
810     }
811 
812     /**
813      * @return The maximum distance a View should overscroll by when showing edge effects (in
814      * pixels).
815      */
getScaledOverscrollDistance()816     public int getScaledOverscrollDistance() {
817         return mOverscrollDistance;
818     }
819 
820     /**
821      * @return The maximum distance a View should overfling by when showing edge effects (in
822      * pixels).
823      */
getScaledOverflingDistance()824     public int getScaledOverflingDistance() {
825         return mOverflingDistance;
826     }
827 
828     /**
829      * The amount of time that the zoom controls should be
830      * displayed on the screen expressed in milliseconds.
831      *
832      * @return the time the zoom controls should be visible expressed
833      * in milliseconds.
834      */
getZoomControlsTimeout()835     public static long getZoomControlsTimeout() {
836         return ZOOM_CONTROLS_TIMEOUT;
837     }
838 
839     /**
840      * The amount of time a user needs to press the relevant key to bring up
841      * the global actions dialog.
842      *
843      * @return how long a user needs to press the relevant key to bring up
844      *   the global actions dialog.
845      * @deprecated This timeout should not be used by applications
846      */
847     @Deprecated
getGlobalActionKeyTimeout()848     public static long getGlobalActionKeyTimeout() {
849         return GLOBAL_ACTIONS_KEY_TIMEOUT;
850     }
851 
852     /**
853      * The amount of time a user needs to press the relevant key to bring up
854      * the global actions dialog.
855      *
856      * @return how long a user needs to press the relevant key to bring up
857      *   the global actions dialog.
858      * @hide
859      */
getDeviceGlobalActionKeyTimeout()860     public long getDeviceGlobalActionKeyTimeout() {
861         return mGlobalActionsKeyTimeout;
862     }
863 
864     /**
865      * The amount of time a user needs to press the relevant keys to activate the accessibility
866      * shortcut.
867      *
868      * @return how long a user needs to press the relevant keys to activate the accessibility
869      *   shortcut.
870      * @hide
871      */
getAccessibilityShortcutKeyTimeout()872     public long getAccessibilityShortcutKeyTimeout() {
873         return A11Y_SHORTCUT_KEY_TIMEOUT;
874     }
875 
876     /**
877      * @return The amount of time a user needs to press the relevant keys to activate the
878      *   accessibility shortcut after it's confirmed that accessibility shortcut is used.
879      * @hide
880      */
getAccessibilityShortcutKeyTimeoutAfterConfirmation()881     public long getAccessibilityShortcutKeyTimeoutAfterConfirmation() {
882         return A11Y_SHORTCUT_KEY_TIMEOUT_AFTER_CONFIRMATION;
883     }
884 
885     /**
886      * The amount of friction applied to scrolls and flings.
887      *
888      * @return A scalar dimensionless value representing the coefficient of
889      *         friction.
890      */
getScrollFriction()891     public static float getScrollFriction() {
892         return SCROLL_FRICTION;
893     }
894 
895     /**
896      * @return the default duration in milliseconds for {@link ActionMode#hide(long)}.
897      */
getDefaultActionModeHideDuration()898     public static long getDefaultActionModeHideDuration() {
899         return ACTION_MODE_HIDE_DURATION_DEFAULT;
900     }
901 
902     /**
903      * Report if the device has a permanent menu key available to the user.
904      *
905      * <p>As of Android 3.0, devices may not have a permanent menu key available.
906      * Apps should use the action bar to present menu options to users.
907      * However, there are some apps where the action bar is inappropriate
908      * or undesirable. This method may be used to detect if a menu key is present.
909      * If not, applications should provide another on-screen affordance to access
910      * functionality.
911      *
912      * @return true if a permanent menu key is present, false otherwise.
913      */
hasPermanentMenuKey()914     public boolean hasPermanentMenuKey() {
915         return sHasPermanentMenuKey;
916     }
917 
918     /**
919      * Check if shortcuts should be displayed in menus.
920      *
921      * @return {@code True} if shortcuts should be displayed in menus.
922      */
shouldShowMenuShortcutsWhenKeyboardPresent()923     public boolean shouldShowMenuShortcutsWhenKeyboardPresent() {
924         return mShowMenuShortcutsWhenKeyboardPresent;
925     }
926 
927     /**
928      * @hide
929      * @return Whether or not marquee should use fading edges.
930      */
isFadingMarqueeEnabled()931     public boolean isFadingMarqueeEnabled() {
932         return mFadingMarqueeEnabled;
933     }
934 
935     /**
936      * @return the duration in milliseconds before an end of a long press causes a tooltip to be
937      * hidden
938      * @hide
939      */
940     @TestApi
getLongPressTooltipHideTimeout()941     public static int getLongPressTooltipHideTimeout() {
942         return LONG_PRESS_TOOLTIP_HIDE_TIMEOUT;
943     }
944 
945     /**
946      * @return the duration in milliseconds before a hover event causes a tooltip to be shown
947      * @hide
948      */
949     @TestApi
getHoverTooltipShowTimeout()950     public static int getHoverTooltipShowTimeout() {
951         return HOVER_TOOLTIP_SHOW_TIMEOUT;
952     }
953 
954     /**
955      * @return the duration in milliseconds before mouse inactivity causes a tooltip to be hidden
956      * (default variant to be used when {@link View#SYSTEM_UI_FLAG_LOW_PROFILE} is not set).
957      * @hide
958      */
959     @TestApi
getHoverTooltipHideTimeout()960     public static int getHoverTooltipHideTimeout() {
961         return HOVER_TOOLTIP_HIDE_TIMEOUT;
962     }
963 
964     /**
965      * @return the duration in milliseconds before mouse inactivity causes a tooltip to be hidden
966      * (shorter variant to be used when {@link View#SYSTEM_UI_FLAG_LOW_PROFILE} is set).
967      * @hide
968      */
969     @TestApi
getHoverTooltipHideShortTimeout()970     public static int getHoverTooltipHideShortTimeout() {
971         return HOVER_TOOLTIP_HIDE_SHORT_TIMEOUT;
972     }
973 }
974