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;