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