Update cell signal icon & color depending on call current quality

This commit is contained in:
Sylvain Berfini 2024-02-06 14:12:12 +01:00
parent 879b6b3b7e
commit db486360cc
6 changed files with 72 additions and 6 deletions

View file

@ -21,12 +21,18 @@ package org.linphone.ui.call.viewmodel
import android.Manifest
import android.content.pm.PackageManager
import androidx.annotation.AnyThread
import androidx.annotation.UiThread
import androidx.annotation.WorkerThread
import androidx.core.app.ActivityCompat
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import java.util.Locale
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
@ -100,6 +106,10 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() {
MutableLiveData<String>()
}
val qualityValue = MutableLiveData<Float>()
val qualityIcon = MutableLiveData<Int>()
var terminatedByUsed = false
val isRemoteRecordingEvent: MutableLiveData<Event<Pair<Boolean, String>>> by lazy {
@ -343,6 +353,8 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() {
{ // OnCallClicked
}
)
updateCallQualityIcon()
}
@UiThread
@ -858,4 +870,29 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() {
else -> false
}
}
@AnyThread
private fun updateCallQualityIcon() {
viewModelScope.launch {
withContext(Dispatchers.IO) {
delay(1000)
coreContext.postOnCoreThread {
if (::currentCall.isInitialized) {
val quality = currentCall.currentQuality
val icon = when {
quality >= 4 -> R.drawable.cell_signal_full
quality >= 3 -> R.drawable.cell_signal_high
quality >= 2 -> R.drawable.cell_signal_medium
quality >= 1 -> R.drawable.cell_signal_low
else -> R.drawable.cell_signal_none
}
qualityValue.postValue(quality)
qualityIcon.postValue(icon)
}
updateCallQualityIcon()
}
}
}
}
}

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="256"
android:viewportHeight="256">
<path
android:pathData="M168,72L168,200a8,8 0,0 1,-16 0L152,72a8,8 0,0 1,16 0ZM120,104a8,8 0,0 0,-8 8v88a8,8 0,0 0,16 0L128,112A8,8 0,0 0,120 104ZM80,144a8,8 0,0 0,-8 8v48a8,8 0,0 0,16 0L88,152A8,8 0,0 0,80 144ZM40,184a8,8 0,0 0,-8 8v8a8,8 0,0 0,16 0v-8A8,8 0,0 0,40 184Z"
android:fillColor="#4e6074"/>
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="256"
android:viewportHeight="256">
<path
android:pathData="M128,112v88a8,8 0,0 1,-16 0V112a8,8 0,0 1,16 0ZM80,144a8,8 0,0 0,-8 8v48a8,8 0,0 0,16 0V152A8,8 0,0 0,80 144ZM40,184a8,8 0,0 0,-8 8v8a8,8 0,0 0,16 0v-8A8,8 0,0 0,40 184Z"
android:fillColor="#4e6074"/>
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="256"
android:viewportHeight="256">
<path
android:pathData="M48,192v8a8,8 0,0 1,-16 0v-8a8,8 0,0 1,16 0Z"
android:fillColor="#4e6074"/>
</vector>

View file

@ -139,12 +139,13 @@
android:layout_width="@dimen/call_top_bar_info_height"
android:layout_height="@dimen/call_top_bar_info_height"
android:padding="10dp"
android:src="@drawable/cell_signal_full"
android:src="@{viewModel.qualityIcon, default=@drawable/cell_signal_full}"
android:visibility="@{!viewModel.fullScreenMode &amp;&amp; !viewModel.pipMode ? View.VISIBLE : View.GONE}"
app:tint="@color/white"
android:tint="@{viewModel.qualityValue >= 2 ? @color/white : viewModel.qualityValue >= 1 ? @color/orange_warning_600 : @color/red_danger_500, default=@color/white}"
app:layout_constraintTop_toTopOf="@id/conference_subject"
app:layout_constraintBottom_toBottomOf="@id/conference_subject"
app:layout_constraintEnd_toEndOf="parent" />
app:layout_constraintEnd_toEndOf="parent"
bind:ignore="UseAppTint" />
<ImageView
style="@style/default_text_style"

View file

@ -212,12 +212,13 @@
android:layout_width="@dimen/call_top_bar_info_height"
android:layout_height="@dimen/call_top_bar_info_height"
android:padding="10dp"
android:src="@drawable/cell_signal_full"
android:src="@{viewModel.qualityIcon, default=@drawable/cell_signal_full}"
android:visibility="@{!viewModel.fullScreenMode &amp;&amp; !viewModel.pipMode ? View.VISIBLE : View.GONE}"
app:tint="@color/white"
android:tint="@{viewModel.qualityValue >= 2 ? @color/white : viewModel.qualityValue >= 1 ? @color/orange_warning_600 : @color/red_danger_500, default=@color/white}"
app:layout_constraintTop_toTopOf="@id/back"
app:layout_constraintBottom_toBottomOf="@id/back"
app:layout_constraintEnd_toEndOf="parent" />
app:layout_constraintEnd_toEndOf="parent"
bind:ignore="UseAppTint" />
<ImageView
style="@style/default_text_style"