/* * 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.accessibility; import android.os.Build; import android.os.Parcelable; import android.support.annotation.NonNull; import android.support.annotation.RequiresApi; import android.view.View; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityRecord; import java.util.List; /** * Helper for accessing {@link AccessibilityRecord} in a backwards compatible fashion. */ public class AccessibilityRecordCompat { static class AccessibilityRecordCompatBaseImpl { public int getMaxScrollX(AccessibilityRecord record) { return 0; } public int getMaxScrollY(AccessibilityRecord record) { return 0; } public void setMaxScrollX(AccessibilityRecord record, int maxScrollX) { } public void setMaxScrollY(AccessibilityRecord record, int maxScrollY) { } public void setSource(AccessibilityRecord record, View root, int virtualDescendantId) { } } @RequiresApi(15) static class AccessibilityRecordCompatApi15Impl extends AccessibilityRecordCompatBaseImpl { @Override public int getMaxScrollX(AccessibilityRecord record) { return record.getMaxScrollX(); } @Override public int getMaxScrollY(AccessibilityRecord record) { return record.getMaxScrollY(); } @Override public void setMaxScrollX(AccessibilityRecord record, int maxScrollX) { record.setMaxScrollX(maxScrollX); } @Override public void setMaxScrollY(AccessibilityRecord record, int maxScrollY) { record.setMaxScrollY(maxScrollY); } } @RequiresApi(16) static class AccessibilityRecordCompatApi16Impl extends AccessibilityRecordCompatApi15Impl { @Override public void setSource(AccessibilityRecord record, View root, int virtualDescendantId) { record.setSource(root, virtualDescendantId); } } static { if (Build.VERSION.SDK_INT >= 16) { // JellyBean IMPL = new AccessibilityRecordCompatApi16Impl(); } else if (Build.VERSION.SDK_INT >= 15) { // ICS MR1 IMPL = new AccessibilityRecordCompatApi15Impl(); } else { IMPL = new AccessibilityRecordCompatBaseImpl(); } } private static final AccessibilityRecordCompatBaseImpl IMPL; private final AccessibilityRecord mRecord; /** * @deprecated This is not type safe. If you want to modify an * {@link AccessibilityEvent}'s properties defined in * {@link android.view.accessibility.AccessibilityRecord} use * {@link AccessibilityEventCompat#asRecord(AccessibilityEvent)}. This method will be removed * in a subsequent release of the support library. */ @Deprecated public AccessibilityRecordCompat(Object record) { mRecord = (AccessibilityRecord) record; } /** * @return The wrapped implementation. * * @deprecated This method will be removed in a subsequent release of * the support library. */ @Deprecated public Object getImpl() { return mRecord; } /** * Returns a cached instance if such is available or a new one is * instantiated. The instance is initialized with data from the * given record. * * @return An instance. * * @deprecated Use {@link AccessibilityRecord#obtain(AccessibilityRecord)} directly. */ @Deprecated public static AccessibilityRecordCompat obtain(AccessibilityRecordCompat record) { return new AccessibilityRecordCompat(AccessibilityRecord.obtain(record.mRecord)); } /** * Returns a cached instance if such is available or a new one is * instantiated. * * @return An instance. * * @deprecated Use {@link AccessibilityRecord#obtain()} directly. */ @Deprecated public static AccessibilityRecordCompat obtain() { return new AccessibilityRecordCompat(AccessibilityRecord.obtain()); } /** * Sets the event source. * * @param source The source. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#setSource(View)} directly. */ @Deprecated public void setSource(View source) { mRecord.setSource(source); } /** * Sets the source to be a virtual descendant of the given root. * If virtualDescendantId equals to {@link View#NO_ID} the root * is set as the source. *

* A virtual descendant is an imaginary View that is reported as a part of the view * hierarchy for accessibility purposes. This enables custom views that draw complex * content to report them selves as a tree of virtual views, thus conveying their * logical structure. *

* * @param root The root of the virtual subtree. * @param virtualDescendantId The id of the virtual descendant. * * @deprecated Use {@link #setSource(AccessibilityRecord, View, int)} instead. */ @Deprecated public void setSource(View root, int virtualDescendantId) { AccessibilityRecordCompat.setSource(mRecord, root, virtualDescendantId); } /** * Sets the source to be a virtual descendant of the given root. * If virtualDescendantId equals to {@link View#NO_ID} the root * is set as the source. *

* A virtual descendant is an imaginary View that is reported as a part of the view * hierarchy for accessibility purposes. This enables custom views that draw complex * content to report them selves as a tree of virtual views, thus conveying their * logical structure. *

* * @param record The {@link AccessibilityRecord} instance to use. * @param root The root of the virtual subtree. * @param virtualDescendantId The id of the virtual descendant. */ public static void setSource(@NonNull AccessibilityRecord record, View root, int virtualDescendantId) { IMPL.setSource(record, root, virtualDescendantId); } /** * Gets the {@link android.view.accessibility.AccessibilityNodeInfo} of * the event source. *

* Note: It is a client responsibility to recycle the * received info by calling * {@link android.view.accessibility.AccessibilityNodeInfo#recycle() * AccessibilityNodeInfo#recycle()} to avoid creating of multiple instances. *

* * @return The info of the source. * * @deprecated Use {@link AccessibilityRecord#getSource()} directly. */ @Deprecated public AccessibilityNodeInfoCompat getSource() { return AccessibilityNodeInfoCompat.wrapNonNullInstance(mRecord.getSource()); } /** * Gets the id of the window from which the event comes from. * * @return The window id. * * @deprecated Use {@link AccessibilityRecord#getWindowId()} directly. */ @Deprecated public int getWindowId() { return mRecord.getWindowId(); } /** * Gets if the source is checked. * * @return True if the view is checked, false otherwise. * * @deprecated Use {@link AccessibilityRecord#isChecked()} directly. */ @Deprecated public boolean isChecked() { return mRecord.isChecked(); } /** * Sets if the source is checked. * * @param isChecked True if the view is checked, false otherwise. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#setChecked(boolean)} directly. */ @Deprecated public void setChecked(boolean isChecked) { mRecord.setChecked(isChecked); } /** * Gets if the source is enabled. * * @return True if the view is enabled, false otherwise. * * @deprecated Use {@link AccessibilityRecord#isEnabled()} directly. */ @Deprecated public boolean isEnabled() { return mRecord.isEnabled(); } /** * Sets if the source is enabled. * * @param isEnabled True if the view is enabled, false otherwise. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#isEnabled()} directly. */ @Deprecated public void setEnabled(boolean isEnabled) { mRecord.setEnabled(isEnabled); } /** * Gets if the source is a password field. * * @return True if the view is a password field, false otherwise. * * @deprecated Use {@link AccessibilityRecord#isPassword()} directly. */ @Deprecated public boolean isPassword() { return mRecord.isPassword(); } /** * Sets if the source is a password field. * * @param isPassword True if the view is a password field, false otherwise. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#setPassword(boolean)} directly. */ @Deprecated public void setPassword(boolean isPassword) { mRecord.setPassword(isPassword); } /** * Gets if the source is taking the entire screen. * * @return True if the source is full screen, false otherwise. * * @deprecated Use {@link AccessibilityRecord#isFullScreen()} directly. */ @Deprecated public boolean isFullScreen() { return mRecord.isFullScreen(); } /** * Sets if the source is taking the entire screen. * * @param isFullScreen True if the source is full screen, false otherwise. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#setFullScreen(boolean)} directly. */ @Deprecated public void setFullScreen(boolean isFullScreen) { mRecord.setFullScreen(isFullScreen); } /** * Gets if the source is scrollable. * * @return True if the source is scrollable, false otherwise. * * @deprecated Use {@link AccessibilityRecord#isScrollable()} directly. */ @Deprecated public boolean isScrollable() { return mRecord.isScrollable(); } /** * Sets if the source is scrollable. * * @param scrollable True if the source is scrollable, false otherwise. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#setScrollable(boolean)} directly. */ @Deprecated public void setScrollable(boolean scrollable) { mRecord.setScrollable(scrollable); } /** * Gets the number of items that can be visited. * * @return The number of items. * * @deprecated Use {@link AccessibilityRecord#getItemCount()} directly. */ @Deprecated public int getItemCount() { return mRecord.getItemCount(); } /** * Sets the number of items that can be visited. * * @param itemCount The number of items. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#setItemCount(int)} directly. */ @Deprecated public void setItemCount(int itemCount) { mRecord.setItemCount(itemCount); } /** * Gets the index of the source in the list of items the can be visited. * * @return The current item index. * * @deprecated Use {@link AccessibilityRecord#getCurrentItemIndex()} directly. */ @Deprecated public int getCurrentItemIndex() { return mRecord.getCurrentItemIndex(); } /** * Sets the index of the source in the list of items that can be visited. * * @param currentItemIndex The current item index. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#setCurrentItemIndex(int)} directly. */ @Deprecated public void setCurrentItemIndex(int currentItemIndex) { mRecord.setCurrentItemIndex(currentItemIndex); } /** * Gets the index of the first character of the changed sequence, * or the beginning of a text selection or the index of the first * visible item when scrolling. * * @return The index of the first character or selection * start or the first visible item. * * @deprecated Use {@link AccessibilityRecord#getFromIndex()} directly. */ @Deprecated public int getFromIndex() { return mRecord.getFromIndex(); } /** * Sets the index of the first character of the changed sequence * or the beginning of a text selection or the index of the first * visible item when scrolling. * * @param fromIndex The index of the first character or selection * start or the first visible item. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#setFromIndex(int)} directly. */ @Deprecated public void setFromIndex(int fromIndex) { mRecord.setFromIndex(fromIndex); } /** * Gets the index of text selection end or the index of the last * visible item when scrolling. * * @return The index of selection end or last item index. * * @deprecated Use {@link AccessibilityRecord#getToIndex()} directly. */ @Deprecated public int getToIndex() { return mRecord.getToIndex(); } /** * Sets the index of text selection end or the index of the last * visible item when scrolling. * * @param toIndex The index of selection end or last item index. * * @deprecated Use {@link AccessibilityRecord#setToIndex(int)} directly. */ @Deprecated public void setToIndex(int toIndex) { mRecord.setToIndex(toIndex); } /** * Gets the scroll offset of the source left edge in pixels. * * @return The scroll. * * @deprecated Use {@link AccessibilityRecord#getScrollX()} directly. */ @Deprecated public int getScrollX() { return mRecord.getScrollX(); } /** * Sets the scroll offset of the source left edge in pixels. * * @param scrollX The scroll. * * @deprecated Use {@link AccessibilityRecord#setScrollX(int)} directly. */ @Deprecated public void setScrollX(int scrollX) { mRecord.setScrollX(scrollX); } /** * Gets the scroll offset of the source top edge in pixels. * * @return The scroll. * * @deprecated Use {@link AccessibilityRecord#getScrollY()} directly. */ @Deprecated public int getScrollY() { return mRecord.getScrollY(); } /** * Sets the scroll offset of the source top edge in pixels. * * @param scrollY The scroll. * * @deprecated Use {@link AccessibilityRecord#setScrollY(int)} directly. */ @Deprecated public void setScrollY(int scrollY) { mRecord.setScrollY(scrollY); } /** * Gets the max scroll offset of the source left edge in pixels. * * @return The max scroll. * * @deprecated Use {@link #getMaxScrollX(AccessibilityRecord)} instead. */ @Deprecated public int getMaxScrollX() { return AccessibilityRecordCompat.getMaxScrollX(mRecord); } /** * Gets the max scroll offset of the source left edge in pixels. * * @param record The {@link AccessibilityRecord} instance to use. * @return The max scroll. */ public static int getMaxScrollX(AccessibilityRecord record) { return IMPL.getMaxScrollX(record); } /** * Sets the max scroll offset of the source left edge in pixels. * * @param maxScrollX The max scroll. * * @deprecated Use {@link #setMaxScrollX(AccessibilityRecord, int)} instead. */ @Deprecated public void setMaxScrollX(int maxScrollX) { AccessibilityRecordCompat.setMaxScrollX(mRecord, maxScrollX); } /** * Sets the max scroll offset of the source left edge in pixels. * * @param record The {@link AccessibilityRecord} instance to use. * @param maxScrollX The max scroll. */ public static void setMaxScrollX(AccessibilityRecord record, int maxScrollX) { IMPL.setMaxScrollX(record, maxScrollX); } /** * Gets the max scroll offset of the source top edge in pixels. * * @return The max scroll. * * @deprecated Use {@link #getMaxScrollY(AccessibilityRecord)} instead. */ @Deprecated public int getMaxScrollY() { return AccessibilityRecordCompat.getMaxScrollY(mRecord); } /** * Gets the max scroll offset of the source top edge in pixels. * * @param record The {@link AccessibilityRecord} instance to use. * @return The max scroll. */ public static int getMaxScrollY(AccessibilityRecord record) { return IMPL.getMaxScrollY(record); } /** * Sets the max scroll offset of the source top edge in pixels. * * @param maxScrollY The max scroll. * * @deprecated Use {@link #setMaxScrollY(AccessibilityRecord, int)} instead. */ @Deprecated public void setMaxScrollY(int maxScrollY) { AccessibilityRecordCompat.setMaxScrollY(mRecord, maxScrollY); } /** * Sets the max scroll offset of the source top edge in pixels. * * @param record The {@link AccessibilityRecord} instance to use. * @param maxScrollY The max scroll. */ public static void setMaxScrollY(AccessibilityRecord record, int maxScrollY) { IMPL.setMaxScrollY(record, maxScrollY); } /** * Gets the number of added characters. * * @return The number of added characters. * * @deprecated Use {@link AccessibilityRecord#getAddedCount()} directly. */ @Deprecated public int getAddedCount() { return mRecord.getAddedCount(); } /** * Sets the number of added characters. * * @param addedCount The number of added characters. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#setAddedCount(int)} directly. */ @Deprecated public void setAddedCount(int addedCount) { mRecord.setAddedCount(addedCount); } /** * Gets the number of removed characters. * * @return The number of removed characters. * * @deprecated Use {@link AccessibilityRecord#getRemovedCount()} directly. */ @Deprecated public int getRemovedCount() { return mRecord.getRemovedCount(); } /** * Sets the number of removed characters. * * @param removedCount The number of removed characters. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#setRemovedCount(int)} directly. */ @Deprecated public void setRemovedCount(int removedCount) { mRecord.setRemovedCount(removedCount); } /** * Gets the class name of the source. * * @return The class name. * * @deprecated Use {@link AccessibilityRecord#getClassName()} directly. */ @Deprecated public CharSequence getClassName() { return mRecord.getClassName(); } /** * Sets the class name of the source. * * @param className The lass name. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#setClassName(CharSequence)} directly. */ @Deprecated public void setClassName(CharSequence className) { mRecord.setClassName(className); } /** * Gets the text of the event. The index in the list represents the priority * of the text. Specifically, the lower the index the higher the priority. * * @return The text. * * @deprecated Use {@link AccessibilityRecord#getText()} directly. */ @Deprecated public List getText() { return mRecord.getText(); } /** * Sets the text before a change. * * @return The text before the change. * * @deprecated Use {@link AccessibilityRecord#getBeforeText()} directly. */ @Deprecated public CharSequence getBeforeText() { return mRecord.getBeforeText(); } /** * Sets the text before a change. * * @param beforeText The text before the change. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#setBeforeText(CharSequence)} directly. */ @Deprecated public void setBeforeText(CharSequence beforeText) { mRecord.setBeforeText(beforeText); } /** * Gets the description of the source. * * @return The description. * * @deprecated Use {@link AccessibilityRecord#getContentDescription()} directly. */ @Deprecated public CharSequence getContentDescription() { return mRecord.getContentDescription(); } /** * Sets the description of the source. * * @param contentDescription The description. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#setContentDescription(CharSequence)} directly. */ @Deprecated public void setContentDescription(CharSequence contentDescription) { mRecord.setContentDescription(contentDescription); } /** * Gets the {@link Parcelable} data. * * @return The parcelable data. * * @deprecated Use {@link AccessibilityRecord#getParcelableData()} directly. */ @Deprecated public Parcelable getParcelableData() { return mRecord.getParcelableData(); } /** * Sets the {@link Parcelable} data of the event. * * @param parcelableData The parcelable data. * * @throws IllegalStateException If called from an AccessibilityService. * * @deprecated Use {@link AccessibilityRecord#setParcelableData(Parcelable)} directly. */ @Deprecated public void setParcelableData(Parcelable parcelableData) { mRecord.setParcelableData(parcelableData); } /** * Return an instance back to be reused. *

* Note: You must not touch the object after calling this * function. *

* * @throws IllegalStateException If the record is already recycled. * * @deprecated Use {@link AccessibilityRecord#recycle()} directly. */ @Deprecated public void recycle() { mRecord.recycle(); } /** * @deprecated Use {@link AccessibilityRecord#hashCode()} directly. */ @Deprecated @Override public int hashCode() { return (mRecord == null) ? 0 : mRecord.hashCode(); } /** * @deprecated Use {@link AccessibilityRecord} directly. */ @Deprecated @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } AccessibilityRecordCompat other = (AccessibilityRecordCompat) obj; if (mRecord == null) { if (other.mRecord != null) { return false; } } else if (!mRecord.equals(other.mRecord)) { return false; } return true; } }