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