18ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn/* 28ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project 38ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * 48ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 58ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * you may not use this file except in compliance with the License. 68ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * You may obtain a copy of the License at 78ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * 88ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 98ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * 108ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 118ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 128ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * See the License for the specific language governing permissions and 148ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * limitations under the License. 158ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn */ 168ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 178ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackbornpackage android.os; 188ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 198ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn/** 208ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * TODO: Make this a public API? Let's see how it goes with a few use 218ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * cases first. 228ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @hide 238ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn */ 248ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackbornpublic abstract class RemoteCallback implements Parcelable { 258ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn final Handler mHandler; 268ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn final IRemoteCallback mTarget; 278ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 288ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn class DeliverResult implements Runnable { 298ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn final Bundle mResult; 308ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 318ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn DeliverResult(Bundle result) { 328ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn mResult = result; 338ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 348ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 358ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public void run() { 368ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn onResult(mResult); 378ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 388ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 398ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 408ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn class LocalCallback extends IRemoteCallback.Stub { 418ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public void sendResult(Bundle bundle) { 428ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn mHandler.post(new DeliverResult(bundle)); 438ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 448ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 458ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 468ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn static class RemoteCallbackProxy extends RemoteCallback { 478ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn RemoteCallbackProxy(IRemoteCallback target) { 488ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn super(target); 498ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 508ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 518ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn protected void onResult(Bundle bundle) { 528ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 538ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 548ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 558ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public RemoteCallback(Handler handler) { 568ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn mHandler = handler; 578ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn mTarget = new LocalCallback(); 588ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 598ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 608ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn RemoteCallback(IRemoteCallback target) { 618ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn mHandler = null; 628ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn mTarget = target; 638ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 648ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 658ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public void sendResult(Bundle bundle) throws RemoteException { 668ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn mTarget.sendResult(bundle); 678ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 688ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 698ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn protected abstract void onResult(Bundle bundle); 708ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 718ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public boolean equals(Object otherObj) { 728ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn if (otherObj == null) { 738ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn return false; 748ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 758ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn try { 768ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn return mTarget.asBinder().equals(((RemoteCallback)otherObj) 778ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn .mTarget.asBinder()); 788ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } catch (ClassCastException e) { 798ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 808ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn return false; 818ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 828ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 838ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public int hashCode() { 848ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn return mTarget.asBinder().hashCode(); 858ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 868ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 878ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public int describeContents() { 888ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn return 0; 898ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 908ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 918ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public void writeToParcel(Parcel out, int flags) { 928ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn out.writeStrongBinder(mTarget.asBinder()); 938ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 948ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 958ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public static final Parcelable.Creator<RemoteCallback> CREATOR 968ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn = new Parcelable.Creator<RemoteCallback>() { 978ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public RemoteCallback createFromParcel(Parcel in) { 988ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn IBinder target = in.readStrongBinder(); 998ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn return target != null ? new RemoteCallbackProxy( 1008ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn IRemoteCallback.Stub.asInterface(target)) : null; 1018ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 1028ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn 1038ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn public RemoteCallback[] newArray(int size) { 1048ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn return new RemoteCallback[size]; 1058ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn } 1068ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn }; 1078ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn} 108