package vandy.mooc.model; import vandy.mooc.common.Utils; import vandy.mooc.model.datamodel.RequestMessage; import vandy.mooc.model.services.DownloadImagesBoundService; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.net.Uri; import android.os.IBinder; import android.os.Messenger; import android.util.Log; /** * This class implements the image downloading operations using an * Android Bound Service. It plays the role of the "Concrete * Implementor" in the Bridge pattern. */ public class ImageModelImplBoundService extends ImageModelImpl { /** * Reference to the reply Messenger that's passed to the * DownloadImagesBoundService and used to return image results via * the Handler. */ private Messenger mReplyMessenger = null; /** * Reference to the request Messenger that's implemented in the * DownloadImagesBoundService and used to send request messages to * the Service. */ private Messenger mRequestMessengerRef = null; /** * Used to receive a reference to the RequestMessenger after * binding to the DownloadImagesBoundService using bindService(). */ private ServiceConnection mServiceConnection = new ServiceConnection() { /** * Called by the Android Binder framework after the * DownloadImagesBoundService is connected to convey the * result returned from onBind(). */ public void onServiceConnected(ComponentName className, IBinder binder) { Log.d(TAG, "onServiceConnected() " + className); // Create a new Messenger that encapsulates the // returned IBinder object and store it for later use // in mRequestMessengerRef. // TODO -- you fill in here. } /** * Called if the Service crashes and is no longer * available. The ServiceConnection will remain bound, * but the Service will not respond to any requests. */ public void onServiceDisconnected(ComponentName className) { Log.d(TAG, "onServiceDisconnected() " + className); // Reset the reference to the RequestMessenger to // null, thereby preventing send() calls until it's // reconnected. // TODO -- you fill in here. } }; /** * Constructor initializes the Reply Messenger. */ public ImageModelImplBoundService() { // Initialize the Reply Messenger. mReplyMessenger = new Messenger(this); } /** * Initiate the protocol for binding the Services. */ @Override protected void bindService() { Log.d(TAG, "calling ImageModelImplBoundService.bindService()"); if (mRequestMessengerRef == null) { // Create a new intent to the DownloadImagesBoundService // that can download an image from the URL given by the // user. // TODO - you fill in here. Log.d(TAG, "calling Context.bindService()"); // Bind to the Service associated with the Intent. // TODO -- you fill in here. } } /** * Initiate the protocol for unbinding the Services. */ @Override protected void unbindService() { Log.d(TAG, "calling ImageModelImplBoundService.unbindService()"); if (mRequestMessengerRef != null) { // Unbind from the Service. // TODO -- you fill in here. Log.d(TAG, "calling Context.unbindService()"); // Set this field to null to trigger a call to // bindService() next time bindService() is called. // TODO -- you fill in here. } } /** * Start a download. When the download finishes its results are * passed up to the Presentation layer via the * onDownloadComplete() method defined in RequiredPresenterOps. * This method plays the fole of the "Primitive Operation" * (a.k.a., "Abstract Hook Method") in the Template Method * pattern. * * @param url * URL of the image to download. * @param directoryPathname * Uri of the directory to store the downloaded image. */ @Override public void startDownload(Uri url, Uri directoryPathname) { if (mRequestMessengerRef == null) Utils.showToast(mImagePresenter.get().getActivityContext(), "Not bound to the service"); else { try { // Create a RequestMessage that indicates the // DownloadImagesBoundService should send the reply // back to ReplyHandler encapsulated by the Messenger. final RequestMessage requestMessage = RequestMessage.makeRequestMessage (OperationType.DOWNLOAD_IMAGE.ordinal(), url, directoryPathname, mReplyMessenger); Log.d(TAG, "sending a request message to DownloadImagesBoundService for " + url.toString()); // Send the request Message to the // DownloadImagesBoundService. // TODO -- you fill in here. } catch (Exception e) { e.printStackTrace(); } } } }