RemoteCallback.java revision 9c165d76010d9f79f5cd71978742a335b6b8d1b4
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
199c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganovimport android.annotation.NonNull;
209c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganovimport android.annotation.Nullable;
219c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
228ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn/**
238ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @hide
248ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn */
259c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganovpublic final class RemoteCallback implements Parcelable {
269c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
279c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    public interface OnResultListener {
289c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        public void onResult(Bundle result);
298ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
309c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
319c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    private final OnResultListener mListener;
329c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    private final Handler mHandler;
339c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    private final IRemoteCallback mCallback;
349c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
359c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    public RemoteCallback(OnResultListener listener) {
369c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        this(listener, null);
378ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
389c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
399c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    public RemoteCallback(@NonNull OnResultListener listener, @Nullable Handler handler) {
409c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        if (listener == null) {
419c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            throw new NullPointerException("listener cannot be null");
428ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        }
439c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        mListener = listener;
448ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        mHandler = handler;
459c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        mCallback = new IRemoteCallback.Stub() {
469c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            @Override
479c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            public void sendResult(Bundle data) {
489c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                RemoteCallback.this.sendResult(data);
499c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            }
509c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        };
518ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
529c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
539c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    RemoteCallback(Parcel parcel) {
549c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        mListener = null;
558ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        mHandler = null;
569c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        mCallback = IRemoteCallback.Stub.asInterface(
579c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                parcel.readStrongBinder());
588ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
599c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
609c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    public void sendResult(@Nullable final Bundle result) {
619c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        // Do local dispatch
629c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        if (mListener != null) {
639c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            if (mHandler != null) {
649c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                mHandler.post(new Runnable() {
659c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                    @Override
669c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                    public void run() {
679c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                        mListener.onResult(result);
689c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                    }
699c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                });
709c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            } else {
719c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                mListener.onResult(result);
729c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            }
739c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        // Do remote dispatch
749c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        } else {
759c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            try {
769c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                mCallback.sendResult(result);
779c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            } catch (RemoteException e) {
789c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                /* ignore */
799c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            }
808ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        }
818ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
829c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
839c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    @Override
848ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    public int describeContents() {
858ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return 0;
868ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
878ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
889c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    @Override
899c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    public void writeToParcel(Parcel parcel, int flags) {
909c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        parcel.writeStrongBinder(mCallback.asBinder());
918ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
928ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
938ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    public static final Parcelable.Creator<RemoteCallback> CREATOR
948ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            = new Parcelable.Creator<RemoteCallback>() {
959c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        public RemoteCallback createFromParcel(Parcel parcel) {
969c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            return new RemoteCallback(parcel);
978ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        }
988ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
998ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        public RemoteCallback[] newArray(int size) {
1008ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            return new RemoteCallback[size];
1018ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        }
1028ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    };
1038ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn}
104