Релиз 1.4.7: фиксы lockscreen, звонков и стабильности
This commit is contained in:
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user