Added mark as read notification action for chat messages + refactoring

This commit is contained in:
Sylvain Berfini 2018-12-12 14:29:32 +01:00
parent 0e504d2a20
commit 15053ace61
7 changed files with 150 additions and 168 deletions

View file

@ -20,53 +20,22 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import static org.linphone.compatibility.Compatibility.CHAT_NOTIFICATIONS_GROUP;
import static org.linphone.compatibility.Compatibility.INTENT_LOCAL_IDENTITY;
import static org.linphone.compatibility.Compatibility.INTENT_NOTIF_ID;
import static org.linphone.compatibility.Compatibility.INTENT_REPLY_NOTIF_ACTION;
import static org.linphone.compatibility.Compatibility.KEY_TEXT_REPLY;
import android.annotation.TargetApi;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Person;
import android.app.RemoteInput;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.Icon;
import org.linphone.R;
import org.linphone.notifications.Notifiable;
import org.linphone.notifications.NotifiableMessage;
import org.linphone.notifications.NotificationBroadcastReceiver;
@TargetApi(28)
class ApiTwentyEightPlus {
public static Notification createMessageNotification(
Context context, Notifiable notif, Bitmap contactIcon, PendingIntent intent) {
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(INTENT_REPLY_NOTIF_ACTION);
replyIntent.putExtra(INTENT_NOTIF_ID, notif.getNotificationId());
replyIntent.putExtra(INTENT_LOCAL_IDENTITY, notif.getLocalIdentity());
PendingIntent replyPendingIntent =
PendingIntent.getBroadcast(
context,
notif.getNotificationId(),
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)
.setAllowGeneratedReplies(true)
.build();
Person me = new Person.Builder().setName(notif.getMyself()).build();
Notification.MessagingStyle style = new Notification.MessagingStyle(me);
@ -105,7 +74,8 @@ class ApiTwentyEightPlus {
.setShowWhen(true)
.setColor(context.getColor(R.color.notification_color_led))
.setStyle(style)
.addAction(action)
.addAction(ApiTwentyFourPlus.getReplyMessageAction(context, notif))
.addAction(ApiTwentyFourPlus.getMarkMessageAsReadAction(context, notif))
.build();
}
}

View file

@ -23,6 +23,7 @@ import static org.linphone.compatibility.Compatibility.CHAT_NOTIFICATIONS_GROUP;
import static org.linphone.compatibility.Compatibility.INTENT_ANSWER_CALL_NOTIF_ACTION;
import static org.linphone.compatibility.Compatibility.INTENT_HANGUP_CALL_NOTIF_ACTION;
import static org.linphone.compatibility.Compatibility.INTENT_LOCAL_IDENTITY;
import static org.linphone.compatibility.Compatibility.INTENT_MARK_AS_READ_ACTION;
import static org.linphone.compatibility.Compatibility.INTENT_NOTIF_ID;
import static org.linphone.compatibility.Compatibility.INTENT_REPLY_NOTIF_ACTION;
import static org.linphone.compatibility.Compatibility.KEY_TEXT_REPLY;
@ -52,30 +53,6 @@ class ApiTwentyFourPlus {
public static Notification createMessageNotification(
Context context, Notifiable notif, Bitmap contactIcon, PendingIntent intent) {
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(INTENT_REPLY_NOTIF_ACTION);
replyIntent.putExtra(INTENT_NOTIF_ID, notif.getNotificationId());
replyIntent.putExtra(INTENT_LOCAL_IDENTITY, notif.getLocalIdentity());
PendingIntent replyPendingIntent =
PendingIntent.getBroadcast(
context,
notif.getNotificationId(),
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)
.setAllowGeneratedReplies(true)
.build();
Notification.MessagingStyle style = new Notification.MessagingStyle(notif.getMyself());
for (NotifiableMessage message : notif.getMessages()) {
@ -108,7 +85,8 @@ class ApiTwentyFourPlus {
.setShowWhen(true)
.setColor(context.getColor(R.color.notification_color_led))
.setStyle(style)
.addAction(action)
.addAction(getReplyMessageAction(context, notif))
.addAction(getMarkMessageAsReadAction(context, notif))
.build();
}
@ -122,14 +100,6 @@ class ApiTwentyFourPlus {
String contactName,
PendingIntent intent) {
Intent hangupIntent = new Intent(context, NotificationBroadcastReceiver.class);
hangupIntent.setAction(INTENT_HANGUP_CALL_NOTIF_ACTION);
hangupIntent.putExtra(INTENT_NOTIF_ID, callId);
PendingIntent hangupPendingIntent =
PendingIntent.getBroadcast(
context, callId, hangupIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder builder =
new Notification.Builder(context)
.setContentTitle(contactName)
@ -144,26 +114,101 @@ class ApiTwentyFourPlus {
.setWhen(System.currentTimeMillis())
.setShowWhen(true)
.setColor(context.getColor(R.color.notification_color_led))
.addAction(
R.drawable.call_hangup,
context.getString(R.string.notification_call_hangup_label),
hangupPendingIntent);
.addAction(getCallDeclineAction(context, callId));
if (showAnswerAction) {
Intent answerIntent = new Intent(context, NotificationBroadcastReceiver.class);
answerIntent.setAction(INTENT_ANSWER_CALL_NOTIF_ACTION);
answerIntent.putExtra(INTENT_NOTIF_ID, callId);
PendingIntent answerPendingIntent =
PendingIntent.getBroadcast(
context, callId, answerIntent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.addAction(
R.drawable.call_audio_start,
context.getString(R.string.notification_call_answer_label),
answerPendingIntent);
builder.addAction(getCallAnswerAction(context, callId));
}
return builder.build();
}
public static Notification.Action getReplyMessageAction(Context context, Notifiable notif) {
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(INTENT_REPLY_NOTIF_ACTION);
replyIntent.putExtra(INTENT_NOTIF_ID, notif.getNotificationId());
replyIntent.putExtra(INTENT_LOCAL_IDENTITY, notif.getLocalIdentity());
PendingIntent replyPendingIntent =
PendingIntent.getBroadcast(
context,
notif.getNotificationId(),
replyIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Action replyAction =
new Notification.Action.Builder(
R.drawable.chat_send_over,
context.getString(R.string.notification_reply_label),
replyPendingIntent)
.addRemoteInput(remoteInput)
.setAllowGeneratedReplies(true)
.build();
return replyAction;
}
public static Notification.Action getMarkMessageAsReadAction(
Context context, Notifiable notif) {
Intent markAsReadIntent = new Intent(context, NotificationBroadcastReceiver.class);
markAsReadIntent.setAction(INTENT_MARK_AS_READ_ACTION);
markAsReadIntent.putExtra(INTENT_NOTIF_ID, notif.getNotificationId());
markAsReadIntent.putExtra(INTENT_LOCAL_IDENTITY, notif.getLocalIdentity());
PendingIntent markAsReadPendingIntent =
PendingIntent.getBroadcast(
context,
notif.getNotificationId(),
markAsReadIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Action markAsReadAction =
new Notification.Action.Builder(
R.drawable.chat_send_over,
context.getString(R.string.notification_mark_as_read_label),
markAsReadPendingIntent)
.build();
return markAsReadAction;
}
public static Notification.Action getCallAnswerAction(Context context, int callId) {
Intent answerIntent = new Intent(context, NotificationBroadcastReceiver.class);
answerIntent.setAction(INTENT_ANSWER_CALL_NOTIF_ACTION);
answerIntent.putExtra(INTENT_NOTIF_ID, callId);
PendingIntent answerPendingIntent =
PendingIntent.getBroadcast(
context, callId, answerIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Action answerAction =
new Notification.Action.Builder(
R.drawable.call_audio_start,
context.getString(R.string.notification_call_answer_label),
answerPendingIntent)
.build();
return answerAction;
}
public static Notification.Action getCallDeclineAction(Context context, int callId) {
Intent hangupIntent = new Intent(context, NotificationBroadcastReceiver.class);
hangupIntent.setAction(INTENT_HANGUP_CALL_NOTIF_ACTION);
hangupIntent.putExtra(INTENT_NOTIF_ID, callId);
PendingIntent hangupPendingIntent =
PendingIntent.getBroadcast(
context, callId, hangupIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Action declineAction =
new Notification.Action.Builder(
R.drawable.call_hangup,
context.getString(R.string.notification_call_hangup_label),
hangupPendingIntent)
.build();
return declineAction;
}
}

View file

@ -20,12 +20,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import static org.linphone.compatibility.Compatibility.CHAT_NOTIFICATIONS_GROUP;
import static org.linphone.compatibility.Compatibility.INTENT_ANSWER_CALL_NOTIF_ACTION;
import static org.linphone.compatibility.Compatibility.INTENT_HANGUP_CALL_NOTIF_ACTION;
import static org.linphone.compatibility.Compatibility.INTENT_LOCAL_IDENTITY;
import static org.linphone.compatibility.Compatibility.INTENT_NOTIF_ID;
import static org.linphone.compatibility.Compatibility.INTENT_REPLY_NOTIF_ACTION;
import static org.linphone.compatibility.Compatibility.KEY_TEXT_REPLY;
import android.annotation.TargetApi;
import android.app.FragmentTransaction;
@ -33,7 +27,6 @@ import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.RemoteInput;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.Intent;
@ -43,7 +36,6 @@ import android.provider.Settings;
import org.linphone.R;
import org.linphone.notifications.Notifiable;
import org.linphone.notifications.NotifiableMessage;
import org.linphone.notifications.NotificationBroadcastReceiver;
@TargetApi(26)
class ApiTwentySixPlus {
@ -107,30 +99,6 @@ class ApiTwentySixPlus {
public static Notification createMessageNotification(
Context context, Notifiable notif, Bitmap contactIcon, PendingIntent intent) {
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(INTENT_REPLY_NOTIF_ACTION);
replyIntent.putExtra(INTENT_NOTIF_ID, notif.getNotificationId());
replyIntent.putExtra(INTENT_LOCAL_IDENTITY, notif.getLocalIdentity());
PendingIntent replyPendingIntent =
PendingIntent.getBroadcast(
context,
notif.getNotificationId(),
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)
.setAllowGeneratedReplies(true)
.build();
Notification.MessagingStyle style = new Notification.MessagingStyle(notif.getMyself());
for (NotifiableMessage message : notif.getMessages()) {
@ -164,7 +132,8 @@ class ApiTwentySixPlus {
.setShowWhen(true)
.setColor(context.getColor(R.color.notification_color_led))
.setStyle(style)
.addAction(action)
.addAction(ApiTwentyFourPlus.getReplyMessageAction(context, notif))
.addAction(ApiTwentyFourPlus.getMarkMessageAsReadAction(context, notif))
.build();
}
@ -178,14 +147,6 @@ class ApiTwentySixPlus {
String contactName,
PendingIntent intent) {
Intent hangupIntent = new Intent(context, NotificationBroadcastReceiver.class);
hangupIntent.setAction(INTENT_HANGUP_CALL_NOTIF_ACTION);
hangupIntent.putExtra(INTENT_NOTIF_ID, callId);
PendingIntent hangupPendingIntent =
PendingIntent.getBroadcast(
context, callId, hangupIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder builder =
new Notification.Builder(
context,
@ -202,24 +163,10 @@ class ApiTwentySixPlus {
.setWhen(System.currentTimeMillis())
.setShowWhen(true)
.setColor(context.getColor(R.color.notification_color_led))
.addAction(
R.drawable.call_hangup,
context.getString(R.string.notification_call_hangup_label),
hangupPendingIntent);
.addAction(ApiTwentyFourPlus.getCallDeclineAction(context, callId));
if (showAnswerAction) {
Intent answerIntent = new Intent(context, NotificationBroadcastReceiver.class);
answerIntent.setAction(INTENT_ANSWER_CALL_NOTIF_ACTION);
answerIntent.putExtra(INTENT_NOTIF_ID, callId);
PendingIntent answerPendingIntent =
PendingIntent.getBroadcast(
context, callId, answerIntent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.addAction(
R.drawable.call_audio_start,
context.getString(R.string.notification_call_answer_label),
answerPendingIntent);
builder.addAction(ApiTwentyFourPlus.getCallAnswerAction(context, callId));
}
return builder.build();
}

View file

@ -39,6 +39,7 @@ public class Compatibility {
public static final String INTENT_HANGUP_CALL_NOTIF_ACTION = "org.linphone.HANGUP_CALL_ACTION";
public static final String INTENT_ANSWER_CALL_NOTIF_ACTION = "org.linphone.ANSWER_CALL_ACTION";
public static final String INTENT_LOCAL_IDENTITY = "LOCAL_IDENTITY";
public static final String INTENT_MARK_AS_READ_ACTION = "org.linphone.MARK_AS_READ_ACTION";
public static String getDeviceName(Context context) {
if (Version.sdkAboveOrEqual(25)) {

View file

@ -45,13 +45,8 @@ public class NotificationBroadcastReceiver extends BroadcastReceiver {
final int notifId = intent.getIntExtra(Compatibility.INTENT_NOTIF_ID, 0);
final String localyIdentity = intent.getStringExtra(Compatibility.INTENT_LOCAL_IDENTITY);
if (intent.getAction().equals(Compatibility.INTENT_REPLY_NOTIF_ACTION)) {
final String reply = getMessageText(intent).toString();
if (reply == null) {
Log.e("Couldn't get reply text");
onError(context, notifId);
return;
}
if (intent.getAction().equals(Compatibility.INTENT_REPLY_NOTIF_ACTION)
|| intent.getAction().equals(Compatibility.INTENT_MARK_AS_READ_ACTION)) {
String remoteSipAddr =
LinphoneService.instance()
.getNotificationManager()
@ -59,21 +54,25 @@ public class NotificationBroadcastReceiver extends BroadcastReceiver {
Core core = LinphoneManager.getLc();
if (core == null) {
Log.e("Couldn't get Core instance");
Log.e("[Notification Broadcast Receiver] Couldn't get Core instance");
onError(context, notifId);
return;
}
Address remoteAddr = core.interpretUrl(remoteSipAddr);
if (remoteAddr == null) {
Log.e("Couldn't interpret remote address " + remoteSipAddr);
Log.e(
"[Notification Broadcast Receiver] Couldn't interpret remote address "
+ remoteSipAddr);
onError(context, notifId);
return;
}
Address localAddr = core.interpretUrl(localyIdentity);
if (localAddr == null) {
Log.e("Couldn't interpret local address " + localyIdentity);
Log.e(
"[Notification Broadcast Receiver] Couldn't interpret local address "
+ localyIdentity);
onError(context, notifId);
return;
}
@ -81,7 +80,7 @@ public class NotificationBroadcastReceiver extends BroadcastReceiver {
ChatRoom room = core.findChatRoom(remoteAddr, localAddr);
if (room == null) {
Log.e(
"Couldn't find chat room for remote address "
"[Notification Broadcast Receiver] Couldn't find chat room for remote address "
+ remoteSipAddr
+ " and local address "
+ localyIdentity);
@ -95,24 +94,37 @@ public class NotificationBroadcastReceiver extends BroadcastReceiver {
.displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount());
}
ChatMessage msg = room.createMessage(reply);
msg.send();
msg.setListener(
new ChatMessageListenerStub() {
@Override
public void onMsgStateChanged(ChatMessage msg, ChatMessage.State state) {
if (state == ChatMessage.State.Delivered) {
Notification replied =
Compatibility.createRepliedNotification(context, reply);
LinphoneService.instance()
.getNotificationManager()
.sendNotification(notifId, replied);
} else if (state == ChatMessage.State.NotDelivered) {
Log.e("Couldn't send reply, message is not delivered");
onError(context, notifId);
if (intent.getAction().equals(Compatibility.INTENT_REPLY_NOTIF_ACTION)) {
final String reply = getMessageText(intent).toString();
if (reply == null) {
Log.e("[Notification Broadcast Receiver] Couldn't get reply text");
onError(context, notifId);
return;
}
ChatMessage msg = room.createMessage(reply);
msg.send();
msg.setListener(
new ChatMessageListenerStub() {
@Override
public void onMsgStateChanged(
ChatMessage msg, ChatMessage.State state) {
if (state == ChatMessage.State.Delivered) {
Notification replied =
Compatibility.createRepliedNotification(context, reply);
LinphoneService.instance()
.getNotificationManager()
.sendNotification(notifId, replied);
} else if (state == ChatMessage.State.NotDelivered) {
Log.e(
"[Notification Broadcast Receiver] Couldn't send reply, message is not delivered");
onError(context, notifId);
}
}
}
});
});
} else {
LinphoneService.instance().getNotificationManager().dismissNotification(notifId);
}
} else if (intent.getAction().equals(Compatibility.INTENT_ANSWER_CALL_NOTIF_ACTION)
|| intent.getAction().equals(Compatibility.INTENT_HANGUP_CALL_NOTIF_ACTION)) {
String remoteAddr =
@ -122,12 +134,14 @@ public class NotificationBroadcastReceiver extends BroadcastReceiver {
Core core = LinphoneManager.getLc();
if (core == null) {
Log.e("Couldn't get Core instance");
Log.e("[Notification Broadcast Receiver] Couldn't get Core instance");
return;
}
Call call = core.findCallFromUri(remoteAddr);
if (call == null) {
Log.e("Couldn't find call from remote address " + remoteAddr);
Log.e(
"[Notification Broadcast Receiver] Couldn't find call from remote address "
+ remoteAddr);
return;
}

View file

@ -361,4 +361,8 @@ public class NotificationsManager {
pendingIntent);
sendNotification(IN_APP_NOTIF_ID, notif);
}
public void dismissNotification(int notifId) {
mNM.cancel(notifId);
}
}

View file

@ -21,6 +21,7 @@
<string name="notification_replied_label">Sent reply: %s</string>
<string name="notification_call_hangup_label">Hangup</string>
<string name="notification_call_answer_label">Answer</string>
<string name="notification_mark_as_read_label">Mark as read</string>
<!-- Common -->
<string name="username">Username</string>