@@ -87,9 +87,9 @@ Item {
90− function setFakeActiveForApp(app) {
90+ function setLockedApp(app) {
91 if (shell.locked) {
91 if (shell.locked) {
92− greeter.fakeActiveForApp = app
92+ greeter.lockedApp = app
93 lockscreen.hide()
93 lockscreen.hide()
@@ -133,6 +133,13 @@ Item {
133 z: edgeDemo.z + 10
133 z: edgeDemo.z + 10
137+ target: ApplicationManager
138+ property: "forceDashActive"
139+ value: launcher.shown || launcher.dashSwipe
136 WindowKeysFilter {
143 WindowKeysFilter {
137 // Handle but do not filter out volume keys
144 // Handle but do not filter out volume keys
138 Keys.onVolumeUpPressed: { volumeControl.volumeUp(); event.accepted = false; }
145 Keys.onVolumeUpPressed: { volumeControl.volumeUp(); event.accepted = false; }
@@ -169,32 +176,37 @@ Item {
169 Connections {
176 Connections {
170 target: ApplicationManager
177 target: ApplicationManager
171 onFocusRequested: {
178 onFocusRequested: {
179+ if (greeter.narrowMode) {
172− if (appId === "dialer-app") {
180+ if (appId === "dialer-app") {
173− // Always let the dialer-app through. Either user asked
181+ // Always let the dialer-app through. Either user asked
174− // for an emergency call or accepted an incoming call.
182+ // for an emergency call or accepted an incoming call.
175− setFakeActiveForApp(appId)
183+ setLockedApp(appId)
176− } else if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== appId) {
184+ } else if (greeter.hasLockedApp && greeter.lockedApp !== appId) {
177− lockscreen.show();
185+ greeter.startUnlock()
189+ if (LightDM.Greeter.active) {
190+ greeter.startUnlock()
183 onFocusedApplicationIdChanged: {
195 onFocusedApplicationIdChanged: {
184− if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== ApplicationManager.focusedApplicationId) {
196+ if (greeter.hasLockedApp && greeter.lockedApp !== ApplicationManager.focusedApplicationId) {
185− lockscreen.show();
197+ greeter.startUnlock()
187 panel.indicators.hide();
199 panel.indicators.hide();
190 onApplicationAdded: {
202 onApplicationAdded: {
191 if (greeter.shown && appId != "unity8-dash") {
203 if (greeter.shown && appId != "unity8-dash") {
192− greeter.hide();
204+ greeter.startUnlock()
194− if (appId === "dialer-app") {
206+ if (greeter.narrowMode && appId === "dialer-app") {
195 // Always let the dialer-app through. Either user asked
207 // Always let the dialer-app through. Either user asked
196 // for an emergency call or accepted an incoming call.
208 // for an emergency call or accepted an incoming call.
197− setFakeActiveForApp(appId)
209+ setLockedApp(appId)
199 launcher.hide();
211 launcher.hide();
@@ -202,9 +214,19 @@ Item {
204 id: applicationsDisplayLoader
216 id: applicationsDisplayLoader
217+ objectName: "applicationsDisplayLoader"
205 anchors.fill: parent
218 anchors.fill: parent
220+ // When we have a locked app, we only want to show that one app.
221+ // FIXME: do this in a less traumatic way. We currently only allow
222+ // locked apps in phone mode (see FIXME in Lockscreen component in
223+ // this same file). When that changes, we need to do something
224+ // nicer here. But this code is currently just to prevent a
225+ // theoretical attack where user enters lockedApp mode, then makes
226+ // the screen larger (maybe connects to monitor) and tries to enter
228+ property bool tabletMode: shell.sideStageEnabled && !greeter.hasLockedApp
207− source: shell.sideStageEnabled ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
229+ source: tabletMode ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
209 Binding {
231 Binding {
210 target: applicationsDisplayLoader.item
232 target: applicationsDisplayLoader.item
@@ -230,7 +252,7 @@ Item {
230 Binding {
252 Binding {
231 target: applicationsDisplayLoader.item
253 target: applicationsDisplayLoader.item
232 property: "spreadEnabled"
254 property: "spreadEnabled"
233− value: edgeDemo.stagesEnabled && greeter.fakeActiveForApp === "" // to support emergency dialer hack
255+ value: edgeDemo.stagesEnabled && !greeter.hasLockedApp
235 Binding {
257 Binding {
236 target: applicationsDisplayLoader.item
258 target: applicationsDisplayLoader.item
@@ -305,14 +327,14 @@ Item {
305 // and wider screens are tablets which don't. When we do allow this
327 // and wider screens are tablets which don't. When we do allow this
306 // on devices with a side stage and a SIM, work should be done to
328 // on devices with a side stage and a SIM, work should be done to
307 // ensure that the main stage is disabled while the dialer is present
329 // ensure that the main stage is disabled while the dialer is present
308− // in the side stage.
330+ // in the side stage. See the FIXME in the stage loader in this file.
309 showEmergencyCallButton: !shell.sideStageEnabled
331 showEmergencyCallButton: !shell.sideStageEnabled
311 onEntered: LightDM.Greeter.respond(passphrase);
333 onEntered: LightDM.Greeter.respond(passphrase);
312 onCancel: greeter.show()
334 onCancel: greeter.show()
313− onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter fake-active mode
335+ onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter locked-app mode
315− onShownChanged: if (shown) greeter.fakeActiveForApp = ""
337+ onShownChanged: if (shown) greeter.lockedApp = ""
318 id: forcedDelayTimer
340 id: forcedDelayTimer
@@ -361,11 +383,13 @@ Item {
363 onPromptlessChanged: {
385 onPromptlessChanged: {
386+ if (greeter.narrowMode) {
364− if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
387+ if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
365− lockscreen.hide()
388+ lockscreen.hide()
366− } else {
389+ } else {
367− lockscreen.reset();
390+ lockscreen.reset();
368− lockscreen.show();
391+ lockscreen.show();
@@ -415,7 +439,7 @@ Item {
415 Binding {
439 Binding {
416 target: LightDM.Greeter
440 target: LightDM.Greeter
417 property: "active"
441 property: "active"
418− value: greeter.shown || lockscreen.shown || greeter.fakeActiveForApp != ""
442+ value: greeter.shown || lockscreen.shown || greeter.hasLockedApp
421 Rectangle {
445 Rectangle {
@@ -427,7 +451,8 @@ Item {
428 // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
452 // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
429 id: greeterWrapper
453 id: greeterWrapper
454+ objectName: "greeterWrapper"
430− x: launcher.progress
455+ x: greeter.narrowMode ? launcher.progress : 0
431 y: panel.panelHeight
456 y: panel.panelHeight
432 width: parent.width
457 width: parent.width
433 height: parent.height - panel.panelHeight
458 height: parent.height - panel.panelHeight
@@ -440,7 +465,7 @@ Item {
440 property bool fullyShown: showProgress === 1.0
465 property bool fullyShown: showProgress === 1.0
441 onFullyShownChanged: {
466 onFullyShownChanged: {
442 // Wait until the greeter is completely covering lockscreen before resetting it.
467 // Wait until the greeter is completely covering lockscreen before resetting it.
443− if (fullyShown && !LightDM.Greeter.authenticated) {
468+ if (greeter.narrowMode && fullyShown && !LightDM.Greeter.authenticated) {
444 lockscreen.reset();
469 lockscreen.reset();
445 lockscreen.show();
470 lockscreen.show();
@@ -449,7 +474,7 @@ Item {
449 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
474 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
450 onShowProgressChanged: {
475 onShowProgressChanged: {
451 if (showProgress === 0) {
476 if (showProgress === 0) {
452− if (LightDM.Greeter.authenticated) {
477+ if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
453 greeter.login()
478 greeter.login()
454 } else if (greeter.narrowMode) {
479 } else if (greeter.narrowMode) {
455 lockscreen.clear(false) // to reset focus if necessary
480 lockscreen.clear(false) // to reset focus if necessary
@@ -463,13 +488,16 @@ Item {
464 signal sessionStarted() // helpful for tests
489 signal sessionStarted() // helpful for tests
466− property string fakeActiveForApp: ""
491+ property string lockedApp: ""
492+ property bool hasLockedApp: lockedApp !== ""
468 available: true
494 available: true
469 hides: [launcher, panel.indicators]
495 hides: [launcher, panel.indicators]
470 shown: true
496 shown: true
471 loadContent: required || lockscreen.required // keeps content in memory for quick show()
497 loadContent: required || lockscreen.required // keeps content in memory for quick show()
499+ locked: shell.locked
473 defaultBackground: shell.background
501 defaultBackground: shell.background
475 width: parent.width
503 width: parent.width
@@ -477,6 +505,18 @@ Item {
478 dragHandleWidth: shell.edgeSize
506 dragHandleWidth: shell.edgeSize
508+ function startUnlock() {
510+ if (!LightDM.Greeter.authenticated) {
480 function login() {
520 function login() {
481 enabled = false;
521 enabled = false;
482 if (LightDM.Greeter.startSessionSync()) {
522 if (LightDM.Greeter.startSessionSync()) {
@@ -492,8 +532,10 @@ Item {
492 if (shown) {
532 if (shown) {
493 if (greeter.narrowMode) {
533 if (greeter.narrowMode) {
494 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
534 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
496− greeter.fakeActiveForApp = "";
538+ greeter.lockedApp = "";
497 greeter.forceActiveFocus();
539 greeter.forceActiveFocus();
@@ -539,10 +581,7 @@ Item {
541 if (LightDM.Greeter.active) {
583 if (LightDM.Greeter.active) {
542− if (!LightDM.Greeter.authenticated) {
545− greeter.hide()
584+ greeter.startUnlock()
548 var animate = !LightDM.Greeter.active && !stages.shown
587 var animate = !LightDM.Greeter.active && !stages.shown
@@ -551,7 +590,8 @@ Item {
553 function showDash() {
592 function showDash() {
554− if (greeter.fakeActiveForApp !== "") { // just in case user gets here
593+ if (greeter.hasLockedApp || // just in case user gets here
594+ (!greeter.narrowMode && shell.locked)) {
@@ -578,7 +618,7 @@ Item {
578 anchors.fill: parent //because this draws indicator menus
618 anchors.fill: parent //because this draws indicator menus
579 indicators {
619 indicators {
580 hides: [launcher]
620 hides: [launcher]
581− available: edgeDemo.panelEnabled && (!shell.locked || AccountsService.enableIndicatorsWhileLocked) && greeter.fakeActiveForApp === ""
621+ available: edgeDemo.panelEnabled && (!shell.locked || AccountsService.enableIndicatorsWhileLocked) && !greeter.hasLockedApp
582 contentEnabled: edgeDemo.panelContentEnabled
622 contentEnabled: edgeDemo.panelContentEnabled
583 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
623 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
584 panelHeight: units.gu(3)
624 panelHeight: units.gu(3)
@@ -589,7 +629,7 @@ Item {
589 ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).fullscreen
629 ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).fullscreen
591 fullscreenMode: (topmostApplicationIsFullscreen && !LightDM.Greeter.active && launcher.progress == 0)
631 fullscreenMode: (topmostApplicationIsFullscreen && !LightDM.Greeter.active && launcher.progress == 0)
592− || greeter.fakeActiveForApp !== ""
632+ || greeter.hasLockedApp
595 Launcher {
635 Launcher {
@@ -602,22 +642,18 @@ Item {
602 anchors.bottom: parent.bottom
642 anchors.bottom: parent.bottom
603 width: parent.width
643 width: parent.width
604 dragAreaWidth: shell.edgeSize
644 dragAreaWidth: shell.edgeSize
605− available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && greeter.fakeActiveForApp === ""
645+ available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && !greeter.hasLockedApp
607 onShowDashHome: showHome()
647 onShowDashHome: showHome()
609− if (ApplicationManager.focusedApplicationId != "unity8-dash") {
610− showDash()
648+ onDash: showDash()
613 onDashSwipeChanged: {
649 onDashSwipeChanged: {
614 if (dashSwipe) {
650 if (dashSwipe) {
615 dash.setCurrentScope("clickscope", false, true)
651 dash.setCurrentScope("clickscope", false, true)
618 onLauncherApplicationSelected: {
654 onLauncherApplicationSelected: {
619− if (greeter.fakeActiveForApp !== "") {
655+ if (greeter.hasLockedApp) {
620− lockscreen.show()
656+ greeter.startUnlock()
622 if (!edgeDemo.running)
658 if (!edgeDemo.running)
623 shell.activateApplication(appId)
659 shell.activateApplication(appId)