on xenial help sign in
merge prereq
commit93619fa8dcbea7f1a7a150642446520b3aa3f22b authorMichael Zanetti <michael.zanetti@canonical.com> dateThu 28 Jan 2016, 11:58 (11 years ago) parent7c8f71ce7549d5
6 files changed+90−10
qml/Shell.qml+3−3 qml/Stages/AbstractStage.qml+5−1 qml/Stages/DesktopStage.qml+6−1 qml/Stages/PhoneStage.qml+5−1 qml/Stages/TabletStage.qml+5−1 tests/qmltests/tst_OrientedShell.qml+66−3
qml/Shell.qml+3−3
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013-2015 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -85,8 +85,8 @@ Item {
8585 return Qt.PrimaryOrientation;
8686 } else if (greeter && greeter.shown) {
8787 return Qt.PrimaryOrientation;
88− } else if (mainApp) {
89− return shell.orientations.map(mainApp.supportedOrientations);
88+ } else if (applicationsDisplayLoader.item) {
89+ return shell.orientations.map(applicationsDisplayLoader.item.supportedOrientations);
9090 } else {
9191 // we just don't care
9292 return Qt.PortraitOrientation
qml/Stages/AbstractStage.qml+5−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -44,6 +44,10 @@ Rectangle {
4444 property var mainApp: null
4545 property int mainAppWindowOrientationAngle
4646 property bool orientationChangesEnabled
47+ property int supportedOrientations: Qt.PortraitOrientation
48+ | Qt.LandscapeOrientation
49+ | Qt.InvertedPortraitOrientation
50+ | Qt.InvertedLandscapeOrientation
4751
4852 // Shared code for use in stage implementations
4953 GSettings {
qml/Stages/DesktopStage.qml+6−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -40,6 +40,11 @@ AbstractStage {
4040 ? ApplicationManager.findApplication(ApplicationManager.focusedApplicationId)
4141 : null
4242
43+ // application windows never rotate independently
44+ mainAppWindowOrientationAngle: shellOrientationAngle
45+
46+ orientationChangesEnabled: true
47+
4348 Connections {
4449 target: ApplicationManager
4550 onApplicationAdded: {
qml/Stages/PhoneStage.qml+5−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -83,6 +83,10 @@ AbstractStage {
8383 && !(priv.focusedAppDelegate && priv.focusedAppDelegate.xBehavior.running)
8484 && spreadView.phase === 0
8585
86+ supportedOrientations: mainApp ? mainApp.supportedOrientations
87+ : (Qt.PortraitOrientation | Qt.LandscapeOrientation
88+ | Qt.InvertedPortraitOrientation | Qt.InvertedLandscapeOrientation)
89+
8690 // How far left the stage has been dragged
8791 readonly property real dragProgress: spreadRepeater.count > 0 ? -spreadRepeater.itemAt(0).xTranslate : 0
8892
qml/Stages/TabletStage.qml+5−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -72,6 +72,10 @@ AbstractStage {
7272
7373 orientationChangesEnabled: priv.mainAppOrientationChangesEnabled
7474
75+ supportedOrientations: mainApp ? mainApp.supportedOrientations
76+ : (Qt.PortraitOrientation | Qt.LandscapeOrientation
77+ | Qt.InvertedPortraitOrientation | Qt.InvertedLandscapeOrientation)
78+
7579 onWidthChanged: {
7680 spreadView.selectedIndex = -1;
7781 spreadView.phase = 0;
tests/qmltests/tst_OrientedShell.qml+66−3
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -292,6 +292,9 @@ Rectangle {
292292 activeFocusOnPress: false
293293 text: "Usage Mode"
294294 model: ["Staged", "Windowed", "Automatic"]
295+ function selectStaged() {selectedIndex = 0;}
296+ function selectWindowed() {selectedIndex = 1;}
297+ function selectAutomatic() {selectedIndex = 2;}
295298 }
296299 MouseTouchEmulationCheckbox {
297300 checked: true
@@ -393,7 +396,7 @@ Rectangle {
393396 activeFocusOnPress: false
394397 property string prevDevName: "mako"
395398 onClicked: {
396− usageModeSelector.selectedIndex = 2; // "Automatic"
399+ usageModeSelector.selectAutomatic();
397400
398401 if (applicationArguments.deviceName === "desktop") {
399402 applicationArguments.deviceName = prevDevName;
@@ -457,6 +460,8 @@ Rectangle {
457460 signalSpy.signalName = "";
458461
459462 LightDM.Greeter.authenticate(""); // reset greeter
463+
464+ usageModeSelector.selectStaged();
460465 }
461466
462467 function cleanup() {
@@ -997,7 +1002,7 @@ Rectangle {
9971002 }
9981003
9991004 function test_attachRemoveInputDevices() {
1000− usageModeSelector.selectedIndex = 2;
1005+ usageModeSelector.selectAutomatic();
10011006 tryCompare(mockUnity8Settings, "usageMode", "Automatic")
10021007
10031008 loadShell("mako")
@@ -1146,6 +1151,61 @@ Rectangle {
11461151 tryCompare(shell, "transformRotationAngle" , 0);
11471152 }
11481153
1154+ /*
1155+ Regression test for https://launchpad.net/bugs/1515977
1156+
1157+ Preconditions:
1158+ UI in Desktop mode and landscape
1159+
1160+ Steps:
1161+ - Launch a portrait-only application
1162+
1163+ Expected outcome:
1164+ - Shell stays in landscape
1165+
1166+ Buggy outcome:
1167+ - Shell would rotate to portrait as the newly-focused app doesn't support landscape
1168+ */
1169+ function test_portraitOnlyAppInLandscapeDesktop_data() {
1170+ return [
1171+ {tag: "mako", deviceName: "mako"},
1172+ {tag: "manta", deviceName: "manta"},
1173+ {tag: "flo", deviceName: "flo"}
1174+ ];
1175+ }
1176+ function test_portraitOnlyAppInLandscapeDesktop(data) {
1177+ loadShell(data.deviceName);
1178+
1179+ ////
1180+ // setup preconditions (put shell in Desktop mode and landscape)
1181+
1182+ usageModeSelector.selectWindowed();
1183+
1184+ orientedShell.physicalOrientation = orientedShell.orientations.landscape;
1185+ waitUntilShellIsInOrientation(orientedShell.orientations.landscape);
1186+ waitForRotationAnimationsToFinish();
1187+
1188+ ////
1189+ // Launch a portrait-only application
1190+
1191+ var dialerApp = ApplicationManager.startApplication("dialer-app");
1192+ verify(dialerApp);
1193+
1194+ // ensure the mock dialer-app is as we expect
1195+ compare(dialerApp.rotatesWindowContents, false);
1196+ compare(dialerApp.supportedOrientations, Qt.PortraitOrientation | Qt.InvertedPortraitOrientation);
1197+
1198+ waitUntilAppSurfaceShowsUp("dialer-app");
1199+ waitUntilAppWindowCanRotate("dialer-app");
1200+ verify(isAppSurfaceFocused("dialer-app"));
1201+
1202+ ////
1203+ // check outcome (shell should stay in landscape)
1204+
1205+ waitForRotationAnimationsToFinish();
1206+ compare(shell.orientation, orientedShell.orientations.landscape);
1207+ }
1208+
11491209 // angle - rotation angle in degrees clockwise, relative to the primary orientation.
11501210 function rotateTo(angle) {
11511211 switch (angle) {
@@ -1164,7 +1224,10 @@ Rectangle {
11641224 default:
11651225 verify(false);
11661226 }
1227+ waitForRotationAnimationsToFinish();
1228+ }
11671229
1230+ function waitForRotationAnimationsToFinish() {
11681231 var rotationStates = findInvisibleChild(orientedShell, "rotationStates");
11691232 verify(rotationStates.d);
11701233 verify(rotationStates.d.stateUpdateTimer);