feat: full-screen incoming call UI over lock screen

Enable proper full-screen call experience when the phone is locked
or the app is in the background:

- CallActivity shows over lock screen (setShowWhenLocked/turnScreenOn)
- Manifest adds showOnLockScreen and turnScreenOn attributes
- Remove setSilent(true) from notification — it was blocking the
  full-screen intent from triggering (channel silence is enough)
- Populate ActiveCallHolder eagerly in initCallController() so the
  full-screen intent can launch CallActivity even when the Compose
  UI is paused in the background

https://claude.ai/code/session_01Ak5tTkujpjNG1r5ASuPipZ
This commit is contained in:
Claude
2026-04-02 20:47:56 +00:00
parent dbdd53c6c3
commit 724fd10405
4 changed files with 19 additions and 1 deletions
+2
View File
@@ -213,6 +213,8 @@
android:launchMode="singleTop"
android:exported="false"
android:resizeableActivity="true"
android:showOnLockScreen="true"
android:turnScreenOn="true"
android:theme="@style/Theme.Amethyst"
/>
@@ -602,7 +602,6 @@ object NotificationUtils {
.setOngoing(true)
.setTimeoutAfter(60_000)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setSilent(true)
.addAction(R.drawable.amethyst, stringRes(applicationContext, R.string.call_reject), rejectPendingIntent)
.addAction(R.drawable.amethyst, stringRes(applicationContext, R.string.call_accept), acceptPendingIntent)
@@ -70,6 +70,18 @@ class CallActivity : AppCompatActivity() {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
// Show over lock screen and turn screen on for incoming calls
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,
)
}
val callManager = ActiveCallHolder.callManager
val callController = ActiveCallHolder.callController
val accountViewModel = ActiveCallHolder.accountViewModel
@@ -224,6 +224,11 @@ class AccountViewModel(
callManager.onAnswerReceived = { event -> controller.onCallAnswerReceived(event.sdpAnswer()) }
callManager.onIceCandidateReceived = { event -> controller.onIceCandidateReceived(event) }
callController = controller
// Populate ActiveCallHolder so CallActivity can launch even when the app
// is in the background (e.g. full-screen incoming call intent).
com.vitorpamplona.amethyst.ui.call.ActiveCallHolder
.set(callManager, controller, this)
}
val eventSync =