package vandy.mooc.model.services; import vandy.mooc.common.DownloadUtils; import vandy.mooc.common.LifecycleLoggingService; import vandy.mooc.model.aidl.DownloadCall; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.IBinder; import android.os.RemoteException; /** * This class handles downloads using synchronous AIDL * interactions. The component that binds to this service should * receive an IBinder. This IBinder should be an instance of * DownloadCall, which extends IBinder. The component can then * interact with this service by making normal calls on the * DownloadCall object. Specifically, the component can ask this * service to download an image by calling downloadImage() on the * DownloadCall object, which will run synchronously in this service * until it finishes downloading and returns the file name of the * downloaded file as a String. * * AIDL is an example of the Broker Pattern, in which all interprocess * communication details are hidden behind the AIDL interfaces. */ public class DownloadBoundServiceSync extends LifecycleLoggingService { /** * Make an explicit Intent that will start this service when * passed to bindService(). * * @param context * The context of the calling component. */ public static Intent makeIntent(Context context) { // Create an explicit Intent and return it to the caller. return new Intent(context, DownloadBoundServiceSync.class); } /** * An implementation of the AIDL Interface DownloadCall. We * extend the Stub class, which implements DownloadCall, so that * Android can properly handle calls across process boundaries. * * This implementation plays the role of Invoker in the Broker * Pattern */ DownloadCall.Stub mDownloadCallImpl = new DownloadCall.Stub() { /** * Download the image at the given Uri and return a * pathname to the file on the Android file system. * * Use the methods defined in DownloadUtils for code * brevity. */ @Override public Uri downloadImage(Uri uri) throws RemoteException { // Download the file using the appropriate helper // method in DownloadUtils and then return the // pathname back to the client. return DownloadUtils.downloadFile (DownloadBoundServiceSync.this, uri); } }; /** * Called when a component calls bindService() with the proper * intent. Return the concrete implementation of DownloadCall * cast as an IBinder. */ @Override public IBinder onBind(Intent intent) { return mDownloadCallImpl; } }