Improve service notification creation/update to fix Android 4.4 (and probably 4.3) not updating issue

This commit is contained in:
Sylvain Berfini 2014-02-06 17:20:32 +01:00
parent 48338978e9
commit 924597d0f4
5 changed files with 100 additions and 40 deletions

View file

@ -141,18 +141,17 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNM.cancel(INCALL_NOTIF_ID); // in case of crash the icon is not removed
mNotif = new Notification();
mNotif.icon = R.drawable.status_level;
mNotif.when = System.currentTimeMillis();
mNotif.iconLevel=IC_LEVEL_ORANGE;
mNotif.flags |= Notification.FLAG_ONGOING_EVENT;
Intent notifIntent = new Intent(this, incomingReceivedActivity);
notifIntent.putExtra("Notification", true);
mNotifContentIntent = PendingIntent.getActivity(this, 0, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Compatibility.setNotificationLatestEventInfo(mNotif, this, mNotificationTitle, "", mNotifContentIntent);
Bitmap bm = null;
try {
bm = BitmapFactory.decodeResource(getResources(), R.drawable.logo_linphone_57x57);
} catch (Exception e) {
}
mNotif = Compatibility.createNotification(this, mNotificationTitle, "", R.drawable.status_level, IC_LEVEL_OFFLINE, bm, mNotifContentIntent);
LinphoneManager.createAndStart(this, this);
mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
@ -279,20 +278,17 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
public void addNotification(Intent onClickIntent, int iconResourceID, String title, String message) {
PendingIntent notifContentIntent = PendingIntent.getActivity(this, 0, onClickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
if (mCustomNotif == null) {
mCustomNotif = new Notification();
Bitmap bm = null;
try {
bm = BitmapFactory.decodeResource(getResources(), R.drawable.logo_linphone_57x57);
} catch (Exception e) {
}
mCustomNotif.icon = iconResourceID;
mCustomNotif.iconLevel = 0;
mCustomNotif.when = System.currentTimeMillis();
mCustomNotif.flags &= Notification.FLAG_ONGOING_EVENT;
mCustomNotif = Compatibility.createNotification(this, title, message, iconResourceID, 0, bm, notifContentIntent);
mCustomNotif.defaults |= Notification.DEFAULT_VIBRATE;
mCustomNotif.defaults |= Notification.DEFAULT_SOUND;
mCustomNotif.defaults |= Notification.DEFAULT_LIGHTS;
Compatibility.setNotificationLatestEventInfo(mCustomNotif, this, title, message, notifContentIntent);
notifyWrapper(CUSTOM_NOTIF_ID, mCustomNotif);
}
@ -441,8 +437,6 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
}
private synchronized void sendNotification(int level, int textId) {
mNotif.iconLevel = level;
mNotif.when=System.currentTimeMillis();
String text = getString(textId);
if (text.contains("%s") && LinphoneManager.getLc() != null) {
// Test for null lc is to avoid a NPE when Android mess up badly with the String resources.
@ -450,8 +444,13 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
String id = lpc != null ? lpc.getIdentity() : "";
text = String.format(text, id);
}
Compatibility.setNotificationLatestEventInfo(mNotif, this, mNotificationTitle, text, mNotifContentIntent);
Bitmap bm = null;
try {
bm = BitmapFactory.decodeResource(getResources(), R.drawable.logo_linphone_57x57);
} catch (Exception e) {
}
mNotif = Compatibility.createNotification(this, mNotificationTitle, text, R.drawable.status_level, level, bm, mNotifContentIntent);
notifyWrapper(NOTIF_ID, mNotif);
}
@ -462,7 +461,7 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
* stop linphone as soon as it is started. Transport configured with TLS.
*/
private synchronized void notifyWrapper(int id, Notification notification) {
if (instance != null) {
if (instance != null && notification != null) {
mNM.notify(id, notification);
} else {
Log.i("Service not ready, discarding notification");
@ -532,6 +531,7 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
if ((state == RegistrationState.RegistrationFailed || state == RegistrationState.RegistrationCleared) && (LinphoneManager.getLc().getDefaultProxyConfig() == null || !LinphoneManager.getLc().getDefaultProxyConfig().isRegistered())) {
sendNotification(IC_LEVEL_OFFLINE, R.string.notification_register_failure);
}
if (state == RegistrationState.RegistrationNone) {
sendNotification(IC_LEVEL_OFFLINE, R.string.notification_started);
}
@ -553,7 +553,11 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
private void resetIntentLaunchedOnNotificationClick() {
Intent notifIntent = new Intent(this, incomingReceivedActivity);
mNotifContentIntent = PendingIntent.getActivity(this, 0, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Compatibility.setNotificationLatestEventInfo(mNotif, this, mNotificationTitle, "", mNotifContentIntent);
if (mNotif != null) {
mNotif.contentIntent = mNotifContentIntent;
}
notifyWrapper(NOTIF_ID, mNotif);
}
protected void onIncomingReceived() {

View file

@ -0,0 +1,55 @@
package org.linphone.compatibility;
/*
ApiEighteenPlus.java
Copyright (C) 2012 Belledonne Communications, Grenoble, France
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import android.annotation.TargetApi;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
import android.graphics.Bitmap;
@TargetApi(18)
public class ApiEighteenPlus {
public static Notification createNotification(Context context, String title, String message, int icon, int level, Bitmap largeIcon, PendingIntent intent) {
Notification notif;
if (largeIcon != null) {
notif = new Notification.Builder(context)
.setContentTitle(title)
.setContentText(message)
.setSmallIcon(icon, level)
.setLargeIcon(largeIcon)
.setContentIntent(intent)
.setWhen(System.currentTimeMillis())
.build();
} else {
notif = new Notification.Builder(context)
.setContentTitle(title)
.setContentText(message)
.setSmallIcon(icon, level)
.setContentIntent(intent)
.setWhen(System.currentTimeMillis())
.build();
}
notif.flags |= Notification.FLAG_ONGOING_EVENT;
return notif;
}
}

View file

@ -88,12 +88,6 @@ public class ApiElevenPlus {
return notif;
}
@SuppressWarnings("deprecation")
public static void setNotificationLatestEventInfo(Notification notif,
Context context, String title, String content, PendingIntent intent) {
notif.setLatestEventInfo(context, title, content, intent);
}
public static void copyTextToClipboard(Context context, String msg) {
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = android.content.ClipData.newPlainText("Message", msg);

View file

@ -297,10 +297,6 @@ public class ApiFivePlus {
return notif;
}
public static void setNotificationLatestEventInfo(Notification notif, Context context, String title, String content, PendingIntent intent) {
notif.setLatestEventInfo(context, title, content, intent);
}
public static void setPreferenceChecked(Preference preference, boolean checked) {
((CheckBoxPreference) preference).setChecked(checked);
}
@ -370,4 +366,15 @@ public class ApiFivePlus {
/* Do not use MODE_IN_CALL, because it is reserved to GSM. This is causing conflicts on audio system resulting in silenced audio.*/
//manager.setMode(AudioManager.MODE_IN_CALL);
}
public static Notification createNotification(Context context, String title, String message, int icon, int level, PendingIntent intent) {
Notification notif = new Notification();
notif.icon = icon;
notif.iconLevel = level;
notif.when = System.currentTimeMillis();
notif.flags |= Notification.FLAG_ONGOING_EVENT;
notif.setLatestEventInfo(context, title, message, intent);
return notif;
}
}

View file

@ -164,14 +164,6 @@ public class Compatibility {
return null;
}
public static void setNotificationLatestEventInfo(Notification notif, Context context, String title, String content, PendingIntent intent) {
if (Version.sdkAboveOrEqual(Version.API11_HONEYCOMB_30)) {
ApiElevenPlus.setNotificationLatestEventInfo(notif, context, title, content, intent);
} else {
ApiFivePlus.setNotificationLatestEventInfo(notif, context, title, content, intent);
}
}
public static CompatibilityScaleGestureDetector getScaleGestureDetector(Context context, CompatibilityScaleGestureListener listener) {
if (Version.sdkAboveOrEqual(Version.API08_FROYO_22)) {
CompatibilityScaleGestureDetector csgd = new CompatibilityScaleGestureDetector(context);
@ -274,4 +266,12 @@ public class Compatibility {
ApiFivePlus.setAudioManagerInCallMode(manager);
}
}
public static Notification createNotification(Context context, String title, String message, int icon, int iconLevel, Bitmap largeIcon, PendingIntent intent) {
if (Version.sdkAboveOrEqual(18)) {
return ApiEighteenPlus.createNotification(context, title, message, icon, iconLevel, largeIcon, intent);
} else {
return ApiFivePlus.createNotification(context, title, message, icon, iconLevel, intent);
}
}
}