diff --git a/app/src/main/kotlin/com/tutpro/baresip/Account.kt b/app/src/main/kotlin/com/tutpro/baresip/Account.kt index 6e7fc6c9..5cf1c25a 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Account.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Account.kt @@ -31,6 +31,7 @@ class Account(val accp: Long, virtualAor: String? = null) { var answerMode = if (accp != 0L) Api.account_answermode(accp) else Api.ANSWERMODE_MANUAL var autoRedirect = if (accp != 0L) Api.account_sip_autoredirect(accp) else false var blockUnknown = false + var blockHidden = false var vmUri = if (accp != 0L) Api.account_vm_uri(accp) else "" var vmNew = 0 var vmOld = 0 @@ -79,6 +80,7 @@ class Account(val accp: Long, virtualAor: String? = null) { configuredRegInt = Utils.paramValue(extra, "regint").toInt() callHistory = Utils.paramValue(extra, "call_history") == "" blockUnknown = Utils.paramExists(extra, "block_unknown") + blockHidden = Utils.paramExists(extra, "block_hidden") if (Utils.paramExists(extra, "country_code")) countryCode = Utils.paramValue(extra, "country_code") if (Utils.paramExists(extra, "tel_provider")) @@ -182,6 +184,9 @@ class Account(val accp: Long, virtualAor: String? = null) { if (blockUnknown) extra += ";block_unknown=yes" + if (blockHidden) + extra += ";block_hidden=yes" + if (telProvider != "") extra += ";tel_provider=${URLEncoder.encode(telProvider, "UTF-8")}" diff --git a/app/src/main/kotlin/com/tutpro/baresip/AccountScreen.kt b/app/src/main/kotlin/com/tutpro/baresip/AccountScreen.kt index 56fb7d97..30b5bca3 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/AccountScreen.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/AccountScreen.kt @@ -646,6 +646,33 @@ private fun AccountContent( } } + @Composable + fun BlockHidden() { + val blockHiddenTitle = stringResource(R.string.block_hidden) + val blockHiddenHelp = stringResource(R.string.block_hidden_help) + val block by viewModel.blockHidden.collectAsState() + Row( + Modifier.fillMaxWidth().padding(end = 10.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Start + ) { + Text(text = blockHiddenTitle, + modifier = Modifier + .weight(1f) + .clickable { + alertTitle.value = blockHiddenTitle + alertMessage.value = blockHiddenHelp + showAlert.value = true + }, + fontSize = 18.sp + ) + Switch( + checked = block, + onCheckedChange = { viewModel.blockHidden.value = it } + ) + } + } + @Composable fun AudioCodecs(navController: NavController, aor: String) { Row( @@ -1333,6 +1360,7 @@ private fun AccountContent( } } BlockUnknown() + BlockHidden() if (!ua.account.isMobile) { AudioCodecs(navController, aor) MediaEnc() @@ -1673,6 +1701,12 @@ private fun checkOnClick(ctx: Context, viewModel: AccountViewModel, ua: UserAgen Log.d(TAG, "New blockUnknown is ${acc.blockUnknown}") } + val newBlockHidden = viewModel.blockHidden.value + if (newBlockHidden != acc.blockHidden) { + acc.blockHidden = newBlockHidden + Log.d(TAG, "New blockHidden is ${acc.blockHidden}") + } + var newVmUri = viewModel.vmUri.value.trim() if (newVmUri != acc.vmUri) { if (newVmUri != "") { diff --git a/app/src/main/kotlin/com/tutpro/baresip/AccountViewModel.kt b/app/src/main/kotlin/com/tutpro/baresip/AccountViewModel.kt index 6e94132e..f2732130 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/AccountViewModel.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/AccountViewModel.kt @@ -25,6 +25,7 @@ class AccountViewModel: ViewModel() { val answerMode = MutableStateFlow(0) val autoRedirect = MutableStateFlow(false) val blockUnknown = MutableStateFlow(false) + val blockHidden = MutableStateFlow(false) val vmUri = MutableStateFlow("") val countryCode = MutableStateFlow("") val telProvider = MutableStateFlow("") @@ -60,6 +61,7 @@ class AccountViewModel: ViewModel() { answerMode.value = acc.answerMode autoRedirect.value = acc.autoRedirect blockUnknown.value = acc.blockUnknown + blockHidden.value = acc.blockHidden vmUri.value = acc.vmUri countryCode.value = acc.countryCode telProvider.value = acc.telProvider diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt index 8b84177c..4544e2e1 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt @@ -960,6 +960,8 @@ class BaresipService: Service() { getString(R.string.call_blocked), Utils.friendlyUri(this, peerUri, ua.account) ) + else if (ua.account.blockHidden && peerUri.contains("anonymous")) + getString(R.string.hidden_call_blocked) else if (!Utils.checkPermissions(this, arrayOf(RECORD_AUDIO))) getString(R.string.no_calls) else @@ -969,7 +971,8 @@ class BaresipService: Service() { Api.sip_treply(callp, 486, "Busy Here") Api.bevent_stop(ev[2].toLong()) toast(toastMsg) - if (toastMsg.contains(getString(R.string.call_blocked))) { + if (toastMsg.contains(getString(R.string.call_blocked)) || + toastMsg.contains(getString(R.string.hidden_call_blocked))) { if (ua.account.callHistory) Blocked( ua.account.aor, @@ -1372,7 +1375,10 @@ class BaresipService: Service() { return } - if (ua.account.blockUnknown && Contact.contactName(peerUri) == peerUri) { + val blockedHidden = ua.account.blockHidden && peerUri.contains("anonymous") + val blockedUnknown = ua.account.blockUnknown && Contact.contactName(peerUri) == peerUri + + if (blockedHidden || blockedUnknown) { Log.d(TAG, "Auto-rejecting incoming message by $uap from $peerUri") Blocked( ua.account.aor, @@ -1380,13 +1386,14 @@ class BaresipService: Service() { "message", GregorianCalendar().timeInMillis ).add() - toast(String.format( + toast(if (blockedHidden) + getString(R.string.hidden_message_blocked) + else + String.format( getString(R.string.message_blocked), Utils.friendlyUri(this, peerUri, ua.account) ) ) - // Api.sip_treply(callp, 486, "Busy Here") - // Api.bevent_stop(bevent) return } @@ -1968,6 +1975,23 @@ class BaresipService: Service() { if (isIncoming) { val e164Uri = e164Uri(uri, ua.account.countryCode) + val presentation = telecomCall.details.handlePresentation + if (ua.account.blockHidden && + (presentation == TelecomManager.PRESENTATION_RESTRICTED || + presentation == TelecomManager.PRESENTATION_UNKNOWN)) { + Log.d(TAG, "Auto-rejecting incoming PSTN hidden call") + telecomCall.disconnect() + toast(getString(R.string.hidden_call_blocked)) + if (ua.account.callHistory) { + Blocked( + ua.account.aor, + uri, + "invite", + GregorianCalendar().timeInMillis + ).add() + } + return + } if (ua.account.blockUnknown && Contact.contactName(e164Uri) == e164Uri) { Log.d(TAG, "Auto-rejecting incoming PSTN call from $uri") telecomCall.disconnect() diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 7e8aa600..ec6be322 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -211,11 +211,13 @@ SIP INFO -pyyntö RTP tai SIP INFO Vastaustapa - Valitsee tulevien puheluiden vastaustavan. + Valitsee tulevien puheluiden vastaustavan Manuaalinen Automaattinen - Estä tuntemattomat + Estä vieraat Estä puhelut ja viestit, joiden lähdettä ei löydy yhteystiedoista. + Estä tuntemattomat + Estä puhelut ja viestit, joiden lähde on tuntematon. Uudelleenohjaustapa Valitsee toteutetaanko puhelun uudelleenohjauspyyntö automaattisesti vai kysytäänkö vahvistusta. @@ -273,8 +275,10 @@ %1$d vastaamatonta puhelua Puhelun siirtopyyntö kohteeseen Automaattisesti hylätty puhelu soittajalta \`%1$s\` - Estetty puhelu hylätty soittajalta \`%1$s\` - Estetty viesti hylätty lähettäjältä \`%1$s\` + Estetty puhelu vieraalta soittajalta \`%1$s\` + Estetty puhelu tuntemattomalta soittajalta + Estetty viesti vieraalta lähettäjältä \`%1$s\` + Estetty viesti tuntemattomalta lähettäjältä Estetyt Estetyt puhelut diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f81d9d7a..a059bbc9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -213,8 +213,10 @@ if confirmation is requested. Manual Automatic - Block Unknown + Block Strangers Block calls and messages from peers that are not found in contacts. + Block Hidden + Block calls and messages from peers with hidden identification. Voicemail URI SIP URI for checking of voicemail messages. If left empty, voicemail messages (Message Waiting Indications) are not subscribed to. @@ -266,7 +268,9 @@ Call transfer request to Auto-rejected call from \`%1$s\` Auto-rejected blocked call from \`%1$s\` + Auto-rejected hidden call Auto-rejected blocked message from \`%1$s\` + Auto-rejected hidden message Blocked Blocked Calls