InputChannel.java revision 7fbdc84e87dd3a0e196b9803bb04495d11e9cb8a
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 2546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * a window in another process. It is Parcelable so that it can be transmitted 2646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * to the ViewRoot through a Binder transaction as part of registering the Window. 2746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * @hide 2846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 297fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brownpublic final class InputChannel implements Parcelable { 3046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private static final String TAG = "InputChannel"; 3146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public static final Parcelable.Creator<InputChannel> CREATOR 3346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown = new Parcelable.Creator<InputChannel>() { 3446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public InputChannel createFromParcel(Parcel source) { 3546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown InputChannel result = new InputChannel(); 3646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown result.readFromParcel(source); 3746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return result; 3846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 3946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 4046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public InputChannel[] newArray(int size) { 4146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return new InputChannel[size]; 4246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 4346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown }; 4446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 4546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown @SuppressWarnings("unused") 4646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private int mPtr; // used by native code 4746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 4846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private boolean mDisposeAfterWriteToParcel; 4946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private static native InputChannel[] nativeOpenInputChannelPair(String name); 5146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private native void nativeDispose(boolean finalized); 5346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private native void nativeTransferTo(InputChannel other); 5446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private native void nativeReadFromParcel(Parcel parcel); 5546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private native void nativeWriteToParcel(Parcel parcel); 5646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown private native String nativeGetName(); 5846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /** 6046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Creates an uninitialized input channel. 6146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * It can be initialized by reading from a Parcel or by transferring the state of 6246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * another input channel into this one. 6346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 6446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public InputChannel() { 6546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 6646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 6746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown @Override 6846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown protected void finalize() throws Throwable { 6946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown try { 7046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeDispose(true); 7146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } finally { 7246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown super.finalize(); 7346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 7446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 7546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 7646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /** 7746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Creates a new input channel pair. One channel should be provided to the input 7846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * dispatcher and the other to the application's input queue. 7946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * @param name The descriptive (non-unique) name of the channel pair. 8046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * @return A pair of input channels. They are symmetric and indistinguishable. 8146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 8246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public static InputChannel[] openInputChannelPair(String name) { 8346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (name == null) { 8446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throw new IllegalArgumentException("name must not be null"); 8546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 8646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 8746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Slog.d(TAG, "Opening input channel pair '" + name + "'"); 8846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return nativeOpenInputChannelPair(name); 8946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 9046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 9146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /** 9246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Gets the name of the input channel. 9346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * @return The input channel name. 9446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 9546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public String getName() { 9646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown String name = nativeGetName(); 9746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return name != null ? name : "uninitialized"; 9846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 9946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /** 10146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Disposes the input channel. 10246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Explicitly releases the reference this object is holding on the input channel. 10346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * When all references are released, the input channel will be closed. 10446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 10546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void dispose() { 10646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeDispose(false); 10746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 10846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /** 11046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Transfers ownership of the internal state of the input channel to another 11146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * instance and invalidates this instance. This is used to pass an input channel 11246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * as an out parameter in a binder call. 11346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * @param other The other input channel instance. 11446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 11546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void transferToBinderOutParameter(InputChannel outParameter) { 11646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (outParameter == null) { 11746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throw new IllegalArgumentException("outParameter must not be null"); 11846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 11946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 12046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeTransferTo(outParameter); 12146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown outParameter.mDisposeAfterWriteToParcel = true; 12246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 12346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 12446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public int describeContents() { 12546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return Parcelable.CONTENTS_FILE_DESCRIPTOR; 12646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 12746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 12846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void readFromParcel(Parcel in) { 12946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (in == null) { 13046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throw new IllegalArgumentException("in must not be null"); 13146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 13246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeReadFromParcel(in); 13446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 13546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void writeToParcel(Parcel out, int flags) { 13746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (out == null) { 13846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown throw new IllegalArgumentException("out must not be null"); 13946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 14046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown nativeWriteToParcel(out); 14246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (mDisposeAfterWriteToParcel) { 14446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown dispose(); 14546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 14646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 14746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown @Override 14946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public String toString() { 15046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return getName(); 15146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 15246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 153