19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reference to a Handler, which others can use to send messages to it.
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This allows for the implementation of message-based communication across
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * processes, by creating a Messenger pointing to a Handler in one process,
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and handing that Messenger to another process.
24ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn *
25ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn * <p>Note: the implementation underneath is just a simple wrapper around
26ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn * a {@link Binder} that is used to perform the communication.  This means
27ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn * semantically you should treat it as such: this class does not impact process
28ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn * lifecycle management (you must be using some higher-level component to tell
29ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn * the system that your process needs to continue running), the connection will
30ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn * break if your process goes away for any reason, etc.</p>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Messenger implements Parcelable {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final IMessenger mTarget;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new Messenger pointing to the given Handler.  Any Message
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * objects sent through this Messenger will appear in the Handler as if
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Handler#sendMessage(Message) Handler.sendMessage(Message)} had
398ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn     * been called directly.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param target The Handler that will receive sent messages.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Messenger(Handler target) {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTarget = target.getIMessenger();
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Send a Message to this Messenger's Handler.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param message The Message to send.  Usually retrieved through
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Message#obtain() Message.obtain()}.
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws RemoteException Throws DeadObjectException if the target
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Handler no longer exists.
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void send(Message message) throws RemoteException {
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTarget.send(message);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the IBinder that this Messenger is using to communicate with
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * its associated Handler.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the IBinder backing this Messenger.
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IBinder getBinder() {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTarget.asBinder();
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Comparison operator on two Messenger objects, such that true
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is returned then they both point to the same Handler.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean equals(Object otherObj) {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (otherObj == null) {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTarget.asBinder().equals(((Messenger)otherObj)
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .mTarget.asBinder());
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (ClassCastException e) {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int hashCode() {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTarget.asBinder().hashCode();
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeStrongBinder(mTarget.asBinder());
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<Messenger> CREATOR
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<Messenger>() {
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Messenger createFromParcel(Parcel in) {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder target = in.readStrongBinder();
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return target != null ? new Messenger(target) : null;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Messenger[] newArray(int size) {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Messenger[size];
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience function for writing either a Messenger or null pointer to
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a Parcel.  You must use this with {@link #readMessengerOrNullFromParcel}
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for later reading it.
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param messenger The Messenger to write, or null.
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param out Where to write the Messenger.
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void writeMessengerOrNullToParcel(Messenger messenger,
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel out) {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeStrongBinder(messenger != null ? messenger.mTarget.asBinder()
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : null);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience function for reading either a Messenger or null pointer from
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a Parcel.  You must have previously written the Messenger with
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #writeMessengerOrNullToParcel}.
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param in The Parcel containing the written Messenger.
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the Messenger read from the Parcel, or null if null had
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * been written.
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Messenger readMessengerOrNullFromParcel(Parcel in) {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IBinder b = in.readStrongBinder();
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return b != null ? new Messenger(b) : null;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a Messenger from a raw IBinder, which had previously been
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * retrieved with {@link #getBinder}.
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param target The IBinder this Messenger should communicate with.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Messenger(IBinder target) {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTarget = IMessenger.Stub.asInterface(target);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
149