on xenial help sign in
Distinguish between incoming calls and other dialer-app opens. (LP: #1378218)
e83c89bMichael Terry
qml/Shell.qml+40−15
@@ -89,11 +89,13 @@ Item {
89 }
89 }
90 }
90 }
91
91
92− function setLockedApp(app) {
92+ function startLockedApp(app) {
93− if (shell.locked) {
93+ if (!shell.locked) {
94− greeter.lockedApp = app
94+ console.warn("Called startLockedApp(%1) when not locked, ignoring".arg(app))
95− lockscreen.hide()
95+ return
96 }
96 }
97+ greeter.lockedApp = app
98+ shell.activateApplication(app)
97 }
99 }
98
100
99 Binding {
101 Binding {
@@ -172,12 +174,18 @@ Item {
172 target: ApplicationManager
174 target: ApplicationManager
173 onFocusRequested: {
175 onFocusRequested: {
174 if (greeter.narrowMode) {
176 if (greeter.narrowMode) {
175− if (appId === "dialer-app") {
177+ if (appId === "dialer-app" && callManager.hasCalls) {
176− // Always let the dialer-app through. Either user asked
178+ // If we are in the middle of a call, make dialer lockedApp and show it.
177− // for an emergency call or accepted an incoming call.
179+ // This can happen if user backs out of dialer back to greeter, then
178− setLockedApp(appId)
180+ // launches dialer again.
179− } else if (greeter.hasLockedApp && greeter.lockedApp !== appId) {
181+ greeter.lockedApp = appId;
182+ }
183+ if (greeter.hasLockedApp) {
184+ if (appId === greeter.lockedApp) {
185+ lockscreen.hide() // show locked app
186+ } else {
180− greeter.startUnlock()
187+ greeter.startUnlock() // show lockscreen if necessary
188+ }
181 }
189 }
182 greeter.hide();
190 greeter.hide();
183 } else {
191 } else {
@@ -198,10 +206,8 @@ Item {
198 if (greeter.shown && appId != "unity8-dash") {
206 if (greeter.shown && appId != "unity8-dash") {
199 greeter.startUnlock()
207 greeter.startUnlock()
200 }
208 }
201− if (greeter.narrowMode && appId === "dialer-app") {
209+ if (greeter.narrowMode && greeter.hasLockedApp && appId === greeter.lockedApp) {
202− // Always let the dialer-app through. Either user asked
210+ lockscreen.hide() // show locked app
203− // for an emergency call or accepted an incoming call.
204− setLockedApp(appId)
205 }
211 }
206 launcher.hide();
212 launcher.hide();
207 }
213 }
@@ -327,7 +333,7 @@ Item {
327
333
328 onEntered: LightDM.Greeter.respond(passphrase);
334 onEntered: LightDM.Greeter.respond(passphrase);
329 onCancel: greeter.show()
335 onCancel: greeter.show()
330− onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter locked-app mode
336+ onEmergencyCall: startLockedApp("dialer-app")
331
337
332 onShownChanged: if (shown) greeter.lockedApp = ""
338 onShownChanged: if (shown) greeter.lockedApp = ""
333
339
@@ -564,6 +570,25 @@ Item {
564 }
570 }
565 }
571 }
566
572
573+ Connections {
574+ id: callConnection
575+ target: callManager
576+
577+ onHasCallsChanged: {
578+ if (shell.locked && callManager.hasCalls) {
579+ // We just received an incoming call while locked. The
580+ // indicator will have already launched dialer-app for us, but
581+ // there is a race between "hasCalls" changing and the dialer
582+ // starting up. So in case we lose that race, we'll start/
583+ // focus the dialer ourselves here too. Even if the indicator
584+ // didn't launch the dialer for some reason (or maybe a call
585+ // started via some other means), if an active call is
586+ // happening, we want to be in the dialer.
587+ startLockedApp("dialer-app")
588+ }
589+ }
590+ }
591+
567 Connections {
592 Connections {
568 id: powerConnection
593 id: powerConnection
569 target: Powerd
594 target: Powerd
tests/qmltests/tst_ShellWithPin.qml+25−5
@@ -21,6 +21,7 @@ import AccountsService 0.1
21import GSettings 1.0
21import GSettings 1.0
22import LightDM 0.1 as LightDM
22import LightDM 0.1 as LightDM
23import Ubuntu.SystemImage 0.1
23import Ubuntu.SystemImage 0.1
24+import Ubuntu.Telephony 0.1 as Telephony
24import Unity.Application 0.1
25import Unity.Application 0.1
25import Unity.Test 0.1 as UT
26import Unity.Test 0.1 as UT
26import Powerd 0.1
27import Powerd 0.1
@@ -110,6 +111,11 @@ Row {
110 signalName: "resettingDevice"
111 signalName: "resettingDevice"
111 }
112 }
112
113
114+ Telephony.CallEntry {
115+ id: phoneCall
116+ phoneNumber: "+447812221111"
117+ }
118+
113 UT.UnityTestCase {
119 UT.UnityTestCase {
114 name: "ShellWithPin"
120 name: "ShellWithPin"
115 when: windowShown
121 when: windowShown
@@ -190,6 +196,16 @@ Row {
190 }
196 }
191 }
197 }
192
198
199+ function confirmLockedApp(app) {
200+ var greeter = findChild(shell, "greeter")
201+ var lockscreen = findChild(shell, "lockscreen")
202+ tryCompare(greeter, "shown", false)
203+ tryCompare(lockscreen, "shown", false)
204+ tryCompare(greeter, "hasLockedApp", true)
205+ tryCompare(greeter, "lockedApp", app)
206+ tryCompare(ApplicationManager, "focusedApplicationId", app)
207+ }
208+
193 function test_login() {
209 function test_login() {
194 sessionSpy.clear()
210 sessionSpy.clear()
195 tryCompare(sessionSpy, "count", 0)
211 tryCompare(sessionSpy, "count", 0)
@@ -340,11 +356,9 @@ Row {
340 tryCompare(shell, "sideStageEnabled", false)
356 tryCompare(shell, "sideStageEnabled", false)
341 tryCompare(applicationsDisplayLoader, "tabletMode", false)
357 tryCompare(applicationsDisplayLoader, "tabletMode", false)
342
358
343− var app = ApplicationManager.startApplication("dialer-app")
359+ var lockscreen = findChild(shell, "lockscreen")
344−
360+ lockscreen.emergencyCall()
345− var greeter = findChild(shell, "greeter")
361+ confirmLockedApp("dialer-app")
346− tryCompare(greeter, "showProgress", 0)
347− tryCompare(greeter, "hasLockedApp", true)
348
362
349 // OK, we're in. Now try (but fail) to switch to tablet mode
363 // OK, we're in. Now try (but fail) to switch to tablet mode
350 shell.tablet = true
364 shell.tablet = true
@@ -353,9 +367,15 @@ Row {
353
367
354 // And when we kill the app, we go back to locked tablet mode
368 // And when we kill the app, we go back to locked tablet mode
355 killApps()
369 killApps()
370+ var greeter = findChild(shell, "greeter")
356 tryCompare(greeter, "showProgress", 1)
371 tryCompare(greeter, "showProgress", 1)
357 tryCompare(shell, "sideStageEnabled", true)
372 tryCompare(shell, "sideStageEnabled", true)
358 tryCompare(applicationsDisplayLoader, "tabletMode", true)
373 tryCompare(applicationsDisplayLoader, "tabletMode", true)
359 }
374 }
375+
376+ function test_emergencyDialerIncoming() {
377+ callManager.foregroundCall = phoneCall
378+ confirmLockedApp("dialer-app")
379+ }
360 }
380 }
361}
381}