diff --git a/res/values/strings.xml b/res/values/strings.xml index 7807e83fb..1fbb3d425 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -170,6 +170,8 @@ Video capturing call ongoing started %i unread messages + Missed call + %i missed calls Warning: service is not ready diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 1d0cbe75a..5a93cc348 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -1386,6 +1386,9 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta String sipUri = extras.getString("ChatContactSipUri"); doNotGoToCallActivity = true; displayChat(sipUri); + } else if (extras != null && extras.getBoolean("GoToHistory", false)) { + doNotGoToCallActivity = true; + changeCurrentFragment(FragmentsAvailable.HISTORY_LIST, null); } else if (extras != null && extras.getBoolean("Notification", false)) { if (LinphoneManager.getLc().getCallsNb() > 0) { LinphoneCall call = LinphoneManager.getLc().getCalls()[0]; diff --git a/src/org/linphone/LinphoneService.java b/src/org/linphone/LinphoneService.java index 674bf5521..844cc9b9b 100644 --- a/src/org/linphone/LinphoneService.java +++ b/src/org/linphone/LinphoneService.java @@ -89,6 +89,7 @@ public final class LinphoneService extends Service { private final static int INCALL_NOTIF_ID=2; private final static int MESSAGE_NOTIF_ID=3; private final static int CUSTOM_NOTIF_ID=4; + private final static int MISSED_NOTIF_ID=5; public static boolean isReady() { return instance != null && instance.mTestDelayElapsed; @@ -114,7 +115,7 @@ public final class LinphoneService extends Service { private Notification mMsgNotif; private Notification mCustomNotif; private int mMsgNotifCount; - private PendingIntent mNotifContentIntent; + private PendingIntent mNotifContentIntent, mMissedCallsNotifContentIntent; private String mNotificationTitle; private boolean mDisableRegistrationStatus; private LinphoneCoreListenerBase mListener; @@ -181,6 +182,10 @@ public final class LinphoneService extends Service { Intent notifIntent = new Intent(this, incomingReceivedActivity); notifIntent.putExtra("Notification", true); mNotifContentIntent = PendingIntent.getActivity(this, 0, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT); + + Intent missedCallNotifIntent = new Intent(this, incomingReceivedActivity); + missedCallNotifIntent.putExtra("GoToHistory", true); + mMissedCallsNotifContentIntent = PendingIntent.getActivity(this, 0, missedCallNotifIntent, PendingIntent.FLAG_UPDATE_CURRENT); Bitmap bm = null; try { @@ -215,11 +220,26 @@ public final class LinphoneService extends Service { destroyOverlay(); } - // Enable the following to have missed call notifications - /*if (state == State.CallEnd && call.getCallLog().getStatus() == CallStatus.Missed) { - Notification notif = Compatibility.createSimpleNotification(instance, "Missed call", LinphoneManager.getLc().getMissedCallsCount() + " missed call", mNotifContentIntent); - notifyWrapper(CUSTOM_NOTIF_ID, notif); - }*/ + if (state == State.CallEnd && call.getCallLog().getStatus() == CallStatus.Missed) { + int missedCallCount = LinphoneManager.getLcIfManagerNotDestroyedOrNull().getMissedCallsCount(); + String body; + if (missedCallCount > 1) { + body = getString(R.string.missed_calls_notif_body).replace("%i", String.valueOf(missedCallCount)); + } else { + LinphoneAddress address = call.getRemoteAddress(); + LinphoneContact c = ContactsManager.getInstance().findContactFromAddress(address); + if (c != null) { + body = c.getFullName(); + } else { + body = address.getDisplayName(); + if (body == null) { + body = address.asStringUriOnly(); + } + } + } + Notification notif = Compatibility.createMissedCallNotification(instance, getString(R.string.missed_calls_notif_title), body, mMissedCallsNotifContentIntent); + notifyWrapper(MISSED_NOTIF_ID, notif); + } if (state == State.StreamsRunning) { // Workaround bug current call seems to be updated after state changed to streams running diff --git a/src/org/linphone/compatibility/ApiElevenPlus.java b/src/org/linphone/compatibility/ApiElevenPlus.java index 6fa46d519..9dda22251 100644 --- a/src/org/linphone/compatibility/ApiElevenPlus.java +++ b/src/org/linphone/compatibility/ApiElevenPlus.java @@ -151,6 +151,20 @@ public class ApiElevenPlus { return intent; } + @SuppressWarnings("deprecation") + public static Notification createMissedCallNotification(Context context, String title, String text, PendingIntent intent) { + Notification notif = new Notification.Builder(context) + .setContentTitle(title) + .setContentText(text) + .setContentIntent(intent) + .setSmallIcon(R.drawable.call_status_missed) + .setAutoCancel(true) + .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE) + .setWhen(System.currentTimeMillis()).getNotification(); + + return notif; + } + @SuppressWarnings("deprecation") public static Notification createSimpleNotification(Context context, String title, String text, PendingIntent intent) { Notification notif = new Notification.Builder(context) diff --git a/src/org/linphone/compatibility/ApiSixteenPlus.java b/src/org/linphone/compatibility/ApiSixteenPlus.java index f7fff7d2f..1bee2257e 100644 --- a/src/org/linphone/compatibility/ApiSixteenPlus.java +++ b/src/org/linphone/compatibility/ApiSixteenPlus.java @@ -112,6 +112,20 @@ public class ApiSixteenPlus { viewTreeObserver.removeOnGlobalLayoutListener(keyboardListener); } + public static Notification createMissedCallNotification(Context context, String title, String text, PendingIntent intent) { + Notification notif = new Notification.Builder(context) + .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()) + .build(); + + return notif; + } + public static Notification createSimpleNotification(Context context, String title, String text, PendingIntent intent) { Notification notif = new Notification.Builder(context) .setContentTitle(title) diff --git a/src/org/linphone/compatibility/ApiTwentyOnePlus.java b/src/org/linphone/compatibility/ApiTwentyOnePlus.java index 66d0a37b6..ff6431a5b 100644 --- a/src/org/linphone/compatibility/ApiTwentyOnePlus.java +++ b/src/org/linphone/compatibility/ApiTwentyOnePlus.java @@ -112,6 +112,22 @@ public class ApiTwentyOnePlus { viewTreeObserver.removeOnGlobalLayoutListener(keyboardListener); } + public static Notification createMissedCallNotification(Context context, String title, String text, PendingIntent intent) { + Notification notif = new Notification.Builder(context) + .setContentTitle(title) + .setContentText(text) + .setSmallIcon(R.drawable.call_status_missed) + .setAutoCancel(true) + .setContentIntent(intent) + .setDefaults(Notification.DEFAULT_ALL) + .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) .setContentTitle(title) diff --git a/src/org/linphone/compatibility/Compatibility.java b/src/org/linphone/compatibility/Compatibility.java index 2cb9336c0..574cf485b 100644 --- a/src/org/linphone/compatibility/Compatibility.java +++ b/src/org/linphone/compatibility/Compatibility.java @@ -46,6 +46,17 @@ public class Compatibility { } return notif; } + public static Notification createMissedCallNotification(Context context, String title, String text, PendingIntent intent) { + Notification notif = null; + 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 notif; + } public static Notification createMessageNotification(Context context, int msgCount, String msgSender, String msg, Bitmap contactIcon, PendingIntent intent) { Notification notif = null;