14df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project/*
24df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
34df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project *
44df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
54df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * you may not use this file except in compliance with the License.
64df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * You may obtain a copy of the License at
74df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project *
84df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
94df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project *
104df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
114df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
124df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * See the License for the specific language governing permissions and
144df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * limitations under the License.
154df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */
164df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
174df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectpackage android.os;
184df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
194df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectimport com.android.internal.os.IResultReceiver;
204df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
214df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project/**
224df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Generic interface for receiving a callback result from someone.  Use this
234df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * by creating a subclass and implement {@link #onReceiveResult}, which you can
244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * then pass to others and send through IPC, and receive results they
254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * supply with {@link #send}.
264df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */
274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectpublic class ResultReceiver implements Parcelable {
284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    final boolean mLocal;
294df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    final Handler mHandler;
304df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
314df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    IResultReceiver mReceiver;
324df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
334df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    class MyRunnable implements Runnable {
344df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        final int mResultCode;
354df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        final Bundle mResultData;
364df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
374df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        MyRunnable(int resultCode, Bundle resultData) {
384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mResultCode = resultCode;
394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mResultData = resultData;
404df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
414df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        public void run() {
434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            onReceiveResult(mResultCode, mResultData);
444df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    class MyResultReceiver extends IResultReceiver.Stub {
484df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        public void send(int resultCode, Bundle resultData) {
494df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (mHandler != null) {
504df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                mHandler.post(new MyRunnable(resultCode, resultData));
514df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            } else {
524df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                onReceiveResult(resultCode, resultData);
534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
544df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
554df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
564df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
574df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
584df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Create a new ResultReceive to receive results.  Your
594df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * {@link #onReceiveResult} method will be called from the thread running
604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * <var>handler</var> if given, or from an arbitrary thread if null.
614df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
624df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public ResultReceiver(Handler handler) {
634df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mLocal = true;
644df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mHandler = handler;
654df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
664df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
674df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
684df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Deliver a result to this receiver.  Will call {@link #onReceiveResult},
694df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * always asynchronously if the receiver has supplied a Handler in which
704df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * to dispatch the result.
714df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * @param resultCode Arbitrary result code to deliver, as defined by you.
724df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * @param resultData Any additional data provided by you.
734df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
744df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public void send(int resultCode, Bundle resultData) {
754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        if (mLocal) {
764df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (mHandler != null) {
774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                mHandler.post(new MyRunnable(resultCode, resultData));
784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            } else {
794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                onReceiveResult(resultCode, resultData);
804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
814df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            return;
824df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
834df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
844df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        if (mReceiver != null) {
854df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            try {
864df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                mReceiver.send(resultCode, resultData);
874df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            } catch (RemoteException e) {
884df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
894df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
904df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
914df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
924df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
934df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Override to receive results delivered to this object.
944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     *
954df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * @param resultCode Arbitrary result code delivered by the sender, as
964df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * defined by the sender.
974df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * @param resultData Any additional data provided by the sender.
984df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
994df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    protected void onReceiveResult(int resultCode, Bundle resultData) {
1004df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
1014df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public int describeContents() {
1034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        return 0;
1044df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
1054df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1064df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
1074df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        synchronized (this) {
1084df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (mReceiver == null) {
1094df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                mReceiver = new MyResultReceiver();
1104df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
1114df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            out.writeStrongBinder(mReceiver.asBinder());
1124df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
1134df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
1144df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1154df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    ResultReceiver(Parcel in) {
1164df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mLocal = false;
1174df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mHandler = null;
1184df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mReceiver = IResultReceiver.Stub.asInterface(in.readStrongBinder());
1194df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
1204df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1214df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final Parcelable.Creator<ResultReceiver> CREATOR
1224df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            = new Parcelable.Creator<ResultReceiver>() {
1234df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        public ResultReceiver createFromParcel(Parcel in) {
1244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            return new ResultReceiver(in);
1254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
1264df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        public ResultReceiver[] newArray(int size) {
1274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            return new ResultReceiver[size];
1284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
1294df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    };
1304df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project}
131