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;
21ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganovimport android.annotation.SystemApi;
226b03aa76e9b9ced678a499df1ca0c8316aeb5e59Svet Ganovimport android.annotation.TestApi;
239c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
248ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn/**
258ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn * @hide
268ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn */
27ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov@SystemApi
286b03aa76e9b9ced678a499df1ca0c8316aeb5e59Svet Ganov@TestApi
299c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganovpublic final class RemoteCallback implements Parcelable {
309c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
319c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    public interface OnResultListener {
329c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        public void onResult(Bundle result);
338ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
349c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
359c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    private final OnResultListener mListener;
369c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    private final Handler mHandler;
379c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    private final IRemoteCallback mCallback;
389c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
399c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    public RemoteCallback(OnResultListener listener) {
409c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        this(listener, null);
418ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
429c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
439c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    public RemoteCallback(@NonNull OnResultListener listener, @Nullable Handler handler) {
449c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        if (listener == null) {
459c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            throw new NullPointerException("listener cannot be null");
468ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        }
479c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        mListener = listener;
488ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        mHandler = handler;
499c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        mCallback = new IRemoteCallback.Stub() {
509c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            @Override
519c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            public void sendResult(Bundle data) {
529c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                RemoteCallback.this.sendResult(data);
539c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            }
549c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        };
558ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
569c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
579c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    RemoteCallback(Parcel parcel) {
589c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        mListener = null;
598ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        mHandler = null;
609c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        mCallback = IRemoteCallback.Stub.asInterface(
619c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                parcel.readStrongBinder());
628ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
639c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
649c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    public void sendResult(@Nullable final Bundle result) {
659c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        // Do local dispatch
669c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        if (mListener != null) {
679c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            if (mHandler != null) {
689c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                mHandler.post(new Runnable() {
699c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                    @Override
709c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                    public void run() {
719c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                        mListener.onResult(result);
729c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                    }
739c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                });
749c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            } else {
759c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                mListener.onResult(result);
769c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            }
779c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        // Do remote dispatch
789c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        } else {
799c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            try {
809c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                mCallback.sendResult(result);
819c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            } catch (RemoteException e) {
829c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov                /* ignore */
839c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            }
848ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        }
858ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
869c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov
879c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    @Override
888ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    public int describeContents() {
898ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        return 0;
908ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
918ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
929c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    @Override
939c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov    public void writeToParcel(Parcel parcel, int flags) {
949c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        parcel.writeStrongBinder(mCallback.asBinder());
958ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    }
968ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
978ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    public static final Parcelable.Creator<RemoteCallback> CREATOR
988ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            = new Parcelable.Creator<RemoteCallback>() {
999c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov        public RemoteCallback createFromParcel(Parcel parcel) {
1009c165d76010d9f79f5cd71978742a335b6b8d1b4Svet Ganov            return new RemoteCallback(parcel);
1018ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        }
1028ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn
1038ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        public RemoteCallback[] newArray(int size) {
1048ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn            return new RemoteCallback[size];
1058ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn        }
1068ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn    };
1078ea138cbf12b140d43fd81f4f12fe1a9234f1f25Dianne Hackborn}
108