Android Open Source - coursera-android-001 Downloader Task






From Project

Back to project page coursera-android-001.

License

The source code is released under:

MIT License

If you think the Android project coursera-android-001 listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package course.labs.notificationslab;
/*from w w w.  j  a v  a  2  s . co m*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URL;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.TextView;

public class DownloaderTask extends AsyncTask<String, Void, String[]> {

  private static final int SIM_NETWORK_DELAY = 5000;
  private static final String TAG = "Lab-Notifications";
  private final int MY_NOTIFICATION_ID = 11151990;
  private String mFeeds[] = new String[3];
  private MainActivity mParentActivity;
  private Context mApplicationContext;

  // Change this variable to false if you do not have a stable network
  // connection
  private static final boolean HAS_NETWORK_CONNECTION = true;

  // Raw feed file IDs used if you do not have a stable connection
  public static final int txtFeeds[] = { R.raw.tswift, R.raw.rblack,
      R.raw.lgaga };

  // Constructor
  public DownloaderTask(MainActivity parentActivity) {
    super();

    mParentActivity = parentActivity;
    mApplicationContext = parentActivity.getApplicationContext();

  }

  @Override
  protected String[] doInBackground(String... urlParameters) {
    log("Entered doInBackground()");

    return download(urlParameters);

  }

  private String[] download(String urlParameters[]) {

    boolean downloadCompleted = false;

    try {

      for (int idx = 0; idx < urlParameters.length; idx++) {

        URL url = new URL(urlParameters[idx]);
        try {
          Thread.sleep(SIM_NETWORK_DELAY);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }

        InputStream inputStream;
        BufferedReader in;

        // Alternative for students without
        // a network connection
        if (HAS_NETWORK_CONNECTION) {
          inputStream = url.openStream();
          in = new BufferedReader(new InputStreamReader(inputStream));
        } else {
          inputStream = mApplicationContext.getResources()
              .openRawResource(txtFeeds[idx]);
          in = new BufferedReader(new InputStreamReader(inputStream));
        }

        String readLine;
        StringBuffer buf = new StringBuffer();

        while ((readLine = in.readLine()) != null) {
          buf.append(readLine);
        }

        mFeeds[idx] = buf.toString();

        if (null != in) {
          in.close();
        }
      }

      downloadCompleted = true;

    } catch (IOException e) {
      e.printStackTrace();
    }

    log("Tweet Download Completed:" + downloadCompleted);

    notify(downloadCompleted);
    
    return mFeeds;

  }

  // Call back to the MainActivity to update the feed display

  @Override
  protected void onPostExecute(String[] result) {
    super.onPostExecute(result);

    if (mParentActivity != null) {
      mParentActivity.setRefreshed(result);
    }

  }

  // If necessary, notifies the user that the tweet downloads are complete.
  // Sends an ordered broadcast back to the BroadcastReceiver in MainActivity
  // to determine whether the notification is necessary.

  private void notify(final boolean success) {
    log("Entered notify()");

    final Intent restartMainActivtyIntent = new Intent(mApplicationContext,
        MainActivity.class);
    restartMainActivtyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    if (success) {

      // Save tweets to a file
      saveTweetsToFile();

    }

    // Sends an ordered broadcast to determine whether MainActivity is
    // active and in the foreground. Creates a new BroadcastReceiver
    // to receive a result indicating the state of MainActivity

    // The Action for this broadcast Intent is MainActivity.DATA_REFRESHED_ACTION
    // The result Activity.RESULT_OK, indicates that MainActivity is active and
    // in the foreground.

    mApplicationContext.sendOrderedBroadcast(
        new Intent(MainActivity.DATA_REFRESHED_ACTION), 
        null,
        new BroadcastReceiver() {

          final String failMsg = "Download has failed. Please retry Later.";
          final String successMsg = "Download completed successfully.";

          @Override
          public void onReceive(Context context, Intent intent) {

            log("Entered result receiver's onReceive() method");

            // Check whether the result code is RESULT_OK
            if (getResultCode() != Activity.RESULT_OK) {

              // If so, create a PendingIntent using the
              // restartMainActivityIntent and set its flags
              // to FLAG_UPDATE_CURRENT
              
              final PendingIntent pendingIntent = PendingIntent.getActivity(mApplicationContext, 0, restartMainActivtyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
              


              // Uses R.layout.custom_notification for the
              // layout of the notification View. The xml 
              // file is in res/layout/custom_notification.xml

              RemoteViews mContentView = new RemoteViews(
                  mApplicationContext.getPackageName(),
                  R.layout.custom_notification);

              // Set the notification View's text to
              // reflect whether or the download completed
              // successfully

                            if (success) {
                                mContentView.setTextViewText(MY_NOTIFICATION_ID, successMsg);
                            } else {
                                mContentView.setTextViewText(MY_NOTIFICATION_ID, failMsg);
                            }
              
              // Use the Notification.Builder class to
              // create the Notification. You will have to set
              // several pieces of information. You can use
              // android.R.drawable.stat_sys_warning
              // for the small icon. You should also setAutoCancel(true). 

              Notification notification = new Notification.Builder(mApplicationContext)
                                    .setSmallIcon(android.R.drawable.stat_sys_warning)
                                    .setAutoCancel(true)
                                    .setContentIntent(pendingIntent)
                                    .setContent(mContentView)
                                    .build();

              // Send the notification
                            NotificationManager mNotificationManager = (NotificationManager) mApplicationContext.getSystemService(Context.NOTIFICATION_SERVICE);
                            mNotificationManager.notify(MY_NOTIFICATION_ID, notification);
              
              log("Notification Area Notification sent");
            }
          }
        }, 
        null, 
        0,
        null, 
        null);
  }

  // Saves the tweets to a file
  private void saveTweetsToFile() {
    PrintWriter writer = null;
    try {
      FileOutputStream fos = mApplicationContext.openFileOutput(
          MainActivity.TWEET_FILENAME, Context.MODE_PRIVATE);
      writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
          fos)));

      for (String s : mFeeds) {
        writer.println(s);
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (null != writer) {
        writer.close();
      }
    }
  }

  // Simplified log output method
  private void log(String msg) {
    try {
      Thread.sleep(500);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    Log.i(TAG, msg);
  }

}




Java Source Code List

course.labs.GraphicsLab.BubbleActivity.java
course.labs.activitylab.ActivityOne.java
course.labs.activitylab.ActivityTwo.java
course.labs.contentproviderlab.MockLocationProvider.java
course.labs.contentproviderlab.PlaceDownloaderTask.java
course.labs.contentproviderlab.PlaceRecord.java
course.labs.contentproviderlab.PlaceViewActivity.java
course.labs.contentproviderlab.PlaceViewAdapter.java
course.labs.contentproviderlab.provider.PlaceBadgeContentProvider.java
course.labs.contentproviderlab.provider.PlaceBadgesContract.java
course.labs.contentproviderlab.provider.PlaceBadgesContract.java
course.labs.dangerousapp.DangerousActivity.java
course.labs.fragmentslab.FeedFragmentData.java
course.labs.fragmentslab.FeedFragment.java
course.labs.fragmentslab.FriendsFragment.java
course.labs.fragmentslab.MainActivity.java
course.labs.intentslab.ActivityLoaderActivity.java
course.labs.intentslab.ExplicitlyLoadedActivity.java
course.labs.intentslab.mybrowser.MyBrowserActivity.java
course.labs.locationlab.MockLocationProvider.java
course.labs.locationlab.PlaceDownloaderTask.java
course.labs.locationlab.PlaceRecord.java
course.labs.locationlab.PlaceViewActivity.java
course.labs.locationlab.PlaceViewAdapter.java
course.labs.notificationslab.DownloaderTask.java
course.labs.notificationslab.FeedFragment.java
course.labs.notificationslab.FriendsFragment.java
course.labs.notificationslab.MainActivity.java
course.labs.notificationslab.SelectionListener.java
course.labs.notificationslab.TestFrontEndActivity.java
course.labs.permissionslab.ActivityLoaderActivity.java
course.labs.permissionslab.BookmarksActivity.java
course.labs.permissionslab.GoToDangerousActivity.java
course.labs.todomanager.AddToDoActivity.java
course.labs.todomanager.ToDoItem.java
course.labs.todomanager.ToDoListAdapter.java
course.labs.todomanager.ToDoManagerActivity.java