package vandy.mooc.presenter; import java.io.InputStream; import java.lang.ref.WeakReference; import vandy.mooc.MVP; import vandy.mooc.R; import vandy.mooc.common.GenericPresenter; import vandy.mooc.model.DownloadImageModel; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; /** * This class implements all the operations defined in the * DownloadImagePresenter. It implements the various Ops interfaces * so it can be created/managed by the GenericActivity framework. It * plays the role of the "Presenter" in the Model-View-Presenter * pattern. */ public class DownloadImagePresenter extends GenericPresenter<MVP.RequiredPresenterOps, MVP.ProvidedModelOps, DownloadImageModel> implements MVP.ProvidedPresenterOps, MVP.RequiredPresenterOps { /** * Debugging tag used by the Android logger. */ private final static String TAG = DownloadImagePresenter.class.getSimpleName(); /** * Used to enable garbage collection. */ private WeakReference<MVP.RequiredViewOps> mView; /** * Used to keep track of whether a call is already in progress. */ private boolean mCallInProgress; /** * Stores the current image to redisplay after a runtime * configuration change. */ private Bitmap mCurrentImage = null; /** * Stores the default image to display when the "reset image" * button is pushed. */ private Bitmap mDefaultImage = null; /** * Hook method called when a new instance of AcronymPresenter is * created. One time initialization code goes here, e.g., storing * a WeakReference to the View layer and initializing the Model * layer. * * @param view * A reference to the View layer. */ @Override public void onCreate(MVP.RequiredViewOps view) { // Set the WeakReference. mView = new WeakReference<>(view); // Extract the default image. final InputStream is = (InputStream) mView.get() .getActivityContext() .getResources() .openRawResource(R.drawable.default_image); // Decode an InputStream into a Bitmap that // stores the default image. mDefaultImage = BitmapFactory.decodeStream(is); // Invoke the special onCreate() method in GenericPresenter, // passing in the DownloadImageModel class to instantiate/manage and // "this" to provide DownloadImageModel with this // MVP.RequiredModelOps instance. super.onCreate(DownloadImageModel.class, this); } /** * Hook method dispatched by the GenericActivity framework to * initialize the ImagePresenter object after a runtime * configuration change. * * @param view The currently active ImagePresenter.View. */ @Override public void onConfigurationChange(MVP.RequiredViewOps view) { // Reset the mView WeakReference. mView = new WeakReference<>(view); // Set the default image. mView.get().displayImage(mCurrentImage); } /** * Hook method called to shutdown the Presenter layer. * * @param isChangeConfigurations * True if a runtime configuration triggered the onDestroy() call. */ @Override public void onDestroy(boolean isChangingConfigurations) { // Destroy the model. getModel().onDestroy(isChangingConfigurations); } /** * Initiate the asynchronous image download. */ public boolean downloadImageAsync(Uri uri) { if (mCallInProgress) return false; else { mCallInProgress = true; getModel().downloadImageAsync(uri); mCallInProgress = false; return true; } } /** * Initiate the synchronous image download. */ public boolean downloadImageSync(Uri uri) { if (mCallInProgress) return false; else { mCallInProgress = true; getModel().downloadImageSync(uri); mCallInProgress = false; return true; } } /** * Reset the image to the default. */ public void resetImage() { // Store the current image for subsequent use in case of a // runtime configuration change. mCurrentImage = mDefaultImage; // Set the default image. mView.get().displayImage(mDefaultImage); } /** * Forwards to the View layer to display an image. * * @param pathToImageFile * The path to the file where the image is stored. */ public void displayImage(Uri pathToImageFile) { // Convert the file into a bitmap image and store it for // subsequent use after a rotation. mCurrentImage = BitmapFactory.decodeFile(pathToImageFile.toString()); // Display the image to the user. mView.get().displayImage(mCurrentImage); } /** * Return the Activity context. */ @Override public Context getActivityContext() { return mView.get().getActivityContext(); } /** * Return the Application context. */ @Override public Context getApplicationContext() { return mView.get().getApplicationContext(); } }