on xenial help sign in
Merge trunk

[ Andrea Cimitan ] * Fix continue button in wifi wizard page, adds qml-module- qtsysteminfo as unity8 dep (LP: #1363400) * Background needs to be specified to be visible in horizontal cards (LP: #1411748) [ CI Train Bot ] * Resync trunk [ Michał Sawicz ] * Add workaround for gcc ICE. [ Albert Astals ] * Implement proper updateRanges for horizontal items (i.e. Carousel, Horizontal List) [ Michael Terry ] * Don't accept multiple "Finish" clicks during the last step of the wizard [ Daniel d'Andrada ] * Unify all liblightdm mocks * Ensure the greeter password field is not covered by the keyboard * Don't show() the lockscreen if it's already being shown

commit9800f80e3e3d6cd9d1a5f3aaf6c938b69cb31a93 authorDaniel d'Andrada <daniel.dandrada@canonical.com> dateThu 5 Feb 2015, 15:50 (12 years ago) parent6c68e0c958eebf
88 files changed+1633−616
debian/changelog+29 debian/control+2 plugins/Dash/CardCreator.js+2−1 plugins/LightDM/CMakeLists.txt+3−3 plugins/LightDM/Greeter.cpp+1−19 plugins/LightDM/Greeter.h+1−1 tests/mocks/LightDM/single-pin/UsersModelPrivate.cpp → plugins/LightDM/GreeterPrivate.h+20−14 tests/mocks/LightDM/demo/CMakeLists.txt → plugins/LightDM/liblightdm/CMakeLists.txt+6−6 tests/mocks/LightDM/Greeter.cpp → plugins/LightDM/liblightdm/Greeter.cpp+7−7 tests/mocks/LightDM/Greeter.h → plugins/LightDM/liblightdm/Greeter.h+4−3 tests/mocks/LightDM/demo/GreeterPrivate.cpp → plugins/LightDM/liblightdm/GreeterPrivate.cpp+2−2 tests/mocks/LightDM/GreeterPrivate.h → plugins/LightDM/liblightdm/GreeterPrivate.h−1 tests/mocks/LightDM/UsersModel.cpp → plugins/LightDM/liblightdm/UsersModel.cpp+6 tests/mocks/LightDM/UsersModel.h → plugins/LightDM/liblightdm/UsersModel.h+4 tests/mocks/LightDM/demo/UsersModelPrivate.cpp → plugins/LightDM/liblightdm/UsersModelPrivate.cpp+1−1 tests/mocks/LightDM/UsersModelPrivate.h → plugins/LightDM/liblightdm/UsersModelPrivate.h plugins/Lights/CMakeLists.txt−2 plugins/Powerd/CMakeLists.txt−2 plugins/Unity/Launcher/CMakeLists.txt−1 plugins/Unity/Session/CMakeLists.txt−2 plugins/Utils/CMakeLists.txt−3 po/am.po+3−3 po/be.po+49−42 po/ca.po+3−3 po/de.po+3−3 po/en_AU.po+3−3 po/es.po+3−3 po/fa.po+4−4 po/fi.po+3−3 po/fr.po+4−4 po/gl.po+3−3 po/hu.po+3−3 po/it.po+4−4 po/nb.po+3−3 po/ro.po+4−4 po/ru.po+5−5 po/sl.po+3−3 po/tr.po+79−69 qml/Components/Carousel.qml+6−2 qml/Dash/CardCarousel.qml+6−2 qml/Dash/CardHorizontalList.qml+7−2 qml/Dash/DashRenderer.qml+6−1 qml/Dash/GenericScopeView.qml+91−48 qml/Greeter/Greeter.qml+8 qml/Greeter/GreeterContent.qml+6−2 qml/Shell.qml+1−1 qml/Wizard/Pages.qml+2 qml/Wizard/Pages/40-wifi.qml+27−9 run.sh+3−26 tests/autopilot/unity8/shell/__init__.py−13 tests/autopilot/unity8/shell/tests/__init__.py+8−11 tests/autopilot/unity8/shell/tests/test_edges_demo.py−1 tests/autopilot/unity8/shell/tests/test_lock_screen.py+6−5 tests/mocks/LightDM/CMakeLists.txt+8−9 tests/mocks/LightDM/single/UsersModelPrivate.cpp → tests/mocks/LightDM/MockGreeter.cpp+13−11 tests/mocks/LightDM/MockGreeter.h+37 tests/mocks/LightDM/MockUsersModel.cpp+39 tests/mocks/LightDM/single/GreeterPrivate.cpp → tests/mocks/LightDM/MockUsersModel.h+14−23 tests/mocks/LightDM/QLightDM/Greeter+17−1 tests/mocks/LightDM/QLightDM/InfographicModel−1 tests/mocks/LightDM/QLightDM/UsersModel+17−1 tests/mocks/LightDM/full/CMakeLists.txt−18 tests/mocks/LightDM/liblightdm/CMakeLists.txt+18 tests/mocks/LightDM/liblightdm/Greeter.cpp+199 tests/mocks/LightDM/liblightdm/Greeter.h+118 tests/mocks/LightDM/full/GreeterPrivate.cpp → tests/mocks/LightDM/liblightdm/GreeterPrivate.cpp+40−6 tests/mocks/LightDM/liblightdm/GreeterPrivate.h+54 tests/mocks/LightDM/liblightdm/UsersModel.cpp+134 tests/mocks/LightDM/liblightdm/UsersModel.h+69 tests/mocks/LightDM/full/UsersModelPrivate.cpp → tests/mocks/LightDM/liblightdm/UsersModelPrivate.cpp+58−6 tests/mocks/LightDM/liblightdm/UsersModelPrivate.h+63 tests/mocks/LightDM/plugin.cpp+68 tests/mocks/LightDM/single-passphrase/UsersModelPrivate.cpp → tests/mocks/LightDM/plugin.h+13−14 tests/mocks/LightDM/single-passphrase/CMakeLists.txt−19 tests/mocks/LightDM/single-passphrase/GreeterPrivate.cpp−46 tests/mocks/LightDM/single-pin/CMakeLists.txt−19 tests/mocks/LightDM/single-pin/GreeterPrivate.cpp−46 tests/mocks/LightDM/single/CMakeLists.txt−18 tests/mocks/Unity/CMakeLists.txt+3 tests/plugins/LightDM/CMakeLists.txt+3−3 tests/plugins/LightDM/greeter.qml+5 tests/qmltests/CMakeLists.txt+19−19 tests/qmltests/Dash/tst_Card.qml+7−1 tests/qmltests/Greeter/tst_Infographics.qml+10 tests/qmltests/Greeter/tst_MultiGreeter.qml+91−2 tests/qmltests/tst_Shell.qml+8 tests/qmltests/tst_ShellWithPin.qml+56 tests/qmltests/tst_TabletShell.qml+8
debian/changelog+29
@@ -1,3 +1,32 @@
1+unity8 (8.02+15.04.20150205-0ubuntu1) vivid; urgency=medium
2+
3+ [ Andrea Cimitan ]
4+ * Fix continue button in wifi wizard page, adds qml-module-
5+ qtsysteminfo as unity8 dep (LP: #1363400)
6+ * Background needs to be specified to be visible in horizontal cards
7+ (LP: #1411748)
8+
9+ [ CI Train Bot ]
10+ * Resync trunk
11+
12+ [ Michał Sawicz ]
13+ * Add workaround for gcc ICE.
14+
15+ [ Albert Astals ]
16+ * Implement proper updateRanges for horizontal items (i.e. Carousel,
17+ Horizontal List)
18+
19+ [ Michael Terry ]
20+ * Don't accept multiple "Finish" clicks during the last step of the
21+ wizard
22+
23+ [ Daniel d'Andrada ]
24+ * Unify all liblightdm mocks
25+ * Ensure the greeter password field is not covered by the keyboard
26+ * Don't show() the lockscreen if it's already being shown
27+
28+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 05 Feb 2015 10:30:13 +0000
29+
130unity8 (8.02+15.04.20150123.3-0ubuntu1) vivid; urgency=low
231
332 [ Sebastien Bacher ]
debian/control+2
@@ -39,6 +39,7 @@ Build-Depends: cmake,
3939 qml-module-qtquick-layouts,
4040 qml-module-qtquick-xmllistmodel,
4141 qml-module-qtquick2,
42+ qml-module-qtsysteminfo,
4243 qml-module-qttest,
4344 qt5-default,
4445 qtbase5-dev (>= 5.2.1),
@@ -90,6 +91,7 @@ Depends: gsettings-desktop-schemas,
9091 qmenumodel-qml (>= 0.2.9),
9192 qml-module-qt-labs-folderlistmodel,
9293 qml-module-qtquick-xmllistmodel,
94+ qml-module-qtsysteminfo,
9395 qtdeclarative5-gsettings1.0,
9496 qtdeclarative5-qtmir-plugin (>= 0.4.4),
9597 qtdeclarative5-ubuntu-telephony0.1,
plugins/Dash/CardCreator.js+2−1
@@ -320,7 +320,8 @@ function cardString(template, components) {
320320 var hasSummary = components["summary"] || false;
321321 var artAndSummary = hasArt && hasSummary;
322322 var isHorizontal = template["card-layout"] === "horizontal";
323− var hasBackground = (hasSummary || !isHorizontal) && (template["card-background"] || components["background"] || artAndSummary);
323+ var hasBackground = (!isHorizontal && (template["card-background"] || components["background"] || artAndSummary)) ||
324+ (hasSummary && (template["card-background"] || components["background"]));
324325 var hasTitle = components["title"] || false;
325326 var hasMascot = components["mascot"] || false;
326327 var hasEmblem = components["emblem"] && !(hasMascot && template["card-size"] === "small") || false;
plugins/LightDM/CMakeLists.txt+3−3
@@ -1,9 +1,9 @@
1−# Dependencies
2−include(FindPkgConfig)
31pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
42# TODO: Once we split out a separate greeter process, uncomment these lines
53#pkg_check_modules(LIBLIGHTDM REQUIRED liblightdm-qt5-2)
64
5+add_subdirectory(liblightdm)
6+
77include_directories(
88 ${CMAKE_CURRENT_SOURCE_DIR}
99 ${CMAKE_CURRENT_BINARY_DIR}
@@ -28,7 +28,7 @@ add_library(LightDM-qml MODULE
2828 )
2929
3030target_link_libraries(LightDM-qml
31− MockLightDM-demo
31+ integratedLightDM
3232 unity8-private
3333# TODO: Once we split out a separate greeter process, uncomment these lines
3434# ${LIBLIGHTDM_LDFLAGS}
plugins/LightDM/Greeter.cpp+1−19
@@ -17,26 +17,8 @@
1717 */
1818
1919#include "Greeter.h"
20+#include "GreeterPrivate.h"
2021#include <libintl.h>
21−#include <QLightDM/Greeter>
22−
23−class GreeterPrivate
24−{
25−public:
26− explicit GreeterPrivate(Greeter *parent);
27−
28− QLightDM::Greeter *m_greeter;
29− bool m_active;
30− bool wasPrompted;
31− bool promptless;
32−
33−protected:
34− Greeter * const q_ptr;
35−
36−private:
37− Q_DECLARE_PUBLIC(Greeter)
38−};
39−
4022
4123GreeterPrivate::GreeterPrivate(Greeter* parent)
4224 : m_greeter(new QLightDM::Greeter(parent)),
plugins/LightDM/Greeter.h+1−1
@@ -68,7 +68,7 @@ Q_SIGNALS:
6868 // should switch to this user if possible.
6969 void requestAuthenticationUser(const QString &user);
7070
71−private:
71+protected:
7272 GreeterPrivate * const d_ptr;
7373
7474 Q_DECLARE_PRIVATE(Greeter)
tests/mocks/LightDM/single-pin/UsersModelPrivate.cpp → plugins/LightDM/GreeterPrivate.hrenamed+20−14
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 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
@@ -12,22 +12,28 @@
1212 *
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/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
1715 */
1816
19−#include "../UsersModelPrivate.h"
17+#ifndef UNITY_GREETER_PRIVATE_H
18+#define UNITY_GREETER_PRIVATE_H
2019
21−namespace QLightDM
22−{
20+#include <QLightDM/Greeter>
2321
24−UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
25− : q_ptr(parent)
22+class GreeterPrivate
2623{
27− entries =
28− {
29− { "has-pin", "Has PIN", 0, 0, false, false, 0, 0 },
30− };
31−}
24+public:
25+ explicit GreeterPrivate(Greeter *parent);
26+
27+ QLightDM::Greeter *m_greeter;
28+ bool m_active;
29+ bool wasPrompted;
30+ bool promptless;
31+
32+protected:
33+ Greeter * const q_ptr;
34+
35+private:
36+ Q_DECLARE_PUBLIC(Greeter)
37+};
3238
33−}
39+#endif // UNITY_GREETER_PRIVATE_H
tests/mocks/LightDM/demo/CMakeLists.txt → plugins/LightDM/liblightdm/CMakeLists.txtrenamed+6−6
@@ -1,14 +1,14 @@
11pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
22
33set(LibLightDM_SOURCES
4− ../Greeter.cpp
5− ../UsersModel.cpp
4+ Greeter.cpp
5+ UsersModel.cpp
66 GreeterPrivate.cpp
77 UsersModelPrivate.cpp
88 ${CMAKE_SOURCE_DIR}/plugins/Utils/qvariantlistmodel.cpp
99 )
1010
11−add_library(MockLightDM-demo STATIC ${LibLightDM_SOURCES})
11+add_library(integratedLightDM STATIC ${LibLightDM_SOURCES})
1212add_library(MockLightDM-demo-shared SHARED ${LibLightDM_SOURCES})
1313
1414include_directories(
@@ -16,7 +16,7 @@ include_directories(
1616 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
1717)
1818
19−target_link_libraries(MockLightDM-demo
19+target_link_libraries(integratedLightDM
2020 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
2121 -lpam
2222)
@@ -25,10 +25,10 @@ target_link_libraries(MockLightDM-demo-shared
2525 -lpam
2626)
2727
28−qt5_use_modules(MockLightDM-demo Concurrent Gui)
28+qt5_use_modules(integratedLightDM Concurrent Gui)
2929qt5_use_modules(MockLightDM-demo-shared Concurrent Gui)
3030
31−set_target_properties(MockLightDM-demo PROPERTIES COMPILE_FLAGS -fPIC)
31+set_target_properties(integratedLightDM PROPERTIES COMPILE_FLAGS -fPIC)
3232set_target_properties(MockLightDM-demo-shared PROPERTIES
3333 OUTPUT_NAME lightdm-qt5-2)
3434
tests/mocks/LightDM/Greeter.cpp → plugins/LightDM/liblightdm/Greeter.cpprenamed+7−7
@@ -16,6 +16,13 @@
1616 * Author: Michael Terry <michael.terry@canonical.com>
1717 */
1818
19+
20+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
21+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
22+ * COUNTERPART IN tests/mocks/Lightdm/liblightdm
23+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
24+
25+
1926#include "Greeter.h"
2027#include "GreeterPrivate.h"
2128#include <QtCore/QCoreApplication>
@@ -128,13 +135,6 @@ void Greeter::authenticate(const QString &username)
128135
129136 d->authenticated = false;
130137 d->authenticationUser = username;
131− d->twoFactorDone = false;
132− QTimer::singleShot(0, this, SLOT(delayedAuthentication()));
133−}
134−
135−void Greeter::delayedAuthentication()
136−{
137− Q_D(Greeter);
138138 d->handleAuthenticate();
139139}
140140
tests/mocks/LightDM/Greeter.h → plugins/LightDM/liblightdm/Greeter.hrenamed+4−3
@@ -24,6 +24,10 @@
2424#include <QtCore/QObject>
2525#include <QtCore/QVariant>
2626
27+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
28+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
29+ * COUNTERPART IN tests/mocks/Lightdm/liblightdm
30+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
2731
2832namespace QLightDM
2933{
@@ -99,9 +103,6 @@ Q_SIGNALS:
99103protected:
100104 void sendAuthenticationComplete();
101105
102−private Q_SLOTS:
103− void delayedAuthentication();
104−
105106private:
106107 GreeterPrivate *d_ptr;
107108 Q_DECLARE_PRIVATE(Greeter)
tests/mocks/LightDM/demo/GreeterPrivate.cpp → plugins/LightDM/liblightdm/GreeterPrivate.cpprenamed+2−2
@@ -16,8 +16,8 @@
1616 * Author: Michael Terry <michael.terry@canonical.com>
1717 */
1818
19−#include "../Greeter.h"
20−#include "../GreeterPrivate.h"
19+#include "Greeter.h"
20+#include "GreeterPrivate.h"
2121#include <QFuture>
2222#include <QFutureInterface>
2323#include <QFutureWatcher>
tests/mocks/LightDM/GreeterPrivate.h → plugins/LightDM/liblightdm/GreeterPrivate.hrenamed−1
@@ -35,7 +35,6 @@ public:
3535 // These variables may not be used by all subclasses, that's no problem
3636 bool authenticated;
3737 QString authenticationUser;
38− bool twoFactorDone;
3938
4039 void handleAuthenticate();
4140 void handleRespond(const QString &response);
tests/mocks/LightDM/UsersModel.cpp → plugins/LightDM/liblightdm/UsersModel.cpprenamed+6
@@ -16,6 +16,12 @@
1616 * Author: Michael Terry <michael.terry@canonical.com>
1717 */
1818
19+
20+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
21+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
22+ * COUNTERPART IN tests/mocks/Lightdm/liblightdm
23+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
24+
1925// LightDM currently is Qt4 compatible, and so doesn't define setRoleNames.
2026// To use the same method of setting role name that it does, we
2127// set our compatibility to Qt4 here too.
tests/mocks/LightDM/UsersModel.h → plugins/LightDM/liblightdm/UsersModel.hrenamed+4
@@ -24,6 +24,10 @@
2424#include <QtCore/QSharedDataPointer>
2525#include <QAbstractListModel>
2626
27+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
28+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
29+ * COUNTERPART IN tests/mocks/Lightdm/liblightdm
30+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
2731
2832namespace QLightDM
2933{
tests/mocks/LightDM/demo/UsersModelPrivate.cpp → plugins/LightDM/liblightdm/UsersModelPrivate.cpprenamed+1−1
@@ -16,7 +16,7 @@
1616 * Author: Michael Terry <michael.terry@canonical.com>
1717 */
1818
19−#include "../UsersModelPrivate.h"
19+#include "UsersModelPrivate.h"
2020
2121#include <QDir>
2222#include <QSettings>
tests/mocks/LightDM/UsersModelPrivate.h → plugins/LightDM/liblightdm/UsersModelPrivate.hrenamed

The content is the same.

plugins/Lights/CMakeLists.txt−2
@@ -1,5 +1,3 @@
1−include(FindPkgConfig)
2−
31pkg_check_modules(ANDROID_HEADERS REQUIRED android-headers)
42pkg_check_modules(ANDROID_HARDWARE REQUIRED libhardware)
53
plugins/Powerd/CMakeLists.txt−2
@@ -1,5 +1,3 @@
1−include(FindPkgConfig)
2−
31pkg_search_module(GIO REQUIRED gio-2.0)
42
53include_directories(
plugins/Unity/Launcher/CMakeLists.txt−1
@@ -1,4 +1,3 @@
1−include(FindPkgConfig)
21pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=5)
32pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=5)
43pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
plugins/Unity/Session/CMakeLists.txt−2
@@ -1,5 +1,3 @@
1−include(FindPkgConfig)
2−
31pkg_search_module(GIO REQUIRED gio-2.0)
42
53include_directories(
plugins/Utils/CMakeLists.txt−3
@@ -1,6 +1,3 @@
1−# Dependencies
2−include(FindPkgConfig)
3−
41pkg_search_module(GIO REQUIRED gio-2.0)
52
63include_directories(
po/am.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2014-12-27 19:44+0000\n"
11+"PO-Revision-Date: 2015-01-29 00:07+0000\n"
1212"Last-Translator: samson <Unknown>\n"
1313"Language-Team: Amharic <am@li.org>\n"
1414"MIME-Version: 1.0\n"
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: 2015-01-28 06:29+0000\n"
18+"X-Launchpad-Export-Date: 2015-01-30 07:08+0000\n"
1919"X-Generator: Launchpad (build 17306)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -282,7 +282,7 @@ msgstr "አልተቻለም: እንደገና ለመሞከር መታ ያድርጉ"
282282
283283#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
284284msgid "Reply"
285−msgstr ""
285+msgstr "መመለሻ"
286286
287287#: qml/Panel/Indicators/ModemInfoItem.qml:105
288288msgid "Unlock SIM"
po/be.po+49−42
@@ -8,16 +8,16 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2014-09-24 17:12+0000\n"
12−"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
11+"PO-Revision-Date: 2015-02-03 22:02+0000\n"
12+"Last-Translator: Arsień Šachalevič <semen.shah@gmail.com>\n"
1313"Language-Team: Belarusian <be@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
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: 2015-01-28 06:30+0000\n"
20−"X-Generator: Launchpad (build 17306)\n"
19+"X-Launchpad-Export-Date: 2015-02-04 07:13+0000\n"
20+"X-Generator: Launchpad (build 17331)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
2323msgid "Password: "
@@ -291,7 +291,7 @@ msgstr "Памылка, націсніце для паўтору"
291291
292292#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
293293msgid "Reply"
294−msgstr ""
294+msgstr "Адказаць"
295295
296296#: qml/Panel/Indicators/ModemInfoItem.qml:105
297297msgid "Unlock SIM"
@@ -361,98 +361,99 @@ msgstr ""
361361
362362#: qml/Wizard/Page.qml:89
363363msgid "Back"
364−msgstr ""
364+msgstr "Назад"
365365
366366#: qml/Wizard/Pages/10-welcome.qml:27
367367msgid "Hi!"
368−msgstr ""
368+msgstr "Вітай!"
369369
370370#: qml/Wizard/Pages/10-welcome.qml:44
371371msgid "Welcome to your Ubuntu phone."
372−msgstr ""
372+msgstr "Вітаем Вас у сістэме тэлефона Ubuntu."
373373
374374#: qml/Wizard/Pages/10-welcome.qml:52
375375msgid "Let’s get started."
376−msgstr ""
376+msgstr "Пачнем."
377377
378378#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
379379#: qml/Wizard/Pages/40-wifi.qml:197 qml/Wizard/Pages/50-location.qml:131
380380#: qml/Wizard/Pages/60-reporting.qml:50 qml/Wizard/Pages/passwd-confirm.qml:82
381381#: qml/Wizard/Pages/passwd-set.qml:90
382382msgid "Continue"
383−msgstr ""
383+msgstr "Працягнуць"
384384
385385#: qml/Wizard/Pages/20-sim.qml:25
386386msgid "Add a SIM card and restart your device"
387−msgstr ""
387+msgstr "Дадайце SIM-карту і перазагрузіце Вашую прыладу"
388388
389389#: qml/Wizard/Pages/20-sim.qml:55
390390msgid "Without it, you won’t be able to make calls or use text messaging."
391−msgstr ""
391+msgstr "Без яе вы не зможаце тэлефанаваць ці адпраўляць паведамленні."
392392
393393#: qml/Wizard/Pages/20-sim.qml:69 qml/Wizard/Pages/40-wifi.qml:197
394394msgid "Skip"
395−msgstr ""
395+msgstr "Прапусціць"
396396
397397#: qml/Wizard/Pages/30-passwd-type.qml:39
398398msgid "Lock security"
399−msgstr ""
399+msgstr "Блакаванне бяспекі"
400400
401401#: qml/Wizard/Pages/30-passwd-type.qml:74
402402msgid "Please select how you’d like to unlock your phone."
403−msgstr ""
403+msgstr "Калі ласка, абярыце спосаб разблакавання тэлефона."
404404
405405#: qml/Wizard/Pages/30-passwd-type.qml:97
406406msgid "Swipe"
407−msgstr ""
407+msgstr "Свайп(Рух пальцам)"
408408
409409#: qml/Wizard/Pages/30-passwd-type.qml:98
410410msgid "No security"
411−msgstr ""
411+msgstr "Без абароны"
412412
413413#: qml/Wizard/Pages/30-passwd-type.qml:100
414414msgid "Passcode"
415−msgstr ""
415+msgstr "Код-пароль"
416416
417417#: qml/Wizard/Pages/30-passwd-type.qml:101
418418msgid "4 digits only"
419−msgstr ""
419+msgstr "Толькі 4 лічбы"
420420
421421#: qml/Wizard/Pages/30-passwd-type.qml:103
422422msgid "Passphrase"
423−msgstr ""
423+msgstr "Пароль"
424424
425425#: qml/Wizard/Pages/30-passwd-type.qml:104
426426msgid "Numbers and letters"
427−msgstr ""
427+msgstr "Лічбы і літары"
428428
429429#: qml/Wizard/Pages/40-wifi.qml:28
430430msgid "Connect to Wi‑Fi"
431−msgstr ""
431+msgstr "Злучыцца з Wi-Fi"
432432
433433#: qml/Wizard/Pages/40-wifi.qml:147
434434msgid "Available networks…"
435−msgstr ""
435+msgstr "Даступныя сеткі..."
436436
437437#: qml/Wizard/Pages/40-wifi.qml:148
438438msgid "No available networks."
439−msgstr ""
439+msgstr "Няма даступных сетак."
440440
441441#: qml/Wizard/Pages/50-location.qml:27
442442msgid "Location"
443−msgstr ""
443+msgstr "Месца"
444444
445445#: qml/Wizard/Pages/50-location.qml:62
446446msgid "Let the phone detect your location:"
447−msgstr ""
447+msgstr "Дазволіць тэлефону вызначаць месцазнаходжанне:"
448448
449449#: qml/Wizard/Pages/50-location.qml:69
450450msgid "Using GPS only (less accurate)"
451−msgstr ""
451+msgstr "З дапамогай толькі GPS (найменш дакладна)"
452452
453453#: qml/Wizard/Pages/50-location.qml:86
454454msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
455455msgstr ""
456+"На аснове GPS, ананімізаванага Wi-Fi і дадзеных сотавай сеткі (рэкамендуецца)"
456457
457458#. TRANSLATORS: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
458459#: qml/Wizard/Pages/50-location.qml:103
@@ -460,81 +461,87 @@ msgid ""
460461"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
461462"conditions</a>."
462463msgstr ""
464+"Выбарам гэтага варыянту дзеянняў вы згаджаецеся з <a href='#'> умовамі "
465+"прадстаўлення паслуг Nokia HERE</a>."
463466
464467#: qml/Wizard/Pages/50-location.qml:112
465468msgid "Not at all"
466−msgstr ""
469+msgstr "Не дазваляць"
467470
468471#: qml/Wizard/Pages/50-location.qml:124
469472msgid "You can change your mind later in <b>System Settings</b>."
470−msgstr ""
473+msgstr "Пасля змяніць налады можна з дапамогай <b>Сістэмных параметраў</b>."
471474
472475#: qml/Wizard/Pages/60-reporting.qml:24
473476msgid "Improving your experience"
474−msgstr ""
477+msgstr "Спрашчэнне вашай працы"
475478
476479#: qml/Wizard/Pages/60-reporting.qml:36
477480msgid ""
478481"Your phone is set up to automatically report errors to Canonical and its "
479482"partners, the makers of the operating system."
480483msgstr ""
484+"Ваш тэлефон настроены на аўтаматычную адпраўку справаздач пра памылкі ў "
485+"Canonical і партнёрскія установы, вытворцам аперацыйнай сістэмы."
481486
482487#: qml/Wizard/Pages/60-reporting.qml:43
483488msgid ""
484489"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
485490"Privacy</b>"
486491msgstr ""
492+"Гэтае можна адключыць у <b>Сістэмных параметрах</b>, <b>Бяспека &amp; "
493+"канфедэнцыйнасць</b>"
487494
488495#: qml/Wizard/Pages/80-finished.qml:24
489496msgid "All done"
490−msgstr ""
497+msgstr "Зроблена"
491498
492499#: qml/Wizard/Pages/80-finished.qml:39
493500msgid "Nice work!"
494−msgstr ""
501+msgstr "Выдатная праца!"
495502
496503#: qml/Wizard/Pages/80-finished.qml:46
497504msgid "Your phone is now ready to use."
498−msgstr ""
505+msgstr "Цяпер Вашым тэлефонам можна карыстацца."
499506
500507#: qml/Wizard/Pages/80-finished.qml:53
501508msgid "Finish"
502−msgstr ""
509+msgstr "Скончыць"
503510
504511#: qml/Wizard/Pages/here-terms.qml:27
505512msgid "Terms & Conditions"
506−msgstr ""
513+msgstr "Умовы карыстання"
507514
508515#: qml/Wizard/Pages/passwd-confirm.qml:49
509516msgid "Confirm passphrase"
510−msgstr ""
517+msgstr "Пацвердзіце пароль"
511518
512519#: qml/Wizard/Pages/passwd-confirm.qml:50
513520msgid "Confirm passcode"
514−msgstr ""
521+msgstr "Пацвердзіце код-пароль"
515522
516523#: qml/Wizard/Pages/passwd-confirm.qml:53
517524#: qml/Wizard/Pages/passwd-confirm.qml:54
518525msgid "Please try again."
519−msgstr ""
526+msgstr "Калі ласка, паспрабуйце яшчэ раз."
520527
521528#: qml/Wizard/Pages/passwd-set.qml:61
522529msgid "Choose your passcode"
523−msgstr ""
530+msgstr "Выберыце ваш код-пароль"
524531
525532#: qml/Wizard/Pages/passwd-set.qml:68
526533msgid "Passphrase must be 4 characters long"
527−msgstr ""
534+msgstr "Пароль мусіць складацца мінімум з 4 сімвалаў"
528535
529536#: qml/Wizard/StackButton.qml:39
530537#, qt-format
531538msgid "〈 %1"
532−msgstr ""
539+msgstr "〈 %1"
533540
534541#: qml/Wizard/StackButton.qml:42
535542#, qt-format
536543msgid "%1 〉"
537−msgstr ""
544+msgstr "%1 〉"
538545
539546#~ msgid "Confirm"
540547#~ msgstr "Пацвердзіць"
po/ca.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2015-01-27 07:53+0000\n"
11+"PO-Revision-Date: 2015-01-28 08:52+0000\n"
1212"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
1414"MIME-Version: 1.0\n"
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: 2015-01-28 06:30+0000\n"
18+"X-Launchpad-Export-Date: 2015-01-29 06:00+0000\n"
1919"X-Generator: Launchpad (build 17306)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -293,7 +293,7 @@ msgstr "Ha fallat, feu un toc per tornar-ho a intentar"
293293
294294#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
295295msgid "Reply"
296−msgstr ""
296+msgstr "Respon"
297297
298298#: qml/Panel/Indicators/ModemInfoItem.qml:105
299299msgid "Unlock SIM"
po/de.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2014-12-12 01:42+0000\n"
11+"PO-Revision-Date: 2015-01-29 21:52+0000\n"
1212"Last-Translator: Niklas Wenzel <nikwen.developer@gmail.com>\n"
1313"Language-Team: German <de@li.org>\n"
1414"MIME-Version: 1.0\n"
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: 2015-01-28 06:30+0000\n"
18+"X-Launchpad-Export-Date: 2015-01-30 07:08+0000\n"
1919"X-Generator: Launchpad (build 17306)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -290,7 +290,7 @@ msgstr "Fehlgeschlagen, tippen Sie zum Wiederholen"
290290
291291#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
292292msgid "Reply"
293−msgstr ""
293+msgstr "Antworten"
294294
295295#: qml/Panel/Indicators/ModemInfoItem.qml:105
296296msgid "Unlock SIM"
po/en_AU.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2015-01-25 05:57+0000\n"
11+"PO-Revision-Date: 2015-01-29 01:35+0000\n"
1212"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
1313"Language-Team: English (Australia) <en_AU@li.org>\n"
1414"MIME-Version: 1.0\n"
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: 2015-01-28 06:31+0000\n"
18+"X-Launchpad-Export-Date: 2015-01-30 07:08+0000\n"
1919"X-Generator: Launchpad (build 17306)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -283,7 +283,7 @@ msgstr "Failed, tap to retry"
283283
284284#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
285285msgid "Reply"
286−msgstr ""
286+msgstr "Reply"
287287
288288#: qml/Panel/Indicators/ModemInfoItem.qml:105
289289msgid "Unlock SIM"
po/es.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2015-01-16 03:09+0000\n"
11+"PO-Revision-Date: 2015-02-01 03:20+0000\n"
1212"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
1313"Language-Team: Spanish <es@li.org>\n"
1414"MIME-Version: 1.0\n"
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: 2015-01-28 06:30+0000\n"
18+"X-Launchpad-Export-Date: 2015-02-02 06:54+0000\n"
1919"X-Generator: Launchpad (build 17306)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -290,7 +290,7 @@ msgstr "Falló, toque para reintentar"
290290
291291#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
292292msgid "Reply"
293−msgstr ""
293+msgstr "Responder"
294294
295295#: qml/Panel/Indicators/ModemInfoItem.qml:105
296296msgid "Unlock SIM"
po/fa.po+4−4
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2015-01-09 15:59+0000\n"
11+"PO-Revision-Date: 2015-02-04 01:20+0000\n"
1212"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
1313"Language-Team: Persian <fa@li.org>\n"
1414"MIME-Version: 1.0\n"
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: 2015-01-28 06:30+0000\n"
19−"X-Generator: Launchpad (build 17306)\n"
18+"X-Launchpad-Export-Date: 2015-02-05 07:41+0000\n"
19+"X-Generator: Launchpad (build 17331)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
@@ -283,7 +283,7 @@ msgstr "شکست خورد، برای تلاش دوباره ضربه بزنید"
283283
284284#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
285285msgid "Reply"
286−msgstr ""
286+msgstr "پاسخ"
287287
288288#: qml/Panel/Indicators/ModemInfoItem.qml:105
289289msgid "Unlock SIM"
po/fi.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2014-12-14 15:37+0000\n"
11+"PO-Revision-Date: 2015-01-29 09:21+0000\n"
1212"Last-Translator: Jiri Grönroos <Unknown>\n"
1313"Language-Team: Finnish <fi@li.org>\n"
1414"MIME-Version: 1.0\n"
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: 2015-01-28 06:30+0000\n"
18+"X-Launchpad-Export-Date: 2015-01-30 07:08+0000\n"
1919"X-Generator: Launchpad (build 17306)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -285,7 +285,7 @@ msgstr "Epäonnistunut, napauta yrittääksesi uudelleen"
285285
286286#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
287287msgid "Reply"
288−msgstr ""
288+msgstr "Vastaa"
289289
290290#: qml/Panel/Indicators/ModemInfoItem.qml:105
291291msgid "Unlock SIM"
po/fr.po+4−4
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2014-12-10 22:01+0000\n"
11+"PO-Revision-Date: 2015-02-03 20:11+0000\n"
1212"Last-Translator: Jean Marc <Unknown>\n"
1313"Language-Team: French <fr@li.org>\n"
1414"MIME-Version: 1.0\n"
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: 2015-01-28 06:30+0000\n"
19−"X-Generator: Launchpad (build 17306)\n"
18+"X-Launchpad-Export-Date: 2015-02-04 07:13+0000\n"
19+"X-Generator: Launchpad (build 17331)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
@@ -294,7 +294,7 @@ msgstr "Échec, appuyez pour réessayer"
294294
295295#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
296296msgid "Reply"
297−msgstr ""
297+msgstr "Répondre"
298298
299299#: qml/Panel/Indicators/ModemInfoItem.qml:105
300300msgid "Unlock SIM"
po/gl.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2014-12-13 10:46+0000\n"
11+"PO-Revision-Date: 2015-01-28 10:25+0000\n"
1212"Last-Translator: Marcos Lans <Unknown>\n"
1313"Language-Team: Galician <gl@li.org>\n"
1414"MIME-Version: 1.0\n"
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: 2015-01-28 06:30+0000\n"
18+"X-Launchpad-Export-Date: 2015-01-29 06:00+0000\n"
1919"X-Generator: Launchpad (build 17306)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -283,7 +283,7 @@ msgstr "Fallou, toque para reintentar"
283283
284284#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
285285msgid "Reply"
286−msgstr ""
286+msgstr "Responder"
287287
288288#: qml/Panel/Indicators/ModemInfoItem.qml:105
289289msgid "Unlock SIM"
po/hu.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2015-01-17 10:51+0000\n"
11+"PO-Revision-Date: 2015-01-29 09:19+0000\n"
1212"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
1313"Language-Team: Hungarian <hu@li.org>\n"
1414"MIME-Version: 1.0\n"
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: 2015-01-28 06:30+0000\n"
18+"X-Launchpad-Export-Date: 2015-01-30 07:08+0000\n"
1919"X-Generator: Launchpad (build 17306)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -285,7 +285,7 @@ msgstr "Sikertelen, koppintson az újrapróbáláshoz"
285285
286286#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
287287msgid "Reply"
288−msgstr ""
288+msgstr "Válasz"
289289
290290#: qml/Panel/Indicators/ModemInfoItem.qml:105
291291msgid "Unlock SIM"
po/it.po+4−4
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2015-01-27 13:59+0000\n"
12−"Last-Translator: Gio <gio.scino@gmail.com>\n"
11+"PO-Revision-Date: 2015-01-28 10:55+0000\n"
12+"Last-Translator: Milo Casagrande <milo.casagrande@gmail.com>\n"
1313"Language-Team: Italian <it@li.org>\n"
1414"MIME-Version: 1.0\n"
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: 2015-01-28 06:30+0000\n"
18+"X-Launchpad-Export-Date: 2015-01-29 06:00+0000\n"
1919"X-Generator: Launchpad (build 17306)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -292,7 +292,7 @@ msgstr "Non riuscito. Tocca per riprovare"
292292
293293#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
294294msgid "Reply"
295−msgstr ""
295+msgstr "Rispondi"
296296
297297#: qml/Panel/Indicators/ModemInfoItem.qml:105
298298msgid "Unlock SIM"
po/nb.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2015-01-15 06:54+0000\n"
11+"PO-Revision-Date: 2015-01-28 08:47+0000\n"
1212"Last-Translator: Åka Sikrom <Unknown>\n"
1313"Language-Team: Norwegian Bokmal <nb@li.org>\n"
1414"MIME-Version: 1.0\n"
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: 2015-01-28 06:30+0000\n"
18+"X-Launchpad-Export-Date: 2015-01-29 06:00+0000\n"
1919"X-Generator: Launchpad (build 17306)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -285,7 +285,7 @@ msgstr "Feilet. Trykk for å prøve på nytt"
285285
286286#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
287287msgid "Reply"
288−msgstr ""
288+msgstr "Svar"
289289
290290#: qml/Panel/Indicators/ModemInfoItem.qml:105
291291msgid "Unlock SIM"
po/ro.po+4−4
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2015-01-07 11:11+0000\n"
12−"Last-Translator: Marian Vasile <marianvasile1972@gmail.com>\n"
11+"PO-Revision-Date: 2015-01-28 14:27+0000\n"
12+"Last-Translator: Meriuță Cornel <meriutacornel@neacornel.eu>\n"
1313"Language-Team: Romanian <ro@li.org>\n"
1414"MIME-Version: 1.0\n"
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 % 100 > 19) || ((n % 100 "
1818"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2015-01-28 06:30+0000\n"
19+"X-Launchpad-Export-Date: 2015-01-29 06:00+0000\n"
2020"X-Generator: Launchpad (build 17306)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -291,7 +291,7 @@ msgstr "Eșec, atingeți pentru a încerca din nou"
291291
292292#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
293293msgid "Reply"
294−msgstr ""
294+msgstr "Răspuns"
295295
296296#: qml/Panel/Indicators/ModemInfoItem.qml:105
297297msgid "Unlock SIM"
po/ru.po+5−5
@@ -8,7 +8,7 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2014-08-29 08:06+0000\n"
11+"PO-Revision-Date: 2015-01-29 08:02+0000\n"
1212"Last-Translator: ☠Jay ZDLin☠ <Unknown>\n"
1313"Language-Team: Russian <ru@li.org>\n"
1414"MIME-Version: 1.0\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: 2015-01-28 06:30+0000\n"
19+"X-Launchpad-Export-Date: 2015-01-30 07:08+0000\n"
2020"X-Generator: Launchpad (build 17306)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -292,7 +292,7 @@ msgstr "Сбой, коснитесь для повтора"
292292
293293#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
294294msgid "Reply"
295−msgstr ""
295+msgstr "Ответить"
296296
297297#: qml/Panel/Indicators/ModemInfoItem.qml:105
298298msgid "Unlock SIM"
@@ -468,7 +468,7 @@ msgstr ""
468468
469469#: qml/Wizard/Pages/50-location.qml:112
470470msgid "Not at all"
471−msgstr ""
471+msgstr "Нет (никогда)"
472472
473473#: qml/Wizard/Pages/50-location.qml:124
474474msgid "You can change your mind later in <b>System Settings</b>."
@@ -477,7 +477,7 @@ msgstr ""
477477
478478#: qml/Wizard/Pages/60-reporting.qml:24
479479msgid "Improving your experience"
480−msgstr ""
480+msgstr "Улучшение производительности"
481481
482482#: qml/Wizard/Pages/60-reporting.qml:36
483483msgid ""
po/sl.po+3−3
@@ -8,7 +8,7 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2015-01-18 10:10+0000\n"
11+"PO-Revision-Date: 2015-01-30 13:43+0000\n"
1212"Last-Translator: Damir Jerovšek <Unknown>\n"
1313"Language-Team: Slovenian <sl@li.org>\n"
1414"MIME-Version: 1.0\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: 2015-01-28 06:30+0000\n"
19+"X-Launchpad-Export-Date: 2015-01-31 06:19+0000\n"
2020"X-Generator: Launchpad (build 17306)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -288,7 +288,7 @@ msgstr "Spodletelo, tapnite za ponovni poskus"
288288
289289#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
290290msgid "Reply"
291−msgstr ""
291+msgstr "Odgovori"
292292
293293#: qml/Panel/Indicators/ModemInfoItem.qml:105
294294msgid "Unlock SIM"
po/tr.po+79−69
@@ -8,19 +8,19 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2014-07-16 17:58+0000\n"
11+"PO-Revision-Date: 2015-02-04 21:37+0000\n"
1212"Last-Translator: Volkan Gezer <Unknown>\n"
1313"Language-Team: Turkish <tr@li.org>\n"
1414"MIME-Version: 1.0\n"
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: 2015-01-28 06:31+0000\n"
19−"X-Generator: Launchpad (build 17306)\n"
18+"X-Launchpad-Export-Date: 2015-02-05 07:41+0000\n"
19+"X-Generator: Launchpad (build 17331)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
2222msgid "Password: "
23−msgstr ""
23+msgstr "Parola: "
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:45
2626#: plugins/Unity/Launcher/launcheritem.cpp:100
@@ -33,30 +33,30 @@ msgstr "Kısayol iğnesini kaldır"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "Cihaz Kilitli"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
40−msgstr ""
40+msgstr "Çok sayıda parola hatası yaptığınız için kilitlendiniz."
4141
4242#: qml/Components/DelayedLockscreen.qml:63
4343msgid "You have been locked out due to too many failed passcode attempts."
44−msgstr ""
44+msgstr "Çok sayıda parola hatası yaptığınız için kilitlendiniz."
4545
4646#: qml/Components/DelayedLockscreen.qml:72
4747#, qt-format
4848msgid "Please wait %1 minute and then try again…"
4949msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
51−msgstr[1] ""
50+msgstr[0] "Lütfen %1 dakika bekleyin ve yeniden deneyin..."
51+msgstr[1] "Lütfen %1 dakika bekleyin ve yeniden deneyin..."
5252
5353#: qml/Components/Dialogs.qml:86
5454msgid "Log out"
55−msgstr ""
55+msgstr "Oturumu kapat"
5656
5757#: qml/Components/Dialogs.qml:87
5858msgid "Are you sure you want to log out?"
59−msgstr ""
59+msgstr "Oturumu kapatmak istediğinize emin misiniz?"
6060
6161#: qml/Components/Dialogs.qml:89 qml/Components/Dialogs.qml:111
6262#: qml/Components/Dialogs.qml:134
@@ -74,7 +74,7 @@ msgstr "Bilgisayarı Kapat"
7474
7575#: qml/Components/Dialogs.qml:109
7676msgid "Are you sure you want to shut down?"
77−msgstr ""
77+msgstr "Kapatmak istediğinize emin misiniz?"
7878
7979#: qml/Components/Dialogs.qml:131
8080msgid "Reboot"
@@ -86,7 +86,7 @@ msgstr "Bilgisayarı yeniden başlatmak istediğinize emin misiniz?"
8686
8787#: qml/Components/Dialogs.qml:154
8888msgid "Power"
89−msgstr ""
89+msgstr "Güç"
9090
9191#: qml/Components/Dialogs.qml:155
9292msgid ""
@@ -96,15 +96,15 @@ msgstr "Bilgisayarı kapatmak istediğinize emin misiniz?"
9696
9797#: qml/Components/Dialogs.qml:157
9898msgid "Power off"
99−msgstr ""
99+msgstr "Kapat"
100100
101101#: qml/Components/Dialogs.qml:166
102102msgid "Restart"
103−msgstr ""
103+msgstr "Yeniden başlat"
104104
105105#: qml/Components/Dialogs.qml:175
106106msgid "Cancel"
107−msgstr ""
107+msgstr "İptal"
108108
109109#: qml/Components/EdgeDemoOverlay.qml:151
110110msgid "Skip intro"
@@ -157,7 +157,7 @@ msgstr ""
157157
158158#: qml/Components/Lockscreen.qml:238
159159msgid "Return to Call"
160−msgstr ""
160+msgstr "Çağrıya Dön"
161161
162162#: qml/Components/Lockscreen.qml:238
163163msgid "Emergency Call"
@@ -186,11 +186,11 @@ msgstr "Mağaza"
186186
187187#: qml/Dash/PageHeader.qml:284
188188msgid "Settings"
189−msgstr ""
189+msgstr "Ayarlar"
190190
191191#: qml/Dash/PageHeader.qml:291
192192msgid "Remove from Favorites"
193−msgstr ""
193+msgstr "Sık kullanılanlardan kaldır"
194194
195195#: qml/Dash/PageHeader.qml:291
196196msgid "Add to Favorites"
@@ -218,27 +218,27 @@ msgstr "Gönder"
218218
219219#: qml/Dash/PullToRefreshScopeStyle.qml:55
220220msgid "Pull to refresh…"
221−msgstr ""
221+msgstr "Yenilemek için çekin..."
222222
223223#: qml/Dash/PullToRefreshScopeStyle.qml:60
224224msgid "Release to refresh…"
225−msgstr ""
225+msgstr "Yenilemek için bırakın..."
226226
227227#: qml/Dash/ScopesList.qml:66
228228msgid "Manage"
229−msgstr ""
229+msgstr "Yönet"
230230
231231#: qml/Dash/ScopesList.qml:112
232232msgid "Home"
233−msgstr ""
233+msgstr "Ev"
234234
235235#: qml/Dash/ScopesList.qml:113
236236msgid "Also installed"
237−msgstr ""
237+msgstr "Ayrıca kurulan"
238238
239239#: qml/Greeter/Greeter.qml:133
240240msgid "Unlock"
241−msgstr ""
241+msgstr "Kilidi Aç"
242242
243243#: qml/Notifications/NotificationMenuItemFactory.qml:128
244244msgid "Show password"
@@ -246,15 +246,15 @@ msgstr "Parolayı göster"
246246
247247#: qml/Panel/ActiveCallHint.qml:79
248248msgid "Tap to return to call..."
249−msgstr ""
249+msgstr "Çağrıya dönmek için dokunun..."
250250
251251#: qml/Panel/ActiveCallHint.qml:92
252252msgid "Conference"
253−msgstr ""
253+msgstr "Konferans"
254254
255255#: qml/Panel/Indicators/MenuItemFactory.qml:643
256256msgid "Nothing is playing"
257−msgstr ""
257+msgstr "Hiçbir şey çalmıyor"
258258
259259#: qml/Panel/Indicators/MenuItemFactory.qml:791
260260msgid "In queue…"
@@ -282,7 +282,7 @@ msgstr "Başarısız, yeniden denemek için dokunun"
282282
283283#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
284284msgid "Reply"
285−msgstr ""
285+msgstr "Yanıtla"
286286
287287#: qml/Panel/Indicators/ModemInfoItem.qml:105
288288msgid "Unlock SIM"
@@ -290,20 +290,20 @@ msgstr "SIM kilidini aç"
290290
291291#: qml/Panel/Indicators/RoamingIndication.qml:27
292292msgid "Roaming"
293−msgstr ""
293+msgstr "Dolaşım"
294294
295295#: qml/Shell.qml:390
296296#, qt-format
297297msgid "Enter %1"
298−msgstr ""
298+msgstr "%1 Girin"
299299
300300#: qml/Shell.qml:391 qml/Wizard/Pages/passwd-set.qml:60
301301msgid "Enter passphrase"
302−msgstr ""
302+msgstr "Parolayı girin"
303303
304304#: qml/Shell.qml:392
305305msgid "Enter passcode"
306−msgstr ""
306+msgstr "Parolayı girin"
307307
308308#: qml/Shell.qml:393
309309#, qt-format
@@ -316,7 +316,7 @@ msgstr "Üzgünüm, hatalı parola"
316316
317317#: qml/Shell.qml:395
318318msgid "Please re-enter"
319−msgstr ""
319+msgstr "Lütfen yeniden girin"
320320
321321#: qml/Shell.qml:396
322322msgid "Sorry, incorrect passcode"
@@ -352,98 +352,101 @@ msgstr ""
352352
353353#: qml/Wizard/Page.qml:89
354354msgid "Back"
355−msgstr ""
355+msgstr "Geri"
356356
357357#: qml/Wizard/Pages/10-welcome.qml:27
358358msgid "Hi!"
359−msgstr ""
359+msgstr "Merhaba!"
360360
361361#: qml/Wizard/Pages/10-welcome.qml:44
362362msgid "Welcome to your Ubuntu phone."
363−msgstr ""
363+msgstr "Ubuntu telefonunuza hoş geldiniz."
364364
365365#: qml/Wizard/Pages/10-welcome.qml:52
366366msgid "Let’s get started."
367−msgstr ""
367+msgstr "Hadi başlayalım."
368368
369369#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
370370#: qml/Wizard/Pages/40-wifi.qml:197 qml/Wizard/Pages/50-location.qml:131
371371#: qml/Wizard/Pages/60-reporting.qml:50 qml/Wizard/Pages/passwd-confirm.qml:82
372372#: qml/Wizard/Pages/passwd-set.qml:90
373373msgid "Continue"
374−msgstr ""
374+msgstr "Devam Et"
375375
376376#: qml/Wizard/Pages/20-sim.qml:25
377377msgid "Add a SIM card and restart your device"
378−msgstr ""
378+msgstr "Bir SIM kartı ekleyin ve cihazınızı yeniden başlatın"
379379
380380#: qml/Wizard/Pages/20-sim.qml:55
381381msgid "Without it, you won’t be able to make calls or use text messaging."
382382msgstr ""
383+"Bir kart olmadan arama yapamaz veya metin mesaj gönderimini kullanamazsınız."
383384
384385#: qml/Wizard/Pages/20-sim.qml:69 qml/Wizard/Pages/40-wifi.qml:197
385386msgid "Skip"
386−msgstr ""
387+msgstr "Atla"
387388
388389#: qml/Wizard/Pages/30-passwd-type.qml:39
389390msgid "Lock security"
390−msgstr ""
391+msgstr "Kilitleme güvenliği"
391392
392393#: qml/Wizard/Pages/30-passwd-type.qml:74
393394msgid "Please select how you’d like to unlock your phone."
394−msgstr ""
395+msgstr "Lütfen telefonunuzun kilidini nasıl açmak istediğinizi seçin."
395396
396397#: qml/Wizard/Pages/30-passwd-type.qml:97
397398msgid "Swipe"
398−msgstr ""
399+msgstr "Kaydır"
399400
400401#: qml/Wizard/Pages/30-passwd-type.qml:98
401402msgid "No security"
402−msgstr ""
403+msgstr "Güvenlik yok"
403404
404405#: qml/Wizard/Pages/30-passwd-type.qml:100
405406msgid "Passcode"
406−msgstr ""
407+msgstr "Parola"
407408
408409#: qml/Wizard/Pages/30-passwd-type.qml:101
409410msgid "4 digits only"
410−msgstr ""
411+msgstr "Sadece 4 hane"
411412
412413#: qml/Wizard/Pages/30-passwd-type.qml:103
413414msgid "Passphrase"
414−msgstr ""
415+msgstr "Parola"
415416
416417#: qml/Wizard/Pages/30-passwd-type.qml:104
417418msgid "Numbers and letters"
418−msgstr ""
419+msgstr "Sayı ve harfler"
419420
420421#: qml/Wizard/Pages/40-wifi.qml:28
421422msgid "Connect to Wi‑Fi"
422−msgstr ""
423+msgstr "Wi-Fi'ye Bağlan"
423424
424425#: qml/Wizard/Pages/40-wifi.qml:147
425426msgid "Available networks…"
426−msgstr ""
427+msgstr "Kullanılabilir ağlar..."
427428
428429#: qml/Wizard/Pages/40-wifi.qml:148
429430msgid "No available networks."
430−msgstr ""
431+msgstr "Kullanılabilir ağ yok."
431432
432433#: qml/Wizard/Pages/50-location.qml:27
433434msgid "Location"
434−msgstr ""
435+msgstr "Konum"
435436
436437#: qml/Wizard/Pages/50-location.qml:62
437438msgid "Let the phone detect your location:"
438−msgstr ""
439+msgstr "Telefonun konumunuzu bulmasına izin verin:"
439440
440441#: qml/Wizard/Pages/50-location.qml:69
441442msgid "Using GPS only (less accurate)"
442−msgstr ""
443+msgstr "Sadece GPS kullanarak (daha az kesinlik)"
443444
444445#: qml/Wizard/Pages/50-location.qml:86
445446msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
446447msgstr ""
448+"GPS, anonimleştirilmiş Wi-Fi ve cep telefonu ağı bilgileri kullanarak "
449+"(önerilir)"
447450
448451#. TRANSLATORS: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
449452#: qml/Wizard/Pages/50-location.qml:103
@@ -451,81 +454,88 @@ msgid ""
451454"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
452455"conditions</a>."
453456msgstr ""
457+"Bu seçeneği işaretleyerek Nokia HERE <a href='#'>koşul ve şartlarını</a>nı "
458+"kabul ediyorsunuz."
454459
455460#: qml/Wizard/Pages/50-location.qml:112
456461msgid "Not at all"
457−msgstr ""
462+msgstr "Etmiyorum"
458463
459464#: qml/Wizard/Pages/50-location.qml:124
460465msgid "You can change your mind later in <b>System Settings</b>."
461466msgstr ""
467+"Kararınızı daha sonra <b>Sistem Ayarları</b> içerisinden değiştirebilirsiniz."
462468
463469#: qml/Wizard/Pages/60-reporting.qml:24
464470msgid "Improving your experience"
465−msgstr ""
471+msgstr "Deneyiminizi arttırmak"
466472
467473#: qml/Wizard/Pages/60-reporting.qml:36
468474msgid ""
469475"Your phone is set up to automatically report errors to Canonical and its "
470476"partners, the makers of the operating system."
471477msgstr ""
478+"Telefonunuz, işletim sisteminin üreticileri olan Canonical ve ortaklarına "
479+"hataları otomatik olarak bildirmek üzere yapılandırıldı."
472480
473481#: qml/Wizard/Pages/60-reporting.qml:43
474482msgid ""
475483"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
476484"Privacy</b>"
477485msgstr ""
486+"Bu <b>Sistem Ayarları</b> içerisindeki <b>Güvenlik ve Gizlilik</b> altından "
487+"devre dışı bırakılabilir"
478488
479489#: qml/Wizard/Pages/80-finished.qml:24
480490msgid "All done"
481−msgstr ""
491+msgstr "Her şey tamam"
482492
483493#: qml/Wizard/Pages/80-finished.qml:39
484494msgid "Nice work!"
485−msgstr ""
495+msgstr "İyi iş!"
486496
487497#: qml/Wizard/Pages/80-finished.qml:46
488498msgid "Your phone is now ready to use."
489−msgstr ""
499+msgstr "Telefonunuz artık kullanıma hazır."
490500
491501#: qml/Wizard/Pages/80-finished.qml:53
492502msgid "Finish"
493−msgstr ""
503+msgstr "Son"
494504
495505#: qml/Wizard/Pages/here-terms.qml:27
496506msgid "Terms & Conditions"
497−msgstr ""
507+msgstr "Şartlar ve Koşullar"
498508
499509#: qml/Wizard/Pages/passwd-confirm.qml:49
500510msgid "Confirm passphrase"
501−msgstr ""
511+msgstr "Parolayı yinele"
502512
503513#: qml/Wizard/Pages/passwd-confirm.qml:50
504514msgid "Confirm passcode"
505−msgstr ""
515+msgstr "Parolayı yinele"
506516
507517#: qml/Wizard/Pages/passwd-confirm.qml:53
508518#: qml/Wizard/Pages/passwd-confirm.qml:54
509519msgid "Please try again."
510−msgstr ""
520+msgstr "Lütfen yeniden deneyin."
511521
512522#: qml/Wizard/Pages/passwd-set.qml:61
513523msgid "Choose your passcode"
514−msgstr ""
524+msgstr "Parolanızı seçin"
515525
516526#: qml/Wizard/Pages/passwd-set.qml:68
517527msgid "Passphrase must be 4 characters long"
518−msgstr ""
528+msgstr "Parola 4 karakter olmalı"
519529
520530#: qml/Wizard/StackButton.qml:39
521531#, qt-format
522532msgid "〈 %1"
523−msgstr ""
533+msgstr "〈 %1"
524534
525535#: qml/Wizard/StackButton.qml:42
526536#, qt-format
527537msgid "%1 〉"
528−msgstr ""
538+msgstr "%1 〉"
529539
530540#~ msgid "Confirm"
531541#~ msgstr "Onayla"
qml/Components/Carousel.qml+6−2
@@ -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
@@ -14,7 +14,7 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−import QtQuick 2.0
17+import QtQuick 2.3
1818import Ubuntu.Components 0.1
1919import "carousel.js" as CarouselJS
2020
@@ -38,6 +38,8 @@ Item {
3838 property alias tileAspectRatio: listView.tileAspectRatio
3939 /// Used to cache some delegates for performance reasons. See the ListView documentation for details
4040 property alias cacheBuffer: listView.cacheBuffer
41+ property alias displayMarginBeginning: listView.displayMarginBeginning
42+ property alias displayMarginEnd: listView.displayMarginEnd
4143 /// Width of the "draw buffer" in pixel. The drawBuffer is an additional area at start/end where
4244 /// items drawn, even if it is not in the visible area.
4345 /// cacheBuffer controls only the to retain delegates outside the visible area (and is used on top of the drawBuffer)
@@ -51,6 +53,8 @@ Item {
5153 readonly property alias currentItem: listView.currentItem
5254 /// exposes the distance to the next row (only one row in carousel, so it's the topMargins)
5355 readonly property alias verticalSpacing: listView.verticalMargin
56+ /// the width of the internal list
57+ readonly property alias innerWidth: listView.width
5458
5559 implicitHeight: listView.tileHeight * selectedItemScaleFactor
5660 opacity: listView.highlightIndex === -1 ? 1 : 0.6
qml/Dash/CardCarousel.qml+6−2
@@ -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
@@ -23,6 +23,8 @@ DashRenderer {
2323
2424 expandedHeight: carousel.implicitHeight + units.gu(6)
2525 collapsedHeight: expandedHeight
26+ growsVertically: false
27+ innerWidth: carousel.innerWidth
2628
2729 Carousel {
2830 id: carousel
@@ -32,7 +34,9 @@ DashRenderer {
3234 // and push others back.
3335 minimumTileWidth: cardTool.cardWidth / selectedItemScaleFactor
3436 selectedItemScaleFactor: cardTool.carouselSelectedItemScaleFactor
35− cacheBuffer: 1404 // 18px * 13gu * 6
37+ cacheBuffer: cardCarousel.cacheBuffer
38+ displayMarginBeginning: cardCarousel.displayMarginBeginning
39+ displayMarginEnd: cardCarousel.displayMarginEnd
3640 model: cardCarousel.model
3741
3842 property real fontScale: 1 / selectedItemScaleFactor
qml/Dash/CardHorizontalList.qml+7−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014-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
@@ -14,7 +14,7 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−import QtQuick 2.2
17+import QtQuick 2.3
1818import Ubuntu.Components 1.1
1919import "../Components"
2020
@@ -23,6 +23,8 @@ DashRenderer {
2323
2424 expandedHeight: cardTool.cardHeight + units.gu(2)
2525 collapsedHeight: expandedHeight
26+ growsVertically: false
27+ innerWidth: Math.max(0, listView.width)
2628 clip: true
2729
2830 ListView {
@@ -36,6 +38,9 @@ DashRenderer {
3638 spacing: units.gu(1)
3739 model: root.model
3840 orientation: ListView.Horizontal
41+ cacheBuffer: root.cacheBuffer
42+ displayMarginBeginning: root.displayMarginBeginning
43+ displayMarginEnd: root.displayMarginEnd
3944
4045 delegate: Loader {
4146 id: loader
qml/Dash/DashRenderer.qml+6−1
@@ -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
@@ -31,6 +31,11 @@ Item {
3131
3232 property real originY: 0
3333
34+ property bool growsVertically: true
35+
36+ // If growsVertically the width of the item inside the renderer
37+ property real innerWidth: 0
38+
3439 // The model to renderer
3540 property var model
3641
qml/Dash/GenericScopeView.qml+91−48
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013-2014 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
@@ -401,59 +401,102 @@ FocusScope {
401401 }
402402
403403 if (item && item.hasOwnProperty("displayMarginBeginning")) {
404− // A item view creates its delegates synchronously from
405− // -displayMarginBeginning
406− // to
407− // height + displayMarginEnd
408− // Around that area it adds the cacheBuffer area where delegates are created async
409− //
410− // We adjust displayMarginBeginning and displayMarginEnd so
411− // * In non visible scopes nothing is considered visible and we set cacheBuffer
412− // so that creates the items that would be in the viewport asynchronously
413− // * For the current scope set the visible range to the viewport and then
414− // use cacheBuffer to create extra items for categoryView.height * 1.5
415− // to make scrolling nicer by mantaining a higher number of
416− // cached items
417− // * For non current but visible scopes (i.e. when the user changes from one scope
418− // to the next, we set the visible range to the viewport so
419− // items are not culled (invisible) but still use no cacheBuffer
420− // (it will be set once the scope is the current one)
421− var displayMarginBeginning = baseItem.y;
422− displayMarginBeginning = -Math.max(-displayMarginBeginning, 0);
423− displayMarginBeginning = -Math.min(-displayMarginBeginning, baseItem.height);
424− displayMarginBeginning = Math.round(displayMarginBeginning);
425− var displayMarginEnd = -baseItem.height + seeAll.height + categoryView.height - baseItem.y;
426− displayMarginEnd = -Math.max(-displayMarginEnd, 0);
427− displayMarginEnd = -Math.min(-displayMarginEnd, baseItem.height);
428− displayMarginEnd = Math.round(displayMarginEnd);
429− if (scopeView.isCurrent || scopeView.visibleToParent) {
430− item.displayMarginBeginning = displayMarginBeginning;
431− item.displayMarginEnd = displayMarginEnd;
432− if (holdingList && holdingList.moving) {
433− // If we are moving we need to reset the cache buffer of the
434− // view that was not visible (i.e. !wasCurrentOnMoveStart) to 0 since
435− // otherwise the cache buffer we had set to preload the items of the
436− // visible range will trigger some item creations and we want move to
437− // be as smooth as possible meaning no need creations
438− if (!wasCurrentOnMoveStart) {
439− item.cacheBuffer = 0;
404+ if (item.growsVertically) {
405+ // A item view creates its delegates synchronously from
406+ // -displayMarginBeginning
407+ // to
408+ // height + displayMarginEnd
409+ // Around that area it adds the cacheBuffer area where delegates are created async
410+ //
411+ // We adjust displayMarginBeginning and displayMarginEnd so
412+ // * In non visible scopes nothing is considered visible and we set cacheBuffer
413+ // so that creates the items that would be in the viewport asynchronously
414+ // * For the current scope set the visible range to the viewport and then
415+ // use cacheBuffer to create extra items for categoryView.height * 1.5
416+ // to make scrolling nicer by mantaining a higher number of
417+ // cached items
418+ // * For non current but visible scopes (i.e. when the user changes from one scope
419+ // to the next, we set the visible range to the viewport so
420+ // items are not culled (invisible) but still use no cacheBuffer
421+ // (it will be set once the scope is the current one)
422+ var displayMarginBeginning = baseItem.y;
423+ displayMarginBeginning = -Math.max(-displayMarginBeginning, 0);
424+ displayMarginBeginning = -Math.min(-displayMarginBeginning, baseItem.height);
425+ displayMarginBeginning = Math.round(displayMarginBeginning);
426+ var displayMarginEnd = -baseItem.height + seeAll.height + categoryView.height - baseItem.y;
427+ displayMarginEnd = -Math.max(-displayMarginEnd, 0);
428+ displayMarginEnd = -Math.min(-displayMarginEnd, baseItem.height);
429+ displayMarginEnd = Math.round(displayMarginEnd);
430+
431+ if (scopeView.isCurrent || scopeView.visibleToParent) {
432+ item.displayMarginBeginning = displayMarginBeginning;
433+ item.displayMarginEnd = displayMarginEnd;
434+ if (holdingList && holdingList.moving) {
435+ // If we are moving we need to reset the cache buffer of the
436+ // view that was not visible (i.e. !wasCurrentOnMoveStart) to 0 since
437+ // otherwise the cache buffer we had set to preload the items of the
438+ // visible range will trigger some item creations and we want move to
439+ // be as smooth as possible meaning no need creations
440+ if (!wasCurrentOnMoveStart) {
441+ item.cacheBuffer = 0;
442+ }
443+ } else {
444+ item.cacheBuffer = categoryView.height * 1.5;
440445 }
441446 } else {
442− item.cacheBuffer = categoryView.height * 1.5;
447+ var visibleRange = baseItem.height + displayMarginEnd + displayMarginBeginning;
448+ if (visibleRange < 0) {
449+ item.displayMarginBeginning = displayMarginBeginning;
450+ item.displayMarginEnd = displayMarginEnd;
451+ item.cacheBuffer = 0;
452+ } else {
453+ // This should be visibleRange/2 in each of the properties
454+ // but some item views still (like GridView) like creating sync delegates even if
455+ // the visible range is 0 so let's make sure the visible range is negative
456+ item.displayMarginBeginning = displayMarginBeginning - visibleRange;
457+ item.displayMarginEnd = displayMarginEnd - visibleRange;
458+ item.cacheBuffer = visibleRange;
459+ }
443460 }
444461 } else {
445− var visibleRange = baseItem.height + displayMarginEnd + displayMarginBeginning;
446− if (visibleRange < 0) {
447− item.displayMarginBeginning = displayMarginBeginning;
448− item.displayMarginEnd = displayMarginEnd;
462+ var buffer = wasCurrentOnMoveStart ? categoryView.height * 1.5 : 0;
463+ var onViewport = baseItem.y + baseItem.height > 0 &&
464+ baseItem.y < categoryView.height;
465+ var onBufferViewport = baseItem.y + baseItem.height > -buffer &&
466+ baseItem.y < categoryView.height + buffer;
467+ if (!onBufferViewport) {
468+ // If not on the buffered viewport, don't load anything
469+ item.displayMarginBeginning = 0;
470+ item.displayMarginEnd = -item.innerWidth;
449471 item.cacheBuffer = 0;
450472 } else {
451− // This should be visibleRange/2 in each of the properties
452− // but some item views still (like GridView) like creating sync delegates even if
453− // the visible range is 0 so let's make sure the visible range is negative
454− item.displayMarginBeginning = displayMarginBeginning - visibleRange;
455− item.displayMarginEnd = displayMarginEnd - visibleRange;
456− item.cacheBuffer = visibleRange;
473+ if (onViewport && (scopeView.isCurrent || scopeView.visibleToParent)) {
474+ // If on the buffered viewport and the viewport and the on a visible scope
475+ // Set displayMargin so that cards are rendered
476+ // And if not moving the parent list also give it some extra asynchronously
477+ // buffering
478+ item.displayMarginBeginning = 0;
479+ item.displayMarginEnd = 0;
480+ if (holdingList && holdingList.moving) {
481+ // If we are moving we need to reset the cache buffer of the
482+ // view that was not visible (i.e. !wasCurrentOnMoveStart) to 0 since
483+ // otherwise the cache buffer we had set to preload the items of the
484+ // visible range will trigger some item creations and we want move to
485+ // be as smooth as possible meaning no need creations
486+ if (!wasCurrentOnMoveStart) {
487+ item.cacheBuffer = 0;
488+ }
489+ } else {
490+ item.cacheBuffer = baseItem.width * 1.5;
491+ }
492+ } else {
493+ // If on the buffered viewport but either not in the real viewport
494+ // or in the viewport of the non current scope, use displayMargin + cacheBuffer
495+ // to render asynchronously the width of cards
496+ item.displayMarginBeginning = 0;
497+ item.displayMarginEnd = -item.innerWidth;
498+ item.cacheBuffer = item.innerWidth;
499+ }
457500 }
458501 }
459502 }
qml/Greeter/Greeter.qml+8
@@ -30,6 +30,9 @@ Showable {
3030
3131 property url background
3232
33+ // so that it can be replaced in tests with a mock object
34+ property var inputMethod: Qt.inputMethod
35+
3336 prepareToHide: function () {
3437 hideTranslation.to = greeter.x > 0 || d.forceRightOnNextHideAnimation ? greeter.width : -greeter.width;
3538 d.forceRightOnNextHideAnimation = false;
@@ -102,6 +105,11 @@ Showable {
102105 }
103106 onUnlocked: greeter.unlocked(uid);
104107 }
108+ Binding {
109+ target: greeterContentLoader.item
110+ property: "inputMethod"
111+ value: greeter.inputMethod
112+ }
105113 }
106114
107115 DragHandle {
qml/Greeter/GreeterContent.qml+6−2
@@ -24,6 +24,8 @@ Item {
2424 id: root
2525 anchors.fill: parent
2626
27+ property var inputMethod
28+
2729 property bool ready: background.source == "" || background.status == Image.Ready || background.status == Image.Error
2830
2931 signal selected(int uid)
@@ -74,10 +76,12 @@ Item {
7476 anchors {
7577 left: parent.left
7678 leftMargin: Math.min(parent.width * 0.16, units.gu(20))
77− verticalCenter: parent.verticalCenter
79+ top: parent.top
7880 }
7981 width: units.gu(29)
80− height: parent.height
82+ height: inputMethod && inputMethod.visible ? parent.height - inputMethod.keyboardRectangle.height
83+ : parent.height
84+ Behavior on height { UbuntuNumberAnimation {} }
8185
8286 // TODO: Once we have a system API for determining which mode we are
8387 // in, tablet/phone/desktop, that should be used instead of narrowMode.
qml/Shell.qml+1−1
@@ -420,7 +420,7 @@ Item {
420420 onShownChanged: if (shown) greeter.lockedApp = ""
421421
422422 function maybeShow() {
423− if (!shell.forcedUnlock) {
423+ if (!shell.forcedUnlock && !shown) {
424424 showNow();
425425 }
426426 }
qml/Wizard/Pages.qml+2
@@ -41,6 +41,8 @@ Item {
4141 }
4242
4343 function quitWizard() {
44+ pageStack.currentPage.enabled = false;
45+
4446 var errorMsg = securityPrivacy.setSecurity("", password, passwordMethod)
4547 if (errorMsg !== "") {
4648 // Ignore (but log) any errors, since we're past where the user set
qml/Wizard/Pages/40-wifi.qml+27−9
@@ -16,6 +16,7 @@
1616
1717import QtQuick 2.0
1818import QMenuModel 0.1 as QMenuModel
19+import QtSystemInfo 5.0
1920import Ubuntu.Components 0.1
2021import Ubuntu.Components.ListItems 0.1 as ListItem
2122import Ubuntu.Settings.Menus 0.1 as Menus
@@ -28,7 +29,7 @@ LocalComponents.Page {
2829 title: i18n.tr("Connect to Wi‑Fi")
2930 forwardButtonSourceComponent: forwardButton
3031
31− readonly property bool connected: mainMenu.connectedAPs === 1
32+ readonly property bool connected: networkInfo.accessPointName
3233
3334 function getExtendedProperty(object, propertyName, defaultValue) {
3435 if (object && object.hasOwnProperty(propertyName)) {
@@ -44,6 +45,31 @@ LocalComponents.Page {
4445 menuObjectPath: "/com/canonical/indicator/network/phone_wifi_settings"
4546 }
4647
48+ NetworkInfo {
49+ id: networkInfo
50+
51+ property string accessPointName
52+
53+ monitorCurrentNetworkMode: true
54+ monitorNetworkName: true
55+ monitorNetworkStatus: true
56+
57+ onCurrentNetworkModeChanged: getAccessPointName()
58+ onNetworkNameChanged: getAccessPointName()
59+ onNetworkStatusChanged: if (status !== NetworkInfo.HomeNetwork) accessPointName = ""
60+
61+ Component.onCompleted: getAccessPointName()
62+
63+ function getAccessPointName() {
64+ // 0 is the interface
65+ if (currentNetworkMode === NetworkInfo.WlanMode &&
66+ networkStatus(NetworkInfo.WlanMode, 0) === NetworkInfo.HomeNetwork)
67+ accessPointName = networkName(NetworkInfo.WlanMode, 0);
68+ else
69+ accessPointName = "";
70+ }
71+ }
72+
4773 Component {
4874 id: accessPointComponent
4975 ListItem.Standard {
@@ -119,11 +145,6 @@ LocalComponents.Page {
119145 onCheckedChanged: {
120146 // Can't rely on binding. Checked is assigned on click.
121147 checkBoxActive.checked = checked;
122− if (checked) {
123− mainMenu.connectedAPs++
124− } else {
125− mainMenu.connectedAPs--
126− }
127148 }
128149 onActivate: unityMenuModel.activate(menuIndex);
129150 }
@@ -165,9 +186,6 @@ LocalComponents.Page {
165186 Repeater {
166187 id: mainMenu
167188
168− // FIXME Check connection better https://bugs.launchpad.net/indicator-network/+bug/1349371
169− property int connectedAPs: 0
170−
171189 model: menuModel
172190
173191 delegate: Loader {
run.sh+3−26
@@ -6,8 +6,6 @@ export QML2_IMPORT_PATH
66QML_PHONE_SHELL_PATH=./builddir/src/unity8
77GDB=false
88FAKE=false
9−PINLOCK=false
10−KEYLOCK=false
119USE_MOCKS=false
1210MOUSE_TOUCH=true
1311
@@ -16,9 +14,6 @@ usage() {
1614 echo "Script to run the shell.\n" >&2
1715 echo "OPTIONS:" >&2
1816 echo " -f, --fake Force use of fake Qml modules." >&2
19− echo " -p, --pinlock Use a pin protected user." >&2
20− echo " -k, --keylock Use a passphrase protected user." >&2
21− echo " -l, --lightdm Use the specified lightdm mock." >&2
2217 echo " -g, --gdb Run through gdb." >&2
2318 echo " -h, --help Show this help." >&2
2419 echo " -m, --nomousetouch Run without -mousetouch argument." >&2
@@ -26,7 +21,7 @@ usage() {
2621 exit 1
2722}
2823
29−ARGS=`getopt -n$0 -u -a --longoptions="fake,pinlock,keylock,gdb,help,lightdm:,nomousetouch" -o "fpkl:ghm" -- "$@"`
24+ARGS=`getopt -n$0 -u -a --longoptions="fake,gdb,help:,nomousetouch" -o "fghm" -- "$@"`
3025[ $? -ne 0 ] && usage
3126eval set -- "$ARGS"
3227
@@ -34,12 +29,6 @@ while [ $# -gt 0 ]
3429do
3530 case "$1" in
3631 -f|--fake) USE_MOCKS=true;;
37− -p|--pinlock) USE_MOCKS=true; LIGHTDM_MOCK=single-pin;;
38− -k|--keylock) USE_MOCKS=true; LIGHTDM_MOCK=single-passphrase;;
39− -l|--lightdm) LIGHTDM_MOCK=$2; shift;
40− if [ -z "$LIGHTDM_MOCK" ]; then
41− echo "Please specify an argument to --lightdm"
42− fi;;
4332 -g|--gdb) GDB=true;;
4433 -h|--help) usage;;
4534 -m|--nomousetouch) MOUSE_TOUCH=false;;
@@ -48,23 +37,11 @@ do
4837 shift
4938done
5039
51−if [ -z "$LIGHTDM_MOCK" ]; then
52− LIGHTDM_MOCK=single
53−fi
54−
55−# Even without USE_MOCKS set, we want to fake our lightdm backend, because it's
56−# annoying to be prompted for your password when testing. To get the same
57−# backend used in production, pass '--lightdm=demo'.
58−export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/LightDM/$LIGHTDM_MOCK
59−
6040if $USE_MOCKS; then
61− rm -f $PWD/builddir/nonmirplugins/LightDM # undo symlink (from below) for cleanliness
6241 export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
63− export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/QMenuModel
42+ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/LightDM/liblightdm:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/QMenuModel
6443else
65− # Just link our LightDM mock into the nonmirplugins folder. We don't want
66− # the rest of our plugins to be used.
67− ln -sf $PWD/builddir/tests/mocks/LightDM $PWD/builddir/nonmirplugins/
44+ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/plugins/LightDM/liblightdm
6845fi
6946
7047QML_PHONE_SHELL_ARGS=""
tests/autopilot/unity8/shell/__init__.py−13
@@ -27,19 +27,6 @@ import logging
2727
2828logger = logging.getLogger(__name__)
2929
30−
31−def with_lightdm_mock(mock_type):
32− """A simple decorator that sets up the LightDM mock for a single test."""
33− def with_lightdm_mock_internal(fn):
34− @wraps(fn)
35− def wrapper(*args, **kwargs):
36− tests_self = args[0]
37− tests_self.patch_lightdm_mock(mock_type)
38− return fn(*args, **kwargs)
39− return wrapper
40− return with_lightdm_mock_internal
41−
42−
4330def disable_qml_mocking(fn):
4431 """Simple decorator that disables the QML mocks from being loaded."""
4532 @wraps(fn)
tests/autopilot/unity8/shell/tests/__init__.py+8−11
@@ -153,7 +153,6 @@ class UnityTestCase(AutopilotTestCase):
153153 self.useFixture(toolkit_fixtures.HideUnity7Launcher())
154154
155155 self._proxy = None
156− self._lightdm_mock_type = None
157156 self._qml_mock_enabled = True
158157 self._data_dirs_mock_enabled = True
159158 self._environment = {}
@@ -265,8 +264,7 @@ class UnityTestCase(AutopilotTestCase):
265264 binary_path
266265 )
267266
268− if self._lightdm_mock_type is None:
269− self.patch_lightdm_mock()
267+ self.patch_lightdm_mock()
270268
271269 if self._qml_mock_enabled:
272270 self._environment['QML2_IMPORT_PATH'] = (
@@ -338,12 +336,11 @@ class UnityTestCase(AutopilotTestCase):
338336 if data_dirs is not None:
339337 self._environment['XDG_DATA_DIRS'] = data_dirs
340338
341− def patch_lightdm_mock(self, mock_type='single'):
342− self._lightdm_mock_type = mock_type
343− logger.info("Setting up LightDM mock type '%s'", mock_type)
339+ def patch_lightdm_mock(self):
340+ logger.info("Setting up LightDM mock lib")
344341 new_ld_library_path = [
345342 get_default_extra_mock_libraries(),
346− self._get_lightdm_mock_path(mock_type)
343+ self._get_lightdm_mock_path()
347344 ]
348345 if os.getenv('LD_LIBRARY_PATH') is not None:
349346 new_ld_library_path.append(os.getenv('LD_LIBRARY_PATH'))
@@ -353,16 +350,16 @@ class UnityTestCase(AutopilotTestCase):
353350
354351 self._environment['LD_LIBRARY_PATH'] = new_ld_library_path
355352
356− def _get_lightdm_mock_path(self, mock_type):
353+ def _get_lightdm_mock_path(self):
357354 lib_path = get_mocks_library_path()
358355 lightdm_mock_path = os.path.abspath(
359− os.path.join(lib_path, "LightDM", mock_type)
356+ os.path.join(lib_path, "LightDM", "liblightdm")
360357 )
361358
362359 if not os.path.exists(lightdm_mock_path):
363360 raise RuntimeError(
364− "LightDM mock '%s' does not exist at path '%s'."
365− % (mock_type, lightdm_mock_path)
361+ "LightDM mock does not exist at path '%s'."
362+ % (lightdm_mock_path)
366363 )
367364 return lightdm_mock_path
368365
tests/autopilot/unity8/shell/tests/test_edges_demo.py−1
@@ -34,7 +34,6 @@ class EdgesDemoTestCase(tests.UnityTestCase):
3434 super(EdgesDemoTestCase, self).setUp()
3535 self._qml_mock_enabled = False
3636 self._data_dirs_mock_enabled = False
37− self._lightdm_mock_type = False
3837
3938 self.useFixture(fixture_setup.EdgesDemo(True))
4039 self.unity = self.launch_unity()
tests/autopilot/unity8/shell/tests/test_lock_screen.py+6−5
@@ -20,7 +20,6 @@
2020
2121from __future__ import absolute_import
2222
23−from unity8.shell import with_lightdm_mock
2423from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
2524
2625from autopilot.matchers import Eventually
@@ -41,9 +40,10 @@ class TestLockscreen(UnityTestCase):
4140
4241 scenarios = _get_device_emulation_scenarios()
4342
44− @with_lightdm_mock("single-pin")
4543 def test_can_unlock_pin_screen(self):
4644 """Must be able to unlock the PIN entry lock screen."""
45+
46+ self._environment['LIBLIGHTDM_MOCK_MODE'] = "single-pin"
4747 self.launch_unity()
4848 greeter = self.main_window.get_greeter()
4949
@@ -56,9 +56,10 @@ class TestLockscreen(UnityTestCase):
5656 self._enter_prompt_passphrase("1234\n")
5757 self.assertThat(greeter.shown, Eventually(Equals(False)))
5858
59− @with_lightdm_mock("single-passphrase")
6059 def test_can_unlock_passphrase_screen(self):
6160 """Must be able to unlock the passphrase entry screen."""
61+
62+ self._environment['LIBLIGHTDM_MOCK_MODE'] = "single-passphrase"
6263 self.launch_unity()
6364 greeter = self.main_window.get_greeter()
6465
@@ -71,9 +72,9 @@ class TestLockscreen(UnityTestCase):
7172 self._enter_prompt_passphrase("password")
7273 self.assertThat(greeter.shown, Eventually(Equals(False)))
7374
74− @with_lightdm_mock("single-pin")
7575 def test_pin_screen_wrong_code(self):
7676 """Entering the wrong pin code must not dismiss the lock screen."""
77+ self._environment['LIBLIGHTDM_MOCK_MODE'] = "single-pin"
7778 self.launch_unity()
7879 greeter = self.main_window.get_greeter()
7980
@@ -90,9 +91,9 @@ class TestLockscreen(UnityTestCase):
9091 self.assertThat(prompt.text, Eventually(Equals("")))
9192 self.assertThat(greeter.shown, Eventually(Equals(True)))
9293
93− @with_lightdm_mock("single-passphrase")
9494 def test_passphrase_screen_wrong_password(self):
9595 """Entering the wrong password must not dismiss the lock screen."""
96+ self._environment['LIBLIGHTDM_MOCK_MODE'] = "single-passphrase"
9697 self.launch_unity()
9798 greeter = self.main_window.get_greeter()
9899
tests/mocks/LightDM/CMakeLists.txt+8−9
@@ -4,16 +4,13 @@
44# actually using the system liblightdm in the normal plugin, this version can
55# be deleted.
66
7−add_subdirectory(demo)
8−add_subdirectory(full)
9−add_subdirectory(single)
10−add_subdirectory(single-pin)
11−add_subdirectory(single-passphrase)
7+add_subdirectory(liblightdm)
128
139include_directories(
1410 ${CMAKE_CURRENT_SOURCE_DIR}
1511 ${CMAKE_CURRENT_BINARY_DIR}
1612 ${CMAKE_SOURCE_DIR}/plugins/Utils
13+ ${CMAKE_SOURCE_DIR}/plugins/LightDM
1714 ${CMAKE_SOURCE_DIR}/tests/mocks/libusermetrics
1815 ${libunity8-private_SOURCE_DIR}
1916)
@@ -22,9 +19,11 @@ set(QMLPLUGIN_SRC
2219 ${CMAKE_SOURCE_DIR}/plugins/LightDM/DBusGreeter.cpp
2320 ${CMAKE_SOURCE_DIR}/plugins/LightDM/DBusGreeterList.cpp
2421 ${CMAKE_SOURCE_DIR}/plugins/LightDM/Greeter.cpp
25− ${CMAKE_SOURCE_DIR}/plugins/LightDM/plugin.cpp
2622 ${CMAKE_SOURCE_DIR}/plugins/LightDM/UsersModel.cpp
2723 ${CMAKE_SOURCE_DIR}/plugins/Utils/unitysortfilterproxymodelqml.cpp
24+ MockGreeter.cpp
25+ MockUsersModel.cpp
26+ plugin.cpp
2827 )
2928
3029add_library(MockLightDM-qml MODULE
@@ -35,9 +34,9 @@ add_library(MockLightDM-qml MODULE
3534# installed on the system. So we make sure we link to our full fake version
3635# At run time, we can point to whichever version we happen to be using via
3736# LD_LIBRARY_PATH.
38−add_dependencies(MockLightDM-qml MockLightDM-full MockUserMetrics)
37+add_dependencies(MockLightDM-qml MockLightDM MockUserMetrics)
3938target_link_libraries(MockLightDM-qml
40− -L${CMAKE_CURRENT_BINARY_DIR}/full
39+ -L${CMAKE_CURRENT_BINARY_DIR}/liblightdm
4140 -llightdm-qt5-2
4241 -L${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics
4342 -lusermetricsoutput
@@ -49,5 +48,5 @@ qt5_use_modules(MockLightDM-qml DBus Gui Qml)
4948add_unity8_mock(LightDM 0.1 LightDM
5049 PREFIX mocks
5150 TARGETS MockLightDM-qml
52− ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_CURRENT_BINARY_DIR}/full"
51+ ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_CURRENT_BINARY_DIR}/liblightdm"
5352)
tests/mocks/LightDM/single/UsersModelPrivate.cpp → tests/mocks/LightDM/MockGreeter.cpprenamed+13−11
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 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,21 +13,23 @@
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− * Author: Michael Terry <michael.terry@canonical.com>
1716 */
1817
19−#include "../UsersModelPrivate.h"
18+#include "MockGreeter.h"
19+#include <GreeterPrivate.h>
2020
21−namespace QLightDM
21+QString MockGreeter::mockMode() const
2222{
23+ Q_D(const Greeter);
24+ return d->m_greeter->mockMode();
25+}
2326
24−UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
25− : q_ptr(parent)
27+void MockGreeter::setMockMode(QString mockMode)
2628{
27− entries =
28− {
29− { "single", "Single User", 0, 0, false, false, 0, 0 },
30− };
31−}
29+ Q_D(Greeter);
3230
31+ if (d->m_greeter->mockMode() != mockMode) {
32+ d->m_greeter->setMockMode(mockMode);
33+ Q_EMIT mockModeChanged(mockMode);
34+ }
3335}
tests/mocks/LightDM/MockGreeter.hnew file+37
@@ -0,0 +1,37 @@
1+/*
2+ * Copyright (C) 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+
18+// The real, production, Greeter
19+#include <Greeter.h>
20+
21+#ifndef MOCK_UNITY_GREETER_H
22+#define MOCK_UNITY_GREETER_H
23+
24+class MockGreeter : public Greeter {
25+ Q_OBJECT
26+
27+ Q_PROPERTY(QString mockMode READ mockMode WRITE setMockMode NOTIFY mockModeChanged)
28+
29+public:
30+ QString mockMode() const;
31+ void setMockMode(QString mockMode);
32+
33+Q_SIGNALS:
34+ void mockModeChanged(QString mode);
35+};
36+
37+#endif // MOCK_UNITY_GREETER_H
tests/mocks/LightDM/MockUsersModel.cppnew file+39
@@ -0,0 +1,39 @@
1+/*
2+ * Copyright (C) 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+
18+#include "MockUsersModel.h"
19+#include <QLightDM/UsersModel>
20+#include <QSortFilterProxyModel>
21+
22+QString MockUsersModel::mockMode() const
23+{
24+ QLightDM::UsersModel* qUsersModel =
25+ static_cast<QLightDM::UsersModel*>(static_cast<QSortFilterProxyModel*>(sourceModel())->sourceModel());
26+
27+ return qUsersModel->mockMode();
28+}
29+
30+void MockUsersModel::setMockMode(QString mockMode)
31+{
32+ QLightDM::UsersModel* qUsersModel =
33+ static_cast<QLightDM::UsersModel*>(static_cast<QSortFilterProxyModel*>(sourceModel())->sourceModel());
34+
35+ if (qUsersModel->mockMode() != mockMode) {
36+ qUsersModel->setMockMode(mockMode);
37+ Q_EMIT mockModeChanged(mockMode);
38+ }
39+}
tests/mocks/LightDM/single/GreeterPrivate.cpp → tests/mocks/LightDM/MockUsersModel.hrenamed+14−23
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 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,34 +13,25 @@
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− * Author: Michael Terry <michael.terry@canonical.com>
1716 */
1817
19−#include "../Greeter.h"
20−#include "../GreeterPrivate.h"
18+#ifndef MOCK_UNITY_USERSMODEL_H
19+#define MOCK_UNITY_USERSMODEL_H
2120
22−namespace QLightDM
23−{
21+#include <UsersModel.h>
2422
25−GreeterPrivate::GreeterPrivate(Greeter* parent)
26− : authenticated(false),
27− authenticationUser(),
28− twoFactorDone(false),
29− q_ptr(parent)
23+class MockUsersModel : public UsersModel
3024{
31−}
25+ Q_OBJECT
3226
33−void GreeterPrivate::handleAuthenticate()
34−{
35− Q_Q(Greeter);
27+ Q_PROPERTY(QString mockMode READ mockMode WRITE setMockMode NOTIFY mockModeChanged)
3628
37− authenticated = true;
38− Q_EMIT q->authenticationComplete();
39−}
29+public:
30+ QString mockMode() const;
31+ void setMockMode(QString mockMode);
4032
41−void GreeterPrivate::handleRespond(QString const &response)
42−{
43− Q_UNUSED(response)
44−}
33+Q_SIGNALS:
34+ void mockModeChanged(QString mode);
35+};
4536
46−}
37+#endif // MOCK_UNITY_USERSMODEL_H
tests/mocks/LightDM/QLightDM/Greetermode 120000 → 100644+17−1
@@ -1 +0,0 @@
1−../Greeter.h
@@ -0,0 +1,17 @@
1+/*
2+ * Copyright (C) 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+#include "../liblightdm/Greeter.h"
tests/mocks/LightDM/QLightDM/InfographicModeldeleted−1
@@ -1 +0,0 @@
1−../InfographicModel.h
tests/mocks/LightDM/QLightDM/UsersModelmode 120000 → 100644+17−1
@@ -1 +0,0 @@
1−../UsersModel.h
@@ -0,0 +1,17 @@
1+/*
2+ * Copyright (C) 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+#include "../liblightdm/UsersModel.h"
tests/mocks/LightDM/full/CMakeLists.txtdeleted−18
@@ -1,18 +0,0 @@
1−set(LibLightDM_SOURCES
2− ../Greeter.cpp
3− ../UsersModel.cpp
4− GreeterPrivate.cpp
5− UsersModelPrivate.cpp
6− ${CMAKE_SOURCE_DIR}/plugins/Utils/qvariantlistmodel.cpp
7− )
8−
9−add_library(MockLightDM-full SHARED ${LibLightDM_SOURCES})
10−
11−qt5_use_modules(MockLightDM-full Gui)
12−
13−set_target_properties(MockLightDM-full PROPERTIES
14− OUTPUT_NAME lightdm-qt5-2)
15−
16−install(TARGETS MockLightDM-full
17− DESTINATION ${SHELL_INSTALL_QML}/mocks/LightDM/full
18− )
tests/mocks/LightDM/liblightdm/CMakeLists.txtnew file+18
@@ -0,0 +1,18 @@
1+set(LibLightDM_SOURCES
2+ Greeter.cpp
3+ UsersModel.cpp
4+ GreeterPrivate.cpp
5+ UsersModelPrivate.cpp
6+ ${CMAKE_SOURCE_DIR}/plugins/Utils/qvariantlistmodel.cpp
7+ )
8+
9+add_library(MockLightDM SHARED ${LibLightDM_SOURCES})
10+
11+qt5_use_modules(MockLightDM Gui)
12+
13+set_target_properties(MockLightDM PROPERTIES
14+ OUTPUT_NAME lightdm-qt5-2)
15+
16+install(TARGETS MockLightDM
17+ DESTINATION ${SHELL_INSTALL_QML}/mocks/LightDM/liblightdm
18+ )
tests/mocks/LightDM/liblightdm/Greeter.cppnew file+199
@@ -0,0 +1,199 @@
1+/*
2+ * Copyright (C) 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+#include "Greeter.h"
18+#include "GreeterPrivate.h"
19+#include <QtCore/QCoreApplication>
20+#include <QTimer>
21+
22+namespace QLightDM
23+{
24+
25+Greeter::Greeter(QObject *parent)
26+ : QObject(parent),
27+ d_ptr(new GreeterPrivate(this))
28+{
29+}
30+
31+Greeter::~Greeter()
32+{
33+}
34+
35+QString Greeter::authenticationUser() const
36+{
37+ Q_D(const Greeter);
38+ return d->authenticationUser;
39+}
40+
41+bool Greeter::hasGuestAccountHint() const
42+{
43+ return true;
44+}
45+
46+QString Greeter::getHint(const QString &name) const
47+{
48+ Q_UNUSED(name)
49+ return "";
50+}
51+
52+QString Greeter::defaultSessionHint() const
53+{
54+ return "ubuntu";
55+}
56+
57+bool Greeter::hideUsersHint() const
58+{
59+ return false;
60+}
61+
62+bool Greeter::showManualLoginHint() const
63+{
64+ return true;
65+}
66+
67+bool Greeter::showRemoteLoginHint() const
68+{
69+ return true;
70+}
71+
72+bool Greeter::lockHint () const
73+{
74+ return false;
75+}
76+
77+QString Greeter::selectUserHint() const
78+{
79+ return "";
80+}
81+
82+bool Greeter::selectGuestHint() const
83+{
84+ return false;
85+}
86+
87+QString Greeter::autologinUserHint() const
88+{
89+ return "";
90+}
91+
92+bool Greeter::autologinGuestHint() const
93+{
94+ return false;
95+}
96+
97+int Greeter::autologinTimeoutHint() const
98+{
99+ return 0;
100+}
101+
102+bool Greeter::inAuthentication() const
103+{
104+ return false;
105+}
106+
107+QString Greeter::hostname() const
108+{
109+ return "hostname1";
110+}
111+
112+bool Greeter::isAuthenticated() const
113+{
114+ Q_D(const Greeter);
115+ return d->authenticated;
116+}
117+
118+bool Greeter::connectSync()
119+{
120+ return true;
121+}
122+
123+void Greeter::authenticate(const QString &username)
124+{
125+ Q_D(Greeter);
126+
127+ d->authenticated = false;
128+ d->authenticationUser = username;
129+ d->twoFactorDone = false;
130+ QTimer::singleShot(0, this, SLOT(delayedAuthentication()));
131+}
132+
133+void Greeter::delayedAuthentication()
134+{
135+ Q_D(Greeter);
136+ d->handleAuthenticate();
137+}
138+
139+void Greeter::authenticateAsGuest()
140+{}
141+
142+void Greeter::authenticateAutologin()
143+{}
144+
145+void Greeter::authenticateRemote(const QString &session, const QString &username)
146+{
147+ Q_UNUSED(session)
148+ Q_UNUSED(username)
149+}
150+
151+void Greeter::cancelAuthentication()
152+{}
153+
154+void Greeter::setLanguage (const QString &language)
155+{
156+ Q_UNUSED(language)
157+}
158+
159+bool Greeter::startSessionSync(const QString &session)
160+{
161+ Q_UNUSED(session)
162+ return true;
163+}
164+
165+void Greeter::respond(const QString &response)
166+{
167+ Q_D(Greeter);
168+
169+ d->handleRespond(response);
170+}
171+
172+void Greeter::sendAuthenticationComplete()
173+{
174+ if (qgetenv("UNITY_TESTING").isEmpty()) {
175+ // simulate PAM's delay
176+ QTimer::singleShot(1000, this, SIGNAL(authenticationComplete()));
177+ } else {
178+ Q_EMIT authenticationComplete();
179+ }
180+}
181+
182+QString Greeter::mockMode() const
183+{
184+ Q_D(const Greeter);
185+ return d->mockMode;
186+}
187+
188+
189+void Greeter::setMockMode(QString mockMode)
190+{
191+ Q_D(Greeter);
192+
193+ if (d->mockMode != mockMode) {
194+ d->mockMode = mockMode;
195+ Q_EMIT mockModeChanged(mockMode);
196+ }
197+}
198+
199+}
tests/mocks/LightDM/liblightdm/Greeter.hnew file+118
@@ -0,0 +1,118 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ * Copyright (C) 2010-2011 David Edmundson.
4+ * Copyright (C) 2010-2011 Robert Ancell
5+ *
6+ * This program is free software; you can redistribute it and/or modify
7+ * it under the terms of the GNU General Public License as published by
8+ * the Free Software Foundation; version 3.
9+ *
10+ * This program is distributed in the hope that it will be useful,
11+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+ * GNU General Public License for more details.
14+ *
15+ * You should have received a copy of the GNU General Public License
16+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17+ *
18+ * Author: David Edmundson <kde@davidedmundson.co.uk>
19+ */
20+
21+#ifndef UNITY_MOCK_GREETER_H
22+#define UNITY_MOCK_GREETER_H
23+
24+#include <QtCore/QObject>
25+#include <QtCore/QVariant>
26+
27+
28+namespace QLightDM
29+{
30+ class GreeterPrivate;
31+
32+class Q_DECL_EXPORT Greeter : public QObject
33+{
34+ Q_OBJECT
35+
36+ Q_PROPERTY(bool authenticated READ isAuthenticated ) //NOTFIY authenticationComplete
37+ Q_PROPERTY(QString authenticationUser READ authenticationUser )
38+ Q_PROPERTY(QString defaultSession READ defaultSessionHint CONSTANT)
39+ Q_PROPERTY(QString selectUser READ selectUserHint CONSTANT)
40+ Q_PROPERTY(bool selectGuest READ selectGuestHint CONSTANT)
41+
42+ Q_PROPERTY(QString hostname READ hostname CONSTANT)
43+ Q_PROPERTY(bool hasGuestAccount READ hasGuestAccountHint CONSTANT)
44+ Q_PROPERTY(bool locked READ lockHint CONSTANT)
45+
46+ Q_PROPERTY(QString hostname READ hostname CONSTANT)
47+
48+ Q_ENUMS(PromptType MessageType)
49+
50+ //Mock-only API for testing purposes
51+ Q_PROPERTY(QString mockMode READ mockMode WRITE setMockMode NOTIFY mockModeChanged)
52+
53+public:
54+ enum PromptType {
55+ PromptTypeQuestion,
56+ PromptTypeSecret
57+ };
58+
59+ enum MessageType {
60+ MessageTypeInfo,
61+ MessageTypeError
62+ };
63+
64+ explicit Greeter(QObject* parent=0);
65+ virtual ~Greeter();
66+
67+ QString getHint(const QString &name) const;
68+ QString defaultSessionHint() const;
69+ bool hideUsersHint() const;
70+ bool showManualLoginHint() const;
71+ bool showRemoteLoginHint() const;
72+ bool lockHint () const;
73+ bool hasGuestAccountHint() const;
74+ QString selectUserHint() const;
75+ bool selectGuestHint() const;
76+ QString autologinUserHint() const;
77+ bool autologinGuestHint() const;
78+ int autologinTimeoutHint() const;
79+
80+ bool inAuthentication() const;
81+ bool isAuthenticated() const;
82+ QString authenticationUser() const;
83+ QString hostname() const;
84+
85+ QString mockMode() const;
86+ void setMockMode(QString mockMode);
87+
88+public Q_SLOTS:
89+ bool connectSync();
90+ void authenticate(const QString &username=QString());
91+ void authenticateAsGuest();
92+ void authenticateAutologin();
93+ void authenticateRemote(const QString &session=QString(), const QString &username=QString());
94+ void respond(const QString &response);
95+ void cancelAuthentication();
96+ void setLanguage (const QString &language);
97+ bool startSessionSync(const QString &session=QString());
98+
99+Q_SIGNALS:
100+ void showMessage(QString text, QLightDM::Greeter::MessageType type);
101+ void showPrompt(QString text, QLightDM::Greeter::PromptType type);
102+ void authenticationComplete();
103+ void autologinTimerExpired();
104+ void mockModeChanged(QString mode);
105+
106+protected:
107+ void sendAuthenticationComplete();
108+
109+private Q_SLOTS:
110+ void delayedAuthentication();
111+
112+private:
113+ GreeterPrivate *d_ptr;
114+ Q_DECLARE_PRIVATE(Greeter)
115+};
116+}
117+
118+#endif // UNITY_MOCK_GREETER_H
tests/mocks/LightDM/full/GreeterPrivate.cpp → tests/mocks/LightDM/liblightdm/GreeterPrivate.cpprenamed+40−6
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 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
@@ -12,12 +12,10 @@
1212 *
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/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
1715 */
1816
19−#include "../Greeter.h"
20−#include "../GreeterPrivate.h"
17+#include "Greeter.h"
18+#include "GreeterPrivate.h"
2119
2220namespace QLightDM
2321{
@@ -26,14 +24,33 @@ GreeterPrivate::GreeterPrivate(Greeter* parent)
2624 : authenticated(false),
2725 authenticationUser(),
2826 twoFactorDone(false),
27+ mockMode("single"),
2928 q_ptr(parent)
3029{
30+ char *envMockMode = getenv("LIBLIGHTDM_MOCK_MODE");
31+ if (envMockMode) {
32+ mockMode = envMockMode;
33+ }
3134}
3235
3336void GreeterPrivate::handleAuthenticate()
3437{
3538 Q_Q(Greeter);
3639
40+ if (mockMode == "single") {
41+ authenticated = true;
42+ Q_EMIT q->authenticationComplete();
43+ } else if (mockMode == "single-passphrase" || mockMode == "single-pin") {
44+ Q_EMIT q->showPrompt("Password: ", Greeter::PromptTypeSecret);
45+ } else if (mockMode == "full") {
46+ handleAuthenticate_full();
47+ }
48+}
49+
50+void GreeterPrivate::handleAuthenticate_full()
51+{
52+ Q_Q(Greeter);
53+
3754 // Send out any messages we need to
3855 if (authenticationUser == "info-prompt")
3956 Q_EMIT q->showMessage("Welcome to Unity Greeter", Greeter::MessageTypeInfo);
@@ -65,7 +82,24 @@ void GreeterPrivate::handleAuthenticate()
6582 }
6683}
6784
68−void GreeterPrivate::handleRespond(const QString &response)
85+void GreeterPrivate::handleRespond(QString const &response)
86+{
87+ Q_Q(Greeter);
88+
89+ if (mockMode == "single") {
90+ // NOOP
91+ } else if (mockMode == "single-passphrase") {
92+ authenticated = (response == "password");
93+ q->sendAuthenticationComplete();
94+ } else if (mockMode == "single-pin") {
95+ authenticated = (response == "1234");
96+ q->sendAuthenticationComplete();
97+ } else if (mockMode == "full") {
98+ handleRespond_full(response);
99+ }
100+}
101+
102+void GreeterPrivate::handleRespond_full(const QString &response)
69103{
70104 Q_Q(Greeter);
71105
tests/mocks/LightDM/liblightdm/GreeterPrivate.hnew file+54
@@ -0,0 +1,54 @@
1+/*
2+ * Copyright (C) 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+#ifndef UNITY_MOCK_GREETER_PRIVATE_H
18+#define UNITY_MOCK_GREETER_PRIVATE_H
19+
20+#include <QtCore/QObject>
21+
22+namespace QLightDM
23+{
24+class Greeter;
25+class GreeterImpl;
26+
27+class GreeterPrivate
28+{
29+public:
30+ explicit GreeterPrivate(Greeter* parent=0);
31+ virtual ~GreeterPrivate() = default;
32+
33+ // These variables may not be used by all subclasses, that's no problem
34+ bool authenticated;
35+ QString authenticationUser;
36+ bool twoFactorDone;
37+
38+ QString mockMode;
39+
40+ void handleAuthenticate();
41+ void handleRespond(const QString &response);
42+
43+protected:
44+ GreeterImpl *m_impl; // if the backend needs more private data
45+ Greeter * const q_ptr;
46+
47+private:
48+ void handleAuthenticate_full();
49+ void handleRespond_full(const QString &response);
50+ Q_DECLARE_PUBLIC(Greeter)
51+};
52+}
53+
54+#endif // UNITY_MOCK_GREETER_PRIVATE_H
tests/mocks/LightDM/liblightdm/UsersModel.cppnew file+134
@@ -0,0 +1,134 @@
1+/*
2+ * Copyright (C) 2013 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+ * Author: Michael Terry <michael.terry@canonical.com>
17+ */
18+
19+// LightDM currently is Qt4 compatible, and so doesn't define setRoleNames.
20+// To use the same method of setting role name that it does, we
21+// set our compatibility to Qt4 here too.
22+#define QT_DISABLE_DEPRECATED_BEFORE QT_VERSION_CHECK(4, 0, 0)
23+
24+#include "UsersModel.h"
25+#include "UsersModelPrivate.h"
26+#include <QtCore/QDir>
27+#include <QtCore/QString>
28+#include <QtGui/QIcon>
29+
30+namespace QLightDM
31+{
32+
33+UsersModel::UsersModel(QObject *parent) :
34+ QAbstractListModel(parent),
35+ d_ptr(new UsersModelPrivate(this))
36+{
37+ Q_D(UsersModel);
38+
39+ // Extend roleNames (we want to keep the "display" role)
40+ QHash<int, QByteArray> roles = roleNames();
41+ roles[NameRole] = "name";
42+ roles[RealNameRole] = "realName";
43+ roles[LoggedInRole] = "loggedIn";
44+ roles[BackgroundRole] = "background";
45+ roles[BackgroundPathRole] = "backgroundPath";
46+ roles[SessionRole] = "session";
47+ roles[HasMessagesRole] = "hasMessages";
48+ roles[ImagePathRole] = "imagePath";
49+ setRoleNames(roles);
50+
51+ // Now modify our mock user backgrounds
52+ QDir bgdir = QDir("/usr/share/demo-assets/shell/backgrounds/");
53+ QStringList backgrounds = bgdir.entryList(QDir::Files | QDir::NoDotAndDotDot);
54+
55+ for (int i = 0, j = 0; i < d->entries.size(); i++) {
56+ Entry &entry = d->entries[i];
57+ if (entry.background.isNull() && !backgrounds.isEmpty()) {
58+ entry.background = bgdir.filePath(backgrounds[j++]);
59+ if (j >= backgrounds.length()) {
60+ j = 0;
61+ }
62+ }
63+ }
64+}
65+
66+UsersModel::~UsersModel()
67+{
68+ delete d_ptr;
69+}
70+
71+int UsersModel::rowCount(const QModelIndex &parent) const
72+{
73+ Q_D(const UsersModel);
74+
75+ if (parent.isValid()) {
76+ return 0;
77+ } else { // parent is root
78+ return d->entries.size();
79+ }
80+}
81+
82+QVariant UsersModel::data(const QModelIndex &index, int role) const
83+{
84+ Q_D(const UsersModel);
85+
86+ if (!index.isValid()) {
87+ return QVariant();
88+ }
89+
90+ int row = index.row();
91+ switch (role) {
92+ case Qt::DisplayRole:
93+ return d->entries[row].real_name;
94+ case Qt::DecorationRole:
95+ return QIcon();
96+ case UsersModel::NameRole:
97+ return d->entries[row].username;
98+ case UsersModel::RealNameRole:
99+ return d->entries[row].real_name;
100+ case UsersModel::SessionRole:
101+ return d->entries[row].session;
102+ case UsersModel::LoggedInRole:
103+ return d->entries[row].is_active;
104+ case UsersModel::BackgroundRole:
105+ return QPixmap(d->entries[row].background);
106+ case UsersModel::BackgroundPathRole:
107+ return d->entries[row].background;
108+ case UsersModel::HasMessagesRole:
109+ return d->entries[row].has_messages;
110+ case UsersModel::ImagePathRole:
111+ return "";
112+ default:
113+ return QVariant();
114+ }
115+}
116+
117+QString UsersModel::mockMode() const
118+{
119+ Q_D(const UsersModel);
120+ return d->mockMode;
121+}
122+
123+void UsersModel::setMockMode(QString mockMode)
124+{
125+ Q_D(UsersModel);
126+
127+ if (d->mockMode != mockMode) {
128+ d->mockMode = mockMode;
129+ Q_EMIT mockModeChanged(mockMode);
130+ d->resetEntries();
131+ }
132+}
133+
134+}
tests/mocks/LightDM/liblightdm/UsersModel.hnew file+69
@@ -0,0 +1,69 @@
1+/*
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
3+ * Copyright (C) 2010-2011 David Edmundson.
4+ *
5+ * This program is free software; you can redistribute it and/or modify
6+ * it under the terms of the GNU General Public License as published by
7+ * the Free Software Foundation; version 3.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ */
17+
18+#ifndef UNITY_MOCK_USERSMODEL_H
19+#define UNITY_MOCK_USERSMODEL_H
20+
21+#include <QtCore/QString>
22+#include <QtCore/QSharedDataPointer>
23+#include <QAbstractListModel>
24+
25+
26+namespace QLightDM
27+{
28+class UsersModelPrivate;
29+
30+class Q_DECL_EXPORT UsersModel : public QAbstractListModel
31+{
32+ Q_OBJECT
33+
34+ Q_ENUMS(UserModelRoles)
35+
36+ //Mock-only API for testing purposes
37+ Q_PROPERTY(QString mockMode READ mockMode WRITE setMockMode NOTIFY mockModeChanged)
38+
39+Q_SIGNALS:
40+ void mockModeChanged(QString mode);
41+
42+public:
43+ explicit UsersModel(QObject *parent = 0);
44+ virtual ~UsersModel();
45+
46+ enum UserModelRoles {NameRole = Qt::UserRole,
47+ RealNameRole,
48+ LoggedInRole,
49+ BackgroundRole,
50+ SessionRole,
51+ HasMessagesRole,
52+ ImagePathRole,
53+ BackgroundPathRole
54+ };
55+
56+ int rowCount(const QModelIndex &parent) const;
57+ QVariant data(const QModelIndex &index, int role) const;
58+
59+ QString mockMode() const;
60+ void setMockMode(QString mockMode);
61+
62+private:
63+ UsersModelPrivate * const d_ptr;
64+ Q_DECLARE_PRIVATE(UsersModel)
65+};
66+
67+}
68+
69+#endif // UNITY_MOCK_USERSMODEL_H
tests/mocks/LightDM/full/UsersModelPrivate.cpp → tests/mocks/LightDM/liblightdm/UsersModelPrivate.cpprenamed+58−6
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 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
@@ -12,17 +12,69 @@
1212 *
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/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
1715 */
1816
19−#include "../UsersModelPrivate.h"
17+#include "UsersModelPrivate.h"
18+#include "UsersModel.h"
2019
2120namespace QLightDM
2221{
2322
2423UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
25− : q_ptr(parent)
24+ : mockMode("single")
25+ , q_ptr(parent)
26+{
27+ char *envMockMode = getenv("LIBLIGHTDM_MOCK_MODE");
28+ if (envMockMode) {
29+ mockMode = envMockMode;
30+ }
31+ resetEntries();
32+}
33+
34+void UsersModelPrivate::resetEntries()
35+{
36+ Q_Q(UsersModel);
37+
38+ q->beginResetModel();
39+
40+ if (mockMode == "single") {
41+ resetEntries_single();
42+ } else if (mockMode == "single-passphrase") {
43+ resetEntries_singlePassphrase();
44+ } else if (mockMode == "single-pin") {
45+ resetEntries_singlePin();
46+ } else if (mockMode == "full") {
47+ resetEntries_full();
48+ }
49+
50+ q->endResetModel();
51+}
52+
53+void UsersModelPrivate::resetEntries_single()
54+{
55+ entries =
56+ {
57+ { "single", "Single User", 0, 0, false, false, 0, 0 },
58+ };
59+}
60+
61+void UsersModelPrivate::resetEntries_singlePassphrase()
62+{
63+ entries =
64+ {
65+ { "single", "Single User", 0, 0, false, false, 0, 0 },
66+ };
67+}
68+
69+void UsersModelPrivate::resetEntries_singlePin()
70+{
71+ entries =
72+ {
73+ { "has-pin", "Has PIN", 0, 0, false, false, 0, 0 },
74+ };
75+}
76+
77+void UsersModelPrivate::resetEntries_full()
2678{
2779 entries =
2880 {
@@ -49,4 +101,4 @@ UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
49101 };
50102}
51103
52−}
104+} // namespace QLightDM
tests/mocks/LightDM/liblightdm/UsersModelPrivate.hnew file+63
@@ -0,0 +1,63 @@
1+/*
2+ * Copyright (C) 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+#ifndef UNITY_MOCK_USERSMODEL_PRIVATE_H
18+#define UNITY_MOCK_USERSMODEL_PRIVATE_H
19+
20+#include <QtCore/QList>
21+#include <QtCore/QString>
22+
23+namespace QLightDM
24+{
25+class UsersModel;
26+
27+class Entry
28+{
29+public:
30+ QString username;
31+ QString real_name;
32+ QString background;
33+ QString layouts;
34+ bool is_active;
35+ bool has_messages;
36+ QString session;
37+ QString infographic;
38+};
39+
40+class UsersModelPrivate
41+{
42+public:
43+ explicit UsersModelPrivate(UsersModel *parent = 0);
44+ virtual ~UsersModelPrivate() = default;
45+
46+ QList<Entry> entries;
47+ QString mockMode;
48+
49+ void resetEntries();
50+protected:
51+ UsersModel * const q_ptr;
52+
53+private:
54+ void resetEntries_single();
55+ void resetEntries_singlePassphrase();
56+ void resetEntries_singlePin();
57+ void resetEntries_full();
58+ Q_DECLARE_PUBLIC(UsersModel)
59+};
60+
61+}
62+
63+#endif // UNITY_MOCK_USERSMODEL_PRIVATE_H
tests/mocks/LightDM/plugin.cppnew file+68
@@ -0,0 +1,68 @@
1+/*
2+ * Copyright (C) 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+#include "plugin.h"
18+#include <DBusGreeter.h>
19+#include <DBusGreeterList.h>
20+#include "MockGreeter.h"
21+#include "MockUsersModel.h"
22+#include <libusermetricsoutput/ColorTheme.h>
23+#include <libusermetricsoutput/UserMetrics.h>
24+#include <QLightDM/UsersModel>
25+
26+#include <QAbstractItemModel>
27+#include <QDBusConnection>
28+#include <QtQml/qqml.h>
29+
30+static QObject *greeter_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
31+{
32+ Q_UNUSED(engine)
33+ Q_UNUSED(scriptEngine)
34+
35+ MockGreeter *greeter = new MockGreeter;
36+ new DBusGreeter(greeter, "/");
37+ new DBusGreeterList(greeter, "/list");
38+
39+ return greeter;
40+}
41+
42+static QObject *users_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
43+{
44+ Q_UNUSED(engine)
45+ Q_UNUSED(scriptEngine)
46+ return new MockUsersModel;
47+}
48+
49+static QObject *infographic_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
50+{
51+ Q_UNUSED(engine)
52+ Q_UNUSED(scriptEngine)
53+ return UserMetricsOutput::UserMetrics::getInstance();
54+}
55+
56+void LightDMPlugin::registerTypes(const char *uri)
57+{
58+ qmlRegisterType<QAbstractItemModel>();
59+ qmlRegisterType<UserMetricsOutput::ColorTheme>();
60+
61+ Q_ASSERT(uri == QLatin1String("LightDM"));
62+ qRegisterMetaType<QLightDM::Greeter::MessageType>("QLightDM::Greeter::MessageType");
63+ qRegisterMetaType<QLightDM::Greeter::PromptType>("QLightDM::Greeter::PromptType");
64+ qmlRegisterSingletonType<MockGreeter>(uri, 0, 1, "Greeter", greeter_provider);
65+ qmlRegisterSingletonType<MockUsersModel>(uri, 0, 1, "Users", users_provider);
66+ qmlRegisterUncreatableType<QLightDM::UsersModel>(uri, 0, 1, "UserRoles", "Type is not instantiable");
67+ qmlRegisterSingletonType<UserMetricsOutput::UserMetrics>(uri, 0, 1, "Infographic", infographic_provider);
68+}
tests/mocks/LightDM/single-passphrase/UsersModelPrivate.cpp → tests/mocks/LightDM/plugin.hrenamed+13−14
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 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
@@ -12,22 +12,21 @@
1212 *
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/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
1715 */
1816
19−#include "../UsersModelPrivate.h"
17+#ifndef MOCK_LIGHTDM_PLUGIN_H
18+#define MOCK_LIGHTDM_PLUGIN_H
2019
21−namespace QLightDM
22−{
20+#include <QtQml/QQmlEngine>
21+#include <QtQml/QQmlExtensionPlugin>
2322
24−UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
25− : q_ptr(parent)
23+class LightDMPlugin : public QQmlExtensionPlugin
2624{
27− entries =
28− {
29− { "single", "Has Passphrase", 0, 0, false, false, 0, 0 },
30− };
31−}
25+ Q_OBJECT
26+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27+
28+public:
29+ void registerTypes(const char *uri);
30+};
3231
33−}
32+#endif
tests/mocks/LightDM/single-passphrase/CMakeLists.txtdeleted−19
@@ -1,19 +0,0 @@
1−set(LibLightDM_SOURCES
2− ../Greeter.cpp
3− ../UsersModel.cpp
4− GreeterPrivate.cpp
5− UsersModelPrivate.cpp
6− ${CMAKE_SOURCE_DIR}/plugins/Utils/qvariantlistmodel.cpp
7− )
8−
9−
10−add_library(MockLightDM-single-passphrase SHARED ${LibLightDM_SOURCES})
11−
12−qt5_use_modules(MockLightDM-single-passphrase Gui)
13−
14−set_target_properties(MockLightDM-single-passphrase PROPERTIES
15− OUTPUT_NAME lightdm-qt5-2)
16−
17−install(TARGETS MockLightDM-single-passphrase
18− DESTINATION ${SHELL_INSTALL_QML}/mocks/LightDM/single-passphrase
19− )
tests/mocks/LightDM/single-passphrase/GreeterPrivate.cppdeleted−46
@@ -1,46 +0,0 @@
1−/*
2− * Copyright (C) 2013 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− * Author: Michael Terry <michael.terry@canonical.com>
17− */
18−
19−#include "../Greeter.h"
20−#include "../GreeterPrivate.h"
21−
22−namespace QLightDM
23−{
24−
25−GreeterPrivate::GreeterPrivate(Greeter* parent)
26− : authenticated(false),
27− authenticationUser(),
28− q_ptr(parent)
29−{
30−}
31−
32−void GreeterPrivate::handleAuthenticate()
33−{
34− Q_Q(Greeter);
35− Q_EMIT q->showPrompt("Password: ", Greeter::PromptTypeSecret);
36−}
37−
38−void GreeterPrivate::handleRespond(const QString &response)
39−{
40− Q_Q(Greeter);
41−
42− authenticated = (response == "password");
43− q->sendAuthenticationComplete();
44−}
45−
46−}
tests/mocks/LightDM/single-pin/CMakeLists.txtdeleted−19
@@ -1,19 +0,0 @@
1−set(LibLightDM_SOURCES
2− ../Greeter.cpp
3− ../UsersModel.cpp
4− GreeterPrivate.cpp
5− UsersModelPrivate.cpp
6− ${CMAKE_SOURCE_DIR}/plugins/Utils/qvariantlistmodel.cpp
7− )
8−
9−
10−add_library(MockLightDM-single-pin SHARED ${LibLightDM_SOURCES})
11−
12−qt5_use_modules(MockLightDM-single-pin Gui)
13−
14−set_target_properties(MockLightDM-single-pin PROPERTIES
15− OUTPUT_NAME lightdm-qt5-2)
16−
17−install(TARGETS MockLightDM-single-pin
18− DESTINATION ${SHELL_INSTALL_QML}/mocks/LightDM/single-pin
19− )
tests/mocks/LightDM/single-pin/GreeterPrivate.cppdeleted−46
@@ -1,46 +0,0 @@
1−/*
2− * Copyright (C) 2013 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− * Author: Michael Terry <michael.terry@canonical.com>
17− */
18−
19−#include "../Greeter.h"
20−#include "../GreeterPrivate.h"
21−
22−namespace QLightDM
23−{
24−
25−GreeterPrivate::GreeterPrivate(Greeter* parent)
26− : authenticated(false),
27− authenticationUser(),
28− q_ptr(parent)
29−{
30−}
31−
32−void GreeterPrivate::handleAuthenticate()
33−{
34− Q_Q(Greeter);
35− Q_EMIT q->showPrompt("Password: ", Greeter::PromptTypeSecret);
36−}
37−
38−void GreeterPrivate::handleRespond(const QString &response)
39−{
40− Q_Q(Greeter);
41−
42− authenticated = (response == "1234");
43− q->sendAuthenticationComplete();
44−}
45−
46−}
tests/mocks/LightDM/single/CMakeLists.txtdeleted−18
@@ -1,18 +0,0 @@
1−set(LibLightDM_SOURCES
2− ../Greeter.cpp
3− ../UsersModel.cpp
4− GreeterPrivate.cpp
5− UsersModelPrivate.cpp
6− ${CMAKE_SOURCE_DIR}/plugins/Utils/qvariantlistmodel.cpp
7− )
8−
9−add_library(MockLightDM-single SHARED ${LibLightDM_SOURCES})
10−
11−qt5_use_modules(MockLightDM-single Gui)
12−
13−set_target_properties(MockLightDM-single PROPERTIES
14− OUTPUT_NAME lightdm-qt5-2)
15−
16−install(TARGETS MockLightDM-single
17− DESTINATION ${SHELL_INSTALL_QML}/mocks/LightDM/single
18− )
tests/mocks/Unity/CMakeLists.txt+3
@@ -40,6 +40,9 @@ set(UnityQML_SOURCES
4040 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/SettingsModelInterface.h
4141)
4242
43+# Workaround for gcc failure LP: #1417664
44+set_source_files_properties(fake_scopes.cpp PROPERTIES COMPILE_FLAGS -O1)
45+
4346add_library(FakeUnityQml MODULE ${UnityQML_SOURCES})
4447target_link_libraries(FakeUnityQml
4548 ${Qt5Core_LIBRARIES}
tests/plugins/LightDM/CMakeLists.txt+3−3
@@ -11,10 +11,10 @@ include_directories(
1111 ${LIBLIGHTDM_INCLUDE_DIRS}
1212 )
1313
14−add_dependencies(GreeterDBusTestExec MockLightDM-full)
15−target_link_libraries(GreeterDBusTestExec -L${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full
14+add_dependencies(GreeterDBusTestExec MockLightDM)
15+target_link_libraries(GreeterDBusTestExec -L${CMAKE_BINARY_DIR}/tests/mocks/LightDM/liblightdm
1616 -llightdm-qt5-2)
1717
1818add_definitions(-DCURRENT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
1919
20−add_binary_qml_test(GreeterDBus "${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full" MockLightDM-full "QML2_IMPORT_PATH=${CMAKE_BINARY_DIR}/tests/mocks")
20+add_binary_qml_test(GreeterDBus "${CMAKE_BINARY_DIR}/tests/mocks/LightDM/liblightdm" MockLightDM "QML2_IMPORT_PATH=${CMAKE_BINARY_DIR}/tests/mocks")
tests/plugins/LightDM/greeter.qml+5
@@ -19,4 +19,9 @@ import LightDM 0.1 as LightDM
1919
2020Item {
2121 property var greeter: LightDM.Greeter
22+ Binding {
23+ target: LightDM.Greeter
24+ property: "mockMode"
25+ value: "full"
26+ }
2227}
tests/qmltests/CMakeLists.txt+19−19
@@ -16,11 +16,11 @@ add_qml_test(utils/Unity/Test UnityTest)
1616
1717set(qmltest_DEFAULT_TARGETS qmluitests)
1818set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
19−set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C")
19+set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/liblightdm:${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
2020
21−add_qml_test(. Shell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single:${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
22−add_qml_test(. ShellWithPin ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single-pin:${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
23−add_qml_test(. TabletShell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full:${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
21+add_qml_test(. Shell)
22+add_qml_test(. ShellWithPin)
23+add_qml_test(. TabletShell)
2424add_qml_test(Components Background)
2525add_qml_test(Components Carousel)
2626add_qml_test(Components Dialogs)
@@ -61,10 +61,10 @@ add_qml_test(Dash/ScopeSettings ScopeSettingList)
6161add_qml_test(Dash/ScopeSettings ScopeSettingNumber)
6262add_qml_test(Dash/ScopeSettings ScopeSettingString)
6363add_qml_test(Dash/ScopeSettings ScopeSettingsWidgetFactory)
64−add_qml_test(Greeter MultiGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
65−add_qml_test(Greeter SingleGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
66−add_qml_test(Greeter Infographics ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
67−add_qml_test(Greeter Clock ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
64+add_qml_test(Greeter MultiGreeter)
65+add_qml_test(Greeter SingleGreeter)
66+add_qml_test(Greeter Infographics)
67+add_qml_test(Greeter Clock)
6868add_qml_test(Launcher Launcher)
6969add_qml_test(Notifications Notifications)
7070add_qml_test(Notifications VisualSnapDecisionsQueue)
@@ -72,22 +72,22 @@ add_qml_test(Notifications OptionToggle)
7272add_qml_test(Notifications SwipeToAct)
7373add_qml_test(Panel ActiveCallHint)
7474add_qml_test(Panel IndicatorItem)
75−add_qml_test(Panel IndicatorItemRow ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
76−add_qml_test(Panel IndicatorPage ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
77−add_qml_test(Panel IndicatorsBar ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
78−add_qml_test(Panel IndicatorsMenu ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
79−add_qml_test(Panel MenuContent ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
80−add_qml_test(Panel Panel ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
75+add_qml_test(Panel IndicatorItemRow)
76+add_qml_test(Panel IndicatorPage)
77+add_qml_test(Panel IndicatorsBar)
78+add_qml_test(Panel IndicatorsMenu)
79+add_qml_test(Panel MenuContent)
80+add_qml_test(Panel Panel)
8181add_qml_test(Panel SearchIndicator)
8282add_qml_test(Panel/Indicators IndicatorsLight ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
8383# These MenuItemFactory tests need the test/mocks/ to come before plugins/
8484add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
8585add_qml_test(Panel/Indicators MessageMenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
86−add_qml_test(Stages ApplicationWindow ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
87−add_qml_test(Stages PhoneStage ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
88−add_qml_test(Stages SpreadDelegate ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
89−add_qml_test(Stages SurfaceContainer ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
90−add_qml_test(Stages SessionContainer ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
86+add_qml_test(Stages ApplicationWindow)
87+add_qml_test(Stages PhoneStage ENVIRONMENT)
88+add_qml_test(Stages SpreadDelegate ENVIRONMENT)
89+add_qml_test(Stages SurfaceContainer ENVIRONMENT)
90+add_qml_test(Stages SessionContainer ENVIRONMENT)
9191add_qml_test(Stages TabletStage)
9292add_qml_test(Stages WindowMoveResizeArea)
9393add_qml_test(Stages Splash)
tests/qmltests/Dash/tst_Card.qml+7−1
@@ -60,7 +60,7 @@ Rectangle {
6060 "layout": { "components": Helpers.update(JSON.parse(Helpers.fullMapping), { "art": { "aspect-ratio": 0.7 } }) }
6161 },
6262 {
63− "name": "Art, header, summary - horizontal",
63+ "name": "Art, header, summary, background - horizontal",
6464 "layout": { "template": { "card-layout": "horizontal", "card-background": { "type": "gradient", "elements": ["grey", "white"] } },
6565 "components": JSON.parse(Helpers.fullMapping) }
6666 },
@@ -101,6 +101,11 @@ Rectangle {
101101 "layout": { "template": { "overlay": true },
102102 "components": { "art": "art", "title": "title" } }
103103 },
104+ {
105+ "name": "Art, header, summary - horizontal",
106+ "layout": { "template": { "card-layout": "horizontal" },
107+ "components": JSON.parse(Helpers.fullMapping) }
108+ },
104109 ]
105110
106111 CardTool {
@@ -415,6 +420,7 @@ Rectangle {
415420 background: Qt.resolvedUrl("artwork/checkers.png"), index: 10 },
416421 { tag: "Gradient background", visible: true, color: "#808080", gradientColor: "#ffffff", index: 11 },
417422 { tag: "Image background", visible: true, image: Qt.resolvedUrl("artwork/checkers.png"), index: 12 },
423+ { tag: "Horizontal no background", visible: false, index: 14 },
418424 ];
419425 }
420426
tests/qmltests/Greeter/tst_Infographics.qml+10
@@ -23,6 +23,16 @@ import Unity.Test 0.1 as UT
2323import LightDM 0.1 as LightDM
2424
2525Item {
26+ Binding {
27+ target: LightDM.Greeter
28+ property: "mockMode"
29+ value: "full"
30+ }
31+ Binding {
32+ target: LightDM.Users
33+ property: "mockMode"
34+ value: "full"
35+ }
2636 property variant infographicModel: LightDM.Infographic
2737
2838 width: units.gu(120)
tests/qmltests/Greeter/tst_MultiGreeter.qml+91−2
@@ -15,6 +15,7 @@
1515 */
1616
1717import QtQuick 2.0
18+import QtQuick.Layouts 1.1
1819import QtTest 1.0
1920import ".."
2021import "../../../qml/Greeter"
@@ -23,12 +24,37 @@ import LightDM 0.1 as LightDM
2324import Unity.Test 0.1 as UT
2425
2526Item {
26− width: units.gu(120)
27+ id: root
28+ width: units.gu(140)
2729 height: units.gu(80)
2830
31+ QtObject {
32+ id: fakeInputMethod
33+ property bool visible: fakeKeyboard.visible
34+ property var keyboardRectangle: QtObject {
35+ property real x: fakeKeyboard.x
36+ property real y: fakeKeyboard.y
37+ property real width: fakeKeyboard.width
38+ property real height: fakeKeyboard.height
39+ }
40+ }
41+
42+ Binding {
43+ target: LightDM.Greeter
44+ property: "mockMode"
45+ value: "full"
46+ }
47+ Binding {
48+ target: LightDM.Users
49+ property: "mockMode"
50+ value: "full"
51+ }
52+
2953 Greeter {
3054 id: greeter
31− anchors.fill: parent
55+ width: units.gu(120)
56+ height: root.height
57+ inputMethod: fakeInputMethod
3258 locked: !LightDM.Greeter.authenticated
3359 }
3460
@@ -43,6 +69,44 @@ Item {
4369 }
4470 }
4571
72+ Rectangle {
73+ id: fakeKeyboard
74+ color: "green"
75+ opacity: 0.7
76+ anchors.bottom: root.bottom
77+ width: greeter.width
78+ height: greeter.height * 0.6
79+ visible: keyboardVisibleCheckbox.checked
80+ Text {
81+ text: "Keyboard Rectangle"
82+ color: "yellow"
83+ font.bold: true
84+ fontSizeMode: Text.Fit
85+ minimumPixelSize: 10; font.pixelSize: 200
86+ verticalAlignment: Text.AlignVCenter
87+ x: (parent.width - width) / 2
88+ y: (parent.height - height) / 2
89+ width: parent.width
90+ height: parent.height
91+ }
92+ }
93+
94+ Item {
95+ anchors {
96+ top: root.top
97+ bottom: root.bottom
98+ left: greeter.right
99+ right: root.right
100+ }
101+ RowLayout {
102+ Layout.fillWidth: true
103+ CheckBox {
104+ id: keyboardVisibleCheckbox
105+ }
106+ Label { text: "Keyboard Visible"; anchors.verticalCenter: parent.verticalCenter }
107+ }
108+ }
109+
46110 SignalSpy {
47111 id: unlockSpy
48112 target: greeter
@@ -65,6 +129,10 @@ Item {
65129 name: "MultiGreeter"
66130 when: windowShown
67131
132+ function cleanup() {
133+ keyboardVisibleCheckbox.checked = false;
134+ }
135+
68136 function select_index(i) {
69137 // We could be anywhere in list; find target index to know which direction
70138 var userlist = findChild(greeter, "userList")
@@ -382,5 +450,26 @@ Item {
382450 tryCompare(spy, "count", 1)
383451 greeterObj.destroy()
384452 }
453+
454+ function test_login_list_not_covered_by_keyboard() {
455+ var loginList = findChild(greeter, "loginLoader").item;
456+ compare(loginList.height, greeter.height);
457+
458+ // when the vkb shows up, loginList is moved up to remain fully uncovered
459+
460+ keyboardVisibleCheckbox.checked = true;
461+
462+ tryCompare(loginList, "height", greeter.height - fakeInputMethod.keyboardRectangle.height);
463+ tryCompareFunction( function() {
464+ var loginListRect = loginList.mapToItem(greeter, 0, 0, loginList.width, loginList.height);
465+ return loginListRect.y + loginListRect.height <= fakeInputMethod.keyboardRectangle.y;
466+ }, true);
467+
468+ // once the vkb goes away, loginList goes back to its full height
469+
470+ keyboardVisibleCheckbox.checked = false;
471+
472+ tryCompare(loginList, "height", greeter.height);
473+ }
385474 }
386475}
tests/qmltests/tst_Shell.qml+8
@@ -36,6 +36,13 @@ Item {
3636 width: units.gu(60)
3737 height: units.gu(71)
3838
39+ Component.onCompleted: {
40+ // must set the mock mode before loading the Shell
41+ LightDM.Greeter.mockMode = "single";
42+ LightDM.Users.mockMode = "single";
43+ shellLoader.active = true;
44+ }
45+
3946 QtObject {
4047 id: applicationArguments
4148
@@ -58,6 +65,7 @@ Item {
5865 id: shellLoader
5966 focus: true
6067
68+ active: false
6169 property bool itemDestroyed: false
6270 sourceComponent: Component {
6371 Shell {
tests/qmltests/tst_ShellWithPin.qml+56
@@ -33,6 +33,13 @@ Item {
3333 width: contentRow.width
3434 height: contentRow.height
3535
36+ Component.onCompleted: {
37+ // must set the mock mode before loading the Shell
38+ LightDM.Greeter.mockMode = "single-pin";
39+ LightDM.Users.mockMode = "single-pin";
40+ shellLoader.active = true;
41+ }
42+
3643 QtObject {
3744 id: applicationArguments
3845
@@ -54,6 +61,7 @@ Item {
5461
5562 Loader {
5663 id: shellLoader
64+ active: false
5765
5866 width: units.gu(40)
5967 height: units.gu(71)
@@ -503,5 +511,53 @@ Item {
503511 var lockscreen = findChild(shell, "lockscreen");
504512 verify(lockscreen.shown);
505513 }
514+
515+ /*
516+ Regression test for https://bugs.launchpad.net/ubuntu/+source/unity8/+bug/1393447
517+
518+ Do a left edge drag that is long enough to start displacing the greeter
519+ but short engough so that the greeter comes back into place once the
520+ finger is lifted.
521+
522+ In this situation the launcher should remaing fully shown and hide itself
523+ only after its idle timeout is triggered.
524+ */
525+ function test_shortLeftEdgeSwipeMakesLauncherStayVisible() {
526+ var greeter = testCase.findChild(shell, "greeter")
527+ greeter.show();
528+ tryCompare(greeter, "showProgress", 1);
529+
530+ var launcher = testCase.findChild(shell, "launcher")
531+ {
532+ var dismissTimer = testCase.findInvisibleChild(launcher, "dismissTimer");
533+ // effectively disable the dismiss timer
534+ dismissTimer.interval = 24 * 60 * 60 * 1000 // 24 hours
535+ }
536+ var launcherPanel = testCase.findChild(launcher, "launcherPanel");
537+
538+ var toX = shell.width * 0.45;
539+ touchFlick(shell,
540+ 1 /* fromX */, shell.height * 0.5 /* fromY */,
541+ toX /* toX */, shell.height * 0.5 /* toY */,
542+ true /* beginTouch */, false /* endTouch */,
543+ 50, 100);
544+
545+ // Launcher must be fully shown by now
546+ tryCompare(launcherPanel, "x", 0);
547+
548+ // Greeter should be displaced
549+ tryCompareFunction(function() { return greeter.mapToItem(shell, 0, 0).x > shell.width*0.2; }, true);
550+
551+ touchRelease(shell, toX, shell.height * 0.5);
552+
553+ // Upon release the greeter should have slid back into full view
554+ tryCompareFunction(function() { return greeter.mapToItem(shell, 0, 0).x === 0; }, true);
555+
556+ // And the launcher should stay fully shown
557+ for (var i = 0; i < 10; ++i) {
558+ wait(50);
559+ compare(launcherPanel.x, 0);
560+ }
561+ }
506562 }
507563}
tests/qmltests/tst_TabletShell.qml+8
@@ -32,6 +32,13 @@ Row {
3232 id: root
3333 spacing: 0
3434
35+ Component.onCompleted: {
36+ // must set the mock mode before loading the Shell
37+ LightDM.Greeter.mockMode = "full";
38+ LightDM.Users.mockMode = "full";
39+ shellLoader.active = true;
40+ }
41+
3542 QtObject {
3643 id: applicationArguments
3744
@@ -51,6 +58,7 @@ Row {
5158 Loader {
5259 id: shellLoader
5360
61+ active: false
5462 width: units.gu(100)
5563 height: units.gu(80)
5664