@@ -46,6 +46,19 @@ Item {
52+ // We allow "" because it is briefly empty on startup, and we don't
53+ // want to improperly skip any mobile tutorials.
54+ property bool mobileScenario: root.usageScenario === "" ||
55+ root.usageScenario === "phone" ||
56+ root.usageScenario === "tablet"
58+ property bool endPointsFinished: tutorialRight.skipped && tutorialBottom.skipped
59+ onEndPointsFinishedChanged: if (endPointsFinished) root.finish()
49 TutorialLeft {
62 TutorialLeft {
50 id: tutorialLeft
63 id: tutorialLeft
51 objectName: "tutorialLeft"
64 objectName: "tutorialLeft"
@@ -54,9 +67,8 @@ Item {
54 hides: [launcher, panel.indicators]
67 hides: [launcher, panel.indicators]
55 paused: root.paused
68 paused: root.paused
57− readonly property bool skipped: (root.usageScenario !== "phone"
70+ readonly property bool skipped: !d.mobileScenario ||
58− && root.usageScenario !== "tablet")
59− || AccountsService.demoEdgesCompleted.indexOf("left") != -1
71+ AccountsService.demoEdgesCompleted.indexOf("left") != -1
60 isReady: !skipped && !paused && !keyboardVisible
72 isReady: !skipped && !paused && !keyboardVisible
62 onSkippedChanged: if (skipped && shown) hide()
74 onSkippedChanged: if (skipped && shown) hide()
@@ -72,34 +84,17 @@ Item {
72 hides: [launcher, panel.indicators]
84 hides: [launcher, panel.indicators]
73 paused: root.paused
85 paused: root.paused
75− readonly property bool skipped: (root.usageScenario !== "phone"
87+ readonly property bool skipped: !d.mobileScenario ||
76− && root.usageScenario !== "tablet")
77− || AccountsService.demoEdgesCompleted.indexOf("top") != -1
88+ AccountsService.demoEdgesCompleted.indexOf("top") != -1
78− isReady: tutorialLeft.skipped && !skipped && !paused && !keyboardVisible && !tutorialBottom.shown
89+ isReady: tutorialLeft.skipped && !skipped && !paused && !keyboardVisible &&
90+ !tutorialBottom.shown && !tutorialBottom.mightShow
80 // We fire 30s after left edge tutorial, with at least 3s of inactivity
92 // We fire 30s after left edge tutorial, with at least 3s of inactivity
82− Timer {
94+ InactivityTimer {
83 id: tutorialTopInactivityTimer
95 id: tutorialTopInactivityTimer
84− objectName: "tutorialTopInactivityTimer"
96+ lastInputTimestamp: root.lastInputTimestamp
85− interval: 3000
97+ page: parent
89− onLastInputTimestampChanged: {
90− if (tutorialTopInactivityTimer.running) {
91− tutorialTopInactivityTimer.restart();
97− if (tutorialTop.isReady) {
@@ -124,31 +119,28 @@ Item {
124 paused: root.paused
119 paused: root.paused
126 readonly property bool skipped: AccountsService.demoEdgesCompleted.indexOf("right") != -1
121 readonly property bool skipped: AccountsService.demoEdgesCompleted.indexOf("right") != -1
127− isReady: tutorialTop.skipped && !skipped && !paused && !keyboardVisible && !tutorialBottom.shown &&
122+ isReady: tutorialTop.skipped && !skipped && !paused && !keyboardVisible &&
123+ !tutorialBottom.shown && !tutorialBottom.mightShow &&
128 ApplicationManager.count >= 3
124 ApplicationManager.count >= 3
130− Timer {
126+ InactivityTimer {
131− id: tutorialRightTimer
127+ id: tutorialRightInactivityTimer
132− objectName: "tutorialRightTimer"
128+ lastInputTimestamp: root.lastInputTimestamp
133− interval: 3000
129+ page: parent
135− if (tutorialRight.isReady) {
136− if (!tutorialRight.shown) {
137− tutorialRight.show();
145 Connections {
132 Connections {
146− target: ApplicationManager
133+ target: stage
147− onApplicationAdded: if (tutorialRight.isReady && !tutorialRight.shown) tutorialRight.show()
135+ if (tutorialRight.isReady && !tutorialRight.shown && stage.mainApp
136+ && stage.mainApp.state === ApplicationInfoInterface.Starting) {
137+ tutorialRight.show();
150 onSkippedChanged: if (skipped && shown) hide()
142 onSkippedChanged: if (skipped && shown) hide()
151− onIsReadyChanged: if (isReady && !shown) tutorialRightTimer.start()
143+ onIsReadyChanged: if (isReady && !shown) tutorialRightInactivityTimer.start()
152 onFinished: AccountsService.markDemoEdgeCompleted("right")
144 onFinished: AccountsService.markDemoEdgeCompleted("right")
@@ -159,23 +151,15 @@ Item {
159 hides: [launcher, panel.indicators]
151 hides: [launcher, panel.indicators]
160 paused: root.paused
152 paused: root.paused
162− readonly property bool skipped: (root.usageScenario !== "phone"
154+ readonly property bool skipped: !d.mobileScenario ||
163− && root.usageScenario !== "tablet")
164− || AccountsService.demoEdgesCompleted.indexOf("bottom") != -1
155+ AccountsService.demoEdgesCompleted.indexOf("bottom") != -1
156+ readonly property bool mightShow: !skipped && stage.mainApp && canShowForApp(stage.mainApp.appId)
165− isReady: !skipped && !paused && !keyboardVisible && !tutorialTop.shown && !tutorialRight.shown &&
157+ isReady: !skipped && !paused && !keyboardVisible &&
166− // focused app is an app known to have a bottom edge
158+ !tutorialTop.shown && !tutorialRight.shown &&
167− (ApplicationManager.focusedApplicationId == "dialer-app" ||
168− ApplicationManager.focusedApplicationId == "messaging-app" ||
169− ApplicationManager.focusedApplicationId == "address-book-app" ||
170− ApplicationManager.focusedApplicationId == "ubuntu-calculator-app" ||
171− ApplicationManager.focusedApplicationId == "ubuntu-clock-app") &&
172− (stage.mainApp && stage.mainApp.state === ApplicationInfoInterface.Running)
159+ mightShow && stage.mainApp.state === ApplicationInfoInterface.Running
174 onSkippedChanged: if (skipped && shown) hide()
161 onSkippedChanged: if (skipped && shown) hide()
175 onIsReadyChanged: if (isReady && !shown) show()
162 onIsReadyChanged: if (isReady && !shown) show()
177− AccountsService.markDemoEdgeCompleted("bottom");
163+ onFinished: AccountsService.markDemoEdgeCompleted("bottom")