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