diff --git a/app/src/main/java/org/linphone/LinphoneService.java b/app/src/main/java/org/linphone/LinphoneService.java index b70c0d044..3254fac71 100644 --- a/app/src/main/java/org/linphone/LinphoneService.java +++ b/app/src/main/java/org/linphone/LinphoneService.java @@ -155,9 +155,11 @@ public final class LinphoneService extends Service { if (state == Call.State.IncomingReceived || state == State.IncomingEarlyMedia) { - // Now we rely on the fullscreen intent of the call incoming - // notification - // if (!mLinphoneManager.getCallGsmON()) onIncomingReceived(); + // Starting SDK 24 (Android 7.0) we rely on the fullscreen intent of the + // call incoming notification + if (Version.sdkStrictlyBelow(Version.API24_NOUGAT_70)) { + if (!mLinphoneManager.getCallGsmON()) onIncomingReceived(); + } } else if (state == State.OutgoingInit) { onOutgoingStarted(); } else if (state == State.Connected) { diff --git a/app/src/main/java/org/linphone/compatibility/ApiTwentyFourPlus.java b/app/src/main/java/org/linphone/compatibility/ApiTwentyFourPlus.java index 7abe859cb..5760b84ab 100644 --- a/app/src/main/java/org/linphone/compatibility/ApiTwentyFourPlus.java +++ b/app/src/main/java/org/linphone/compatibility/ApiTwentyFourPlus.java @@ -36,6 +36,7 @@ import android.content.ContentProviderClient; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.widget.RemoteViews; import org.linphone.R; import org.linphone.notifications.Notifiable; import org.linphone.notifications.NotifiableMessage; @@ -94,36 +95,65 @@ class ApiTwentyFourPlus { public static Notification createInCallNotification( Context context, int callId, - boolean showAnswerAction, String msg, int iconID, Bitmap contactIcon, String contactName, PendingIntent intent) { - Notification.Builder builder = - new Notification.Builder(context) - .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) - .setOngoing(true) - .setColor(context.getColor(R.color.notification_led_color)) - .addAction(Compatibility.getCallDeclineAction(context, callId)); + return new Notification.Builder(context) + .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) + .setOngoing(true) + .setColor(context.getColor(R.color.notification_led_color)) + .addAction(Compatibility.getCallDeclineAction(context, callId)) + .build(); + } - if (showAnswerAction) { - builder.setFullScreenIntent(intent, true); - builder.addAction(Compatibility.getCallAnswerAction(context, callId)); + public static Notification createIncomingCallNotification( + Context context, + int callId, + Bitmap contactIcon, + String contactName, + String sipUri, + PendingIntent intent) { + RemoteViews notificationLayoutHeadsUp = + new RemoteViews( + context.getPackageName(), R.layout.call_incoming_notification_heads_up); + notificationLayoutHeadsUp.setTextViewText(R.id.caller, contactName); + notificationLayoutHeadsUp.setTextViewText(R.id.sip_uri, sipUri); + notificationLayoutHeadsUp.setTextViewText( + R.id.incoming_call_info, context.getString(R.string.incall_notif_incoming)); + if (contactIcon != null) { + notificationLayoutHeadsUp.setImageViewBitmap(R.id.caller_picture, contactIcon); } - return builder.build(); + return new Notification.Builder(context) + .setStyle(new Notification.DecoratedCustomViewStyle()) + .setSmallIcon(R.drawable.topbar_call_notification) + .setAutoCancel(false) + .setContentIntent(intent) + .setCategory(Notification.CATEGORY_CALL) + .setVisibility(Notification.VISIBILITY_PUBLIC) + .setPriority(Notification.PRIORITY_HIGH) + .setWhen(System.currentTimeMillis()) + .setShowWhen(true) + .setOngoing(true) + .setColor(context.getColor(R.color.notification_led_color)) + .addAction(Compatibility.getCallDeclineAction(context, callId)) + .addAction(Compatibility.getCallAnswerAction(context, callId)) + .setCustomHeadsUpContentView(notificationLayoutHeadsUp) + .setFullScreenIntent(intent, true) + .build(); } public static Notification.Action getReplyMessageAction(Context context, Notifiable notif) { diff --git a/app/src/main/java/org/linphone/compatibility/ApiTwentyOnePlus.java b/app/src/main/java/org/linphone/compatibility/ApiTwentyOnePlus.java index bae5e102d..f864750d7 100644 --- a/app/src/main/java/org/linphone/compatibility/ApiTwentyOnePlus.java +++ b/app/src/main/java/org/linphone/compatibility/ApiTwentyOnePlus.java @@ -75,36 +75,56 @@ class ApiTwentyOnePlus { public static Notification createInCallNotification( Context context, - boolean isIncoming, String msg, int iconID, Bitmap contactIcon, String contactName, PendingIntent intent) { - Notification.Builder builder = - new Notification.Builder(context) - .setContentTitle(contactName) - .setContentText(msg) - .setSmallIcon(iconID) - .setAutoCancel(false) - .setContentIntent(intent) - .setLargeIcon(contactIcon) - .setCategory(Notification.CATEGORY_CALL) - .setVisibility(Notification.VISIBILITY_PUBLIC) - .setPriority(Notification.PRIORITY_HIGH) - .setOngoing(true) - .setLights( - ContextCompat.getColor(context, R.color.notification_led_color), - context.getResources().getInteger(R.integer.notification_ms_on), - context.getResources().getInteger(R.integer.notification_ms_off)) - .setShowWhen(true); + return new Notification.Builder(context) + .setContentTitle(contactName) + .setContentText(msg) + .setSmallIcon(iconID) + .setAutoCancel(false) + .setContentIntent(intent) + .setLargeIcon(contactIcon) + .setCategory(Notification.CATEGORY_CALL) + .setVisibility(Notification.VISIBILITY_PUBLIC) + .setPriority(Notification.PRIORITY_HIGH) + .setOngoing(true) + .setLights( + ContextCompat.getColor(context, R.color.notification_led_color), + context.getResources().getInteger(R.integer.notification_ms_on), + context.getResources().getInteger(R.integer.notification_ms_off)) + .setShowWhen(true) + .build(); + } - if (isIncoming) { - builder.setFullScreenIntent(intent, true); - } + public static Notification createIncomingCallNotification( + Context context, + Bitmap contactIcon, + String contactName, + String sipUri, + PendingIntent intent) { - return builder.build(); + return new Notification.Builder(context) + .setContentTitle(contactName) + .setContentText(context.getString(R.string.incall_notif_incoming)) + .setSmallIcon(R.drawable.topbar_call_notification) + .setAutoCancel(false) + .setContentIntent(intent) + .setLargeIcon(contactIcon) + .setCategory(Notification.CATEGORY_CALL) + .setVisibility(Notification.VISIBILITY_PUBLIC) + .setPriority(Notification.PRIORITY_HIGH) + .setOngoing(true) + .setLights( + ContextCompat.getColor(context, R.color.notification_led_color), + context.getResources().getInteger(R.integer.notification_ms_on), + context.getResources().getInteger(R.integer.notification_ms_off)) + .setShowWhen(true) + .setFullScreenIntent(intent, true) + .build(); } public static Notification createNotification( diff --git a/app/src/main/java/org/linphone/compatibility/ApiTwentySixPlus.java b/app/src/main/java/org/linphone/compatibility/ApiTwentySixPlus.java index 157eca5d4..d324866c1 100644 --- a/app/src/main/java/org/linphone/compatibility/ApiTwentySixPlus.java +++ b/app/src/main/java/org/linphone/compatibility/ApiTwentySixPlus.java @@ -35,6 +35,7 @@ import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.os.Build; import android.provider.Settings; +import android.widget.RemoteViews; import org.linphone.R; import org.linphone.core.tools.Log; import org.linphone.notifications.Notifiable; @@ -143,41 +144,67 @@ class ApiTwentySixPlus { public static Notification createInCallNotification( Context context, int callId, - boolean isIncoming, String msg, int iconID, Bitmap contactIcon, String contactName, PendingIntent intent) { - Notification.Builder builder = - new Notification.Builder( - context, - isIncoming - ? context.getString(R.string.notification_channel_id) - : 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( - isIncoming ? Notification.PRIORITY_HIGH : Notification.PRIORITY_LOW) - .setWhen(System.currentTimeMillis()) - .setShowWhen(true) - .setOngoing(true) - .setColor(context.getColor(R.color.notification_led_color)) - .addAction(Compatibility.getCallDeclineAction(context, callId)); + return 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_LOW) + .setWhen(System.currentTimeMillis()) + .setShowWhen(true) + .setOngoing(true) + .setColor(context.getColor(R.color.notification_led_color)) + .addAction(Compatibility.getCallDeclineAction(context, callId)) + .build(); + } - if (isIncoming) { - builder.setFullScreenIntent(intent, true); - builder.addAction(Compatibility.getCallAnswerAction(context, callId)); + public static Notification createIncomingCallNotification( + Context context, + int callId, + Bitmap contactIcon, + String contactName, + String sipUri, + PendingIntent intent) { + RemoteViews notificationLayoutHeadsUp = + new RemoteViews( + context.getPackageName(), R.layout.call_incoming_notification_heads_up); + notificationLayoutHeadsUp.setTextViewText(R.id.caller, contactName); + notificationLayoutHeadsUp.setTextViewText(R.id.sip_uri, sipUri); + notificationLayoutHeadsUp.setTextViewText( + R.id.incoming_call_info, context.getString(R.string.incall_notif_incoming)); + if (contactIcon != null) { + notificationLayoutHeadsUp.setImageViewBitmap(R.id.caller_picture, contactIcon); } - return builder.build(); + + return new Notification.Builder( + context, context.getString(R.string.notification_channel_id)) + .setStyle(new Notification.DecoratedCustomViewStyle()) + .setSmallIcon(R.drawable.topbar_call_notification) + .setContentIntent(intent) + .setCategory(Notification.CATEGORY_CALL) + .setVisibility(Notification.VISIBILITY_PUBLIC) + .setPriority(Notification.PRIORITY_HIGH) + .setWhen(System.currentTimeMillis()) + .setAutoCancel(false) + .setShowWhen(true) + .setOngoing(true) + .setColor(context.getColor(R.color.notification_led_color)) + .setFullScreenIntent(intent, true) + .addAction(Compatibility.getCallDeclineAction(context, callId)) + .addAction(Compatibility.getCallAnswerAction(context, callId)) + .setCustomHeadsUpContentView(notificationLayoutHeadsUp) + .build(); } public static Notification createNotification( diff --git a/app/src/main/java/org/linphone/compatibility/Compatibility.java b/app/src/main/java/org/linphone/compatibility/Compatibility.java index 89e178c5a..ae61829ac 100644 --- a/app/src/main/java/org/linphone/compatibility/Compatibility.java +++ b/app/src/main/java/org/linphone/compatibility/Compatibility.java @@ -112,7 +112,6 @@ public class Compatibility { public static Notification createInCallNotification( Context context, int callId, - boolean isIncoming, String msg, int iconID, Bitmap contactIcon, @@ -120,13 +119,31 @@ public class Compatibility { PendingIntent intent) { if (Version.sdkAboveOrEqual(Version.API26_O_80)) { return ApiTwentySixPlus.createInCallNotification( - context, callId, isIncoming, msg, iconID, contactIcon, contactName, intent); + context, callId, msg, iconID, contactIcon, contactName, intent); } else if (Version.sdkAboveOrEqual(Version.API24_NOUGAT_70)) { return ApiTwentyFourPlus.createInCallNotification( - context, callId, isIncoming, msg, iconID, contactIcon, contactName, intent); + context, callId, msg, iconID, contactIcon, contactName, intent); } return ApiTwentyOnePlus.createInCallNotification( - context, isIncoming, msg, iconID, contactIcon, contactName, intent); + context, msg, iconID, contactIcon, contactName, intent); + } + + public static Notification createIncomingCallNotification( + Context context, + int callId, + Bitmap contactIcon, + String contactName, + String sipUri, + PendingIntent intent) { + if (Version.sdkAboveOrEqual(Version.API26_O_80)) { + return ApiTwentySixPlus.createIncomingCallNotification( + context, callId, contactIcon, contactName, sipUri, intent); + } else if (Version.sdkAboveOrEqual(Version.API24_NOUGAT_70)) { + return ApiTwentyFourPlus.createIncomingCallNotification( + context, callId, contactIcon, contactName, sipUri, intent); + } + return ApiTwentyOnePlus.createIncomingCallNotification( + context, contactIcon, contactName, sipUri, intent); } public static Notification createNotification( diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.java b/app/src/main/java/org/linphone/notifications/NotificationsManager.java index 218c58963..1c52a85b2 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.java +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.java @@ -614,21 +614,32 @@ public class NotificationsManager { + callNotifIntentClass); LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(address); - Uri pictureUri = contact != null ? contact.getPhotoUri() : null; + Uri pictureUri = contact != null ? contact.getThumbnailUri() : null; Bitmap bm = ImageUtils.getRoundBitmapFromUri(mContext, pictureUri); String name = LinphoneUtils.getAddressDisplayName(address); boolean isIncoming = callNotifIntentClass == CallIncomingActivity.class; - Notification notification = - Compatibility.createInCallNotification( - mContext, - notif.getNotificationId(), - isIncoming, - mContext.getString(notificationTextId), - iconId, - bm, - name, - pendingIntent); + Notification notification; + if (isIncoming) { + notification = + Compatibility.createIncomingCallNotification( + mContext, + notif.getNotificationId(), + bm, + name, + addressAsString, + pendingIntent); + } else { + notification = + Compatibility.createInCallNotification( + mContext, + notif.getNotificationId(), + mContext.getString(notificationTextId), + iconId, + bm, + name, + pendingIntent); + } // Don't use incoming call notification as foreground service notif ! if (!isServiceNotificationDisplayed() && !isIncoming) { diff --git a/app/src/main/res/layout/call_incoming_notification_heads_up.xml b/app/src/main/res/layout/call_incoming_notification_heads_up.xml new file mode 100644 index 000000000..7ca1826f7 --- /dev/null +++ b/app/src/main/res/layout/call_incoming_notification_heads_up.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + \ No newline at end of file