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