on xenial help sign in
Distinguish between incoming calls and other dialer-app opens. (LP: #1378218)

We previously treated any dialer-app open/focus as an "emergency mode" use. But now we'll be specific about it: just the emergency call button and any time there is an active call while the greeter is also active. Fixes: 1378218 Approved by: Michael Zanetti, PS Jenkins bot

commite83c89bb6c703a0baca5001712bbfb465d69bba3 authorMichael Terry <michael.terry@canonical.com> dateMon 13 Oct 2014, 15:41 (12 years ago) parentb544d307ce9bee
2 files changed+65−20
qml/Shell.qml+40−15 tests/qmltests/tst_ShellWithPin.qml+25−5
qml/Shell.qml+40−15
@@ -89,11 +89,13 @@ Item {
8989 }
9090 }
9191
92− function setLockedApp(app) {
93− if (shell.locked) {
94− greeter.lockedApp = app
95− lockscreen.hide()
92+ function startLockedApp(app) {
93+ if (!shell.locked) {
94+ console.warn("Called startLockedApp(%1) when not locked, ignoring".arg(app))
95+ return
9696 }
97+ greeter.lockedApp = app
98+ shell.activateApplication(app)
9799 }
98100
99101 Binding {
@@ -172,12 +174,18 @@ Item {
172174 target: ApplicationManager
173175 onFocusRequested: {
174176 if (greeter.narrowMode) {
175− if (appId === "dialer-app") {
176− // Always let the dialer-app through. Either user asked
177− // for an emergency call or accepted an incoming call.
178− setLockedApp(appId)
179− } else if (greeter.hasLockedApp && greeter.lockedApp !== appId) {
180− greeter.startUnlock()
177+ if (appId === "dialer-app" && callManager.hasCalls) {
178+ // If we are in the middle of a call, make dialer lockedApp and show it.
179+ // This can happen if user backs out of dialer back to greeter, then
180+ // launches dialer again.
181+ greeter.lockedApp = appId;
182+ }
183+ if (greeter.hasLockedApp) {
184+ if (appId === greeter.lockedApp) {
185+ lockscreen.hide() // show locked app
186+ } else {
187+ greeter.startUnlock() // show lockscreen if necessary
188+ }
181189 }
182190 greeter.hide();
183191 } else {
@@ -198,10 +206,8 @@ Item {
198206 if (greeter.shown && appId != "unity8-dash") {
199207 greeter.startUnlock()
200208 }
201− if (greeter.narrowMode && appId === "dialer-app") {
202− // Always let the dialer-app through. Either user asked
203− // for an emergency call or accepted an incoming call.
204− setLockedApp(appId)
209+ if (greeter.narrowMode && greeter.hasLockedApp && appId === greeter.lockedApp) {
210+ lockscreen.hide() // show locked app
205211 }
206212 launcher.hide();
207213 }
@@ -327,7 +333,7 @@ Item {
327333
328334 onEntered: LightDM.Greeter.respond(passphrase);
329335 onCancel: greeter.show()
330− onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter locked-app mode
336+ onEmergencyCall: startLockedApp("dialer-app")
331337
332338 onShownChanged: if (shown) greeter.lockedApp = ""
333339
@@ -564,6 +570,25 @@ Item {
564570 }
565571 }
566572
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+
567592 Connections {
568593 id: powerConnection
569594 target: Powerd
tests/qmltests/tst_ShellWithPin.qml+25−5
@@ -21,6 +21,7 @@ import AccountsService 0.1
2121import GSettings 1.0
2222import LightDM 0.1 as LightDM
2323import Ubuntu.SystemImage 0.1
24+import Ubuntu.Telephony 0.1 as Telephony
2425import Unity.Application 0.1
2526import Unity.Test 0.1 as UT
2627import Powerd 0.1
@@ -110,6 +111,11 @@ Row {
110111 signalName: "resettingDevice"
111112 }
112113
114+ Telephony.CallEntry {
115+ id: phoneCall
116+ phoneNumber: "+447812221111"
117+ }
118+
113119 UT.UnityTestCase {
114120 name: "ShellWithPin"
115121 when: windowShown
@@ -190,6 +196,16 @@ Row {
190196 }
191197 }
192198
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+
193209 function test_login() {
194210 sessionSpy.clear()
195211 tryCompare(sessionSpy, "count", 0)
@@ -340,11 +356,9 @@ Row {
340356 tryCompare(shell, "sideStageEnabled", false)
341357 tryCompare(applicationsDisplayLoader, "tabletMode", false)
342358
343− var app = ApplicationManager.startApplication("dialer-app")
344−
345− var greeter = findChild(shell, "greeter")
346− tryCompare(greeter, "showProgress", 0)
347− tryCompare(greeter, "hasLockedApp", true)
359+ var lockscreen = findChild(shell, "lockscreen")
360+ lockscreen.emergencyCall()
361+ confirmLockedApp("dialer-app")
348362
349363 // OK, we're in. Now try (but fail) to switch to tablet mode
350364 shell.tablet = true
@@ -353,9 +367,15 @@ Row {
353367
354368 // And when we kill the app, we go back to locked tablet mode
355369 killApps()
370+ var greeter = findChild(shell, "greeter")
356371 tryCompare(greeter, "showProgress", 1)
357372 tryCompare(shell, "sideStageEnabled", true)
358373 tryCompare(applicationsDisplayLoader, "tabletMode", true)
359374 }
375+
376+ function test_emergencyDialerIncoming() {
377+ callManager.foregroundCall = phoneCall
378+ confirmLockedApp("dialer-app")
379+ }
360380 }
361381}