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