Making sure we do not crash when making/receiving a call without the microphone permission

This commit is contained in:
ThomasSession 2024-09-02 11:17:27 +10:00
parent 139f4ba39c
commit 5795998b81
2 changed files with 34 additions and 0 deletions

View File

@ -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)

View File

@ -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) {