PointerTrackerQueue.java revision 2fa3693c264a4c150ac307d9bb7f6f8f18cc4ffc
15a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka/*
28632bff2d5a8e1160989008dea6eff4b94b065ddTadashi G. Takaoka * Copyright (C) 2010 The Android Open Source Project
35a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka *
48aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License");
58aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * you may not use this file except in compliance with the License.
68aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * You may obtain a copy of the License at
75a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka *
88aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka *      http://www.apache.org/licenses/LICENSE-2.0
95a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka *
105a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software
118aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS,
128aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * See the License for the specific language governing permissions and
148aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * limitations under the License.
155a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka */
165a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka
1772934bd5967d0127f71fd4d66158b18b4e6ceefeTadashi G. Takaokapackage com.android.inputmethod.keyboard.internal;
1872934bd5967d0127f71fd4d66158b18b4e6ceefeTadashi G. Takaoka
19beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaokaimport android.util.Log;
20beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka
21e28eba5074664d5716b8e58b8d0a235746b261ebKen Wakasaimport com.android.inputmethod.latin.utils.CollectionUtils;
225f282ea9e4a4590fcbab6e27d5fca7dacbb40a6aTadashi G. Takaoka
237ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaokaimport java.util.ArrayList;
245a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka
25a28a05e971cc242b338331a3b78276fa95188d19Tadashi G. Takaokapublic final class PointerTrackerQueue {
26beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    private static final String TAG = PointerTrackerQueue.class.getSimpleName();
27beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    private static final boolean DEBUG = false;
28beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka
297ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka    public interface Element {
300cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka        public boolean isModifier();
312fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        public boolean isInDraggingFinger();
320cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka        public void onPhantomUpEvent(long eventTime);
3313d5da8b8819866bd2ef1aac6eadc74305bf8d55Tadashi G. Takaoka        public void cancelTrackingForAction();
340cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka    }
350cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka
367ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka    private static final int INITIAL_CAPACITY = 10;
37951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    // Note: {@link #mExpandableArrayOfActivePointers} and {@link #mArraySize} are synchronized by
38951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    // {@link #mExpandableArrayOfActivePointers}
397ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka    private final ArrayList<Element> mExpandableArrayOfActivePointers =
405f282ea9e4a4590fcbab6e27d5fca7dacbb40a6aTadashi G. Takaoka            CollectionUtils.newArrayList(INITIAL_CAPACITY);
417ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka    private int mArraySize = 0;
425a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka
43951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public int size() {
44951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
45951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            return mArraySize;
46951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        }
47eea34598bf63f670f47d7b3f37b6436921e5fe02Tom Ouyang    }
48eea34598bf63f670f47d7b3f37b6436921e5fe02Tom Ouyang
49951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public void add(final Element pointer) {
50951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
51979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            if (DEBUG) {
52979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                Log.d(TAG, "add: " + pointer + " " + this);
53979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            }
54951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
55951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
56951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            if (arraySize < expandableArray.size()) {
57951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                expandableArray.set(arraySize, pointer);
58951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            } else {
59951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                expandableArray.add(pointer);
60951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            }
61951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            mArraySize = arraySize + 1;
627ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka        }
635a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka    }
645a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka
65951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public void remove(final Element pointer) {
66951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
67979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            if (DEBUG) {
68979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                Log.d(TAG, "remove: " + pointer + " " + this);
69979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            }
70951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
71951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
72979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            int newIndex = 0;
73951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            for (int index = 0; index < arraySize; index++) {
74951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
75951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (element == pointer) {
76979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    if (newIndex != index) {
77951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                        Log.w(TAG, "Found duplicated element in remove: " + pointer);
78951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    }
79951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    continue; // Remove this element from the expandableArray.
80951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
81979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                if (newIndex != index) {
82951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    // Shift this element toward the beginning of the expandableArray.
83979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    expandableArray.set(newIndex, element);
847ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka                }
85979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                newIndex++;
867ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka            }
87979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            mArraySize = newIndex;
887ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka        }
8978ac86ff9ddfa354567c3146c67c914fc354d3a0Tadashi G. Takaoka    }
9078ac86ff9ddfa354567c3146c67c914fc354d3a0Tadashi G. Takaoka
91951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public Element getOldestElement() {
92951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
93951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            return (mArraySize == 0) ? null : mExpandableArrayOfActivePointers.get(0);
94951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        }
95f0e83046f022b5594f98aef07fbda7f2f837f262Tadashi G. Takaoka    }
96f0e83046f022b5594f98aef07fbda7f2f837f262Tadashi G. Takaoka
97951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public void releaseAllPointersOlderThan(final Element pointer, final long eventTime) {
98951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
99951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            if (DEBUG) {
100951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                Log.d(TAG, "releaseAllPoniterOlderThan: " + pointer + " " + this);
1017ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka            }
102951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
103951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
104979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            int newIndex, index;
105979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            for (newIndex = index = 0; index < arraySize; index++) {
106951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
107951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (element == pointer) {
108951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    break; // Stop releasing elements.
109951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
110951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (!element.isModifier()) {
111951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    element.onPhantomUpEvent(eventTime);
112951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    continue; // Remove this element from the expandableArray.
113951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
114979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                if (newIndex != index) {
115951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    // Shift this element toward the beginning of the expandableArray.
116979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    expandableArray.set(newIndex, element);
1177ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka                }
118979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                newIndex++;
1195a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka            }
120951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            // Shift rest of the expandableArray.
121951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            int count = 0;
122951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            for (; index < arraySize; index++) {
123951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
124951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (element == pointer) {
125979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    count++;
126979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    if (count > 1) {
127951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                        Log.w(TAG, "Found duplicated element in releaseAllPointersOlderThan: "
128951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                                + pointer);
129951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    }
130951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
131979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                if (newIndex != index) {
132979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    // Shift this element toward the beginning of the expandableArray.
133979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    expandableArray.set(newIndex, expandableArray.get(index));
134951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
135979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                newIndex++;
136951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            }
137979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            mArraySize = newIndex;
1385a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka        }
1395a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka    }
1405a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka
1417ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka    public void releaseAllPointers(final long eventTime) {
142d3002aa8cd5339d59123e0c96174f6701e2c72ccTadashi G. Takaoka        releaseAllPointersExcept(null, eventTime);
1431d7d9664a9850a7c8043651e4b7a055ec034f571Tadashi G. Takaoka    }
1441d7d9664a9850a7c8043651e4b7a055ec034f571Tadashi G. Takaoka
145951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public void releaseAllPointersExcept(final Element pointer, final long eventTime) {
146951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
147951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            if (DEBUG) {
148951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (pointer == null) {
149951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    Log.d(TAG, "releaseAllPoniters: " + this);
150951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                } else {
151951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    Log.d(TAG, "releaseAllPoniterExcept: " + pointer + " " + this);
1527ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka                }
1537ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka            }
154951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
155951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
156979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            int newIndex = 0, count = 0;
157951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            for (int index = 0; index < arraySize; index++) {
158951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
159951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (element == pointer) {
160979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    count++;
161979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    if (count > 1) {
162951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                        Log.w(TAG, "Found duplicated element in releaseAllPointersExcept: "
163951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                                + pointer);
164951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    }
165951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                } else {
166951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    element.onPhantomUpEvent(eventTime);
167951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    continue; // Remove this element from the expandableArray.
168951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
169979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                if (newIndex != index) {
170951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    // Shift this element toward the beginning of the expandableArray.
171979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    expandableArray.set(newIndex, element);
172951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
173979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                newIndex++;
174d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka            }
175979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            mArraySize = newIndex;
176d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka        }
1775a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka    }
1785a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka
179951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public boolean hasModifierKeyOlderThan(final Element pointer) {
180951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
181951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
182951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
183951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            for (int index = 0; index < arraySize; index++) {
184951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
185951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (element == pointer) {
186951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    return false; // Stop searching modifier key.
187951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
188951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (element.isModifier()) {
189951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    return true;
190951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
1915e06b8534ffdf5099d2ef4551b113a103cdf7061Tadashi G. Takaoka            }
192951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            return false;
1935e06b8534ffdf5099d2ef4551b113a103cdf7061Tadashi G. Takaoka        }
1945e06b8534ffdf5099d2ef4551b113a103cdf7061Tadashi G. Takaoka    }
1955e06b8534ffdf5099d2ef4551b113a103cdf7061Tadashi G. Takaoka
1962fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    public boolean isAnyInDraggingFinger() {
197951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
198951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
199951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
200951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            for (int index = 0; index < arraySize; index++) {
201951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
2022fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                if (element.isInDraggingFinger()) {
203951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    return true;
204951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
205d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka            }
206951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            return false;
207cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka        }
208cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka    }
209cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka
2105c095e59f679f726df1b6655fbbd73e310ac0decTadashi G. Takaoka    public void cancelAllPointerTrackers() {
211951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
212979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            if (DEBUG) {
213979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                Log.d(TAG, "cancelAllPointerTracker: " + this);
214979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            }
215951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
216951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
217951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            for (int index = 0; index < arraySize; index++) {
218951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
21913d5da8b8819866bd2ef1aac6eadc74305bf8d55Tadashi G. Takaoka                element.cancelTrackingForAction();
220951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            }
221b3f789799a2983a9c97288686f11dfab369243c0Tadashi G. Takaoka        }
222b3f789799a2983a9c97288686f11dfab369243c0Tadashi G. Takaoka    }
223b3f789799a2983a9c97288686f11dfab369243c0Tadashi G. Takaoka
224418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka    @Override
225951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public String toString() {
226951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
227951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final StringBuilder sb = new StringBuilder();
228951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
229951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
230951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            for (int index = 0; index < arraySize; index++) {
231951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
232951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (sb.length() > 0) {
233951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    sb.append(" ");
234951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
235951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                sb.append(element.toString());
236951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            }
237951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            return "[" + sb.toString() + "]";
238418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka        }
239418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka    }
2405a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka}
241