From d693cfe58d0db95b0d7bb0316a25708f504c7fdc Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 3 Apr 2024 16:58:38 +0200 Subject: [PATCH] Removed ringtone picker setting --- .../notifications/NotificationsManager.kt | 1 - .../settings/fragment/SettingsFragment.kt | 40 ---- .../settings/viewmodel/SettingsViewModel.kt | 182 ------------------ app/src/main/res/layout/settings_calls.xml | 67 +------ 4 files changed, 1 insertion(+), 289 deletions(-) diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index 8adb34914..a52932c14 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -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) diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt index 1b7a40fdd..e66d06d94 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt @@ -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() diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt index e93b136ee..516359503 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt @@ -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() val videoEnabled = MutableLiveData() - val availableRingtonesPaths = arrayListOf() - val availableRingtonesNames = arrayListOf() - val selectedRingtone = MutableLiveData() - val isRingtonePlaying = MutableLiveData() - val isVibrationAvailable = MutableLiveData() val vibrateDuringIncomingCall = MutableLiveData() @@ -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 - } } diff --git a/app/src/main/res/layout/settings_calls.xml b/app/src/main/res/layout/settings_calls.xml index 11e1c66b2..c7a259d02 100644 --- a/app/src/main/res/layout/settings_calls.xml +++ b/app/src/main/res/layout/settings_calls.xml @@ -116,71 +116,6 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/route_audio_to_bluetooth_switch" /> - - - - - - - - + app:layout_constraintTop_toBottomOf="@id/enable_video_switch" />