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