Add proximity sensor to OutgoingCallActivity too

This commit is contained in:
Sylvain Berfini 2020-04-05 16:08:07 +02:00
parent 7ba796c27a
commit 6ed309ca1d
3 changed files with 121 additions and 79 deletions

View file

@ -19,14 +19,8 @@
*/ */
package org.linphone.activities.call package org.linphone.activities.call
import android.content.Context
import android.content.res.Configuration import android.content.res.Configuration
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.os.Bundle import android.os.Bundle
import android.os.PowerManager
import android.view.Gravity import android.view.Gravity
import android.view.MotionEvent import android.view.MotionEvent
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
@ -34,14 +28,13 @@ import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericActivity
import org.linphone.activities.call.viewmodels.ControlsFadingViewModel import org.linphone.activities.call.viewmodels.ControlsFadingViewModel
import org.linphone.activities.call.viewmodels.SharedCallViewModel import org.linphone.activities.call.viewmodels.SharedCallViewModel
import org.linphone.compatibility.Compatibility import org.linphone.compatibility.Compatibility
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.databinding.CallActivityBinding import org.linphone.databinding.CallActivityBinding
class CallActivity : GenericActivity() { class CallActivity : ProximitySensorActivity() {
private lateinit var binding: CallActivityBinding private lateinit var binding: CallActivityBinding
private lateinit var viewModel: ControlsFadingViewModel private lateinit var viewModel: ControlsFadingViewModel
private lateinit var sharedViewModel: SharedCallViewModel private lateinit var sharedViewModel: SharedCallViewModel
@ -50,37 +43,9 @@ class CallActivity : GenericActivity() {
private var previewY: Float = 0f private var previewY: Float = 0f
private lateinit var videoZoomHelper: VideoZoomHelper private lateinit var videoZoomHelper: VideoZoomHelper
private lateinit var sensorManager: SensorManager
private lateinit var proximitySensor: Sensor
private lateinit var proximityWakeLock: PowerManager.WakeLock
private val proximityListener: SensorEventListener = object : SensorEventListener {
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { }
override fun onSensorChanged(event: SensorEvent) {
if (event.timestamp == 0L) return
if (isProximitySensorNearby(event)) {
if (!proximityWakeLock.isHeld) {
Log.i("[Call Activity] Acquiring proximity wake lock")
proximityWakeLock.acquire()
}
} else {
if (proximityWakeLock.isHeld) {
Log.i("[Call Activity] Releasing proximity wake lock")
proximityWakeLock.release()
}
}
}
}
private var proximitySensorEnabled = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)
proximityWakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager)
.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "$packageName;proximity_sensor")
binding = DataBindingUtil.setContentView(this, R.layout.call_activity) binding = DataBindingUtil.setContentView(this, R.layout.call_activity)
binding.lifecycleOwner = this binding.lifecycleOwner = this
@ -133,18 +98,10 @@ class CallActivity : GenericActivity() {
finish() finish()
} else { } else {
coreContext.removeCallOverlay() coreContext.removeCallOverlay()
val currentCall = coreContext.core.currentCall ?: coreContext.core.calls[0]
if (currentCall != null) {
val videoEnabled = currentCall.currentParams.videoEnabled()
enableProximitySensor(!videoEnabled)
}
} }
} }
override fun onPause() { override fun onPause() {
enableProximitySensor(false)
val core = coreContext.core val core = coreContext.core
if (core.callsNb > 0) { if (core.callsNb > 0) {
coreContext.createCallOverlay() coreContext.createCallOverlay()
@ -169,37 +126,4 @@ class CallActivity : GenericActivity() {
viewModel.areControlsHidden.value = true viewModel.areControlsHidden.value = true
} }
} }
private fun enableProximitySensor(enable: Boolean) {
if (enable) {
if (!proximitySensorEnabled) {
Log.i("[Call 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")
sensorManager.unregisterListener(proximityListener)
if (proximityWakeLock.isHeld) {
proximityWakeLock.release()
}
proximitySensorEnabled = false
}
}
}
private fun isProximitySensorNearby(event: SensorEvent): Boolean {
var threshold = 4.001f // <= 4 cm is near
val distanceInCm = event.values[0]
val maxDistance = event.sensor.maximumRange
Log.d("[Call Activity] Proximity sensor report [$distanceInCm] , for max range [$maxDistance]")
if (maxDistance <= threshold) {
// Case binary 0/1 and short sensors
threshold = maxDistance
}
return distanceInCm < threshold
}
} }

View file

@ -26,7 +26,6 @@ import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericActivity
import org.linphone.activities.call.viewmodels.CallViewModel import org.linphone.activities.call.viewmodels.CallViewModel
import org.linphone.activities.call.viewmodels.CallViewModelFactory import org.linphone.activities.call.viewmodels.CallViewModelFactory
import org.linphone.activities.call.viewmodels.ControlsViewModel import org.linphone.activities.call.viewmodels.ControlsViewModel
@ -36,7 +35,7 @@ import org.linphone.databinding.CallOutgoingActivityBinding
import org.linphone.mediastream.Version import org.linphone.mediastream.Version
import org.linphone.utils.PermissionHelper import org.linphone.utils.PermissionHelper
class OutgoingCallActivity : GenericActivity() { class OutgoingCallActivity : ProximitySensorActivity() {
private lateinit var binding: CallOutgoingActivityBinding private lateinit var binding: CallOutgoingActivityBinding
private lateinit var viewModel: CallViewModel private lateinit var viewModel: CallViewModel
private lateinit var controlsViewModel: ControlsViewModel private lateinit var controlsViewModel: ControlsViewModel

View file

@ -0,0 +1,119 @@
/*
* Copyright (c) 2010-2020 Belledonne Communications SARL.
*
* This file is part of linphone-android
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.linphone.activities.call
import android.content.Context
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.os.Bundle
import android.os.PowerManager
import org.linphone.LinphoneApplication
import org.linphone.activities.GenericActivity
import org.linphone.core.tools.Log
abstract class ProximitySensorActivity : GenericActivity() {
private lateinit var sensorManager: SensorManager
private lateinit var proximitySensor: Sensor
private lateinit var proximityWakeLock: PowerManager.WakeLock
private val proximityListener: SensorEventListener = object : SensorEventListener {
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { }
override fun onSensorChanged(event: SensorEvent) {
if (event.timestamp == 0L) return
if (isProximitySensorNearby(event)) {
if (!proximityWakeLock.isHeld) {
Log.i("[Call Activity] Acquiring proximity wake lock")
proximityWakeLock.acquire()
}
} else {
if (proximityWakeLock.isHeld) {
Log.i("[Call Activity] Releasing proximity wake lock")
proximityWakeLock.release()
}
}
}
}
private var proximitySensorEnabled = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)
proximityWakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager)
.newWakeLock(
PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK,
"$packageName;proximity_sensor"
)
}
override fun onResume() {
super.onResume()
if (LinphoneApplication.coreContext.core.callsNb > 0) {
val currentCall = LinphoneApplication.coreContext.core.currentCall ?: LinphoneApplication.coreContext.core.calls[0]
if (currentCall != null) {
val videoEnabled = currentCall.currentParams.videoEnabled()
enableProximitySensor(!videoEnabled)
}
}
}
override fun onPause() {
enableProximitySensor(false)
super.onPause()
}
protected fun enableProximitySensor(enable: Boolean) {
if (enable) {
if (!proximitySensorEnabled) {
Log.i("[Call 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")
sensorManager.unregisterListener(proximityListener)
if (proximityWakeLock.isHeld) {
proximityWakeLock.release()
}
proximitySensorEnabled = false
}
}
}
private fun isProximitySensorNearby(event: SensorEvent): Boolean {
var threshold = 4.001f // <= 4 cm is near
val distanceInCm = event.values[0]
val maxDistance = event.sensor.maximumRange
Log.d("[Call Activity] Proximity sensor report [$distanceInCm] , for max range [$maxDistance]")
if (maxDistance <= threshold) {
// Case binary 0/1 and short sensors
threshold = maxDistance
}
return distanceInCm < threshold
}
}