77
88package im.vector.app.features.call
99
10+ import android.Manifest
1011import android.app.Activity
1112import android.app.KeyguardManager
1213import android.app.PictureInPictureParams
1314import android.content.Context
1415import android.content.Intent
1516import android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP
17+ import android.content.pm.PackageManager
1618import android.graphics.Color
1719import android.media.projection.MediaProjection
1820import android.media.projection.MediaProjectionManager
@@ -31,6 +33,8 @@ import androidx.core.content.getSystemService
3133import androidx.core.util.Consumer
3234import androidx.core.view.isInvisible
3335import androidx.core.view.isVisible
36+ import androidx.lifecycle.Lifecycle
37+ import androidx.lifecycle.ProcessLifecycleOwner
3438import com.airbnb.mvrx.Fail
3539import com.airbnb.mvrx.Mavericks
3640import com.airbnb.mvrx.viewModel
@@ -48,6 +52,7 @@ import im.vector.app.core.utils.PERMISSIONS_FOR_VIDEO_IP_CALL
4852import im.vector.app.core.utils.checkPermissions
4953import im.vector.app.core.utils.registerForPermissionsResult
5054import im.vector.app.databinding.ActivityCallBinding
55+ import im.vector.app.features.call.audio.MicrophoneAccessService
5156import im.vector.app.features.call.dialpad.CallDialPadBottomSheet
5257import im.vector.app.features.call.dialpad.DialPadFragment
5358import im.vector.app.features.call.transfer.CallTransferActivity
@@ -236,6 +241,43 @@ class VectorCallActivity :
236241 }
237242 }
238243
244+ private fun startMicrophoneService () {
245+ if (ContextCompat .checkSelfPermission(this , Manifest .permission.RECORD_AUDIO )
246+ == PackageManager .PERMISSION_GRANTED ) {
247+
248+ // Only start the service if the app is in the foreground
249+ if (isAppInForeground()) {
250+ Timber .tag(loggerTag.value).v(" Starting microphone foreground service" )
251+ val intent = Intent (this , MicrophoneAccessService ::class .java)
252+ ContextCompat .startForegroundService(this , intent)
253+ } else {
254+ Timber .tag(loggerTag.value).v(" App is not in foreground; cannot start microphone service" )
255+ }
256+ } else {
257+ Timber .tag(loggerTag.value).v(" Microphone permission not granted; cannot start service" )
258+ }
259+ }
260+
261+ private fun isAppInForeground (): Boolean {
262+ val appProcess = ProcessLifecycleOwner .get().lifecycle.currentState.isAtLeast(Lifecycle .State .STARTED )
263+ return appProcess
264+ }
265+ private fun stopMicrophoneService () {
266+ Timber .tag(loggerTag.value).d(" Stopping MicrophoneAccessService (if needed)." )
267+ val intent = Intent (this , MicrophoneAccessService ::class .java)
268+ stopService(intent)
269+ }
270+
271+ override fun onPause () {
272+ super .onPause()
273+ startMicrophoneService()
274+ }
275+
276+ override fun onResume () {
277+ super .onResume()
278+ stopMicrophoneService()
279+ }
280+
239281 override fun onDestroy () {
240282 detachRenderersIfNeeded()
241283 turnScreenOffAndKeyguardOn()
0 commit comments