blob: 5914739d8db63f5e56acabf06f2bc60a4dea54f7 [file] [log] [blame]
Dianne Hackborn8ea138c2010-01-26 18:01:04 -08001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.os;
18
Svet Ganov9c165d72015-12-01 19:52:26 -080019import android.annotation.NonNull;
20import android.annotation.Nullable;
Svet Ganovae0e03a2016-02-25 18:22:10 -080021import android.annotation.SystemApi;
Svet Ganov6b03aa72018-05-15 21:39:20 -070022import android.annotation.TestApi;
Svet Ganov9c165d72015-12-01 19:52:26 -080023
Dianne Hackborn8ea138c2010-01-26 18:01:04 -080024/**
Dianne Hackborn8ea138c2010-01-26 18:01:04 -080025 * @hide
26 */
Svet Ganovae0e03a2016-02-25 18:22:10 -080027@SystemApi
Svet Ganov6b03aa72018-05-15 21:39:20 -070028@TestApi
Svet Ganov9c165d72015-12-01 19:52:26 -080029public final class RemoteCallback implements Parcelable {
30
31 public interface OnResultListener {
32 public void onResult(Bundle result);
Dianne Hackborn8ea138c2010-01-26 18:01:04 -080033 }
Svet Ganov9c165d72015-12-01 19:52:26 -080034
35 private final OnResultListener mListener;
36 private final Handler mHandler;
37 private final IRemoteCallback mCallback;
38
39 public RemoteCallback(OnResultListener listener) {
40 this(listener, null);
Dianne Hackborn8ea138c2010-01-26 18:01:04 -080041 }
Svet Ganov9c165d72015-12-01 19:52:26 -080042
43 public RemoteCallback(@NonNull OnResultListener listener, @Nullable Handler handler) {
44 if (listener == null) {
45 throw new NullPointerException("listener cannot be null");
Dianne Hackborn8ea138c2010-01-26 18:01:04 -080046 }
Svet Ganov9c165d72015-12-01 19:52:26 -080047 mListener = listener;
Dianne Hackborn8ea138c2010-01-26 18:01:04 -080048 mHandler = handler;
Svet Ganov9c165d72015-12-01 19:52:26 -080049 mCallback = new IRemoteCallback.Stub() {
50 @Override
51 public void sendResult(Bundle data) {
52 RemoteCallback.this.sendResult(data);
53 }
54 };
Dianne Hackborn8ea138c2010-01-26 18:01:04 -080055 }
Svet Ganov9c165d72015-12-01 19:52:26 -080056
57 RemoteCallback(Parcel parcel) {
58 mListener = null;
Dianne Hackborn8ea138c2010-01-26 18:01:04 -080059 mHandler = null;
Svet Ganov9c165d72015-12-01 19:52:26 -080060 mCallback = IRemoteCallback.Stub.asInterface(
61 parcel.readStrongBinder());
Dianne Hackborn8ea138c2010-01-26 18:01:04 -080062 }
Svet Ganov9c165d72015-12-01 19:52:26 -080063
64 public void sendResult(@Nullable final Bundle result) {
65 // Do local dispatch
66 if (mListener != null) {
67 if (mHandler != null) {
68 mHandler.post(new Runnable() {
69 @Override
70 public void run() {
71 mListener.onResult(result);
72 }
73 });
74 } else {
75 mListener.onResult(result);
76 }
77 // Do remote dispatch
78 } else {
79 try {
80 mCallback.sendResult(result);
81 } catch (RemoteException e) {
82 /* ignore */
83 }
Dianne Hackborn8ea138c2010-01-26 18:01:04 -080084 }
Dianne Hackborn8ea138c2010-01-26 18:01:04 -080085 }
Svet Ganov9c165d72015-12-01 19:52:26 -080086
87 @Override
Dianne Hackborn8ea138c2010-01-26 18:01:04 -080088 public int describeContents() {
89 return 0;
90 }
91
Svet Ganov9c165d72015-12-01 19:52:26 -080092 @Override
93 public void writeToParcel(Parcel parcel, int flags) {
94 parcel.writeStrongBinder(mCallback.asBinder());
Dianne Hackborn8ea138c2010-01-26 18:01:04 -080095 }
96
97 public static final Parcelable.Creator<RemoteCallback> CREATOR
98 = new Parcelable.Creator<RemoteCallback>() {
Svet Ganov9c165d72015-12-01 19:52:26 -080099 public RemoteCallback createFromParcel(Parcel parcel) {
100 return new RemoteCallback(parcel);
Dianne Hackborn8ea138c2010-01-26 18:01:04 -0800101 }
102
103 public RemoteCallback[] newArray(int size) {
104 return new RemoteCallback[size];
105 }
106 };
107}