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