Fix / bg sync for received by other session + dismiss full screen intent
This commit is contained in:
parent
33a962b721
commit
1de1ddd496
|
@ -42,6 +42,7 @@ import im.vector.app.core.di.HasVectorInjector
|
||||||
import im.vector.app.core.di.VectorComponent
|
import im.vector.app.core.di.VectorComponent
|
||||||
import im.vector.app.core.extensions.configureAndStart
|
import im.vector.app.core.extensions.configureAndStart
|
||||||
import im.vector.app.core.rx.RxConfig
|
import im.vector.app.core.rx.RxConfig
|
||||||
|
import im.vector.app.features.call.WebRtcPeerConnectionManager
|
||||||
import im.vector.app.features.configuration.VectorConfiguration
|
import im.vector.app.features.configuration.VectorConfiguration
|
||||||
import im.vector.app.features.disclaimer.doNotShowDisclaimerDialog
|
import im.vector.app.features.disclaimer.doNotShowDisclaimerDialog
|
||||||
import im.vector.app.features.lifecycle.VectorActivityLifecycleCallbacks
|
import im.vector.app.features.lifecycle.VectorActivityLifecycleCallbacks
|
||||||
|
@ -89,6 +90,7 @@ class VectorApplication :
|
||||||
@Inject lateinit var rxConfig: RxConfig
|
@Inject lateinit var rxConfig: RxConfig
|
||||||
@Inject lateinit var popupAlertManager: PopupAlertManager
|
@Inject lateinit var popupAlertManager: PopupAlertManager
|
||||||
@Inject lateinit var pinLocker: PinLocker
|
@Inject lateinit var pinLocker: PinLocker
|
||||||
|
@Inject lateinit var webRtcPeerConnectionManager: WebRtcPeerConnectionManager
|
||||||
|
|
||||||
lateinit var vectorComponent: VectorComponent
|
lateinit var vectorComponent: VectorComponent
|
||||||
|
|
||||||
|
@ -173,6 +175,7 @@ class VectorApplication :
|
||||||
})
|
})
|
||||||
ProcessLifecycleOwner.get().lifecycle.addObserver(appStateHandler)
|
ProcessLifecycleOwner.get().lifecycle.addObserver(appStateHandler)
|
||||||
ProcessLifecycleOwner.get().lifecycle.addObserver(pinLocker)
|
ProcessLifecycleOwner.get().lifecycle.addObserver(pinLocker)
|
||||||
|
ProcessLifecycleOwner.get().lifecycle.addObserver(webRtcPeerConnectionManager)
|
||||||
// This should be done as early as possible
|
// This should be done as early as possible
|
||||||
// initKnownEmojiHashSet(appContext)
|
// initKnownEmojiHashSet(appContext)
|
||||||
|
|
||||||
|
|
|
@ -88,6 +88,11 @@ class VectorCallViewModel @AssistedInject constructor(
|
||||||
|
|
||||||
private val currentCallListener = object : WebRtcPeerConnectionManager.CurrentCallListener {
|
private val currentCallListener = object : WebRtcPeerConnectionManager.CurrentCallListener {
|
||||||
override fun onCurrentCallChange(call: MxCall?) {
|
override fun onCurrentCallChange(call: MxCall?) {
|
||||||
|
// we need to check the state
|
||||||
|
if (call == null) {
|
||||||
|
// we should dismiss, e.g handled by other session?
|
||||||
|
_viewEvents.post(VectorCallViewEvents.DismissNoCall)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCaptureStateChanged() {
|
override fun onCaptureStateChanged() {
|
||||||
|
|
|
@ -18,11 +18,16 @@ package im.vector.app.features.call
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.hardware.camera2.CameraManager
|
import android.hardware.camera2.CameraManager
|
||||||
|
import android.os.SystemClock
|
||||||
import androidx.core.content.getSystemService
|
import androidx.core.content.getSystemService
|
||||||
|
import androidx.lifecycle.Lifecycle
|
||||||
|
import androidx.lifecycle.LifecycleObserver
|
||||||
|
import androidx.lifecycle.OnLifecycleEvent
|
||||||
import im.vector.app.ActiveSessionDataSource
|
import im.vector.app.ActiveSessionDataSource
|
||||||
import im.vector.app.core.services.BluetoothHeadsetReceiver
|
import im.vector.app.core.services.BluetoothHeadsetReceiver
|
||||||
import im.vector.app.core.services.CallService
|
import im.vector.app.core.services.CallService
|
||||||
import im.vector.app.core.services.WiredHeadsetStateReceiver
|
import im.vector.app.core.services.WiredHeadsetStateReceiver
|
||||||
|
import im.vector.app.push.fcm.FcmHelper
|
||||||
import io.reactivex.disposables.Disposable
|
import io.reactivex.disposables.Disposable
|
||||||
import io.reactivex.subjects.PublishSubject
|
import io.reactivex.subjects.PublishSubject
|
||||||
import io.reactivex.subjects.ReplaySubject
|
import io.reactivex.subjects.ReplaySubject
|
||||||
|
@ -71,8 +76,8 @@ import javax.inject.Singleton
|
||||||
@Singleton
|
@Singleton
|
||||||
class WebRtcPeerConnectionManager @Inject constructor(
|
class WebRtcPeerConnectionManager @Inject constructor(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val activeSessionDataSource: ActiveSessionDataSource
|
private val activeSessionDataSource: ActiveSessionDataSource,
|
||||||
) : CallsListener {
|
) : CallsListener, LifecycleObserver {
|
||||||
|
|
||||||
private val currentSession: Session?
|
private val currentSession: Session?
|
||||||
get() = activeSessionDataSource.currentValue?.orNull()
|
get() = activeSessionDataSource.currentValue?.orNull()
|
||||||
|
@ -170,6 +175,8 @@ class WebRtcPeerConnectionManager @Inject constructor(
|
||||||
|
|
||||||
private var currentCaptureMode: CaptureFormat = CaptureFormat.HD
|
private var currentCaptureMode: CaptureFormat = CaptureFormat.HD
|
||||||
|
|
||||||
|
private var isInBackground: Boolean = true
|
||||||
|
|
||||||
var capturerIsInError = false
|
var capturerIsInError = false
|
||||||
set(value) {
|
set(value) {
|
||||||
field = value
|
field = value
|
||||||
|
@ -201,6 +208,17 @@ class WebRtcPeerConnectionManager @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
|
||||||
|
fun entersForeground() {
|
||||||
|
isInBackground = false
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
|
||||||
|
fun entersBackground() {
|
||||||
|
isInBackground = true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
var currentCall: CallContext? = null
|
var currentCall: CallContext? = null
|
||||||
set(value) {
|
set(value) {
|
||||||
field = value
|
field = value
|
||||||
|
@ -703,7 +721,17 @@ class WebRtcPeerConnectionManager @Inject constructor(
|
||||||
|
|
||||||
callContext.offerSdp = callInviteContent.offer
|
callContext.offerSdp = callInviteContent.offer
|
||||||
|
|
||||||
currentSession?.startSync(true)
|
// If this is received while in background, the app will not sync,
|
||||||
|
// and thus won't be able to received events. For example if the call is
|
||||||
|
// accepted on an other session this device will continue ringing
|
||||||
|
if (isInBackground) {
|
||||||
|
if (FcmHelper.isPushSupported()) {
|
||||||
|
// only for push version as fdroid version is already doing it?
|
||||||
|
currentSession?.startAutomaticBackgroundSync(30, 0)
|
||||||
|
} else {
|
||||||
|
// Maybe increase sync freq? but how to set back to default values?
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createAnswer() {
|
private fun createAnswer() {
|
||||||
|
@ -851,6 +879,16 @@ class WebRtcPeerConnectionManager @Inject constructor(
|
||||||
Timber.v("## VOIP onCallManagedByOtherSession: $callId")
|
Timber.v("## VOIP onCallManagedByOtherSession: $callId")
|
||||||
currentCall = null
|
currentCall = null
|
||||||
CallService.onNoActiveCall(context)
|
CallService.onNoActiveCall(context)
|
||||||
|
|
||||||
|
// did we start background sync? so we should stop it
|
||||||
|
if (isInBackground) {
|
||||||
|
if (FcmHelper.isPushSupported()) {
|
||||||
|
currentSession?.stopAnyBackgroundSync()
|
||||||
|
} else {
|
||||||
|
// for fdroid we should not stop, it should continue syncing
|
||||||
|
// maybe we should restore default timeout/delay though?
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private inner class StreamObserver(val callContext: CallContext) : PeerConnection.Observer {
|
private inner class StreamObserver(val callContext: CallContext) : PeerConnection.Observer {
|
||||||
|
|
Loading…
Reference in New Issue