mirror of
https://gitlab.linphone.org/BC/public/linphone-android.git
synced 2026-01-17 11:28:06 +00:00
Removed ringtone picker setting
This commit is contained in:
parent
86387ef5b8
commit
d693cfe58d
4 changed files with 1 additions and 289 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue