New Text Document

11
 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.InputStreamRead er; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.URL; import android.app.Activity; import android.app.Notificatio n; import android.app.Notificatio nManager; import android.app.PendingIntent; import android.content.Broadca stReceiver; 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.getApplic ationContext(); } @Override protected String[] doInBackground(String... urlParameters) { log("Entered doInBackground()"); return download(urlParameters); } private String[] download(String urlParameters[]) { boolean downloadCompleted = false;

description

g

Transcript of New Text Document

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 {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// connectionprivate static final boolean HAS_NETWORK_CONNECTION = true;// Raw feed file IDs used if you do not have a stable connectionpublic static final int txtFeeds[] = { R.raw.tswift, R.raw.rblack,R.raw.lgaga };// Constructorpublic DownloaderTask(MainActivity parentActivity) {super();mParentActivity = parentActivity;mApplicationContext = parentActivity.getApplicationContext();}@Overrideprotected 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 connectionif (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@Overrideprotected 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 filesaveTweetsToFile();}// 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.";@Overridepublic void onReceive(Context context, Intent intent) {log("Entered result receiver's onReceive() method");// TODO: Check whether the result code is RESULT_OKlog("getResultCode(): " + getResultCode());if (getResultCode() == Activity.RESULT_OK) {// TODO: If so, create a PendingIntent using the// restartMainActivityIntent and set its flags// to FLAG_UPDATE_CURRENTfinal PendingIntent pendingIntent = PendingIntent.getActivity(context,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.xmlRemoteViews mContentView = new RemoteViews(mApplicationContext.getPackageName(),R.layout.custom_notification);// TODO: Set the notification View's text to// reflect whether or the download completed// successfullymContentView.setTextViewText(R.id.text, "Download completed succesfully.");// 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 = new Notification.Builder(context).setSmallIcon(android.R.drawable.stat_sys_warning).setAutoCancel(true).setContentIntent(pendingIntent).setContent(mContentView);//.setTicker("tickerText");// TODO: Send the notificationNotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);notificationManager.notify(MY_NOTIFICATION_ID,notificationBuilder.build());log("Notification Area Notification sent");}}}, null, 0, null, null);}// Saves the tweets to a fileprivate 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 methodprivate void log(String msg) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}Log.i(TAG, msg);}}NotificationsLab/src/course/labs/notificationslab/MainActivity.javaKrzysztof Orzechowski on 8 Mar 2014 .0 contributors285 lines (215 sloc) 7.202 kb RawBlameHistory package course.labs.notificationslab;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStreamReader;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import android.app.Activity;import android.app.FragmentManager;import android.app.FragmentTransaction;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.util.Log;import android.widget.Toast;public class MainActivity extends Activity implements SelectionListener {public static final String TWEET_FILENAME = "tweets.txt";public static final String[] FRIENDS = { "taylorswift13", "msrebeccablack","ladygaga" };public static final String DATA_REFRESHED_ACTION = "course.labs.notificationslab.DATA_REFRESHED";private static final int NUM_FRIENDS = 3;private static final String URL_LGAGA = "https://d396qusza40orc.cloudfront.net/android%2FLabs%2FUserNotifications%2Fladygaga.txt";private static final String URL_RBLACK = "https://d396qusza40orc.cloudfront.net/android%2FLabs%2FUserNotifications%2Frebeccablack.txt";private static final String URL_TSWIFT = "https://d396qusza40orc.cloudfront.net/android%2FLabs%2FUserNotifications%2Ftaylorswift.txt";private static final String TAG = "Lab-Notifications";private static final long TWO_MIN = 2 * 60 * 1000;private static final int UNSELECTED = -1;private FragmentManager mFragmentManager;private FriendsFragment mFriendsFragment;private boolean mIsFresh;private BroadcastReceiver mRefreshReceiver;private int mFeedSelected = UNSELECTED;private FeedFragment mFeedFragment;private String[] mRawFeeds = new String[3];private String[] mProcessedFeeds = new String[3];@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mFragmentManager = getFragmentManager();addFriendsFragment();// The feed is fresh if it was downloaded less than 2 minutes agomIsFresh = (System.currentTimeMillis() - getFileStreamPath(TWEET_FILENAME).lastModified()) < TWO_MIN;ensureData();}// Add Friends Fragment to Activityprivate void addFriendsFragment() {mFriendsFragment = new FriendsFragment();mFriendsFragment.setArguments(getIntent().getExtras());FragmentTransaction transaction = mFragmentManager.beginTransaction();transaction.add(R.id.fragment_container, mFriendsFragment);transaction.commit();}// If stored Tweets are not fresh, reload them from network// Otherwise, load them from fileprivate void ensureData() {log("In ensureData(), mIsFresh:" + mIsFresh);if (!mIsFresh) {// TODO:// Show a Toast Notification to inform user that// the app is "Downloading Tweets from Network"Toast.makeText(getApplicationContext(),"Downloading Tweets from Network", Toast.LENGTH_LONG).show();log("Issuing Toast Message");// TODO:// Start new AsyncTask to download Tweets from networknew DownloaderTask(this).execute(URL_TSWIFT, URL_RBLACK, URL_LGAGA);// Set up a BroadcastReceiver to receive an Intent when download// finishes.mRefreshReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {log("BroadcastIntent received in MainActivity");// TODO:// Check to make sure this is an ordered broadcastif (isOrderedBroadcast()) {// Let sender know that the Intent was received// by setting result code to RESULT_OKsetResult(RESULT_OK, null, null);}}};} else {loadTweetsFromFile();parseJSON();updateFeed();}}// Called when new Tweets have been downloadedpublic void setRefreshed(String[] feeds) {mRawFeeds[0] = feeds[0];mRawFeeds[1] = feeds[1];mRawFeeds[2] = feeds[2];parseJSON();updateFeed();mIsFresh = true;};// Called when a Friend is clicked on@Overridepublic void onItemSelected(int position) {mFeedSelected = position;mFeedFragment = addFeedFragment();if (mIsFresh) {updateFeed();}}// Calls FeedFragement.update, passing in the// the tweets for the currently selected friendvoid updateFeed() {if (null != mFeedFragment)mFeedFragment.update(mProcessedFeeds[mFeedSelected]);}// Add FeedFragment to Activityprivate FeedFragment addFeedFragment() {FeedFragment feedFragment;feedFragment = new FeedFragment();FragmentTransaction transaction = mFragmentManager.beginTransaction();transaction.replace(R.id.fragment_container, feedFragment);transaction.addToBackStack(null);transaction.commit();mFragmentManager.executePendingTransactions();return feedFragment;}// Register the BroadcastReceiver@Overrideprotected void onResume() {super.onResume();log("Attempt to register broadcast receiver");// TODO:// Register the BroadcastReceiver to receive a// DATA_REFRESHED_ACTION broadcastthis.registerReceiver(mRefreshReceiver,new IntentFilter(DATA_REFRESHED_ACTION));log("After broadcast receiver registration");}@Overrideprotected void onPause() {// TODO:// Unregister the BroadcastReceiverif (mRefreshReceiver != null) {this.unregisterReceiver(mRefreshReceiver);}super.onPause();}// Convert raw Tweet data (in JSON format) into text for displaypublic void parseJSON() {JSONArray[] JSONFeeds = new JSONArray[NUM_FRIENDS];for (int i = 0; i < NUM_FRIENDS; i++) {try {JSONFeeds[i] = new JSONArray(mRawFeeds[i]);} catch (JSONException e) {e.printStackTrace();}String name = "";String tweet = "";JSONArray tmp = JSONFeeds[i];// string buffer for twitter feedsStringBuffer tweetRec = new StringBuffer("");for (int j = 0; j < tmp.length(); j++) {try {tweet = tmp.getJSONObject(j).getString("text");JSONObject user = (JSONObject) tmp.getJSONObject(j).get("user");name = user.getString("name");} catch (JSONException e) {e.printStackTrace();}tweetRec.append(name + " - " + tweet + "\n\n");}mProcessedFeeds[i] = tweetRec.toString();}}// Retrieve feeds text from a file// Store them in mRawTextFeed[]private void loadTweetsFromFile() {BufferedReader reader = null;try {FileInputStream fis = openFileInput(TWEET_FILENAME);reader = new BufferedReader(new InputStreamReader(fis));String s = null;int i = 0;while (null != (s = reader.readLine()) && i < NUM_FRIENDS) {mRawFeeds[i] = s;i++;}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (null != reader) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}}}// Simplified log output methodprivate void log(String msg) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}Log.i(TAG, msg);}}