on xenial help sign in
merge prereq
commit7835b8c2d4ec524f58734ff9c8347cd1d1125183 authorMichael Zanetti <michael.zanetti@canonical.com> dateThu 14 Jan 2016, 13:44 (11 years ago) parent3f321c7ef78449
154 files changed+1474−437
CMakeLists.txt+10 debian/changelog+64 debian/control+8−4 debian/rules−4 plugins/Dash/AudioProgressBar.qml+53 plugins/Dash/CMakeLists.txt+3 plugins/Dash/CardAudioProgress.qml+59 plugins/Dash/CardCreator.js+107−2 plugins/Dash/DashAudioPlayer.qml+96 plugins/Dash/graphics/music_progress_bg.png plugins/Dash/listviewwithpageheader.cpp+5−1 plugins/Dash/plugin.cpp+35 plugins/Dash/qmldir+3 plugins/Unity/DashCommunicator/dashcommunicator.cpp+6 plugins/Unity/DashCommunicator/dashcommunicator.h+1−1 po/am.po+2−2 po/ar.po+2−2 po/ast.po+2−2 po/az.po+2−2 po/be.po+2−2 po/bg.po+2−2 po/bn.po+2−2 po/br.po+2−2 po/bs.po+2−2 po/ca.po+2−2 po/ca@valencia.po+2−2 po/ce.po+2−2 po/ckb.po+2−2 po/cs.po+2−2 po/cy.po+2−2 po/da.po+2−2 po/de.po+2−2 po/el.po+2−2 po/en_AU.po+2−2 po/en_GB.po+2−2 po/eo.po+2−2 po/es.po+2−2 po/eu.po+2−2 po/fa.po+2−2 po/fi.po+2−2 po/fo.po+2−2 po/fr.po+2−2 po/ga.po+2−2 po/gd.po+2−2 po/gl.po+2−2 po/gv.po+2−2 po/he.po+2−2 po/hi.po+2−2 po/hr.po+2−2 po/hu.po+2−2 po/hy.po+2−2 po/ia.po+2−2 po/id.po+2−2 po/is.po+2−2 po/it.po+2−2 po/ja.po+2−2 po/km.po+2−2 po/kn.po+2−2 po/ko.po+2−2 po/ku.po+2−2 po/ky.po+2−2 po/lo.po+2−2 po/lt.po+2−2 po/lv.po+2−2 po/ml.po+2−2 po/mr.po+2−2 po/ms.po+2−2 po/my.po+2−2 po/nb.po+2−2 po/ne.po+2−2 po/nl.po+2−2 po/nn.po+2−2 po/oc.po+2−2 po/or.po+2−2 po/pa.po+2−2 po/pl.po+2−2 po/pt.po+2−2 po/pt_BR.po+2−2 po/ro.po+2−2 po/ru.po+2−2 po/shn.po+2−2 po/si.po+2−2 po/sk.po+2−2 po/sl.po+2−2 po/sq.po+2−2 po/sr.po+2−2 po/sv.po+2−2 po/sw.po+2−2 po/ta.po+2−2 po/te.po+2−2 po/th.po+2−2 po/tr.po+2−2 po/ug.po+2−2 po/uk.po+2−2 po/unity8.pot+27−27 po/ur.po+2−2 po/uz.po+2−2 po/vi.po+2−2 po/wo.po+2−2 po/xh.po+2−2 po/zh_CN.po+2−2 po/zh_HK.po+2−2 po/zh_TW.po+2−2 qml/Dash/DashPageHeader.qml+1 qml/Dash/Previews/PreviewAudioPlayback.qml+16−76 qml/Dash/Previews/PreviewMediaToolbar.qml+2−1 qml/Dash/Previews/PreviewSharing.qml+3−4 qml/Dash/Previews/PreviewVideoPlayback.qml+1−1 qml/Dash/Previews/PreviewZoomableImage.qml+1−1 qml/Dash/Previews/graphics/music_progress_bg.png qml/Greeter/Greeter.qml+7−4 qml/Launcher/Launcher.qml+3−8 qml/Launcher/LauncherPanel.qml+6−3 qml/Panel/Indicators/MenuItemFactory.qml+11−1 qml/Stages/DesktopStage.qml+7−3 qml/Wizard/Pages/30-passwd-type.qml+5 src/CMakeLists.txt+13−7 src/Dash/CMakeLists.txt+8−8 src/Dash/main.cpp+9−5 src/MouseTouchAdaptor.cpp+180−21 src/MouseTouchAdaptor.h+10−3 src/ShellApplication.cpp+5−5 src/ShellApplication.h+12−4 src/UnityCommandLineParser.cpp+6 src/UnityCommandLineParser.h+8 tests/autopilot/unity8/dash.py+1−1 tests/mocks/QtMultimedia/CMakeLists.txt+1 tests/mocks/QtMultimedia/audio.cpp+21−19 tests/mocks/QtMultimedia/audio.h+8−6 tests/mocks/QtMultimedia/declarativeplaylist.cpp+73 tests/mocks/QtMultimedia/declarativeplaylist.h+54 tests/mocks/QtMultimedia/plugin.cpp+2 tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/CMakeLists.txt+1−1 tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/MockSecurityPrivacy.cpp+8−1 tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/MockSecurityPrivacy.h+8 tests/mocks/Unity/CMakeLists.txt+1−1 tests/plugins/Dash/cardcreator/9.res+113 tests/plugins/Dash/cardcreator/9.tst+3 tests/qmltests/CMakeLists.txt+2−1 tests/qmltests/Dash/CardHelpers.js+1−1 tests/qmltests/Dash/Previews/tst_PreviewAudioPlayback.qml+5−9 tests/qmltests/Dash/Previews/tst_PreviewMediaToolbar.qml+69 tests/qmltests/Dash/Previews/tst_PreviewSharing.qml+1−13 tests/qmltests/Dash/tst_Card.qml+8−1 tests/qmltests/Dash/tst_Dash.qml+1−1 tests/qmltests/Dash/tst_DashContent.qml+1−1 tests/qmltests/Dash/tst_GenericScopeView.qml+2−2 tests/qmltests/Greeter/tst_Greeter.qml+39−3 tests/qmltests/Launcher/tst_Launcher.qml+18−1 tests/qmltests/Panel/tst_IndicatorsMenu.qml+3−3 tests/qmltests/Stages/tst_DesktopStage.qml+29 tests/qmltests/Wizard/tst_Wizard.qml+15 tests/utils/modules/Unity/Test/CMakeLists.txt+8−1 tests/utils/modules/Unity/Test/plugin.cpp+13−3
CMakeLists.txt+10
@@ -128,6 +128,16 @@ if(NOT QUIET_LOGGER)
128128 set(STDOUT_LOGGER "-o" "-,txt")
129129endif()
130130
131+execute_process(COMMAND arch OUTPUT_VARIABLE ARCH)
132+if (NOT ARCH MATCHES "arm*")
133+ set(ENABLE_TOUCH_EMULATION true)
134+ add_definitions(-DUNITY8_ENABLE_TOUCH_EMULATION)
135+ pkg_check_modules(MOUSETOUCHADAPTOR_LIBS REQUIRED x11 xcb xi)
136+else()
137+ set(ENABLE_TOUCH_EMULATION false)
138+ message(STATUS "Touch emulation support disabled.")
139+endif()
140+
131141# add subdirectories to build
132142add_subdirectory(include)
133143add_subdirectory(libs)
debian/changelog+64
@@ -1,3 +1,67 @@
1+unity8 (8.11+16.04.20160111.1-0ubuntu1) xenial; urgency=medium
2+
3+ [ Albert Astals Cid ]
4+ * Clear fake item icon name as soon as it goes invisible (LP:
5+ #1531172)
6+ * Fix LVWPH test failing on Xenial (Qt 5.5)
7+ * Fix dragging so that test passes on Xenial
8+ * Fix focus on the dash page header text field with new SDK (LP:
9+ #1528178)
10+ * Make the card creator test pass again
11+ * Quit the dash communicator thread before destroying it (LP:
12+ #1508485)
13+ * Remove duplicated override_dh_auto_clean
14+ * SDK changed the name they give to the buttons, follow
15+
16+ [ Andrea Cimitan ]
17+ * Fix a broken binding
18+
19+ [ CI Train Bot ]
20+ * Resync trunk.
21+ * Update translation template
22+
23+ [ Daniel d'Andrada ]
24+ * Have "make tryFoo" work with Qt 5.5
25+ * Make DragHandle tests run again.
26+
27+ [ Lukáš Tinkl ]
28+ * Fix dismissing the launcher when clicking/tapping outside (LP:
29+ #1531339, #1530940)
30+ * Fix panel drop shadow and click-to-focus of maximized apps (LP:
31+ #1531854)
32+ * Fix wifi access point indicator items signal strength icon on
33+ desktop
34+
35+ [ Michael Terry ]
36+ * Guard against a couple odd timing scenarios for the too-many-failed-
37+ login-attempts lockout screen.
38+ * Skip the wizard's password screens if there is already a password
39+ set by other means. (LP: #1531268)
40+ * Stop the emergency dialer from accidentally exposing the mtp
41+ service. (LP: #1525981)
42+
43+ [ Michael Zanetti ]
44+ * Make sure the triangle of the quicklist is in bounds (LP: #1531340)
45+
46+ [ Pawel Stolowski ]
47+ * Changes 'shareData' and 'contentType' attributes to 'share-data' and
48+ 'content-type', to match existing naming schema.
49+
50+ -- Michał Sawicz <michal.sawicz@canonical.com> Mon, 11 Jan 2016 17:38:49 +0000
51+
52+unity8 (8.11+16.04.20160107-0ubuntu1) xenial; urgency=medium
53+
54+ [ Albert Astals Cid ]
55+ * Introduce audio cards
56+
57+ [ CI Train Bot ]
58+ * Update translation template
59+
60+ [ Michael Zanetti ]
61+ * Introduce audio cards
62+
63+ -- CI Train Bot <ci-train-bot@canonical.com> Thu, 07 Jan 2016 08:04:47 +0000
64+
165unity8 (8.11+16.04.20160105.1-0ubuntu1) xenial; urgency=medium
266
367 [ CI Train Bot ]
debian/control+8−4
@@ -29,9 +29,13 @@ Build-Depends: cmake,
2929 libqt5xmlpatterns5-dev,
3030 libsystemsettings-dev,
3131 libudev-dev,
32− libunity-api-dev (>= 7.104),
32+ libunity-api-dev (>= 7.105),
3333 libusermetricsoutput1-dev,
34− libxcb1-dev,
34+# Need those X11 libs touch emulation from mouse events in manual QML tests on a X11 desktop
35+ libx11-dev[!armhf],
36+ libxcb1-dev[!armhf],
37+ libxi-dev[!armhf],
38+# End of X11 libs
3539 pkg-config,
3640 python3-all:any,
3741 python3-setuptools,
@@ -48,7 +52,7 @@ Build-Depends: cmake,
4852 qtdeclarative5-dev (>= 5.4),
4953 qtdeclarative5-dev-tools,
5054 qtdeclarative5-private-dev (>= 5.4),
51− qtdeclarative5-qtmultimedia-plugin,
55+ qtdeclarative5-qtmultimedia-plugin (>= 5.4.1-1ubuntu19~overlay2),
5256 qtdeclarative5-ubuntu-content1,
5357 qtdeclarative5-ubuntu-settings-components (>= 0.6),
5458 qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1676) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1676),
@@ -131,7 +135,7 @@ Depends: qml-module-qtquick-layouts,
131135 unity-application-impl-12,
132136 unity-notifications-impl-3,
133137 unity-plugin-scopes | unity-scopes-impl,
134− unity-scopes-impl-7,
138+ unity-scopes-impl-9,
135139 unity8-fake-env | unity-application-impl,
136140 ${misc:Depends},
137141Breaks: unity8 (<< 7.86),
debian/rules−4
@@ -11,10 +11,6 @@ export NO_PNG_PKG_MANGLE=1
1111%:
1212 dh $@ --parallel --fail-missing --with python3
1313
14−override_dh_auto_clean:
15− dh_auto_clean
16− rm -rf builddir
17−
1814override_dh_auto_configure:
1915 # Debian defines CMAKE_INSTALL_LOCALSTATEDIR as /usr/var, which is wrong.
2016 # So until Debian bug 719148 is fixed, do it ourselves.
plugins/Dash/AudioProgressBar.qmlnew file+53
@@ -0,0 +1,53 @@
1+/*
2+ * Copyright 2015 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.4
18+import Ubuntu.Components 1.3
19+import Dash 0.1
20+
21+Item {
22+ id: root
23+
24+ implicitHeight: progressBarImage.height
25+
26+ property url source
27+ readonly property double progress: AudioUrlComparer.compare(source, DashAudioPlayer.currentSource) ? DashAudioPlayer.progress : 0
28+
29+ Image {
30+ id: progressBarImage
31+ anchors { left: parent.left; right: parent.right }
32+ height: units.dp(6)
33+ source: "graphics/music_progress_bg.png"
34+ sourceSize.width: width
35+ sourceSize.height: height
36+ }
37+
38+ UbuntuShape {
39+ id: progressBarFill
40+ objectName: "progressBarFill"
41+
42+ readonly property int maxWidth: progressBarImage.width
43+
44+ anchors {
45+ left: progressBarImage.left
46+ right: progressBarImage.right
47+ verticalCenter: progressBarImage.verticalCenter
48+ rightMargin: maxWidth - (maxWidth * root.progress)
49+ }
50+ height: units.dp(2)
51+ backgroundColor: UbuntuColors.orange
52+ }
53+}
plugins/Dash/CMakeLists.txt+3
@@ -38,3 +38,6 @@ target_link_libraries(Dash-qml
3838qt5_use_modules(Dash-qml Qml Quick Concurrent)
3939
4040add_unity8_plugin(Dash 0.1 Dash TARGETS Dash-qml)
41+
42+install(FILES graphics/music_progress_bg.png DESTINATION ${SHELL_INSTALL_QML}/Dash/graphics/)
43+file(COPY graphics/music_progress_bg.png DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/graphics/)
plugins/Dash/CardAudioProgress.qmlnew file+59
@@ -0,0 +1,59 @@
1+/*
2+ * Copyright 2015 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.4
18+import Ubuntu.Components 1.3
19+import Dash 0.1
20+
21+Item {
22+ id: root
23+
24+ implicitHeight: positionLabel.y + positionLabel.height
25+ visible: AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)
26+
27+ property int duration: 0
28+ property alias source: progress.source
29+ property color color: theme.palette.normal.baseText
30+ readonly property int position: root.visible ? DashAudioPlayer.position / 1000 : 0
31+
32+ AudioProgressBar {
33+ id: progress
34+ anchors { left: parent.left; right: parent.right }
35+ }
36+
37+ Label {
38+ id: positionLabel
39+ anchors {
40+ left: parent.left
41+ top: progress.bottom
42+ }
43+ verticalAlignment: Text.AlignBottom
44+ fontSize: "x-small"
45+ text: DashAudioPlayer.lengthToString(root.position)
46+ color: root.color
47+ }
48+
49+ Label {
50+ anchors {
51+ right: parent.right
52+ top: progress.bottom
53+ }
54+ verticalAlignment: Text.AlignBottom
55+ fontSize: "x-small"
56+ text: DashAudioPlayer.lengthToString(duration)
57+ color: root.color
58+ }
59+}
plugins/Dash/CardCreator.js+107−2
@@ -136,6 +136,43 @@ var kArtShapeHolderCode = 'Item { \n\
136136 } \n\
137137 }\n';
138138
139+// %1 is anchors.fill
140+// %2 is width
141+// %3 is height
142+var kAudioButtonCode = 'AbstractButton { \n\
143+ id: audioButton; \n\
144+ anchors.fill: %1; \n\
145+ width: %2; \n\
146+ height: %3; \n\
147+ readonly property url source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || ""; \n\
148+ UbuntuShape { \n\
149+ anchors.fill: parent; \n\
150+ visible: parent.pressed; \n\
151+ radius: "medium"; \n\
152+ } \n\
153+ Icon { \n\
154+ anchors.fill: parent; \n\
155+ anchors.margins: parent.height > units.gu(5) ? units.gu(2) : 0; \n\
156+ opacity: 0.9; \n\
157+ name: DashAudioPlayer.playing && AudioUrlComparer.compare(parent.source, DashAudioPlayer.currentSource) ? "media-playback-pause" : "media-playback-start"; \n\
158+ } \n\
159+ onClicked: { \n\
160+ if (AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)) { \n\
161+ if (DashAudioPlayer.playing) { \n\
162+ DashAudioPlayer.pause(); \n\
163+ } else { \n\
164+ DashAudioPlayer.play(); \n\
165+ } \n\
166+ } else { \n\
167+ var playlist = (cardData["quickPreviewData"] && cardData["quickPreviewData"]["playlist"]) || null; \n\
168+ DashAudioPlayer.playSource(source, playlist); \n\
169+ } \n\
170+ } \n\
171+ onPressAndHold: { \n\
172+ root.pressAndHold(); \n\
173+ } \n\
174+ }';
175+
139176var kOverlayLoaderCode = 'Loader { \n\
140177 id: overlayLoader; \n\
141178 readonly property real overlayHeight: (fixedHeaderHeight > 0 ? fixedHeaderHeight : headerHeight) + units.gu(2); \n\
@@ -316,6 +353,22 @@ var kSummaryLabelCode = 'Label { \n\
316353 color: %3; \n\
317354 }\n';
318355
356+// %1 is used as bottom anchor of audio progress bar
357+// %2 is used as left anchor of audio progress bar
358+// %3 is used as text color
359+var kAudioProgressBarCode = 'CardAudioProgress { \n\
360+ id: audioProgressBar; \n\
361+ duration: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["duration"]) || 0; \n\
362+ source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || ""; \n\
363+ anchors { \n\
364+ bottom: %1; \n\
365+ left: %2; \n\
366+ right: parent.right; \n\
367+ margins: units.gu(1); \n\
368+ } \n\
369+ color: %3; \n\
370+ }';
371+
319372function cardString(template, components) {
320373 var code;
321374
@@ -351,7 +404,20 @@ function cardString(template, components) {
351404 var headerAsOverlay = hasArt && template && template["overlay"] === true && (hasTitle || hasMascot);
352405 var hasSubtitle = hasTitle && components["subtitle"] || false;
353406 var hasHeaderRow = hasMascot && hasTitle;
354− var hasAttributes = hasTitle && components["attributes"]["field"] || false;
407+ var hasAttributes = hasTitle && components["attributes"] && components["attributes"]["field"] || false;
408+ var isAudio = template["quick-preview-type"] === "audio";
409+
410+ if (isAudio) {
411+ // For now we only support audio cards with [optional] art, title, subtitle
412+ // in horizontal mode
413+ // Anything else makes it behave not like an audio card
414+ if (hasSummary) isAudio = false;
415+ if (!isHorizontal) isAudio = false;
416+ if (hasMascot) isAudio = false;
417+ if (hasEmblem) isAudio = false;
418+ if (headerAsOverlay) isAudio = false;
419+ if (hasAttributes) isAudio = false;
420+ }
355421
356422 if (hasBackground) {
357423 var templateCardBackground = (template && typeof template["card-background"] === "string") ? template["card-background"] : "";
@@ -421,17 +487,22 @@ function cardString(template, components) {
421487 topMargin: units.gu(1);\n';
422488 }
423489 }
490+
424491 var headerLeftAnchor;
425492 var headerLeftAnchorHasMargin = false;
426493 if (isHorizontal && hasArt) {
427494 headerLeftAnchor = 'left: artShapeHolder.right; \n\
428495 leftMargin: units.gu(1);\n';
429496 headerLeftAnchorHasMargin = true;
497+ } else if (isHorizontal && isAudio) {
498+ headerLeftAnchor = 'left: audioButton.right; \n\
499+ leftMargin: units.gu(1);\n';
500+ headerLeftAnchorHasMargin = true;
430501 } else {
431502 headerLeftAnchor = 'left: parent.left;\n';
432503 }
433504
434− var touchdownOnArtShape = !hasBackground && hasArt && !hasMascot && !hasSummary;
505+ var touchdownOnArtShape = !hasBackground && hasArt && !hasMascot && !hasSummary && !isAudio;
435506
436507 if (hasHeaderRow) {
437508 code += 'readonly property int headerHeight: row.height;\n'
@@ -445,6 +516,14 @@ function cardString(template, components) {
445516 } else {
446517 code += 'readonly property int headerHeight: attributesRow.height;\n'
447518 }
519+ } else if (isAudio) {
520+ if (hasSubtitle) {
521+ code += 'readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin + audioProgressBar.height + audioProgressBar.anchors.topMargin;\n'
522+ } else if (hasTitle) {
523+ code += 'readonly property int headerHeight: titleLabel.height + audioProgressBar.height + audioProgressBar.anchors.topMargin;\n'
524+ } else {
525+ code += 'readonly property int headerHeight: audioProgressBar.height;\n'
526+ }
448527 } else if (hasSubtitle) {
449528 code += 'readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin;\n'
450529 } else if (hasTitle) {
@@ -632,6 +711,30 @@ function cardString(template, components) {
632711 code += mascotShapeCode + mascotCode + titleSubtitleCode;
633712 }
634713
714+ if (isAudio) {
715+ var audioProgressBarLeftAnchor = 'audioButton.right';
716+ var audioProgressBarBottomAnchor = 'audioButton.bottom';
717+ var audioProgressBarTextColor = 'root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText';
718+
719+ code += kAudioProgressBarCode.arg(audioProgressBarBottomAnchor)
720+ .arg(audioProgressBarLeftAnchor)
721+ .arg(audioProgressBarTextColor);
722+
723+ var audioButtonAnchorsFill;
724+ var audioButtonWidth;
725+ var audioButtonHeight;
726+ if (hasArt) {
727+ audioButtonAnchorsFill = 'artShapeHolder';
728+ audioButtonWidth = 'undefined';
729+ audioButtonHeight = 'undefined';
730+ } else {
731+ audioButtonAnchorsFill = 'undefined';
732+ audioButtonWidth = 'height';
733+ audioButtonHeight = '(root.fixedHeaderHeight > 0 ? root.fixedHeaderHeight : headerHeight) + 2 * units.gu(1)';
734+ }
735+ code += kAudioButtonCode.arg(audioButtonAnchorsFill).arg(audioButtonWidth).arg(audioButtonHeight);
736+ }
737+
635738 if (hasSummary) {
636739 var summaryTopAnchor;
637740 if (isHorizontal && hasArt) summaryTopAnchor = 'artShapeHolder.bottom';
@@ -670,6 +773,8 @@ function cardString(template, components) {
670773 var implicitHeight = 'implicitHeight: ';
671774 if (hasSummary) {
672775 implicitHeight += 'summary.y + summary.height + units.gu(1);\n';
776+ } else if (isAudio) {
777+ implicitHeight += 'audioButton.height;\n';
673778 } else if (headerAsOverlay) {
674779 implicitHeight += 'artShapeHolder.height;\n';
675780 } else if (hasHeaderRow) {
plugins/Dash/DashAudioPlayer.qmlnew file+96
@@ -0,0 +1,96 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+pragma Singleton
18+import QtQuick 2.4
19+import QtMultimedia 5.6
20+import Dash 0.1
21+
22+QtObject {
23+ readonly property real progress: audio.position / audio.duration
24+ readonly property bool playing: audio.playbackState === Audio.PlayingState
25+ readonly property bool paused: audio.playbackState === Audio.PausedState
26+ readonly property bool stopped: audio.playbackState === Audio.StoppedState
27+ readonly property alias position: audio.position
28+ readonly property url currentSource: audio.playlist.currentItemSource
29+
30+ function playSource(newSource, newPlaylist) {
31+ stop();
32+ audio.playlist.clear();
33+ if (newPlaylist) {
34+ // Look for newSource in newPlaylist
35+ var sourceIndex = -1;
36+ for (var i in newPlaylist) {
37+ if (AudioUrlComparer.compare(newSource, newPlaylist[i])) {
38+ sourceIndex = i;
39+ break;
40+ }
41+ }
42+ var urls = [];
43+ if (sourceIndex === -1 && newSource != "") {
44+ // If the playing song is not in the playlist, add it
45+ urls.push(newSource);
46+ sourceIndex = 0;
47+ }
48+ for (var i in newPlaylist) {
49+ urls.push(newPlaylist[i]);
50+ }
51+ audio.playlist.addItems(urls);
52+ audio.playlist.currentIndex = sourceIndex;
53+ } else {
54+ audio.playlist.addItem(newSource);
55+ audio.playlist.currentIndex = 0;
56+ }
57+ play();
58+ }
59+
60+ function stop() {
61+ audio.stop();
62+ }
63+
64+ function play() {
65+ audio.play();
66+ }
67+
68+ function pause() {
69+ audio.pause();
70+ }
71+
72+ property QtObject audio: Audio {
73+ id: audio
74+ objectName: "audio"
75+ playlist: Playlist {
76+ objectName: "playlist"
77+ }
78+
79+ onErrorStringChanged: console.warn("Dash Audio player error:", errorString)
80+ }
81+
82+ function lengthToString(s) {
83+ if (typeof(s) !== "number" || s < 0) return "";
84+
85+ var sec = "" + s % 60;
86+ if (sec.length == 1) sec = "0" + sec;
87+ var hour = Math.floor(s / 3600);
88+ if (hour < 1) {
89+ return Math.floor(s / 60) + ":" + sec;
90+ } else {
91+ var min = "" + Math.floor(s / 60) % 60;
92+ if (min.length == 1) min = "0" + min;
93+ return hour + ":" + min + ":" + sec;
94+ }
95+ }
96+}
plugins/Dash/graphics/music_progress_bg.pngnew file

Binary file not shown.

plugins/Dash/listviewwithpageheader.cpp+5−1
@@ -1177,7 +1177,7 @@ void ListViewWithPageHeader::headerHeightChanged(qreal newHeaderHeight, qreal ol
11771177
11781178void ListViewWithPageHeader::adjustMinYExtent()
11791179{
1180− if (m_visibleItems.isEmpty()) {
1180+ if (m_visibleItems.isEmpty() || contentHeight() < height()) {
11811181 m_minYExtent = 0;
11821182 } else {
11831183 qreal nonCreatedHeight = 0;
@@ -1359,6 +1359,10 @@ void ListViewWithPageHeader::updatePolish()
13591359
13601360 m_contentHeightDirty = false;
13611361 adjustMinYExtent();
1362+ if (contentHeight < height()) {
1363+ // need this since in the previous call to adjustMinYExtent contentHeight is not set yet
1364+ m_minYExtent = 0;
1365+ }
13621366 m_inContentHeightKeepHeaderShown = m_headerItem && m_headerItem->y() == contentY();
13631367 setContentHeight(contentHeight);
13641368 m_inContentHeightKeepHeaderShown = false;
plugins/Dash/plugin.cpp+35
@@ -23,6 +23,38 @@
2323#include "verticaljournal.h"
2424
2525#include <QAbstractItemModel>
26+#include <QUrlQuery>
27+
28+static QUrl oauthCleanedUrl(QUrl u)
29+{
30+ QUrlQuery q(u);
31+ q.removeQueryItem("oauth_nonce");
32+ q.removeQueryItem("oauth_timestamp");
33+ q.removeQueryItem("oauth_consumer_key");
34+ q.removeQueryItem("oauth_signature_method");
35+ q.removeQueryItem("oauth_version");
36+ q.removeQueryItem("oauth_signature");
37+ u.setQuery(q);
38+ return u;
39+}
40+
41+class AudioComparer : public QObject
42+{
43+ Q_OBJECT
44+public:
45+ Q_INVOKABLE bool compare(const QUrl &url1, const QUrl &url2)
46+ {
47+ return oauthCleanedUrl(url1) == oauthCleanedUrl(url2);
48+ }
49+};
50+
51+static QObject *audio_comparer_singleton_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
52+{
53+ Q_UNUSED(engine)
54+ Q_UNUSED(scriptEngine)
55+
56+ return new AudioComparer();
57+}
2658
2759void DashPlugin::registerTypes(const char *uri)
2860{
@@ -32,4 +64,7 @@ void DashPlugin::registerTypes(const char *uri)
3264 qmlRegisterType<ListViewWithPageHeader>(uri, 0, 1, "ListViewWithPageHeader");
3365 qmlRegisterType<OrganicGrid>(uri, 0, 1, "OrganicGrid");
3466 qmlRegisterType<VerticalJournal>(uri, 0, 1, "VerticalJournal");
67+ qmlRegisterSingletonType<AudioComparer>(uri, 0, 1, "AudioUrlComparer", audio_comparer_singleton_provider);
3568}
69+
70+#include "plugin.moc"
plugins/Dash/qmldir+3
@@ -2,6 +2,9 @@ module Dash
22plugin Dash-qml
33typeinfo Dash.qmltypes
44singleton CardCreatorCache 0.1 CardCreatorCache.qml
5+singleton DashAudioPlayer 0.1 DashAudioPlayer.qml
56ScopeStyle 0.1 ScopeStyle.qml
67CardAttributes 0.1 CardAttributes.qml
78CroppedImageMinimumSourceSize 0.1 CroppedImageMinimumSourceSize.qml
9+AudioProgressBar 0.1 AudioProgressBar.qml
10+CardAudioProgress 0.1 CardAudioProgress.qml
plugins/Unity/DashCommunicator/dashcommunicator.cpp+6
@@ -27,6 +27,12 @@ DashCommunicator::DashCommunicator(QObject *parent):
2727 start();
2828}
2929
30+DashCommunicator::~DashCommunicator()
31+{
32+ quit();
33+ wait();
34+}
35+
3036void DashCommunicator::setCurrentScope(int index, bool animate, bool isSwipe)
3137{
3238 m_mutex.lock();
plugins/Unity/DashCommunicator/dashcommunicator.h+1−1
@@ -28,7 +28,7 @@ class DashCommunicator: public QThread
2828 Q_OBJECT
2929public:
3030 explicit DashCommunicator(QObject *parent = 0);
31− ~DashCommunicator() = default;
31+ ~DashCommunicator();
3232
3333public Q_SLOTS:
3434 void setCurrentScope(int index, bool animate, bool isSwipe);
po/am.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-11-19 19:27+0000\n"
1212"Last-Translator: samson <Unknown>\n"
1313"Language-Team: Amharic <am@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ar.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-29 09:41+0000\n"
1212"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
1313"Language-Team: Arabic <ar@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
1818"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
19+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
2020"X-Generator: Launchpad (build 17881)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ast.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-10-06 12:07+0000\n"
1212"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
1313"Language-Team: Asturian <ast@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/az.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-09-03 16:39+0000\n"
1212"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
1313"Language-Team: Azerbaijani <az@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/be.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-12-13 13:12+0000\n"
1212"Last-Translator: Mikhail_SaTuRn <mikhail_saturn@tut.by>\n"
1313"Language-Team: Belarusian <be@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
19+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
2020"X-Generator: Launchpad (build 17881)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/bg.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-04-12 14:43+0000\n"
1212"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
1313"Language-Team: Bulgarian <bg@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/bn.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-11-27 19:38+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Bengali <bn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/br.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-10-05 06:47+0000\n"
1212"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
1313"Language-Team: Breton <br@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/bs.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-12-01 20:06+0000\n"
1212"Last-Translator: Kenan Gutić <Unknown>\n"
1313"Language-Team: Bosnian <bs@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
19+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
2020"X-Generator: Launchpad (build 17881)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ca.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-04 09:48+0000\n"
1212"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ca@valencia.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-02-22 15:22+0000\n"
1212"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ce.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-02-15 04:01+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Chechen <ce@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ckb.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-01-21 11:05+0000\n"
1212"Last-Translator: Aras <aras.noori@gmail.com>\n"
1313"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/cs.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-07 10:44+0000\n"
1212"Last-Translator: Vojtěch Daněk <vdanek@outlook.com>\n"
1313"Language-Team: Czech <cs@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020"Language: cs\n"
2121
po/cy.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-31 13:21+0000\n"
1212"Last-Translator: Owen Llywelyn <owen.llywelyn@gmail.com>\n"
1313"Language-Team: Welsh <cy@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? "
1818"2 : 3;\n"
19−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
19+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
2020"X-Generator: Launchpad (build 17881)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/da.po+2−2
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
11+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1212"PO-Revision-Date: 2015-07-06 12:05+0000\n"
1313"Last-Translator: Folmer Fredslund <Unknown>\n"
1414"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Type: text/plain; charset=UTF-8\n"
1717"Content-Transfer-Encoding: 8bit\n"
1818"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
19+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
2020"X-Generator: Launchpad (build 17881)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/de.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-24 18:03+0000\n"
1212"Last-Translator: Torsten Franz <Unknown>\n"
1313"Language-Team: German <de@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/el.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-12-04 09:38+0000\n"
1212"Last-Translator: Aggelos Arnaoutis <angelosarn@hotmail.com>\n"
1313"Language-Team: Greek <el@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/en_AU.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-12 07:17+0000\n"
1212"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
1313"Language-Team: English (Australia) <en_AU@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/en_GB.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-04-23 12:59+0000\n"
1212"Last-Translator: Andi Chandler <Unknown>\n"
1313"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/eo.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-06-06 23:37+0000\n"
1212"Last-Translator: Eliovir <Unknown>\n"
1313"Language-Team: Esperanto <eo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/es.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-04 06:08+0000\n"
1212"Last-Translator: Paco Molinero <paco@byasl.com>\n"
1313"Language-Team: Spanish <es@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/eu.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-13 23:29+0000\n"
1212"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
1313"Language-Team: Basque <eu@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/fa.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-11 15:43+0000\n"
1212"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
1313"Language-Team: Persian <fa@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/fi.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-04 18:32+0000\n"
1212"Last-Translator: Jiri Grönroos <Unknown>\n"
1313"Language-Team: Finnish <fi@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/fo.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-01-14 20:08+0000\n"
1212"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
1313"Language-Team: Faroese <fo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/fr.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-11-07 19:43+0000\n"
1212"Last-Translator: Jean-Marc <Unknown>\n"
1313"Language-Team: French <fr@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ga.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-12-17 16:56+0000\n"
1212"Last-Translator: Joshua Kiley <Unknown>\n"
1313"Language-Team: Irish <ga@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/gd.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-16 10:56+0000\n"
1212"Last-Translator: GunChleoc <Unknown>\n"
1313"Language-Team: Fòram na Gàidhlig\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
1818"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
19+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
2020"X-Generator: Launchpad (build 17881)\n"
2121"Language: gd\n"
2222
po/gl.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-12-04 17:06+0000\n"
1212"Last-Translator: Marcos Lans <Unknown>\n"
1313"Language-Team: Galician <gl@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/gv.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-04-02 14:24+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Manx <gv@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : (n == 2 ? 1 : 2);\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/he.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-12 08:47+0000\n"
1212"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
1313"Language-Team: Hebrew <he@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/hi.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-01-15 01:49+0000\n"
1212"Last-Translator: Siddhanathan Shanmugam <Unknown>\n"
1313"Language-Team: Hindi <hi@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/hr.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2013-06-27 04:14+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Croatian <hr@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
19+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
2020"X-Generator: Launchpad (build 17881)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/hu.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-12-30 09:49+0000\n"
1212"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
1313"Language-Team: Hungarian <hu@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/hy.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-10-28 06:34+0000\n"
1212"Last-Translator: Vahan Harutyunyan <Unknown>\n"
1313"Language-Team: Armenian <hy@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ia.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-08-25 19:31+0000\n"
1212"Last-Translator: karm <melo@carmu.com>\n"
1313"Language-Team: Interlingua <ia@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/id.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2013-06-26 22:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Indonesian <id@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/is.po+2−2
@@ -9,7 +9,7 @@ msgid ""
99msgstr ""
1010"Project-Id-Version: po_unity8-is\n"
1111"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
12−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
12+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1313"PO-Revision-Date: 2014-11-13 09:32+0000\n"
1414"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
1515"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
@@ -17,7 +17,7 @@ msgstr ""
1717"Content-Type: text/plain; charset=UTF-8\n"
1818"Content-Transfer-Encoding: 8bit\n"
1919"Plural-Forms: nplurals=2; plural=n != 1;\n"
20−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
20+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
2121"X-Generator: Launchpad (build 17881)\n"
2222"Language: is\n"
2323
po/it.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-09-18 08:24+0000\n"
1212"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
1313"Language-Team: Italian <it@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ja.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-10-05 10:05+0000\n"
1212"Last-Translator: Kentaro Kazuhama <Unknown>\n"
1313"Language-Team: Japanese <ja@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/km.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-08-20 02:48+0000\n"
1212"Last-Translator: Sophea Sok <sksophea@gmail.com>\n"
1313"Language-Team: Khmer <km@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/kn.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2013-06-27 05:43+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Kannada <kn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ko.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-08-19 13:02+0000\n"
1212"Last-Translator: MinSik CHO <Unknown>\n"
1313"Language-Team: Korean <ko@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ku.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-09-10 13:14+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Kurdish <ku@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ky.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2013-06-27 06:17+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Kirghiz <ky@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/lo.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2013-10-02 10:00+0000\n"
1212"Last-Translator: Anousak <anousak@gmail.com>\n"
1313"Language-Team: Lao <lo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/lt.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-05-19 17:15+0000\n"
1212"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
1313"Language-Team: Lithuanian <lt@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"(n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
19+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
2020"X-Generator: Launchpad (build 17881)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/lv.po+2−2
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity\n"
1010"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
11+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1212"PO-Revision-Date: 2015-11-22 19:13+0000\n"
1313"Last-Translator: Klavs Anson <anson.klavs@gmail.com>\n"
1414"Language-Team: Latvian <lata-l10n@googlegroups.com>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Type: text/plain; charset=UTF-8\n"
1717"Content-Transfer-Encoding: 8bit\n"
1818"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
19+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
2020"X-Generator: Launchpad (build 17881)\n"
2121"Language: lv\n"
2222
po/ml.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2013-11-23 11:44+0000\n"
1212"Last-Translator: ST Alfas <Unknown>\n"
1313"Language-Team: Malayalam <ml@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/mr.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-01-14 19:54+0000\n"
1212"Last-Translator: Rohan Deshmukh <Unknown>\n"
1313"Language-Team: Marathi <mr@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ms.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-01-17 09:05+0000\n"
1212"Last-Translator: abuyop <Unknown>\n"
1313"Language-Team: Malay <ms@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/my.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2013-12-12 11:12+0000\n"
1212"Last-Translator: Pyae Sone <Unknown>\n"
1313"Language-Team: Burmese <my@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/nb.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-05 19:44+0000\n"
1212"Last-Translator: Mathias Bynke <Unknown>\n"
1313"Language-Team: Norwegian Bokmal <nb@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ne.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-12-06 15:11+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Nepali <ne@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/nl.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-07 07:14+0000\n"
1212"Last-Translator: Hannie Dumoleyn <Unknown>\n"
1313"Language-Team: Dutch <nl@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/nn.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-05-12 11:32+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Norwegian Nynorsk <nn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/oc.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-02-05 20:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Occitan (post 1500) <oc@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/or.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-03-21 05:28+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Oriya <or@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n!=1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/pa.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-04-24 04:29+0000\n"
1212"Last-Translator: Gursharnjit_Singh <ubuntuser13@gmail.com>\n"
1313"Language-Team: Punjabi <pa@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/pl.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-12 09:46+0000\n"
1212"Last-Translator: Seweryn Opyd <Unknown>\n"
1313"Language-Team: Polish <pl@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
1818"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
19+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
2020"X-Generator: Launchpad (build 17881)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/pt.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-12-20 09:20+0000\n"
1212"Last-Translator: Ivo Xavier <ivofernandes12@gmail.com>\n"
1313"Language-Team: Portuguese <pt@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/pt_BR.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-08-05 04:40+0000\n"
1212"Last-Translator: Julio Alexander Sieg <julio.sieg@gmail.com>\n"
1313"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ro.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-06 17:47+0000\n"
1212"Last-Translator: Meriuță Cornel <meriutacornel@neacornel.eu>\n"
1313"Language-Team: Romanian <ro@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
1818"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
19+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
2020"X-Generator: Launchpad (build 17881)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ru.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-06 05:33+0000\n"
1212"Last-Translator: ☠Jay ZDLin☠ <Unknown>\n"
1313"Language-Team: Russian <ru@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
19+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
2020"X-Generator: Launchpad (build 17881)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/shn.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-11-10 12:09+0000\n"
1212"Last-Translator: Rockworld <sumoisrock@gmail.com>\n"
1313"Language-Team: Shan <shn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/si.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2013-06-26 22:36+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Sinhalese <si@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/sk.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-04-10 09:15+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Slovak <sk@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/sl.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-06 21:10+0000\n"
1212"Last-Translator: Sasa Batistic <Unknown>\n"
1313"Language-Team: Slovenian <sl@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
1818"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
19+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
2020"X-Generator: Launchpad (build 17881)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/sq.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-11-30 21:05+0000\n"
1212"Last-Translator: Indrit Bashkimi <indrit.bashkimi@gmail.com>\n"
1313"Language-Team: Albanian <sq@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:32+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:27+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/sr.po+2−2
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity\n"
1010"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
11+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1212"PO-Revision-Date: 2015-12-09 20:16+0000\n"
1313"Last-Translator: Bojan Bogdanović <Unknown>\n"
1414"Language-Team: српски <xfce4@xfce4.org>\n"
@@ -17,7 +17,7 @@ msgstr ""
1717"Content-Transfer-Encoding: 8bit\n"
1818"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1919"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
20−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
20+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
2121"X-Generator: Launchpad (build 17881)\n"
2222"Language: sr\n"
2323
po/sv.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-12 22:17+0000\n"
1212"Last-Translator: Josef Andersson <Unknown>\n"
1313"Language-Team: Swedish\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020"Language: sv\n"
2121
po/sw.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-17 20:02+0000\n"
1212"Last-Translator: Valentine <mwangi_valentino@yahoo.com>\n"
1313"Language-Team: Swahili <sw@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ta.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2013-10-24 11:36+0000\n"
1212"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
1313"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020"Language: ta\n"
2121
po/te.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-07-19 10:04+0000\n"
1212"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
1313"Language-Team: Telugu <te@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/th.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-10-02 04:55+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Thai <th@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/tr.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-03-22 15:56+0000\n"
1212"Last-Translator: Arda Ünlü <aarda.uunlu@gmail.com>\n"
1313"Language-Team: Turkish <tr@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/ug.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-12-01 07:37+0000\n"
1212"Last-Translator: Eltikin <eltikinuyghur@hotmail.com>\n"
1313"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/uk.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-04 05:53+0000\n"
1212"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
1313"Language-Team: Ukrainian <uk@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
19+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
2020"X-Generator: Launchpad (build 17881)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/unity8.pot+27−27
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
11+"POT-Creation-Date: 2016-01-11 17:43+0000\n"
1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -171,26 +171,26 @@ msgstr ""
171171msgid "Close all"
172172msgstr ""
173173
174−#: qml/Dash/DashPageHeader.qml:265
174+#: qml/Dash/DashPageHeader.qml:266
175175msgctxt "Button: Open the Ubuntu Store"
176176msgid "Store"
177177msgstr ""
178178
179−#: qml/Dash/DashPageHeader.qml:272
179+#: qml/Dash/DashPageHeader.qml:273
180180msgctxt "Button: Start a search in the current dash scope"
181181msgid "Search"
182182msgstr ""
183183
184−#: qml/Dash/DashPageHeader.qml:282
184+#: qml/Dash/DashPageHeader.qml:283
185185msgctxt "Button: Show the current dash scope settings"
186186msgid "Settings"
187187msgstr ""
188188
189−#: qml/Dash/DashPageHeader.qml:289
189+#: qml/Dash/DashPageHeader.qml:290
190190msgid "Remove from Favorites"
191191msgstr ""
192192
193−#: qml/Dash/DashPageHeader.qml:289
193+#: qml/Dash/DashPageHeader.qml:290
194194msgid "Add to Favorites"
195195msgstr ""
196196
@@ -228,7 +228,7 @@ msgstr ""
228228msgid "Add a review"
229229msgstr ""
230230
231−#: qml/Dash/Previews/PreviewSharing.qml:51
231+#: qml/Dash/Previews/PreviewSharing.qml:50
232232msgid "Preview Share Item"
233233msgstr ""
234234
@@ -339,62 +339,62 @@ msgstr ""
339339msgid "Conference"
340340msgstr ""
341341
342−#: qml/Panel/Indicators/MenuItemFactory.qml:743
342+#: qml/Panel/Indicators/MenuItemFactory.qml:753
343343msgid "Nothing is playing"
344344msgstr ""
345345
346−#: qml/Panel/Indicators/MenuItemFactory.qml:872
346+#: qml/Panel/Indicators/MenuItemFactory.qml:882
347347#, qt-format
348348msgid "%1 hour"
349349msgid_plural "%1 hours"
350350msgstr[0] ""
351351msgstr[1] ""
352352
353−#: qml/Panel/Indicators/MenuItemFactory.qml:876
353+#: qml/Panel/Indicators/MenuItemFactory.qml:886
354354#, qt-format
355355msgid "%1 minute"
356356msgid_plural "%1 minutes"
357357msgstr[0] ""
358358msgstr[1] ""
359359
360−#: qml/Panel/Indicators/MenuItemFactory.qml:881
360+#: qml/Panel/Indicators/MenuItemFactory.qml:891
361361#, qt-format
362362msgid "%1 second"
363363msgid_plural "%1 seconds"
364364msgstr[0] ""
365365msgstr[1] ""
366366
367−#: qml/Panel/Indicators/MenuItemFactory.qml:884
367+#: qml/Panel/Indicators/MenuItemFactory.qml:894
368368msgid "0 seconds"
369369msgstr ""
370370
371371#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
372−#: qml/Panel/Indicators/MenuItemFactory.qml:886
372+#: qml/Panel/Indicators/MenuItemFactory.qml:896
373373#, qt-format
374374msgid "%1 remaining"
375375msgstr ""
376376
377−#: qml/Panel/Indicators/MenuItemFactory.qml:892
377+#: qml/Panel/Indicators/MenuItemFactory.qml:902
378378msgid "In queue…"
379379msgstr ""
380380
381−#: qml/Panel/Indicators/MenuItemFactory.qml:896
381+#: qml/Panel/Indicators/MenuItemFactory.qml:906
382382msgid "Downloading"
383383msgstr ""
384384
385−#: qml/Panel/Indicators/MenuItemFactory.qml:898
385+#: qml/Panel/Indicators/MenuItemFactory.qml:908
386386msgid "Paused, tap to resume"
387387msgstr ""
388388
389−#: qml/Panel/Indicators/MenuItemFactory.qml:900
389+#: qml/Panel/Indicators/MenuItemFactory.qml:910
390390msgid "Canceled"
391391msgstr ""
392392
393−#: qml/Panel/Indicators/MenuItemFactory.qml:902
393+#: qml/Panel/Indicators/MenuItemFactory.qml:912
394394msgid "Finished"
395395msgstr ""
396396
397−#: qml/Panel/Indicators/MenuItemFactory.qml:904
397+#: qml/Panel/Indicators/MenuItemFactory.qml:914
398398msgid "Failed, tap to retry"
399399msgstr ""
400400
@@ -492,7 +492,7 @@ msgstr ""
492492msgid "Let’s get started."
493493msgstr ""
494494
495−#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
495+#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:133
496496#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
497497#: qml/Wizard/Pages/60-reporting.qml:60 qml/Wizard/Pages/passwd-confirm.qml:82
498498#: qml/Wizard/Pages/passwd-set.qml:90
@@ -515,36 +515,36 @@ msgstr ""
515515msgid "Lock security"
516516msgstr ""
517517
518−#: qml/Wizard/Pages/30-passwd-type.qml:74
518+#: qml/Wizard/Pages/30-passwd-type.qml:79
519519msgid "Please select how you’d like to unlock your phone."
520520msgstr ""
521521
522−#: qml/Wizard/Pages/30-passwd-type.qml:97
522+#: qml/Wizard/Pages/30-passwd-type.qml:102
523523msgctxt "Label: Type of security method"
524524msgid "Swipe"
525525msgstr ""
526526
527−#: qml/Wizard/Pages/30-passwd-type.qml:98
527+#: qml/Wizard/Pages/30-passwd-type.qml:103
528528msgctxt "Label: Description of security method"
529529msgid "No security"
530530msgstr ""
531531
532−#: qml/Wizard/Pages/30-passwd-type.qml:100
532+#: qml/Wizard/Pages/30-passwd-type.qml:105
533533msgctxt "Label: Type of security method"
534534msgid "Passcode"
535535msgstr ""
536536
537−#: qml/Wizard/Pages/30-passwd-type.qml:101
537+#: qml/Wizard/Pages/30-passwd-type.qml:106
538538msgctxt "Label: Description of security method"
539539msgid "4 digits only"
540540msgstr ""
541541
542−#: qml/Wizard/Pages/30-passwd-type.qml:103
542+#: qml/Wizard/Pages/30-passwd-type.qml:108
543543msgctxt "Label: Type of security method"
544544msgid "Passphrase"
545545msgstr ""
546546
547−#: qml/Wizard/Pages/30-passwd-type.qml:104
547+#: qml/Wizard/Pages/30-passwd-type.qml:109
548548msgctxt "Label: Description of security method"
549549msgid "Numbers and letters"
550550msgstr ""
po/ur.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-05-05 03:12+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Urdu <ur@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/uz.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-04 16:03+0000\n"
1212"Last-Translator: Learner <muzaffar.habibullayev@yandex.ru>\n"
1313"Language-Team: Uzbek <uz@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/vi.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-01-15 01:19+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Vietnamese <vi@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/wo.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-10-29 11:16+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Wolof <wo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/xh.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2013-09-28 13:20+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Xhosa <xh@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/zh_CN.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-27 10:26+0000\n"
1212"Last-Translator: Ian Li <Unknown>\n"
1313"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/zh_HK.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2014-08-10 11:45+0000\n"
1212"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
1313"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
po/zh_TW.po+2−2
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-01-05 14:03+0000\n"
10+"POT-Creation-Date: 2016-01-07 08:09+0000\n"
1111"PO-Revision-Date: 2015-07-31 09:29+0000\n"
1212"Last-Translator: Po-Hsu Lin <po-hsu.lin@canonical.com>\n"
1313"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-01-08 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2016-01-10 05:28+0000\n"
1919"X-Generator: Launchpad (build 17881)\n"
2020"Language: zh_TW\n"
2121
qml/Dash/DashPageHeader.qml+1
@@ -102,6 +102,7 @@ Item {
102102 "edgeMargins": units.gu(1)
103103 }
104104 );
105+ searchTextField.forceActiveFocus();
105106 }
106107 }
107108
qml/Dash/Previews/PreviewAudioPlayback.qml+16−76
@@ -15,8 +15,8 @@
1515 */
1616
1717import QtQuick 2.4
18−import QtMultimedia 5.0
1918import Ubuntu.Components 1.3
19+import Dash 0.1
2020
2121/*! \brief Preview widget for audio tracks.
2222
@@ -36,38 +36,6 @@ PreviewWidget {
3636 id: root
3737 implicitHeight: childrenRect.height
3838
39− onIsCurrentPreviewChanged: if (!isCurrentPreview) audio.stop()
40−
41− Audio {
42− id: audio
43− objectName: "audio"
44−
45− property real progress: audio.position / audio.duration
46− property Item playingItem
47−
48− Component.onDestruction: {
49− // destroying the component doesn't automatically send stop to the media service, probably a bug in QtMultimedia
50− audio.stop();
51− }
52−
53− onErrorStringChanged: console.warn("Audio player error:", errorString)
54−
55− function lengthToString(s) {
56− if (typeof(s) !== "number" || s <= 0) return "";
57−
58− var sec = "" + s % 60;
59− if (sec.length == 1) sec = "0" + sec;
60− var hour = Math.floor(s / 3600);
61− if (hour < 1) {
62− return Math.floor(s / 60) + ":" + sec;
63− } else {
64− var min = "" + Math.floor(s / 60) % 60;
65− if (min.length == 1) min = "0" + min;
66− return hour + ":" + min + ":" + sec;
67− }
68− }
69− }
70−
7139 Column {
7240 anchors { left: parent.left; right: parent.right }
7341 visible: trackRepeater.count > 0
@@ -77,20 +45,12 @@ PreviewWidget {
7745 objectName: "trackRepeater"
7846 model: root.widgetData["tracks"]
7947
80− function play(item, source) {
81− audio.stop();
82− // Make sure we change the source, even if two items point to the same uri location
83− audio.source = "";
84− audio.source = source;
85− audio.playingItem = item;
86− audio.play();
87− }
88−
8948 delegate: Item {
9049 id: trackItem
9150 objectName: "trackItem" + index
9251
93− property bool isPlayingItem: audio.playingItem == trackItem
52+ readonly property url sourceUrl: modelData["source"]
53+ readonly property bool isPlayingItem: AudioUrlComparer.compare(sourceUrl, DashAudioPlayer.currentSource)
9454
9555 anchors { left: parent.left; right: parent.right }
9656 height: units.gu(5)
@@ -98,9 +58,9 @@ PreviewWidget {
9858 Row {
9959 id: trackRow
10060
101− property int column1Width: units.gu(3)
102− property int column2Width: width - (2 * spacing) - column1Width - column3Width
103− property int column3Width: units.gu(4)
61+ readonly property int column1Width: units.gu(3)
62+ readonly property int column2Width: width - (2 * spacing) - column1Width - column3Width
63+ readonly property int column3Width: units.gu(4)
10464
10565 anchors.verticalCenter: parent.verticalCenter
10666 width: parent.width
@@ -110,7 +70,7 @@ PreviewWidget {
11070 objectName: "playButton"
11171 width: trackRow.column1Width
11272 height: width
113− iconSource: audio.playbackState == Audio.PlayingState && trackItem.isPlayingItem ? "image://theme/media-playback-pause" : "image://theme/media-playback-start"
73+ iconSource: DashAudioPlayer.playing && trackItem.isPlayingItem ? "image://theme/media-playback-pause" : "image://theme/media-playback-start"
11474
11575 // Can't be "transparent" or "#00xxxxxx" as the button optimizes away the surrounding shape
11676 // FIXME when this is resolved: https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1251685
@@ -118,13 +78,13 @@ PreviewWidget {
11878
11979 onClicked: {
12080 if (trackItem.isPlayingItem) {
121− if (audio.playbackState == Audio.PlayingState) {
122− audio.pause();
123− } else if (audio.playbackState == Audio.PausedState) {
124− audio.play();
81+ if (DashAudioPlayer.playing) {
82+ DashAudioPlayer.pause();
83+ } else if (DashAudioPlayer.paused) {
84+ DashAudioPlayer.play();
12585 }
12686 } else {
127− trackRepeater.play(trackItem, modelData["source"]);
87+ DashAudioPlayer.playSource(sourceUrl);
12888 }
12989 }
13090 }
@@ -160,30 +120,10 @@ PreviewWidget {
160120 elide: Text.ElideRight
161121 }
162122
163− UbuntuShape {
164− id: progressBarFill
165− objectName: "progressBarFill"
166−
167− property int maxWidth: progressBarImage.width - units.dp(4)
168−
169− anchors {
170− left: progressBarImage.left
171− right: progressBarImage.right
172− verticalCenter: progressBarImage.verticalCenter
173− margins: units.dp(2)
174− rightMargin: maxWidth - (maxWidth * audio.progress) + units.dp(2)
175− }
176− height: units.dp(2)
177− visible: progressBarImage.visible
178− backgroundColor: UbuntuColors.orange
179− }
180−
181− Image {
182− id: progressBarImage
123+ AudioProgressBar {
183124 anchors { left: parent.left; top: parent.bottom; right: parent.right }
184− height: units.dp(6)
185− visible: audio.playbackState != Audio.StoppedState && trackItem.isPlayingItem && modelData["length"] > 0
186− source: "graphics/music_progress_bg.png"
125+ visible: !DashAudioPlayer.stopped && trackItem.isPlayingItem && modelData["length"] > 0
126+ source: sourceUrl
187127 }
188128 }
189129
@@ -196,7 +136,7 @@ PreviewWidget {
196136 color: scopeStyle ? scopeStyle.foreground : theme.palette.normal.baseText
197137 fontSize: "small"
198138 horizontalAlignment: Text.AlignRight
199− text: audio.lengthToString(modelData["length"])
139+ text: DashAudioPlayer.lengthToString(modelData["length"])
200140 }
201141 }
202142 }
qml/Dash/Previews/PreviewMediaToolbar.qml+2−1
@@ -23,10 +23,11 @@ Rectangle {
2323
2424 implicitHeight: units.gu(6)
2525 color: Qt.rgba(0, 0, 0, 0.8)
26− visible: sharingWidget.visible
26+ visible: sharingWidget.active
2727
2828 PreviewSharing {
2929 id: sharingWidget
30+ objectName: "sharingWidget"
3031 anchors {
3132 left: parent.left
3233 verticalCenter: parent.verticalCenter
qml/Dash/Previews/PreviewSharing.qml+3−4
@@ -24,13 +24,12 @@ Item {
2424 implicitWidth: button.width
2525
2626 property var shareData
27+ property alias active: peerPicker.active
2728 readonly property bool isUrlExternal: url && url.indexOf("file:///") != 0 && url.indexOf("/") != 0
28− readonly property string contentType: shareData ? shareData["contentType"] : ""
29+ readonly property string contentType: shareData ? shareData["content-type"] : ""
2930 readonly property var url: shareData ? shareData["uri"] : ""
3031 readonly property Item rootItem: QuickUtils.rootItem(root)
3132
32− visible: url != ""
33−
3433 AbstractButton {
3534 id: button
3635 height: units.gu(4)
@@ -98,7 +97,7 @@ Item {
9897 parent: rootItem
9998 anchors.fill: parent
10099 visible: false
101− active: root.visible
100+ active: root.url != ""
102101
103102 sourceComponent: contentPeerComponent
104103 }
qml/Dash/Previews/PreviewVideoPlayback.qml+1−1
@@ -81,7 +81,7 @@ PreviewWidget {
8181 right: parent.right
8282 bottom: parent.bottom
8383 }
84− shareData: widgetData["shareData"]
84+ shareData: widgetData["share-data"]
8585 }
8686 }
8787}
qml/Dash/Previews/PreviewZoomableImage.qml+1−1
@@ -72,7 +72,7 @@ PreviewWidget {
7272 right: parent.right
7373 bottom: parent.bottom
7474 }
75− shareData: widgetData["shareData"]
75+ shareData: widgetData["share-data"]
7676 }
7777 }
7878
qml/Dash/Previews/graphics/music_progress_bg.pngdeleted

Binary file not shown.

qml/Greeter/Greeter.qml+7−4
@@ -33,7 +33,7 @@ Showable {
3333 // How far to offset the top greeter layer during a launcher left-drag
3434 property real launcherOffset
3535
36− readonly property bool active: shown || hasLockedApp
36+ readonly property bool active: required || hasLockedApp
3737 readonly property bool fullyShown: loader.item ? loader.item.fullyShown : false
3838
3939 // True when the greeter is waiting for PAM or other setup process
@@ -226,14 +226,17 @@ Showable {
226226 }
227227
228228 function checkForForcedDelay() {
229+ if (greeterSettings.lockedOutTime === 0) {
230+ return;
231+ }
232+
229233 var now = new Date();
230− delayTarget = now;
231− delayTarget.setTime(greeterSettings.lockedOutTime + failedLoginsDelayMinutes * 60000);
234+ delayTarget = new Date(greeterSettings.lockedOutTime + failedLoginsDelayMinutes * 60000);
232235
233236 // If tooEarly is true, something went very wrong. Bug or NTP
234237 // misconfiguration maybe?
235238 var tooEarly = now.getTime() < greeterSettings.lockedOutTime;
236− var tooLate = now > delayTarget;
239+ var tooLate = now >= delayTarget;
237240
238241 // Compare stored time to system time. If a malicious actor is
239242 // able to manipulate time to avoid our lockout, they already have
qml/Launcher/Launcher.qml+3−8
@@ -310,16 +310,11 @@ FocusScope {
310310 }
311311 }
312312
313− MultiPointTouchArea {
313+ InverseMouseArea {
314314 id: closeMouseArea
315− anchors {
316− left: launcherDragArea.right
317− top: parent.top
318− right: parent.right
319− bottom: parent.bottom
320− }
315+ anchors.fill: panel
321316 enabled: root.shadeBackground && root.state == "visible" && !root.lockedVisible
322− visible: enabled // otherwise it will get in the way of cursor selection for some reason
317+ visible: enabled
323318 onPressed: {
324319 root.hide();
325320 }
qml/Launcher/LauncherPanel.qml+6−3
@@ -420,7 +420,6 @@ Rectangle {
420420 }
421421
422422 onClicked: {
423− Haptics.play();
424423 var index = Math.floor((mouseY + launcherListView.realContentY) / launcherListView.realItemHeight);
425424 var clickedItem = launcherListView.itemAt(mouseX, mouseY + launcherListView.realContentY)
426425
@@ -432,9 +431,11 @@ Rectangle {
432431 if (mouse.button & Qt.RightButton) { // context menu
433432 // Opening QuickList
434433 quickList.open(index);
435− return
434+ return;
436435 }
437436
437+ Haptics.play();
438+
438439 // First/last item do the scrolling at more than 12 degrees
439440 if (index == 0 || index == launcherListView.count - 1) {
440441 if (clickedItem.angle > 12 || clickedItem.angle < -12) {
@@ -611,6 +612,7 @@ Rectangle {
611612 width: itemWidth
612613 rotation: root.rotation
613614 itemOpacity: 0.9
615+ onVisibleChanged: if (!visible) iconName = "";
614616
615617 function flatten() {
616618 fakeDragItemAnimation.start();
@@ -653,6 +655,7 @@ Rectangle {
653655 rotation: 90
654656 }
655657 }
658+
656659 InverseMouseArea {
657660 anchors.fill: quickListShape
658661 enabled: quickList.state == "open" || pressed
@@ -743,7 +746,7 @@ Rectangle {
743746 }
744747
745748 // internal
746− property int itemCenter: item ? root.mapFromItem(quickList.item).y + (item.height / 2) : units.gu(1)
749+ property int itemCenter: item ? root.mapFromItem(quickList.item).y + (item.height / 2) + quickList.item.offset : units.gu(1)
747750 property int offset: itemCenter + (height/2) + units.gu(1) > parent.height ? -itemCenter - (height/2) - units.gu(1) + parent.height :
748751 itemCenter - (height/2) < units.gu(1) ? (height/2) - itemCenter + units.gu(1) : 0
749752
qml/Panel/Indicators/MenuItemFactory.qml+11−1
@@ -576,7 +576,17 @@ Item {
576576 active: serverChecked
577577 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
578578 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
579− signalStrength: strengthAction.valid ? strengthAction.state : 0
579+ signalStrength: {
580+ if (strengthAction.valid) {
581+ var state = strengthAction.state; // handle both int and uchar
582+ // FIXME remove the special casing when we switch to indicator-network completely
583+ if (typeof state == "string") {
584+ return state.charCodeAt();
585+ }
586+ return state;
587+ }
588+ return 0;
589+ }
580590 highlightWhenPressed: false
581591
582592 onMenuModelChanged: {
qml/Stages/DesktopStage.qml+7−3
@@ -124,16 +124,20 @@ AbstractStage {
124124 onFocusedAppDelegateChanged: updateForegroundMaximizedApp();
125125
126126 property int foregroundMaximizedAppZ: -1
127+ property int foregroundMaximizedAppIndex: -1 // for stuff like drop shadow and focusing maximized app by clicking panel
127128
128129 function updateForegroundMaximizedApp() {
129130 var tmp = -1;
131+ var tmpAppId = -1;
130132 for (var i = appRepeater.count - 1; i >= 0; i--) {
131133 var item = appRepeater.itemAt(i);
132134 if (item && item.visuallyMaximized) {
135+ tmpAppId = i;
133136 tmp = Math.max(tmp, item.normalZ);
134137 }
135138 }
136139 foregroundMaximizedAppZ = tmp;
140+ foregroundMaximizedAppIndex = tmpAppId;
137141 }
138142
139143 function indexOf(appId) {
@@ -176,8 +180,8 @@ AbstractStage {
176180 onMinimize: priv.focusedAppDelegate && priv.focusedAppDelegate.minimize();
177181 onMaximize: priv.focusedAppDelegate // don't restore minimized apps when double clicking the panel
178182 && priv.focusedAppDelegate.restoreFromMaximized();
179− onFocusMaximizedApp: if (priv.foregroundMaximizedAppIdIndex != -1) {
180− ApplicationManager.focusApplication(appRepeater.itemAt(priv.foregroundMaximizedAppIdIndex).appId);
183+ onFocusMaximizedApp: if (priv.foregroundMaximizedAppIndex != -1) {
184+ ApplicationManager.focusApplication(appRepeater.itemAt(priv.foregroundMaximizedAppIndex).appId);
181185 }
182186 }
183187
@@ -206,7 +210,7 @@ AbstractStage {
206210 Binding {
207211 target: PanelState
208212 property: "dropShadow"
209− value: priv.focusedAppDelegate && !priv.focusedAppDelegate.maximized && priv.foregroundMaximizedAppIdIndex !== -1
213+ value: priv.focusedAppDelegate && !priv.focusedAppDelegate.maximized && priv.foregroundMaximizedAppIndex !== -1
210214 }
211215
212216 Component.onDestruction: {
qml/Wizard/Pages/30-passwd-type.qml+5
@@ -39,6 +39,11 @@ LocalComponents.Page {
3939 title: i18n.tr("Lock security")
4040 forwardButtonSourceComponent: forwardButton
4141
42+ // If the user has set a password some other way (via ubuntu-device-flash
43+ // or this isn't the first time the wizard has been run, etc). We can't
44+ // properly set the password again, so let's not pretend we can.
45+ skip: securityPrivacy.securityType !== UbuntuSecurityPrivacyPanel.Swipe
46+
4247 function indexToMethod(index) {
4348 if (index === 0)
4449 return UbuntuSecurityPrivacyPanel.Swipe
src/CMakeLists.txt+13−7
@@ -16,10 +16,9 @@ file(GLOB_RECURSE QML_FILES
1616 ${CMAKE_SOURCE_DIR}/tests/*.svg
1717)
1818
19−add_executable(${SHELL_APP}
19+set(SOURCE_FILES
2020 ApplicationArguments.cpp
2121 main.cpp
22− MouseTouchAdaptor.cpp
2322 CachingNetworkManagerFactory.cpp
2423 SecondaryWindow.cpp
2524 ShellApplication.cpp
@@ -28,15 +27,22 @@ add_executable(${SHELL_APP}
2827 ${QML_FILES} # This is to make qml and image files appear in the IDE's project tree
2928)
3029
30+if (ENABLE_TOUCH_EMULATION)
31+ set(SOURCE_FILES ${SOURCE_FILES} MouseTouchAdaptor.cpp)
32+endif()
33+
34+pkg_check_modules(ANDROID_PROPERTIES REQUIRED libandroid-properties)
35+add_executable(${SHELL_APP} ${SOURCE_FILES})
3136qt5_use_modules(${SHELL_APP} Gui Qml Quick Test)
3237
33−pkg_check_modules(NEEDED_LIBS REQUIRED xcb libandroid-properties)
34−if (NOT "${NEEDED_LIBS_INCLUDE_DIRS}" STREQUAL "")
35− set_target_properties(${SHELL_APP} PROPERTIES INCLUDE_DIRECTORIES ${NEEDED_LIBS_INCLUDE_DIRS})
38+if (NOT "${ANDROID_PROPERTIES_INCLUDE_DIRS}" STREQUAL "")
39+ set_target_properties(${SHELL_APP} PROPERTIES INCLUDE_DIRECTORIES ${ANDROID_PROPERTIES_INCLUDE_DIRS})
3640endif()
37−target_link_libraries(${SHELL_APP} ${NEEDED_LIBS_LDFLAGS})
41+target_link_libraries(${SHELL_APP} ${ANDROID_PROPERTIES_LDFLAGS} UbuntuGestures connectivity-qt1)
3842
39−target_link_libraries(${SHELL_APP} UbuntuGestures connectivity-qt1)
43+if (ENABLE_TOUCH_EMULATION)
44+ target_link_libraries(${SHELL_APP} ${MOUSETOUCHADAPTOR_LIBS_LDFLAGS})
45+endif()
4046
4147# For it to find libUbuntuGestures.so
4248set_target_properties(${SHELL_APP} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}")
src/Dash/CMakeLists.txt+8−8
@@ -1,25 +1,25 @@
11set(DASH_SRCS
22 main.cpp
3− ../ApplicationArguments.cpp
4− ../MouseTouchAdaptor.cpp
53 ../CachingNetworkManagerFactory.cpp
64)
75
6+if (ENABLE_TOUCH_EMULATION)
7+ set(DASH_SRCS ${DASH_SRCS} ../MouseTouchAdaptor.cpp)
8+endif()
9+
810add_executable(unity8-dash ${DASH_SRCS})
911
1012qt5_use_modules(unity8-dash Gui Qml Quick Test)
1113
12−pkg_check_modules(NEEDED_LIBS REQUIRED xcb libandroid-properties)
13−if (NOT "${NEEDED_LIBS_INCLUDE_DIRS}" STREQUAL "")
14− set_target_properties(unity8-dash PROPERTIES INCLUDE_DIRECTORIES ${NEEDED_LIBS_INCLUDE_DIRS})
15−endif()
16−target_link_libraries(unity8-dash ${NEEDED_LIBS_LDFLAGS})
17−
1814# For it to find libUbuntuGestures.so, needed by Ubuntu.Gestures QML module.
1915set_target_properties(unity8-dash PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}")
2016
2117target_link_libraries(unity8-dash UbuntuGestures connectivity-qt1)
2218
19+if (ENABLE_TOUCH_EMULATION)
20+ target_link_libraries(unity8-dash ${MOUSETOUCHADAPTOR_LIBS_LDFLAGS})
21+endif()
22+
2323set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
2424
2525# install binaries
src/Dash/main.cpp+9−5
@@ -27,8 +27,9 @@
2727#include <libintl.h>
2828
2929#include <paths.h>
30−#include "../MouseTouchAdaptor.h"
31−#include "../ApplicationArguments.h"
30+#ifdef UNITY8_ENABLE_TOUCH_EMULATION
31+ #include "../MouseTouchAdaptor.h"
32+#endif
3233#include "../CachingNetworkManagerFactory.h"
3334
3435int main(int argc, const char *argv[])
@@ -57,8 +58,6 @@ int main(int argc, const char *argv[])
5758 parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
5859 parser.process(*application);
5960
60− ApplicationArguments qmlArgs;
61−
6261 if (getenv("QT_LOAD_TESTABILITY")) {
6362 QLibrary testLib(QStringLiteral("qttestability"));
6463 if (testLib.load()) {
@@ -92,14 +91,15 @@ int main(int argc, const char *argv[])
9291 }
9392
9493 view->setTitle(QStringLiteral("Scopes"));
95− view->rootContext()->setContextProperty(QStringLiteral("applicationArguments"), &qmlArgs);
9694
95+ #ifdef UNITY8_ENABLE_TOUCH_EMULATION
9796 // You will need this if you want to interact with touch-only components using a mouse
9897 // Needed only when manually testing on a desktop.
9998 MouseTouchAdaptor *mouseTouchAdaptor = 0;
10099 if (parser.isSet(mousetouchOption)) {
101100 mouseTouchAdaptor = MouseTouchAdaptor::instance();
102101 }
102+ #endif
103103
104104 QUrl source(::qmlDirectory() + "/Dash/DashApplication.qml");
105105 prependImportPaths(view->engine(), ::overrideImportPaths());
@@ -114,7 +114,11 @@ int main(int argc, const char *argv[])
114114 int result = application->exec();
115115
116116 delete view;
117+
118+ #ifdef UNITY8_ENABLE_TOUCH_EMULATION
117119 delete mouseTouchAdaptor;
120+ #endif
121+
118122 delete application;
119123
120124 return result;
src/MouseTouchAdaptor.cpp+180−21
@@ -16,14 +16,56 @@
1616 * Authored by: Daniel d'Andrada <daniel.dandrada@canonical.com>
1717 */
1818
19+
20+/* Some parts of the code were copied from the XCB platform plugin of the Qt Toolkit,
21+ * which is under the following license:
22+ */
23+
24+/****************************************************************************
25+**
26+** Copyright (C) 2015 The Qt Company Ltd.
27+** Contact: http://www.qt.io/licensing/
28+**
29+** This file is part of the .
30+**
31+** $QT_BEGIN_LICENSE:LGPL21$
32+** Commercial License Usage
33+** Licensees holding valid commercial Qt licenses may use this file in
34+** accordance with the commercial license agreement provided with the
35+** Software or, alternatively, in accordance with the terms contained in
36+** a written agreement between you and The Qt Company. For licensing terms
37+** and conditions see http://www.qt.io/terms-conditions. For further
38+** information use the contact form at http://www.qt.io/contact-us.
39+**
40+** GNU Lesser General Public License Usage
41+** Alternatively, this file may be used under the terms of the GNU Lesser
42+** General Public License version 2.1 or version 3 as published by the Free
43+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
44+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
45+** following information to ensure the GNU Lesser General Public License
46+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
47+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
48+**
49+** As a special exception, The Qt Company gives you certain additional
50+** rights. These rights are described in The Qt Company LGPL Exception
51+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
52+**
53+** $QT_END_LICENSE$
54+**
55+****************************************************************************/
56+
1957#include "MouseTouchAdaptor.h"
2058
59+#include <qpa/qplatformnativeinterface.h>
2160#include <qpa/qwindowsysteminterface.h>
2261
2362#include <QCoreApplication>
2463#include <QMouseEvent>
2564#include <QTest>
2665
66+#include <X11/extensions/XInput2.h>
67+#include <X11/extensions/XI2proto.h>
68+
2769using QTest::QTouchEventSequence;
2870
2971namespace {
@@ -49,6 +91,8 @@ MouseTouchAdaptor::MouseTouchAdaptor()
4991 m_touchDevice = new QTouchDevice;
5092 m_touchDevice->setType(QTouchDevice::TouchScreen);
5193 QWindowSystemInterface::registerTouchDevice(m_touchDevice);
94+
95+ fetchXInput2Info();
5296}
5397
5498MouseTouchAdaptor::~MouseTouchAdaptor()
@@ -65,9 +109,114 @@ MouseTouchAdaptor* MouseTouchAdaptor::instance()
65109 return g_instance;
66110}
67111
112+void MouseTouchAdaptor::fetchXInput2Info()
113+{
114+ QPlatformNativeInterface *nativeInterface = qGuiApp->platformNativeInterface();
115+ Display *xDisplay = static_cast<Display*>(nativeInterface->nativeResourceForIntegration("Display"));
116+ if (xDisplay && XQueryExtension(xDisplay, "XInputExtension", &m_xiOpCode, &m_xiEventBase, &m_xiErrorBase)) {
117+ int xiMajor = 2;
118+ m_xi2Minor = 2; // try 2.2 first, needed for TouchBegin/Update/End
119+ if (XIQueryVersion(xDisplay, &xiMajor, &m_xi2Minor) == BadRequest) {
120+ m_xi2Minor = 1; // for smooth scrolling 2.1 is enough
121+ if (XIQueryVersion(xDisplay, &xiMajor, &m_xi2Minor) == BadRequest) {
122+ m_xi2Minor = 0; // for tablet support 2.0 is enough
123+ m_xi2Enabled = XIQueryVersion(xDisplay, &xiMajor, &m_xi2Minor) != BadRequest;
124+ } else
125+ m_xi2Enabled = true;
126+ } else {
127+ m_xi2Enabled = true;
128+ }
129+ }
130+}
131+
132+// Starting from the xcb version 1.9.3 struct xcb_ge_event_t has changed:
133+// - "pad0" became "extension"
134+// - "pad1" and "pad" became "pad0"
135+// New and old version of this struct share the following fields:
136+// NOTE: API might change again in the next release of xcb in which case this comment will
137+// need to be updated to reflect the reality.
138+typedef struct qt_xcb_ge_event_t {
139+ uint8_t response_type;
140+ uint8_t extension;
141+ uint16_t sequence;
142+ uint32_t length;
143+ uint16_t event_type;
144+} qt_xcb_ge_event_t;
145+
146+bool xi2PrepareXIGenericDeviceEvent(xcb_ge_event_t *ev, int opCode)
147+{
148+ qt_xcb_ge_event_t *event = (qt_xcb_ge_event_t *)ev;
149+ // xGenericEvent has "extension" on the second byte, the same is true for xcb_ge_event_t starting from
150+ // the xcb version 1.9.3, prior to that it was called "pad0".
151+ if (event->extension == opCode) {
152+ // xcb event structs contain stuff that wasn't on the wire, the full_sequence field
153+ // adds an extra 4 bytes and generic events cookie data is on the wire right after the standard 32 bytes.
154+ // Move this data back to have the same layout in memory as it was on the wire
155+ // and allow casting, overwriting the full_sequence field.
156+ memmove((char*) event + 32, (char*) event + 36, event->length * 4);
157+ return true;
158+ }
159+ return false;
160+}
161+
162+static inline qreal fixed1616ToReal(FP1616 val)
163+{
164+ return qreal(val) / 0x10000;
165+}
166+
167+bool MouseTouchAdaptor::xi2HandleEvent(xcb_ge_event_t *event)
168+{
169+ if (!xi2PrepareXIGenericDeviceEvent(event, m_xiOpCode)) {
170+ return false;
171+ }
172+
173+ xXIGenericDeviceEvent *xiEvent = reinterpret_cast<xXIGenericDeviceEvent *>(event);
174+ xXIDeviceEvent *xiDeviceEvent = 0;
175+
176+ switch (xiEvent->evtype) {
177+ case XI_ButtonPress:
178+ case XI_ButtonRelease:
179+ case XI_Motion:
180+ xiDeviceEvent = reinterpret_cast<xXIDeviceEvent *>(event);
181+ break;
182+ default:
183+ break;
184+ }
185+
186+ if (!xiDeviceEvent) {
187+ return false;
188+ }
189+
190+ switch (xiDeviceEvent->evtype) {
191+ case XI_ButtonPress:
192+ return handleButtonPress(
193+ static_cast<WId>(xiDeviceEvent->event),
194+ xiDeviceEvent->detail,
195+ fixed1616ToReal(xiDeviceEvent->event_x),
196+ fixed1616ToReal(xiDeviceEvent->event_y));
197+ case XI_ButtonRelease:
198+ return handleButtonRelease(
199+ static_cast<WId>(xiDeviceEvent->event),
200+ xiDeviceEvent->detail,
201+ fixed1616ToReal(xiDeviceEvent->event_x),
202+ fixed1616ToReal(xiDeviceEvent->event_y));
203+ case XI_Motion:
204+ return handleMotionNotify(
205+ static_cast<WId>(xiDeviceEvent->event),
206+ fixed1616ToReal(xiDeviceEvent->event_x),
207+ fixed1616ToReal(xiDeviceEvent->event_y));
208+ return true;
209+ default:
210+ return false;
211+ }
212+}
213+
214+
68215bool MouseTouchAdaptor::nativeEventFilter(const QByteArray & eventType,
69216 void * message, long * /*result*/)
70217{
218+ static int eventCount = 0;
219+ eventCount++;
71220 if (!m_enabled) {
72221 return false;
73222 }
@@ -81,32 +230,42 @@ bool MouseTouchAdaptor::nativeEventFilter(const QByteArray & eventType,
81230 xcb_generic_event_t *xcbEvent = static_cast<xcb_generic_event_t *>(message);
82231
83232 switch (xcbEvent->response_type & ~0x80) {
84− case XCB_BUTTON_PRESS:
85− return handleButtonPress(reinterpret_cast<xcb_button_press_event_t *>(xcbEvent));
86− break;
87− case XCB_BUTTON_RELEASE:
88− return handleButtonRelease(reinterpret_cast<xcb_button_release_event_t *>(xcbEvent));
89− break;
90− case XCB_MOTION_NOTIFY:
91− return handleMotionNotify(reinterpret_cast<xcb_motion_notify_event_t *>(xcbEvent));
92− break;
233+ case XCB_BUTTON_PRESS: {
234+ auto pressEvent = reinterpret_cast<xcb_button_press_event_t *>(xcbEvent);
235+ return handleButtonPress(static_cast<WId>(pressEvent->event), pressEvent->detail,
236+ pressEvent->event_x, pressEvent->event_y);
237+ }
238+ case XCB_BUTTON_RELEASE: {
239+ auto releaseEvent = reinterpret_cast<xcb_button_release_event_t *>(xcbEvent);
240+ return handleButtonRelease(static_cast<WId>(releaseEvent->event), releaseEvent->detail,
241+ releaseEvent->event_x, releaseEvent->event_y);
242+ }
243+ case XCB_MOTION_NOTIFY: {
244+ auto motionEvent = reinterpret_cast<xcb_motion_notify_event_t *>(xcbEvent);
245+ return handleMotionNotify(static_cast<WId>(motionEvent->event), motionEvent->event_x, motionEvent->event_y);
246+ }
247+ case XCB_GE_GENERIC:
248+ if (m_xi2Enabled) {
249+ return xi2HandleEvent(reinterpret_cast<xcb_ge_event_t *>(xcbEvent));
250+ } else {
251+ return false;
252+ }
93253 default:
94254 return false;
95− break;
96255 };
97256}
98257
99−bool MouseTouchAdaptor::handleButtonPress(xcb_button_press_event_t *pressEvent)
258+bool MouseTouchAdaptor::handleButtonPress(WId windowId, uint32_t detail, int x, int y)
100259{
101− Qt::MouseButton button = translateMouseButton(pressEvent->detail);
260+ Qt::MouseButton button = translateMouseButton(detail);
102261
103262 // Just eat the event if it wasn't a left mouse press
104263 if (button != Qt::LeftButton)
105264 return true;
106265
107− QWindow *targetWindow = findQWindowWithXWindowID(static_cast<WId>(pressEvent->event));
266+ QWindow *targetWindow = findQWindowWithXWindowID(windowId);
108267
109− QPoint windowPos(pressEvent->event_x / targetWindow->devicePixelRatio(), pressEvent->event_y / targetWindow->devicePixelRatio());
268+ QPoint windowPos(x / targetWindow->devicePixelRatio(), y / targetWindow->devicePixelRatio());
110269
111270 QTouchEventSequence touchEvent = QTest::touchEvent(targetWindow, m_touchDevice,
112271 false /* autoCommit */);
@@ -117,17 +276,17 @@ bool MouseTouchAdaptor::handleButtonPress(xcb_button_press_event_t *pressEvent)
117276 return true;
118277}
119278
120−bool MouseTouchAdaptor::handleButtonRelease(xcb_button_release_event_t *releaseEvent)
279+bool MouseTouchAdaptor::handleButtonRelease(WId windowId, uint32_t detail, int x, int y)
121280{
122− Qt::MouseButton button = translateMouseButton(releaseEvent->detail);
281+ Qt::MouseButton button = translateMouseButton(detail);
123282
124283 // Just eat the event if it wasn't a left mouse release
125284 if (button != Qt::LeftButton)
126285 return true;
127286
128− QWindow *targetWindow = findQWindowWithXWindowID(static_cast<WId>(releaseEvent->event));
287+ QWindow *targetWindow = findQWindowWithXWindowID(windowId);
129288
130− QPoint windowPos(releaseEvent->event_x / targetWindow->devicePixelRatio(), releaseEvent->event_y / targetWindow->devicePixelRatio());
289+ QPoint windowPos(x / targetWindow->devicePixelRatio(), y / targetWindow->devicePixelRatio());
131290
132291 QTouchEventSequence touchEvent = QTest::touchEvent(targetWindow, m_touchDevice,
133292 false /* autoCommit */);
@@ -138,15 +297,15 @@ bool MouseTouchAdaptor::handleButtonRelease(xcb_button_release_event_t *releaseE
138297 return true;
139298}
140299
141−bool MouseTouchAdaptor::handleMotionNotify(xcb_motion_notify_event_t *event)
300+bool MouseTouchAdaptor::handleMotionNotify(WId windowId, int x, int y)
142301{
143302 if (!m_leftButtonIsPressed) {
144303 return true;
145304 }
146305
147− QWindow *targetWindow = findQWindowWithXWindowID(static_cast<WId>(event->event));
306+ QWindow *targetWindow = findQWindowWithXWindowID(windowId);
148307
149− QPoint windowPos(event->event_x / targetWindow->devicePixelRatio(), event->event_y / targetWindow->devicePixelRatio());
308+ QPoint windowPos(x / targetWindow->devicePixelRatio(), y / targetWindow->devicePixelRatio());
150309
151310 QTouchEventSequence touchEvent = QTest::touchEvent(targetWindow, m_touchDevice,
152311 false /* autoCommit */);
src/MouseTouchAdaptor.h+10−3
@@ -21,6 +21,7 @@
2121
2222#include <QtCore/QAbstractNativeEventFilter>
2323#include <QWindow>
24+
2425#include <xcb/xcb.h>
2526
2627class QMouseEvent;
@@ -47,16 +48,22 @@ Q_SIGNALS:
4748
4849private:
4950 MouseTouchAdaptor();
51+ void fetchXInput2Info();
52+ bool xi2HandleEvent(xcb_ge_event_t *event);
5053
51− bool handleButtonPress(xcb_button_press_event_t *pressEvent);
52− bool handleButtonRelease(xcb_button_release_event_t *releaseEvent);
53− bool handleMotionNotify(xcb_motion_notify_event_t *event);
54+ bool handleButtonPress(WId windowId, uint32_t detail, int x, int y);
55+ bool handleButtonRelease(WId windowId, uint32_t detail, int x, int y);
56+ bool handleMotionNotify(WId windowId, int x, int y);
5457 QWindow *findQWindowWithXWindowID(WId windowId);
5558
5659 QTouchDevice *m_touchDevice;
5760 bool m_leftButtonIsPressed;
5861
5962 bool m_enabled;
63+
64+ bool m_xi2Enabled{false};
65+ int m_xi2Minor{-1};
66+ int m_xiOpCode, m_xiEventBase, m_xiErrorBase;
6067};
6168
6269#endif // MOUSE_TOUCH_ADAPTOR_H
src/ShellApplication.cpp+5−5
@@ -28,15 +28,10 @@
2828// local
2929#include <paths.h>
3030#include "CachingNetworkManagerFactory.h"
31−#include "MouseTouchAdaptor.h"
3231#include "UnityCommandLineParser.h"
3332
3433ShellApplication::ShellApplication(int & argc, char ** argv, bool isMirServer)
3534 : QGuiApplication(argc, argv)
36− , m_shellView(nullptr)
37− , m_secondaryWindow(nullptr)
38− , m_mouseTouchAdaptor(nullptr)
39− , m_qmlEngine(nullptr)
4035{
4136
4237 setApplicationName(QStringLiteral("unity8"));
@@ -89,11 +84,14 @@ ShellApplication::ShellApplication(int & argc, char ** argv, bool isMirServer)
8984 m_shellView->setFlags(Qt::FramelessWindowHint);
9085 }
9186
87+
88+ #ifdef UNITY8_ENABLE_TOUCH_EMULATION
9289 // You will need this if you want to interact with touch-only components using a mouse
9390 // Needed only when manually testing on a desktop.
9491 if (parser.hasMouseToTouch()) {
9592 m_mouseTouchAdaptor = MouseTouchAdaptor::instance();
9693 }
94+ #endif
9795
9896
9997 // Some hard-coded policy for now.
@@ -134,8 +132,10 @@ void ShellApplication::destroyResources()
134132 delete m_secondaryWindow;
135133 m_secondaryWindow = nullptr;
136134
135+ #ifdef UNITY8_ENABLE_TOUCH_EMULATION
137136 delete m_mouseTouchAdaptor;
138137 m_mouseTouchAdaptor = nullptr;
138+ #endif
139139
140140 delete m_qmlEngine;
141141 m_qmlEngine = nullptr;
src/ShellApplication.h+12−4
@@ -23,7 +23,11 @@
2323#include <QScopedPointer>
2424
2525#include "ApplicationArguments.h"
26+
27+#ifdef UNITY8_ENABLE_TOUCH_EMULATION
2628#include "MouseTouchAdaptor.h"
29+#endif
30+
2731#include "SecondaryWindow.h"
2832#include "ShellView.h"
2933
@@ -46,10 +50,14 @@ private:
4650 void setupQmlEngine(bool isMirServer);
4751 QString m_deviceName;
4852 ApplicationArguments m_qmlArgs;
49− ShellView *m_shellView;
50− SecondaryWindow *m_secondaryWindow;
51− MouseTouchAdaptor *m_mouseTouchAdaptor;
52− QQmlEngine *m_qmlEngine;
53+ ShellView *m_shellView{nullptr};
54+ SecondaryWindow *m_secondaryWindow{nullptr};
55+
56+ #ifdef UNITY8_ENABLE_TOUCH_EMULATION
57+ MouseTouchAdaptor *m_mouseTouchAdaptor{nullptr};
58+ #endif
59+
60+ QQmlEngine *m_qmlEngine{nullptr};
5361};
5462
5563#endif // SHELLAPPLICATION_H
src/UnityCommandLineParser.cpp+6
@@ -37,9 +37,11 @@ UnityCommandLineParser::UnityCommandLineParser(const QCoreApplication &app)
3737 QStringLiteral("Run without window borders"));
3838 parser.addOption(framelessOption);
3939
40+ #ifdef UNITY8_ENABLE_TOUCH_EMULATION
4041 QCommandLineOption mousetouchOption(QStringLiteral("mousetouch"),
4142 QStringLiteral("Allow the mouse to provide touch input"));
4243 parser.addOption(mousetouchOption);
44+ #endif
4345
4446 QCommandLineOption windowGeometryOption(QStringList() << QStringLiteral("windowgeometry"),
4547 QStringLiteral("Specify the window geometry as [<width>x<height>]"), QStringLiteral("windowgeometry"), QStringLiteral("1"));
@@ -75,7 +77,11 @@ UnityCommandLineParser::UnityCommandLineParser(const QCoreApplication &app)
7577
7678 m_hasTestability = parser.isSet(testabilityOption);
7779 m_hasFrameless = parser.isSet(framelessOption);
80+
81+ #ifdef UNITY8_ENABLE_TOUCH_EMULATION
7882 m_hasMouseToTouch = parser.isSet(mousetouchOption);
83+ #endif
84+
7985 m_hasFullscreen = parser.isSet(fullscreenOption);
8086 m_deviceName = parser.value(devicenameOption);
8187 resolveMode(parser, modeOption);
src/UnityCommandLineParser.h+8
@@ -28,7 +28,11 @@ public:
2828 QSize windowGeometry() const { return m_windowGeometry; }
2929 bool hasTestability() const { return m_hasTestability; }
3030 bool hasFrameless() const { return m_hasFrameless; }
31+
32+ #ifdef UNITY8_ENABLE_TOUCH_EMULATION
3133 bool hasMouseToTouch() const { return m_hasMouseToTouch; }
34+ #endif
35+
3236 bool hasFullscreen() const { return m_hasFullscreen; }
3337 QString deviceName() const { return m_deviceName; }
3438 QString mode() const { return m_mode; }
@@ -43,7 +47,11 @@ private:
4347 QSize m_windowGeometry;
4448 bool m_hasTestability;
4549 bool m_hasFrameless;
50+
51+ #ifdef UNITY8_ENABLE_TOUCH_EMULATION
4652 bool m_hasMouseToTouch;
53+ #endif
54+
4755 bool m_hasFullscreen;
4856 QString m_deviceName;
4957 QString m_mode;
tests/autopilot/unity8/dash.py+1−1
@@ -158,7 +158,7 @@ class Dash(ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase):
158158 def enter_search_query(self, query, keyboard):
159159 current_header = self._get_current_page_header()
160160 search_button = \
161− current_header.select_single(objectName="search_action_button")
161+ current_header.select_single(objectName="search_button")
162162 self.pointing_device.move(
163163 search_button.globalRect.x + search_button.width / 2,
164164 search_button.globalRect.y + search_button.height / 2)
tests/mocks/QtMultimedia/CMakeLists.txt+1
@@ -1,6 +1,7 @@
11add_library(QtMultimedia-qml MODULE
22 plugin.cpp
33 audio.cpp
4+ declarativeplaylist.cpp
45 )
56
67qt5_use_modules(QtMultimedia-qml Qml)
tests/mocks/QtMultimedia/audio.cpp+21−19
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2015 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
@@ -20,30 +20,18 @@
2020
2121Audio::Audio(QObject* parent):
2222 QObject(parent),
23− m_playbackState(StoppedState)
23+ m_playbackState(StoppedState),
24+ m_playlist(0)
2425{
2526 qsrand(time(nullptr));
2627 m_timer.setInterval(1000);
2728 connect(&m_timer, &QTimer::timeout, this, &Audio::timerEvent);
28−}
29−
30−QUrl Audio::source() const
31−{
32− return m_source;
33−}
3429
35−void Audio::setSource(const QUrl &source)
36−{
37− if (m_source != source) {
38− m_source = source;
39− Q_EMIT sourceChanged(source);
40−
41− m_position = 0;
42− Q_EMIT positionChanged(m_position);
30+ m_position = 0;
31+ Q_EMIT positionChanged(m_position);
4332
44− m_duration = (qrand() % 20000) + 10000;
45− Q_EMIT durationChanged(m_duration);
46− }
33+ m_duration = (qrand() % 20000) + 10000;
34+ Q_EMIT durationChanged(m_duration);
4735}
4836
4937Audio::PlaybackState Audio::playbackState() const
@@ -115,3 +103,17 @@ void Audio::setAudioRole(Audio::AudioRole audioRole)
115103{
116104 Q_UNUSED(audioRole);
117105}
106+
107+DeclarativePlaylist *Audio::playlist() const
108+{
109+ return m_playlist;
110+}
111+
112+void Audio::setPlaylist(DeclarativePlaylist *playlist)
113+{
114+ if (playlist == m_playlist)
115+ return;
116+
117+ m_playlist = playlist;
118+ Q_EMIT playlistChanged();
119+}
tests/mocks/QtMultimedia/audio.h+8−6
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2012,2013 Canonical, Ltd.
2+ * Copyright (C) 2012, 2013, 2015 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
@@ -13,7 +13,6 @@
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 *
16− * Authors: Michael Zanetti <michael.zanetti@canonical.com>
1716 */
1817
1918#ifndef MOCK_AUDIO_H
@@ -23,17 +22,19 @@
2322#include <QUrl>
2423#include <QTimer>
2524
25+class DeclarativePlaylist;
26+
2627class Audio: public QObject
2728{
2829 Q_OBJECT
2930 Q_ENUMS(PlaybackState)
3031 Q_ENUMS(AudioRole)
31− Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
3232 Q_PROPERTY(PlaybackState playbackState READ playbackState NOTIFY playbackStateChanged)
3333 Q_PROPERTY(int position READ position NOTIFY positionChanged)
3434 Q_PROPERTY(int duration READ duration NOTIFY durationChanged)
3535 Q_PROPERTY(QString errorString READ errorString NOTIFY errorStringChanged)
3636 Q_PROPERTY(AudioRole audioRole READ audioRole WRITE setAudioRole)
37+ Q_PROPERTY(DeclarativePlaylist *playlist READ playlist WRITE setPlaylist NOTIFY playlistChanged)
3738public:
3839 enum PlaybackState {
3940 PlayingState,
@@ -50,8 +51,8 @@ public:
5051
5152 explicit Audio(QObject *parent = 0);
5253
53− QUrl source() const;
54− void setSource(const QUrl &source);
54+ DeclarativePlaylist *playlist() const;
55+ void setPlaylist(DeclarativePlaylist *playlist);
5556
5657 PlaybackState playbackState() const;
5758
@@ -70,6 +71,7 @@ public Q_SLOTS:
7071 void stop();
7172
7273Q_SIGNALS:
74+ void playlistChanged();
7375 void sourceChanged(const QUrl &source);
7476 void playbackStateChanged(PlaybackState playbackState);
7577 void positionChanged(int position);
@@ -80,11 +82,11 @@ private Q_SLOTS:
8082 void timerEvent();
8183
8284private:
83− QUrl m_source;
8485 PlaybackState m_playbackState;
8586 QTimer m_timer;
8687 int m_position;
8788 int m_duration;
89+ DeclarativePlaylist *m_playlist;
8890};
8991
9092#endif
tests/mocks/QtMultimedia/declarativeplaylist.cppnew file+73
@@ -0,0 +1,73 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#include "declarativeplaylist.h"
19+
20+DeclarativePlaylist::DeclarativePlaylist(QObject *parent)
21+ : QObject(parent)
22+ , m_currentIndex(-1)
23+{
24+}
25+
26+QUrl DeclarativePlaylist::currentItemSource() const
27+{
28+ return itemSource(currentIndex());
29+}
30+
31+int DeclarativePlaylist::currentIndex() const
32+{
33+ return m_currentIndex;
34+}
35+
36+void DeclarativePlaylist::setCurrentIndex(int index)
37+{
38+ if (currentIndex() == index)
39+ return;
40+
41+ m_currentIndex = index;
42+ Q_EMIT currentIndexChanged();
43+ Q_EMIT currentItemSourceChanged();
44+}
45+
46+QUrl DeclarativePlaylist::itemSource(int index) const
47+{
48+ if (index < 0 || index >= m_medias.count())
49+ return QUrl();
50+ return m_medias[index];
51+}
52+
53+bool DeclarativePlaylist::addItem(const QUrl &source)
54+{
55+ m_medias << source;
56+ setCurrentIndex(0);
57+ return true;
58+}
59+
60+bool DeclarativePlaylist::addItems(const QList<QUrl> &sources)
61+{
62+ m_medias << sources;
63+ if (!sources.isEmpty())
64+ setCurrentIndex(0);
65+ return true;
66+}
67+
68+bool DeclarativePlaylist::clear()
69+{
70+ m_medias.clear();
71+ setCurrentIndex(-1);
72+ return true;
73+}
tests/mocks/QtMultimedia/declarativeplaylist.hnew file+54
@@ -0,0 +1,54 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#ifndef DECLARATIVEPLAYLIST_H
19+#define DECLARATIVEPLAYLIST_H
20+
21+#include <QObject>
22+#include <QUrl>
23+
24+class DeclarativePlaylist : public QObject
25+{
26+ Q_OBJECT
27+ Q_PROPERTY(QUrl currentItemSource READ currentItemSource NOTIFY currentItemSourceChanged)
28+ Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
29+
30+public:
31+ DeclarativePlaylist(QObject *parent = 0);
32+
33+ QUrl currentItemSource() const;
34+ int currentIndex() const;
35+ void setCurrentIndex(int currentIndex);
36+
37+public Q_SLOTS:
38+ QUrl itemSource(int index) const;
39+ bool addItem(const QUrl &source);
40+ bool addItems(const QList<QUrl> &sources);
41+ bool clear();
42+
43+Q_SIGNALS:
44+ void currentItemSourceChanged();
45+ void currentIndexChanged();
46+
47+private:
48+ Q_DISABLE_COPY(DeclarativePlaylist)
49+
50+ int m_currentIndex;
51+ QList<QUrl> m_medias;
52+};
53+
54+#endif
tests/mocks/QtMultimedia/plugin.cpp+2
@@ -18,6 +18,7 @@
1818
1919#include "plugin.h"
2020#include "audio.h"
21+#include "declarativeplaylist.h"
2122
2223#include <QtQml/qqml.h>
2324
@@ -26,4 +27,5 @@ void MockQtMultimediaPlugin::registerTypes(const char *uri)
2627 Q_ASSERT(uri == QLatin1String("QtMultimedia"));
2728 qmlRegisterType<Audio>(uri, 5, 0, "Audio");
2829 qmlRegisterType<Audio>(uri, 5, 0, "MediaPlayer");
30+ qmlRegisterType<DeclarativePlaylist>(uri, 5, 6, "Playlist");
2931}
tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/CMakeLists.txt+1−1
@@ -7,4 +7,4 @@ add_library(MockSecurityPrivacy MODULE ${MOCK_SECURITYPRIVACY_SOURCES})
77
88qt5_use_modules(MockSecurityPrivacy Qml Quick Core)
99
10−add_unity8_mock(Ubuntu.SystemSettings.SecurityPrivacy 1.0 Ubuntu/SystemSettings/SecurityPrivacy TARGETS MockSecurityPrivacy)
10+add_unity8_mock(Ubuntu.SystemSettings.SecurityPrivacy 1.0 Ubuntu/SystemSettings/SecurityPrivacy PREFIX mocks TARGETS MockSecurityPrivacy)
tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/MockSecurityPrivacy.cpp+8−1
@@ -17,12 +17,19 @@
1717#include "MockSecurityPrivacy.h"
1818
1919MockSecurityPrivacy::MockSecurityPrivacy(QObject *parent)
20− : QObject(parent)
20+ : QObject(parent),
21+ m_type(SecurityType::Swipe)
2122{
2223}
2324
25+MockSecurityPrivacy::SecurityType MockSecurityPrivacy::getSecurityType()
26+{
27+ return m_type;
28+}
29+
2430QString MockSecurityPrivacy::setSecurity(const QString &oldPasswd, const QString &newPasswd, SecurityType newType)
2531{
32+ m_type = newType;
2633 Q_EMIT setSecurityCalled(oldPasswd, newPasswd, newType);
2734 return "";
2835}
tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/MockSecurityPrivacy.h+8
@@ -23,6 +23,9 @@ class MockSecurityPrivacy : public QObject
2323{
2424 Q_OBJECT
2525 Q_ENUMS(SecurityType)
26+ Q_PROPERTY (SecurityType securityType
27+ READ getSecurityType
28+ NOTIFY securityTypeChanged)
2629
2730public:
2831 enum SecurityType {
@@ -33,10 +36,15 @@ public:
3336
3437 MockSecurityPrivacy(QObject *parent = 0);
3538
39+ SecurityType getSecurityType();
3640 Q_INVOKABLE QString setSecurity(const QString &oldPasswd, const QString &newPasswd, SecurityType newType);
3741
3842Q_SIGNALS:
43+ void securityTypeChanged();
3944 void setSecurityCalled(const QString &oldPasswd, const QString &newPasswd, SecurityType newType); // only in mock
45+
46+private:
47+ SecurityType m_type;
4048};
4149
4250#endif // MOCK_SECURITYPRIVACY_H
tests/mocks/Unity/CMakeLists.txt+1−1
@@ -7,7 +7,7 @@ add_subdirectory(Notifications)
77add_subdirectory(DashCommunicator)
88
99pkg_search_module(GOBJECT gobject-2.0 REQUIRED)
10−pkg_check_modules(SCOPES_API REQUIRED unity-shell-scopes=8)
10+pkg_check_modules(SCOPES_API REQUIRED unity-shell-scopes=9)
1111
1212include_directories(
1313 ${CMAKE_CURRENT_BINARY_DIR}
tests/plugins/Dash/cardcreator/9.resnew file+113
@@ -0,0 +1,113 @@
1+AbstractButton {
2+ id: root;
3+ property var components;
4+ property var cardData;
5+ property string artShapeStyle: "inset";
6+ property string backgroundShapeStyle: "inset";
7+ property real fontScale: 1.0;
8+ property var scopeStyle: null;
9+ property int titleAlignment: Text.AlignLeft;
10+ property int fixedHeaderHeight: -1;
11+ property size fixedArtShapeSize: Qt.size(-1, -1);
12+ readonly property string title: cardData && cardData["title"] || "";
13+ property bool asynchronous: true;
14+ property bool showHeader: true;
15+ implicitWidth: childrenRect.width;
16+ enabled: true;
17+
18+readonly property size artShapeSize: Qt.size(-1, -1);
19+readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin + audioProgressBar.height + audioProgressBar.anchors.topMargin;
20+Label {
21+ id: titleLabel;
22+ objectName: "titleLabel";
23+ anchors { right: parent.right;
24+rightMargin: units.gu(1);
25+left: audioButton.right;
26+ leftMargin: units.gu(1);
27+top: parent.top;
28+ topMargin: units.gu(1);
29+ }
30+ elide: Text.ElideRight;
31+ fontSize: "small";
32+ wrapMode: Text.Wrap;
33+ maximumLineCount: 2;
34+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
35+ color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText;
36+ visible: showHeader ;
37+ width: undefined;
38+ text: root.title;
39+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
40+ horizontalAlignment: root.titleAlignment;
41+ }
42+Label {
43+ id: subtitleLabel;
44+ objectName: "subtitleLabel";
45+ anchors { left: titleLabel.left;
46+ leftMargin: titleLabel.leftMargin;
47+rightMargin: units.gu(1);
48+right: titleLabel.right;
49+top: titleLabel.bottom;
50+ }
51+ anchors.topMargin: units.dp(2);
52+ elide: Text.ElideRight;
53+ maximumLineCount: 1;
54+ fontSize: "x-small";
55+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
56+ color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText;
57+ visible: titleLabel.visible && titleLabel.text;
58+ text: cardData && cardData["subtitle"] || "";
59+ font.weight: Font.Light;
60+ }
61+CardAudioProgress {
62+ id: audioProgressBar;
63+ duration: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["duration"]) || 0;
64+ source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || "";
65+ anchors {
66+ bottom: audioButton.bottom;
67+ left: audioButton.right;
68+ right: parent.right;
69+ margins: units.gu(1);
70+ }
71+ color: root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText;
72+ }AbstractButton {
73+ id: audioButton;
74+ anchors.fill: undefined;
75+ width: height;
76+ height: (root.fixedHeaderHeight > 0 ? root.fixedHeaderHeight : headerHeight) + 2 * units.gu(1);
77+ readonly property url source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || "";
78+ UbuntuShape {
79+ anchors.fill: parent;
80+ visible: parent.pressed;
81+ radius: "medium";
82+ }
83+ Icon {
84+ anchors.fill: parent;
85+ anchors.margins: parent.height > units.gu(5) ? units.gu(2) : 0;
86+ opacity: 0.9;
87+ name: DashAudioPlayer.playing && AudioUrlComparer.compare(parent.source, DashAudioPlayer.currentSource) ? "media-playback-pause" : "media-playback-start";
88+ }
89+ onClicked: {
90+ if (AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)) {
91+ if (DashAudioPlayer.playing) {
92+ DashAudioPlayer.pause();
93+ } else {
94+ DashAudioPlayer.play();
95+ }
96+ } else {
97+ var playlist = (cardData["quickPreviewData"] && cardData["quickPreviewData"]["playlist"]) || null;
98+ DashAudioPlayer.playSource(source, playlist);
99+ }
100+ }
101+ onPressAndHold: {
102+ root.pressAndHold();
103+ }
104+ }UbuntuShape {
105+ id: touchdown;
106+ objectName: "touchdown";
107+ anchors { fill: root }
108+ visible: root.artShapeStyle != "shadow" && root.artShapeStyle != "icon" && root.pressed;
109+ radius: "medium";
110+ borderSource: "radius_pressed.sci"
111+ }
112+implicitHeight: audioButton.height;
113+}
tests/plugins/Dash/cardcreator/9.tstnew file+3
@@ -0,0 +1,3 @@
1+template: {"card-layout":"horizontal","card-size":"medium","category-layout":"grid","collapsed-rows":2,"quick-preview-type": "audio"}
2+components: {"art":{"aspect-ratio":1},"subtitle":{"field":"author"},"title":{"field":"title"}, "quickPreviewData": "quickPreviewData"}
3+result: 9.res
tests/qmltests/CMakeLists.txt+2−1
@@ -38,6 +38,7 @@ add_unity8_qmltest(Dash/Previews PreviewExpandable)
3838add_unity8_qmltest(Dash/Previews PreviewHeader)
3939add_unity8_qmltest(Dash/Previews PreviewIconActions)
4040add_unity8_qmltest(Dash/Previews PreviewImageGallery)
41+add_unity8_qmltest(Dash/Previews PreviewMediaToolbar)
4142add_unity8_qmltest(Dash/Previews PreviewPayments)
4243add_unity8_qmltest(Dash/Previews PreviewProgress)
4344add_unity8_qmltest(Dash/Previews PreviewRatingDisplay)
@@ -87,4 +88,4 @@ add_unity8_qmltest(Stages WindowResizeArea)
8788add_unity8_qmltest(Stages Splash)
8889add_unity8_qmltest(Tutorial Tutorial LIGHTDM)
8990add_unity8_qmltest(Wizard Wizard ENVIRONMENT "OXIDE_NO_SANDBOX=1")
90−add_unity8_qmlunittest(utils/Unity/Test UnityTest)
91+add_unity8_qmltest(utils/Unity/Test UnityTest)
tests/qmltests/Dash/CardHelpers.js+1−1
@@ -16,7 +16,7 @@
1616
1717.pragma library
1818
19−var components = ["title", "art", "subtitle", "mascot", "emblem", "summary", "attributes", "overlayColor"]
19+var components = ["title", "art", "subtitle", "mascot", "emblem", "summary", "attributes", "overlayColor", "quickPreviewData"]
2020
2121var defaultLayout = ' \
2222{ \
tests/qmltests/Dash/Previews/tst_PreviewAudioPlayback.qml+5−9
@@ -18,6 +18,7 @@ import QtQuick 2.4
1818import QtTest 1.0
1919import Ubuntu.Components 1.3
2020import "../../../../qml/Dash/Previews"
21+import Dash 0.1
2122import Unity.Test 0.1 as UT
2223import QtMultimedia 5.0
2324
@@ -58,8 +59,8 @@ Rectangle {
5859 function test_time_formatter_data() {
5960 return [
6061 { tag: "NaN", value: "not a number", result: "" },
61− { tag: "0", value: 0, result: "" },
6262 { tag: "-1", value: -1, result: "" },
63+ { tag: "0", value: 0, result: "0:00" },
6364 { tag: "30", value: 30, result: "0:30" },
6465 { tag: "60", value: 60, result: "1:00" },
6566 { tag: "3600", value: 3600, result: "1:00:00" }
@@ -67,8 +68,7 @@ Rectangle {
6768 }
6869
6970 function test_time_formatter(data) {
70− var audio = findInvisibleChild(previewAudioPlayback, "audio");
71− compare(audio.lengthToString(data.value), data.result)
71+ compare(DashAudioPlayer.lengthToString(data.value), data.result)
7272 }
7373
7474 function test_tracks_data() {
@@ -102,7 +102,7 @@ Rectangle {
102102
103103 function checkPlayerSource(index) {
104104 var modelFilename = previewAudioPlayback.widgetData["tracks"][index]["source"].replace(/^.*[\\\/]/, '');
105− var playerFilename = findInvisibleChild(previewAudioPlayback, "audio").source.toString().replace(/^.*[\\\/]/, '');
105+ var playerFilename = DashAudioPlayer.currentSource.toString().replace(/^.*[\\\/]/, '');
106106
107107 compare(modelFilename, playerFilename, "Player source is not set correctly.");
108108 }
@@ -123,7 +123,7 @@ Rectangle {
123123 var track1PlayButton = findChild(track1Item, "playButton");
124124 var track2PlayButton = findChild(track2Item, "playButton");
125125
126− var audio = findInvisibleChild(previewAudioPlayback, "audio");
126+ var audio = DashAudioPlayer.audio;
127127
128128 // All progress bars must be hidden in the beginning
129129 compare(track0ProgressBar.visible, false);
@@ -170,10 +170,6 @@ Rectangle {
170170 tryCompare(track0ProgressBar, "visible", false);
171171 tryCompare(track1ProgressBar, "visible", false);
172172 tryCompare(track2ProgressBar, "visible", true);
173−
174− // Changing preview should make all players shut up!
175− previewAudioPlayback.isCurrentPreview = false
176− tryCompare(audio, "playbackState", Audio.StoppedState);
177173 }
178174 }
179175}
tests/qmltests/Dash/Previews/tst_PreviewMediaToolbar.qmlnew file+69
@@ -0,0 +1,69 @@
1+/*
2+ * Copyright 2014 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.4
18+import QtTest 1.0
19+import Ubuntu.Components 1.3
20+import "../../../../qml/Dash/Previews"
21+import Unity.Test 0.1 as UT
22+
23+Rectangle {
24+ id: root
25+ width: units.gu(40)
26+ height: units.gu(80)
27+ color: "black"
28+
29+ property var shareData: {
30+ "uri": [
31+ "Text here",
32+ "text here 2",
33+ "text here 3"
34+ ],
35+ "content-type": "text"
36+ }
37+
38+ property var shareDataNoUri: {
39+ "uri": "",
40+ "content-type": "text"
41+ }
42+
43+
44+ PreviewMediaToolbar {
45+ id: previewMediaToolbar
46+ anchors { left: parent.left; bottom: parent.bottom; }
47+ shareData: root.shareData
48+ }
49+
50+ UT.UnityTestCase {
51+ name: "PreviewMediaToolbarTest"
52+ when: windowShown
53+
54+ property Item sharingWidget: findChild(previewMediaToolbar, "sharingWidget")
55+
56+ function cleanup() {
57+ previewMediaToolbar.shareData = root.shareData;
58+ }
59+
60+ function test_visible() {
61+ previewMediaToolbar.shareData = shareDataNoUri;
62+ compare(previewMediaToolbar.visible, false);
63+ compare(sharingWidget.visible, false);
64+ previewMediaToolbar.shareData = shareData;
65+ compare(previewMediaToolbar.visible, true);
66+ compare(sharingWidget.visible, true);
67+ }
68+ }
69+}
tests/qmltests/Dash/Previews/tst_PreviewSharing.qml+1−13
@@ -32,12 +32,7 @@ Rectangle {
3232 "text here 2",
3333 "text here 3"
3434 ],
35− "contentType": "text"
36− }
37−
38− property var shareDataNoUri: {
39− "uri": "",
40− "contentType": "text"
35+ "content-type": "text"
4136 }
4237
4338 PreviewSharing {
@@ -54,13 +49,6 @@ Rectangle {
5449
5550 function cleanup() {
5651 peerPicker.visible = false;
57− previewSharing.shareData = root.shareData;
58− }
59−
60− function test_visible() {
61− compare(previewSharing.visible, true);
62− previewSharing.shareData = shareDataNoUri;
63− compare(previewSharing.visible, false);
6452 }
6553
6654 function test_open_picker() {
tests/qmltests/Dash/tst_Card.qml+8−1
@@ -35,7 +35,8 @@ Rectangle {
3535 "title": "foo",
3636 "subtitle": "bar",
3737 "summary": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
38− "attributes": [{"value":"text1","icon":"image://theme/ok"},{"value":"text2","icon":"image://theme/cancel"}]
38+ "attributes": [{"value":"text1","icon":"image://theme/ok"},{"value":"text2","icon":"image://theme/cancel"}],
39+ "quickPreviewData": {"uri": "/some/file", "duration": "14"}
3940 }'
4041
4142 property var cardsModel: [
@@ -106,6 +107,11 @@ Rectangle {
106107 "layout": { "template": { "card-layout": "horizontal" },
107108 "components": JSON.parse(Helpers.fullMapping) }
108109 },
110+ {
111+ "name": "Art, title, subtitle - Audio",
112+ "layout": { "template": { "card-layout": "horizontal", "quick-preview-type": "audio" },
113+ "components": { "art": "art", "title": "title", "subtitle": "subtitle", "quickPreviewData": "quickPreviewData" } }
114+ },
109115 ]
110116
111117 CardTool {
@@ -129,6 +135,7 @@ Rectangle {
129135 item.width = Qt.binding(function() { return cardTool.cardWidth || item.implicitWidth; });
130136 item.height = Qt.binding(function() { return cardTool.cardHeight || item.implicitHeight; });
131137 item.fixedHeaderHeight = Qt.binding(function() { return cardTool.headerHeight; });
138+ item.fixedArtShapeSize = Qt.binding(function() { return cardTool.artShapeSize; });
132139 }
133140 }
134141
tests/qmltests/Dash/tst_Dash.qml+1−1
@@ -319,7 +319,7 @@ Item {
319319
320320 // Click on the store
321321 var scopesListPageHeader = findChild(scopesList, "pageHeader");
322− var searchButton = findChild(scopesListPageHeader, "store_action_button");
322+ var searchButton = findChild(scopesListPageHeader, "store_button");
323323 mouseClick(searchButton);
324324
325325 spy.wait();
tests/qmltests/Dash/tst_DashContent.qml+1−1
@@ -604,7 +604,7 @@ Item {
604604 {
605605 var dashContentList = findChild(dashContent, "dashContentList");
606606 var header = findChild(dashContentList.currentItem, "scopePageHeader")
607− var favoriteAction = findChild(header, "favorite_action_button");
607+ var favoriteAction = findChild(header, "favorite_button");
608608 compare(dashContentList.currentIndex, 0);
609609 compare(dashContentList.indexAt(dashContentList.width * 1.5, 0), 1);
610610 var nextScopeId = dashContentList.itemAt(dashContentList.width * 1.5, 0).item.scope.id;
tests/qmltests/Dash/tst_GenericScopeView.qml+2−2
@@ -434,7 +434,7 @@ Item {
434434 // open
435435 tryCompare(testCase.subPageLoader, "open", false);
436436 tryCompare(testCase.subPageLoader, "visible", false);
437− var settings = findChild(innerHeader, "settings_action_button");
437+ var settings = findChild(innerHeader, "settings_button");
438438 mouseClick(settings);
439439 tryCompare(testCase.subPageLoader, "open", true);
440440 tryCompareFunction(function() { return (String(subPageLoader.source)).indexOf("ScopeSettingsPage.qml") != -1; }, true);
@@ -582,7 +582,7 @@ Item {
582582 verify(innerHeader, "Could not find the inner header");
583583
584584 expectFail("Apps", "Click scope should not have a favorite button");
585− var favoriteAction = findChild(innerHeader, "favorite_action_button");
585+ var favoriteAction = findChild(innerHeader, "favorite_button");
586586 verify(favoriteAction, "Could not find the favorite action.");
587587 mouseClick(favoriteAction);
588588
tests/qmltests/Greeter/tst_Greeter.qml+39−3
@@ -71,9 +71,9 @@ Item {
7171 }
7272
7373 SignalSpy {
74− id: emergencyCallSpy
74+ id: activeChangedSpy
7575 target: loader.item
76− signalName: "emergencyCall"
76+ signalName: "activeChanged"
7777 }
7878
7979 GSettings {
@@ -142,7 +142,7 @@ Item {
142142 resetLoader();
143143 teaseSpy.clear();
144144 sessionStartedSpy.clear();
145− emergencyCallSpy.clear();
145+ activeChangedSpy.clear();
146146 viewShowMessageSpy.clear();
147147 viewShowPromptSpy.clear();
148148 viewShowLastChanceSpy.clear();
@@ -458,6 +458,20 @@ Item {
458458 compare(view.delayMinutes, greeter.failedLoginsDelayMinutes);
459459 }
460460
461+ function test_forcedDelayOnConstructionIgnoredIfInFuture() {
462+ greeterSettings.lockedOutTime = new Date().getTime() + greeter.failedLoginsDelayMinutes * 60000 + 1;
463+ resetLoader();
464+ view = findChild(greeter, "testView");
465+ compare(view.delayMinutes, 0);
466+ }
467+
468+ function test_forcedDelayOnConstructionIgnoredIfInPast() {
469+ greeterSettings.lockedOutTime = new Date().getTime() - greeter.failedLoginsDelayMinutes * 60000 - 1;
470+ resetLoader();
471+ view = findChild(greeter, "testView");
472+ compare(view.delayMinutes, 0);
473+ }
474+
461475 function test_forcedDelayRoundTrip() {
462476 greeter.failedLoginsDelayAttempts = 1;
463477 greeter.failedLoginsDelayMinutes = 0.001; // make delay very short
@@ -471,6 +485,28 @@ Item {
471485 tryCompare(view, "delayMinutes", 0);
472486 }
473487
488+ function test_activeIsConstantDuringLockedApp() {
489+ // Regression test for bug 1525981: if we flicker active state even
490+ // briefly, the mpt-server will allow access to the device's drive.
491+
492+ selectUser("has-password");
493+ verify(greeter.active);
494+
495+ // Test opening a locked app
496+ greeter.lockedApp = "test-app";
497+ greeter.notifyAppFocused("test-app");
498+ verify(greeter.hasLockedApp);
499+ verify(!greeter.shown);
500+
501+ // Test going back to greeter from that locked app
502+ LightDM.Greeter.showGreeter();
503+ verify(!greeter.hasLockedApp);
504+ verify(greeter.shown);
505+
506+ // Active state should never have changed
507+ compare(activeChangedSpy.count, 0);
508+ }
509+
474510 function test_dbusRequestAuthenticationUser() {
475511 selectUser("no-password");
476512 LightDM.Greeter.requestAuthenticationUser("has-password");
tests/qmltests/Launcher/tst_Launcher.qml+18−1
@@ -28,7 +28,7 @@ import Utils 0.1 // For EdgeBarrierSettings
2828 launcher. */
2929Item {
3030 id: root
31− width: units.gu(70)
31+ width: units.gu(140)
3232 height: units.gu(70)
3333
3434 Loader {
@@ -685,6 +685,7 @@ Item {
685685 if(data.mouse) {
686686 mouseClick(root)
687687 } else {
688+ touchRelease(draggedItem)
688689 tap(root)
689690 }
690691
@@ -799,6 +800,22 @@ Item {
799800 mouseRelease(draggedItem);
800801 }
801802
803+ function test_launcher_dismiss() {
804+ dragLauncherIntoView();
805+ verify(launcher.state == "visible");
806+
807+ mouseClick(root, root.width / 2, units.gu(1));
808+ waitUntilLauncherDisappears();
809+ verify(launcher.state == "");
810+
811+ // and repeat, as a test for regression in lpbug#1531339
812+ dragLauncherIntoView();
813+ verify(launcher.state == "visible");
814+ mouseClick(root, root.width / 2, units.gu(1));
815+ waitUntilLauncherDisappears();
816+ verify(launcher.state == "");
817+ }
818+
802819 function test_quicklist_positioning_data() {
803820 return [
804821 {tag: "top", flickTo: "top", itemIndex: 0},
tests/qmltests/Panel/tst_IndicatorsMenu.qml+3−3
@@ -243,12 +243,12 @@ IndicatorTest {
243243
244244 // next time position will have moved.
245245 var nextItem = get_indicator_item(1);
246− var nextItemMappedPosition = root.mapFromItem(nextItem, nextItem.width/2, nextItem.height/2);
246+ var nextItemMappedPositionX = firstItemMappedPosition.x + firstItem.width;
247247
248248 // 1) Flick mouse down to bottom
249249 touchFlick(indicatorsMenu,
250250 firstItemMappedPosition.x, indicatorsMenu.minimizedPanelHeight * 2,
251− nextItemMappedPosition.x, indicatorsMenu.openedHeight / 3,
251+ nextItemMappedPositionX, indicatorsMenu.openedHeight / 3,
252252 false /* beginTouch */, false /* endTouch */,
253253 units.gu(50) /* speed */, 5 /* iterations */); // more samples needed for accurate velocity
254254
@@ -256,7 +256,7 @@ IndicatorTest {
256256 // after waiting in the same spot with touch down, it should update to the next item.
257257 tryCompare(indicatorItemRow, "currentItem", nextItem);
258258
259− touchRelease(indicatorsMenu, nextItemMappedPosition.x, indicatorsMenu.openedHeight / 3);
259+ touchRelease(indicatorsMenu, nextItemMappedPositionX, indicatorsMenu.openedHeight / 3);
260260 }
261261 }
262262}
tests/qmltests/Stages/tst_DesktopStage.qml+29
@@ -25,6 +25,7 @@ import Utils 0.1
2525import ".." // For EdgeBarrierControls
2626import "../../../qml/Stages"
2727import "../../../qml/Components"
28+import "../../../qml/Components/PanelState"
2829
2930Item {
3031 id: root
@@ -500,5 +501,33 @@ Item {
500501 tryCompare(dialerAppDelegate, "visible", true);
501502 tryCompare(facebookAppDelegate, "visible", false);
502503 }
504+
505+ function test_dropShadow() {
506+ killAllRunningApps();
507+
508+ // verify the drop shadow is not visible initially
509+ verify(PanelState.dropShadow == false);
510+
511+ // start an app, maximize it
512+ var facebookApp = startApplication("facebook-webapp");
513+ var facebookAppDelegate = findChild(desktopStage, "appDelegate_facebook-webapp");
514+ facebookAppDelegate.maximize();
515+
516+ // verify the drop shadow is still not visible
517+ verify(PanelState.dropShadow == false);
518+
519+ // start a foreground app, not maximized
520+ var dialerApp = startApplication("dialer-app");
521+ var dialerAppDelegate = findChild(desktopStage, "appDelegate_dialer-app");
522+
523+ // verify the drop shadow becomes visible
524+ verify(PanelState.dropShadow == true);
525+
526+ // close the maximized app
527+ ApplicationManager.stopApplication("facebook-webapp");
528+
529+ // verify the drop shadow is gone
530+ verify(PanelState.dropShadow == false);
531+ }
503532 }
504533}
tests/qmltests/Wizard/tst_Wizard.qml+15
@@ -129,6 +129,7 @@ Item {
129129
130130 var pages = findChild(wizard, "wizardPages");
131131 var security = findInvisibleChild(pages, "securityPrivacy");
132+ security.setSecurity("", "", UbuntuSecurityPrivacyPanel.Swipe);
132133 setSecuritySpy.target = security;
133134
134135 setup();
@@ -315,6 +316,20 @@ Item {
315316 }
316317 }
317318
319+ function test_passwdSkipIfSet() {
320+ var page = goToPage("simPage");
321+
322+ // Set password type to non-swipe
323+ var pages = findChild(wizard, "wizardPages");
324+ var security = findInvisibleChild(pages, "securityPrivacy");
325+ security.setSecurity("", "", UbuntuSecurityPrivacyPanel.Passphrase);
326+ compare(security.securityType, UbuntuSecurityPrivacyPanel.Passphrase);
327+
328+ // Make sure that moving from sim page lands on wifi page
329+ tap(findChild(page, "forwardButton"));
330+ waitForPage("wifiPage"); // thus skipping passwdPage
331+ }
332+
318333 function test_passwdPasscode() {
319334 var page = goToPage("passwdPage");
320335
tests/utils/modules/Unity/Test/CMakeLists.txt+8−1
@@ -13,12 +13,19 @@ set(UnityTestQML_SOURCES
1313 testutil.cpp
1414 plugin.cpp
1515 TouchEventSequenceWrapper.cpp
16− ${CMAKE_SOURCE_DIR}/src/MouseTouchAdaptor.cpp
1716)
1817
18+if (ENABLE_TOUCH_EMULATION)
19+ set(UnityTestQML_SOURCES ${UnityTestQML_SOURCES} ${CMAKE_SOURCE_DIR}/src/MouseTouchAdaptor.cpp)
20+endif()
21+
1922add_library(UnityTestQml MODULE ${UnityTestQML_SOURCES})
2023target_link_libraries(UnityTestQml UbuntuGestures)
2124
25+if (ENABLE_TOUCH_EMULATION)
26+ target_link_libraries(UnityTestQml ${MOUSETOUCHADAPTOR_LIBS_LDFLAGS})
27+endif()
28+
2229qt5_use_modules(UnityTestQml Core Quick Test)
2330
2431export_qmlfiles(Unity.Test Unity/Test)
tests/utils/modules/Unity/Test/plugin.cpp+13−3
@@ -17,7 +17,11 @@
1717
1818#include "plugin.h"
1919#include "testutil.h"
20+
21+#ifdef UNITY8_ENABLE_TOUCH_EMULATION
2022#include <MouseTouchAdaptor.h>
23+#endif
24+
2125#include "TouchEventSequenceWrapper.h"
2226
2327#include <qqml.h>
@@ -27,23 +31,29 @@ QObject *testutil_provider(QQmlEngine* /* engine */, QJSEngine* /* scriptEngine
2731{
2832 return new TestUtil();
2933}
34+
35+#ifdef UNITY8_ENABLE_TOUCH_EMULATION
3036QObject *getMouseTouchAdaptorQMLSingleton(QQmlEngine* /* engine */, QJSEngine* /* scriptEngine */)
3137{
3238 return MouseTouchAdaptor::instance();
3339}
40+#endif
41+
3442} // anonymous namespace
3543
3644void UnityTestPlugin::registerTypes(const char *uri)
3745{
3846 Q_ASSERT(QLatin1String(uri) == QLatin1String("Unity.Test"));
3947
40− // Ensure the instance gets created
41− MouseTouchAdaptor::instance();
42−
4348 // @uri Unity.Test
4449 qmlRegisterSingletonType<TestUtil>(uri, 0, 1, "Util", testutil_provider);
4550 qmlRegisterUncreatableType<TouchEventSequenceWrapper>(uri, 0, 1, "TouchEventSequence",
4651 "You cannot directly create a TouchEventSequence object.");
52+
53+ #ifdef UNITY8_ENABLE_TOUCH_EMULATION
54+ // Ensure the instance gets created
55+ MouseTouchAdaptor::instance();
4756 qmlRegisterSingletonType<MouseTouchAdaptor>(uri, 0, 1, "MouseTouchAdaptor",
4857 getMouseTouchAdaptorQMLSingleton);
58+ #endif
4959}