diff --git a/Lab6_NotificationsLab/app/src/androidTest/java/course/labs/notificationslab/tests/NewFeedTest.java b/Lab6_NotificationsLab/app/src/androidTest/java/course/labs/notificationslab/tests/NewFeedTest.java index 28fa0307930edb1e403c93a521485603b81dc283..cf392a4f922d354118f61f2b928cb96bd49540f0 100644 --- a/Lab6_NotificationsLab/app/src/androidTest/java/course/labs/notificationslab/tests/NewFeedTest.java +++ b/Lab6_NotificationsLab/app/src/androidTest/java/course/labs/notificationslab/tests/NewFeedTest.java @@ -47,7 +47,9 @@ public class NewFeedTest extends // 'course.labs.threadslab.MainActivity' solo.waitForActivity(course.labs.notificationslab.MainActivity.class, shortDelay); - + String msg = getActivity().getString(course.labs.notificationslab.R.string.download_in_progress_string); + assertFalse("'" + msg + " ' is shown!", + solo.searchText(msg)); solo.waitForView(android.R.id.list); final View listView = solo.getView(android.R.id.list); diff --git a/Lab6_NotificationsLab/app/src/main/java/course/labs/notificationslab/DownloaderTaskFragment.java b/Lab6_NotificationsLab/app/src/main/java/course/labs/notificationslab/DownloaderTaskFragment.java index 5c93ba3659ba07dc888225e422c30706572089aa..7638438499cff8dd80b75a6c7faf4d2a291c5964 100644 --- a/Lab6_NotificationsLab/app/src/main/java/course/labs/notificationslab/DownloaderTaskFragment.java +++ b/Lab6_NotificationsLab/app/src/main/java/course/labs/notificationslab/DownloaderTaskFragment.java @@ -78,173 +78,181 @@ public class DownloaderTaskFragment extends Fragment { mCallback = null; } - // TODO: Implement an AsyncTask subclass called DownLoaderTask. - // This class must use the downloadTweets method and the methods called inside it(currently commented - // out). Ultimately, it must also pass newly available data back to - // the hosting Activity using the DownloadFinishedListener interface. - // public class DownloaderTask extends ... + public class DownloaderTask extends AsyncTask<Integer, Void, String[]> { + @Override + protected String[] doInBackground(Integer... resourceIDs) { + return downloadTweets(resourceIDs); + } - // TODO: Uncomment this helper method and put them inside the DownLoaderTask subclass // Simulates downloading Twitter data from the network -// private String[] downloadTweets(Integer resourceIDS[]) { -// final int simulatedDelay = 2000; -// String[] feeds = new String[resourceIDS.length]; -// boolean downLoadCompleted = false; -// -// try { -// for (int idx = 0; idx < resourceIDS.length; idx++) { -// InputStream inputStream; -// BufferedReader in; -// try { -// // Pretend downloading takes a long time -// Thread.sleep(simulatedDelay); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// -// inputStream = mContext.getResources().openRawResource( -// resourceIDS[idx]); -// in = new BufferedReader(new InputStreamReader(inputStream)); -// -// String readLine; -// StringBuffer buf = new StringBuffer(); -// -// while ((readLine = in.readLine()) != null) { -// buf.append(readLine); -// } -// -// feeds[idx] = buf.toString(); -// -// if (null != in) { -// in.close(); -// } -// } -// -// downLoadCompleted = true; -// saveTweetsToFile(feeds); -// -// } catch (IOException e) { -// e.printStackTrace(); -// } -// -// // Notify user that downloading has finished -// notify(downLoadCompleted); -// -// return feeds; -// -// } + private String[] downloadTweets(Integer resourceIDS[]) { + final int simulatedDelay = 2000; + String[] feeds = new String[resourceIDS.length]; + boolean downLoadCompleted = false; + + try { + for (int idx = 0; idx < resourceIDS.length; idx++) { + InputStream inputStream; + BufferedReader in; + try { + // Pretend downloading takes a long time + Thread.sleep(simulatedDelay); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + inputStream = mContext.getResources().openRawResource( + resourceIDS[idx]); + in = new BufferedReader(new InputStreamReader(inputStream)); + + String readLine; + StringBuffer buf = new StringBuffer(); + + while ((readLine = in.readLine()) != null) { + buf.append(readLine); + } + + feeds[idx] = buf.toString(); + + if (null != in) { + in.close(); + } + } + + downLoadCompleted = true; + saveTweetsToFile(feeds); + + } catch (IOException e) { + e.printStackTrace(); + } + + // Notify user that downloading has finished + notify(downLoadCompleted); + + return feeds; + + } // 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) { -// final Intent restartMainActivityIntent = new Intent(mContext, -// MainActivity.class); -// restartMainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); -// -// // 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, MainActivity.IS_ALIVE, indicates that MainActivity is -// // active and in the foreground. -// -// mContext.sendOrderedBroadcast(new Intent( -// MainActivity.DATA_REFRESHED_ACTION), null, -// new BroadcastReceiver() { -// -// final String failMsg = mContext -// .getString(R.string.download_failed_string); -// final String successMsg = mContext -// .getString(R.string.download_succes_string); -// final String notificationSentMsg = mContext -// .getString(R.string.notification_sent_string); -// -// @Override -// public void onReceive(Context context, Intent intent) { -// -// // TODO: Check whether or not the MainActivity -// // received the broadcast -// -// if () { -// -// // TODO: If not, create a PendingIntent using -// // the -// // restartMainActivityIntent and set its flags -// // to 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 -// -// -// -// // TODO: Set the notification View's text to -// // reflect whether the download completed -// // successfully (successMsg or failMsg) -// -// -// // 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). -// // To support API Level 26 implement the TODOs in createNotificationChannel -// createNotificationChannel(); -// -// -// // TODO: Send the notification -// -// Toast.makeText(mContext, notificationSentMsg, -// Toast.LENGTH_LONG).show(); -// -// } else { -// Toast.makeText(mContext, -// success ? successMsg : failMsg, -// Toast.LENGTH_LONG).show(); -// } -// } -// }, null, 0, null, null); -// } -// private String channelID = "my_channel_01"; -// -// private void createNotificationChannel() -// { -// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { -// // TODO: Create Notification Channel with id channelID, -// // name R.string.channel_name -// // and description R.string.channel_description of high importance -// -// } -// } -// // Saves the tweets to a file -// private void saveTweetsToFile(String[] result) { -// PrintWriter writer = null; -// try { -// FileOutputStream fos = mContext.openFileOutput( -// MainActivity.TWEET_FILENAME, Context.MODE_PRIVATE); -// writer = new PrintWriter(new BufferedWriter( -// new OutputStreamWriter(fos))); -// -// for (String s : result) { -// writer.println(s); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } finally { -// if (null != writer) { -// writer.close(); -// } -// } -// } + private void notify(final boolean success) { + final Intent restartMainActivityIntent = new Intent(mContext, + MainActivity.class); + restartMainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + // 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, MainActivity.IS_ALIVE, indicates that MainActivity is + // active and in the foreground. + + mContext.sendOrderedBroadcast(new Intent( + MainActivity.DATA_REFRESHED_ACTION), null, + new BroadcastReceiver() { + + final String failMsg = mContext + .getString(R.string.download_failed_string); + final String successMsg = mContext + .getString(R.string.download_succes_string); + final String notificationSentMsg = mContext + .getString(R.string.notification_sent_string); + + @Override + public void onReceive(Context context, Intent intent) { + + // TODO: Change the if condition (false) to Check whether or not the MainActivity + // received the broadcast + + if (false) { + + // TODO: If not, 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 + + + + // TODO: Set the notification View's text to + // reflect whether 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). + // To support API level 26, implement the TODOs in createNotificationChannel() + createNotificationChannel(); + + // TODO: Send the notification and create a toast with notificationSentMsg text + + } else { + Toast.makeText(mContext, + success ? successMsg : failMsg, + Toast.LENGTH_LONG).show(); + } + } + }, null, 0, null, null); + } + private String channelID = "my_channel_01"; + + private void createNotificationChannel() + { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + // TODO: Create Notification Channel with id channelID, + // name R.string.channel_name + // and description R.string.channel_description of high importance + + } + } + // Saves the tweets to a file + private void saveTweetsToFile(String[] result) { + PrintWriter writer = null; + try { + FileOutputStream fos = mContext.openFileOutput( + MainActivity.TWEET_FILENAME, Context.MODE_PRIVATE); + writer = new PrintWriter(new BufferedWriter( + new OutputStreamWriter(fos))); + + for (String s : result) { + writer.println(s); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (null != writer) { + writer.close(); + } + } + } + + // Pass newly available data back to hosting Activity + // using the DownloadFinishedListener interface + @Override + protected void onPostExecute(String[] result) { + super.onPostExecute(result); + + if (null != mCallback) { + mCallback.notifyDataRefreshed(result); + } + } + } } \ No newline at end of file