diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c141b46b..19a98cf1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -92,7 +92,17 @@ + android:exported="false" /> + + + + + + + \ No newline at end of file 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 8b8d395d..0f8825dc 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/base/BaseActivity.java @@ -39,9 +39,9 @@ import gr.thmmy.mthmmy.activities.downloads.DownloadsActivity; import gr.thmmy.mthmmy.activities.main.MainActivity; import gr.thmmy.mthmmy.activities.profile.ProfileActivity; import gr.thmmy.mthmmy.model.Bookmark; +import gr.thmmy.mthmmy.model.ThmmyFile; import gr.thmmy.mthmmy.services.DownloadService; import gr.thmmy.mthmmy.session.SessionManager; -import gr.thmmy.mthmmy.model.ThmmyFile; import okhttp3.OkHttpClient; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; @@ -50,8 +50,6 @@ import static gr.thmmy.mthmmy.activities.downloads.DownloadsActivity.BUNDLE_DOWN import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_PROFILE_URL; import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_THUMBNAIL_URL; import static gr.thmmy.mthmmy.activities.profile.ProfileActivity.BUNDLE_USERNAME; -import static gr.thmmy.mthmmy.services.DownloadService.ACTION_DOWNLOAD; -import static gr.thmmy.mthmmy.services.DownloadService.EXTRA_DOWNLOAD_URL; public abstract class BaseActivity extends AppCompatActivity { // Client & Cookies @@ -544,16 +542,13 @@ public abstract class BaseActivity extends AppCompatActivity { } - //----------------------------------DOWNLOAD------------------ + //----------------------------------DOWNLOAD---------------------- private ThmmyFile tempThmmyFile; public void launchDownloadService(ThmmyFile thmmyFile) { - if (checkPerms()) { - Intent i = new Intent(this, DownloadService.class); - i.setAction(ACTION_DOWNLOAD); - i.putExtra(EXTRA_DOWNLOAD_URL, thmmyFile.getFileUrl().toString()); - startService(i); - } else { + if (checkPerms()) + DownloadService.startActionDownload(this, thmmyFile.getFileUrl().toString()); + else { tempThmmyFile = thmmyFile; requestPerms(); } @@ -561,12 +556,9 @@ public abstract class BaseActivity extends AppCompatActivity { //Uses temp file - called after permission grant public void launchDownloadService() { - if (checkPerms()) { - Intent i = new Intent(this, DownloadService.class); - i.setAction(ACTION_DOWNLOAD); - i.putExtra(EXTRA_DOWNLOAD_URL, tempThmmyFile.getFileUrl().toString()); - startService(i); - } + if (checkPerms()) + DownloadService.startActionDownload(this, tempThmmyFile.getFileUrl().toString()); + } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/receiver/Receiver.java b/app/src/main/java/gr/thmmy/mthmmy/receiver/Receiver.java new file mode 100644 index 00000000..f6d47255 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/receiver/Receiver.java @@ -0,0 +1,49 @@ +package gr.thmmy.mthmmy.receiver; + +import android.app.Notification; +import android.app.NotificationManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.NotificationCompat; + +import gr.thmmy.mthmmy.R; + +import static gr.thmmy.mthmmy.services.DownloadService.ACTION_DOWNLOAD; +import static gr.thmmy.mthmmy.services.DownloadService.EXTRA_DOWNLOAD_ID; +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; + +public class Receiver extends BroadcastReceiver { + public Receiver() { + } + + @Override + public void onReceive(Context context, Intent intent) { + NotificationCompat.Builder builder = new NotificationCompat.Builder(context); + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + + if(intent.getAction().equals(ACTION_DOWNLOAD)) + { + Bundle extras = intent.getExtras(); + int id = extras.getInt(EXTRA_DOWNLOAD_ID); + String title = extras.getString(EXTRA_NOTIFICATION_TITLE); + String text =extras.getString(EXTRA_NOTIFICATION_TEXT); + String ticker =extras.getString(EXTRA_NOTIFICATION_TICKER); + + builder.setContentTitle(title) + .setContentText(text) + .setTicker(ticker) + .setAutoCancel(true) + .setSmallIcon(R.mipmap.ic_launcher) + ; + + 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 53bcb8c9..4b561820 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/services/DownloadService.java +++ b/app/src/main/java/gr/thmmy/mthmmy/services/DownloadService.java @@ -3,14 +3,16 @@ package gr.thmmy.mthmmy.services; import android.app.IntentService; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.os.Environment; -import android.provider.MediaStore; +import android.support.annotation.NonNull; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import gr.thmmy.mthmmy.base.BaseApplication; +import gr.thmmy.mthmmy.receiver.Receiver; import mthmmy.utils.Report; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -24,14 +26,38 @@ import okio.Okio; */ public class DownloadService extends IntentService { private static final String TAG = "DownloadService"; + private static int sDownloadId =0; + + private Receiver receiver; 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_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"; + + public DownloadService() { super("DownloadService"); } + @Override + public void onCreate() { + super.onCreate(); + final IntentFilter filter = new IntentFilter(DownloadService.ACTION_DOWNLOAD); + receiver = new Receiver(); + registerReceiver(receiver, filter); + + } + + @Override + public void onDestroy() { + super.onDestroy(); + this.unregisterReceiver(receiver); + } + /** * Starts this service to perform action Download with the given parameters. If * the service is already performing a task this action will be queued. @@ -63,6 +89,10 @@ public class DownloadService extends IntentService { private void handleActionDownload(String downloadLink) { OkHttpClient client = BaseApplication.getInstance().getClient(); BufferedSink sink = null; + String trueName = null; + int downloadId = sDownloadId; + sDownloadId++; + try { Request request = new Request.Builder().url(downloadLink).build(); Response response = client.newCall(request).execute(); @@ -103,13 +133,17 @@ public class DownloadService extends IntentService { file = new File(dirPath, String.format(nameFormat, i)); } - Report.v(TAG, "Start saving file " + file.getName()); + trueName = file.getName(); + + Report.v(TAG, "Started saving file " + trueName); + sendNotification("Started", trueName); sink = Okio.buffer(Okio.sink(file)); sink.writeAll(response.body().source()); sink.flush(); Report.i(TAG, "Download OK!"); + sendNotification("Completed", trueName); } else Report.e(TAG, "Response not a binary!"); @@ -117,10 +151,18 @@ public class DownloadService extends IntentService { catch (FileNotFoundException e){ Report.e(TAG, "FileNotFound", e); Report.i(TAG, "Download failed..."); + if(trueName!=null) + sendNotification("Failed", trueName); + else + sendNotification("Failed", "file"); } catch (IOException e){ Report.e(TAG, "IOException", e); Report.i(TAG, "Download failed..."); + if(trueName!=null) + sendNotification("Failed", trueName); + else + sendNotification("Failed", "file"); } finally { if (sink!= null) { try { @@ -132,4 +174,35 @@ public class DownloadService extends IntentService { } } + private void sendNotification(String type, @NonNull String fileName) + { + switch (type) { + case "Started": { + Intent intent = new Intent(ACTION_DOWNLOAD); + 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_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_NOTIFICATION_TITLE, "Download Failed"); + intent.putExtra(EXTRA_NOTIFICATION_TEXT, "\"" + fileName + "\" failed."); + intent.putExtra(EXTRA_NOTIFICATION_TICKER, "Download Failed"); + sendBroadcast(intent); + break; + } + } + + } + }