Subscription notifications implementation (#407)
* add notifications for unread subscriptions
This commit is contained in:
parent
ec928c943d
commit
2c56c78467
19 changed files with 389 additions and 68 deletions
src/main/java/io/lbry/browser/reactmodules
|
@ -1,13 +1,21 @@
|
|||
package io.lbry.browser.reactmodules;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.NotificationChannel;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Bitmap;
|
||||
import android.Manifest;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
import android.support.v4.content.FileProvider;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
import android.support.v4.app.NotificationManagerCompat;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
|
@ -18,14 +26,30 @@ import com.facebook.react.bridge.ReactApplicationContext;
|
|||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
|
||||
import com.squareup.picasso.Picasso;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
import io.lbry.browser.MainActivity;
|
||||
import io.lbry.browser.R;
|
||||
import io.lbry.browser.Utils;
|
||||
import io.lbry.browser.reactmodules.DownloadManagerModule;
|
||||
|
||||
public class UtilityModule extends ReactContextBaseJavaModule {
|
||||
private static final Map<String, Integer> activeNotifications = new HashMap<String, Integer>();
|
||||
|
||||
private static final String FILE_PROVIDER = "io.lbry.browser.fileprovider";
|
||||
|
||||
private static final String NOTIFICATION_CHANNEL_ID = "io.lbry.browser.SUBSCRIPTIONS_NOTIFICATION_CHANNEL";
|
||||
|
||||
public static final String ACTION_NOTIFICATION_PLAY = "io.lbry.browser.ACTION_NOTIFICATION_PLAY";
|
||||
|
||||
public static final String ACTION_NOTIFICATION_LATER = "io.lbry.browser.ACTION_NOTIFICATION_LATER";
|
||||
|
||||
private Context context;
|
||||
|
||||
public UtilityModule(ReactApplicationContext reactContext) {
|
||||
|
@ -172,6 +196,75 @@ public class UtilityModule extends ReactContextBaseJavaModule {
|
|||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void showNotificationForContent(final String uri, String title, String publisher, final String thumbnail, boolean isPlayable) {
|
||||
final NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
NotificationChannel channel = new NotificationChannel(
|
||||
NOTIFICATION_CHANNEL_ID, "LBRY Subscriptions", NotificationManager.IMPORTANCE_DEFAULT);
|
||||
channel.setDescription("LBRY subscription notifications");
|
||||
notificationManager.createNotificationChannel(channel);
|
||||
}
|
||||
|
||||
if (activeNotifications.containsKey(uri)) {
|
||||
// the notification for the specified uri is already present, don't try to create another one
|
||||
return;
|
||||
}
|
||||
|
||||
int id = 0;
|
||||
Random random = new Random();
|
||||
do {
|
||||
id = random.nextInt();
|
||||
} while (id < 100);
|
||||
final int notificationId = id;
|
||||
|
||||
String uriWithParam = String.format("%s?download=true", uri);
|
||||
Intent playIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(uriWithParam));
|
||||
playIntent.putExtra(MainActivity.SOURCE_NOTIFICATION_ID_KEY, notificationId);
|
||||
playIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||
PendingIntent playPendingIntent = PendingIntent.getActivity(context, 0, playIntent, PendingIntent.FLAG_CANCEL_CURRENT);
|
||||
|
||||
boolean hasThumbnail = false;
|
||||
final NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);
|
||||
builder.setAutoCancel(true)
|
||||
.setColor(ContextCompat.getColor(context, R.color.lbrygreen))
|
||||
.setContentIntent(DownloadManagerModule.getLaunchPendingIntent(uri, context))
|
||||
.setContentTitle(publisher)
|
||||
.setContentText(title)
|
||||
.setSmallIcon(R.drawable.ic_lbry)
|
||||
.addAction(android.R.drawable.ic_media_play, (isPlayable ? "Play" : "Open"), playPendingIntent);
|
||||
|
||||
activeNotifications.put(uri, notificationId);
|
||||
if (thumbnail != null) {
|
||||
// attempt to load the thumbnail Bitmap before displaying the notification
|
||||
final Uri thumbnailUri = Uri.parse(thumbnail);
|
||||
if (thumbnailUri != null) {
|
||||
hasThumbnail = true;
|
||||
(new AsyncTask<Void, Void, Bitmap>() {
|
||||
protected Bitmap doInBackground(Void... params) {
|
||||
try {
|
||||
return Picasso.get().load(thumbnailUri).get();
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
protected void onPostExecute(Bitmap result) {
|
||||
if (result != null) {
|
||||
builder.setLargeIcon(result)
|
||||
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(result).bigLargeIcon(null));
|
||||
}
|
||||
notificationManager.notify(notificationId, builder.build());
|
||||
}
|
||||
}).execute();
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasThumbnail) {
|
||||
notificationManager.notify(notificationId, builder.build());
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isEmulator() {
|
||||
String buildModel = Build.MODEL.toLowerCase();
|
||||
return (// Check FINGERPRINT
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue