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