Improve service notification creation/update to fix Android 4.4 (and probably 4.3) not updating issue
This commit is contained in:
parent
48338978e9
commit
924597d0f4
5 changed files with 100 additions and 40 deletions
|
@ -142,17 +142,16 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
|
||||||
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
|
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
|
||||||
mNM.cancel(INCALL_NOTIF_ID); // in case of crash the icon is not removed
|
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);
|
Intent notifIntent = new Intent(this, incomingReceivedActivity);
|
||||||
notifIntent.putExtra("Notification", true);
|
notifIntent.putExtra("Notification", true);
|
||||||
mNotifContentIntent = PendingIntent.getActivity(this, 0, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
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);
|
LinphoneManager.createAndStart(this, this);
|
||||||
mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
|
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) {
|
public void addNotification(Intent onClickIntent, int iconResourceID, String title, String message) {
|
||||||
PendingIntent notifContentIntent = PendingIntent.getActivity(this, 0, onClickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
PendingIntent notifContentIntent = PendingIntent.getActivity(this, 0, onClickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||||
|
|
||||||
if (mCustomNotif == null) {
|
Bitmap bm = null;
|
||||||
mCustomNotif = new Notification();
|
try {
|
||||||
|
bm = BitmapFactory.decodeResource(getResources(), R.drawable.logo_linphone_57x57);
|
||||||
|
} catch (Exception e) {
|
||||||
}
|
}
|
||||||
|
mCustomNotif = Compatibility.createNotification(this, title, message, iconResourceID, 0, bm, notifContentIntent);
|
||||||
mCustomNotif.icon = iconResourceID;
|
|
||||||
mCustomNotif.iconLevel = 0;
|
|
||||||
mCustomNotif.when = System.currentTimeMillis();
|
|
||||||
mCustomNotif.flags &= Notification.FLAG_ONGOING_EVENT;
|
|
||||||
|
|
||||||
mCustomNotif.defaults |= Notification.DEFAULT_VIBRATE;
|
mCustomNotif.defaults |= Notification.DEFAULT_VIBRATE;
|
||||||
mCustomNotif.defaults |= Notification.DEFAULT_SOUND;
|
mCustomNotif.defaults |= Notification.DEFAULT_SOUND;
|
||||||
mCustomNotif.defaults |= Notification.DEFAULT_LIGHTS;
|
mCustomNotif.defaults |= Notification.DEFAULT_LIGHTS;
|
||||||
|
|
||||||
Compatibility.setNotificationLatestEventInfo(mCustomNotif, this, title, message, notifContentIntent);
|
|
||||||
notifyWrapper(CUSTOM_NOTIF_ID, mCustomNotif);
|
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) {
|
private synchronized void sendNotification(int level, int textId) {
|
||||||
mNotif.iconLevel = level;
|
|
||||||
mNotif.when=System.currentTimeMillis();
|
|
||||||
String text = getString(textId);
|
String text = getString(textId);
|
||||||
if (text.contains("%s") && LinphoneManager.getLc() != null) {
|
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.
|
// Test for null lc is to avoid a NPE when Android mess up badly with the String resources.
|
||||||
|
@ -451,7 +445,12 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
|
||||||
text = String.format(text, id);
|
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);
|
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.
|
* stop linphone as soon as it is started. Transport configured with TLS.
|
||||||
*/
|
*/
|
||||||
private synchronized void notifyWrapper(int id, Notification notification) {
|
private synchronized void notifyWrapper(int id, Notification notification) {
|
||||||
if (instance != null) {
|
if (instance != null && notification != null) {
|
||||||
mNM.notify(id, notification);
|
mNM.notify(id, notification);
|
||||||
} else {
|
} else {
|
||||||
Log.i("Service not ready, discarding notification");
|
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())) {
|
if ((state == RegistrationState.RegistrationFailed || state == RegistrationState.RegistrationCleared) && (LinphoneManager.getLc().getDefaultProxyConfig() == null || !LinphoneManager.getLc().getDefaultProxyConfig().isRegistered())) {
|
||||||
sendNotification(IC_LEVEL_OFFLINE, R.string.notification_register_failure);
|
sendNotification(IC_LEVEL_OFFLINE, R.string.notification_register_failure);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state == RegistrationState.RegistrationNone) {
|
if (state == RegistrationState.RegistrationNone) {
|
||||||
sendNotification(IC_LEVEL_OFFLINE, R.string.notification_started);
|
sendNotification(IC_LEVEL_OFFLINE, R.string.notification_started);
|
||||||
}
|
}
|
||||||
|
@ -553,7 +553,11 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
|
||||||
private void resetIntentLaunchedOnNotificationClick() {
|
private void resetIntentLaunchedOnNotificationClick() {
|
||||||
Intent notifIntent = new Intent(this, incomingReceivedActivity);
|
Intent notifIntent = new Intent(this, incomingReceivedActivity);
|
||||||
mNotifContentIntent = PendingIntent.getActivity(this, 0, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
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() {
|
protected void onIncomingReceived() {
|
||||||
|
|
55
src/org/linphone/compatibility/ApiEighteenPlus.java
Normal file
55
src/org/linphone/compatibility/ApiEighteenPlus.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -88,12 +88,6 @@ public class ApiElevenPlus {
|
||||||
return notif;
|
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) {
|
public static void copyTextToClipboard(Context context, String msg) {
|
||||||
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
|
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||||
ClipData clip = android.content.ClipData.newPlainText("Message", msg);
|
ClipData clip = android.content.ClipData.newPlainText("Message", msg);
|
||||||
|
|
|
@ -297,10 +297,6 @@ public class ApiFivePlus {
|
||||||
return notif;
|
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) {
|
public static void setPreferenceChecked(Preference preference, boolean checked) {
|
||||||
((CheckBoxPreference) preference).setChecked(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.*/
|
/* 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);
|
//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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -164,14 +164,6 @@ public class Compatibility {
|
||||||
return null;
|
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) {
|
public static CompatibilityScaleGestureDetector getScaleGestureDetector(Context context, CompatibilityScaleGestureListener listener) {
|
||||||
if (Version.sdkAboveOrEqual(Version.API08_FROYO_22)) {
|
if (Version.sdkAboveOrEqual(Version.API08_FROYO_22)) {
|
||||||
CompatibilityScaleGestureDetector csgd = new CompatibilityScaleGestureDetector(context);
|
CompatibilityScaleGestureDetector csgd = new CompatibilityScaleGestureDetector(context);
|
||||||
|
@ -274,4 +266,12 @@ public class Compatibility {
|
||||||
ApiFivePlus.setAudioManagerInCallMode(manager);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue