From 68d3ef3699c45a4d3d4517892db04c1962b27e4e Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Sat, 19 Apr 2025 09:50:32 +0300 Subject: [PATCH] Fixed back press action for API < 33 compatibility --- .../com/tutpro/baresip/AboutActivity.kt | 37 +++++++++------- .../com/tutpro/baresip/AccountActivity.kt | 38 +++++++++------- .../com/tutpro/baresip/AccountsActivity.kt | 37 +++++++++------- .../tutpro/baresip/AndroidContactActivity.kt | 37 +++++++++------- .../com/tutpro/baresip/AudioActivity.kt | 37 +++++++++------- .../tutpro/baresip/BaresipContactActivity.kt | 37 +++++++++------- .../com/tutpro/baresip/CallDetailsActivity.kt | 37 +++++++++------- .../com/tutpro/baresip/CallsActivity.kt | 37 +++++++++------- .../kotlin/com/tutpro/baresip/ChatActivity.kt | 37 +++++++++------- .../com/tutpro/baresip/ChatsActivity.kt | 43 +++++++++++-------- .../com/tutpro/baresip/CodecsActivity.kt | 37 +++++++++------- .../com/tutpro/baresip/ConfigActivity.kt | 38 +++++++++------- .../com/tutpro/baresip/ContactsActivity.kt | 37 +++++++++------- .../kotlin/com/tutpro/baresip/MainActivity.kt | 36 ++++++++++------ 14 files changed, 310 insertions(+), 215 deletions(-) diff --git a/app/src/main/kotlin/com/tutpro/baresip/AboutActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/AboutActivity.kt index f10e044f..5071547f 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/AboutActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/AboutActivity.kt @@ -9,6 +9,7 @@ import androidx.activity.ComponentActivity import androidx.activity.OnBackPressedCallback import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.annotation.RequiresApi import androidx.compose.foundation.background import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding @@ -37,14 +38,16 @@ import androidx.compose.ui.unit.dp class AboutActivity : ComponentActivity() { - private val backInvokedCallback = OnBackInvokedCallback { - goBack() - } + private var backInvokedCallback: OnBackInvokedCallback? = null + private lateinit var onBackPressedCallback: OnBackPressedCallback - private val onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - goBack() - } + @RequiresApi(33) + private fun registerBackInvokedCallback() { + backInvokedCallback = OnBackInvokedCallback { goBack() } + onBackInvokedDispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, + backInvokedCallback!! + ) } override fun onCreate(savedInstanceState: Bundle?) { @@ -54,12 +57,15 @@ class AboutActivity : ComponentActivity() { enableEdgeToEdge() if (Build.VERSION.SDK_INT >= 33) - onBackInvokedDispatcher.registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_DEFAULT, - backInvokedCallback - ) - else + registerBackInvokedCallback() + else { + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goBack() + } + } onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } Utils.addActivity("about") @@ -128,10 +134,11 @@ class AboutActivity : ComponentActivity() { override fun onDestroy() { if (Build.VERSION.SDK_INT >= 33) { - onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback) - } else { - onBackPressedCallback.remove() + if (backInvokedCallback != null) + onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!) } + else + onBackPressedCallback.remove() super.onDestroy() } diff --git a/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt index fdd5d77a..ce1a0f54 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt @@ -10,6 +10,7 @@ import androidx.activity.ComponentActivity import androidx.activity.OnBackPressedCallback import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.annotation.RequiresApi import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -136,14 +137,16 @@ class AccountActivity : ComponentActivity() { private val showAlert = mutableStateOf(false) private val showStun = mutableStateOf(false) - private val backInvokedCallback = OnBackInvokedCallback { - goBack() - } + private var backInvokedCallback: OnBackInvokedCallback? = null + private lateinit var onBackPressedCallback: OnBackPressedCallback - private val onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - goBack() - } + @RequiresApi(33) + private fun registerBackInvokedCallback() { + backInvokedCallback = OnBackInvokedCallback { goBack() } + onBackInvokedDispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, + backInvokedCallback!! + ) } override fun onCreate(savedInstanceState: Bundle?) { @@ -153,12 +156,15 @@ class AccountActivity : ComponentActivity() { enableEdgeToEdge() if (Build.VERSION.SDK_INT >= 33) - onBackInvokedDispatcher.registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_DEFAULT, - backInvokedCallback - ) - else + registerBackInvokedCallback() + else { + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goBack() + } + } onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } aor = intent.getStringExtra("aor")!! @@ -1234,7 +1240,6 @@ class AccountActivity : ComponentActivity() { } } - @OptIn(ExperimentalMaterial3Api::class) @Composable fun AskPassword(ctx: Context) { if (showPasswordDialog.value) @@ -1632,10 +1637,11 @@ class AccountActivity : ComponentActivity() { override fun onDestroy() { if (Build.VERSION.SDK_INT >= 33) { - onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback) - } else { - onBackPressedCallback.remove() + if (backInvokedCallback != null) + onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!) } + else + onBackPressedCallback.remove() super.onDestroy() } diff --git a/app/src/main/kotlin/com/tutpro/baresip/AccountsActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/AccountsActivity.kt index 5998928d..5b95d59f 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/AccountsActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/AccountsActivity.kt @@ -11,6 +11,7 @@ import androidx.activity.ComponentActivity import androidx.activity.OnBackPressedCallback import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.annotation.RequiresApi import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -85,14 +86,16 @@ class AccountsActivity : ComponentActivity() { private val alertMessage = mutableStateOf("") private val showAlert = mutableStateOf(false) - private val backInvokedCallback = OnBackInvokedCallback { - goBack() - } + private var backInvokedCallback: OnBackInvokedCallback? = null + private lateinit var onBackPressedCallback: OnBackPressedCallback - private val onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - goBack() - } + @RequiresApi(33) + private fun registerBackInvokedCallback() { + backInvokedCallback = OnBackInvokedCallback { goBack() } + onBackInvokedDispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, + backInvokedCallback!! + ) } public override fun onCreate(savedInstanceState: Bundle?) { @@ -102,12 +105,15 @@ class AccountsActivity : ComponentActivity() { enableEdgeToEdge() if (Build.VERSION.SDK_INT >= 33) - onBackInvokedDispatcher.registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_DEFAULT, - backInvokedCallback - ) - else + registerBackInvokedCallback() + else { + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goBack() + } + } onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } val title = String.format(getString(R.string.accounts)) @@ -482,10 +488,11 @@ class AccountsActivity : ComponentActivity() { override fun onDestroy() { if (Build.VERSION.SDK_INT >= 33) { - onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback) - } else { - onBackPressedCallback.remove() + if (backInvokedCallback != null) + onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!) } + else + onBackPressedCallback.remove() super.onDestroy() } diff --git a/app/src/main/kotlin/com/tutpro/baresip/AndroidContactActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/AndroidContactActivity.kt index 6bbe6f40..dc792e09 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/AndroidContactActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/AndroidContactActivity.kt @@ -12,6 +12,7 @@ import androidx.activity.ComponentActivity import androidx.activity.OnBackPressedCallback import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.annotation.RequiresApi import androidx.compose.foundation.Canvas import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -64,14 +65,16 @@ class AndroidContactActivity : ComponentActivity() { private var color = 0 - private val backInvokedCallback = OnBackInvokedCallback { - goBack() - } + private var backInvokedCallback: OnBackInvokedCallback? = null + private lateinit var onBackPressedCallback: OnBackPressedCallback - private val onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - goBack() - } + @RequiresApi(33) + private fun registerBackInvokedCallback() { + backInvokedCallback = OnBackInvokedCallback { goBack() } + onBackInvokedDispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, + backInvokedCallback!! + ) } override fun onCreate(savedInstanceState: Bundle?) { @@ -81,12 +84,15 @@ class AndroidContactActivity : ComponentActivity() { enableEdgeToEdge() if (Build.VERSION.SDK_INT >= 33) - onBackInvokedDispatcher.registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_DEFAULT, - backInvokedCallback - ) - else + registerBackInvokedCallback() + else { + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goBack() + } + } onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } aor = intent.getStringExtra("aor")!! name = intent.getStringExtra("name")!! @@ -283,10 +289,11 @@ class AndroidContactActivity : ComponentActivity() { override fun onDestroy() { if (Build.VERSION.SDK_INT >= 33) { - onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback) - } else { - onBackPressedCallback.remove() + if (backInvokedCallback != null) + onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!) } + else + onBackPressedCallback.remove() super.onDestroy() } diff --git a/app/src/main/kotlin/com/tutpro/baresip/AudioActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/AudioActivity.kt index 6494f316..83941801 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/AudioActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/AudioActivity.kt @@ -8,6 +8,7 @@ import androidx.activity.ComponentActivity import androidx.activity.OnBackPressedCallback import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.annotation.RequiresApi import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -80,14 +81,16 @@ class AudioActivity : ComponentActivity() { private val alertMessage = mutableStateOf("") private val showAlert = mutableStateOf(false) - private val backInvokedCallback = OnBackInvokedCallback { - goBack() - } + private var backInvokedCallback: OnBackInvokedCallback? = null + private lateinit var onBackPressedCallback: OnBackPressedCallback - private val onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - goBack() - } + @RequiresApi(33) + private fun registerBackInvokedCallback() { + backInvokedCallback = OnBackInvokedCallback { goBack() } + onBackInvokedDispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, + backInvokedCallback!! + ) } override fun onCreate(savedInstanceState: Bundle?) { @@ -97,12 +100,15 @@ class AudioActivity : ComponentActivity() { enableEdgeToEdge() if (Build.VERSION.SDK_INT >= 33) - onBackInvokedDispatcher.registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_DEFAULT, - backInvokedCallback - ) - else + registerBackInvokedCallback() + else { + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goBack() + } + } onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } val title = String.format(getString(R.string.configuration)) @@ -657,10 +663,11 @@ class AudioActivity : ComponentActivity() { override fun onDestroy() { if (Build.VERSION.SDK_INT >= 33) { - onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback) - } else { - onBackPressedCallback.remove() + if (backInvokedCallback != null) + onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!) } + else + onBackPressedCallback.remove() super.onDestroy() } diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipContactActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipContactActivity.kt index eb8e91aa..dc169988 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BaresipContactActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipContactActivity.kt @@ -22,6 +22,7 @@ import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.RequiresApi import androidx.compose.foundation.Canvas import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image @@ -108,14 +109,16 @@ class BaresipContactActivity : ComponentActivity() { private val textAvatarColor = mutableIntStateOf(0) private val imageAvatarUri = mutableStateOf("") - private val backInvokedCallback = OnBackInvokedCallback { - goBack() - } + private var backInvokedCallback: OnBackInvokedCallback? = null + private lateinit var onBackPressedCallback: OnBackPressedCallback - private val onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - goBack() - } + @RequiresApi(33) + private fun registerBackInvokedCallback() { + backInvokedCallback = OnBackInvokedCallback { goBack() } + onBackInvokedDispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, + backInvokedCallback!! + ) } public override fun onCreate(savedInstanceState: Bundle?) { @@ -125,12 +128,15 @@ class BaresipContactActivity : ComponentActivity() { enableEdgeToEdge() if (Build.VERSION.SDK_INT >= 33) - onBackInvokedDispatcher.registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_DEFAULT, - backInvokedCallback - ) - else + registerBackInvokedCallback() + else { + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goBack() + } + } onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } val title: String @@ -702,10 +708,11 @@ class BaresipContactActivity : ComponentActivity() { override fun onDestroy() { if (Build.VERSION.SDK_INT >= 33) { - onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback) - } else { - onBackPressedCallback.remove() + if (backInvokedCallback != null) + onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!) } + else + onBackPressedCallback.remove() super.onDestroy() } diff --git a/app/src/main/kotlin/com/tutpro/baresip/CallDetailsActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/CallDetailsActivity.kt index 28ad24db..dff8516d 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/CallDetailsActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/CallDetailsActivity.kt @@ -12,6 +12,7 @@ import androidx.activity.ComponentActivity import androidx.activity.OnBackPressedCallback import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.annotation.RequiresApi import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -70,14 +71,16 @@ class CallDetailsActivity : ComponentActivity() { private val encPlayer = MediaPlayer() private var position = 0 - private val backInvokedCallback = OnBackInvokedCallback { - goBack() - } + private var backInvokedCallback: OnBackInvokedCallback? = null + private lateinit var onBackPressedCallback: OnBackPressedCallback - private val onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - goBack() - } + @RequiresApi(33) + private fun registerBackInvokedCallback() { + backInvokedCallback = OnBackInvokedCallback { goBack() } + onBackInvokedDispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, + backInvokedCallback!! + ) } override fun onCreate(savedInstanceState: Bundle?) { @@ -87,12 +90,15 @@ class CallDetailsActivity : ComponentActivity() { enableEdgeToEdge() if (Build.VERSION.SDK_INT >= 33) - onBackInvokedDispatcher.registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_DEFAULT, - backInvokedCallback - ) - else + registerBackInvokedCallback() + else { + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goBack() + } + } onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } aor = intent.getStringExtra("aor")!! account = Account.ofAor(aor)!! @@ -377,10 +383,11 @@ class CallDetailsActivity : ComponentActivity() { override fun onDestroy() { if (Build.VERSION.SDK_INT >= 33) { - onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback) - } else { - onBackPressedCallback.remove() + if (backInvokedCallback != null) + onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!) } + else + onBackPressedCallback.remove() super.onDestroy() } diff --git a/app/src/main/kotlin/com/tutpro/baresip/CallsActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/CallsActivity.kt index 841c209a..db5af0a6 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/CallsActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/CallsActivity.kt @@ -12,6 +12,7 @@ import androidx.activity.ComponentActivity import androidx.activity.OnBackPressedCallback import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.annotation.RequiresApi import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -73,14 +74,16 @@ class CallsActivity : ComponentActivity() { private var aor = "" - private val backInvokedCallback = OnBackInvokedCallback { - goBack() - } + private var backInvokedCallback: OnBackInvokedCallback? = null + private lateinit var onBackPressedCallback: OnBackPressedCallback - private val onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - goBack() - } + @RequiresApi(33) + private fun registerBackInvokedCallback() { + backInvokedCallback = OnBackInvokedCallback { goBack() } + onBackInvokedDispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, + backInvokedCallback!! + ) } public override fun onCreate(savedInstanceState: Bundle?) { @@ -90,12 +93,15 @@ class CallsActivity : ComponentActivity() { enableEdgeToEdge() if (Build.VERSION.SDK_INT >= 33) - onBackInvokedDispatcher.registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_DEFAULT, - backInvokedCallback - ) - else + registerBackInvokedCallback() + else { + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goBack() + } + } onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } val title = String.format(getString(R.string.call_history)) @@ -463,10 +469,11 @@ class CallsActivity : ComponentActivity() { override fun onDestroy() { if (Build.VERSION.SDK_INT >= 33) { - onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback) - } else { - onBackPressedCallback.remove() + if (backInvokedCallback != null) + onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!) } + else + onBackPressedCallback.remove() super.onDestroy() } diff --git a/app/src/main/kotlin/com/tutpro/baresip/ChatActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ChatActivity.kt index 50f5bf49..c9814ade 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ChatActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ChatActivity.kt @@ -14,6 +14,7 @@ import androidx.activity.ComponentActivity import androidx.activity.OnBackPressedCallback import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.annotation.RequiresApi import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.clickable @@ -101,14 +102,16 @@ class ChatActivity : ComponentActivity() { private var unsentMessage = "" private var keyboardController: SoftwareKeyboardController? = null - private val backInvokedCallback = OnBackInvokedCallback { - goBack() - } + private var backInvokedCallback: OnBackInvokedCallback? = null + private lateinit var onBackPressedCallback: OnBackPressedCallback - private val onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - goBack() - } + @RequiresApi(33) + private fun registerBackInvokedCallback() { + backInvokedCallback = OnBackInvokedCallback { goBack() } + onBackInvokedDispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, + backInvokedCallback!! + ) } override fun onCreate(savedInstanceState: Bundle?) { @@ -118,12 +121,15 @@ class ChatActivity : ComponentActivity() { enableEdgeToEdge() if (Build.VERSION.SDK_INT >= 33) - onBackInvokedDispatcher.registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_DEFAULT, - backInvokedCallback - ) - else + registerBackInvokedCallback() + else { + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goBack() + } + } onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } aor = intent.getStringExtra("aor")!! peerUri = intent.getStringExtra("peer")!! @@ -637,10 +643,11 @@ class ChatActivity : ComponentActivity() { override fun onDestroy() { if (Build.VERSION.SDK_INT >= 33) { - onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback) - } else { - onBackPressedCallback.remove() + if (backInvokedCallback != null) + onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!) } + else + onBackPressedCallback.remove() super.onDestroy() } diff --git a/app/src/main/kotlin/com/tutpro/baresip/ChatsActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ChatsActivity.kt index 1edf2dd9..bd35d34d 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ChatsActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ChatsActivity.kt @@ -14,8 +14,8 @@ import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.RequiresApi import androidx.compose.animation.animateContentSize -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -102,14 +102,16 @@ class ChatsActivity: ComponentActivity() { private val alertMessage = mutableStateOf("") private val showAlert = mutableStateOf(false) - private val backInvokedCallback = OnBackInvokedCallback { - goBack() - } + private var backInvokedCallback: OnBackInvokedCallback? = null + private lateinit var onBackPressedCallback: OnBackPressedCallback - private val onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - goBack() - } + @RequiresApi(33) + private fun registerBackInvokedCallback() { + backInvokedCallback = OnBackInvokedCallback { goBack() } + onBackInvokedDispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, + backInvokedCallback!! + ) } public override fun onCreate(savedInstanceState: Bundle?) { @@ -119,12 +121,15 @@ class ChatsActivity: ComponentActivity() { enableEdgeToEdge() if (Build.VERSION.SDK_INT >= 33) - onBackInvokedDispatcher.registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_DEFAULT, - backInvokedCallback - ) - else + registerBackInvokedCallback() + else { + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goBack() + } + } onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } aor = intent.extras!!.getString("aor")!! Utils.addActivity("chats,$aor") @@ -285,7 +290,6 @@ class ChatsActivity: ComponentActivity() { ) } - @OptIn(ExperimentalFoundationApi::class) @Composable fun Chats(ctx: Context, account: Account) { @@ -475,7 +479,7 @@ class ChatsActivity: ComponentActivity() { val showDialog = remember { mutableStateOf(false) } val items = remember { mutableStateOf(listOf()) } - val itemAction = remember { mutableStateOf<(Int) -> Unit>({ index -> {} }) } + val itemAction = remember { mutableStateOf<(Int) -> Unit>({ _ -> run {} }) } SelectableAlertDialog( openDialog = showDialog, @@ -609,7 +613,7 @@ class ChatsActivity: ComponentActivity() { modifier = Modifier.padding(end = 4.dp), onClick = { showSuggestions = false - var peerText = newPeer.trim() + val peerText = newPeer.trim() if (peerText.isNotEmpty()) { val uris = Contact.contactUris(peerText) if (uris.isEmpty()) @@ -684,10 +688,11 @@ class ChatsActivity: ComponentActivity() { override fun onDestroy() { if (Build.VERSION.SDK_INT >= 33) { - onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback) - } else { - onBackPressedCallback.remove() + if (backInvokedCallback != null) + onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!) } + else + onBackPressedCallback.remove() super.onDestroy() } diff --git a/app/src/main/kotlin/com/tutpro/baresip/CodecsActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/CodecsActivity.kt index 00f86716..83d583d4 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/CodecsActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/CodecsActivity.kt @@ -8,6 +8,7 @@ import androidx.activity.ComponentActivity import androidx.activity.OnBackPressedCallback import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.annotation.RequiresApi import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -68,14 +69,16 @@ class CodecsActivity : ComponentActivity() { private val alertMessage = mutableStateOf("") private val showAlert = mutableStateOf(false) - private val backInvokedCallback = OnBackInvokedCallback { - goBack() - } + private var backInvokedCallback: OnBackInvokedCallback? = null + private lateinit var onBackPressedCallback: OnBackPressedCallback - private val onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - goBack() - } + @RequiresApi(33) + private fun registerBackInvokedCallback() { + backInvokedCallback = OnBackInvokedCallback { goBack() } + onBackInvokedDispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, + backInvokedCallback!! + ) } override fun onCreate(savedInstanceState: Bundle?) { @@ -85,12 +88,15 @@ class CodecsActivity : ComponentActivity() { enableEdgeToEdge() if (Build.VERSION.SDK_INT >= 33) - onBackInvokedDispatcher.registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_DEFAULT, - backInvokedCallback - ) - else + registerBackInvokedCallback() + else { + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goBack() + } + } onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } aor = intent.getStringExtra("aor")!! media = intent.getStringExtra("media")!! @@ -368,10 +374,11 @@ class CodecsActivity : ComponentActivity() { override fun onDestroy() { if (Build.VERSION.SDK_INT >= 33) { - onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback) - } else { - onBackPressedCallback.remove() + if (backInvokedCallback != null) + onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!) } + else + onBackPressedCallback.remove() super.onDestroy() } } diff --git a/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt index c6874bcf..750ebc29 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt @@ -130,14 +130,16 @@ class ConfigActivity : ComponentActivity() { private val onNegativeClicked = mutableStateOf({}) private val showDialog = mutableStateOf(false) - private val backInvokedCallback = OnBackInvokedCallback { - goBack() - } + private var backInvokedCallback: OnBackInvokedCallback? = null + private lateinit var onBackPressedCallback: OnBackPressedCallback - private val onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - goBack() - } + @RequiresApi(33) + private fun registerBackInvokedCallback() { + backInvokedCallback = OnBackInvokedCallback { goBack() } + onBackInvokedDispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, + backInvokedCallback!! + ) } private val certificateRequest = @@ -207,12 +209,15 @@ class ConfigActivity : ComponentActivity() { enableEdgeToEdge() if (Build.VERSION.SDK_INT >= 33) - onBackInvokedDispatcher.registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_DEFAULT, - backInvokedCallback - ) - else + registerBackInvokedCallback() + else { + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goBack() + } + } onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } val title = String.format(getString(R.string.configuration)) @@ -1245,7 +1250,7 @@ class ConfigActivity : ComponentActivity() { baresipService.action = "Stop Content Observer" } "android" -> { - BaresipService.baresipContacts.value = mutableListOf() + BaresipService.baresipContacts.value = mutableListOf() Contact.loadAndroidContacts(this) baresipService.action = "Start Content Observer" } @@ -1297,10 +1302,11 @@ class ConfigActivity : ComponentActivity() { override fun onDestroy() { if (Build.VERSION.SDK_INT >= 33) { - onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback) - } else { - onBackPressedCallback.remove() + if (backInvokedCallback != null) + onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!) } + else + onBackPressedCallback.remove() super.onDestroy() } diff --git a/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt index 81c47d8c..4ec15d1a 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt @@ -15,6 +15,7 @@ import androidx.activity.OnBackPressedCallback import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.RequiresApi import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -74,14 +75,16 @@ class ContactsActivity : ComponentActivity() { private var newAndroidName: String? = null private var lastClick: Long = 0 - private val backInvokedCallback = OnBackInvokedCallback { - goBack() - } + private var backInvokedCallback: OnBackInvokedCallback? = null + private lateinit var onBackPressedCallback: OnBackPressedCallback - private val onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - goBack() - } + @RequiresApi(33) + private fun registerBackInvokedCallback() { + backInvokedCallback = OnBackInvokedCallback { goBack() } + onBackInvokedDispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, + backInvokedCallback!! + ) } private val contactRequest = @@ -99,12 +102,15 @@ class ContactsActivity : ComponentActivity() { enableEdgeToEdge() if (Build.VERSION.SDK_INT >= 33) - onBackInvokedDispatcher.registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_DEFAULT, - backInvokedCallback - ) - else + registerBackInvokedCallback() + else { + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goBack() + } + } onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } val title = String.format(getString(R.string.contacts)) @@ -434,10 +440,11 @@ class ContactsActivity : ComponentActivity() { override fun onDestroy() { if (Build.VERSION.SDK_INT >= 33) { - onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback) - } else { - onBackPressedCallback.remove() + if (backInvokedCallback != null) + onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!) } + else + onBackPressedCallback.remove() super.onDestroy() } diff --git a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt index 561a83f2..694e73f1 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt @@ -243,14 +243,18 @@ class MainActivity : ComponentActivity() { val items = mutableStateOf(listOf()) private val itemAction = mutableStateOf<(Int) -> Unit>({ _ -> run {} }) - private val backInvokedCallback = OnBackInvokedCallback { - moveTaskToBack(true) - } + private var backInvokedCallback: OnBackInvokedCallback? = null + private lateinit var onBackPressedCallback: OnBackPressedCallback - private val onBackPressedCallback = object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { + @RequiresApi(33) + private fun registerBackInvokedCallback() { + backInvokedCallback = OnBackInvokedCallback { moveTaskToBack(true) } + onBackInvokedDispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_DEFAULT, + backInvokedCallback!! + ) } @SuppressLint("ClickableViewAccessibility") @@ -260,13 +264,16 @@ class MainActivity : ComponentActivity() { enableEdgeToEdge() - if (Build.VERSION.SDK_INT >= 33) - onBackInvokedDispatcher.registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_DEFAULT, - backInvokedCallback - ) - else + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) + registerBackInvokedCallback() + else { + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + moveTaskToBack(true) + } + } onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } val extraAction = intent.getStringExtra("action") Log.d(TAG, "Main onCreate ${intent.action}/${intent.data}/$extraAction") @@ -2079,10 +2086,11 @@ class MainActivity : ComponentActivity() { Log.d(TAG, "Main onDestroy") if (Build.VERSION.SDK_INT >= 33) { - onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback) - } else { - onBackPressedCallback.remove() + if (backInvokedCallback != null) + onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!) } + else + onBackPressedCallback.remove() this.unregisterReceiver(screenEventReceiver)