diff options
Diffstat (limited to 'Android/06-Notifications/Notifications/src/course/labs/notificationslab/DownloaderTask.java')
-rw-r--r-- | Android/06-Notifications/Notifications/src/course/labs/notificationslab/DownloaderTask.java | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/Android/06-Notifications/Notifications/src/course/labs/notificationslab/DownloaderTask.java b/Android/06-Notifications/Notifications/src/course/labs/notificationslab/DownloaderTask.java new file mode 100644 index 0000000..b792b38 --- /dev/null +++ b/Android/06-Notifications/Notifications/src/course/labs/notificationslab/DownloaderTask.java @@ -0,0 +1,217 @@ +package course.labs.notificationslab; + +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; + +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"); + + // TODO: Check whether the result code is RESULT_OK + + if (/*change this*/ true) { + + // TODO: If so, create a PendingIntent using the + // restartMainActivityIntent and set its flags + // to FLAG_UPDATE_CURRENT + + final PendingIntent pendingIntent = null; + + // 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); + + // TODO: Set the notification View's text to + // reflect whether or the download completed + // successfully + + // TODO: 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.Builder notificationBuilder = null; + + // TODO: Send the 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); + } +} |