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.util.Log; 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 Java Thrads. After the image is downloaded and * converted into a Bitmap it is displayed on the user's screen. * * This implementation is buggy! */ public class BuggyDownloadsActivity extends LifecycleLoggingActivity { /** * Debug Tag for logging debug output to LogCat */ private final static String TAG = BuggyDownloadsActivity.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 superclass. 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 the "buggy1" button to * download/display an image. * * @param view * The "buggy1" button */ public void buggy1(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 buggy1() method"); try { // Download the image. final Bitmap image = downloadBitmap(url); // Display the downloaded image to the user. displayBitmap(image); } catch (Exception e) { Utils.showToast(this, "Exception " + e + " caught in buggy1()"); } finally { // Dismiss the progress dialog. dismissDialog(); } } /** * Called when a user clicks the "buggy2" button to download an * image. * * @param view * The "buggy2" button */ public void buggy2(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 Runnable() { @Override public void run() { try { // Download the image. final Bitmap image = downloadBitmap(url); // Display the downloaded image to the user. displayBitmap(image); } catch (final Exception e) { runOnUiThread(new Runnable() { @Override public void run() { Utils.showToast(BuggyDownloadsActivity.this, "Exception " + e + " caught in buggy1()"); } }); } finally { // Dismiss the progress dialog. dismissDialog(); } }}).start(); } /** * 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); } /** * 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(BuggyDownloadsActivity.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."); } /** * 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(); } }