diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 3c90c1378..6b68b155a 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -85,6 +85,10 @@ class CoreContext @UiThread constructor(val context: Context) : HandlerThread("C MutableLiveData>() } + val refreshMicrophoneMuteStateEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + val showGreenToastEvent: MutableLiveData>> by lazy { MutableLiveData>>() } diff --git a/app/src/main/java/org/linphone/telecom/TelecomAndroidAutoService.kt b/app/src/main/java/org/linphone/telecom/TelecomAndroidAutoService.kt index d84dd883c..673957ace 100644 --- a/app/src/main/java/org/linphone/telecom/TelecomAndroidAutoService.kt +++ b/app/src/main/java/org/linphone/telecom/TelecomAndroidAutoService.kt @@ -23,15 +23,32 @@ import android.content.pm.ApplicationInfo import androidx.car.app.CarAppService import androidx.car.app.validation.HostValidator import org.linphone.R +import org.linphone.core.tools.Log class TelecomAndroidAutoService : CarAppService() { + companion object { + private const val TAG = "[Telecom Android Auto Service]" + } + override fun createHostValidator(): HostValidator { + val host = hostInfo + Log.e("$TAG Host is [${host?.packageName}] with UID [${host?.uid}]") + + val validator = HostValidator.Builder(applicationContext) + .addAllowedHosts(R.array.hosts_allowlist_sample_copy) // androidx.car.app.R.array.hosts_allowlist_sampl + .build() + if (host != null) { + val allowed = validator.isValidHost(host) + Log.i("$TAG Host is [${if (allowed) "allowed" else "not allowed"}] in our validator") + } else { + Log.w("$TAG Host is null!") + } + return if ((applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE) != 0) { + Log.w("$TAG App is in debug mode, allowing all hosts") HostValidator.ALLOW_ALL_HOSTS_VALIDATOR } else { - HostValidator.Builder(applicationContext) - .addAllowedHosts(R.array.hosts_allowlist_sample_copy) - .build() + validator } } } diff --git a/app/src/main/java/org/linphone/telecom/TelecomCallControlCallback.kt b/app/src/main/java/org/linphone/telecom/TelecomCallControlCallback.kt index 845cc27c2..6f8248669 100644 --- a/app/src/main/java/org/linphone/telecom/TelecomCallControlCallback.kt +++ b/app/src/main/java/org/linphone/telecom/TelecomCallControlCallback.kt @@ -36,6 +36,7 @@ import org.linphone.core.Call import org.linphone.core.CallListenerStub import org.linphone.core.tools.Log import org.linphone.utils.AudioUtils +import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils class TelecomCallControlCallback( @@ -157,6 +158,7 @@ class TelecomCallControlCallback( // This is to prevent mic not muted when joining conference if user decided to join as muted if (muted || !LinphoneUtils.isCallOutgoing(callState, false)) { call.microphoneMuted = muted + coreContext.refreshMicrophoneMuteStateEvent.postValue(Event(true)) } else { Log.w("$TAG Not following unmute request because call is in state [$callState]") } diff --git a/app/src/main/java/org/linphone/ui/call/CallActivity.kt b/app/src/main/java/org/linphone/ui/call/CallActivity.kt index cb200ab5a..f15708861 100644 --- a/app/src/main/java/org/linphone/ui/call/CallActivity.kt +++ b/app/src/main/java/org/linphone/ui/call/CallActivity.kt @@ -295,6 +295,15 @@ class CallActivity : GenericActivity() { hideUI(hide) } } + + coreContext.refreshMicrophoneMuteStateEvent.observe(this) { + it.consume { + Log.i( + "$TAG Refreshing microphone mute state, probably to sync with Android Auto action" + ) + callViewModel.refreshMicrophoneState() + } + } } override fun onStart() { 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 4ef0fcb2e..9a3c856a2 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 @@ -649,6 +649,23 @@ class CurrentCallViewModel @UiThread constructor() : GenericViewModel() { } } + @UiThread + fun refreshMicrophoneState() { + coreContext.postOnCoreThread { + val micMuted = if (currentCall.conference != null) { + currentCall.conference?.microphoneMuted ?: false + } else { + currentCall.microphoneMuted + } + if (currentCall.conference != null) { + currentCall.conference?.microphoneMuted = !micMuted + } else { + currentCall.microphoneMuted = !micMuted + } + isMicrophoneMuted.postValue(micMuted) + } + } + @UiThread fun changeAudioOutputDevice() { val routeAudioToSpeaker = isSpeakerEnabled.value != true