Removed ringtone picker setting

This commit is contained in:
Sylvain Berfini 2024-04-03 16:58:38 +02:00
parent 86387ef5b8
commit d693cfe58d
4 changed files with 1 additions and 289 deletions

View file

@ -1216,7 +1216,6 @@ class NotificationsManager @MainThread constructor(private val context: Context)
val channel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH).apply {
description = name
enableVibration(true)
setSound(ringtone, audioAttributes)
}
notificationManager.createNotificationChannel(channel)

View file

@ -9,7 +9,6 @@ import android.widget.ArrayAdapter
import androidx.annotation.UiThread
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.compatibility.Compatibility
import org.linphone.core.tools.Log
@ -27,18 +26,6 @@ class SettingsFragment : GenericFragment() {
private lateinit var viewModel: SettingsViewModel
private val ringtoneListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
val path = viewModel.availableRingtonesPaths[position]
val label = viewModel.availableRingtonesNames[position]
Log.i("$TAG Selected ringtone is now [$label] ($path)")
viewModel.setRingtone(path)
}
override fun onNothingSelected(parent: AdapterView<*>?) {
}
}
private val layoutListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
val label = viewModel.availableLayoutsNames[position]
@ -91,25 +78,6 @@ class SettingsFragment : GenericFragment() {
goBack()
}
// Ringtone related
val ringtonesAdapter = ArrayAdapter(
requireContext(),
R.layout.drop_down_item,
viewModel.availableRingtonesNames
)
ringtonesAdapter.setDropDownViewResource(R.layout.generic_dropdown_cell)
binding.callsSettings.deviceRingtoneSpinner.adapter = ringtonesAdapter
viewModel.selectedRingtone.observe(viewLifecycleOwner) { ringtone ->
binding.callsSettings.deviceRingtoneSpinner.setSelection(
viewModel.availableRingtonesPaths.indexOf(
ringtone
)
)
}
binding.callsSettings.deviceRingtoneSpinner.onItemSelectedListener = ringtoneListener
viewModel.addLdapServerEvent.observe(viewLifecycleOwner) {
it.consume {
val action = SettingsFragmentDirections.actionSettingsFragmentToLdapServerConfigurationFragment(
@ -182,14 +150,6 @@ class SettingsFragment : GenericFragment() {
startPostponedEnterTransition()
}
override fun onPause() {
super.onPause()
coreContext.postOnCoreThread {
viewModel.stopRingtonePlayer()
}
}
override fun onResume() {
super.onResume()

View file

@ -19,30 +19,19 @@
*/
package org.linphone.ui.main.settings.viewmodel
import android.content.Context
import android.media.AudioAttributes
import android.media.Ringtone
import android.media.RingtoneManager
import android.net.Uri
import android.os.Vibrator
import androidx.annotation.UiThread
import androidx.annotation.WorkerThread
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import java.io.File
import java.util.Locale
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
import org.linphone.core.Conference
import org.linphone.core.FriendList
import org.linphone.core.Player
import org.linphone.core.PlayerListener
import org.linphone.core.VFS
import org.linphone.core.tools.Log
import org.linphone.ui.main.settings.model.CardDavLdapModel
import org.linphone.utils.AppUtils
import org.linphone.utils.AudioUtils
import org.linphone.utils.Event
class SettingsViewModel @UiThread constructor() : ViewModel() {
@ -68,11 +57,6 @@ class SettingsViewModel @UiThread constructor() : ViewModel() {
val routeAudioToBluetooth = MutableLiveData<Boolean>()
val videoEnabled = MutableLiveData<Boolean>()
val availableRingtonesPaths = arrayListOf<String>()
val availableRingtonesNames = arrayListOf<String>()
val selectedRingtone = MutableLiveData<String>()
val isRingtonePlaying = MutableLiveData<Boolean>()
val isVibrationAvailable = MutableLiveData<Boolean>()
val vibrateDuringIncomingCall = MutableLiveData<Boolean>()
@ -133,16 +117,6 @@ class SettingsViewModel @UiThread constructor() : ViewModel() {
)
val availableThemesValues = arrayListOf(-1, 0, 1)
// Other
private lateinit var ringtonePlayer: Player
private lateinit var deviceRingtonePlayer: Ringtone
private val playerListener = PlayerListener {
Log.i("[$TAG] End of ringtone reached")
stopRingtonePlayer()
}
init {
coreContext.postOnCoreThread { core ->
hideVideoCallSetting.postValue(!core.isVideoEnabled)
@ -169,8 +143,6 @@ class SettingsViewModel @UiThread constructor() : ViewModel() {
Log.w("$TAG Device doesn't seem to have a vibrator, hiding related setting")
}
computeAvailableRingtones()
coreContext.postOnCoreThread { core ->
echoCancellerEnabled.postValue(core.isEchoCancellationEnabled)
routeAudioToBluetooth.postValue(corePreferences.routeAudioToBluetoothIfAvailable)
@ -180,10 +152,6 @@ class SettingsViewModel @UiThread constructor() : ViewModel() {
useWifiOnly.postValue(core.isWifiOnlyEnabled)
val ringtone = core.ring.orEmpty()
Log.i("Currently configured ringtone in Core is [$ringtone]")
selectedRingtone.postValue(ringtone)
autoDownloadEnabled.postValue(core.maxSizeForAutoDownloadIncomingFiles == 0)
exportMediaEnabled.postValue(corePreferences.exportMediaToNativeGallery)
@ -193,18 +161,6 @@ class SettingsViewModel @UiThread constructor() : ViewModel() {
}
}
@UiThread
override fun onCleared() {
super.onCleared()
coreContext.postOnCoreThread {
if (::ringtonePlayer.isInitialized) {
stopRingtonePlayer()
ringtonePlayer.removeListener(playerListener)
}
}
}
@UiThread
fun toggleSecurityExpand() {
expandSecurity.value = expandSecurity.value == false
@ -257,84 +213,6 @@ class SettingsViewModel @UiThread constructor() : ViewModel() {
}
}
@UiThread
fun setRingtone(ringtone: String) {
coreContext.postOnCoreThread { core ->
core.ring = ringtone
selectedRingtone.postValue(ringtone)
if (::ringtonePlayer.isInitialized) {
if (ringtonePlayer.state == Player.State.Playing) {
stopRingtonePlayer()
}
}
}
}
@UiThread
fun playPauseRingtone() {
coreContext.postOnCoreThread { core ->
if (!::ringtonePlayer.isInitialized) {
// Also works for ringtone
val playbackDevice = AudioUtils.getAudioPlaybackDeviceIdForCallRecordingOrVoiceMessage()
val player = core.createLocalPlayer(playbackDevice, null, null)
ringtonePlayer = player ?: return@postOnCoreThread
ringtonePlayer.addListener(playerListener)
}
val path = core.ring.orEmpty()
if (path.isEmpty()) {
if (::deviceRingtonePlayer.isInitialized) {
if (deviceRingtonePlayer.isPlaying) {
deviceRingtonePlayer.stop()
isRingtonePlaying.postValue(false)
} else {
playDeviceDefaultRingtone()
}
} else {
playDeviceDefaultRingtone()
}
} else {
if (ringtonePlayer.state == Player.State.Playing) {
stopRingtonePlayer()
} else {
if (ringtonePlayer.open(path) == 0) {
if (ringtonePlayer.start() == 0) {
isRingtonePlaying.postValue(true)
} else {
Log.e("$TAG Failed to play ringtone [$path]")
}
} else {
Log.e("$TAG Failed to open ringtone [$path]")
}
}
}
}
}
@WorkerThread
private fun playDeviceDefaultRingtone() {
val audioAttrs = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build()
val defaultRingtoneUri = getDefaultRingtoneUri(coreContext.context)
try {
val ringtone = RingtoneManager.getRingtone(coreContext.context, defaultRingtoneUri)
if (ringtone != null) {
ringtone.audioAttributes = audioAttrs
ringtone.isLooping = true
ringtone.play()
deviceRingtonePlayer = ringtone
isRingtonePlaying.postValue(true)
} else {
Log.e("$TAG Couldn't retrieve Ringtone object from manager!")
}
} catch (e: Exception) {
Log.e("$TAG Failed to play ringtone [", defaultRingtoneUri, "] : ", e)
}
}
@UiThread
fun toggleVibrateOnIncomingCalls() {
val newValue = vibrateDuringIncomingCall.value == false
@ -475,64 +353,4 @@ class SettingsViewModel @UiThread constructor() : ViewModel() {
theme.postValue(themeValue)
}
}
@WorkerThread
fun stopRingtonePlayer() {
if (::ringtonePlayer.isInitialized && ringtonePlayer.state != Player.State.Closed) {
Log.i("$TAG Stopping ringtone player")
ringtonePlayer.pause()
ringtonePlayer.seek(0)
ringtonePlayer.close()
isRingtonePlaying.postValue(false)
}
}
@UiThread
private fun computeAvailableRingtones() {
availableRingtonesNames.add(
AppUtils.getString(R.string.settings_calls_use_device_ringtone_label)
)
availableRingtonesPaths.add("")
val directory = File(corePreferences.ringtonesPath)
val files = directory.listFiles()
for (ringtone in files.orEmpty()) {
if (ringtone.absolutePath.endsWith(".mkv")) {
val name = ringtone.name
.substringBefore(".")
.replace("_", " ")
.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
availableRingtonesNames.add(name)
availableRingtonesPaths.add(ringtone.absolutePath)
}
}
}
private fun getDefaultRingtoneUri(context: Context): Uri? {
var uri: Uri? = null
try {
uri =
RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE)
} catch (e: SecurityException) {
Log.e("$TAG Can't get default ringtone URI: $e")
}
if (uri == null) {
Log.w("$TAG Failed to get actual default ringtone URI, trying to get a valid one")
uri = RingtoneManager.getValidRingtoneUri(context)
}
if (uri == null) {
Log.w("$TAG Failed to get a valid ringtone URI, trying the first one available")
val ringtoneManager = RingtoneManager(context)
ringtoneManager.setType(RingtoneManager.TYPE_RINGTONE)
val cursor = ringtoneManager.cursor
if (cursor.moveToFirst()) {
val idString = cursor.getString(RingtoneManager.ID_COLUMN_INDEX)
val uriString = cursor.getString(RingtoneManager.URI_COLUMN_INDEX)
uri = Uri.parse("$uriString/$idString")
}
cursor.close()
}
return uri
}
}

View file

@ -116,71 +116,6 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/route_audio_to_bluetooth_switch" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style"
android:id="@+id/device_ringtone_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_calls_ringtones_title"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintTop_toBottomOf="@id/enable_video_switch"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/device_ringtone_player"/>
<androidx.appcompat.widget.AppCompatSpinner
style="@style/material_switch_style"
android:id="@+id/device_ringtone_spinner"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginEnd="10dp"
android:background="@drawable/edit_text_background"
android:paddingStart="@dimen/spinner_start_padding"
android:paddingEnd="@dimen/spinner_end_padding"
android:overlapAnchor="false"
android:spinnerMode="dropdown"
android:popupBackground="@drawable/shape_squircle_white_background"
app:layout_constraintTop_toBottomOf="@id/device_ringtone_title"
app:layout_constraintStart_toStartOf="@id/device_ringtone_title"
app:layout_constraintEnd_toStartOf="@id/device_ringtone_player" />
<ImageView
android:id="@+id/device_ringtone_spinner_caret"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/spinner_caret_end_margin"
android:src="@drawable/caret_down"
app:layout_constraintTop_toTopOf="@id/device_ringtone_spinner"
app:layout_constraintBottom_toBottomOf="@id/device_ringtone_spinner"
app:layout_constraintEnd_toEndOf="@id/device_ringtone_spinner"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/tertiary_button_label_style"
android:id="@+id/device_ringtone_player"
android:onClick="@{() -> viewModel.playPauseRingtone()}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:background="@drawable/tertiary_button_background"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:gravity="center"
android:text="@{viewModel.isRingtonePlaying ? @string/settings_calls_pause_ringtone_label : @string/settings_calls_play_ringtone_label, default=@string/settings_calls_play_ringtone_label}"
android:maxLines="1"
android:ellipsize="end"
android:drawableStart="@{viewModel.isRingtonePlaying ? @drawable/pause : @drawable/play, default=@drawable/play}"
android:drawableTint="@color/tertiary_button_label_color"
android:drawablePadding="8dp"
app:layout_constraintStart_toEndOf="@id/device_ringtone_spinner"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/device_ringtone_spinner"
app:layout_constraintBottom_toBottomOf="@id/device_ringtone_spinner"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style"
android:onClick="@{() -> viewModel.toggleVibrateOnIncomingCalls()}"
@ -209,7 +144,7 @@
android:layout_marginEnd="16dp"
android:checked="@{viewModel.vibrateDuringIncomingCall}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/device_ringtone_spinner" />
app:layout_constraintTop_toBottomOf="@id/enable_video_switch" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style"