From 15af61c83a6d2cb30d823d30fad88fe260f5c914 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 16 Nov 2018 14:09:39 +0100 Subject: [PATCH] Added Reply button to incoming chat messages notifications --- CHANGELOG.md | 19 +- app/src/main/AndroidManifest.xml | 5 + .../java/org/linphone/LinphoneService.java | 26 ++- .../compatibility/ApiTwentyFourPlus.java | 97 +++++++++ .../compatibility/ApiTwentySixPlus.java | 198 ++++++++++-------- .../linphone/compatibility/Compatibility.java | 18 +- .../NotificationBroadcastReceiver.java | 76 +++++++ app/src/main/res/raw/assistant_create.rc | 3 +- app/src/main/res/values/strings.xml | 4 + 9 files changed, 340 insertions(+), 106 deletions(-) create mode 100644 app/src/main/java/org/linphone/compatibility/ApiTwentyFourPlus.java create mode 100644 app/src/main/java/org/linphone/receivers/NotificationBroadcastReceiver.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cc18bdd7..04b64d016 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,13 +16,22 @@ Group changes to describe their impact on the project, as follows: - feature: option to automatically download incoming files, either always, never or depending on their sizes. ## [4.1] - 2018-xx-xx + +### Improvements - Improved UI. +- Added adaptive icon for Android 8+. - Use of binary SDK hosted in Maven repository instead of having to build it manually. -- feature: added new end to end LIME encryption for instant messaging, both for single chat rooms and group ones. -- feature: send multiple files with text at the same time. -- feature: support of H265 codec. -- feature: use TextureView instead of GL2JNIView, easier to use and will fix issues. -- feature: send SMS to invite your friends in using Linphone. +- Asynchronous fetch of native contacts. +- Removed unused graphical resources. +- Updated translations. + +### Features +- Added new end to end LIME encryption for instant messaging, both for single chat rooms and group ones. +- Send multiple files with text at the same time. +- Support of H265 codec. +- Use TextureView instead of GL2JNIView, easier to use and will fix issues. +- Send SMS to invite your friends in using Linphone. +- Reply to received chat message in notification ## [4.0.1] - 2018-06-26 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d3c222e7e..e4fd0163f 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -293,5 +293,10 @@ + + diff --git a/app/src/main/java/org/linphone/LinphoneService.java b/app/src/main/java/org/linphone/LinphoneService.java index 62fa650c1..29425945c 100644 --- a/app/src/main/java/org/linphone/LinphoneService.java +++ b/app/src/main/java/org/linphone/LinphoneService.java @@ -653,7 +653,7 @@ public final class LinphoneService extends Service { } else { bm = BitmapFactory.decodeResource(getResources(), R.drawable.topbar_avatar); } - Notification notification = Compatibility.createMessageNotification(getApplicationContext(), notif.numberOfUnreadMessage, subject, + Notification notification = Compatibility.createMessageNotification(getApplicationContext(), notif.notificationId, notif.numberOfUnreadMessage, subject, getString(R.string.group_chat_notif).replace("%1", fromName).replace("%2", message), bm, notifContentIntent); notifyWrapper(notif.notificationId, notification); @@ -691,11 +691,24 @@ public final class LinphoneService extends Service { } else { bm = BitmapFactory.decodeResource(getResources(), R.drawable.topbar_avatar); } - Notification notification = Compatibility.createMessageNotification(getApplicationContext(), notif.numberOfUnreadMessage, fromName, message, bm, notifContentIntent); + Notification notification = Compatibility.createMessageNotification(getApplicationContext(), notif.notificationId, notif.numberOfUnreadMessage, fromName, message, bm, notifContentIntent); notifyWrapper(notif.notificationId, notification); } + public void sendNotification(Notification notif, int notificationId) { + notifyWrapper(notificationId, notif); + } + + public String getSipUriForNotificationId(int notificationId) { + for (String addr : mChatNotifMap.keySet()) { + if (mChatNotifMap.get(addr).notificationId == notificationId) { + return addr; + } + } + return null; + } + public void displayInappNotification(String message) { Intent notifIntent = new Intent(this, LinphoneActivity.class); notifIntent.putExtra("GoToInapp", true); @@ -706,15 +719,6 @@ public final class LinphoneService extends Service { notifyWrapper(NOTIF_ID, mNotif); } - public void displaySasNotification(String sas) { - mSasNotif = Compatibility.createSimpleNotification(getApplicationContext(), - getString(R.string.zrtp_notification_title), - sas + " " + getString(R.string.zrtp_notification_message), - null); - - notifyWrapper(SAS_NOTIF_ID, mSasNotif); - } - public void removeSasNotification() { mNM.cancel(SAS_NOTIF_ID); } diff --git a/app/src/main/java/org/linphone/compatibility/ApiTwentyFourPlus.java b/app/src/main/java/org/linphone/compatibility/ApiTwentyFourPlus.java new file mode 100644 index 000000000..b7b7dda75 --- /dev/null +++ b/app/src/main/java/org/linphone/compatibility/ApiTwentyFourPlus.java @@ -0,0 +1,97 @@ +package org.linphone.compatibility; + + +import android.annotation.TargetApi; +import android.app.FragmentTransaction; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.RemoteInput; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.view.ViewTreeObserver; + +import org.linphone.R; +import org.linphone.receivers.NotificationBroadcastReceiver; + +import static org.linphone.compatibility.Compatibility.INTENT_NOTIF_ID; +import static org.linphone.compatibility.Compatibility.KEY_TEXT_REPLY; + +/* +ApiTwentyFourPlus.java +Copyright (C) 2017 Belledonne Communications, Grenoble, France + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +@TargetApi(24) +public class ApiTwentyFourPlus { + + public static Notification createRepliedNotification(Context context, String reply) { + Notification repliedNotification = new Notification.Builder(context) + .setSmallIcon(R.drawable.topbar_chat_notification) + .setContentText(context.getString(R.string.notification_replied_label).replace("%s", reply)) + .build(); + + return repliedNotification; + } + + public static Notification createMessageNotification(Context context, int notificationId, int msgCount, String msgSender, String msg, Bitmap contactIcon, PendingIntent intent) { + String title; + if (msgCount == 1) { + title = msgSender; + } else { + title = context.getString(R.string.unread_messages).replace("%i", String.valueOf(msgCount)); + } + + String replyLabel = context.getResources().getString(R.string.notification_reply_label); + RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY).setLabel(replyLabel).build(); + + Intent replyIntent = new Intent(context, NotificationBroadcastReceiver.class); + replyIntent.setAction(context.getPackageName() + ".REPLY_ACTION"); + replyIntent.putExtra(INTENT_NOTIF_ID, notificationId); + + PendingIntent replyPendingIntent = PendingIntent.getBroadcast(context, + notificationId, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT); + + Notification.Action action = new Notification.Action.Builder(R.drawable.chat_send_over, + context.getString(R.string.notification_reply_label), replyPendingIntent) + .addRemoteInput(remoteInput) + .build(); + + Notification notif; + notif = new Notification.Builder(context) + .setContentTitle(title) + .setContentText(msg) + .setSmallIcon(R.drawable.topbar_chat_notification) + .setAutoCancel(true) + .setContentIntent(intent) + .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE) + .setLargeIcon(contactIcon) + .setCategory(Notification.CATEGORY_MESSAGE) + .setVisibility(Notification.VISIBILITY_PRIVATE) + .setPriority(Notification.PRIORITY_HIGH) + .setNumber(msgCount) + .setWhen(System.currentTimeMillis()) + .setShowWhen(true) + .setColor(context.getColor(R.color.notification_color_led)) + .addAction(action) + .build(); + + return notif; + } +} diff --git a/app/src/main/java/org/linphone/compatibility/ApiTwentySixPlus.java b/app/src/main/java/org/linphone/compatibility/ApiTwentySixPlus.java index 5b44115d1..eede346c8 100644 --- a/app/src/main/java/org/linphone/compatibility/ApiTwentySixPlus.java +++ b/app/src/main/java/org/linphone/compatibility/ApiTwentySixPlus.java @@ -7,6 +7,7 @@ import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; +import android.app.RemoteInput; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; @@ -14,9 +15,13 @@ import android.view.ViewTreeObserver; import org.linphone.R; import org.linphone.mediastream.Log; +import org.linphone.receivers.NotificationBroadcastReceiver; + +import static org.linphone.compatibility.Compatibility.INTENT_NOTIF_ID; +import static org.linphone.compatibility.Compatibility.KEY_TEXT_REPLY; /* -ApiTwentyOnePlus.java +ApiTwentySixPlus.java Copyright (C) 2017 Belledonne Communications, Grenoble, France This program is free software; you can redistribute it and/or @@ -36,6 +41,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @TargetApi(26) public class ApiTwentySixPlus { + public static Notification createRepliedNotification(Context context, String reply) { + Notification repliedNotification = new Notification.Builder(context, context.getString(R.string.notification_channel_id)) + .setSmallIcon(R.drawable.topbar_chat_notification) + .setContentText(context.getString(R.string.notification_replied_label).replace("%s", reply)) + .build(); + + return repliedNotification; + } public static void createServiceChannel(Context context) { NotificationManager notificationManager = @@ -68,9 +81,7 @@ public class ApiTwentySixPlus { notificationManager.createNotificationChannel(channel); } - public static Notification createMessageNotification(Context context, - int msgCount, String msgSender, String msg, Bitmap contactIcon, - PendingIntent intent) { + public static Notification createMessageNotification(Context context, int notificationId, int msgCount, String msgSender, String msg, Bitmap contactIcon, PendingIntent intent) { String title; if (msgCount == 1) { title = msgSender; @@ -78,24 +89,39 @@ public class ApiTwentySixPlus { title = context.getString(R.string.unread_messages).replace("%i", String.valueOf(msgCount)); } - Notification notif = null; + String replyLabel = context.getResources().getString(R.string.notification_reply_label); + RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY).setLabel(replyLabel).build(); + + Intent replyIntent = new Intent(context, NotificationBroadcastReceiver.class); + replyIntent.setAction(context.getPackageName() + ".REPLY_ACTION"); + replyIntent.putExtra(INTENT_NOTIF_ID, notificationId); + + PendingIntent replyPendingIntent = PendingIntent.getBroadcast(context, + notificationId, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT); + + Notification.Action action = new Notification.Action.Builder(R.drawable.chat_send_over, + context.getString(R.string.notification_reply_label), replyPendingIntent) + .addRemoteInput(remoteInput) + .build(); + + Notification notif; notif = new Notification.Builder(context, context.getString(R.string.notification_channel_id)) - .setContentTitle(title) - .setContentText(msg) - .setSmallIcon(R.drawable.topbar_chat_notification) - .setAutoCancel(true) - .setContentIntent(intent) - .setDefaults(Notification.DEFAULT_SOUND - | Notification.DEFAULT_VIBRATE) - .setLargeIcon(contactIcon) - .setCategory(Notification.CATEGORY_MESSAGE) - .setVisibility(Notification.VISIBILITY_PRIVATE) - .setPriority(Notification.PRIORITY_HIGH) - .setNumber(msgCount) - .setWhen(System.currentTimeMillis()) - .setShowWhen(true) - .setColor(context.getColor(R.color.notification_color_led)) - .build(); + .setContentTitle(title) + .setContentText(msg) + .setSmallIcon(R.drawable.topbar_chat_notification) + .setAutoCancel(true) + .setContentIntent(intent) + .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE) + .setLargeIcon(contactIcon) + .setCategory(Notification.CATEGORY_MESSAGE) + .setVisibility(Notification.VISIBILITY_PRIVATE) + .setPriority(Notification.PRIORITY_HIGH) + .setNumber(msgCount) + .setWhen(System.currentTimeMillis()) + .setShowWhen(true) + .setColor(context.getColor(R.color.notification_color_led)) + .addAction(action) + .build(); return notif; } @@ -105,19 +131,19 @@ public class ApiTwentySixPlus { String contactName, PendingIntent intent) { Notification notif = new Notification.Builder(context, context.getString(R.string.notification_service_channel_id)) - .setContentTitle(contactName) - .setContentText(msg) - .setSmallIcon(iconID) - .setAutoCancel(false) - .setContentIntent(intent) - .setLargeIcon(contactIcon) - .setCategory(Notification.CATEGORY_CALL) - .setVisibility(Notification.VISIBILITY_PUBLIC) - .setPriority(Notification.PRIORITY_HIGH) - .setWhen(System.currentTimeMillis()) - .setShowWhen(true) - .setColor(context.getColor(R.color.notification_color_led)) - .build(); + .setContentTitle(contactName) + .setContentText(msg) + .setSmallIcon(iconID) + .setAutoCancel(false) + .setContentIntent(intent) + .setLargeIcon(contactIcon) + .setCategory(Notification.CATEGORY_CALL) + .setVisibility(Notification.VISIBILITY_PUBLIC) + .setPriority(Notification.PRIORITY_HIGH) + .setWhen(System.currentTimeMillis()) + .setShowWhen(true) + .setColor(context.getColor(R.color.notification_color_led)) + .build(); return notif; } @@ -127,31 +153,31 @@ public class ApiTwentySixPlus { if (largeIcon != null) { notif = new Notification.Builder(context, context.getString(R.string.notification_service_channel_id)) - .setContentTitle(title) - .setContentText(message) - .setSmallIcon(icon, level) - .setLargeIcon(largeIcon) - .setContentIntent(intent) - .setCategory(Notification.CATEGORY_SERVICE) - .setVisibility(Notification.VISIBILITY_SECRET) - .setPriority(priority) - .setWhen(System.currentTimeMillis()) - .setShowWhen(true) - .setColor(context.getColor(R.color.notification_color_led)) - .build(); + .setContentTitle(title) + .setContentText(message) + .setSmallIcon(icon, level) + .setLargeIcon(largeIcon) + .setContentIntent(intent) + .setCategory(Notification.CATEGORY_SERVICE) + .setVisibility(Notification.VISIBILITY_SECRET) + .setPriority(priority) + .setWhen(System.currentTimeMillis()) + .setShowWhen(true) + .setColor(context.getColor(R.color.notification_color_led)) + .build(); } else { notif = new Notification.Builder(context, context.getString(R.string.notification_service_channel_id)) - .setContentTitle(title) - .setContentText(message) - .setSmallIcon(icon, level) - .setContentIntent(intent) - .setCategory(Notification.CATEGORY_SERVICE) - .setVisibility(Notification.VISIBILITY_SECRET) - .setPriority(priority) - .setWhen(System.currentTimeMillis()) - .setShowWhen(true) - .setColor(context.getColor(R.color.notification_color_led)) - .build(); + .setContentTitle(title) + .setContentText(message) + .setSmallIcon(icon, level) + .setContentIntent(intent) + .setCategory(Notification.CATEGORY_SERVICE) + .setVisibility(Notification.VISIBILITY_SECRET) + .setPriority(priority) + .setWhen(System.currentTimeMillis()) + .setShowWhen(true) + .setColor(context.getColor(R.color.notification_color_led)) + .build(); } return notif; @@ -163,41 +189,41 @@ public class ApiTwentySixPlus { public static Notification createMissedCallNotification(Context context, String title, String text, PendingIntent intent) { Notification notif = new Notification.Builder(context, context.getString(R.string.notification_channel_id)) - .setContentTitle(title) - .setContentText(text) - .setSmallIcon(R.drawable.call_status_missed) - .setAutoCancel(true) - .setContentIntent(intent) - .setDefaults(Notification.DEFAULT_SOUND - | Notification.DEFAULT_VIBRATE) - .setCategory(Notification.CATEGORY_MESSAGE) - .setVisibility(Notification.VISIBILITY_PRIVATE) - .setPriority(Notification.PRIORITY_HIGH) - .setWhen(System.currentTimeMillis()) - .setShowWhen(true) - .setColor(context.getColor(R.color.notification_color_led)) - .build(); + .setContentTitle(title) + .setContentText(text) + .setSmallIcon(R.drawable.call_status_missed) + .setAutoCancel(true) + .setContentIntent(intent) + .setDefaults(Notification.DEFAULT_SOUND + | Notification.DEFAULT_VIBRATE) + .setCategory(Notification.CATEGORY_MESSAGE) + .setVisibility(Notification.VISIBILITY_PRIVATE) + .setPriority(Notification.PRIORITY_HIGH) + .setWhen(System.currentTimeMillis()) + .setShowWhen(true) + .setColor(context.getColor(R.color.notification_color_led)) + .build(); return notif; } public static Notification createSimpleNotification(Context context, String title, String text, PendingIntent intent) { Notification notif = new Notification.Builder(context, context.getString(R.string.notification_channel_id)) - .setContentTitle(title) - .setContentText(text) - .setSmallIcon(R.drawable.linphone_logo) - .setAutoCancel(true) - .setContentIntent(intent) - .setDefaults(Notification.DEFAULT_SOUND - | Notification.DEFAULT_VIBRATE) - .setCategory(Notification.CATEGORY_MESSAGE) - .setVisibility(Notification.VISIBILITY_PRIVATE) - .setPriority(Notification.PRIORITY_HIGH) - .setWhen(System.currentTimeMillis()) - .setShowWhen(true) - .setColorized(true) - .setColor(context.getColor(R.color.notification_color_led)) - .build(); + .setContentTitle(title) + .setContentText(text) + .setSmallIcon(R.drawable.linphone_logo) + .setAutoCancel(true) + .setContentIntent(intent) + .setDefaults(Notification.DEFAULT_SOUND + | Notification.DEFAULT_VIBRATE) + .setCategory(Notification.CATEGORY_MESSAGE) + .setVisibility(Notification.VISIBILITY_PRIVATE) + .setPriority(Notification.PRIORITY_HIGH) + .setWhen(System.currentTimeMillis()) + .setShowWhen(true) + .setColorized(true) + .setColor(context.getColor(R.color.notification_color_led)) + .build(); return notif; } diff --git a/app/src/main/java/org/linphone/compatibility/Compatibility.java b/app/src/main/java/org/linphone/compatibility/Compatibility.java index 06c7bcc1f..7c86bb17e 100644 --- a/app/src/main/java/org/linphone/compatibility/Compatibility.java +++ b/app/src/main/java/org/linphone/compatibility/Compatibility.java @@ -37,6 +37,9 @@ import android.widget.TextView; import org.linphone.mediastream.Version; public class Compatibility { + public static final String KEY_TEXT_REPLY = "key_text_reply"; + public static final String INTENT_NOTIF_ID = "NOTIFICATION_ID"; + public static void createNotificationChannels(Context context) { if (Version.sdkAboveOrEqual(Version.API26_O_80)) { ApiTwentySixPlus.createServiceChannel(context); @@ -68,9 +71,11 @@ public class Compatibility { } } - public static Notification createMessageNotification(Context context, int msgCount, String msgSender, String msg, Bitmap contactIcon, PendingIntent intent) { + public static Notification createMessageNotification(Context context, int notificationId, int msgCount, String msgSender, String msg, Bitmap contactIcon, PendingIntent intent) { if (Version.sdkAboveOrEqual(Version.API26_O_80)) { - return ApiTwentySixPlus.createMessageNotification(context, msgCount, msgSender, msg, contactIcon, intent); + return ApiTwentySixPlus.createMessageNotification(context, notificationId, msgCount, msgSender, msg, contactIcon, intent); + } else if (Version.sdkAboveOrEqual(Version.API24_NOUGAT_70)) { + return ApiTwentyFourPlus.createMessageNotification(context, notificationId, msgCount, msgSender, msg, contactIcon, intent); } else if (Version.sdkAboveOrEqual(Version.API21_LOLLIPOP_50)) { return ApiTwentyOnePlus.createMessageNotification(context, msgCount, msgSender, msg, contactIcon, intent); } else if (Version.sdkAboveOrEqual(Version.API16_JELLY_BEAN_41)) { @@ -80,6 +85,15 @@ public class Compatibility { } } + public static Notification createRepliedNotification(Context context, String reply) { + if (Version.sdkAboveOrEqual(Version.API26_O_80)) { + return ApiTwentySixPlus.createRepliedNotification(context, reply); + } else if (Version.sdkAboveOrEqual(Version.API24_NOUGAT_70)) { + return ApiTwentyFourPlus.createRepliedNotification(context, reply); + } + return null; + } + public static Notification createInCallNotification(Context context, String title, String msg, int iconID, Bitmap contactIcon, String contactName, PendingIntent intent) { if (Version.sdkAboveOrEqual(Version.API26_O_80)) { return ApiTwentySixPlus.createInCallNotification(context, title, msg, iconID, contactIcon, contactName, intent); diff --git a/app/src/main/java/org/linphone/receivers/NotificationBroadcastReceiver.java b/app/src/main/java/org/linphone/receivers/NotificationBroadcastReceiver.java new file mode 100644 index 000000000..40c98c7fb --- /dev/null +++ b/app/src/main/java/org/linphone/receivers/NotificationBroadcastReceiver.java @@ -0,0 +1,76 @@ +package org.linphone.receivers; + +/* +NotificationBroadcastReceiver.java +Copyright (C) 2018 Belledonne Communications, Grenoble, France + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +import android.annotation.TargetApi; +import android.app.Notification; +import android.app.RemoteInput; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; + +import org.linphone.LinphoneManager; +import org.linphone.LinphoneService; +import org.linphone.compatibility.Compatibility; +import org.linphone.core.Address; +import org.linphone.core.ChatMessage; +import org.linphone.core.ChatRoom; +import org.linphone.core.Core; +import org.linphone.core.ProxyConfig; + +public class NotificationBroadcastReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + String reply = getMessageText(intent).toString(); + if (reply != null) { + Notification replied = Compatibility.createRepliedNotification(context, reply); + if (replied != null) { + int notifId = intent.getIntExtra(Compatibility.INTENT_NOTIF_ID, 0); + String remoteSipAddr = LinphoneService.instance().getSipUriForNotificationId(notifId); + + Core core = LinphoneManager.getLc(); + if (core == null) return; + ProxyConfig proxyConfig = core.getDefaultProxyConfig(); + if (proxyConfig == null) return; + Address localAddr = proxyConfig.getIdentityAddress(); + Address remoteAddr = core.interpretUrl(remoteSipAddr); + if (localAddr == null || remoteAddr == null) return; + ChatRoom room = core.findChatRoom(remoteAddr, localAddr); + if (room == null) return; + + room.markAsRead(); + ChatMessage msg = room.createMessage(reply); + msg.send(); + + LinphoneService.instance().sendNotification(replied, notifId); + } + } + } + + @TargetApi(20) + private CharSequence getMessageText(Intent intent) { + Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); + if (remoteInput != null) { + return remoteInput.getCharSequence(Compatibility.KEY_TEXT_REPLY); + } + return null; + } +} diff --git a/app/src/main/res/raw/assistant_create.rc b/app/src/main/res/raw/assistant_create.rc index 2627f3b5b..dc66e4efc 100644 --- a/app/src/main/res/raw/assistant_create.rc +++ b/app/src/main/res/raw/assistant_create.rc @@ -9,8 +9,7 @@ 180 31536000 sip:?@sip.linphone.org - <sip:sip-staging.linphone.org:5081;transport=tls> - <sip:sip-staging.linphone.org:5081;transport=tls> + <sip:sip.linphone.org;transport=tls> 1 nat_policy_default_values sip.linphone.org diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 04f4cf31e..45cba8ff4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,6 +15,10 @@ www.linphone.org linphone contacts + + Reply + Sent reply: %s + Username User-id (optional)