From c44f9d161ade1642da25ca4304d43dfd5bcef904 Mon Sep 17 00:00:00 2001 From: Ezerous Date: Sun, 22 Jan 2017 00:17:11 +0200 Subject: [PATCH] Downloads/ Notification changes --- .../mthmmy/activities/topic/TopicAdapter.java | 2 +- .../gr/thmmy/mthmmy/base/BaseActivity.java | 2 +- .../gr/thmmy/mthmmy/receiver/Receiver.java | 44 +++++++++++-- .../mthmmy/services/DownloadService.java | 61 ++++++++++--------- 4 files changed, 71 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java index 098410b6..b03b56e5 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java @@ -47,8 +47,8 @@ import mthmmy.utils.Report; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static gr.thmmy.mthmmy.activities.board.BoardActivity.BUNDLE_BOARD_TITLE; import static gr.thmmy.mthmmy.activities.board.BoardActivity.BUNDLE_BOARD_URL; -import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_URL; import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_THUMBNAIL_URL; +import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_URL; import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_USERNAME; import static gr.thmmy.mthmmy.activities.topic.TopicActivity.toQuoteList; diff --git a/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java b/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java index 4d54d808..501e2452 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java @@ -47,8 +47,8 @@ import okhttp3.OkHttpClient; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static gr.thmmy.mthmmy.activities.downloads.DownloadsActivity.BUNDLE_DOWNLOADS_TITLE; import static gr.thmmy.mthmmy.activities.downloads.DownloadsActivity.BUNDLE_DOWNLOADS_URL; -import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_URL; import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_THUMBNAIL_URL; +import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_URL; import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_USERNAME; public abstract class BaseActivity extends AppCompatActivity { diff --git a/app/src/main/java/gr/thmmy/mthmmy/receiver/Receiver.java b/app/src/main/java/gr/thmmy/mthmmy/receiver/Receiver.java index 33c15199..42a867ea 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/receiver/Receiver.java +++ b/app/src/main/java/gr/thmmy/mthmmy/receiver/Receiver.java @@ -2,23 +2,35 @@ package gr.thmmy.mthmmy.receiver; 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.net.Uri; import android.os.Bundle; import android.support.v7.app.NotificationCompat; +import android.webkit.MimeTypeMap; + +import java.io.File; import gr.thmmy.mthmmy.R; +import mthmmy.utils.Report; import static gr.thmmy.mthmmy.services.DownloadService.ACTION_DOWNLOAD; +import static gr.thmmy.mthmmy.services.DownloadService.COMPLETED; import static gr.thmmy.mthmmy.services.DownloadService.EXTRA_DOWNLOAD_ID; import static gr.thmmy.mthmmy.services.DownloadService.EXTRA_DOWNLOAD_STATE; +import static gr.thmmy.mthmmy.services.DownloadService.EXTRA_FILE_EXTENSION; +import static gr.thmmy.mthmmy.services.DownloadService.EXTRA_FILE_NAME; import static gr.thmmy.mthmmy.services.DownloadService.EXTRA_NOTIFICATION_TEXT; import static gr.thmmy.mthmmy.services.DownloadService.EXTRA_NOTIFICATION_TICKER; import static gr.thmmy.mthmmy.services.DownloadService.EXTRA_NOTIFICATION_TITLE; +import static gr.thmmy.mthmmy.services.DownloadService.SAVE_DIR; import static gr.thmmy.mthmmy.services.DownloadService.STARTED; public class Receiver extends BroadcastReceiver { + private static final String TAG = "BroadcastReceiver"; + public Receiver() { } @@ -27,14 +39,13 @@ public class Receiver extends BroadcastReceiver { NotificationCompat.Builder builder = new NotificationCompat.Builder(context); NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - if(intent.getAction().equals(ACTION_DOWNLOAD)) - { + if (intent.getAction().equals(ACTION_DOWNLOAD)) { Bundle extras = intent.getExtras(); int id = extras.getInt(EXTRA_DOWNLOAD_ID); String state = extras.getString(EXTRA_DOWNLOAD_STATE, "NONE"); String title = extras.getString(EXTRA_NOTIFICATION_TITLE); - String text =extras.getString(EXTRA_NOTIFICATION_TEXT); - String ticker =extras.getString(EXTRA_NOTIFICATION_TICKER); + String text = extras.getString(EXTRA_NOTIFICATION_TEXT); + String ticker = extras.getString(EXTRA_NOTIFICATION_TICKER); builder.setContentTitle(title) .setContentText(text) @@ -42,13 +53,34 @@ public class Receiver extends BroadcastReceiver { .setAutoCancel(true) //??? .setSmallIcon(R.mipmap.ic_launcher); - if(state.equals(STARTED)) + if (state.equals(STARTED)) builder.setOngoing(true); + else if (state.equals(COMPLETED)) { + String fileName = extras.getString(EXTRA_FILE_NAME, "NONE"); + String extension = extras.getString(EXTRA_FILE_EXTENSION, "extension"); + + File file = new File(SAVE_DIR, fileName); + if (file.exists()) { +// String type = "application/" + extension; + String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + + Uri pathUri = Uri.fromFile(file); + Intent chooserIntent = new Intent(Intent.ACTION_VIEW); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + Intent chooser = Intent.createChooser(chooserIntent, "Open With..."); + intent.setDataAndType(pathUri, type); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, chooser, PendingIntent.FLAG_CANCEL_CURRENT); + builder.setContentIntent(pendingIntent); + } + else + Report.w(TAG,"File doesn't exist."); + + + } Notification notification = builder.build(); notificationManager.notify(id, notification); } - } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/services/DownloadService.java b/app/src/main/java/gr/thmmy/mthmmy/services/DownloadService.java index b41a6ade..5eca8376 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/services/DownloadService.java +++ b/app/src/main/java/gr/thmmy/mthmmy/services/DownloadService.java @@ -30,11 +30,15 @@ public class DownloadService extends IntentService { private Receiver receiver; + public static final String SAVE_DIR = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "mthmmy"; + public static final String ACTION_DOWNLOAD = "gr.thmmy.mthmmy.services.action.DOWNLOAD"; public static final String EXTRA_DOWNLOAD_URL = "gr.thmmy.mthmmy.services.extra.DOWNLOAD_URL"; public static final String EXTRA_DOWNLOAD_ID = "gr.thmmy.mthmmy.services.extra.DOWNLOAD_ID"; public static final String EXTRA_DOWNLOAD_STATE = "gr.thmmy.mthmmy.services.extra.DOWNLOAD_STATE"; + public static final String EXTRA_FILE_NAME = "gr.thmmy.mthmmy.services.extra.FILE_NAME"; + public static final String EXTRA_FILE_EXTENSION = "gr.thmmy.mthmmy.services.extra.FILE_EXTENSION"; public static final String EXTRA_NOTIFICATION_TITLE = "gr.thmmy.mthmmy.services.extra.NOTIFICATION_TITLE"; public static final String EXTRA_NOTIFICATION_TEXT = "gr.thmmy.mthmmy.services.extra.NOTIFICATION_TEXT"; public static final String EXTRA_NOTIFICATION_TICKER = "gr.thmmy.mthmmy.services.extra.NOTIFICATION_TICKER"; @@ -95,7 +99,8 @@ public class DownloadService extends IntentService { private void handleActionDownload(String downloadLink) { OkHttpClient client = BaseApplication.getInstance().getClient(); BufferedSink sink = null; - String trueName = null; + String fileName = "file"; + String extension = "extension"; int downloadId = sDownloadId; sDownloadId++; @@ -106,9 +111,9 @@ public class DownloadService extends IntentService { String contentType = response.headers("Content-Type").toString(); //check if link provides a binary file if(contentType.equals("[application/octet-stream]")) { - String fileName = response.headers("Content-Disposition").toString().split("\"")[1]; + fileName = response.headers("Content-Disposition").toString().split("\"")[1]; - File dirPath = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "mthmmy"); + File dirPath = new File(SAVE_DIR); if(!dirPath.isDirectory()) { if(dirPath.mkdirs()) @@ -123,11 +128,15 @@ public class DownloadService extends IntentService { if(tokens.length!=2) { - Report.w(TAG, "Error getting file extension"); + Report.w(TAG, "Couldn't get file extension..."); nameFormat = fileName + "(%d)"; } else + { nameFormat = tokens[0] + "(%d)." + tokens[1]; + extension = tokens[1]; + } + File file = new File(dirPath, fileName); @@ -140,35 +149,29 @@ public class DownloadService extends IntentService { file = new File(dirPath, String.format(nameFormat, i)); } - trueName = file.getName(); + fileName = file.getName(); - Report.v(TAG, "Started saving file " + trueName); - sendNotification(downloadId, STARTED, trueName); + Report.v(TAG, "Started saving file " + fileName); + sendNotification(downloadId, STARTED, fileName, extension); sink = Okio.buffer(Okio.sink(file)); sink.writeAll(response.body().source()); sink.flush(); Report.i(TAG, "Download OK!"); - sendNotification(downloadId, COMPLETED, trueName); + sendNotification(downloadId, COMPLETED, fileName, extension); } else - Report.e(TAG, "Response not a binary!"); + Report.e(TAG, "Response not a binary file!"); } catch (FileNotFoundException e){ Report.e(TAG, "FileNotFound", e); Report.i(TAG, "Download failed..."); - if(trueName!=null) - sendNotification(downloadId, FAILED, trueName); - else - sendNotification(downloadId, FAILED, "file"); + sendNotification(downloadId, FAILED, fileName, extension); } catch (IOException e){ Report.e(TAG, "IOException", e); Report.i(TAG, "Download failed..."); - if(trueName!=null) - sendNotification(downloadId, FAILED, trueName); - else - sendNotification(downloadId, FAILED, "file"); + sendNotification(downloadId, FAILED, fileName, extension); } finally { if (sink!= null) { try { @@ -180,40 +183,38 @@ public class DownloadService extends IntentService { } } - private void sendNotification(int downloadId, String type, @NonNull String fileName) + private void sendNotification(int downloadId, String type, @NonNull String fileName, String fileExtension) { + Intent intent = new Intent(ACTION_DOWNLOAD); switch (type) { case STARTED: { - Intent intent = new Intent(ACTION_DOWNLOAD); - intent.putExtra(EXTRA_DOWNLOAD_ID, downloadId); - intent.putExtra(EXTRA_DOWNLOAD_STATE, STARTED); intent.putExtra(EXTRA_NOTIFICATION_TITLE, "Download Started"); intent.putExtra(EXTRA_NOTIFICATION_TEXT, "\"" + fileName + "\" downloading..."); intent.putExtra(EXTRA_NOTIFICATION_TICKER, "Downloading..."); - sendBroadcast(intent); break; } case COMPLETED: { - Intent intent = new Intent(ACTION_DOWNLOAD); - intent.putExtra(EXTRA_DOWNLOAD_ID, downloadId); - intent.putExtra(EXTRA_DOWNLOAD_STATE, COMPLETED); intent.putExtra(EXTRA_NOTIFICATION_TITLE, "Download Completed"); intent.putExtra(EXTRA_NOTIFICATION_TEXT, "\"" + fileName + "\" finished downloading."); intent.putExtra(EXTRA_NOTIFICATION_TICKER, "Download Completed"); - sendBroadcast(intent); break; } case FAILED: { - Intent intent = new Intent(ACTION_DOWNLOAD); - intent.putExtra(EXTRA_DOWNLOAD_ID, downloadId); - intent.putExtra(EXTRA_DOWNLOAD_STATE, FAILED); intent.putExtra(EXTRA_NOTIFICATION_TITLE, "Download Failed"); intent.putExtra(EXTRA_NOTIFICATION_TEXT, "\"" + fileName + "\" failed."); intent.putExtra(EXTRA_NOTIFICATION_TICKER, "Download Failed"); - sendBroadcast(intent); break; } + default:{ + Report.wtf(TAG, "Invalid notification case!"); + return; + } } + intent.putExtra(EXTRA_DOWNLOAD_ID, downloadId); + intent.putExtra(EXTRA_DOWNLOAD_STATE, type); + intent.putExtra(EXTRA_FILE_NAME, fileName); + intent.putExtra(EXTRA_FILE_EXTENSION, fileExtension); + sendBroadcast(intent); }