package vandy.mooc.model; import java.lang.ref.WeakReference; import vandy.mooc.MVP; import vandy.mooc.model.datamodel.ReplyMessage; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; /** * This class defines the root of a hierachy for downloading images * via Bound or Started Services and plays the role of the * "Implementor" in the Bridge pattern. It extends Handler so that * its handleMessage() method can be dispatched when * DownloadImage*Service has downloaded the image. */ public abstract class ImageModelImpl extends Handler { /** * Debugging tag used by the Android logger. */ protected final static String TAG = ImageModelImpl.class.getSimpleName(); /** * Image-related operations. */ public static enum OperationType { /** * Download an image. */ DOWNLOAD_IMAGE } /** * A WeakReference used to access methods in the Presenter layer. * The WeakReference enables garbage collection. */ protected WeakReference<MVP.RequiredPresenterOps> mImagePresenter; /** * Hook method called when a new ImageModel instance is created. * One time initialization code goes here, e.g., storing a * WeakReference to the Presenter and initializing the Bound * Service. * * @param presenter * A reference to the Presenter layer. */ public void onCreate(MVP.RequiredPresenterOps presenter) { // Set the WeakReference. mImagePresenter = new WeakReference<>(presenter); // Bind to the Service. bindService(); } /** * Hook method called to shutdown the Model layer. * * @param isChangingConfigurations * True if a runtime configuration triggered the onDestroy() call. */ public void onDestroy(boolean isChangingConfigurations) { if (isChangingConfigurations) Log.d(TAG, "just a configuration change - unbindService() not called"); else // Unbind from the Services only if onDestroy() is not // triggered by a runtime configuration change. unbindService(); } /** * Start a download. 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. */ public abstract void startDownload(Uri url, Uri directoryPathname); /** * Initiate the protocol for binding the Services. */ protected void bindService() { // No-op by default. } /** * Initiate the protocol for unbinding the Services. */ protected void unbindService() { // No-op by default. } /** * Hook method dispatched in response to receiving the path to the * downloaded image file from a DownloadImages*Service. */ @Override public void handleMessage(Message message) { Log.d(TAG, "handleMessage() called back"); // Convert the Message into a ReplyMessage. final ReplyMessage replyMessage = ReplyMessage.makeReplyMessage(message); // Handle the results from the Service. mImagePresenter.get().onDownloadComplete (replyMessage); } }