on xenial help sign in
Reset apps scope when returning from app to dash (LP #1193419)
a020321Daniel d'Andrada
Dash/DashApps.qml+1
@@ -24,6 +24,7 @@ import "Apps"
24
24
25GenericScopeView {
25GenericScopeView {
26 id: scopeView
26 id: scopeView
27+ objectName: "DashApps"
27
28
28 // FIXME: a way to aggregate these models would be ideal
29 // FIXME: a way to aggregate these models would be ideal
29 property var mainStageApplicationsModel: shell.applicationManager.mainStageApplications
30 property var mainStageApplicationsModel: shell.applicationManager.mainStageApplications
Dash/DashContent.qml+1
@@ -114,6 +114,7 @@ Item {
114 height: ListView.view.height
114 height: ListView.view.height
115 asynchronous: true
115 asynchronous: true
116 source: scopeMapper.map(scope.id)
116 source: scopeMapper.map(scope.id)
117+ objectName: scope.id + " loader"
117
118
118 // these are needed for autopilot tests
119 // these are needed for autopilot tests
119 readonly property string scopeId: scope.id
120 readonly property string scopeId: scope.id
Dash/GenericScopeView.qml+3
@@ -29,6 +29,8 @@ ScopeView {
29
29
30 onMovementStarted: categoryView.showHeader()
30 onMovementStarted: categoryView.showHeader()
31
31
32+ onPositionedAtBeginning: categoryView.positionAtBeginning()
33+
32 Binding {
34 Binding {
33 target: scopeView.scope
35 target: scopeView.scope
34 property: "searchQuery"
36 property: "searchQuery"
@@ -45,6 +47,7 @@ ScopeView {
45
47
46 ScopeListView {
48 ScopeListView {
47 id: categoryView
49 id: categoryView
50+ objectName: "categoryListView"
48 anchors.fill: parent
51 anchors.fill: parent
49 model: scopeView.categories
52 model: scopeView.categories
50 forceNoClip: previewLoader.onScreen
53 forceNoClip: previewLoader.onScreen
Shell.qml+1−1
@@ -640,7 +640,7 @@ FocusScope {
640 }
640 }
641 onDash: {
641 onDash: {
642 if (stages.shown) {
642 if (stages.shown) {
643− dash.setCurrentScope("applications.scope", true, false)
643+ dash.setCurrentScope("applications.scope", true /* animate */, true /* reset */)
644 stages.hide();
644 stages.hide();
645 launcher.hide();
645 launcher.hide();
646 }
646 }
tests/mocks/Unity/fake_applications_scope.cpp+7
@@ -64,5 +64,12 @@ DeeModel* ApplicationsScope::createCategoriesModel()
64 "grid",
64 "grid",
65 hints);
65 hints);
66
66
67+ dee_model_append(category_model,
68+ "outdated",
69+ "Outdaded",
70+ "gtk-apply",
71+ "grid",
72+ hints);
73+
67 return category_model;
74 return category_model;
68}
75}
tests/qmltests/tst_Shell.qml+68
@@ -56,6 +56,18 @@ Item {
56
56
57 function initTestCase() {
57 function initTestCase() {
58 swipeAwayGreeter();
58 swipeAwayGreeter();
59+
60+ // Ensure DashHome is loaded before continuing
61+ var dashContentList = findChild(shell, "dashContentList");
62+ waitForRendering(dashContentList);
63+ var homeLoader = findChild(dashContentList, "home.scope loader");
64+ verify(homeLoader);
65+ tryCompareFunction(function() {return homeLoader.item !== undefined;}, true);
66+
67+ // FIXME: Desperate measure to ensure Jenkins has the scene graph fully loaded
68+ // before it calls the test functions (otherwise findChild calls will fail).
69+ // The code above just didn't solve it.
70+ wait(2000);
59 }
71 }
60
72
61 function cleanup() {
73 function cleanup() {
@@ -213,6 +225,62 @@ Item {
213 tryCompare(dash, "visible", false);
225 tryCompare(dash, "visible", false);
214 }
226 }
215
227
228+ /*
229+ Regression test for bug https://bugs.launchpad.net/touch-preview-images/+bug/1193419
230+
231+ When the user minimizes an application (left-edge swipe) he should always end up in the "Running Apps"
232+ category of the "Applications" scope view.
233+
234+ Steps:
235+ - go to apps lens
236+ - scroll to the bottom
237+ - reveal launcher and launch an app
238+ - perform long left edge swipe to go minimize the app and go back to the dash.
239+
240+ Expected Results
241+ - apps lens shown and Running Apps visible on screen
242+ */
243+ function test_minimizingAppTakesToRunningApps() {
244+ var dashApps = findChild(shell, "DashApps");
245+
246+ swipeUntilScopeViewIsReached(dashApps);
247+
248+ // swipe finger up until the running/recent apps section (which we assume
249+ // it's the first one) is as far from view as possible.
250+ // We also assume that DashApps is tall enough that it's scrollable
251+ var appsCategoryListView = findChild(dashApps, "categoryListView");
252+ while (!appsCategoryListView.atYEnd) {
253+ swipeUpFromCenter();
254+ tryCompare(appsCategoryListView, "moving", false);
255+ }
256+
257+ // Switch away from the Applications scope.
258+ swipeRightFromCenter();
259+ waitUntilItemStopsMoving(dashApps);
260+ verify(!itemIsOnScreen(dashApps));
261+
262+ dragLauncherIntoView();
263+
264+ // Launch an app from the launcher
265+ tapOnAppIconInLauncher();
266+
267+ waitUntilApplicationWindowIsFullyVisible();
268+
269+ // Minimize the application we just launched
270+ swipeFromLeftEdge();
271+
272+ // Wait for the whole UI to settle down
273+ waitUntilApplicationWindowIsFullyHidden();
274+ waitUntilItemStopsMoving(dashApps);
275+ tryCompare(appsCategoryListView, "moving", false);
276+
277+ verify(itemIsOnScreen(dashApps));
278+
279+ var runningApplicationsGrid = findChild(appsCategoryListView, "recent");
280+ verify(runningApplicationsGrid);
281+ verify(itemIsOnScreen(runningApplicationsGrid));
282+ }
283+
216 // Wait for the whole UI to settle down
284 // Wait for the whole UI to settle down
217 function waitForUIToSettle() {
285 function waitForUIToSettle() {
218 waitUntilApplicationWindowIsFullyHidden();
286 waitUntilApplicationWindowIsFullyHidden();