package vandy.mooc.view;
import vandy.mooc.R;
import vandy.mooc.common.LifecycleLoggingActivity;
import vandy.mooc.common.Utils;
import android.app.ProgressDialog;
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 implementation doesn't handle runtime configuration changes
* robustly. See the ImageDownloads example for a framework that
* handles these changes via the Model-View-Presenter (MVP) pattern.
*/
public class ImageDownloadsActivity
extends LifecycleLoggingActivity {
/**
* Debug Tag for logging debug output to LogCat
*/
private final static String TAG =
ImageDownloadsActivity.class.getSimpleName();
/**
* Default URL to download
*/
private final static String mDefaultUrl =
"http://www.dre.vanderbilt.edu/~schmidt/ka.png";
/**
* User's selection of URL to download
*/
private EditText mUrlEditText;
/**
* Image that's been downloaded
*/
private ImageView mImageView;
/**
* Display progress of download
*/
private ProgressDialog mProgressDialog;
/**
* 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) {
// Initialize the super class.
super.onCreate(savedInstanceState);
// Sets the content view specified in the
// image_downloads_activity.xml file.
setContentView(R.layout.image_downloads_activity);
// Caches references to the EditText and ImageView objects in
// data members to optimize subsequent access.
mUrlEditText = (EditText) findViewById(R.id.mUrlEditText);
mImageView = (ImageView) findViewById(R.id.mImageView);
}
/**
* Called when a user clicks a button to download/display an image
* with Runnables.
*
* @param view
* The "Run Runnable" button
*/
public void runRunnable(View view) {
// Obtain the requested URL from the user input.
final String url = getUrlString();
Utils.hideKeyboard(this,
mUrlEditText.getWindowToken());
// Inform the user that the download is starting.
showDialog("downloading via Handlers and Runnables");
// Create and start a new Thread to download an image in the
// background via a Runnable. The downloaded image is then
// diplayed in the UI Thread by posting another Runnable via
// the Activity's runOnUiThread() method, which uses an
// internal Handler.
new Thread(new DownloadWithRunnables(this,
url)).start();
}
/**
* Called when a user clicks a button to download an image with
* a Runnable and Messages.
*
* @param view
* The "Run Messages" button
*/
public void runMessages(View view) {
// Obtain the requested URL from the user input.
final String url = getUrlString();
Utils.hideKeyboard(this,
mUrlEditText.getWindowToken());
// Create and start a new Thread to download an image in the
// background and then use Messages and MessageHandler to
// cause it to be displayed in the UI Thread.
new Thread(new DownloadWithMessages(this,
url)).start();
}
/**
* Called when a user clicks a button to download an image with
* AsyncTask.
*
* @param view
* The "Run Async" button
*/
public void runAsyncTask(View view) {
// The the URL for the image to download.
final String url = getUrlString();
Utils.hideKeyboard(this,
mUrlEditText.getWindowToken());
// Execute the download using an AsyncTask.
new DownloadWithAsyncTask(this).execute(url);
}
/**
* Download a bitmap image from the URL provided by the user.
*
* @param url
* The url where a bitmap image is located
* @return the image bitmap or null if there was an error
*/
public Bitmap downloadBitmap(String url) {
// Use the default URL if the user doesn't supply one.
final String finalUrl = url.equals("") ? mDefaultUrl : url;
final Bitmap bitmap =
Utils.downloadAndDecodeImage(finalUrl);
if (bitmap == null)
// Post error reports to the UI Thread.
runOnUiThread(new Runnable() {
public void run() {
// Use a Toast to inform user that something
// has gone wrong.
Utils.showToast(ImageDownloadsActivity.this,
"Error downloading image,"
+ " please recheck URL "
+ finalUrl);
}
});
return bitmap;
}
/**
* Display a downloaded bitmap image if it's non-null; otherwise,
* it reports an error via a Toast.
*
* @param image
* The bitmap image
*/
void displayBitmap(Bitmap image) {
if (mImageView == null)
Utils.showToast(this,
"Problem with Application,"
+ " please contact the Developer.");
else if (image != null)
mImageView.setImageBitmap(image);
else
Utils.showToast(this,
"image is corrupted,"
+ " please check the requested URL.");
}
/**
* Called when a user clicks a button to reset an image to
* default.
*
* @param view
* The "Reset Image" button
*/
public void resetImage(View view) {
mImageView.setImageResource(R.drawable.default_image);
}
/**
* Read the URL EditText and return the String it contains.
*
* @return String value in mUrlEditText
*/
String getUrlString() {
return mUrlEditText.getText().toString();
}
/**
* Display the Dialog to the User.
*
* @param message
* The String to display what download method was used.
*/
public void showDialog(String message) {
mProgressDialog =
ProgressDialog.show(this,
"Download",
message);
}
/**
* Dismiss the Dialog.
*/
public void dismissDialog() {
if (mProgressDialog != null)
mProgressDialog.dismiss();
}
}