Релиз 1.4.7: фиксы lockscreen, звонков и стабильности

This commit is contained in:
2026-04-05 13:06:29 +05:00
parent 9e14724ae2
commit 9d04ec07e8
13 changed files with 406 additions and 131 deletions

View File

@@ -463,58 +463,47 @@ class MainActivity : FragmentActivity() {
handleCallLockScreen(intent)
}
private var callLockScreenJob: kotlinx.coroutines.Job? = null
private var callIntentResetJob: kotlinx.coroutines.Job? = null
/**
* Показать Activity поверх экрана блокировки при входящем звонке.
* При завершении звонка флаги снимаются чтобы не нарушать обычное поведение.
* Обрабатывает переход из call-notification.
* На lockscreen НЕ поднимаем MainActivity поверх keyguard и НЕ снимаем блокировку.
*/
private fun handleCallLockScreen(intent: Intent?) {
val isCallIntent = intent?.getBooleanExtra(
com.rosetta.messenger.network.CallForegroundService.EXTRA_OPEN_CALL_FROM_NOTIFICATION, false
) == true
if (isCallIntent) {
openedForCall = true
// Включаем экран и показываем поверх lock screen
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true)
setTurnScreenOn(true)
} else {
@Suppress("DEPRECATION")
window.addFlags(
android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
)
}
// Убираем lock screen полностью
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as? android.app.KeyguardManager
keyguardManager?.requestDismissKeyguard(this, null)
} else {
@Suppress("DEPRECATION")
window.addFlags(android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD)
}
// Снять флаги когда звонок закончится (отменяем предыдущий коллектор если был)
callLockScreenJob?.cancel()
callLockScreenJob = lifecycleScope.launch {
com.rosetta.messenger.network.CallManager.state.collect { state ->
if (state.phase == com.rosetta.messenger.network.CallPhase.IDLE) {
openedForCall = false
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(false)
setTurnScreenOn(false)
} else {
@Suppress("DEPRECATION")
window.clearFlags(
android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
)
val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as? android.app.KeyguardManager
val isDeviceLocked = keyguardManager?.isDeviceLocked == true
// Если экран заблокирован — не обходим auth и не показываем MainActivity поверх keyguard.
openedForCall = !isDeviceLocked
if (openedForCall) {
callIntentResetJob?.cancel()
callIntentResetJob = lifecycleScope.launch {
com.rosetta.messenger.network.CallManager.state.collect { state ->
if (state.phase == com.rosetta.messenger.network.CallPhase.IDLE) {
openedForCall = false
callIntentResetJob?.cancel()
callIntentResetJob = null
}
callLockScreenJob?.cancel()
callLockScreenJob = null
}
}
}
// На всякий случай принудительно чистим lock-screen флаги.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(false)
setTurnScreenOn(false)
} else {
@Suppress("DEPRECATION")
window.clearFlags(
android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON or
android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
)
}
}
}