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