diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 52a16b345d..8250b616b2 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -86,6 +86,7 @@ + = 29 && !ApplicationContext.getInstance(getApplicationContext()).isAppVisible()) { + return; + } + Intent activityIntent = new Intent(); activityIntent.setClass(this, WebRtcCallActivity.class); activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); diff --git a/src/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java b/src/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java index 86dd848a30..dfd799b4ed 100644 --- a/src/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java +++ b/src/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java @@ -4,16 +4,20 @@ import android.app.Notification; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.os.Build; + import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; +import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.WebRtcCallActivity; import org.thoughtcrime.securesms.notifications.NotificationChannels; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.service.WebRtcCallService; +import org.thoughtcrime.securesms.util.TextSecurePreferences; /** * Manages the state of the WebRtc items in the Android notification bar. @@ -24,25 +28,25 @@ import org.thoughtcrime.securesms.service.WebRtcCallService; public class CallNotificationBuilder { - public static final int WEBRTC_NOTIFICATION = 313388; + private static final int WEBRTC_NOTIFICATION = 313388; + private static final int WEBRTC_NOTIFICATION_RINGING = 313389; public static final int TYPE_INCOMING_RINGING = 1; public static final int TYPE_OUTGOING_RINGING = 2; public static final int TYPE_ESTABLISHED = 3; public static final int TYPE_INCOMING_CONNECTING = 4; - public static Notification getCallInProgressNotification(Context context, int type, Recipient recipient) { Intent contentIntent = new Intent(context, WebRtcCallActivity.class); contentIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, contentIntent, 0); - NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NotificationChannels.CALLS) - .setSmallIcon(R.drawable.ic_call_secure_white_24dp) - .setContentIntent(pendingIntent) - .setOngoing(true) - .setContentTitle(recipient.getName()); + NotificationCompat.Builder builder = new NotificationCompat.Builder(context, getNotificationChannel(context, type)) + .setSmallIcon(R.drawable.ic_call_secure_white_24dp) + .setContentIntent(pendingIntent) + .setOngoing(true) + .setContentTitle(recipient.getName()); if (type == TYPE_INCOMING_CONNECTING) { builder.setContentText(context.getString(R.string.CallNotificationBuilder_connecting)); @@ -51,6 +55,12 @@ public class CallNotificationBuilder { builder.setContentText(context.getString(R.string.NotificationBarManager__incoming_signal_call)); builder.addAction(getServiceNotificationAction(context, WebRtcCallService.ACTION_DENY_CALL, R.drawable.ic_close_grey600_32dp, R.string.NotificationBarManager__deny_call)); builder.addAction(getActivityNotificationAction(context, WebRtcCallActivity.ANSWER_ACTION, R.drawable.ic_phone_grey600_32dp, R.string.NotificationBarManager__answer_call)); + + if (callActivityRestricted(context)) { + builder.setFullScreenIntent(pendingIntent, true); + builder.setPriority(NotificationCompat.PRIORITY_HIGH); + builder.setCategory(NotificationCompat.CATEGORY_CALL); + } } else if (type == TYPE_OUTGOING_RINGING) { builder.setContentText(context.getString(R.string.NotificationBarManager__establishing_signal_call)); builder.addAction(getServiceNotificationAction(context, WebRtcCallService.ACTION_LOCAL_HANGUP, R.drawable.ic_call_end_grey600_32dp, R.string.NotificationBarManager__cancel_call)); @@ -62,6 +72,27 @@ public class CallNotificationBuilder { return builder.build(); } + public static int getNotificationId(@NonNull Context context, int type) { + if (callActivityRestricted(context) && type == TYPE_INCOMING_RINGING) { + return WEBRTC_NOTIFICATION_RINGING; + } else { + return WEBRTC_NOTIFICATION; + } + } + + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + public static boolean isWebRtcNotification(int notificationId) { + return notificationId == WEBRTC_NOTIFICATION || notificationId == WEBRTC_NOTIFICATION_RINGING; + } + + private static @NonNull String getNotificationChannel(@NonNull Context context, int type) { + if (callActivityRestricted(context) && type == TYPE_INCOMING_RINGING) { + return NotificationChannels.CALLS; + } else { + return NotificationChannels.OTHER; + } + } + private static NotificationCompat.Action getServiceNotificationAction(Context context, String action, int iconResId, int titleResId) { Intent intent = new Intent(context, WebRtcCallService.class); intent.setAction(action); @@ -81,4 +112,8 @@ public class CallNotificationBuilder { return new NotificationCompat.Action(iconResId, context.getString(titleResId), pendingIntent); } + + private static boolean callActivityRestricted(@NonNull Context context) { + return Build.VERSION.SDK_INT >= 29 && !ApplicationContext.getInstance(context).isAppVisible(); + } }