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