diff --git a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt index f90bc966d..67decdca4 100644 --- a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt @@ -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() } + val qualityValue = MutableLiveData() + + val qualityIcon = MutableLiveData() + var terminatedByUsed = false val isRemoteRecordingEvent: MutableLiveData>> 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() + } + } + } + } } diff --git a/app/src/main/res/drawable/cell_signal_high.xml b/app/src/main/res/drawable/cell_signal_high.xml new file mode 100644 index 000000000..90c38598f --- /dev/null +++ b/app/src/main/res/drawable/cell_signal_high.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/cell_signal_medium.xml b/app/src/main/res/drawable/cell_signal_medium.xml new file mode 100644 index 000000000..e4e48100b --- /dev/null +++ b/app/src/main/res/drawable/cell_signal_medium.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/cell_signal_none.xml b/app/src/main/res/drawable/cell_signal_none.xml new file mode 100644 index 000000000..f9ccb34ec --- /dev/null +++ b/app/src/main/res/drawable/cell_signal_none.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/call_active_conference_fragment.xml b/app/src/main/res/layout/call_active_conference_fragment.xml index 70cd20abb..adebd1870 100644 --- a/app/src/main/res/layout/call_active_conference_fragment.xml +++ b/app/src/main/res/layout/call_active_conference_fragment.xml @@ -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 && !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" /> + app:layout_constraintEnd_toEndOf="parent" + bind:ignore="UseAppTint" />