From f1f58d49e7184a210b2f0db28f47544a10a6cfba Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 1 Jun 2020 12:28:24 +0200 Subject: [PATCH] Few improvements including disabling proximity sensor based on video & output audio device --- app/build.gradle | 4 +- .../linphone/activities/call/CallActivity.kt | 11 ++--- .../activities/call/IncomingCallActivity.kt | 4 +- .../activities/call/OutgoingCallActivity.kt | 7 ++-- .../call/ProximitySensorActivity.kt | 14 +++---- .../viewmodels/ControlsFadingViewModel.kt | 41 +++++++++++++++---- .../chat/fragments/DetailChatRoomFragment.kt | 2 +- .../main/java/org/linphone/utils/FileUtils.kt | 2 +- .../layout-land/chat_room_master_fragment.xml | 1 - .../res/layout/chat_room_master_fragment.xml | 1 - 10 files changed, 55 insertions(+), 32 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4b452c313..a719efc91 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -43,7 +43,7 @@ task getGitVersion() { gitVersion = gitVersionStream.toString().trim() + "." + gitCommitsCount.toString().trim() + "+" + gitCommitHash.toString().trim() } println("Git version: " + gitVersion) - } catch (Exception e) { + } catch (ignored) { println("Git not found") } project.version = gitVersion @@ -54,7 +54,7 @@ project.tasks['preBuild'].dependsOn 'linphoneSdkSource' android { compileSdkVersion 29 - buildToolsVersion "29.0.2" + buildToolsVersion "29.0.3" defaultConfig { minSdkVersion 23 targetSdkVersion 29 diff --git a/app/src/main/java/org/linphone/activities/call/CallActivity.kt b/app/src/main/java/org/linphone/activities/call/CallActivity.kt index a8fd5e6f0..25bab5c4f 100644 --- a/app/src/main/java/org/linphone/activities/call/CallActivity.kt +++ b/app/src/main/java/org/linphone/activities/call/CallActivity.kt @@ -85,17 +85,18 @@ class CallActivity : ProximitySensorActivity() { MotionEvent.ACTION_MOVE -> { v.animate().x(event.rawX + previewX).y(event.rawY + previewY).setDuration(0).start() } - else -> false + else -> { + v.performClick() + false + } } true } videoZoomHelper = VideoZoomHelper(this, binding.remoteVideoSurface) - viewModel.videoEnabledEvent.observe(this, Observer { - it.consume { videoEnabled -> - enableProximitySensor(!videoEnabled) - } + viewModel.proximitySensorEnabled.observe(this, Observer { + enableProximitySensor(it) }) } diff --git a/app/src/main/java/org/linphone/activities/call/IncomingCallActivity.kt b/app/src/main/java/org/linphone/activities/call/IncomingCallActivity.kt index 175d48918..fec88fae3 100644 --- a/app/src/main/java/org/linphone/activities/call/IncomingCallActivity.kt +++ b/app/src/main/java/org/linphone/activities/call/IncomingCallActivity.kt @@ -52,7 +52,7 @@ class IncomingCallActivity : GenericActivity() { binding = DataBindingUtil.setContentView(this, R.layout.call_incoming_activity) binding.lifecycleOwner = this - var incomingCall: Call? = findIncomingCall() + val incomingCall: Call? = findIncomingCall() if (incomingCall == null) { Log.e("[Incoming Call Activity] Couldn't find call in state Incoming") finish() @@ -92,7 +92,7 @@ class IncomingCallActivity : GenericActivity() { override fun onResume() { super.onResume() - var incomingCall: Call? = findIncomingCall() + val incomingCall: Call? = findIncomingCall() if (incomingCall == null) { Log.e("[Incoming Call Activity] Couldn't find call in state Incoming") finish() diff --git a/app/src/main/java/org/linphone/activities/call/OutgoingCallActivity.kt b/app/src/main/java/org/linphone/activities/call/OutgoingCallActivity.kt index 14b204359..78a161947 100644 --- a/app/src/main/java/org/linphone/activities/call/OutgoingCallActivity.kt +++ b/app/src/main/java/org/linphone/activities/call/OutgoingCallActivity.kt @@ -27,6 +27,7 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R +import org.linphone.activities.GenericActivity import org.linphone.activities.call.viewmodels.CallViewModel import org.linphone.activities.call.viewmodels.CallViewModelFactory import org.linphone.activities.call.viewmodels.ControlsViewModel @@ -36,7 +37,7 @@ import org.linphone.databinding.CallOutgoingActivityBinding import org.linphone.mediastream.Version import org.linphone.utils.PermissionHelper -class OutgoingCallActivity : ProximitySensorActivity() { +class OutgoingCallActivity : GenericActivity() { private lateinit var binding: CallOutgoingActivityBinding private lateinit var viewModel: CallViewModel private lateinit var controlsViewModel: ControlsViewModel @@ -49,7 +50,7 @@ class OutgoingCallActivity : ProximitySensorActivity() { binding = DataBindingUtil.setContentView(this, R.layout.call_outgoing_activity) binding.lifecycleOwner = this - var outgoingCall: Call? = findOutgoingCall() + val outgoingCall: Call? = findOutgoingCall() if (outgoingCall == null) { Log.e("[Outgoing Call Activity] Couldn't find call in state Outgoing") finish() @@ -103,7 +104,7 @@ class OutgoingCallActivity : ProximitySensorActivity() { override fun onResume() { super.onResume() - var outgoingCall: Call? = findOutgoingCall() + val outgoingCall: Call? = findOutgoingCall() if (outgoingCall == null) { Log.e("[Outgoing Call Activity] Couldn't find call in state Outgoing") finish() diff --git a/app/src/main/java/org/linphone/activities/call/ProximitySensorActivity.kt b/app/src/main/java/org/linphone/activities/call/ProximitySensorActivity.kt index ce7834b1a..e568fa157 100644 --- a/app/src/main/java/org/linphone/activities/call/ProximitySensorActivity.kt +++ b/app/src/main/java/org/linphone/activities/call/ProximitySensorActivity.kt @@ -42,12 +42,12 @@ abstract class ProximitySensorActivity : GenericActivity() { if (event.timestamp == 0L) return if (isProximitySensorNearby(event)) { if (!proximityWakeLock.isHeld) { - Log.i("[Call Activity] Acquiring proximity wake lock") + Log.i("[Proximity Sensor Activity] Acquiring proximity wake lock") proximityWakeLock.acquire() } } else { if (proximityWakeLock.isHeld) { - Log.i("[Call Activity] Releasing proximity wake lock") + Log.i("[Proximity Sensor Activity] Releasing proximity wake lock") proximityWakeLock.release() } } @@ -68,7 +68,7 @@ abstract class ProximitySensorActivity : GenericActivity() { ) proximitySensorFound = true } catch (ise: IllegalStateException) { - Log.e("[Call Activity] Failed to get proximity sensor: $ise") + Log.e("[Proximity Sensor Activity] Failed to get proximity sensor: $ise") } } @@ -89,19 +89,19 @@ abstract class ProximitySensorActivity : GenericActivity() { protected fun enableProximitySensor(enable: Boolean) { if (!proximitySensorFound) { - Log.w("[Call Activity] Couldn't find proximity sensor in this device, skipping") + Log.w("[Proximity Sensor Activity] Couldn't find proximity sensor in this device, skipping") return } if (enable) { if (!proximitySensorEnabled) { - Log.i("[Call Activity] Enabling proximity sensor listener") + Log.i("[Proximity Sensor Activity] Enabling proximity sensor listener") sensorManager.registerListener(proximityListener, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL) proximitySensorEnabled = true } } else { if (proximitySensorEnabled) { - Log.i("[Call Activity] Disabling proximity sensor listener") + Log.i("[Proximity Sensor Activity] Disabling proximity sensor listener") sensorManager.unregisterListener(proximityListener) if (proximityWakeLock.isHeld) { proximityWakeLock.release() @@ -116,7 +116,7 @@ abstract class ProximitySensorActivity : GenericActivity() { val distanceInCm = event.values[0] val maxDistance = event.sensor.maximumRange - Log.d("[Call Activity] Proximity sensor report [$distanceInCm] , for max range [$maxDistance]") + Log.d("[Proximity Sensor Activity] Proximity sensor report [$distanceInCm] , for max range [$maxDistance]") if (maxDistance <= threshold) { // Case binary 0/1 and short sensors diff --git a/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsFadingViewModel.kt b/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsFadingViewModel.kt index b27175a60..fcab5db3d 100644 --- a/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsFadingViewModel.kt +++ b/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsFadingViewModel.kt @@ -19,22 +19,25 @@ */ package org.linphone.activities.call.viewmodels +import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import java.util.* import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.core.AudioDevice import org.linphone.core.Call import org.linphone.core.Core import org.linphone.core.CoreListenerStub import org.linphone.core.tools.Log -import org.linphone.utils.Event class ControlsFadingViewModel : ViewModel() { val areControlsHidden = MutableLiveData() val isVideoPreviewHidden = MutableLiveData() - val videoEnabledEvent = MutableLiveData>() + private val videoEnabled = MutableLiveData() + private val nonEarpieceOutputAudioDevice = MutableLiveData() + val proximitySensorEnabled: MediatorLiveData = MediatorLiveData() private var timer: Timer? = null @@ -46,17 +49,24 @@ class ControlsFadingViewModel : ViewModel() { message: String? ) { if (state == Call.State.StreamsRunning || state == Call.State.Updating || state == Call.State.UpdatedByRemote) { - val videoEnabled = coreContext.isVideoCallOrConferenceActive() + val isVideoCall = coreContext.isVideoCallOrConferenceActive() Log.i("[Controls Fading] Call is in state $state, video is enabled? $videoEnabled") - if (videoEnabled) { - videoEnabledEvent.value = Event(true) + if (isVideoCall) { + videoEnabled.value = true startTimer() } else { - videoEnabledEvent.value = Event(false) + videoEnabled.value = false stopTimer() } } } + + override fun onAudioDeviceChanged(core: Core, audioDevice: AudioDevice) { + if (audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityPlay)) { + Log.i("[Controls Fading] Output audio device changed to: ${audioDevice.id}") + nonEarpieceOutputAudioDevice.value = audioDevice.type != AudioDevice.Type.Earpiece + } + } } init { @@ -64,12 +74,21 @@ class ControlsFadingViewModel : ViewModel() { areControlsHidden.value = false isVideoPreviewHidden.value = false + nonEarpieceOutputAudioDevice.value = coreContext.core.outputAudioDevice?.type != AudioDevice.Type.Earpiece - val videoEnabled = coreContext.isVideoCallOrConferenceActive() - if (videoEnabled) { - videoEnabledEvent.value = Event(true) + val isVideoCall = coreContext.isVideoCallOrConferenceActive() + videoEnabled.value = isVideoCall + if (isVideoCall) { startTimer() } + + proximitySensorEnabled.value = shouldEnableProximitySensor() + proximitySensorEnabled.addSource(videoEnabled) { + proximitySensorEnabled.value = shouldEnableProximitySensor() + } + proximitySensorEnabled.addSource(nonEarpieceOutputAudioDevice) { + proximitySensorEnabled.value = shouldEnableProximitySensor() + } } override fun onCleared() { @@ -84,6 +103,10 @@ class ControlsFadingViewModel : ViewModel() { startTimer() } + private fun shouldEnableProximitySensor(): Boolean { + return !(videoEnabled.value ?: false) && !(nonEarpieceOutputAudioDevice.value ?: false) + } + private fun stopTimer() { timer?.cancel() diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt index 804186c2e..3dfd75f38 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt @@ -518,7 +518,7 @@ class DetailChatRoomFragment : MasterFragment() { private fun openFile(contentFilePath: String) { val intent = Intent(Intent.ACTION_VIEW) - var path = contentFilePath + val path = contentFilePath val contentUri: Uri = FileUtils.getPublicFilePath(requireContext(), path) val filePath: String = contentUri.toString() Log.i("[Chat Message] Trying to open file: $filePath") diff --git a/app/src/main/java/org/linphone/utils/FileUtils.kt b/app/src/main/java/org/linphone/utils/FileUtils.kt index baa552fcb..b9d58b750 100644 --- a/app/src/main/java/org/linphone/utils/FileUtils.kt +++ b/app/src/main/java/org/linphone/utils/FileUtils.kt @@ -234,7 +234,7 @@ class FileUtils { } fun getPublicFilePath(context: Context, path: String): Uri { - var contentUri: Uri + val contentUri: Uri when { path.startsWith("file://") -> { val file = File(path.substring("file://".length)) diff --git a/app/src/main/res/layout-land/chat_room_master_fragment.xml b/app/src/main/res/layout-land/chat_room_master_fragment.xml index 918d2e630..e4d66a7c1 100644 --- a/app/src/main/res/layout-land/chat_room_master_fragment.xml +++ b/app/src/main/res/layout-land/chat_room_master_fragment.xml @@ -1,6 +1,5 @@ diff --git a/app/src/main/res/layout/chat_room_master_fragment.xml b/app/src/main/res/layout/chat_room_master_fragment.xml index 5a610d4ec..22b9cdc89 100644 --- a/app/src/main/res/layout/chat_room_master_fragment.xml +++ b/app/src/main/res/layout/chat_room_master_fragment.xml @@ -1,6 +1,5 @@