@@ -15,6 +15,7 @@ import android.media.AudioFocusRequest
1515import android.media.AudioManager
1616import android.os.Build
1717import android.os.Bundle
18+ import android.os.PowerManager
1819import android.util.Rational
1920import android.view.WindowManager
2021import android.webkit.PermissionRequest
@@ -31,6 +32,7 @@ import androidx.compose.runtime.mutableStateOf
3132import androidx.compose.runtime.rememberUpdatedState
3233import androidx.core.app.PictureInPictureModeChangedInfo
3334import androidx.core.content.IntentCompat
35+ import androidx.core.content.getSystemService
3436import androidx.core.util.Consumer
3537import androidx.lifecycle.Lifecycle
3638import io.element.android.features.call.api.CallType
@@ -81,6 +83,12 @@ class ElementCallActivity :
8183
8284 private var eventSink: ((CallScreenEvents ) -> Unit )? = null
8385
86+ private val proximitySensorWakeLock: PowerManager .WakeLock ? by lazy {
87+ getSystemService<PowerManager >()
88+ ?.takeIf { it.isWakeLockLevelSupported(PowerManager .PROXIMITY_SCREEN_OFF_WAKE_LOCK ) }
89+ ?.newWakeLock(PowerManager .PROXIMITY_SCREEN_OFF_WAKE_LOCK , " $packageName :ProximitySensorCallWakeLock" )
90+ }
91+
8492 override fun onCreate (savedInstanceState : Bundle ? ) {
8593 super .onCreate(savedInstanceState)
8694
@@ -94,6 +102,13 @@ class ElementCallActivity :
94102 WindowManager .LayoutParams .FLAG_TURN_SCREEN_ON
95103 )
96104
105+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .O_MR1 ) {
106+ setShowWhenLocked(true )
107+ } else {
108+ @Suppress(" DEPRECATION" )
109+ window.addFlags(WindowManager .LayoutParams .FLAG_SHOW_WHEN_LOCKED )
110+ }
111+
97112 setCallType(intent)
98113 // If presenter is not created at this point, it means we have no call to display, the Activity is finishing, so return early
99114 if (! ::presenter.isInitialized) {
@@ -132,6 +147,26 @@ class ElementCallActivity :
132147 }
133148 }
134149
150+ override fun onStart () {
151+ super .onStart()
152+
153+ if (proximitySensorWakeLock?.isHeld == false ) {
154+ val proximitySensorEnabled = proximitySensorWakeLock?.acquire()
155+ Timber .d(" Proximity sensor wake lock acquired: $proximitySensorEnabled " )
156+ } else {
157+ Timber .d(" Proximity sensor wakelock does not exist or is already held" )
158+ }
159+ }
160+
161+ override fun onStop () {
162+ super .onStop()
163+
164+ if (proximitySensorWakeLock?.isHeld == true ) {
165+ proximitySensorWakeLock?.release()
166+ Timber .d(" Proximity sensor wake lock released" )
167+ }
168+ }
169+
135170 private fun setCallIsActive () {
136171 requestAudioFocus()
137172 CallForegroundService .start(this )
0 commit comments