Added Ringtone setting

This commit is contained in:
Juha Heinanen
2025-04-22 17:24:16 +03:00
parent 4c3862337f
commit ccb9bb9fc8
5 changed files with 87 additions and 15 deletions

View File

@ -65,6 +65,7 @@ import androidx.compose.runtime.setValue
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
import androidx.core.net.toUri
import androidx.lifecycle.MutableLiveData
import androidx.media.AudioAttributesCompat
import androidx.media.AudioFocusRequestCompat
@ -83,7 +84,6 @@ class BaresipService: Service() {
internal lateinit var intent: Intent
private lateinit var am: AudioManager
private lateinit var rt: Ringtone
private lateinit var nt: Ringtone
private lateinit var nm: NotificationManager
private lateinit var snb: NotificationCompat.Builder
@ -131,8 +131,10 @@ class BaresipService: Service() {
RingtoneManager.TYPE_NOTIFICATION)
nt = RingtoneManager.getRingtone(applicationContext, ntUri)
val rtUri = RingtoneManager.getActualDefaultRingtoneUri(applicationContext,
RingtoneManager.TYPE_RINGTONE)
val rtUri = if (Preferences(applicationContext).ringtoneUri == "")
Settings.System.RINGTONE.toUri()
else
Preferences(applicationContext).ringtoneUri!!.toUri()
rt = RingtoneManager.getRingtone(applicationContext, rtUri)
nm = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
@ -1311,8 +1313,8 @@ class BaresipService: Service() {
}
private fun startRinging() {
rt.isLooping = true
rt.play()
rt!!.isLooping = true
rt!!.play()
if (shouldVibrate()) {
vbTimer = Timer()
vbTimer!!.schedule(object : TimerTask() {
@ -1346,7 +1348,7 @@ class BaresipService: Service() {
}
private fun stopRinging() {
rt.stop()
rt!!.stop()
if (vbTimer != null) {
vbTimer!!.cancel()
vbTimer = null
@ -1663,6 +1665,7 @@ class BaresipService: Service() {
var aecAvailable = false
private var aec: AcousticEchoCanceler? = null
var agcAvailable = false
var rt: Ringtone? = null
private var agc: AutomaticGainControl? = null
private val nsAvailable = NoiseSuppressor.isAvailable()
private var ns: NoiseSuppressor? = null

View File

@ -6,7 +6,9 @@ import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.media.RingtoneManager
import android.net.Uri
import android.os.Build.VERSION
import android.os.Bundle
import android.os.PowerManager
import android.provider.Settings
@ -14,8 +16,10 @@ import android.window.OnBackInvokedCallback
import android.window.OnBackInvokedDispatcher
import androidx.activity.ComponentActivity
import androidx.activity.OnBackPressedCallback
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
@ -65,6 +69,7 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.core.content.ContextCompat
import androidx.core.net.toUri
import com.tutpro.baresip.CustomElements.AlertDialog
import com.tutpro.baresip.CustomElements.Checkbox
import com.tutpro.baresip.CustomElements.LabelText
@ -95,6 +100,8 @@ class ConfigActivity : ComponentActivity() {
private var newCaFile = false
private var oldUserAgent = ""
private var newUserAgent = ""
private var oldRingtoneUri = ""
private var newRingtoneUri = ""
private var oldBatteryOptimizations = false
private var newBatteryOptimizations = false
private var oldDefaultDialer = false
@ -208,7 +215,7 @@ class ConfigActivity : ComponentActivity() {
enableEdgeToEdge()
if (Build.VERSION.SDK_INT >= 33)
if (VERSION.SDK_INT >= 33)
registerBackInvokedCallback()
else {
onBackPressedCallback = object : OnBackPressedCallback(true) {
@ -274,11 +281,11 @@ class ConfigActivity : ComponentActivity() {
) {
Log.d(TAG, "dialerRoleRequest succeeded: " +
"${it.resultCode == RESULT_OK}")
if (Build.VERSION.SDK_INT >= 29)
if (VERSION.SDK_INT >= 29)
newDefaultDialer = roleManager.isRoleHeld(RoleManager.ROLE_DIALER)
}
if (Build.VERSION.SDK_INT >= 29) {
if (VERSION.SDK_INT >= 29) {
roleManager = getSystemService(ROLE_SERVICE) as RoleManager
oldDefaultDialer = roleManager.isRoleHeld(RoleManager.ROLE_DIALER)
}
@ -413,8 +420,9 @@ class ConfigActivity : ComponentActivity() {
CaFile(ctx)
UserAgent()
AudioSettings(ctx)
Ringtone()
BatteryOptimizations()
if (Build.VERSION.SDK_INT >= 29)
if (VERSION.SDK_INT >= 29)
DefaultDialer()
Contacts(ctx)
DarkTheme()
@ -628,7 +636,7 @@ class ConfigActivity : ComponentActivity() {
tlsCertificateFile = it
newTlsCertificateFile = tlsCertificateFile
if (it)
if (Build.VERSION.SDK_INT < 29) {
if (VERSION.SDK_INT < 29) {
tlsCertificateFile = false
when {
ContextCompat.checkSelfPermission(
@ -733,7 +741,7 @@ class ConfigActivity : ComponentActivity() {
caFile = it
newCaFile = caFile
if (it) {
if (Build.VERSION.SDK_INT < 29) {
if (VERSION.SDK_INT < 29) {
caFile = false
when {
ContextCompat.checkSelfPermission(ctx,
@ -834,6 +842,54 @@ class ConfigActivity : ComponentActivity() {
}
}
@Composable
private fun Ringtone() {
oldRingtoneUri = if (Preferences(applicationContext).ringtoneUri == "")
RingtoneManager.getActualDefaultRingtoneUri(applicationContext, RingtoneManager.TYPE_RINGTONE).toString()
else
Preferences(applicationContext).ringtoneUri!!
newRingtoneUri = oldRingtoneUri
val launcher = rememberLauncherForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result: ActivityResult ->
if (result.resultCode == RESULT_OK) {
val uri: Uri? = if (VERSION.SDK_INT >= 33)
result.data?.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, Uri::class.java)
else
@Suppress("DEPRECATION")
result.data?.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)
if (uri != null)
newRingtoneUri = uri.toString()
}
}
Row(
Modifier
.fillMaxWidth()
.padding(top = 12.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Start
) {
Text(
text = stringResource(R.string.ringtone),
modifier = Modifier
.weight(1f)
.clickable {
val intent = Intent(RingtoneManager.ACTION_RINGTONE_PICKER)
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,
RingtoneManager.TYPE_RINGTONE)
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, getString(R.string.select_ringtone))
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, newRingtoneUri.toUri())
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false)
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true)
launcher.launch(intent)
},
color = LocalCustomColors.current.itemText,
fontSize = 18.sp,
fontWeight = FontWeight.Bold
)
}
}
@Composable
private fun BatteryOptimizations() {
Row(
@ -1240,6 +1296,11 @@ class ConfigActivity : ComponentActivity() {
restart = true
}
Log.d(TAG, "Old/new ringtone: $oldRingtoneUri / $newRingtoneUri")
if (newRingtoneUri != oldRingtoneUri) {
Preferences(applicationContext).ringtoneUri = newRingtoneUri
BaresipService.rt = RingtoneManager.getRingtone(applicationContext, newRingtoneUri.toUri())
}
if (oldContactsMode != newContactsMode) {
Config.replaceVariable("contacts_mode", newContactsMode)
BaresipService.contactsMode = newContactsMode
@ -1301,7 +1362,7 @@ class ConfigActivity : ComponentActivity() {
}
override fun onDestroy() {
if (Build.VERSION.SDK_INT >= 33) {
if (VERSION.SDK_INT >= 33) {
if (backInvokedCallback != null)
onBackInvokedDispatcher.unregisterOnBackInvokedCallback(backInvokedCallback!!)
}

View File

@ -2,6 +2,7 @@ package com.tutpro.baresip
import android.content.Context
import androidx.preference.PreferenceManager
import androidx.core.content.edit
class Preferences(context: Context) {
@ -12,6 +13,9 @@ class Preferences(context: Context) {
private val preferences = PreferenceManager.getDefaultSharedPreferences(context)
var displayTheme = preferences.getInt(DISPLAY_THEME, -1)
set(value) = preferences.edit().putInt(DISPLAY_THEME, value).apply()
set(value) = preferences.edit() { putInt(DISPLAY_THEME, value) }
var ringtoneUri = preferences.getString("ringtone_uri", "")
set(value) = preferences.edit() { putString("ringtone_uri", value) }
}

View File

@ -405,6 +405,8 @@
<string name="video_fps_help">Videokehysten lähetystaajuus per sekuntti, jota tarjotaan
SDP-neuvottelun aikana. Arvon on oltava välillä 10-30.</string>
<string name="invalid_fps">Virheellinen videokehysten lähetystaajuus \'%1$d\'</string>
<string name="ringtone">Soittoääni</string>
<string name="select_ringtone">Valitse soittoääni</string>
<string name="user_agent">User Agent</string>
<string name="user_agent_help">Räätälöity SIP sanoman User-Agent otsikkokentän arvo</string>
<string name="invalid_user_agent">Virheellinen User-Agent otsikkokentän arvo</string>

View File

@ -378,6 +378,8 @@
<string name="video_fps_help">Video frame rate that will be offered during the SDP handshake.
Valid values are from 10 to 30.</string>
<string name="invalid_fps">Invalid Frames Per Second \'%1$d\'</string>
<string name="ringtone">Ringtone</string>
<string name="select_ringtone">Select Ringtone</string>
<string name="user_agent">User Agent</string>
<string name="user_agent_help">Custom SIP request/response User-Agent header field value</string>
<string name="invalid_user_agent">Invalid User-Agent header field value</string>