Request permission before call when call notifications is already approved

pull/1467/head
Andrew 2 months ago
parent fa933c7795
commit 56bb25c137

@ -1,8 +1,11 @@
package org.thoughtcrime.securesms.conversation.v2.menus
import android.Manifest.permission.RECORD_AUDIO
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.graphics.BitmapFactory
import android.os.AsyncTask
import android.view.Menu
@ -13,6 +16,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ContextThemeWrapper
import androidx.appcompat.widget.SearchView
import androidx.appcompat.widget.SearchView.OnQueryTextListener
import androidx.core.content.ContextCompat
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.drawable.IconCompat
@ -33,7 +37,9 @@ 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.preferences.requestMicrophonePermission
import org.thoughtcrime.securesms.service.WebRtcCallService
import org.thoughtcrime.securesms.showMuteDialog
import org.thoughtcrime.securesms.showSessionDialog
@ -126,7 +132,7 @@ object ConversationMenuHelper {
})
}
fun onOptionItemSelected(context: Context, item: MenuItem, thread: Recipient): Boolean {
fun onOptionItemSelected(context: Activity, item: MenuItem, thread: Recipient): Boolean {
when (item.itemId) {
R.id.menu_view_all_media -> { showAllMedia(context, thread) }
R.id.menu_search -> { search(context) }
@ -160,10 +166,10 @@ object ConversationMenuHelper {
searchViewModel.onSearchOpened()
}
private fun call(context: Context, thread: Recipient) {
private fun call(activity: Activity, thread: Recipient) {
if (!TextSecurePreferences.isCallNotificationsEnabled(context)) {
context.showSessionDialog {
if (!TextSecurePreferences.isCallNotificationsEnabled(activity)) {
activity.showSessionDialog {
title(R.string.ConversationActivity_call_title)
text(R.string.ConversationActivity_call_prompt)
button(R.string.activity_settings_title, R.string.AccessibilityId_settings) {
@ -174,12 +180,17 @@ object ConversationMenuHelper {
return
}
WebRtcCallService.createCall(context, thread)
.let(context::startService)
if (ContextCompat.checkSelfPermission(activity, RECORD_AUDIO) != PERMISSION_GRANTED) {
activity.requestMicrophonePermission { if (it) call(activity, thread) }
return
}
WebRtcCallService.createCall(activity, thread)
.let(activity::startService)
Intent(context, WebRtcCallActivity::class.java)
Intent(activity, WebRtcCallActivity::class.java)
.apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK }
.let(context::startActivity)
.let(activity::startActivity)
}

@ -1,6 +1,8 @@
package org.thoughtcrime.securesms.preferences
import android.Manifest
import android.app.Activity
import android.content.Context
import androidx.fragment.app.Fragment
import androidx.preference.Preference
import network.loki.messenger.R
@ -10,36 +12,47 @@ import org.thoughtcrime.securesms.permissions.Permissions
import org.thoughtcrime.securesms.showSessionDialog
internal class CallToggleListener(
private val context: Fragment,
private val setCallback: (Boolean) -> Unit
private val fragment: Fragment,
private val callback: (Boolean) -> Unit
) : Preference.OnPreferenceChangeListener {
override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
if (newValue == false) return true
// check if we've shown the info dialog and check for microphone permissions
context.showSessionDialog {
fragment.showSessionDialog {
title(R.string.dialog_voice_video_title)
text(R.string.dialog_voice_video_message)
button(R.string.dialog_link_preview_enable_button_title, R.string.AccessibilityId_enable) { requestMicrophonePermission() }
button(R.string.dialog_link_preview_enable_button_title, R.string.AccessibilityId_enable) { fragment.requestMicrophonePermission(callback) }
cancelButton()
}
return false
}
}
private fun requestMicrophonePermission() {
Permissions.with(context)
.request(Manifest.permission.RECORD_AUDIO)
.onAllGranted {
setBooleanPreference(
context.requireContext(),
TextSecurePreferences.CALL_NOTIFICATIONS_ENABLED,
true
)
setCallback(true)
}
.onAnyDenied { setCallback(false) }
.execute()
}
fun Fragment.requestMicrophonePermission(callback: (Boolean) -> Unit) {
requireContext().requestMicrophonePermission(Permissions.with(this), callback)
}
fun Activity.requestMicrophonePermission(callback: (Boolean) -> Unit) {
requestMicrophonePermission(Permissions.with(this), callback)
}
fun Context.requestMicrophonePermission(
permissions: Permissions.PermissionsBuilder,
callback: (Boolean) -> Unit
) {
permissions
.request(Manifest.permission.RECORD_AUDIO)
.onAllGranted {
setBooleanPreference(
this,
TextSecurePreferences.CALL_NOTIFICATIONS_ENABLED,
true
)
callback(true)
}
.onAnyDenied { callback(false) }
.execute()
}

Loading…
Cancel
Save