@@ -87,11 +87,13 @@ Item {
8787 }
8888 }
8989
90− function setLockedApp(app) {
91− if (shell.locked) {
92− greeter.lockedApp = app
93− lockscreen.hide()
90+ function startLockedApp(app) {
91+ if (!shell.locked) {
92+ console.warn("Called startLockedApp(%1) when not locked, ignoring".arg(app))
93+ return
9494 }
95+ greeter.lockedApp = app
96+ shell.activateApplication(app)
9597 }
9698
9799 Binding {
@@ -170,12 +172,12 @@ Item {
170172 target: ApplicationManager
171173 onFocusRequested: {
172174 if (greeter.narrowMode) {
173− if (appId === "dialer-app") {
174− // Always let the dialer-app through. Either user asked
175− // for an emergency call or accepted an incoming call.
176− setLockedApp(appId)
177− } else if (greeter.hasLockedApp && greeter.lockedApp !== appId) {
178− greeter.startUnlock()
175+ if (greeter.hasLockedApp) {
176+ if (appId === greeter.lockedApp) {
177+ lockscreen.hide() // show locked app
178+ } else {
179+ greeter.startUnlock() // show lockscreen if necessary
180+ }
179181 }
180182 greeter.hide();
181183 } else {
@@ -196,10 +198,8 @@ Item {
196198 if (greeter.shown && appId != "unity8-dash") {
197199 greeter.startUnlock()
198200 }
199− if (greeter.narrowMode && appId === "dialer-app") {
200− // Always let the dialer-app through. Either user asked
201− // for an emergency call or accepted an incoming call.
202− setLockedApp(appId)
201+ if (greeter.narrowMode && greeter.hasLockedApp && appId === greeter.lockedApp) {
202+ lockscreen.hide() // show locked app
203203 }
204204 launcher.hide();
205205 }
@@ -318,7 +318,7 @@ Item {
318318
319319 onEntered: LightDM.Greeter.respond(passphrase);
320320 onCancel: greeter.show()
321− onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter locked-app mode
321+ onEmergencyCall: startLockedApp("dialer-app")
322322
323323 onShownChanged: if (shown) greeter.lockedApp = ""
324324
@@ -548,6 +548,25 @@ Item {
548548 }
549549 }
550550
551+ Connections {
552+ id: callConnection
553+ target: callManager
554+
555+ onHasCallsChanged: {
556+ if (shell.locked && callManager.hasCalls) {
557+ // We just received an incoming call while locked. The
558+ // indicator will have already launched dialer-app for us, but
559+ // there is a race between "hasCalls" changing and the dialer
560+ // starting up. So in case we lose that race, we'll start/
561+ // focus the dialer ourselves here too. Even if the indicator
562+ // didn't launch the dialer for some reason (or maybe a call
563+ // started via some other means), if an active call is
564+ // happening, we want to be in the dialer.
565+ startLockedApp("dialer-app")
566+ }
567+ }
568+ }
569+
551570 Connections {
552571 id: powerConnection
553572 target: Powerd