1 /* 2 * Copyright (C) 2018 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 17 package com.android.internal.telephony.uicc.euicc.async; 18 19 import android.os.AsyncResult; 20 import android.os.Handler; 21 import android.os.Message; 22 23 /** 24 * This class wraps an invocation to an asynchronous method using {@link Message} to be working with 25 * {@link AsyncResultCallback}. With this class, you can use callbacks instead of managing a state 26 * machine to complete a task relying on multiple asynchronous method calls. 27 * 28 * <p>Subclasses should override the abstract methods to invoke the actual asynchronous method and 29 * parse the returned result. 30 * 31 * @param <Request> Class of the request data. 32 * @param <Response> Class of the response data. 33 * 34 * @hide 35 */ 36 public abstract class AsyncMessageInvocation<Request, Response> implements Handler.Callback { 37 /** 38 * Executes an invocation. 39 * 40 * @param request The request to be sent with the invocation. 41 * @param resultCallback Will be called after result is returned. 42 * @param handler The handler that {@code resultCallback} will be executed on. 43 */ invoke( Request request, AsyncResultCallback<Response> resultCallback, Handler handler)44 public final void invoke( 45 Request request, AsyncResultCallback<Response> resultCallback, Handler handler) { 46 Handler h = new Handler(handler.getLooper(), this); 47 sendRequestMessage(request, h.obtainMessage(0, resultCallback)); 48 } 49 50 @SuppressWarnings("unchecked") 51 @Override handleMessage(Message msg)52 public boolean handleMessage(Message msg) { 53 AsyncResult result = (AsyncResult) msg.obj; 54 AsyncResultCallback<Response> resultCallback = 55 (AsyncResultCallback<Response>) result.userObj; 56 try { 57 resultCallback.onResult(parseResult(result)); 58 } catch (Throwable t) { 59 resultCallback.onException(t); 60 } 61 return true; 62 } 63 64 /** 65 * Calls the asynchronous method with the given {@code msg}. The implementation should convert 66 * the given {@code request} to the parameters of the asynchronous method. 67 */ sendRequestMessage(Request request, Message msg)68 protected abstract void sendRequestMessage(Request request, Message msg); 69 70 /** Parses the asynchronous result returned by the method to a {@link Response}. */ parseResult(AsyncResult result)71 protected abstract Response parseResult(AsyncResult result) throws Throwable; 72 } 73