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