PointerTrackerQueue.java revision d17786fcd21e53b81e4d4e924adc8becdfa46ec2
15a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka/* 28632bff2d5a8e1160989008dea6eff4b94b065ddTadashi G. Takaoka * Copyright (C) 2010 The Android Open Source Project 35a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * 45a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License"); you may not 55a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * use this file except in compliance with the License. You may obtain a copy of 65a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * the License at 75a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * 85a309f57155fb95667c2ccdda730eaf175de8876Tadashi 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 115a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 125a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 135a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * License for the specific language governing permissions and limitations under 145a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * the License. 155a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka */ 165a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka 1772934bd5967d0127f71fd4d66158b18b4e6ceefeTadashi G. Takaokapackage com.android.inputmethod.keyboard.internal; 1872934bd5967d0127f71fd4d66158b18b4e6ceefeTadashi G. Takaoka 1972934bd5967d0127f71fd4d66158b18b4e6ceefeTadashi G. Takaokaimport com.android.inputmethod.keyboard.PointerTracker; 205a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka 215a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaokaimport java.util.LinkedList; 225a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka 235a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaokapublic class PointerTrackerQueue { 24d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka private final LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>(); 255a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka 26d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka public synchronized void add(PointerTracker tracker) { 275a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka mQueue.add(tracker); 285a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka } 295a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka 30d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka public synchronized void releaseAllPointersOlderThan(PointerTracker tracker, long eventTime) { 311d7d9664a9850a7c8043651e4b7a055ec034f571Tadashi G. Takaoka if (mQueue.lastIndexOf(tracker) < 0) { 321d7d9664a9850a7c8043651e4b7a055ec034f571Tadashi G. Takaoka return; 331d7d9664a9850a7c8043651e4b7a055ec034f571Tadashi G. Takaoka } 34d2c2b4d112ee17750c1a49ff223b9410aa9e4ec6Tadashi G. Takaoka final LinkedList<PointerTracker> queue = mQueue; 355a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka int oldestPos = 0; 365a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka for (PointerTracker t = queue.get(oldestPos); t != tracker; t = queue.get(oldestPos)) { 375a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka if (t.isModifier()) { 385a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka oldestPos++; 395a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka } else { 40d3002aa8cd5339d59123e0c96174f6701e2c72ccTadashi G. Takaoka t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime); 415a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka queue.remove(oldestPos); 425a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka } 435a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka } 445a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka } 455a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka 461d7d9664a9850a7c8043651e4b7a055ec034f571Tadashi G. Takaoka public void releaseAllPointers(long eventTime) { 47d3002aa8cd5339d59123e0c96174f6701e2c72ccTadashi G. Takaoka releaseAllPointersExcept(null, eventTime); 481d7d9664a9850a7c8043651e4b7a055ec034f571Tadashi G. Takaoka } 491d7d9664a9850a7c8043651e4b7a055ec034f571Tadashi G. Takaoka 50d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka public synchronized void releaseAllPointersExcept(PointerTracker tracker, long eventTime) { 515a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka for (PointerTracker t : mQueue) { 52d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka if (t == tracker) { 535a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka continue; 54d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka } 55d3002aa8cd5339d59123e0c96174f6701e2c72ccTadashi G. Takaoka t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime); 565a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka } 575a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka mQueue.clear(); 58d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka if (tracker != null) { 595a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka mQueue.add(tracker); 60d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka } 615a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka } 625a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka 63d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka public synchronized void remove(PointerTracker tracker) { 645a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka mQueue.remove(tracker); 655a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka } 66418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka 67d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka public synchronized boolean isAnyInSlidingKeyInput() { 68cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka for (final PointerTracker tracker : mQueue) { 69d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka if (tracker.isInSlidingKeyInput()) { 70cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka return true; 71d17786fcd21e53b81e4d4e924adc8becdfa46ec2Tadashi G. Takaoka } 72cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka } 73cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka return false; 74cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka } 75cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka 76418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka @Override 77418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka public String toString() { 78418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka StringBuilder sb = new StringBuilder("["); 79418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka for (PointerTracker tracker : mQueue) { 80418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka if (sb.length() > 1) 81418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka sb.append(" "); 82418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka sb.append(String.format("%d", tracker.mPointerId)); 83418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka } 84418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka sb.append("]"); 85418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka return sb.toString(); 86418d80d7de8d24150fc7e1710f7590a33301e546Tadashi G. Takaoka } 875a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka} 88