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