@@ -87,9 +87,9 @@ Item {
8787 }
8888 }
8989
90− function setFakeActiveForApp(app) {
90+ function setLockedApp(app) {
9191 if (shell.locked) {
92− greeter.fakeActiveForApp = app
92+ greeter.lockedApp = app
9393 lockscreen.hide()
9494 }
9595 }
@@ -169,31 +169,37 @@ Item {
169169 Connections {
170170 target: ApplicationManager
171171 onFocusRequested: {
172− if (appId === "dialer-app") {
173− // Always let the dialer-app through. Either user asked
174− // for an emergency call or accepted an incoming call.
175− setFakeActiveForApp(appId)
176− } else if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== appId) {
177− lockscreen.show();
172+ 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()
179+ }
180+ greeter.hide();
181+ } else {
182+ if (LightDM.Greeter.active) {
183+ greeter.startUnlock()
184+ }
178185 }
179− greeter.hide();
180186 }
181187
182188 onFocusedApplicationIdChanged: {
183− if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== ApplicationManager.focusedApplicationId) {
184− lockscreen.show();
189+ if (greeter.hasLockedApp && greeter.lockedApp !== ApplicationManager.focusedApplicationId) {
190+ greeter.startUnlock()
185191 }
186192 panel.indicators.hide();
187193 }
188194
189195 onApplicationAdded: {
190196 if (greeter.shown && appId != "unity8-dash") {
191− greeter.hide();
197+ greeter.startUnlock()
192198 }
193− if (appId === "dialer-app") {
199+ if (greeter.narrowMode && appId === "dialer-app") {
194200 // Always let the dialer-app through. Either user asked
195201 // for an emergency call or accepted an incoming call.
196− setFakeActiveForApp(appId)
202+ setLockedApp(appId)
197203 }
198204 launcher.hide();
199205 }
@@ -201,9 +207,19 @@ Item {
201207
202208 Loader {
203209 id: applicationsDisplayLoader
210+ objectName: "applicationsDisplayLoader"
204211 anchors.fill: parent
205212
206− source: shell.sideStageEnabled ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
213+ // When we have a locked app, we only want to show that one app.
214+ // FIXME: do this in a less traumatic way. We currently only allow
215+ // locked apps in phone mode (see FIXME in Lockscreen component in
216+ // this same file). When that changes, we need to do something
217+ // nicer here. But this code is currently just to prevent a
218+ // theoretical attack where user enters lockedApp mode, then makes
219+ // the screen larger (maybe connects to monitor) and tries to enter
220+ // tablet mode.
221+ property bool tabletMode: shell.sideStageEnabled && !greeter.hasLockedApp
222+ source: tabletMode ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
207223
208224 Binding {
209225 target: applicationsDisplayLoader.item
@@ -229,7 +245,7 @@ Item {
229245 Binding {
230246 target: applicationsDisplayLoader.item
231247 property: "spreadEnabled"
232− value: edgeDemo.stagesEnabled && greeter.fakeActiveForApp === "" // to support emergency dialer hack
248+ value: edgeDemo.stagesEnabled && !greeter.hasLockedApp
233249 }
234250 Binding {
235251 target: applicationsDisplayLoader.item
@@ -304,14 +320,14 @@ Item {
304320 // and wider screens are tablets which don't. When we do allow this
305321 // on devices with a side stage and a SIM, work should be done to
306322 // ensure that the main stage is disabled while the dialer is present
307− // in the side stage.
323+ // in the side stage. See the FIXME in the stage loader in this file.
308324 showEmergencyCallButton: !shell.sideStageEnabled
309325
310326 onEntered: LightDM.Greeter.respond(passphrase);
311327 onCancel: greeter.show()
312− onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter fake-active mode
328+ onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter locked-app mode
313329
314− onShownChanged: if (shown) greeter.fakeActiveForApp = ""
330+ onShownChanged: if (shown) greeter.lockedApp = ""
315331
316332 Timer {
317333 id: forcedDelayTimer
@@ -367,11 +383,13 @@ Item {
367383 if (!LightDM.Greeter.active) {
368384 return; // could happen if hideGreeter() comes in before we prompt
369385 }
370− if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
371− lockscreen.hide()
372− } else {
373− lockscreen.reset();
374− lockscreen.show();
386+ if (greeter.narrowMode) {
387+ if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
388+ lockscreen.hide()
389+ } else {
390+ lockscreen.reset();
391+ lockscreen.show();
392+ }
375393 }
376394 }
377395
@@ -422,7 +440,7 @@ Item {
422440 Binding {
423441 target: LightDM.Greeter
424442 property: "active"
425− value: greeter.shown || lockscreen.shown || greeter.fakeActiveForApp != ""
443+ value: greeter.shown || lockscreen.shown || greeter.hasLockedApp
426444 }
427445
428446 Rectangle {
@@ -434,7 +452,8 @@ Item {
434452 Item {
435453 // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
436454 id: greeterWrapper
437− x: launcher.progress
455+ objectName: "greeterWrapper"
456+ x: greeter.narrowMode ? launcher.progress : 0
438457 y: panel.panelHeight
439458 width: parent.width
440459 height: parent.height - panel.panelHeight
@@ -447,7 +466,7 @@ Item {
447466 property bool fullyShown: showProgress === 1.0
448467 onFullyShownChanged: {
449468 // Wait until the greeter is completely covering lockscreen before resetting it.
450− if (fullyShown && !LightDM.Greeter.authenticated) {
469+ if (greeter.narrowMode && fullyShown && !LightDM.Greeter.authenticated) {
451470 lockscreen.reset();
452471 lockscreen.show();
453472 }
@@ -456,7 +475,7 @@ Item {
456475 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
457476 onShowProgressChanged: {
458477 if (showProgress === 0) {
459− if (LightDM.Greeter.authenticated) {
478+ if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
460479 greeter.login()
461480 } else if (greeter.narrowMode) {
462481 lockscreen.clear(false) // to reset focus if necessary
@@ -470,13 +489,16 @@ Item {
470489
471490 signal sessionStarted() // helpful for tests
472491
473− property string fakeActiveForApp: ""
492+ property string lockedApp: ""
493+ property bool hasLockedApp: lockedApp !== ""
474494
475495 available: true
476496 hides: [launcher, panel.indicators]
477497 shown: true
478498 loadContent: required || lockscreen.required // keeps content in memory for quick show()
479499
500+ locked: shell.locked
501+
480502 defaultBackground: shell.background
481503
482504 width: parent.width
@@ -484,6 +506,18 @@ Item {
484506
485507 dragHandleWidth: shell.edgeSize
486508
509+ function startUnlock() {
510+ if (narrowMode) {
511+ if (!LightDM.Greeter.authenticated) {
512+ lockscreen.show()
513+ }
514+ hide()
515+ } else {
516+ show()
517+ tryToUnlock()
518+ }
519+ }
520+
487521 function login() {
488522 enabled = false;
489523 if (LightDM.Greeter.startSessionSync()) {
@@ -504,8 +538,10 @@ Item {
504538
505539 if (greeter.narrowMode) {
506540 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
541+ } else {
542+ reset()
507543 }
508− greeter.fakeActiveForApp = "";
544+ greeter.lockedApp = "";
509545 greeter.forceActiveFocus();
510546 }
511547 }
@@ -550,10 +586,7 @@ Item {
550586 }
551587
552588 if (LightDM.Greeter.active) {
553− if (!LightDM.Greeter.authenticated) {
554− lockscreen.show()
555− }
556− greeter.hide()
589+ greeter.startUnlock()
557590 }
558591
559592 var animate = !LightDM.Greeter.active && !stages.shown
@@ -562,7 +595,8 @@ Item {
562595 }
563596
564597 function showDash() {
565− if (greeter.fakeActiveForApp !== "") { // just in case user gets here
598+ if (greeter.hasLockedApp || // just in case user gets here
599+ (!greeter.narrowMode && shell.locked)) {
566600 return
567601 }
568602
@@ -589,7 +623,7 @@ Item {
589623 anchors.fill: parent //because this draws indicator menus
590624 indicators {
591625 hides: [launcher]
592− available: edgeDemo.panelEnabled && (!shell.locked || AccountsService.enableIndicatorsWhileLocked) && greeter.fakeActiveForApp === ""
626+ available: edgeDemo.panelEnabled && (!shell.locked || AccountsService.enableIndicatorsWhileLocked) && !greeter.hasLockedApp
593627 contentEnabled: edgeDemo.panelContentEnabled
594628 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
595629 panelHeight: units.gu(3)
@@ -600,7 +634,7 @@ Item {
600634 ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).fullscreen
601635
602636 fullscreenMode: (topmostApplicationIsFullscreen && !LightDM.Greeter.active && launcher.progress == 0)
603− || greeter.fakeActiveForApp !== ""
637+ || greeter.hasLockedApp
604638 }
605639
606640 Launcher {
@@ -613,7 +647,7 @@ Item {
613647 anchors.bottom: parent.bottom
614648 width: parent.width
615649 dragAreaWidth: shell.edgeSize
616− available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && greeter.fakeActiveForApp === ""
650+ available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && !greeter.hasLockedApp
617651
618652 onShowDashHome: showHome()
619653 onDash: showDash()
@@ -623,8 +657,8 @@ Item {
623657 }
624658 }
625659 onLauncherApplicationSelected: {
626− if (greeter.fakeActiveForApp !== "") {
627− lockscreen.show()
660+ if (greeter.hasLockedApp) {
661+ greeter.startUnlock()
628662 }
629663 if (!edgeDemo.running)
630664 shell.activateApplication(appId)