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.app.AppGlobals;
20 import android.content.Context;
21 import android.content.res.Configuration;
22 import android.content.res.Resources;
23 import android.graphics.Point;
24 import android.os.RemoteException;
25 import android.provider.Settings;
26 import android.util.DisplayMetrics;
27 import android.util.SparseArray;
28 
29 /**
30  * Contains methods to standard constants used in the UI for timeouts, sizes, and distances.
31  */
32 public class ViewConfiguration {
33     /**
34      * Defines the width of the horizontal scrollbar and the height of the vertical scrollbar in
35      * dips
36      */
37     private static final int SCROLL_BAR_SIZE = 10;
38 
39     /**
40      * Duration of the fade when scrollbars fade away in milliseconds
41      */
42     private static final int SCROLL_BAR_FADE_DURATION = 250;
43 
44     /**
45      * Default delay before the scrollbars fade in milliseconds
46      */
47     private static final int SCROLL_BAR_DEFAULT_DELAY = 300;
48 
49     /**
50      * Defines the length of the fading edges in dips
51      */
52     private static final int FADING_EDGE_LENGTH = 12;
53 
54     /**
55      * Defines the duration in milliseconds of the pressed state in child
56      * components.
57      */
58     private static final int PRESSED_STATE_DURATION = 64;
59 
60     /**
61      * Defines the default duration in milliseconds before a press turns into
62      * a long press
63      */
64     private static final int DEFAULT_LONG_PRESS_TIMEOUT = 500;
65 
66     /**
67      * Defines the time between successive key repeats in milliseconds.
68      */
69     private static final int KEY_REPEAT_DELAY = 50;
70 
71     /**
72      * Defines the duration in milliseconds a user needs to hold down the
73      * appropriate button to bring up the global actions dialog (power off,
74      * lock screen, etc).
75      */
76     private static final int GLOBAL_ACTIONS_KEY_TIMEOUT = 500;
77 
78     /**
79      * Defines the duration in milliseconds we will wait to see if a touch event
80      * is a tap or a scroll. If the user does not move within this interval, it is
81      * considered to be a tap.
82      */
83     private static final int TAP_TIMEOUT = 100;
84 
85     /**
86      * Defines the duration in milliseconds we will wait to see if a touch event
87      * is a jump tap. If the user does not complete the jump tap within this interval, it is
88      * considered to be a tap.
89      */
90     private static final int JUMP_TAP_TIMEOUT = 500;
91 
92     /**
93      * Defines the duration in milliseconds between the first tap's up event and
94      * the second tap's down event for an interaction to be considered a
95      * double-tap.
96      */
97     private static final int DOUBLE_TAP_TIMEOUT = 300;
98 
99     /**
100      * Defines the minimum duration in milliseconds between the first tap's up event and
101      * the second tap's down event for an interaction to be considered a
102      * double-tap.
103      */
104     private static final int DOUBLE_TAP_MIN_TIME = 40;
105 
106     /**
107      * Defines the maximum duration in milliseconds between a touch pad
108      * touch and release for a given touch to be considered a tap (click) as
109      * opposed to a hover movement gesture.
110      */
111     private static final int HOVER_TAP_TIMEOUT = 150;
112 
113     /**
114      * Defines the maximum distance in pixels that a touch pad touch can move
115      * before being released for it to be considered a tap (click) as opposed
116      * to a hover movement gesture.
117      */
118     private static final int HOVER_TAP_SLOP = 20;
119 
120     /**
121      * Defines the duration in milliseconds we want to display zoom controls in response
122      * to a user panning within an application.
123      */
124     private static final int ZOOM_CONTROLS_TIMEOUT = 3000;
125 
126     /**
127      * Inset in dips to look for touchable content when the user touches the edge of the screen
128      */
129     private static final int EDGE_SLOP = 12;
130 
131     /**
132      * Distance a touch can wander before we think the user is scrolling in dips.
133      * Note that this value defined here is only used as a fallback by legacy/misbehaving
134      * applications that do not provide a Context for determining density/configuration-dependent
135      * values.
136      *
137      * To alter this value, see the configuration resource config_viewConfigurationTouchSlop
138      * in frameworks/base/core/res/res/values/config.xml or the appropriate device resource overlay.
139      * It may be appropriate to tweak this on a device-specific basis in an overlay based on
140      * the characteristics of the touch panel and firmware.
141      */
142     private static final int TOUCH_SLOP = 8;
143 
144     /**
145      * Distance the first touch can wander before we stop considering this event a double tap
146      * (in dips)
147      */
148     private static final int DOUBLE_TAP_TOUCH_SLOP = TOUCH_SLOP;
149 
150     /**
151      * Distance a touch can wander before we think the user is attempting a paged scroll
152      * (in dips)
153      *
154      * Note that this value defined here is only used as a fallback by legacy/misbehaving
155      * applications that do not provide a Context for determining density/configuration-dependent
156      * values.
157      *
158      * See the note above on {@link #TOUCH_SLOP} regarding the dimen resource
159      * config_viewConfigurationTouchSlop. ViewConfiguration will report a paging touch slop of
160      * config_viewConfigurationTouchSlop * 2 when provided with a Context.
161      */
162     private static final int PAGING_TOUCH_SLOP = TOUCH_SLOP * 2;
163 
164     /**
165      * Distance in dips between the first touch and second touch to still be considered a double tap
166      */
167     private static final int DOUBLE_TAP_SLOP = 100;
168 
169     /**
170      * Distance in dips a touch needs to be outside of a window's bounds for it to
171      * count as outside for purposes of dismissing the window.
172      */
173     private static final int WINDOW_TOUCH_SLOP = 16;
174 
175     /**
176      * Minimum velocity to initiate a fling, as measured in dips per second
177      */
178     private static final int MINIMUM_FLING_VELOCITY = 50;
179 
180     /**
181      * Maximum velocity to initiate a fling, as measured in dips per second
182      */
183     private static final int MAXIMUM_FLING_VELOCITY = 8000;
184 
185     /**
186      * Delay before dispatching a recurring accessibility event in milliseconds.
187      * This delay guarantees that a recurring event will be send at most once
188      * during the {@link #SEND_RECURRING_ACCESSIBILITY_EVENTS_INTERVAL_MILLIS} time
189      * frame.
190      */
191     private static final long SEND_RECURRING_ACCESSIBILITY_EVENTS_INTERVAL_MILLIS = 100;
192 
193     /**
194      * The maximum size of View's drawing cache, expressed in bytes. This size
195      * should be at least equal to the size of the screen in ARGB888 format.
196      */
197     @Deprecated
198     private static final int MAXIMUM_DRAWING_CACHE_SIZE = 480 * 800 * 4; // ARGB8888
199 
200     /**
201      * The coefficient of friction applied to flings/scrolls.
202      */
203     private static final float SCROLL_FRICTION = 0.015f;
204 
205     /**
206      * Max distance in dips to overscroll for edge effects
207      */
208     private static final int OVERSCROLL_DISTANCE = 0;
209 
210     /**
211      * Max distance in dips to overfling for edge effects
212      */
213     private static final int OVERFLING_DISTANCE = 6;
214 
215     /**
216      * Default duration to hide an action mode for.
217      */
218     private static final long ACTION_MODE_HIDE_DURATION_DEFAULT = 2000;
219 
220     /**
221      * Configuration values for overriding {@link #hasPermanentMenuKey()} behavior.
222      * These constants must match the definition in res/values/config.xml.
223      */
224     private static final int HAS_PERMANENT_MENU_KEY_AUTODETECT = 0;
225     private static final int HAS_PERMANENT_MENU_KEY_TRUE = 1;
226     private static final int HAS_PERMANENT_MENU_KEY_FALSE = 2;
227 
228     private final int mEdgeSlop;
229     private final int mFadingEdgeLength;
230     private final int mMinimumFlingVelocity;
231     private final int mMaximumFlingVelocity;
232     private final int mScrollbarSize;
233     private final int mTouchSlop;
234     private final int mDoubleTapTouchSlop;
235     private final int mPagingTouchSlop;
236     private final int mDoubleTapSlop;
237     private final int mWindowTouchSlop;
238     private final int mMaximumDrawingCacheSize;
239     private final int mOverscrollDistance;
240     private final int mOverflingDistance;
241     private final boolean mFadingMarqueeEnabled;
242     private final long mGlobalActionsKeyTimeout;
243 
244     private boolean sHasPermanentMenuKey;
245     private boolean sHasPermanentMenuKeySet;
246 
247     static final SparseArray<ViewConfiguration> sConfigurations =
248             new SparseArray<ViewConfiguration>(2);
249 
250     /**
251      * @deprecated Use {@link android.view.ViewConfiguration#get(android.content.Context)} instead.
252      */
253     @Deprecated
ViewConfiguration()254     public ViewConfiguration() {
255         mEdgeSlop = EDGE_SLOP;
256         mFadingEdgeLength = FADING_EDGE_LENGTH;
257         mMinimumFlingVelocity = MINIMUM_FLING_VELOCITY;
258         mMaximumFlingVelocity = MAXIMUM_FLING_VELOCITY;
259         mScrollbarSize = SCROLL_BAR_SIZE;
260         mTouchSlop = TOUCH_SLOP;
261         mDoubleTapTouchSlop = DOUBLE_TAP_TOUCH_SLOP;
262         mPagingTouchSlop = PAGING_TOUCH_SLOP;
263         mDoubleTapSlop = DOUBLE_TAP_SLOP;
264         mWindowTouchSlop = WINDOW_TOUCH_SLOP;
265         //noinspection deprecation
266         mMaximumDrawingCacheSize = MAXIMUM_DRAWING_CACHE_SIZE;
267         mOverscrollDistance = OVERSCROLL_DISTANCE;
268         mOverflingDistance = OVERFLING_DISTANCE;
269         mFadingMarqueeEnabled = true;
270         mGlobalActionsKeyTimeout = GLOBAL_ACTIONS_KEY_TIMEOUT;
271     }
272 
273     /**
274      * Creates a new configuration for the specified context. The configuration depends on
275      * various parameters of the context, like the dimension of the display or the density
276      * of the display.
277      *
278      * @param context The application context used to initialize this view configuration.
279      *
280      * @see #get(android.content.Context)
281      * @see android.util.DisplayMetrics
282      */
ViewConfiguration(Context context)283     private ViewConfiguration(Context context) {
284         final Resources res = context.getResources();
285         final DisplayMetrics metrics = res.getDisplayMetrics();
286         final Configuration config = res.getConfiguration();
287         final float density = metrics.density;
288         final float sizeAndDensity;
289         if (config.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_XLARGE)) {
290             sizeAndDensity = density * 1.5f;
291         } else {
292             sizeAndDensity = density;
293         }
294 
295         mEdgeSlop = (int) (sizeAndDensity * EDGE_SLOP + 0.5f);
296         mFadingEdgeLength = (int) (sizeAndDensity * FADING_EDGE_LENGTH + 0.5f);
297         mScrollbarSize = (int) (density * SCROLL_BAR_SIZE + 0.5f);
298         mDoubleTapSlop = (int) (sizeAndDensity * DOUBLE_TAP_SLOP + 0.5f);
299         mWindowTouchSlop = (int) (sizeAndDensity * WINDOW_TOUCH_SLOP + 0.5f);
300 
301         // Size of the screen in bytes, in ARGB_8888 format
302         final WindowManager win = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
303         final Display display = win.getDefaultDisplay();
304         final Point size = new Point();
305         display.getRealSize(size);
306         mMaximumDrawingCacheSize = 4 * size.x * size.y;
307 
308         mOverscrollDistance = (int) (sizeAndDensity * OVERSCROLL_DISTANCE + 0.5f);
309         mOverflingDistance = (int) (sizeAndDensity * OVERFLING_DISTANCE + 0.5f);
310 
311         if (!sHasPermanentMenuKeySet) {
312             final int configVal = res.getInteger(
313                     com.android.internal.R.integer.config_overrideHasPermanentMenuKey);
314 
315             switch (configVal) {
316                 default:
317                 case HAS_PERMANENT_MENU_KEY_AUTODETECT: {
318                     IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
319                     try {
320                         sHasPermanentMenuKey = !wm.hasNavigationBar();
321                         sHasPermanentMenuKeySet = true;
322                     } catch (RemoteException ex) {
323                         sHasPermanentMenuKey = false;
324                     }
325                 }
326                 break;
327 
328                 case HAS_PERMANENT_MENU_KEY_TRUE:
329                     sHasPermanentMenuKey = true;
330                     sHasPermanentMenuKeySet = true;
331                     break;
332 
333                 case HAS_PERMANENT_MENU_KEY_FALSE:
334                     sHasPermanentMenuKey = false;
335                     sHasPermanentMenuKeySet = true;
336                     break;
337             }
338         }
339 
340         mFadingMarqueeEnabled = res.getBoolean(
341                 com.android.internal.R.bool.config_ui_enableFadingMarquee);
342         mTouchSlop = res.getDimensionPixelSize(
343                 com.android.internal.R.dimen.config_viewConfigurationTouchSlop);
344         mPagingTouchSlop = mTouchSlop * 2;
345 
346         mDoubleTapTouchSlop = mTouchSlop;
347 
348         mMinimumFlingVelocity = res.getDimensionPixelSize(
349                 com.android.internal.R.dimen.config_viewMinFlingVelocity);
350         mMaximumFlingVelocity = res.getDimensionPixelSize(
351                 com.android.internal.R.dimen.config_viewMaxFlingVelocity);
352         mGlobalActionsKeyTimeout = res.getInteger(
353                 com.android.internal.R.integer.config_globalActionsKeyTimeout);
354     }
355 
356     /**
357      * Returns a configuration for the specified context. The configuration depends on
358      * various parameters of the context, like the dimension of the display or the
359      * density of the display.
360      *
361      * @param context The application context used to initialize the view configuration.
362      */
get(Context context)363     public static ViewConfiguration get(Context context) {
364         final DisplayMetrics metrics = context.getResources().getDisplayMetrics();
365         final int density = (int) (100.0f * metrics.density);
366 
367         ViewConfiguration configuration = sConfigurations.get(density);
368         if (configuration == null) {
369             configuration = new ViewConfiguration(context);
370             sConfigurations.put(density, configuration);
371         }
372 
373         return configuration;
374     }
375 
376     /**
377      * @return The width of the horizontal scrollbar and the height of the vertical
378      *         scrollbar in dips
379      *
380      * @deprecated Use {@link #getScaledScrollBarSize()} instead.
381      */
382     @Deprecated
getScrollBarSize()383     public static int getScrollBarSize() {
384         return SCROLL_BAR_SIZE;
385     }
386 
387     /**
388      * @return The width of the horizontal scrollbar and the height of the vertical
389      *         scrollbar in pixels
390      */
getScaledScrollBarSize()391     public int getScaledScrollBarSize() {
392         return mScrollbarSize;
393     }
394 
395     /**
396      * @return Duration of the fade when scrollbars fade away in milliseconds
397      */
getScrollBarFadeDuration()398     public static int getScrollBarFadeDuration() {
399         return SCROLL_BAR_FADE_DURATION;
400     }
401 
402     /**
403      * @return Default delay before the scrollbars fade in milliseconds
404      */
getScrollDefaultDelay()405     public static int getScrollDefaultDelay() {
406         return SCROLL_BAR_DEFAULT_DELAY;
407     }
408 
409     /**
410      * @return the length of the fading edges in dips
411      *
412      * @deprecated Use {@link #getScaledFadingEdgeLength()} instead.
413      */
414     @Deprecated
getFadingEdgeLength()415     public static int getFadingEdgeLength() {
416         return FADING_EDGE_LENGTH;
417     }
418 
419     /**
420      * @return the length of the fading edges in pixels
421      */
getScaledFadingEdgeLength()422     public int getScaledFadingEdgeLength() {
423         return mFadingEdgeLength;
424     }
425 
426     /**
427      * @return the duration in milliseconds of the pressed state in child
428      * components.
429      */
getPressedStateDuration()430     public static int getPressedStateDuration() {
431         return PRESSED_STATE_DURATION;
432     }
433 
434     /**
435      * @return the duration in milliseconds before a press turns into
436      * a long press
437      */
getLongPressTimeout()438     public static int getLongPressTimeout() {
439         return AppGlobals.getIntCoreSetting(Settings.Secure.LONG_PRESS_TIMEOUT,
440                 DEFAULT_LONG_PRESS_TIMEOUT);
441     }
442 
443     /**
444      * @return the time before the first key repeat in milliseconds.
445      */
getKeyRepeatTimeout()446     public static int getKeyRepeatTimeout() {
447         return getLongPressTimeout();
448     }
449 
450     /**
451      * @return the time between successive key repeats in milliseconds.
452      */
getKeyRepeatDelay()453     public static int getKeyRepeatDelay() {
454         return KEY_REPEAT_DELAY;
455     }
456 
457     /**
458      * @return the duration in milliseconds we will wait to see if a touch event
459      * is a tap or a scroll. If the user does not move within this interval, it is
460      * considered to be a tap.
461      */
getTapTimeout()462     public static int getTapTimeout() {
463         return TAP_TIMEOUT;
464     }
465 
466     /**
467      * @return the duration in milliseconds we will wait to see if a touch event
468      * is a jump tap. If the user does not move within this interval, it is
469      * considered to be a tap.
470      */
getJumpTapTimeout()471     public static int getJumpTapTimeout() {
472         return JUMP_TAP_TIMEOUT;
473     }
474 
475     /**
476      * @return the duration in milliseconds between the first tap's up event and
477      * the second tap's down event for an interaction to be considered a
478      * double-tap.
479      */
getDoubleTapTimeout()480     public static int getDoubleTapTimeout() {
481         return DOUBLE_TAP_TIMEOUT;
482     }
483 
484     /**
485      * @return the minimum duration in milliseconds between the first tap's
486      * up event and the second tap's down event for an interaction to be considered a
487      * double-tap.
488      *
489      * @hide
490      */
getDoubleTapMinTime()491     public static int getDoubleTapMinTime() {
492         return DOUBLE_TAP_MIN_TIME;
493     }
494 
495     /**
496      * @return the maximum duration in milliseconds between a touch pad
497      * touch and release for a given touch to be considered a tap (click) as
498      * opposed to a hover movement gesture.
499      * @hide
500      */
getHoverTapTimeout()501     public static int getHoverTapTimeout() {
502         return HOVER_TAP_TIMEOUT;
503     }
504 
505     /**
506      * @return the maximum distance in pixels that a touch pad touch can move
507      * before being released for it to be considered a tap (click) as opposed
508      * to a hover movement gesture.
509      * @hide
510      */
getHoverTapSlop()511     public static int getHoverTapSlop() {
512         return HOVER_TAP_SLOP;
513     }
514 
515     /**
516      * @return Inset in dips to look for touchable content when the user touches the edge of the
517      *         screen
518      *
519      * @deprecated Use {@link #getScaledEdgeSlop()} instead.
520      */
521     @Deprecated
getEdgeSlop()522     public static int getEdgeSlop() {
523         return EDGE_SLOP;
524     }
525 
526     /**
527      * @return Inset in pixels to look for touchable content when the user touches the edge of the
528      *         screen
529      */
getScaledEdgeSlop()530     public int getScaledEdgeSlop() {
531         return mEdgeSlop;
532     }
533 
534     /**
535      * @return Distance in dips a touch can wander before we think the user is scrolling
536      *
537      * @deprecated Use {@link #getScaledTouchSlop()} instead.
538      */
539     @Deprecated
getTouchSlop()540     public static int getTouchSlop() {
541         return TOUCH_SLOP;
542     }
543 
544     /**
545      * @return Distance in pixels a touch can wander before we think the user is scrolling
546      */
getScaledTouchSlop()547     public int getScaledTouchSlop() {
548         return mTouchSlop;
549     }
550 
551     /**
552      * @return Distance in pixels the first touch can wander before we do not consider this a
553      * potential double tap event
554      * @hide
555      */
getScaledDoubleTapTouchSlop()556     public int getScaledDoubleTapTouchSlop() {
557         return mDoubleTapTouchSlop;
558     }
559 
560     /**
561      * @return Distance in pixels a touch can wander before we think the user is scrolling a full
562      * page
563      */
getScaledPagingTouchSlop()564     public int getScaledPagingTouchSlop() {
565         return mPagingTouchSlop;
566     }
567 
568     /**
569      * @return Distance in dips between the first touch and second touch to still be
570      *         considered a double tap
571      * @deprecated Use {@link #getScaledDoubleTapSlop()} instead.
572      * @hide The only client of this should be GestureDetector, which needs this
573      *       for clients that still use its deprecated constructor.
574      */
575     @Deprecated
getDoubleTapSlop()576     public static int getDoubleTapSlop() {
577         return DOUBLE_TAP_SLOP;
578     }
579 
580     /**
581      * @return Distance in pixels between the first touch and second touch to still be
582      *         considered a double tap
583      */
getScaledDoubleTapSlop()584     public int getScaledDoubleTapSlop() {
585         return mDoubleTapSlop;
586     }
587 
588     /**
589      * Interval for dispatching a recurring accessibility event in milliseconds.
590      * This interval guarantees that a recurring event will be send at most once
591      * during the {@link #getSendRecurringAccessibilityEventsInterval()} time frame.
592      *
593      * @return The delay in milliseconds.
594      *
595      * @hide
596      */
getSendRecurringAccessibilityEventsInterval()597     public static long getSendRecurringAccessibilityEventsInterval() {
598         return SEND_RECURRING_ACCESSIBILITY_EVENTS_INTERVAL_MILLIS;
599     }
600 
601     /**
602      * @return Distance in dips a touch must be outside the bounds of a window for it
603      * to be counted as outside the window for purposes of dismissing that
604      * window.
605      *
606      * @deprecated Use {@link #getScaledWindowTouchSlop()} instead.
607      */
608     @Deprecated
getWindowTouchSlop()609     public static int getWindowTouchSlop() {
610         return WINDOW_TOUCH_SLOP;
611     }
612 
613     /**
614      * @return Distance in pixels a touch must be outside the bounds of a window for it
615      * to be counted as outside the window for purposes of dismissing that window.
616      */
getScaledWindowTouchSlop()617     public int getScaledWindowTouchSlop() {
618         return mWindowTouchSlop;
619     }
620 
621     /**
622      * @return Minimum velocity to initiate a fling, as measured in dips per second.
623      *
624      * @deprecated Use {@link #getScaledMinimumFlingVelocity()} instead.
625      */
626     @Deprecated
getMinimumFlingVelocity()627     public static int getMinimumFlingVelocity() {
628         return MINIMUM_FLING_VELOCITY;
629     }
630 
631     /**
632      * @return Minimum velocity to initiate a fling, as measured in pixels per second.
633      */
getScaledMinimumFlingVelocity()634     public int getScaledMinimumFlingVelocity() {
635         return mMinimumFlingVelocity;
636     }
637 
638     /**
639      * @return Maximum velocity to initiate a fling, as measured in dips per second.
640      *
641      * @deprecated Use {@link #getScaledMaximumFlingVelocity()} instead.
642      */
643     @Deprecated
getMaximumFlingVelocity()644     public static int getMaximumFlingVelocity() {
645         return MAXIMUM_FLING_VELOCITY;
646     }
647 
648     /**
649      * @return Maximum velocity to initiate a fling, as measured in pixels per second.
650      */
getScaledMaximumFlingVelocity()651     public int getScaledMaximumFlingVelocity() {
652         return mMaximumFlingVelocity;
653     }
654 
655     /**
656      * The maximum drawing cache size expressed in bytes.
657      *
658      * @return the maximum size of View's drawing cache expressed in bytes
659      *
660      * @deprecated Use {@link #getScaledMaximumDrawingCacheSize()} instead.
661      */
662     @Deprecated
getMaximumDrawingCacheSize()663     public static int getMaximumDrawingCacheSize() {
664         //noinspection deprecation
665         return MAXIMUM_DRAWING_CACHE_SIZE;
666     }
667 
668     /**
669      * The maximum drawing cache size expressed in bytes.
670      *
671      * @return the maximum size of View's drawing cache expressed in bytes
672      */
getScaledMaximumDrawingCacheSize()673     public int getScaledMaximumDrawingCacheSize() {
674         return mMaximumDrawingCacheSize;
675     }
676 
677     /**
678      * @return The maximum distance a View should overscroll by when showing edge effects (in
679      * pixels).
680      */
getScaledOverscrollDistance()681     public int getScaledOverscrollDistance() {
682         return mOverscrollDistance;
683     }
684 
685     /**
686      * @return The maximum distance a View should overfling by when showing edge effects (in
687      * pixels).
688      */
getScaledOverflingDistance()689     public int getScaledOverflingDistance() {
690         return mOverflingDistance;
691     }
692 
693     /**
694      * The amount of time that the zoom controls should be
695      * displayed on the screen expressed in milliseconds.
696      *
697      * @return the time the zoom controls should be visible expressed
698      * in milliseconds.
699      */
getZoomControlsTimeout()700     public static long getZoomControlsTimeout() {
701         return ZOOM_CONTROLS_TIMEOUT;
702     }
703 
704     /**
705      * The amount of time a user needs to press the relevant key to bring up
706      * the global actions dialog.
707      *
708      * @return how long a user needs to press the relevant key to bring up
709      *   the global actions dialog.
710      * @deprecated This timeout should not be used by applications
711      */
712     @Deprecated
getGlobalActionKeyTimeout()713     public static long getGlobalActionKeyTimeout() {
714         return GLOBAL_ACTIONS_KEY_TIMEOUT;
715     }
716 
717     /**
718      * The amount of time a user needs to press the relevant key to bring up
719      * the global actions dialog.
720      *
721      * @return how long a user needs to press the relevant key to bring up
722      *   the global actions dialog.
723      * @hide
724      */
getDeviceGlobalActionKeyTimeout()725     public long getDeviceGlobalActionKeyTimeout() {
726         return mGlobalActionsKeyTimeout;
727     }
728 
729     /**
730      * The amount of friction applied to scrolls and flings.
731      *
732      * @return A scalar dimensionless value representing the coefficient of
733      *         friction.
734      */
getScrollFriction()735     public static float getScrollFriction() {
736         return SCROLL_FRICTION;
737     }
738 
739     /**
740      * @return the default duration in milliseconds for {@link ActionMode#hide(long)}.
741      */
getDefaultActionModeHideDuration()742     public static long getDefaultActionModeHideDuration() {
743         return ACTION_MODE_HIDE_DURATION_DEFAULT;
744     }
745 
746     /**
747      * Report if the device has a permanent menu key available to the user.
748      *
749      * <p>As of Android 3.0, devices may not have a permanent menu key available.
750      * Apps should use the action bar to present menu options to users.
751      * However, there are some apps where the action bar is inappropriate
752      * or undesirable. This method may be used to detect if a menu key is present.
753      * If not, applications should provide another on-screen affordance to access
754      * functionality.
755      *
756      * @return true if a permanent menu key is present, false otherwise.
757      */
hasPermanentMenuKey()758     public boolean hasPermanentMenuKey() {
759         return sHasPermanentMenuKey;
760     }
761 
762     /**
763      * @hide
764      * @return Whether or not marquee should use fading edges.
765      */
isFadingMarqueeEnabled()766     public boolean isFadingMarqueeEnabled() {
767         return mFadingMarqueeEnabled;
768     }
769 }
770