From a8892ee884da203c60c47ba28810cf6707ffb02b Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 23 Sep 2019 23:55:57 +0200 Subject: [PATCH] Implement super hacky notifications --- .../messenger/MercuryImApplication.java | 10 ++++-- .../mercury_im/messenger/Notifications.java | 33 +++++++++++++++++++ .../messenger/di/module/AppModule.java | 7 ++++ app/src/main/res/menu/bottom_menu_main.xml | 2 +- app/src/main/res/values/strings.xml | 3 +- .../messenger/core/NotificationManager.java | 9 +++++ .../messenger/core/di/CenterModule.java | 5 +-- .../core/stores/PlainMessageStore.java | 13 +++++++- 8 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 core/src/main/java/org/mercury_im/messenger/core/NotificationManager.java diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index 3371907..501a412 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -13,6 +13,7 @@ import org.mercury_im.messenger.core.connection.MercuryConfiguration; import org.mercury_im.messenger.di.component.AppComponent; import org.mercury_im.messenger.di.component.DaggerAppComponent; import org.mercury_im.messenger.di.module.AppModule; +import org.mercury_im.messenger.persistence.pojo.Chat; import org.mercury_im.messenger.persistence.room.RoomModule; import org.mercury_im.messenger.persistence.room.RoomRepositoryModule; import org.mercury_im.messenger.service.XmppConnectionService; @@ -23,7 +24,7 @@ import java.util.concurrent.atomic.AtomicInteger; import javax.inject.Inject; -public class MercuryImApplication extends Application { +public class MercuryImApplication extends Application implements org.mercury_im.messenger.core.NotificationManager { public static final String TAG = "Mercury-IM"; @@ -110,11 +111,16 @@ public class MercuryImApplication extends Application { String mDescription = getResources().getString(R.string.channel_description_message); NotificationChannel messages = new NotificationChannel(Notifications.NOTIFICATION_CHANNEL__NEW_MESSAGE, - mName, NotificationManager.IMPORTANCE_HIGH); + mName, NotificationManager.IMPORTANCE_DEFAULT); messages.setDescription(mDescription); notificationManager.createNotificationChannel(messages); } + @Override + public int chatMessageReceived(Chat chat, String contactName, String body) { + return Notifications.chatMessageReceived(this, chat, contactName, body); + } + public AppComponent getAppComponent() { return appComponent; } diff --git a/app/src/main/java/org/mercury_im/messenger/Notifications.java b/app/src/main/java/org/mercury_im/messenger/Notifications.java index d525ce9..9064a02 100644 --- a/app/src/main/java/org/mercury_im/messenger/Notifications.java +++ b/app/src/main/java/org/mercury_im/messenger/Notifications.java @@ -1,5 +1,15 @@ package org.mercury_im.messenger; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; + +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; + +import org.mercury_im.messenger.persistence.pojo.Chat; +import org.mercury_im.messenger.ui.chat.ChatActivity; + public class Notifications { public static final String NOTIFICATION_CHANNEL__FOREGROUND_SERVICE = "foreground_service"; @@ -10,5 +20,28 @@ public class Notifications { // Notification IDs public static final int FOREGROUND_SERVICE_ID = 1; // must not be 0 + public static int chatMessageReceived(Context context, Chat chat, String contactName, String body) { + int id = (System.nanoTime() + " " + body).hashCode(); + + Intent tapAction = new Intent(context, ChatActivity.class); + tapAction.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + tapAction.putExtra("JID", chat.jid.toString()); + tapAction.putExtra("ACCOUNT", chat.accountId); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, tapAction, 0); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(context, + Notifications.NOTIFICATION_CHANNEL__NEW_MESSAGE); + builder.setContentTitle(context.getResources().getString(R.string.notification_title, contactName)); + builder.setContentText(body); + builder.setSmallIcon(R.drawable.ic_person_outline_black_24dp); + builder.setContentIntent(pendingIntent); + builder.setAutoCancel(true); + + NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context); + + notificationManagerCompat.notify(id, builder.build()); + + return id; + } } diff --git a/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java b/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java index 8fc2d95..c1dbe2b 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java +++ b/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java @@ -6,6 +6,7 @@ import dagger.Module; import dagger.Provides; import org.mercury_im.messenger.MercuryImApplication; +import org.mercury_im.messenger.core.NotificationManager; import org.mercury_im.messenger.core.di.CenterModule; import javax.inject.Singleton; @@ -24,4 +25,10 @@ public class AppModule { Application provideApplication() { return mApplication; } + + @Provides + @Singleton + NotificationManager providerNotificationManager() { + return mApplication; + } } diff --git a/app/src/main/res/menu/bottom_menu_main.xml b/app/src/main/res/menu/bottom_menu_main.xml index c62dc7a..8087ac5 100644 --- a/app/src/main/res/menu/bottom_menu_main.xml +++ b/app/src/main/res/menu/bottom_menu_main.xml @@ -6,7 +6,7 @@ android:icon="@drawable/ic_message_black_24dp" /> Add Reaction Details Chats - Contacts + Contact List Accounts Contacts Bookmarks + %1$s wrote: diff --git a/core/src/main/java/org/mercury_im/messenger/core/NotificationManager.java b/core/src/main/java/org/mercury_im/messenger/core/NotificationManager.java new file mode 100644 index 0000000..4c82e43 --- /dev/null +++ b/core/src/main/java/org/mercury_im/messenger/core/NotificationManager.java @@ -0,0 +1,9 @@ +package org.mercury_im.messenger.core; + +import org.mercury_im.messenger.persistence.pojo.Chat; + +public interface NotificationManager { + + int chatMessageReceived(Chat chat, String contactName, String body); + +} diff --git a/core/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java b/core/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java index d10669e..d7fd097 100644 --- a/core/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java +++ b/core/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java @@ -1,5 +1,6 @@ package org.mercury_im.messenger.core.di; +import org.mercury_im.messenger.core.NotificationManager; import org.mercury_im.messenger.core.centers.ConnectionCenter; import org.mercury_im.messenger.core.stores.EntityCapsStore; import org.mercury_im.messenger.core.stores.PlainMessageStore; @@ -30,8 +31,8 @@ public class CenterModule { @Singleton @Provides - static PlainMessageStore provideMessageStore(MessageRepository messageRepository) { - return new PlainMessageStore(messageRepository); + static PlainMessageStore provideMessageStore(MessageRepository messageRepository, NotificationManager notificationManager) { + return new PlainMessageStore(messageRepository, notificationManager); } } diff --git a/core/src/main/java/org/mercury_im/messenger/core/stores/PlainMessageStore.java b/core/src/main/java/org/mercury_im/messenger/core/stores/PlainMessageStore.java index da5941b..93bdb86 100644 --- a/core/src/main/java/org/mercury_im/messenger/core/stores/PlainMessageStore.java +++ b/core/src/main/java/org/mercury_im/messenger/core/stores/PlainMessageStore.java @@ -8,6 +8,7 @@ import org.jivesoftware.smackx.carbons.packet.CarbonExtension; import org.jivesoftware.smackx.delay.packet.DelayInformation; import org.jivesoftware.smackx.mam.MamManager; import org.jxmpp.jid.EntityBareJid; +import org.mercury_im.messenger.core.NotificationManager; import org.mercury_im.messenger.core.connection.MercuryConnection; import org.mercury_im.messenger.persistence.model.MessageModel; import org.mercury_im.messenger.persistence.repository.MessageRepository; @@ -29,14 +30,24 @@ public class PlainMessageStore { private final MessageRepository messageRepository; - public PlainMessageStore(MessageRepository messageRepository) { + private final NotificationManager notificationManager; + + public PlainMessageStore(MessageRepository messageRepository, NotificationManager notificationManager) { this.messageRepository = messageRepository; + this.notificationManager = notificationManager; } public void newIncomingMessage(long accountId, EntityBareJid from, Message message, Chat chat) { if (message.getBody() == null) { return; } + + org.mercury_im.messenger.persistence.pojo.Chat chatPojo = new org.mercury_im.messenger.persistence.pojo.Chat(); + chatPojo.jid = from; + chatPojo.accountId = accountId; + chatPojo.peerName = null; + notificationManager.chatMessageReceived(chatPojo, null, message.getBody()); + MessageModel messageModel = messageRepository.newMessageModel(); messageModel.setAccountId(accountId); messageModel.setFrom(chat.getXmppAddressOfChatPartner());