PointerTrackerQueue.java revision 5e06b8534ffdf5099d2ef4551b113a103cdf7061
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 * use this file except in compliance with the License. You may obtain a copy of 6 * the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16 17package com.android.inputmethod.keyboard.internal; 18 19import android.util.Log; 20 21import com.android.inputmethod.keyboard.Keyboard; 22import com.android.inputmethod.keyboard.PointerTracker; 23 24import java.util.Iterator; 25import java.util.LinkedList; 26 27public class PointerTrackerQueue { 28 private static final String TAG = PointerTrackerQueue.class.getSimpleName(); 29 private static final boolean DEBUG = false; 30 31 // TODO: Use ring buffer instead of {@link LinkedList}. 32 private final LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>(); 33 34 public synchronized void add(PointerTracker tracker) { 35 mQueue.add(tracker); 36 } 37 38 public synchronized void remove(PointerTracker tracker) { 39 mQueue.remove(tracker); 40 } 41 42 public synchronized void releaseAllPointersOlderThan(PointerTracker tracker, 43 long eventTime) { 44 if (DEBUG) { 45 Log.d(TAG, "releaseAllPoniterOlderThan: [" + tracker.mPointerId + "] " + this); 46 } 47 if (!mQueue.contains(tracker)) { 48 return; 49 } 50 final Iterator<PointerTracker> it = mQueue.iterator(); 51 while (it.hasNext()) { 52 final PointerTracker t = it.next(); 53 if (t == tracker) { 54 break; 55 } 56 if (!t.isModifier()) { 57 t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime); 58 it.remove(); 59 } 60 } 61 } 62 63 public void releaseAllPointers(long eventTime) { 64 releaseAllPointersExcept(null, eventTime); 65 } 66 67 public synchronized void releaseAllPointersExcept(PointerTracker tracker, long eventTime) { 68 if (DEBUG) { 69 if (tracker == null) { 70 Log.d(TAG, "releaseAllPoniters: " + this); 71 } else { 72 Log.d(TAG, "releaseAllPoniterExcept: [" + tracker.mPointerId + "] " + this); 73 } 74 } 75 final Iterator<PointerTracker> it = mQueue.iterator(); 76 while (it.hasNext()) { 77 final PointerTracker t = it.next(); 78 if (t != tracker) { 79 t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime); 80 it.remove(); 81 } 82 } 83 } 84 85 public synchronized boolean hasModifierKeyOlderThan(PointerTracker tracker) { 86 final Iterator<PointerTracker> it = mQueue.iterator(); 87 while (it.hasNext()) { 88 final PointerTracker t = it.next(); 89 if (t == tracker) { 90 break; 91 } 92 if (t.isModifier()) { 93 return true; 94 } 95 } 96 return false; 97 } 98 99 public synchronized boolean isAnyInSlidingKeyInput() { 100 for (final PointerTracker tracker : mQueue) { 101 if (tracker.isInSlidingKeyInput()) { 102 return true; 103 } 104 } 105 return false; 106 } 107 108 @Override 109 public String toString() { 110 final StringBuilder sb = new StringBuilder(); 111 for (final PointerTracker tracker : mQueue) { 112 if (sb.length() > 0) 113 sb.append(" "); 114 sb.append("[" + tracker.mPointerId + " " 115 + Keyboard.printableCode(tracker.getKey().mCode) + "]"); 116 } 117 return sb.toString(); 118 } 119} 120