| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.server; |
| |
| import android.view.InputChannel; |
| import android.view.InputTarget; |
| |
| /** |
| * A specialized list of input targets backed by an array. |
| * |
| * This class is part of an InputManager optimization to avoid allocating and copying |
| * input target arrays unnecessarily on return from JNI callbacks. Internally, it keeps |
| * an array full of demand-allocated InputTarget objects that it recycles each time the |
| * list is cleared. The used portion of the array is padded with a null. |
| * |
| * @hide |
| */ |
| public class InputTargetList { |
| private InputTarget[] mArray; |
| private int mCount; |
| |
| /** |
| * Creates an empty input target list. |
| */ |
| public InputTargetList() { |
| mArray = new InputTarget[8]; |
| } |
| |
| /** |
| * Clears the input target list. |
| */ |
| public void clear() { |
| if (mCount == 0) { |
| return; |
| } |
| |
| int count = mCount; |
| mCount = 0; |
| mArray[count] = mArray[0]; |
| while (count > 0) { |
| count -= 1; |
| mArray[count].recycle(); |
| } |
| // mArray[0] could be set to null here but we do it in toNullTerminatedArray() |
| } |
| |
| /** |
| * Adds a new input target to the input target list. |
| * @param inputChannel The input channel of the target window. |
| * @param flags Input target flags. |
| * @param timeoutNanos The input dispatch timeout (before ANR) in nanoseconds or -1 if none. |
| * @param xOffset An offset to add to motion X coordinates during delivery. |
| * @param yOffset An offset to add to motion Y coordinates during delivery. |
| */ |
| public void add(InputChannel inputChannel, int flags, long timeoutNanos, |
| float xOffset, float yOffset) { |
| if (inputChannel == null) { |
| throw new IllegalArgumentException("inputChannel must not be null"); |
| } |
| |
| if (mCount + 1 == mArray.length) { |
| InputTarget[] oldArray = mArray; |
| mArray = new InputTarget[oldArray.length * 2]; |
| System.arraycopy(oldArray, 0, mArray, 0, mCount); |
| } |
| |
| // Grab InputTarget from tail (after used section) if available. |
| InputTarget inputTarget = mArray[mCount + 1]; |
| if (inputTarget == null) { |
| inputTarget = new InputTarget(); |
| } |
| inputTarget.mInputChannel = inputChannel; |
| inputTarget.mFlags = flags; |
| inputTarget.mTimeoutNanos = timeoutNanos; |
| inputTarget.mXOffset = xOffset; |
| inputTarget.mYOffset = yOffset; |
| |
| mArray[mCount] = inputTarget; |
| mCount += 1; |
| // mArray[mCount] could be set to null here but we do it in toNullTerminatedArray() |
| } |
| |
| /** |
| * Gets the input targets as a null-terminated array. |
| * @return The input target array. |
| */ |
| public InputTarget[] toNullTerminatedArray() { |
| mArray[mCount] = null; |
| return mArray; |
| } |
| } |