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
217ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaokaimport java.util.ArrayList;
225a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka
23a28a05e971cc242b338331a3b78276fa95188d19Tadashi G. Takaokapublic final class PointerTrackerQueue {
24beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    private static final String TAG = PointerTrackerQueue.class.getSimpleName();
25beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    private static final boolean DEBUG = false;
26beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka
277ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka    public interface Element {
280cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka        public boolean isModifier();
292fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        public boolean isInDraggingFinger();
300cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka        public void onPhantomUpEvent(long eventTime);
3113d5da8b8819866bd2ef1aac6eadc74305bf8d55Tadashi G. Takaoka        public void cancelTrackingForAction();
320cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka    }
330cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka
347ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka    private static final int INITIAL_CAPACITY = 10;
35951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    // Note: {@link #mExpandableArrayOfActivePointers} and {@link #mArraySize} are synchronized by
36951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    // {@link #mExpandableArrayOfActivePointers}
377ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka    private final ArrayList<Element> mExpandableArrayOfActivePointers =
38a91561aa58db1c43092c1caecc051a11fa5391c7Tadashi G. Takaoka            new ArrayList<>(INITIAL_CAPACITY);
397ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka    private int mArraySize = 0;
405a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka
41951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public int size() {
42951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
43951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            return mArraySize;
44951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        }
45eea34598bf63f670f47d7b3f37b6436921e5fe02Tom Ouyang    }
46eea34598bf63f670f47d7b3f37b6436921e5fe02Tom Ouyang
47951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public void add(final Element pointer) {
48951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
49979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            if (DEBUG) {
50979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                Log.d(TAG, "add: " + pointer + " " + this);
51979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            }
52951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
53951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
54951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            if (arraySize < expandableArray.size()) {
55951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                expandableArray.set(arraySize, pointer);
56951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            } else {
57951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                expandableArray.add(pointer);
58951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            }
59951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            mArraySize = arraySize + 1;
607ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka        }
615a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka    }
625a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka
63951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public void remove(final Element pointer) {
64951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
65979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            if (DEBUG) {
66979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                Log.d(TAG, "remove: " + pointer + " " + this);
67979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            }
68951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
69951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
70979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            int newIndex = 0;
71951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            for (int index = 0; index < arraySize; index++) {
72951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
73951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (element == pointer) {
74979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    if (newIndex != index) {
75951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                        Log.w(TAG, "Found duplicated element in remove: " + pointer);
76951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    }
77951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    continue; // Remove this element from the expandableArray.
78951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
79979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                if (newIndex != index) {
80951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    // Shift this element toward the beginning of the expandableArray.
81979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    expandableArray.set(newIndex, element);
827ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka                }
83979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                newIndex++;
847ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka            }
85979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            mArraySize = newIndex;
867ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka        }
8778ac86ff9ddfa354567c3146c67c914fc354d3a0Tadashi G. Takaoka    }
8878ac86ff9ddfa354567c3146c67c914fc354d3a0Tadashi G. Takaoka
89951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public Element getOldestElement() {
90951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
91951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            return (mArraySize == 0) ? null : mExpandableArrayOfActivePointers.get(0);
92951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        }
93f0e83046f022b5594f98aef07fbda7f2f837f262Tadashi G. Takaoka    }
94f0e83046f022b5594f98aef07fbda7f2f837f262Tadashi G. Takaoka
95951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public void releaseAllPointersOlderThan(final Element pointer, final long eventTime) {
96951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
97951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            if (DEBUG) {
9897465afbf811031b3e26557d4fb74879df21c68fKeisuke Kuroyanagi                Log.d(TAG, "releaseAllPointerOlderThan: " + pointer + " " + this);
997ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka            }
100951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
101951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
102979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            int newIndex, index;
103979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            for (newIndex = index = 0; index < arraySize; index++) {
104951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
105951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (element == pointer) {
106951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    break; // Stop releasing elements.
107951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
108951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (!element.isModifier()) {
109951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    element.onPhantomUpEvent(eventTime);
110951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    continue; // Remove this element from the expandableArray.
111951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
112979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                if (newIndex != index) {
113951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    // Shift this element toward the beginning of the expandableArray.
114979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    expandableArray.set(newIndex, element);
1157ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka                }
116979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                newIndex++;
1175a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka            }
118951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            // Shift rest of the expandableArray.
119951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            int count = 0;
120951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            for (; index < arraySize; index++) {
121951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
122951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (element == pointer) {
123979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    count++;
124979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    if (count > 1) {
125951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                        Log.w(TAG, "Found duplicated element in releaseAllPointersOlderThan: "
126951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                                + pointer);
127951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    }
128951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
129979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                if (newIndex != index) {
130979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    // Shift this element toward the beginning of the expandableArray.
131979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    expandableArray.set(newIndex, expandableArray.get(index));
132951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
133979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                newIndex++;
134951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            }
135979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            mArraySize = newIndex;
1365a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka        }
1375a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka    }
1385a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka
1397ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka    public void releaseAllPointers(final long eventTime) {
140d3002aa8cd5339d59123e0c96174f6701e2c72ccTadashi G. Takaoka        releaseAllPointersExcept(null, eventTime);
1411d7d9664a9850a7c8043651e4b7a055ec034f571Tadashi G. Takaoka    }
1421d7d9664a9850a7c8043651e4b7a055ec034f571Tadashi G. Takaoka
143951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public void releaseAllPointersExcept(final Element pointer, final long eventTime) {
144951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
145951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            if (DEBUG) {
146951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (pointer == null) {
14797465afbf811031b3e26557d4fb74879df21c68fKeisuke Kuroyanagi                    Log.d(TAG, "releaseAllPointers: " + this);
148951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                } else {
14997465afbf811031b3e26557d4fb74879df21c68fKeisuke Kuroyanagi                    Log.d(TAG, "releaseAllPointerExcept: " + pointer + " " + this);
1507ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka                }
1517ae1fd02d40c8c026a411f1037753725868c611eTadashi G. Takaoka            }
152951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
153951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
154979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            int newIndex = 0, count = 0;
155951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            for (int index = 0; index < arraySize; index++) {
156951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
157951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (element == pointer) {
158979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    count++;
159979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    if (count > 1) {
160951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                        Log.w(TAG, "Found duplicated element in releaseAllPointersExcept: "
161951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                                + pointer);
162951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    }
163951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                } else {
164951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    element.onPhantomUpEvent(eventTime);
165951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    continue; // Remove this element from the expandableArray.
166951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
167979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                if (newIndex != index) {
168951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    // Shift this element toward the beginning of the expandableArray.
169979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                    expandableArray.set(newIndex, element);
170951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
171979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                newIndex++;
172d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka            }
173979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            mArraySize = newIndex;
174d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka        }
1755a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka    }
1765a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka
177951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public boolean hasModifierKeyOlderThan(final Element pointer) {
178951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
179951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
180951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
181951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            for (int index = 0; index < arraySize; index++) {
182951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
183951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (element == pointer) {
184951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    return false; // Stop searching modifier key.
185951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
186951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (element.isModifier()) {
187951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    return true;
188951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
1895e06b8534ffdf5099d2ef4551b113a103cdf7061Tadashi G. Takaoka            }
190951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            return false;
1915e06b8534ffdf5099d2ef4551b113a103cdf7061Tadashi G. Takaoka        }
1925e06b8534ffdf5099d2ef4551b113a103cdf7061Tadashi G. Takaoka    }
1935e06b8534ffdf5099d2ef4551b113a103cdf7061Tadashi G. Takaoka
1942fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    public boolean isAnyInDraggingFinger() {
195951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
196951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
197951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
198951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            for (int index = 0; index < arraySize; index++) {
199951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
2002fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                if (element.isInDraggingFinger()) {
201951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    return true;
202951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
203d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka            }
204951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            return false;
205cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka        }
206cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka    }
207cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka
2085c095e59f679f726df1b6655fbbd73e310ac0decTadashi G. Takaoka    public void cancelAllPointerTrackers() {
209951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
210979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            if (DEBUG) {
211979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka                Log.d(TAG, "cancelAllPointerTracker: " + this);
212979fb7415bdd185bb941d67d9d0f53f016a419a9Tadashi G. Takaoka            }
213951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
214951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
215951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            for (int index = 0; index < arraySize; index++) {
216951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
21713d5da8b8819866bd2ef1aac6eadc74305bf8d55Tadashi G. Takaoka                element.cancelTrackingForAction();
218951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            }
219b3f789799a2983a9c97288686f11dfab369243c0Tadashi G. Takaoka        }
220b3f789799a2983a9c97288686f11dfab369243c0Tadashi G. Takaoka    }
221b3f789799a2983a9c97288686f11dfab369243c0Tadashi G. Takaoka
222418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka    @Override
223951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka    public String toString() {
224951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka        synchronized (mExpandableArrayOfActivePointers) {
225951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final StringBuilder sb = new StringBuilder();
226951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers;
227951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            final int arraySize = mArraySize;
228951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            for (int index = 0; index < arraySize; index++) {
229951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                final Element element = expandableArray.get(index);
230951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                if (sb.length() > 0) {
231951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                    sb.append(" ");
232951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                }
233951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka                sb.append(element.toString());
234951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            }
235951ea3c06d22def7472dcd6f9258b115046ab60bTadashi G. Takaoka            return "[" + sb.toString() + "]";
236418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka        }
237418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka    }
2385a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka}
239