From 5795998b81c6c4776b9b17c78d8de47fed66a93b Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Mon, 2 Sep 2024 11:17:27 +1000 Subject: [PATCH] Making sure we do not crash when making/receiving a call without the microphone permission --- .../v2/menus/ConversationMenuHelper.kt | 25 +++++++++++++++++++ .../securesms/webrtc/CallMessageProcessor.kt | 9 +++++++ 2 files changed, 34 insertions(+) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt index ca43a8decd..db00899436 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt @@ -1,9 +1,11 @@ package org.thoughtcrime.securesms.conversation.v2.menus +import android.Manifest import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.graphics.BitmapFactory +import android.net.Uri import android.os.AsyncTask import android.view.Menu import android.view.MenuInflater @@ -22,9 +24,11 @@ import network.loki.messenger.R import org.session.libsession.messaging.sending_receiving.MessageSender import org.session.libsession.messaging.sending_receiving.leave import org.session.libsession.utilities.GroupUtil.doubleDecodeGroupID +import org.session.libsession.utilities.StringSubstitutionConstants.APP_NAME_KEY import org.session.libsession.utilities.StringSubstitutionConstants.GROUP_NAME_KEY import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.recipients.Recipient +import org.session.libsignal.utilities.Log import org.session.libsignal.utilities.guava.Optional import org.session.libsignal.utilities.toHexString import org.thoughtcrime.securesms.media.MediaOverviewActivity @@ -36,6 +40,7 @@ import org.thoughtcrime.securesms.conversation.v2.utilities.NotificationUtils import org.thoughtcrime.securesms.dependencies.DatabaseComponent import org.thoughtcrime.securesms.groups.EditClosedGroupActivity import org.thoughtcrime.securesms.groups.EditClosedGroupActivity.Companion.groupIDKey +import org.thoughtcrime.securesms.permissions.Permissions import org.thoughtcrime.securesms.preferences.PrivacySettingsActivity import org.thoughtcrime.securesms.service.WebRtcCallService import org.thoughtcrime.securesms.showMuteDialog @@ -162,6 +167,7 @@ object ConversationMenuHelper { private fun call(context: Context, thread: Recipient) { + // if the user has not enabled voice/video calls if (!TextSecurePreferences.isCallNotificationsEnabled(context)) { context.showSessionDialog { title(R.string.callsPermissionsRequired) @@ -173,6 +179,25 @@ object ConversationMenuHelper { } return } + // or if the user has not granted audio/microphone permissions + else if (!Permissions.hasAll(context, Manifest.permission.RECORD_AUDIO)) { + Log.d("Loki", "Attempted to make a call without audio permissions") + context.showSessionDialog { + title(R.string.permissionsMicrophone) + text(Phrase.from(context, R.string.permissionsMicrophoneAccessRequired) + .put(APP_NAME_KEY, context.getString(R.string.app_name)) + .format().toString()) + button(R.string.sessionSettings, R.string.AccessibilityId_sessionSettings) { + val intent = Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + val uri = Uri.fromParts("package", context.packageName, null) + intent.setData(uri) + context.startActivity(intent) + } + cancelButton() + } + return + } WebRtcCallService.createCall(context, thread) .let(context::startService) 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 376cb41792..d63c33da30 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.Manifest import android.app.NotificationManager import android.content.Context import android.content.Intent @@ -24,6 +25,7 @@ import org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type.OFFER import org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type.PRE_OFFER import org.session.libsignal.protos.SignalServiceProtos.CallMessage.Type.PROVISIONAL_ANSWER import org.session.libsignal.utilities.Log +import org.thoughtcrime.securesms.permissions.Permissions import org.thoughtcrime.securesms.service.WebRtcCallService import org.thoughtcrime.securesms.util.CallNotificationBuilder import org.webrtc.IceCandidate @@ -59,6 +61,7 @@ class CallMessageProcessor(private val context: Context, private val textSecureP Log.i("Loki", "Contact is approved?: $approvedContact") if (!approvedContact && storage.getUserPublicKey() != sender) continue + // if the user has not enabled voice/video calls if (!textSecurePreferences.isCallNotificationsEnabled()) { Log.d("Loki","Dropping call message if call notifications disabled") if (nextMessage.type != PRE_OFFER) continue @@ -73,6 +76,12 @@ class CallMessageProcessor(private val context: Context, private val textSecureP } continue } + // or if the user has not granted audio/microphone permissions + else if (!Permissions.hasAll(context, Manifest.permission.RECORD_AUDIO)) { + Log.d("Loki", "Attempted to receive a call without audio permissions") + //TODO display something to let the user know they missed a call due to missing permission + continue + } val isVeryExpired = (nextMessage.sentTimestamp?:0) + VERY_EXPIRED_TIME < SnodeAPI.nowWithOffset if (isVeryExpired) {