aboutsummaryrefslogtreecommitdiffstats
path: root/src/android/support/v4/view/ViewCompat.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/support/v4/view/ViewCompat.java')
-rw-r--r--src/android/support/v4/view/ViewCompat.java1112
1 files changed, 1112 insertions, 0 deletions
diff --git a/src/android/support/v4/view/ViewCompat.java b/src/android/support/v4/view/ViewCompat.java
new file mode 100644
index 0000000..8dc9965
--- /dev/null
+++ b/src/android/support/v4/view/ViewCompat.java
@@ -0,0 +1,1112 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.view;
+
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat;
+import android.view.View;
+import android.view.ViewParent;
+import android.view.accessibility.AccessibilityEvent;
+
+/**
+ * Helper for accessing features in {@link View} introduced after API
+ * level 4 in a backwards compatible fashion.
+ */
+public class ViewCompat {
+ /**
+ * Always allow a user to over-scroll this view, provided it is a
+ * view that can scroll.
+ */
+ public static final int OVER_SCROLL_ALWAYS = 0;
+
+ /**
+ * Allow a user to over-scroll this view only if the content is large
+ * enough to meaningfully scroll, provided it is a view that can scroll.
+ */
+ public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1;
+
+ /**
+ * Never allow a user to over-scroll this view.
+ */
+ public static final int OVER_SCROLL_NEVER = 2;
+
+ private static final long FAKE_FRAME_TIME = 10;
+
+ /**
+ * Automatically determine whether a view is important for accessibility.
+ */
+ public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0x00000000;
+
+ /**
+ * The view is important for accessibility.
+ */
+ public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 0x00000001;
+
+ /**
+ * The view is not important for accessibility.
+ */
+ public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 0x00000002;
+
+ /**
+ * The view is not important for accessibility, nor are any of its
+ * descendant views.
+ */
+ public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 0x00000004;
+
+ /**
+ * Live region mode specifying that accessibility services should not
+ * automatically announce changes to this view. This is the default live
+ * region mode for most views.
+ * <p>
+ * Use with {@link ViewCompat#setAccessibilityLiveRegion(View, int)}.
+ */
+ public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0x00000000;
+
+ /**
+ * Live region mode specifying that accessibility services should announce
+ * changes to this view.
+ * <p>
+ * Use with {@link ViewCompat#setAccessibilityLiveRegion(View, int)}.
+ */
+ public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 0x00000001;
+
+ /**
+ * Live region mode specifying that accessibility services should interrupt
+ * ongoing speech to immediately announce changes to this view.
+ * <p>
+ * Use with {@link ViewCompat#setAccessibilityLiveRegion(View, int)}.
+ */
+ public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 0x00000002;
+
+ /**
+ * Indicates that the view does not have a layer.
+ */
+ public static final int LAYER_TYPE_NONE = 0;
+
+ /**
+ * <p>Indicates that the view has a software layer. A software layer is backed
+ * by a bitmap and causes the view to be rendered using Android's software
+ * rendering pipeline, even if hardware acceleration is enabled.</p>
+ *
+ * <p>Software layers have various usages:</p>
+ * <p>When the application is not using hardware acceleration, a software layer
+ * is useful to apply a specific color filter and/or blending mode and/or
+ * translucency to a view and all its children.</p>
+ * <p>When the application is using hardware acceleration, a software layer
+ * is useful to render drawing primitives not supported by the hardware
+ * accelerated pipeline. It can also be used to cache a complex view tree
+ * into a texture and reduce the complexity of drawing operations. For instance,
+ * when animating a complex view tree with a translation, a software layer can
+ * be used to render the view tree only once.</p>
+ * <p>Software layers should be avoided when the affected view tree updates
+ * often. Every update will require to re-render the software layer, which can
+ * potentially be slow (particularly when hardware acceleration is turned on
+ * since the layer will have to be uploaded into a hardware texture after every
+ * update.)</p>
+ */
+ public static final int LAYER_TYPE_SOFTWARE = 1;
+
+ /**
+ * <p>Indicates that the view has a hardware layer. A hardware layer is backed
+ * by a hardware specific texture (generally Frame Buffer Objects or FBO on
+ * OpenGL hardware) and causes the view to be rendered using Android's hardware
+ * rendering pipeline, but only if hardware acceleration is turned on for the
+ * view hierarchy. When hardware acceleration is turned off, hardware layers
+ * behave exactly as {@link #LAYER_TYPE_SOFTWARE software layers}.</p>
+ *
+ * <p>A hardware layer is useful to apply a specific color filter and/or
+ * blending mode and/or translucency to a view and all its children.</p>
+ * <p>A hardware layer can be used to cache a complex view tree into a
+ * texture and reduce the complexity of drawing operations. For instance,
+ * when animating a complex view tree with a translation, a hardware layer can
+ * be used to render the view tree only once.</p>
+ * <p>A hardware layer can also be used to increase the rendering quality when
+ * rotation transformations are applied on a view. It can also be used to
+ * prevent potential clipping issues when applying 3D transforms on a view.</p>
+ */
+ public static final int LAYER_TYPE_HARDWARE = 2;
+
+ /**
+ * Horizontal layout direction of this view is from Left to Right.
+ */
+ public static final int LAYOUT_DIRECTION_LTR = 0;
+
+ /**
+ * Horizontal layout direction of this view is from Right to Left.
+ */
+ public static final int LAYOUT_DIRECTION_RTL = 1;
+
+ /**
+ * Horizontal layout direction of this view is inherited from its parent.
+ * Use with {@link #setLayoutDirection}.
+ */
+ public static final int LAYOUT_DIRECTION_INHERIT = 2;
+
+ /**
+ * Horizontal layout direction of this view is from deduced from the default language
+ * script for the locale. Use with {@link #setLayoutDirection}.
+ */
+ public static final int LAYOUT_DIRECTION_LOCALE = 3;
+
+ /**
+ * Bits of {@link #getMeasuredWidthAndState} and
+ * {@link #getMeasuredWidthAndState} that provide the actual measured size.
+ */
+ public static final int MEASURED_SIZE_MASK = 0x00ffffff;
+
+ /**
+ * Bits of {@link #getMeasuredWidthAndState} and
+ * {@link #getMeasuredWidthAndState} that provide the additional state bits.
+ */
+ public static final int MEASURED_STATE_MASK = 0xff000000;
+
+ /**
+ * Bit shift of {@link #MEASURED_STATE_MASK} to get to the height bits
+ * for functions that combine both width and height into a single int,
+ * such as {@link #getMeasuredState} and the childState argument of
+ * {@link #resolveSizeAndState(int, int, int)}.
+ */
+ public static final int MEASURED_HEIGHT_STATE_SHIFT = 16;
+
+ /**
+ * Bit of {@link #getMeasuredWidthAndState} and
+ * {@link #getMeasuredWidthAndState} that indicates the measured size
+ * is smaller that the space the view would like to have.
+ */
+ public static final int MEASURED_STATE_TOO_SMALL = 0x01000000;
+
+ interface ViewCompatImpl {
+ public boolean canScrollHorizontally(View v, int direction);
+ public boolean canScrollVertically(View v, int direction);
+ public int getOverScrollMode(View v);
+ public void setOverScrollMode(View v, int mode);
+ public void onInitializeAccessibilityEvent(View v, AccessibilityEvent event);
+ public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event);
+ public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info);
+ public void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate);
+ public boolean hasTransientState(View view);
+ public void setHasTransientState(View view, boolean hasTransientState);
+ public void postInvalidateOnAnimation(View view);
+ public void postInvalidateOnAnimation(View view, int left, int top, int right, int bottom);
+ public void postOnAnimation(View view, Runnable action);
+ public void postOnAnimationDelayed(View view, Runnable action, long delayMillis);
+ public int getImportantForAccessibility(View view);
+ public void setImportantForAccessibility(View view, int mode);
+ public boolean performAccessibilityAction(View view, int action, Bundle arguments);
+ public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view);
+ public float getAlpha(View view);
+ public void setLayerType(View view, int layerType, Paint paint);
+ public int getLayerType(View view);
+ public int getLabelFor(View view);
+ public void setLabelFor(View view, int id);
+ public void setLayerPaint(View view, Paint paint);
+ public int getLayoutDirection(View view);
+ public void setLayoutDirection(View view, int layoutDirection);
+ public ViewParent getParentForAccessibility(View view);
+ public boolean isOpaque(View view);
+ public int resolveSizeAndState(int size, int measureSpec, int childMeasuredState);
+ public int getMeasuredWidthAndState(View view);
+ public int getMeasuredHeightAndState(View view);
+ public int getMeasuredState(View view);
+ public int getAccessibilityLiveRegion(View view);
+ public void setAccessibilityLiveRegion(View view, int mode);
+ }
+
+ static class BaseViewCompatImpl implements ViewCompatImpl {
+ @Override
+ public boolean canScrollHorizontally(View v, int direction) {
+ return false;
+ }
+ @Override
+ public boolean canScrollVertically(View v, int direction) {
+ return false;
+ }
+ @Override
+ public int getOverScrollMode(View v) {
+ return OVER_SCROLL_NEVER;
+ }
+ @Override
+ public void setOverScrollMode(View v, int mode) {
+ // Do nothing; API doesn't exist
+ }
+ @Override
+ public void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate) {
+ // Do nothing; API doesn't exist
+ }
+ @Override
+ public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {
+ // Do nothing; API doesn't exist
+ }
+ @Override
+ public void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) {
+ // Do nothing; API doesn't exist
+ }
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) {
+ // Do nothing; API doesn't exist
+ }
+ @Override
+ public boolean hasTransientState(View view) {
+ // A view can't have transient state if transient state wasn't supported.
+ return false;
+ }
+ @Override
+ public void setHasTransientState(View view, boolean hasTransientState) {
+ // Do nothing; API doesn't exist
+ }
+ @Override
+ public void postInvalidateOnAnimation(View view) {
+ view.postInvalidateDelayed(getFrameTime());
+ }
+ @Override
+ public void postInvalidateOnAnimation(View view, int left, int top, int right, int bottom) {
+ view.postInvalidateDelayed(getFrameTime(), left, top, right, bottom);
+ }
+ @Override
+ public void postOnAnimation(View view, Runnable action) {
+ view.postDelayed(action, getFrameTime());
+ }
+ @Override
+ public void postOnAnimationDelayed(View view, Runnable action, long delayMillis) {
+ view.postDelayed(action, getFrameTime() + delayMillis);
+ }
+ @SuppressWarnings("static-method")
+ long getFrameTime() {
+ return FAKE_FRAME_TIME;
+ }
+ @Override
+ public int getImportantForAccessibility(View view) {
+ return 0;
+ }
+ @Override
+ public void setImportantForAccessibility(View view, int mode) {
+ return;
+ }
+ @Override
+ public boolean performAccessibilityAction(View view, int action, Bundle arguments) {
+ return false;
+ }
+ @Override
+ public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view) {
+ return null;
+ }
+ @Override
+ public float getAlpha(View view) {
+ return 1.0f;
+ }
+ @Override
+ public void setLayerType(View view, int layerType, Paint paint) {
+ // No-op until layers became available (HC)
+ }
+ @Override
+ public int getLayerType(View view) {
+ return LAYER_TYPE_NONE;
+ }
+ @Override
+ public int getLabelFor(View view) {
+ return 0;
+ }
+ @Override
+ public void setLabelFor(View view, int id) {
+ return;
+ }
+ @Override
+ public void setLayerPaint(View view, Paint p) {
+ // No-op until layers became available (HC)
+ }
+
+ @Override
+ public int getLayoutDirection(View view) {
+ return LAYOUT_DIRECTION_LTR;
+ }
+
+ @Override
+ public void setLayoutDirection(View view, int layoutDirection) {
+ // No-op
+ }
+
+ @Override
+ public ViewParent getParentForAccessibility(View view) {
+ return view.getParent();
+ }
+
+ @Override
+ public boolean isOpaque(View view) {
+ final Drawable bg = view.getBackground();
+ if (bg != null) {
+ return bg.getOpacity() == PixelFormat.OPAQUE;
+ }
+ return false;
+ }
+
+ @Override
+ public int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
+ return View.resolveSize(size, measureSpec);
+ }
+
+ @Override
+ public int getMeasuredWidthAndState(View view) {
+ return view.getMeasuredWidth();
+ }
+
+ @Override
+ public int getMeasuredHeightAndState(View view) {
+ return view.getMeasuredHeight();
+ }
+
+ @Override
+ public int getMeasuredState(View view) {
+ return 0;
+ }
+
+ @Override
+ public int getAccessibilityLiveRegion(View view) {
+ return ACCESSIBILITY_LIVE_REGION_NONE;
+ }
+
+ @Override
+ public void setAccessibilityLiveRegion(View view, int mode) {
+ // No-op
+ }
+ }
+
+ static class EclairMr1ViewCompatImpl extends BaseViewCompatImpl {
+ @Override
+ public boolean isOpaque(View view) {
+ return ViewCompatEclairMr1.isOpaque(view);
+ }
+ }
+
+ static class GBViewCompatImpl extends EclairMr1ViewCompatImpl {
+ @Override
+ public int getOverScrollMode(View v) {
+ return ViewCompatGingerbread.getOverScrollMode(v);
+ }
+ @Override
+ public void setOverScrollMode(View v, int mode) {
+ ViewCompatGingerbread.setOverScrollMode(v, mode);
+ }
+ }
+
+ static class HCViewCompatImpl extends GBViewCompatImpl {
+ @Override
+ long getFrameTime() {
+ return ViewCompatHC.getFrameTime();
+ }
+ @Override
+ public float getAlpha(View view) {
+ return ViewCompatHC.getAlpha(view);
+ }
+ @Override
+ public void setLayerType(View view, int layerType, Paint paint) {
+ ViewCompatHC.setLayerType(view, layerType, paint);
+ }
+ @Override
+ public int getLayerType(View view) {
+ return ViewCompatHC.getLayerType(view);
+ }
+ @Override
+ public void setLayerPaint(View view, Paint paint) {
+ // Make sure the paint is correct; this will be cheap if it's the same
+ // instance as was used to call setLayerType earlier.
+ setLayerType(view, getLayerType(view), paint);
+ // This is expensive, but the only way to accomplish this before JB-MR1.
+ view.invalidate();
+ }
+ @Override
+ public int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
+ return ViewCompatHC.resolveSizeAndState(size, measureSpec, childMeasuredState);
+ }
+ @Override
+ public int getMeasuredWidthAndState(View view) {
+ return ViewCompatHC.getMeasuredWidthAndState(view);
+ }
+ @Override
+ public int getMeasuredHeightAndState(View view) {
+ return ViewCompatHC.getMeasuredHeightAndState(view);
+ }
+ @Override
+ public int getMeasuredState(View view) {
+ return ViewCompatHC.getMeasuredState(view);
+ }
+ }
+
+ static class ICSViewCompatImpl extends HCViewCompatImpl {
+ @Override
+ public boolean canScrollHorizontally(View v, int direction) {
+ return ViewCompatICS.canScrollHorizontally(v, direction);
+ }
+ @Override
+ public boolean canScrollVertically(View v, int direction) {
+ return ViewCompatICS.canScrollVertically(v, direction);
+ }
+ @Override
+ public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {
+ ViewCompatICS.onPopulateAccessibilityEvent(v, event);
+ }
+ @Override
+ public void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) {
+ ViewCompatICS.onInitializeAccessibilityEvent(v, event);
+ }
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) {
+ ViewCompatICS.onInitializeAccessibilityNodeInfo(v, info.getInfo());
+ }
+ @Override
+ public void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate) {
+ ViewCompatICS.setAccessibilityDelegate(v, delegate.getBridge());
+ }
+ }
+
+ static final ViewCompatImpl IMPL;
+ static {
+ final int version = android.os.Build.VERSION.SDK_INT;
+ if (version >= 14) {
+ IMPL = new ICSViewCompatImpl();
+ } else if (version >= 11) {
+ IMPL = new HCViewCompatImpl();
+ } else if (version >= 9) {
+ IMPL = new GBViewCompatImpl();
+ } else {
+ IMPL = new BaseViewCompatImpl();
+ }
+ }
+
+ /**
+ * Check if this view can be scrolled horizontally in a certain direction.
+ *
+ * @param v The View against which to invoke the method.
+ * @param direction Negative to check scrolling left, positive to check scrolling right.
+ * @return true if this view can be scrolled in the specified direction, false otherwise.
+ */
+ public static boolean canScrollHorizontally(View v, int direction) {
+ return IMPL.canScrollHorizontally(v, direction);
+ }
+
+ /**
+ * Check if this view can be scrolled vertically in a certain direction.
+ *
+ * @param v The View against which to invoke the method.
+ * @param direction Negative to check scrolling up, positive to check scrolling down.
+ * @return true if this view can be scrolled in the specified direction, false otherwise.
+ */
+ public static boolean canScrollVertically(View v, int direction) {
+ return IMPL.canScrollVertically(v, direction);
+ }
+
+ /**
+ * Returns the over-scroll mode for this view. The result will be
+ * one of {@link #OVER_SCROLL_ALWAYS} (default), {@link #OVER_SCROLL_IF_CONTENT_SCROLLS}
+ * (allow over-scrolling only if the view content is larger than the container),
+ * or {@link #OVER_SCROLL_NEVER}.
+ *
+ * @param v The View against which to invoke the method.
+ * @return This view's over-scroll mode.
+ */
+ public static int getOverScrollMode(View v) {
+ return IMPL.getOverScrollMode(v);
+ }
+
+ /**
+ * Set the over-scroll mode for this view. Valid over-scroll modes are
+ * {@link #OVER_SCROLL_ALWAYS} (default), {@link #OVER_SCROLL_IF_CONTENT_SCROLLS}
+ * (allow over-scrolling only if the view content is larger than the container),
+ * or {@link #OVER_SCROLL_NEVER}.
+ *
+ * Setting the over-scroll mode of a view will have an effect only if the
+ * view is capable of scrolling.
+ *
+ * @param v The View against which to invoke the method.
+ * @param overScrollMode The new over-scroll mode for this view.
+ */
+ public static void setOverScrollMode(View v, int overScrollMode) {
+ IMPL.setOverScrollMode(v, overScrollMode);
+ }
+
+ /**
+ * Called from {@link View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)}
+ * giving a chance to this View to populate the accessibility event with its
+ * text content. While this method is free to modify event
+ * attributes other than text content, doing so should normally be performed in
+ * {@link View#onInitializeAccessibilityEvent(AccessibilityEvent)}.
+ * <p>
+ * Example: Adding formatted date string to an accessibility event in addition
+ * to the text added by the super implementation:
+ * <pre> public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
+ * super.onPopulateAccessibilityEvent(event);
+ * final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY;
+ * String selectedDateUtterance = DateUtils.formatDateTime(mContext,
+ * mCurrentDate.getTimeInMillis(), flags);
+ * event.getText().add(selectedDateUtterance);
+ * }</pre>
+ * <p>
+ * If an {@link android.view.View.AccessibilityDelegate} has been specified via calling
+ * {@link View#setAccessibilityDelegate(android.view.View.AccessibilityDelegate)} its
+ * {@link android.view.View.AccessibilityDelegate#onPopulateAccessibilityEvent(View,
+ * AccessibilityEvent)}
+ * is responsible for handling this call.
+ * </p>
+ * <p class="note"><strong>Note:</strong> Always call the super implementation before adding
+ * information to the event, in case the default implementation has basic information to add.
+ * </p>
+ *
+ * @param v The View against which to invoke the method.
+ * @param event The accessibility event which to populate.
+ *
+ * @see View#sendAccessibilityEvent(int)
+ * @see View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
+ */
+ public static void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {
+ IMPL.onPopulateAccessibilityEvent(v, event);
+ }
+
+ /**
+ * Initializes an {@link AccessibilityEvent} with information about
+ * this View which is the event source. In other words, the source of
+ * an accessibility event is the view whose state change triggered firing
+ * the event.
+ * <p>
+ * Example: Setting the password property of an event in addition
+ * to properties set by the super implementation:
+ * <pre> public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+ * super.onInitializeAccessibilityEvent(event);
+ * event.setPassword(true);
+ * }</pre>
+ * <p>
+ * If an {@link android.view.View.AccessibilityDelegate} has been specified via calling
+ * {@link View#setAccessibilityDelegate(android.view.View.AccessibilityDelegate)} its
+ * {@link android.view.View.AccessibilityDelegate#onInitializeAccessibilityEvent(View,
+ * AccessibilityEvent)}
+ * is responsible for handling this call.
+ * </p>
+ * <p class="note"><strong>Note:</strong> Always call the super implementation before adding
+ * information to the event, in case the default implementation has basic information to add.
+ * </p>
+ *
+ * @param v The View against which to invoke the method.
+ * @param event The event to initialize.
+ *
+ * @see View#sendAccessibilityEvent(int)
+ * @see View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
+ */
+ public static void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) {
+ IMPL.onInitializeAccessibilityEvent(v, event);
+ }
+
+ /**
+ * Initializes an {@link android.view.accessibility.AccessibilityNodeInfo} with information
+ * about this view. The base implementation sets:
+ * <ul>
+ * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setParent(View)},</li>
+ * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setBoundsInParent(Rect)},</li>
+ * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setBoundsInScreen(Rect)},</li>
+ * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setPackageName(CharSequence)},</li>
+ * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setClassName(CharSequence)},</li>
+ * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setContentDescription(CharSequence)},</li>
+ * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setEnabled(boolean)},</li>
+ * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setClickable(boolean)},</li>
+ * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setFocusable(boolean)},</li>
+ * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setFocused(boolean)},</li>
+ * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setLongClickable(boolean)},</li>
+ * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setSelected(boolean)},</li>
+ * </ul>
+ * <p>
+ * Subclasses should override this method, call the super implementation,
+ * and set additional attributes.
+ * </p>
+ * <p>
+ * If an {@link android.view.View.AccessibilityDelegate} has been specified via calling
+ * {@link View#setAccessibilityDelegate(android.view.View.AccessibilityDelegate)} its
+ * {@link android.view.View.AccessibilityDelegate#onInitializeAccessibilityNodeInfo(View,
+ * android.view.accessibility.AccessibilityNodeInfo)}
+ * is responsible for handling this call.
+ * </p>
+ *
+ * @param v The View against which to invoke the method.
+ * @param info The instance to initialize.
+ */
+ public static void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) {
+ IMPL.onInitializeAccessibilityNodeInfo(v, info);
+ }
+
+ /**
+ * Sets a delegate for implementing accessibility support via compositon as
+ * opposed to inheritance. The delegate's primary use is for implementing
+ * backwards compatible widgets. For more details see
+ * {@link android.view.View.AccessibilityDelegate}.
+ *
+ * @param v The View against which to invoke the method.
+ * @param delegate The delegate instance.
+ *
+ * @see android.view.View.AccessibilityDelegate
+ */
+ public static void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate) {
+ IMPL.setAccessibilityDelegate(v, delegate);
+ }
+
+ /**
+ * Indicates whether the view is currently tracking transient state that the
+ * app should not need to concern itself with saving and restoring, but that
+ * the framework should take special note to preserve when possible.
+ *
+ * @param view View to check for transient state
+ * @return true if the view has transient state
+ */
+ public static boolean hasTransientState(View view) {
+ return IMPL.hasTransientState(view);
+ }
+
+ /**
+ * Set whether this view is currently tracking transient state that the
+ * framework should attempt to preserve when possible.
+ *
+ * @param view View tracking transient state
+ * @param hasTransientState true if this view has transient state
+ */
+ public static void setHasTransientState(View view, boolean hasTransientState) {
+ IMPL.setHasTransientState(view, hasTransientState);
+ }
+
+ /**
+ * <p>Cause an invalidate to happen on the next animation time step, typically the
+ * next display frame.</p>
+ *
+ * <p>This method can be invoked from outside of the UI thread
+ * only when this View is attached to a window.</p>
+ *
+ * @param view View to invalidate
+ */
+ public static void postInvalidateOnAnimation(View view) {
+ IMPL.postInvalidateOnAnimation(view);
+ }
+
+ /**
+ * <p>Cause an invalidate of the specified area to happen on the next animation
+ * time step, typically the next display frame.</p>
+ *
+ * <p>This method can be invoked from outside of the UI thread
+ * only when this View is attached to a window.</p>
+ *
+ * @param view View to invalidate
+ * @param left The left coordinate of the rectangle to invalidate.
+ * @param top The top coordinate of the rectangle to invalidate.
+ * @param right The right coordinate of the rectangle to invalidate.
+ * @param bottom The bottom coordinate of the rectangle to invalidate.
+ */
+ public static void postInvalidateOnAnimation(View view, int left, int top,
+ int right, int bottom) {
+ IMPL.postInvalidateOnAnimation(view, left, top, right, bottom);
+ }
+
+ /**
+ * <p>Causes the Runnable to execute on the next animation time step.
+ * The runnable will be run on the user interface thread.</p>
+ *
+ * <p>This method can be invoked from outside of the UI thread
+ * only when this View is attached to a window.</p>
+ *
+ * @param view View to post this Runnable to
+ * @param action The Runnable that will be executed.
+ */
+ public static void postOnAnimation(View view, Runnable action) {
+ IMPL.postOnAnimation(view, action);
+ }
+
+ /**
+ * <p>Causes the Runnable to execute on the next animation time step,
+ * after the specified amount of time elapses.
+ * The runnable will be run on the user interface thread.</p>
+ *
+ * <p>This method can be invoked from outside of the UI thread
+ * only when this View is attached to a window.</p>
+ *
+ * @param view The view to post this Runnable to
+ * @param action The Runnable that will be executed.
+ * @param delayMillis The delay (in milliseconds) until the Runnable
+ * will be executed.
+ */
+ public static void postOnAnimationDelayed(View view, Runnable action, long delayMillis) {
+ IMPL.postOnAnimationDelayed(view, action, delayMillis);
+ }
+
+ /**
+ * Gets the mode for determining whether this View is important for accessibility
+ * which is if it fires accessibility events and if it is reported to
+ * accessibility services that query the screen.
+ *
+ * @param view The view whose property to get.
+ * @return The mode for determining whether a View is important for accessibility.
+ *
+ * @see #IMPORTANT_FOR_ACCESSIBILITY_YES
+ * @see #IMPORTANT_FOR_ACCESSIBILITY_NO
+ * @see #IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
+ * @see #IMPORTANT_FOR_ACCESSIBILITY_AUTO
+ */
+ public static int getImportantForAccessibility(View view) {
+ return IMPL.getImportantForAccessibility(view);
+ }
+
+ /**
+ * Sets how to determine whether this view is important for accessibility
+ * which is if it fires accessibility events and if it is reported to
+ * accessibility services that query the screen.
+ *
+ * @param view The view whose property to set.
+ * @param mode How to determine whether this view is important for accessibility.
+ *
+ * @see #IMPORTANT_FOR_ACCESSIBILITY_YES
+ * @see #IMPORTANT_FOR_ACCESSIBILITY_NO
+ * @see #IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
+ * @see #IMPORTANT_FOR_ACCESSIBILITY_AUTO
+ */
+ public static void setImportantForAccessibility(View view, int mode) {
+ IMPL.setImportantForAccessibility(view, mode);
+ }
+
+ /**
+ * Performs the specified accessibility action on the view. For
+ * possible accessibility actions look at {@link AccessibilityNodeInfoCompat}.
+ * <p>
+ * If an {@link AccessibilityDelegateCompat} has been specified via calling
+ * {@link #setAccessibilityDelegate(View, AccessibilityDelegateCompat)} its
+ * {@link AccessibilityDelegateCompat#performAccessibilityAction(View, int, Bundle)}
+ * is responsible for handling this call.
+ * </p>
+ *
+ * @param action The action to perform.
+ * @param arguments Optional action arguments.
+ * @return Whether the action was performed.
+ */
+ public static boolean performAccessibilityAction(View view, int action, Bundle arguments) {
+ return IMPL.performAccessibilityAction(view, action, arguments);
+ }
+
+ /**
+ * Gets the provider for managing a virtual view hierarchy rooted at this View
+ * and reported to {@link android.accessibilityservice.AccessibilityService}s
+ * that explore the window content.
+ * <p>
+ * If this method returns an instance, this instance is responsible for managing
+ * {@link AccessibilityNodeInfoCompat}s describing the virtual sub-tree rooted at
+ * this View including the one representing the View itself. Similarly the returned
+ * instance is responsible for performing accessibility actions on any virtual
+ * view or the root view itself.
+ * </p>
+ * <p>
+ * If an {@link AccessibilityDelegateCompat} has been specified via calling
+ * {@link #setAccessibilityDelegate(View, AccessibilityDelegateCompat)} its
+ * {@link AccessibilityDelegateCompat#getAccessibilityNodeProvider(View)}
+ * is responsible for handling this call.
+ * </p>
+ *
+ * @param view The view whose property to get.
+ * @return The provider.
+ *
+ * @see AccessibilityNodeProviderCompat
+ */
+ public static AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view) {
+ return IMPL.getAccessibilityNodeProvider(view);
+ }
+
+ /**
+ * The opacity of the view. This is a value from 0 to 1, where 0 means the view is
+ * completely transparent and 1 means the view is completely opaque.
+ *
+ * <p>By default this is 1.0f. Prior to API 11, the returned value is always 1.0f.
+ * @return The opacity of the view.
+ */
+ public static float getAlpha(View view) {
+ return IMPL.getAlpha(view);
+ }
+
+ /**
+ * <p>Specifies the type of layer backing this view. The layer can be
+ * {@link #LAYER_TYPE_NONE disabled}, {@link #LAYER_TYPE_SOFTWARE software} or
+ * {@link #LAYER_TYPE_HARDWARE hardware}.</p>
+ *
+ * <p>A layer is associated with an optional {@link android.graphics.Paint}
+ * instance that controls how the layer is composed on screen. The following
+ * properties of the paint are taken into account when composing the layer:</p>
+ * <ul>
+ * <li>{@link android.graphics.Paint#getAlpha() Translucency (alpha)}</li>
+ * <li>{@link android.graphics.Paint#getXfermode() Blending mode}</li>
+ * <li>{@link android.graphics.Paint#getColorFilter() Color filter}</li>
+ * </ul>
+ *
+ * <p>If this view has an alpha value set to < 1.0 by calling
+ * setAlpha(float), the alpha value of the layer's paint is replaced by
+ * this view's alpha value. Calling setAlpha(float) is therefore
+ * equivalent to setting a hardware layer on this view and providing a paint with
+ * the desired alpha value.<p>
+ *
+ * <p>Refer to the documentation of {@link #LAYER_TYPE_NONE disabled},
+ * {@link #LAYER_TYPE_SOFTWARE software} and {@link #LAYER_TYPE_HARDWARE hardware}
+ * for more information on when and how to use layers.</p>
+ *
+ * @param layerType The ype of layer to use with this view, must be one of
+ * {@link #LAYER_TYPE_NONE}, {@link #LAYER_TYPE_SOFTWARE} or
+ * {@link #LAYER_TYPE_HARDWARE}
+ * @param paint The paint used to compose the layer. This argument is optional
+ * and can be null. It is ignored when the layer type is
+ * {@link #LAYER_TYPE_NONE}
+ */
+ public static void setLayerType(View view, int layerType, Paint paint) {
+ IMPL.setLayerType(view, layerType, paint);
+ }
+
+ /**
+ * Indicates what type of layer is currently associated with this view. By default
+ * a view does not have a layer, and the layer type is {@link #LAYER_TYPE_NONE}.
+ * Refer to the documentation of
+ * {@link #setLayerType(android.view.View, int, android.graphics.Paint)}
+ * for more information on the different types of layers.
+ *
+ * @param view The view to fetch the layer type from
+ * @return {@link #LAYER_TYPE_NONE}, {@link #LAYER_TYPE_SOFTWARE} or
+ * {@link #LAYER_TYPE_HARDWARE}
+ *
+ * @see #setLayerType(android.view.View, int, android.graphics.Paint)
+ * @see #LAYER_TYPE_NONE
+ * @see #LAYER_TYPE_SOFTWARE
+ * @see #LAYER_TYPE_HARDWARE
+ */
+ public static int getLayerType(View view) {
+ return IMPL.getLayerType(view);
+ }
+
+ /**
+ * Gets the id of a view for which a given view serves as a label for
+ * accessibility purposes.
+ *
+ * @param view The view on which to invoke the corresponding method.
+ * @return The labeled view id.
+ */
+ public static int getLabelFor(View view) {
+ return IMPL.getLabelFor(view);
+ }
+
+ /**
+ * Sets the id of a view for which a given view serves as a label for
+ * accessibility purposes.
+ *
+ * @param view The view on which to invoke the corresponding method.
+ * @param labeledId The labeled view id.
+ */
+ public static void setLabelFor(View view, int labeledId) {
+ IMPL.setLabelFor(view, labeledId);
+ }
+
+ /**
+ * Updates the {@link Paint} object used with the current layer (used only if the current
+ * layer type is not set to {@link #LAYER_TYPE_NONE}). Changed properties of the Paint
+ * provided to {@link #setLayerType(android.view.View, int, android.graphics.Paint)}
+ * will be used the next time the View is redrawn, but
+ * {@link #setLayerPaint(android.view.View, android.graphics.Paint)}
+ * must be called to ensure that the view gets redrawn immediately.
+ *
+ * <p>A layer is associated with an optional {@link android.graphics.Paint}
+ * instance that controls how the layer is composed on screen. The following
+ * properties of the paint are taken into account when composing the layer:</p>
+ * <ul>
+ * <li>{@link android.graphics.Paint#getAlpha() Translucency (alpha)}</li>
+ * <li>{@link android.graphics.Paint#getXfermode() Blending mode}</li>
+ * <li>{@link android.graphics.Paint#getColorFilter() Color filter}</li>
+ * </ul>
+ *
+ * <p>If this view has an alpha value set to < 1.0 by calling
+ * View#setAlpha(float), the alpha value of the layer's paint is replaced by
+ * this view's alpha value. Calling View#setAlpha(float) is therefore
+ * equivalent to setting a hardware layer on this view and providing a paint with
+ * the desired alpha value.</p>
+ *
+ * @param view View to set a layer paint for
+ * @param paint The paint used to compose the layer. This argument is optional
+ * and can be null. It is ignored when the layer type is
+ * {@link #LAYER_TYPE_NONE}
+ *
+ * @see #setLayerType(View, int, android.graphics.Paint)
+ */
+ public static void setLayerPaint(View view, Paint paint) {
+ IMPL.setLayerPaint(view, paint);
+ }
+
+ /**
+ * Returns the resolved layout direction for this view.
+ *
+ * @param view View to get layout direction for
+ * @return {@link #LAYOUT_DIRECTION_RTL} if the layout direction is RTL or returns
+ * {@link #LAYOUT_DIRECTION_LTR} if the layout direction is not RTL.
+ *
+ * For compatibility, this will return {@link #LAYOUT_DIRECTION_LTR} if API version
+ * is lower than Jellybean MR1 (API 17)
+ */
+ public static int getLayoutDirection(View view) {
+ return IMPL.getLayoutDirection(view);
+ }
+
+ /**
+ * Set the layout direction for this view. This will propagate a reset of layout direction
+ * resolution to the view's children and resolve layout direction for this view.
+ *
+ * @param view View to set layout direction for
+ * @param layoutDirection the layout direction to set. Should be one of:
+ *
+ * {@link #LAYOUT_DIRECTION_LTR},
+ * {@link #LAYOUT_DIRECTION_RTL},
+ * {@link #LAYOUT_DIRECTION_INHERIT},
+ * {@link #LAYOUT_DIRECTION_LOCALE}.
+ *
+ * Resolution will be done if the value is set to LAYOUT_DIRECTION_INHERIT. The resolution
+ * proceeds up the parent chain of the view to get the value. If there is no parent, then it
+ * will return the default {@link #LAYOUT_DIRECTION_LTR}.
+ */
+ public static void setLayoutDirection(View view, int layoutDirection) {
+ IMPL.setLayoutDirection(view, layoutDirection);
+ }
+
+ /**
+ * Gets the parent for accessibility purposes. Note that the parent for
+ * accessibility is not necessary the immediate parent. It is the first
+ * predecessor that is important for accessibility.
+ *
+ * @param view View to retrieve parent for
+ * @return The parent for use in accessibility inspection
+ */
+ public static ViewParent getParentForAccessibility(View view) {
+ return IMPL.getParentForAccessibility(view);
+ }
+
+ /**
+ * Indicates whether this View is opaque. An opaque View guarantees that it will
+ * draw all the pixels overlapping its bounds using a fully opaque color.
+ *
+ * On API 7 and above this will call View's true isOpaque method. On previous platform
+ * versions it will check the opacity of the view's background drawable if present.
+ *
+ * @return True if this View is guaranteed to be fully opaque, false otherwise.
+ */
+ public static boolean isOpaque(View view) {
+ return IMPL.isOpaque(view);
+ }
+
+ /**
+ * Utility to reconcile a desired size and state, with constraints imposed
+ * by a MeasureSpec. Will take the desired size, unless a different size
+ * is imposed by the constraints. The returned value is a compound integer,
+ * with the resolved size in the {@link #MEASURED_SIZE_MASK} bits and
+ * optionally the bit {@link #MEASURED_STATE_TOO_SMALL} set if the resulting
+ * size is smaller than the size the view wants to be.
+ *
+ * @param size How big the view wants to be
+ * @param measureSpec Constraints imposed by the parent
+ * @return Size information bit mask as defined by
+ * {@link #MEASURED_SIZE_MASK} and {@link #MEASURED_STATE_TOO_SMALL}.
+ */
+ public static int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
+ return IMPL.resolveSizeAndState(size, measureSpec, childMeasuredState);
+ }
+
+ /**
+ * Return the full width measurement information for this view as computed
+ * by the most recent call to {@link android.view.View#measure(int, int)}.
+ * This result is a bit mask as defined by {@link #MEASURED_SIZE_MASK} and
+ * {@link #MEASURED_STATE_TOO_SMALL}.
+ * This should be used during measurement and layout calculations only. Use
+ * {@link android.view.View#getWidth()} to see how wide a view is after layout.
+ *
+ * @return The measured width of this view as a bit mask.
+ */
+ public static int getMeasuredWidthAndState(View view) {
+ return IMPL.getMeasuredWidthAndState(view);
+ }
+
+ /**
+ * Return the full height measurement information for this view as computed
+ * by the most recent call to {@link android.view.View#measure(int, int)}.
+ * This result is a bit mask as defined by {@link #MEASURED_SIZE_MASK} and
+ * {@link #MEASURED_STATE_TOO_SMALL}.
+ * This should be used during measurement and layout calculations only. Use
+ * {@link android.view.View#getHeight()} to see how wide a view is after layout.
+ *
+ * @return The measured width of this view as a bit mask.
+ */
+ public static int getMeasuredHeightAndState(View view) {
+ return IMPL.getMeasuredHeightAndState(view);
+ }
+
+ /**
+ * Return only the state bits of {@link #getMeasuredWidthAndState}
+ * and {@link #getMeasuredHeightAndState}, combined into one integer.
+ * The width component is in the regular bits {@link #MEASURED_STATE_MASK}
+ * and the height component is at the shifted bits
+ * {@link #MEASURED_HEIGHT_STATE_SHIFT}>>{@link #MEASURED_STATE_MASK}.
+ */
+ public static int getMeasuredState(View view) {
+ return IMPL.getMeasuredState(view);
+ }
+
+ /**
+ * Gets the live region mode for the specified View.
+ *
+ * @param view The view from which to obtain the live region mode
+ * @return The live region mode for the view.
+ *
+ * @see ViewCompat#setAccessibilityLiveRegion(View, int)
+ */
+ @SuppressWarnings("static-method")
+ public int getAccessibilityLiveRegion(View view) {
+ return IMPL.getAccessibilityLiveRegion(view);
+ }
+
+ /**
+ * Sets the live region mode for the specified view. This indicates to
+ * accessibility services whether they should automatically notify the user
+ * about changes to the view's content description or text, or to the
+ * content descriptions or text of the view's children (where applicable).
+ * <p>
+ * For example, in a login screen with a TextView that displays an "incorrect
+ * password" notification, that view should be marked as a live region with
+ * mode {@link #ACCESSIBILITY_LIVE_REGION_POLITE}.
+ * <p>
+ * To disable change notifications for this view, use
+ * {@link #ACCESSIBILITY_LIVE_REGION_NONE}. This is the default live region
+ * mode for most views.
+ * <p>
+ * To indicate that the user should be notified of changes, use
+ * {@link #ACCESSIBILITY_LIVE_REGION_POLITE}.
+ * <p>
+ * If the view's changes should interrupt ongoing speech and notify the user
+ * immediately, use {@link #ACCESSIBILITY_LIVE_REGION_ASSERTIVE}.
+ *
+ * @param view The view on which to set the live region mode
+ * @param mode The live region mode for this view, one of:
+ * <ul>
+ * <li>{@link #ACCESSIBILITY_LIVE_REGION_NONE}
+ * <li>{@link #ACCESSIBILITY_LIVE_REGION_POLITE}
+ * <li>{@link #ACCESSIBILITY_LIVE_REGION_ASSERTIVE}
+ * </ul>
+ */
+ @SuppressWarnings("static-method")
+ public void setAccessibilityLiveRegion(View view, int mode) {
+ IMPL.setAccessibilityLiveRegion(view, mode);
+ }
+}