use foreground service for ongoing call notification
This commit is contained in:
		
							parent
							
								
									c6db651322
								
							
						
					
					
						commit
						c9f7e174f7
					
				@ -76,7 +76,7 @@ public class NotificationService {
 | 
				
			|||||||
    private static final int NOTIFICATION_ID = NOTIFICATION_ID_MULTIPLIER * 2;
 | 
					    private static final int NOTIFICATION_ID = NOTIFICATION_ID_MULTIPLIER * 2;
 | 
				
			||||||
    private static final int ERROR_NOTIFICATION_ID = NOTIFICATION_ID_MULTIPLIER * 6;
 | 
					    private static final int ERROR_NOTIFICATION_ID = NOTIFICATION_ID_MULTIPLIER * 6;
 | 
				
			||||||
    private static final int INCOMING_CALL_NOTIFICATION_ID = NOTIFICATION_ID_MULTIPLIER * 8;
 | 
					    private static final int INCOMING_CALL_NOTIFICATION_ID = NOTIFICATION_ID_MULTIPLIER * 8;
 | 
				
			||||||
    private static final int ONGOING_CALL_NOTIFICATION_ID = NOTIFICATION_ID_MULTIPLIER * 10;
 | 
					    public static final int ONGOING_CALL_NOTIFICATION_ID = NOTIFICATION_ID_MULTIPLIER * 10;
 | 
				
			||||||
    private final XmppConnectionService mXmppConnectionService;
 | 
					    private final XmppConnectionService mXmppConnectionService;
 | 
				
			||||||
    private final LinkedHashMap<String, ArrayList<Message>> notifications = new LinkedHashMap<>();
 | 
					    private final LinkedHashMap<String, ArrayList<Message>> notifications = new LinkedHashMap<>();
 | 
				
			||||||
    private final HashMap<Conversation, AtomicInteger> mBacklogMessageCounter = new HashMap<>();
 | 
					    private final HashMap<Conversation, AtomicInteger> mBacklogMessageCounter = new HashMap<>();
 | 
				
			||||||
@ -362,10 +362,10 @@ public class NotificationService {
 | 
				
			|||||||
                .build());
 | 
					                .build());
 | 
				
			||||||
        final Notification notification = builder.build();
 | 
					        final Notification notification = builder.build();
 | 
				
			||||||
        notification.flags = notification.flags | Notification.FLAG_INSISTENT;
 | 
					        notification.flags = notification.flags | Notification.FLAG_INSISTENT;
 | 
				
			||||||
        notify(INCOMING_CALL_NOTIFICATION_ID, builder.build());
 | 
					        notify(INCOMING_CALL_NOTIFICATION_ID, notification);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void showOngoingCallNotification(final AbstractJingleConnection.Id id) {
 | 
					    public Notification getOngoingCallNotification(final AbstractJingleConnection.Id id) {
 | 
				
			||||||
        final NotificationCompat.Builder builder = new NotificationCompat.Builder(mXmppConnectionService, "ongoing_calls");
 | 
					        final NotificationCompat.Builder builder = new NotificationCompat.Builder(mXmppConnectionService, "ongoing_calls");
 | 
				
			||||||
        builder.setSmallIcon(R.drawable.ic_call_white_24dp);
 | 
					        builder.setSmallIcon(R.drawable.ic_call_white_24dp);
 | 
				
			||||||
        builder.setContentTitle(mXmppConnectionService.getString(R.string.ongoing_call));
 | 
					        builder.setContentTitle(mXmppConnectionService.getString(R.string.ongoing_call));
 | 
				
			||||||
@ -380,9 +380,7 @@ public class NotificationService {
 | 
				
			|||||||
                mXmppConnectionService.getString(R.string.hang_up),
 | 
					                mXmppConnectionService.getString(R.string.hang_up),
 | 
				
			||||||
                createCallAction(id.sessionId, XmppConnectionService.ACTION_END_CALL, 104))
 | 
					                createCallAction(id.sessionId, XmppConnectionService.ACTION_END_CALL, 104))
 | 
				
			||||||
                .build());
 | 
					                .build());
 | 
				
			||||||
        final Notification notification = builder.build();
 | 
					        return builder.build();
 | 
				
			||||||
        notification.flags = notification.flags | Notification.FLAG_INSISTENT;
 | 
					 | 
				
			||||||
        notify(ONGOING_CALL_NOTIFICATION_ID, builder.build());
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private PendingIntent createPendingRtpSession(final AbstractJingleConnection.Id id, final String action, final int requestCode) {
 | 
					    private PendingIntent createPendingRtpSession(final AbstractJingleConnection.Id id, final String action, final int requestCode) {
 | 
				
			||||||
@ -1129,7 +1127,7 @@ public class NotificationService {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void cancel(int id) {
 | 
					    public void cancel(int id) {
 | 
				
			||||||
        final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(mXmppConnectionService);
 | 
					        final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(mXmppConnectionService);
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            notificationManager.cancel(id);
 | 
					            notificationManager.cancel(id);
 | 
				
			||||||
 | 
				
			|||||||
@ -71,6 +71,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
 | 
				
			|||||||
import java.util.concurrent.CountDownLatch;
 | 
					import java.util.concurrent.CountDownLatch;
 | 
				
			||||||
import java.util.concurrent.atomic.AtomicBoolean;
 | 
					import java.util.concurrent.atomic.AtomicBoolean;
 | 
				
			||||||
import java.util.concurrent.atomic.AtomicLong;
 | 
					import java.util.concurrent.atomic.AtomicLong;
 | 
				
			||||||
 | 
					import java.util.concurrent.atomic.AtomicReference;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import eu.siacs.conversations.Config;
 | 
					import eu.siacs.conversations.Config;
 | 
				
			||||||
import eu.siacs.conversations.R;
 | 
					import eu.siacs.conversations.R;
 | 
				
			||||||
@ -142,6 +143,7 @@ import eu.siacs.conversations.xmpp.Patches;
 | 
				
			|||||||
import eu.siacs.conversations.xmpp.XmppConnection;
 | 
					import eu.siacs.conversations.xmpp.XmppConnection;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.chatstate.ChatState;
 | 
					import eu.siacs.conversations.xmpp.chatstate.ChatState;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.forms.Data;
 | 
					import eu.siacs.conversations.xmpp.forms.Data;
 | 
				
			||||||
 | 
					import eu.siacs.conversations.xmpp.jingle.AbstractJingleConnection;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager;
 | 
					import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.jingle.OnJinglePacketReceived;
 | 
					import eu.siacs.conversations.xmpp.jingle.OnJinglePacketReceived;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.jingle.RtpEndUserState;
 | 
					import eu.siacs.conversations.xmpp.jingle.RtpEndUserState;
 | 
				
			||||||
@ -209,6 +211,7 @@ public class XmppConnectionService extends Service {
 | 
				
			|||||||
    private AtomicBoolean mInitialAddressbookSyncCompleted = new AtomicBoolean(false);
 | 
					    private AtomicBoolean mInitialAddressbookSyncCompleted = new AtomicBoolean(false);
 | 
				
			||||||
    private AtomicBoolean mForceForegroundService = new AtomicBoolean(false);
 | 
					    private AtomicBoolean mForceForegroundService = new AtomicBoolean(false);
 | 
				
			||||||
    private AtomicBoolean mForceDuringOnCreate = new AtomicBoolean(false);
 | 
					    private AtomicBoolean mForceDuringOnCreate = new AtomicBoolean(false);
 | 
				
			||||||
 | 
					    private AtomicReference<AbstractJingleConnection.Id> ongoingCall = new AtomicReference<>();
 | 
				
			||||||
    private OnMessagePacketReceived mMessageParser = new MessageParser(this);
 | 
					    private OnMessagePacketReceived mMessageParser = new MessageParser(this);
 | 
				
			||||||
    private OnPresencePacketReceived mPresenceParser = new PresenceParser(this);
 | 
					    private OnPresencePacketReceived mPresenceParser = new PresenceParser(this);
 | 
				
			||||||
    private IqParser mIqParser = new IqParser(this);
 | 
					    private IqParser mIqParser = new IqParser(this);
 | 
				
			||||||
@ -1227,11 +1230,31 @@ public class XmppConnectionService extends Service {
 | 
				
			|||||||
        toggleForegroundService(false);
 | 
					        toggleForegroundService(false);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void setOngoingCall(AbstractJingleConnection.Id id) {
 | 
				
			||||||
 | 
					        ongoingCall.set(id);
 | 
				
			||||||
 | 
					        toggleForegroundService(false);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void removeOngoingCall(AbstractJingleConnection.Id id) {
 | 
				
			||||||
 | 
					        if (ongoingCall.compareAndSet(id, null)) {
 | 
				
			||||||
 | 
					            toggleForegroundService(false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void toggleForegroundService(boolean force) {
 | 
					    private void toggleForegroundService(boolean force) {
 | 
				
			||||||
        final boolean status;
 | 
					        final boolean status;
 | 
				
			||||||
        if (force || mForceDuringOnCreate.get() || mForceForegroundService.get() || (Compatibility.keepForegroundService(this) && hasEnabledAccounts())) {
 | 
					        final AbstractJingleConnection.Id ongoing = ongoingCall.get();
 | 
				
			||||||
            final Notification notification = this.mNotificationService.createForegroundNotification();
 | 
					        if (force || mForceDuringOnCreate.get() || mForceForegroundService.get() || ongoing != null || (Compatibility.keepForegroundService(this) && hasEnabledAccounts())) {
 | 
				
			||||||
            startForeground(NotificationService.FOREGROUND_NOTIFICATION_ID, notification);
 | 
					            final Notification notification;
 | 
				
			||||||
 | 
					            if (ongoing != null) {
 | 
				
			||||||
 | 
					                notification = this.mNotificationService.getOngoingCallNotification(ongoing);
 | 
				
			||||||
 | 
					                startForeground(NotificationService.ONGOING_CALL_NOTIFICATION_ID, notification);
 | 
				
			||||||
 | 
					                mNotificationService.cancel(NotificationService.FOREGROUND_NOTIFICATION_ID);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                notification = this.mNotificationService.createForegroundNotification();
 | 
				
			||||||
 | 
					                startForeground(NotificationService.FOREGROUND_NOTIFICATION_ID, notification);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!mForceForegroundService.get()) {
 | 
					            if (!mForceForegroundService.get()) {
 | 
				
			||||||
                mNotificationService.notify(NotificationService.FOREGROUND_NOTIFICATION_ID, notification);
 | 
					                mNotificationService.notify(NotificationService.FOREGROUND_NOTIFICATION_ID, notification);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -1241,7 +1264,10 @@ public class XmppConnectionService extends Service {
 | 
				
			|||||||
            status = false;
 | 
					            status = false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!mForceForegroundService.get()) {
 | 
					        if (!mForceForegroundService.get()) {
 | 
				
			||||||
            mNotificationService.dismissForcedForegroundNotification(); //if the channel was changed the previous call might fail
 | 
					            mNotificationService.cancel(NotificationService.FOREGROUND_NOTIFICATION_ID);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (ongoing == null) {
 | 
				
			||||||
 | 
					            mNotificationService.cancel(NotificationService.ONGOING_CALL_NOTIFICATION_ID);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Log.d(Config.LOGTAG, "ForegroundService: " + (status ? "on" : "off"));
 | 
					        Log.d(Config.LOGTAG, "ForegroundService: " + (status ? "on" : "off"));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -1253,7 +1279,7 @@ public class XmppConnectionService extends Service {
 | 
				
			|||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void onTaskRemoved(final Intent rootIntent) {
 | 
					    public void onTaskRemoved(final Intent rootIntent) {
 | 
				
			||||||
        super.onTaskRemoved(rootIntent);
 | 
					        super.onTaskRemoved(rootIntent);
 | 
				
			||||||
        if ((Compatibility.keepForegroundService(this) && hasEnabledAccounts()) || mForceForegroundService.get()) {
 | 
					        if ((Compatibility.keepForegroundService(this) && hasEnabledAccounts()) || mForceForegroundService.get() || ongoingCall.get() != null) {
 | 
				
			||||||
            Log.d(Config.LOGTAG, "ignoring onTaskRemoved because foreground service is activated");
 | 
					            Log.d(Config.LOGTAG, "ignoring onTaskRemoved because foreground service is activated");
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            this.logoutAndSave(false);
 | 
					            this.logoutAndSave(false);
 | 
				
			||||||
 | 
				
			|||||||
@ -772,9 +772,9 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private void updateOngoingCallNotification() {
 | 
					    private void updateOngoingCallNotification() {
 | 
				
			||||||
        if (STATES_SHOWING_ONGOING_CALL.contains(this.state)) {
 | 
					        if (STATES_SHOWING_ONGOING_CALL.contains(this.state)) {
 | 
				
			||||||
            xmppConnectionService.getNotificationService().showOngoingCallNotification(id);
 | 
					            xmppConnectionService.setOngoingCall(id);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            xmppConnectionService.getNotificationService().cancelOngoingCallNotification();
 | 
					            xmppConnectionService.removeOngoingCall(id);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user