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;
+ }
+ }
+
+ }
+
}