* iOS clear notifications from a specific channel when clear push notification received * Android leave notifications until channel is read * use redux-connect currentChannelId in network indicator
136 lines
5.3 KiB
Java
136 lines
5.3 KiB
Java
package com.mattermost.rnbeta;
|
|
|
|
import android.app.Application;
|
|
import android.app.Notification;
|
|
import android.app.NotificationManager;
|
|
import android.content.Context;
|
|
import android.database.Cursor;
|
|
import android.media.Ringtone;
|
|
import android.media.RingtoneManager;
|
|
import android.os.Bundle;
|
|
import android.net.Uri;
|
|
import android.service.notification.StatusBarNotification;
|
|
|
|
import com.facebook.react.bridge.Arguments;
|
|
import com.facebook.react.bridge.NativeModule;
|
|
import com.facebook.react.bridge.ReactApplicationContext;
|
|
import com.facebook.react.bridge.ReactContext;
|
|
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
import com.facebook.react.bridge.ReactMethod;
|
|
import com.facebook.react.bridge.Promise;
|
|
import com.facebook.react.bridge.WritableArray;
|
|
import com.facebook.react.bridge.WritableMap;
|
|
|
|
public class NotificationPreferencesModule extends ReactContextBaseJavaModule {
|
|
private static NotificationPreferencesModule instance;
|
|
private final MainApplication mApplication;
|
|
private NotificationPreferences mNotificationPreference;
|
|
|
|
private NotificationPreferencesModule(MainApplication application, ReactApplicationContext reactContext) {
|
|
super(reactContext);
|
|
mApplication = application;
|
|
Context context = mApplication.getApplicationContext();
|
|
mNotificationPreference = NotificationPreferences.getInstance(context);
|
|
}
|
|
|
|
public static NotificationPreferencesModule getInstance(MainApplication application, ReactApplicationContext reactContext) {
|
|
if (instance == null) {
|
|
instance = new NotificationPreferencesModule(application, reactContext);
|
|
}
|
|
|
|
return instance;
|
|
}
|
|
|
|
public static NotificationPreferencesModule getInstance() {
|
|
return instance;
|
|
}
|
|
|
|
@Override
|
|
public String getName() {
|
|
return "NotificationPreferences";
|
|
}
|
|
|
|
@ReactMethod
|
|
public void getPreferences(final Promise promise) {
|
|
try {
|
|
Context context = mApplication.getApplicationContext();
|
|
RingtoneManager manager = new RingtoneManager(context);
|
|
manager.setType(RingtoneManager.TYPE_NOTIFICATION);
|
|
Cursor cursor = manager.getCursor();
|
|
|
|
WritableMap result = Arguments.createMap();
|
|
WritableArray sounds = Arguments.createArray();
|
|
while (cursor.moveToNext()) {
|
|
String notificationTitle = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX);
|
|
String notificationId = cursor.getString(RingtoneManager.ID_COLUMN_INDEX);
|
|
String notificationUri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX);
|
|
|
|
WritableMap map = Arguments.createMap();
|
|
map.putString("name", notificationTitle);
|
|
map.putString("uri", (notificationUri + "/" + notificationId));
|
|
sounds.pushMap(map);
|
|
}
|
|
|
|
Uri defaultUri = RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_NOTIFICATION);
|
|
if (defaultUri != null) {
|
|
result.putString("defaultUri", Uri.decode(defaultUri.toString()));
|
|
}
|
|
result.putString("selectedUri", mNotificationPreference.getNotificationSound());
|
|
result.putBoolean("shouldVibrate", mNotificationPreference.getShouldVibrate());
|
|
result.putBoolean("shouldBlink", mNotificationPreference.getShouldBlink());
|
|
result.putArray("sounds", sounds);
|
|
|
|
promise.resolve(result);
|
|
} catch (Exception e) {
|
|
promise.reject("no notification sounds found", e);
|
|
}
|
|
}
|
|
|
|
@ReactMethod
|
|
public void previewSound(String url) {
|
|
Context context = mApplication.getApplicationContext();
|
|
Uri uri = Uri.parse(url);
|
|
Ringtone r = RingtoneManager.getRingtone(context, uri);
|
|
r.play();
|
|
}
|
|
|
|
@ReactMethod
|
|
public void setNotificationSound(String soundUri) {
|
|
mNotificationPreference.setNotificationSound(soundUri);
|
|
}
|
|
|
|
@ReactMethod
|
|
public void setShouldVibrate(boolean vibrate) {
|
|
mNotificationPreference.setShouldVibrate(vibrate);
|
|
}
|
|
|
|
@ReactMethod
|
|
public void setShouldBlink(boolean blink) {
|
|
mNotificationPreference.setShouldBlink(blink);
|
|
}
|
|
|
|
@ReactMethod
|
|
public void getDeliveredNotifications(final Promise promise) {
|
|
Context context = mApplication.getApplicationContext();
|
|
final NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
|
StatusBarNotification[] statusBarNotifications = notificationManager.getActiveNotifications();
|
|
WritableArray result = Arguments.createArray();
|
|
for (StatusBarNotification sbn:statusBarNotifications) {
|
|
WritableMap map = Arguments.createMap();
|
|
Notification n = sbn.getNotification();
|
|
Bundle bundle = n.extras;
|
|
int identifier = sbn.getId();
|
|
String channelId = bundle.getString("channel_id");
|
|
map.putInt("identifier", identifier);
|
|
map.putString("channel_id", channelId);
|
|
result.pushMap(map);
|
|
}
|
|
promise.resolve(result);
|
|
}
|
|
|
|
@ReactMethod
|
|
public void removeDeliveredNotifications(int identifier, String channelId) {
|
|
Context context = mApplication.getApplicationContext();
|
|
CustomPushNotification.clearNotification(context, identifier, channelId);
|
|
}
|
|
}
|