diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/CallNotificationBuilder.kt b/app/src/main/java/org/thoughtcrime/securesms/util/CallNotificationBuilder.kt index 4f9b5034fe..971e60493e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/CallNotificationBuilder.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/CallNotificationBuilder.kt @@ -11,6 +11,7 @@ import network.loki.messenger.R import org.session.libsession.utilities.recipients.Recipient import org.thoughtcrime.securesms.calls.WebRtcCallActivity import org.thoughtcrime.securesms.notifications.NotificationChannels +import org.thoughtcrime.securesms.preferences.SettingsActivity import org.thoughtcrime.securesms.service.WebRtcCallService class CallNotificationBuilder { @@ -24,6 +25,26 @@ class CallNotificationBuilder { const val TYPE_INCOMING_CONNECTING = 4 const val TYPE_INCOMING_PRE_OFFER = 5 + @JvmStatic + fun getFirstCallNotification(context: Context): Notification { + val contentIntent = Intent(context, SettingsActivity::class.java) + + val pendingIntent = PendingIntent.getActivity(context, 0, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + + val text = context.getString(R.string.CallNotificationBuilder_first_call_message) + + val builder = NotificationCompat.Builder(context, NotificationChannels.CALLS) + .setSound(null) + .setSmallIcon(R.drawable.ic_baseline_call_24) + .setContentIntent(pendingIntent) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setContentTitle(context.getString(R.string.CallNotificationBuilder_first_call_title)) + .setContentText(text) + .setStyle(NotificationCompat.BigTextStyle().bigText(text)) + + return builder.build() + } + @JvmStatic fun getCallInProgressNotification(context: Context, type: Int, recipient: Recipient?): Notification { val contentIntent = Intent(context, WebRtcCallActivity::class.java) diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallMessageProcessor.kt index 58a57f6b84..e479b628cf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallMessageProcessor.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.webrtc +import android.app.NotificationManager import android.content.Context import androidx.core.content.ContextCompat import androidx.lifecycle.Lifecycle @@ -16,6 +17,7 @@ import org.session.libsession.utilities.TextSecurePreferences import org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type.* import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.service.WebRtcCallService +import org.thoughtcrime.securesms.util.CallNotificationBuilder import org.webrtc.IceCandidate @@ -31,6 +33,11 @@ class CallMessageProcessor(private val context: Context, lifecycle: Lifecycle, p if (nextMessage.type != PRE_OFFER) continue val sentTimestamp = nextMessage.sentTimestamp ?: continue val sender = nextMessage.sender ?: continue + if (TextSecurePreferences.setShownCallNotification(context)) { + // first time call notification encountered + val notification = CallNotificationBuilder.getFirstCallNotification(context) + context.getSystemService(NotificationManager::class.java).notify(CallNotificationBuilder.WEBRTC_NOTIFICATION, notification) + } insertMissedCall(sender, sentTimestamp) continue } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 59db0054fb..db7c525ec3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -917,5 +917,7 @@ Allow access to accept voice and video calls from other users Voice / video calls The current implementation of voice / video calls will expose your IP address to the Oxen Foundation servers and the calling / called user + Call Missed + You missed a call because you need to enable the \'Voice and video calls\' permission in the Privacy Settings. diff --git a/libsession/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt b/libsession/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt index 9d6763c8c3..d03cbd1d6d 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt +++ b/libsession/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt @@ -90,7 +90,8 @@ object TextSecurePreferences { private const val LAST_PROFILE_UPDATE_TIME = "pref_last_profile_update_time" private const val LAST_OPEN_DATE = "pref_last_open_date" const val CALL_NOTIFICATIONS_ENABLED = "pref_call_notifications_enabled" - private const val SHOWN_CALL_WARNING = "pref_shown_call_warning" + private const val SHOWN_CALL_WARNING = "pref_shown_call_warning" // call warning is user-facing warning of enabling calls + private const val SHOWN_CALL_NOTIFICATION = "pref_shown_call_notification" // call notification is a promp to check privacy settings @JvmStatic fun getLastConfigurationSyncTime(context: Context): Long { @@ -744,6 +745,15 @@ object TextSecurePreferences { return getBooleanPreference(context, CALL_NOTIFICATIONS_ENABLED, false) } + @JvmStatic + fun setShownCallNotification(context: Context): Boolean { + val previousValue = getBooleanPreference(context, SHOWN_CALL_NOTIFICATION, false) + if (previousValue) return false + val setValue = true + setBooleanPreference(context, SHOWN_CALL_NOTIFICATION, setValue) + return previousValue != setValue + } + /** * Set the SHOWN_CALL_WARNING preference to `true`