146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* 246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Copyright (C) 2010 The Android Open Source Project 346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * you may not use this file except in compliance with the License. 646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * You may obtain a copy of the License at 746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 1046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Unless required by applicable law or agreed to in writing, software 1146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 1246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * See the License for the specific language governing permissions and 1446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * limitations under the License. 1546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 1646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpackage android.view; 1846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.os.Parcel; 2046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.os.Parcelable; 2146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.util.Slog; 2246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/** 2446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * An input channel specifies the file descriptors used to send input events to 25a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn * a window in another process. It is Parcelable so that it can be sent 26a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn * to the process that is to receive events. Only one thread should be reading 27a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn * from an InputChannel at a time. 2846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * @hide 2946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 307fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownpublic final class InputChannel implements Parcelable { 3146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private static final String TAG = "InputChannel"; 3246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 33c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown private static final boolean DEBUG = false; 34c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 3546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public static final Parcelable.Creator<InputChannel> CREATOR 3646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown = new Parcelable.Creator<InputChannel>() { 3746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public InputChannel createFromParcel(Parcel source) { 3846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown InputChannel result = new InputChannel(); 3946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown result.readFromParcel(source); 4046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return result; 4146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 4246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 4346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public InputChannel[] newArray(int size) { 4446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return new InputChannel[size]; 4546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 4646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown }; 4746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 4846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown @SuppressWarnings("unused") 4946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private int mPtr; // used by native code 5046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private static native InputChannel[] nativeOpenInputChannelPair(String name); 5246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private native void nativeDispose(boolean finalized); 5446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private native void nativeTransferTo(InputChannel other); 5546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private native void nativeReadFromParcel(Parcel parcel); 5646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private native void nativeWriteToParcel(Parcel parcel); 5746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private native String nativeGetName(); 5946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 6046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /** 6146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Creates an uninitialized input channel. 6246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * It can be initialized by reading from a Parcel or by transferring the state of 6346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * another input channel into this one. 6446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 6546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public InputChannel() { 6646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 6746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 6846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown @Override 6946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown protected void finalize() throws Throwable { 7046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown try { 7146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeDispose(true); 7246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } finally { 7346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown super.finalize(); 7446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 7546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 7646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 7746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /** 7846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Creates a new input channel pair. One channel should be provided to the input 7946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * dispatcher and the other to the application's input queue. 8046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * @param name The descriptive (non-unique) name of the channel pair. 8146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * @return A pair of input channels. They are symmetric and indistinguishable. 8246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 8346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public static InputChannel[] openInputChannelPair(String name) { 8446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (name == null) { 8546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throw new IllegalArgumentException("name must not be null"); 8646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 87c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 88c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown if (DEBUG) { 89c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown Slog.d(TAG, "Opening input channel pair '" + name + "'"); 90c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown } 9146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return nativeOpenInputChannelPair(name); 9246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 9346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /** 9546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Gets the name of the input channel. 9646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * @return The input channel name. 9746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 9846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public String getName() { 9946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown String name = nativeGetName(); 10046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return name != null ? name : "uninitialized"; 10146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 10246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /** 10446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Disposes the input channel. 10546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Explicitly releases the reference this object is holding on the input channel. 10646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * When all references are released, the input channel will be closed. 10746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 10846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void dispose() { 10946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeDispose(false); 11046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 11146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /** 11346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Transfers ownership of the internal state of the input channel to another 11446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * instance and invalidates this instance. This is used to pass an input channel 11546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * as an out parameter in a binder call. 11646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * @param other The other input channel instance. 11746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 1180a0ab128a65900a23f1018a14f5cbecec6443dd3Jeff Brown public void transferTo(InputChannel outParameter) { 11946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (outParameter == null) { 12046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throw new IllegalArgumentException("outParameter must not be null"); 12146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 12246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 12346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeTransferTo(outParameter); 12446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 12546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 12646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public int describeContents() { 12746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return Parcelable.CONTENTS_FILE_DESCRIPTOR; 12846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 12946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void readFromParcel(Parcel in) { 13146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (in == null) { 13246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throw new IllegalArgumentException("in must not be null"); 13346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 13446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeReadFromParcel(in); 13646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 13746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void writeToParcel(Parcel out, int flags) { 13946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (out == null) { 14046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throw new IllegalArgumentException("out must not be null"); 14146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 14246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeWriteToParcel(out); 14446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1450a0ab128a65900a23f1018a14f5cbecec6443dd3Jeff Brown if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0) { 14646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown dispose(); 14746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 14846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 14946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 15046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown @Override 15146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public String toString() { 15246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return getName(); 15346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 15446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 155