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