1086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette/*
2086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette * Copyright (C) 2012 The Android Open Source Project
3086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette *
4086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette * Licensed under the Apache License, Version 2.0 (the "License");
5086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette * you may not use this file except in compliance with the License.
6086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette * You may obtain a copy of the License at
7086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette *
8086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette *      http://www.apache.org/licenses/LICENSE-2.0
9086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette *
10086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette * Unless required by applicable law or agreed to in writing, software
11086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette * distributed under the License is distributed on an "AS IS" BASIS,
12086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette * See the License for the specific language governing permissions and
14086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette * limitations under the License.
15086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette */
16086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette
17086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverettepackage android.support.v4.view.accessibility;
18086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette
198aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatovimport android.os.Bundle;
20086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viveretteimport android.view.accessibility.AccessibilityNodeInfo;
21086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette
22086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette/**
23086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette * KitKat-specific AccessibilityNodeInfo API implementation.
24086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette */
25086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viveretteclass AccessibilityNodeInfoCompatKitKat {
269e1c26a445029b66a6e81194b58452406a38b56cZachary Kuznia    private static final byte TRAIT_UNSET = -1;
279e1c26a445029b66a6e81194b58452406a38b56cZachary Kuznia    private static final String TRAITS_KEY =
289e1c26a445029b66a6e81194b58452406a38b56cZachary Kuznia            "android.view.accessibility.AccessibilityNodeInfo.traits";
299e1c26a445029b66a6e81194b58452406a38b56cZachary Kuznia    private static final long TRAIT_HAS_IMAGE = 0x00000001;
30f0d984600125413628899bfc849bab102bc2228eSteven Dao    private static final String ROLE_DESCRIPTION_KEY =
31f0d984600125413628899bfc849bab102bc2228eSteven Dao            "AccessibilityNodeInfo.roleDescription";
32f0d984600125413628899bfc849bab102bc2228eSteven Dao
33fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen    static int getLiveRegion(Object info) {
34086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette        return ((AccessibilityNodeInfo) info).getLiveRegion();
35086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette    }
36086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette
37fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen    static void setLiveRegion(Object info, int mode) {
38086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette        ((AccessibilityNodeInfo) info).setLiveRegion(mode);
39086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette    }
40fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
41fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen    static Object getCollectionInfo(Object info) {
42fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        return ((AccessibilityNodeInfo) info).getCollectionInfo();
43fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen    }
44fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
45fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen    static Object getCollectionItemInfo(Object info) {
46fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        return ((AccessibilityNodeInfo) info).getCollectionItemInfo();
47fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen    }
48fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
49a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar    public static void setCollectionInfo(Object info, Object collectionInfo) {
50a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar        ((AccessibilityNodeInfo) info).setCollectionInfo(
51a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar                (AccessibilityNodeInfo.CollectionInfo)collectionInfo);
52a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar    }
53a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar
54a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar    public static void setCollectionItemInfo(Object info, Object collectionItemInfo) {
55a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar        ((AccessibilityNodeInfo) info).setCollectionItemInfo(
56a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar                (AccessibilityNodeInfo.CollectionItemInfo) collectionItemInfo);
57a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar    }
58a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar
59fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen    static Object getRangeInfo(Object info) {
60fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        return ((AccessibilityNodeInfo) info).getRangeInfo();
61fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen    }
62fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
638aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    public static void setRangeInfo(Object info, Object rangeInfo) {
648aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov        ((AccessibilityNodeInfo) info).setRangeInfo((AccessibilityNodeInfo.RangeInfo) rangeInfo);
658aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    }
668aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov
67a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar    public static Object obtainCollectionInfo(int rowCount, int columnCount,
68a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar            boolean hierarchical, int selectionMode) {
69a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar        return AccessibilityNodeInfo.CollectionInfo.obtain(rowCount, columnCount, hierarchical);
70a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar    }
71a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar
7277df76ce4466b7a3739fbbe53c2ac99d976b113eAbhinav Baid    public static Object obtainCollectionInfo(int rowCount, int columnCount, boolean hierarchical) {
7377df76ce4466b7a3739fbbe53c2ac99d976b113eAbhinav Baid        return AccessibilityNodeInfo.CollectionInfo.obtain(rowCount, columnCount, hierarchical);
7477df76ce4466b7a3739fbbe53c2ac99d976b113eAbhinav Baid    }
7577df76ce4466b7a3739fbbe53c2ac99d976b113eAbhinav Baid
76a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar    public static Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
77a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar            int columnSpan, boolean heading) {
78a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar        return AccessibilityNodeInfo.CollectionItemInfo.obtain(rowIndex, rowSpan, columnIndex,
79a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar                columnSpan, heading);
80a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar    }
81a910619e83d0052e1d81aa5fe532821a2f99d76cYigit Boyar
82c5b63021dfda1dd155775a0b4845c5ca3c70b1b0Chris Banes    public static void setContentInvalid(Object info, boolean contentInvalid) {
83c5b63021dfda1dd155775a0b4845c5ca3c70b1b0Chris Banes        ((AccessibilityNodeInfo) info).setContentInvalid(contentInvalid);
84c5b63021dfda1dd155775a0b4845c5ca3c70b1b0Chris Banes    }
85c5b63021dfda1dd155775a0b4845c5ca3c70b1b0Chris Banes
86c5b63021dfda1dd155775a0b4845c5ca3c70b1b0Chris Banes    public static boolean isContentInvalid(Object info) {
87c5b63021dfda1dd155775a0b4845c5ca3c70b1b0Chris Banes        return ((AccessibilityNodeInfo) info).isContentInvalid();
88c5b63021dfda1dd155775a0b4845c5ca3c70b1b0Chris Banes    }
89c5b63021dfda1dd155775a0b4845c5ca3c70b1b0Chris Banes
908aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    public static boolean canOpenPopup(Object info) {
918aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov        return ((AccessibilityNodeInfo) info).canOpenPopup();
928aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    }
938aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov
948aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    public static void setCanOpenPopup(Object info, boolean opensPopup) {
958aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov        ((AccessibilityNodeInfo) info).setCanOpenPopup(opensPopup);
968aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    }
978aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov
988aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    public static Bundle getExtras(Object info) {
998aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov        return ((AccessibilityNodeInfo) info).getExtras();
1008aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    }
1018aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov
1029e1c26a445029b66a6e81194b58452406a38b56cZachary Kuznia    private static long getTraits(Object info) {
1039e1c26a445029b66a6e81194b58452406a38b56cZachary Kuznia        return getExtras(info).getLong(TRAITS_KEY, TRAIT_UNSET);
1049e1c26a445029b66a6e81194b58452406a38b56cZachary Kuznia    }
1059e1c26a445029b66a6e81194b58452406a38b56cZachary Kuznia
1069e1c26a445029b66a6e81194b58452406a38b56cZachary Kuznia    private static void setTrait(Object info, long trait) {
1079e1c26a445029b66a6e81194b58452406a38b56cZachary Kuznia        Bundle extras = getExtras(info);
1089e1c26a445029b66a6e81194b58452406a38b56cZachary Kuznia        long traits = extras.getLong(TRAITS_KEY, 0);
1099e1c26a445029b66a6e81194b58452406a38b56cZachary Kuznia        extras.putLong(TRAITS_KEY, traits | trait);
1109e1c26a445029b66a6e81194b58452406a38b56cZachary Kuznia    }
1119e1c26a445029b66a6e81194b58452406a38b56cZachary Kuznia
1128aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    public static int getInputType(Object info) {
1138aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov        return ((AccessibilityNodeInfo) info).getInputType();
1148aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    }
1158aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov
1168aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    public static void setInputType(Object info, int inputType) {
1178aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov        ((AccessibilityNodeInfo) info).setInputType(inputType);
1188aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    }
1198aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov
1208aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    public static boolean isDismissable(Object info) {
1218aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov        return ((AccessibilityNodeInfo) info).isDismissable();
1228aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    }
1238aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov
1248aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    public static void setDismissable(Object info, boolean dismissable) {
1258aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov        ((AccessibilityNodeInfo) info).setDismissable(dismissable);
1268aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    }
1278aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov
1288aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    public static boolean isMultiLine(Object info) {
1298aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov        return ((AccessibilityNodeInfo) info).isMultiLine();
1308aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    }
1318aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov
1328aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    public static void setMultiLine(Object info, boolean multiLine) {
1338aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov        ((AccessibilityNodeInfo) info).setMultiLine(multiLine);
1348aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov    }
1358aaf50bd7d713dafc358e6215111e7b0a43ecc82Maxim Bogatov
136f0d984600125413628899bfc849bab102bc2228eSteven Dao    public static CharSequence getRoleDescription(Object info) {
137f0d984600125413628899bfc849bab102bc2228eSteven Dao        Bundle extras = getExtras(info);
138f0d984600125413628899bfc849bab102bc2228eSteven Dao        return extras.getCharSequence(ROLE_DESCRIPTION_KEY);
139f0d984600125413628899bfc849bab102bc2228eSteven Dao    }
140f0d984600125413628899bfc849bab102bc2228eSteven Dao
141f0d984600125413628899bfc849bab102bc2228eSteven Dao    public static void setRoleDescription(Object info, CharSequence roleDescription) {
142f0d984600125413628899bfc849bab102bc2228eSteven Dao        Bundle extras = getExtras(info);
143f0d984600125413628899bfc849bab102bc2228eSteven Dao        extras.putCharSequence(ROLE_DESCRIPTION_KEY, roleDescription);
144f0d984600125413628899bfc849bab102bc2228eSteven Dao    }
145f0d984600125413628899bfc849bab102bc2228eSteven Dao
14677df76ce4466b7a3739fbbe53c2ac99d976b113eAbhinav Baid    public static Object obtainRangeInfo(int type, float min, float max, float current) {
14777df76ce4466b7a3739fbbe53c2ac99d976b113eAbhinav Baid        return AccessibilityNodeInfo.RangeInfo.obtain(type, min, max, current);
14877df76ce4466b7a3739fbbe53c2ac99d976b113eAbhinav Baid    }
14977df76ce4466b7a3739fbbe53c2ac99d976b113eAbhinav Baid
150fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen    static class CollectionInfo {
151fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        static int getColumnCount(Object info) {
152fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen            return ((AccessibilityNodeInfo.CollectionInfo) info).getColumnCount();
153fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        }
154fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
155fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        static int getRowCount(Object info) {
156fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen            return ((AccessibilityNodeInfo.CollectionInfo) info).getRowCount();
157fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        }
158fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
159fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        static boolean isHierarchical(Object info) {
160fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen            return ((AccessibilityNodeInfo.CollectionInfo) info).isHierarchical();
161fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        }
162fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen    }
163fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
164fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen    static class CollectionItemInfo {
165fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        static int getColumnIndex(Object info) {
166fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen            return ((AccessibilityNodeInfo.CollectionItemInfo) info).getColumnIndex();
167fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        }
168fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
169fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        static int getColumnSpan(Object info) {
170fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen            return ((AccessibilityNodeInfo.CollectionItemInfo) info).getColumnSpan();
171fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        }
172fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
173fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        static int getRowIndex(Object info) {
174fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen            return ((AccessibilityNodeInfo.CollectionItemInfo) info).getRowIndex();
175fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        }
176fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
177fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        static int getRowSpan(Object info) {
178fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen            return ((AccessibilityNodeInfo.CollectionItemInfo) info).getRowSpan();
179fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        }
180fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
181fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        static boolean isHeading(Object info) {
182fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen            return ((AccessibilityNodeInfo.CollectionItemInfo) info).isHeading();
183fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        }
184fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen    }
185fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
186fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen    static class RangeInfo {
187fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        static float getCurrent(Object info) {
188fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen            return ((AccessibilityNodeInfo.RangeInfo) info).getCurrent();
189fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        }
190fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
191fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        static float getMax(Object info) {
192fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen            return ((AccessibilityNodeInfo.RangeInfo) info).getMax();
193fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        }
194fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
195fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        static float getMin(Object info) {
196fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen            return ((AccessibilityNodeInfo.RangeInfo) info).getMin();
197fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        }
198fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen
199fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        static int getType(Object info) {
200fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen            return ((AccessibilityNodeInfo.RangeInfo) info).getType();
201fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen        }
202fbfefc40581dd94616359c796b4cc03969b22a10Kristian Monsen    }
203086e7db1ab6ef49b4b7974c471b70f81b2d13aefAlan Viverette}
204