diff --git a/res/values/color.xml b/res/values/color.xml index 336f84bde..e0b31ba31 100644 --- a/res/values/color.xml +++ b/res/values/color.xml @@ -12,6 +12,7 @@ #ffa645 #3eb5c0 #96c11f + #FF8000 #00000000 diff --git a/res/values/non_localizable_custom.xml b/res/values/non_localizable_custom.xml index 683b9771e..891c6eb1e 100644 --- a/res/values/non_localizable_custom.xml +++ b/res/values/non_localizable_custom.xml @@ -94,6 +94,8 @@ true true linphone_notification_id + 1000 + 7000 false diff --git a/src/android/org/linphone/LinphoneService.java b/src/android/org/linphone/LinphoneService.java index 9fdf5aa8c..953f58ad7 100644 --- a/src/android/org/linphone/LinphoneService.java +++ b/src/android/org/linphone/LinphoneService.java @@ -32,7 +32,6 @@ import org.linphone.core.LinphoneCore.GlobalState; import org.linphone.core.LinphoneCore.RegistrationState; import org.linphone.core.LinphoneCoreException; import org.linphone.core.LinphoneCoreFactory; -import org.linphone.core.LinphoneCoreFactoryImpl; import org.linphone.core.LinphoneCoreListenerBase; import org.linphone.core.LinphoneProxyConfig; import org.linphone.mediastream.Log; @@ -314,6 +313,7 @@ public final class LinphoneService extends Service { mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mNM.cancel(INCALL_NOTIF_ID); // in case of crash the icon is not removed + Compatibility.CreateChannel(this); Intent notifIntent = new Intent(this, incomingReceivedActivity); notifIntent.putExtra("Notification", true); diff --git a/src/android/org/linphone/compatibility/ApiTwentyOnePlus.java b/src/android/org/linphone/compatibility/ApiTwentyOnePlus.java index 82b5d6ac3..ad7696b43 100644 --- a/src/android/org/linphone/compatibility/ApiTwentyOnePlus.java +++ b/src/android/org/linphone/compatibility/ApiTwentyOnePlus.java @@ -7,6 +7,7 @@ import android.app.Notification; import android.app.PendingIntent; import android.content.Context; import android.graphics.Bitmap; +import android.support.v4.content.ContextCompat; import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnGlobalLayoutListener; /* @@ -50,8 +51,12 @@ public class ApiTwentyOnePlus { .setSmallIcon(R.drawable.topbar_chat_notification) .setAutoCancel(true) .setContentIntent(intent) - .setDefaults(Notification.DEFAULT_ALL) + .setDefaults(Notification.DEFAULT_SOUND + | Notification.DEFAULT_VIBRATE) .setLargeIcon(contactIcon) + .setLights(ContextCompat.getColor(context, R.color.notification_color_led), + context.getResources().getInteger(R.integer.notification_ms_on), + context.getResources().getInteger(R.integer.notification_ms_off)) .setCategory(Notification.CATEGORY_MESSAGE) .setVisibility(Notification.VISIBILITY_PRIVATE) .setPriority(Notification.PRIORITY_HIGH) @@ -74,6 +79,9 @@ public class ApiTwentyOnePlus { .setCategory(Notification.CATEGORY_CALL) .setVisibility(Notification.VISIBILITY_PUBLIC) .setPriority(Notification.PRIORITY_HIGH) + .setLights(ContextCompat.getColor(context, R.color.notification_color_led), + context.getResources().getInteger(R.integer.notification_ms_on), + context.getResources().getInteger(R.integer.notification_ms_off)) .build(); return notif; @@ -91,6 +99,9 @@ public class ApiTwentyOnePlus { .setContentIntent(intent) .setCategory(Notification.CATEGORY_SERVICE) .setVisibility(Notification.VISIBILITY_SECRET) + .setLights(ContextCompat.getColor(context, R.color.notification_color_led), + context.getResources().getInteger(R.integer.notification_ms_on), + context.getResources().getInteger(R.integer.notification_ms_off)) .setPriority(priority) .build(); } else { @@ -101,6 +112,9 @@ public class ApiTwentyOnePlus { .setContentIntent(intent) .setCategory(Notification.CATEGORY_SERVICE) .setVisibility(Notification.VISIBILITY_SECRET) + .setLights(ContextCompat.getColor(context, R.color.notification_color_led), + context.getResources().getInteger(R.integer.notification_ms_on), + context.getResources().getInteger(R.integer.notification_ms_off)) .setPriority(priority) .build(); } @@ -119,9 +133,13 @@ public class ApiTwentyOnePlus { .setSmallIcon(R.drawable.call_status_missed) .setAutoCancel(true) .setContentIntent(intent) - .setDefaults(Notification.DEFAULT_ALL) + .setDefaults(Notification.DEFAULT_SOUND + | Notification.DEFAULT_VIBRATE) .setCategory(Notification.CATEGORY_MESSAGE) .setVisibility(Notification.VISIBILITY_PRIVATE) + .setLights(ContextCompat.getColor(context, R.color.notification_color_led), + context.getResources().getInteger(R.integer.notification_ms_on), + context.getResources().getInteger(R.integer.notification_ms_off)) .setPriority(Notification.PRIORITY_HIGH) .build(); @@ -135,9 +153,13 @@ public class ApiTwentyOnePlus { .setSmallIcon(R.drawable.linphone_logo) .setAutoCancel(true) .setContentIntent(intent) - .setDefaults(Notification.DEFAULT_ALL) + .setDefaults(Notification.DEFAULT_SOUND + | Notification.DEFAULT_VIBRATE) .setCategory(Notification.CATEGORY_MESSAGE) .setVisibility(Notification.VISIBILITY_PRIVATE) + .setLights(ContextCompat.getColor(context, R.color.notification_color_led), + context.getResources().getInteger(R.integer.notification_ms_on), + context.getResources().getInteger(R.integer.notification_ms_off)) .setPriority(Notification.PRIORITY_HIGH) .build(); diff --git a/src/android/org/linphone/compatibility/ApiTwentySixPlus.java b/src/android/org/linphone/compatibility/ApiTwentySixPlus.java index 9f9ea9aa5..853d8bb60 100644 --- a/src/android/org/linphone/compatibility/ApiTwentySixPlus.java +++ b/src/android/org/linphone/compatibility/ApiTwentySixPlus.java @@ -1,16 +1,19 @@ package org.linphone.compatibility; + +import android.annotation.TargetApi; import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.graphics.Bitmap; -import android.widget.TextView; -import android.annotation.TargetApi; +import android.view.ViewTreeObserver; import org.linphone.R; /* -ApiTwentyThreePlus.java +ApiTwentyOnePlus.java Copyright (C) 2017 Belledonne Communications, Grenoble, France This program is free software; you can redistribute it and/or @@ -27,11 +30,28 @@ 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. */ + /** * @author Erwan Croze */ @TargetApi(26) public class ApiTwentySixPlus { + + public static void CreateChannel(Context context) { + NotificationManager notificationManager = + (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + String id = context.getString(R.string.notification_channel_id); + CharSequence name = context.getString(R.string.content_title_notification); + String description = context.getString(R.string.content_title_notification); + int importance = NotificationManager.IMPORTANCE_HIGH; + NotificationChannel mChannel = new NotificationChannel(id, name, importance); + mChannel.setDescription(description); + mChannel.enableLights(true); + mChannel.setLightColor(context.getColor(R.color.notification_color_led)); + mChannel.enableLights(true); + notificationManager.createNotificationChannel(mChannel); + } + public static Notification createMessageNotification(Context context, int msgCount, String msgSender, String msg, Bitmap contactIcon, PendingIntent intent) { @@ -39,23 +59,111 @@ public class ApiTwentySixPlus { if (msgCount == 1) { title = msgSender; } else { - title = context.getString(R.string.unread_messages) - .replace("%i", String.valueOf(msgCount)); + title = context.getString(R.string.unread_messages).replace("%i", String.valueOf(msgCount)); } - Notification notif = new Notification.Builder(context) - .setContentTitle(title) + NotificationManager notificationManager = + (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + Notification notif = null; + 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) + .build(); + + return notif; + } + + public static Notification createInCallNotification(Context context, + String title, String msg, int iconID, Bitmap contactIcon, + String contactName, PendingIntent intent) { + + Notification notif = new Notification.Builder(context, context.getString(R.string.notification_channel_id)) + .setContentTitle(contactName) .setContentText(msg) - .setSmallIcon(R.drawable.topbar_chat_notification) + .setSmallIcon(iconID) + .setAutoCancel(false) + .setContentIntent(intent) + .setLargeIcon(contactIcon) + .setCategory(Notification.CATEGORY_CALL) + .setVisibility(Notification.VISIBILITY_PUBLIC) + .setPriority(Notification.PRIORITY_HIGH) + .build(); + + return notif; + } + + public static Notification createNotification(Context context, String title, String message, int icon, int level, Bitmap largeIcon, PendingIntent intent, boolean isOngoingEvent,int priority) { + Notification notif; + + if (largeIcon != null) { + notif = new Notification.Builder(context, context.getString(R.string.notification_channel_id)) + .setContentTitle(title) + .setContentText(message) + .setSmallIcon(icon, level) + .setLargeIcon(largeIcon) + .setContentIntent(intent) + .setCategory(Notification.CATEGORY_SERVICE) + .setVisibility(Notification.VISIBILITY_SECRET) + .setPriority(priority) + .build(); + } else { + notif = new Notification.Builder(context, context.getString(R.string.notification_channel_id)) + .setContentTitle(title) + .setContentText(message) + .setSmallIcon(icon, level) + .setContentIntent(intent) + .setCategory(Notification.CATEGORY_SERVICE) + .setVisibility(Notification.VISIBILITY_SECRET) + .setPriority(priority) + .build(); + } + + return notif; + } + + public static void removeGlobalLayoutListener(ViewTreeObserver viewTreeObserver, ViewTreeObserver.OnGlobalLayoutListener keyboardListener) { + viewTreeObserver.removeOnGlobalLayoutListener(keyboardListener); + } + + 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_LIGHTS - | Notification.DEFAULT_SOUND - | Notification.DEFAULT_VIBRATE) - .setWhen(System.currentTimeMillis()) - .setLargeIcon(contactIcon) - .setNumber(msgCount) + .setDefaults(Notification.DEFAULT_SOUND + | Notification.DEFAULT_VIBRATE) + .setCategory(Notification.CATEGORY_MESSAGE) + .setVisibility(Notification.VISIBILITY_PRIVATE) + .setPriority(Notification.PRIORITY_HIGH) + .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) .build(); return notif; diff --git a/src/android/org/linphone/compatibility/Compatibility.java b/src/android/org/linphone/compatibility/Compatibility.java index 552c06683..34c5209eb 100644 --- a/src/android/org/linphone/compatibility/Compatibility.java +++ b/src/android/org/linphone/compatibility/Compatibility.java @@ -36,57 +36,62 @@ import android.widget.TextView; * @author Sylvain Berfini */ public class Compatibility { + public static void CreateChannel(Context context) { + if (Version.sdkAboveOrEqual(Version.API26_O_80)) { + ApiTwentySixPlus.CreateChannel(context); + } + } public static Notification createSimpleNotification(Context context, String title, String text, PendingIntent intent) { - Notification notif = null; - if (Version.sdkAboveOrEqual(Version.API21_LOLLIPOP_50)) { + if (Version.sdkAboveOrEqual(Version.API26_O_80)) { + return ApiTwentySixPlus.createSimpleNotification(context, title, text, intent); + } else if (Version.sdkAboveOrEqual(Version.API21_LOLLIPOP_50)) { return ApiTwentyOnePlus.createSimpleNotification(context, title, text, intent); } else if (Version.sdkAboveOrEqual(Version.API16_JELLY_BEAN_41)) { - notif = ApiSixteenPlus.createSimpleNotification(context, title, text, intent); + return ApiSixteenPlus.createSimpleNotification(context, title, text, intent); } else { - notif = ApiElevenPlus.createSimpleNotification(context, title, text, intent); + return ApiElevenPlus.createSimpleNotification(context, title, text, intent); } - return notif; } public static Notification createMissedCallNotification(Context context, String title, String text, PendingIntent intent) { - Notification notif = null; - if (Version.sdkAboveOrEqual(Version.API21_LOLLIPOP_50)) { + if (Version.sdkAboveOrEqual(Version.API26_O_80)) { + return ApiTwentySixPlus.createMissedCallNotification(context, title, text, intent); + } else if (Version.sdkAboveOrEqual(Version.API21_LOLLIPOP_50)) { return ApiTwentyOnePlus.createMissedCallNotification(context, title, text, intent); } else if (Version.sdkAboveOrEqual(Version.API16_JELLY_BEAN_41)) { - notif = ApiSixteenPlus.createMissedCallNotification(context, title, text, intent); - } else { - notif = ApiElevenPlus.createMissedCallNotification(context, title, text, intent); + return ApiSixteenPlus.createMissedCallNotification(context, title, text, intent); + } else { + return ApiElevenPlus.createMissedCallNotification(context, title, text, intent); } - return notif; } public static Notification createMessageNotification(Context context, int msgCount,String to, String msgSender, String msg, Bitmap contactIcon, PendingIntent intent) { - Notification notif = null; if (Version.sdkAboveOrEqual(Version.API26_O_80)) { - + return ApiTwentySixPlus.createMessageNotification(context, 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)) { - notif = ApiSixteenPlus.createMessageNotification(context, msgCount, msgSender, msg, contactIcon, intent); + return ApiSixteenPlus.createMessageNotification(context, msgCount, msgSender, msg, contactIcon, intent); } else { - notif = ApiElevenPlus.createMessageNotification(context, msgCount, msgSender, msg, contactIcon, intent); + return ApiElevenPlus.createMessageNotification(context, msgCount, msgSender, msg, contactIcon, intent); } - return notif; } public static Notification createInCallNotification(Context context, String title, String msg, int iconID, Bitmap contactIcon, String contactName, PendingIntent intent) { - Notification notif = null; - if (Version.sdkAboveOrEqual(Version.API21_LOLLIPOP_50)) { + if (Version.sdkAboveOrEqual(Version.API26_O_80)) { + return ApiTwentySixPlus.createInCallNotification(context, title, msg, iconID, contactIcon, contactName, intent); + } else if (Version.sdkAboveOrEqual(Version.API21_LOLLIPOP_50)) { return ApiTwentyOnePlus.createInCallNotification(context, title, msg, iconID, contactIcon, contactName, intent); } else if (Version.sdkAboveOrEqual(Version.API16_JELLY_BEAN_41)) { - notif = ApiSixteenPlus.createInCallNotification(context, title, msg, iconID, contactIcon, contactName, intent); + return ApiSixteenPlus.createInCallNotification(context, title, msg, iconID, contactIcon, contactName, intent); } else { - notif = ApiElevenPlus.createInCallNotification(context, title, msg, iconID, contactIcon, contactName, intent); + return ApiElevenPlus.createInCallNotification(context, title, msg, iconID, contactIcon, contactName, intent); } - return notif; } public static Notification createNotification(Context context, String title, String message, int icon, int iconLevel, Bitmap largeIcon, PendingIntent intent, boolean isOngoingEvent,int priority) { - if (Version.sdkAboveOrEqual(Version.API21_LOLLIPOP_50)) { + if (Version.sdkAboveOrEqual(Version.API26_O_80)) { + return ApiTwentySixPlus.createNotification(context, title, message, icon, iconLevel, largeIcon, intent, isOngoingEvent,priority); + } else if (Version.sdkAboveOrEqual(Version.API21_LOLLIPOP_50)) { return ApiTwentyOnePlus.createNotification(context, title, message, icon, iconLevel, largeIcon, intent, isOngoingEvent,priority); } else if (Version.sdkAboveOrEqual(Version.API16_JELLY_BEAN_41)) { return ApiSixteenPlus.createNotification(context, title, message, icon, iconLevel, largeIcon, intent, isOngoingEvent,priority);