package vandy.mooc.view; import vandy.mooc.MVP; import vandy.mooc.R; import vandy.mooc.common.GenericActivity; import vandy.mooc.common.Utils; import vandy.mooc.presenter.ImageDownloadsPresenter; import android.graphics.Bitmap; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.ImageView; /** * This Activity allows a user to download a bitmap image from a * remote server using the following concurrency strategies from the * Android HaMeR and AsyncTask frameworks: * * . Download with Runnables (HaMeR framework) * . Download with Messages (HaMeR framework) * . Download with AsyncTask (AsyncTask framework) * * After the image is downloaded and converted into a Bitmap it is * displayed on the user's screen. * * This Activity plays the role of the "View" in the * Model-View-Presenter (MVP) pattern. It extends that * GenericActivity framework that automatically handles runtime * configuration changes of an ImageDownloadsPresenter object, which * plays the role of the "Presenter" in the MVP pattern. The * MPV.RequiredViewOps and MVP.ProvidedPresenterOps interfaces are * used to minimize dependencies between the View and Presenter * layers. */ public class ImageDownloadsActivity extends GenericActivity<MVP.RequiredViewOps, MVP.ProvidedPresenterOps, ImageDownloadsPresenter> implements MVP.RequiredViewOps { /** * Debug Tag for logging debug output to LogCat. */ protected final static String TAG = ImageDownloadsActivity.class.getSimpleName(); /** * User's selection of URL to download. */ private EditText mUrlEditText; /** * Image that will be displayed to the user. */ private ImageView mImageView; /** * Lifecycle hook method that initializes the Activity when it is * first created. * * @param savedInstanceState * Activity's previously frozen state, if there was one. */ public void onCreate(Bundle savedInstanceState) { // Perform first part of initializing the super class. super.onCreate(savedInstanceState); // Sets the content view specified in the main.xml file. setContentView(R.layout.image_downloads_activity); // Assign View fields. mUrlEditText = (EditText) findViewById(R.id.mUrlEditText); mImageView = (ImageView) findViewById(R.id.mImageView); // Perform second part of initializing the super class, // passing in the ImageDownloadsPresenter class to // instantiate/manage and "this" to provide // ImageDownloadsPresenter with the MVP.RequiredViewOps // instance. super.onCreate(ImageDownloadsPresenter.class, this); } /** * Called when a user clicks a button to download an image. * * @param view * Indicates the button pressed by the user. */ public void handleButtonClick(View view) { // Hide the keyboard. Utils.hideKeyboard(this, mUrlEditText.getWindowToken()); // Forward to the Presenter layer. getPresenter().handleButtonClick(view.getId(), getUrlString()); } /** * Display a downloaded bitmap image if it's non-null; otherwise, * it reports an error via a Toast that's displayed on the UI * Thread. This method can be called from either the UI Thread or * a background Thread. * * @param image * The bitmap image * @param completionCommand * Command whose run() hook method is called after the * image is displayed. */ public void displayBitmap(final Bitmap image, final Runnable completionCommand) { // If this method is run in the UI Thread then display the // image. if (Utils.runningOnUiThread()) { if (image == null) Utils.showToast(this, "image is corrupted," + " please check the requested URL."); else { // Display the image on the user's screen. mImageView.setImageBitmap(image); if (completionCommand != null) // Indicate we're done with this image. This call // runs in the UI Thread, so we don't need to // synchronize it. completionCommand.run(); } } // Otherwise, create a new Runnable command that's posted to // the UI Thread to display the image. else { runOnUiThread(new Runnable() { public void run() { // Display the downloaded image to the user. displayBitmap(image, completionCommand); }}); } } /** * Read the URL EditText and return the String it contains. * * @return String value in mUrlEditText */ public String getUrlString() { return mUrlEditText.getText().toString(); } }