on xenial help sign in
Merge trunk
9800f80Daniel d'Andrada
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+
1unity8 (8.02+15.04.20150123.3-0ubuntu1) vivid; urgency=low
30unity8 (8.02+15.04.20150123.3-0ubuntu1) vivid; urgency=low
2
31
3 [ Sebastien Bacher ]
32 [ Sebastien Bacher ]
debian/control+2
@@ -39,6 +39,7 @@ Build-Depends: cmake,
39 qml-module-qtquick-layouts,
39 qml-module-qtquick-layouts,
40 qml-module-qtquick-xmllistmodel,
40 qml-module-qtquick-xmllistmodel,
41 qml-module-qtquick2,
41 qml-module-qtquick2,
42+ qml-module-qtsysteminfo,
42 qml-module-qttest,
43 qml-module-qttest,
43 qt5-default,
44 qt5-default,
44 qtbase5-dev (>= 5.2.1),
45 qtbase5-dev (>= 5.2.1),
@@ -90,6 +91,7 @@ Depends: gsettings-desktop-schemas,
90 qmenumodel-qml (>= 0.2.9),
91 qmenumodel-qml (>= 0.2.9),
91 qml-module-qt-labs-folderlistmodel,
92 qml-module-qt-labs-folderlistmodel,
92 qml-module-qtquick-xmllistmodel,
93 qml-module-qtquick-xmllistmodel,
94+ qml-module-qtsysteminfo,
93 qtdeclarative5-gsettings1.0,
95 qtdeclarative5-gsettings1.0,
94 qtdeclarative5-qtmir-plugin (>= 0.4.4),
96 qtdeclarative5-qtmir-plugin (>= 0.4.4),
95 qtdeclarative5-ubuntu-telephony0.1,
97 qtdeclarative5-ubuntu-telephony0.1,
plugins/Dash/CardCreator.js+2−1
@@ -320,7 +320,8 @@ function cardString(template, components) {
320 var hasSummary = components["summary"] || false;
320 var hasSummary = components["summary"] || false;
321 var artAndSummary = hasArt && hasSummary;
321 var artAndSummary = hasArt && hasSummary;
322 var isHorizontal = template["card-layout"] === "horizontal";
322 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"]));
324 var hasTitle = components["title"] || false;
325 var hasTitle = components["title"] || false;
325 var hasMascot = components["mascot"] || false;
326 var hasMascot = components["mascot"] || false;
326 var hasEmblem = components["emblem"] && !(hasMascot && template["card-size"] === "small") || false;
327 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)
3pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
1pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
4# TODO: Once we split out a separate greeter process, uncomment these lines
2# TODO: Once we split out a separate greeter process, uncomment these lines
5#pkg_check_modules(LIBLIGHTDM REQUIRED liblightdm-qt5-2)
3#pkg_check_modules(LIBLIGHTDM REQUIRED liblightdm-qt5-2)
6
4
5+add_subdirectory(liblightdm)
6+
7include_directories(
7include_directories(
8 ${CMAKE_CURRENT_SOURCE_DIR}
8 ${CMAKE_CURRENT_SOURCE_DIR}
9 ${CMAKE_CURRENT_BINARY_DIR}
9 ${CMAKE_CURRENT_BINARY_DIR}
@@ -28,7 +28,7 @@ add_library(LightDM-qml MODULE
28 )
28 )
29
29
30target_link_libraries(LightDM-qml
30target_link_libraries(LightDM-qml
31− MockLightDM-demo
31+ integratedLightDM
32 unity8-private
32 unity8-private
33# TODO: Once we split out a separate greeter process, uncomment these lines
33# TODO: Once we split out a separate greeter process, uncomment these lines
34# ${LIBLIGHTDM_LDFLAGS}
34# ${LIBLIGHTDM_LDFLAGS}
plugins/LightDM/Greeter.cpp+1−19
@@ -17,26 +17,8 @@
17 */
17 */
18
18
19#include "Greeter.h"
19#include "Greeter.h"
20+#include "GreeterPrivate.h"
20#include <libintl.h>
21#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−
40
22
41GreeterPrivate::GreeterPrivate(Greeter* parent)
23GreeterPrivate::GreeterPrivate(Greeter* parent)
42 : m_greeter(new QLightDM::Greeter(parent)),
24 : m_greeter(new QLightDM::Greeter(parent)),
plugins/LightDM/Greeter.h+1−1
@@ -68,7 +68,7 @@ Q_SIGNALS:
68 // should switch to this user if possible.
68 // should switch to this user if possible.
69 void requestAuthenticationUser(const QString &user);
69 void requestAuthenticationUser(const QString &user);
70
70
71−private:
71+protected:
72 GreeterPrivate * const d_ptr;
72 GreeterPrivate * const d_ptr;
73
73
74 Q_DECLARE_PRIVATE(Greeter)
74 Q_DECLARE_PRIVATE(Greeter)
tests/mocks/LightDM/single-pin/UsersModelPrivate.cpp → plugins/LightDM/GreeterPrivate.hrenamed+20−14
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -12,22 +12,28 @@
12 *
12 *
13 * You should have received a copy of the GNU General Public License
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/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
17 */
15 */
18
16
19−#include "../UsersModelPrivate.h"
17+#ifndef UNITY_GREETER_PRIVATE_H
18+#define UNITY_GREETER_PRIVATE_H
20
19
21−namespace QLightDM
20+#include <QLightDM/Greeter>
22−{
23
21
24−UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
22+class GreeterPrivate
25− : q_ptr(parent)
26{
23{
27− entries =
24+public:
28− {
25+ explicit GreeterPrivate(Greeter *parent);
29− { "has-pin", "Has PIN", 0, 0, false, false, 0, 0 },
26+
30− };
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)
31−}
37+};
32
38
33−}
39+#endif // UNITY_GREETER_PRIVATE_H
tests/mocks/LightDM/demo/CMakeLists.txt → plugins/LightDM/liblightdm/CMakeLists.txtrenamed+6−6
@@ -1,14 +1,14 @@
1pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
1pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
2
2
3set(LibLightDM_SOURCES
3set(LibLightDM_SOURCES
4− ../Greeter.cpp
4+ Greeter.cpp
5− ../UsersModel.cpp
5+ UsersModel.cpp
6 GreeterPrivate.cpp
6 GreeterPrivate.cpp
7 UsersModelPrivate.cpp
7 UsersModelPrivate.cpp
8 ${CMAKE_SOURCE_DIR}/plugins/Utils/qvariantlistmodel.cpp
8 ${CMAKE_SOURCE_DIR}/plugins/Utils/qvariantlistmodel.cpp
9 )
9 )
10
10
11−add_library(MockLightDM-demo STATIC ${LibLightDM_SOURCES})
11+add_library(integratedLightDM STATIC ${LibLightDM_SOURCES})
12add_library(MockLightDM-demo-shared SHARED ${LibLightDM_SOURCES})
12add_library(MockLightDM-demo-shared SHARED ${LibLightDM_SOURCES})
13
13
14include_directories(
14include_directories(
@@ -16,7 +16,7 @@ include_directories(
16 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
16 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
17)
17)
18
18
19−target_link_libraries(MockLightDM-demo
19+target_link_libraries(integratedLightDM
20 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
20 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
21 -lpam
21 -lpam
22)
22)
@@ -25,10 +25,10 @@ target_link_libraries(MockLightDM-demo-shared
25 -lpam
25 -lpam
26)
26)
27
27
28−qt5_use_modules(MockLightDM-demo Concurrent Gui)
28+qt5_use_modules(integratedLightDM Concurrent Gui)
29qt5_use_modules(MockLightDM-demo-shared Concurrent Gui)
29qt5_use_modules(MockLightDM-demo-shared Concurrent Gui)
30
30
31−set_target_properties(MockLightDM-demo PROPERTIES COMPILE_FLAGS -fPIC)
31+set_target_properties(integratedLightDM PROPERTIES COMPILE_FLAGS -fPIC)
32set_target_properties(MockLightDM-demo-shared PROPERTIES
32set_target_properties(MockLightDM-demo-shared PROPERTIES
33 OUTPUT_NAME lightdm-qt5-2)
33 OUTPUT_NAME lightdm-qt5-2)
34
34
tests/mocks/LightDM/Greeter.cpp → plugins/LightDM/liblightdm/Greeter.cpprenamed+7−7
@@ -16,6 +16,13 @@
16 * Author: Michael Terry <michael.terry@canonical.com>
16 * Author: Michael Terry <michael.terry@canonical.com>
17 */
17 */
18
18
19+
20+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
21+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
22+ * COUNTERPART IN tests/mocks/Lightdm/liblightdm
23+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
24+
25+
19#include "Greeter.h"
26#include "Greeter.h"
20#include "GreeterPrivate.h"
27#include "GreeterPrivate.h"
21#include <QtCore/QCoreApplication>
28#include <QtCore/QCoreApplication>
@@ -128,13 +135,6 @@ void Greeter::authenticate(const QString &username)
128
135
129 d->authenticated = false;
136 d->authenticated = false;
130 d->authenticationUser = username;
137 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);
138 d->handleAuthenticate();
138 d->handleAuthenticate();
139}
139}
140
140
tests/mocks/LightDM/Greeter.h → plugins/LightDM/liblightdm/Greeter.hrenamed+4−3
@@ -24,6 +24,10 @@
24#include <QtCore/QObject>
24#include <QtCore/QObject>
25#include <QtCore/QVariant>
25#include <QtCore/QVariant>
26
26
27+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
28+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
29+ * COUNTERPART IN tests/mocks/Lightdm/liblightdm
30+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
27
31
28namespace QLightDM
32namespace QLightDM
29{
33{
@@ -99,9 +103,6 @@ Q_SIGNALS:
99protected:
103protected:
100 void sendAuthenticationComplete();
104 void sendAuthenticationComplete();
101
105
102−private Q_SLOTS:
103− void delayedAuthentication();
104−
105private:
106private:
106 GreeterPrivate *d_ptr;
107 GreeterPrivate *d_ptr;
107 Q_DECLARE_PRIVATE(Greeter)
108 Q_DECLARE_PRIVATE(Greeter)
tests/mocks/LightDM/demo/GreeterPrivate.cpp → plugins/LightDM/liblightdm/GreeterPrivate.cpprenamed+2−2
@@ -16,8 +16,8 @@
16 * Author: Michael Terry <michael.terry@canonical.com>
16 * Author: Michael Terry <michael.terry@canonical.com>
17 */
17 */
18
18
19−#include "../Greeter.h"
19+#include "Greeter.h"
20−#include "../GreeterPrivate.h"
20+#include "GreeterPrivate.h"
21#include <QFuture>
21#include <QFuture>
22#include <QFutureInterface>
22#include <QFutureInterface>
23#include <QFutureWatcher>
23#include <QFutureWatcher>
tests/mocks/LightDM/GreeterPrivate.h → plugins/LightDM/liblightdm/GreeterPrivate.hrenamed−1
@@ -35,7 +35,6 @@ public:
35 // These variables may not be used by all subclasses, that's no problem
35 // These variables may not be used by all subclasses, that's no problem
36 bool authenticated;
36 bool authenticated;
37 QString authenticationUser;
37 QString authenticationUser;
38− bool twoFactorDone;
39
38
40 void handleAuthenticate();
39 void handleAuthenticate();
41 void handleRespond(const QString &response);
40 void handleRespond(const QString &response);
tests/mocks/LightDM/UsersModel.cpp → plugins/LightDM/liblightdm/UsersModel.cpprenamed+6
@@ -16,6 +16,12 @@
16 * Author: Michael Terry <michael.terry@canonical.com>
16 * Author: Michael Terry <michael.terry@canonical.com>
17 */
17 */
18
18
19+
20+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
21+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
22+ * COUNTERPART IN tests/mocks/Lightdm/liblightdm
23+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
24+
19// LightDM currently is Qt4 compatible, and so doesn't define setRoleNames.
25// 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
26// To use the same method of setting role name that it does, we
21// set our compatibility to Qt4 here too.
27// set our compatibility to Qt4 here too.
tests/mocks/LightDM/UsersModel.h → plugins/LightDM/liblightdm/UsersModel.hrenamed+4
@@ -24,6 +24,10 @@
24#include <QtCore/QSharedDataPointer>
24#include <QtCore/QSharedDataPointer>
25#include <QAbstractListModel>
25#include <QAbstractListModel>
26
26
27+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
28+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
29+ * COUNTERPART IN tests/mocks/Lightdm/liblightdm
30+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
27
31
28namespace QLightDM
32namespace QLightDM
29{
33{
tests/mocks/LightDM/demo/UsersModelPrivate.cpp → plugins/LightDM/liblightdm/UsersModelPrivate.cpprenamed+1−1
@@ -16,7 +16,7 @@
16 * Author: Michael Terry <michael.terry@canonical.com>
16 * Author: Michael Terry <michael.terry@canonical.com>
17 */
17 */
18
18
19−#include "../UsersModelPrivate.h"
19+#include "UsersModelPrivate.h"
20
20
21#include <QDir>
21#include <QDir>
22#include <QSettings>
22#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−
3pkg_check_modules(ANDROID_HEADERS REQUIRED android-headers)
1pkg_check_modules(ANDROID_HEADERS REQUIRED android-headers)
4pkg_check_modules(ANDROID_HARDWARE REQUIRED libhardware)
2pkg_check_modules(ANDROID_HARDWARE REQUIRED libhardware)
5
3
plugins/Powerd/CMakeLists.txt−2
@@ -1,5 +1,3 @@
1−include(FindPkgConfig)
2−
3pkg_search_module(GIO REQUIRED gio-2.0)
1pkg_search_module(GIO REQUIRED gio-2.0)
4
2
5include_directories(
3include_directories(
plugins/Unity/Launcher/CMakeLists.txt−1
@@ -1,4 +1,3 @@
1−include(FindPkgConfig)
2pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=5)
1pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=5)
3pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=5)
2pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=5)
4pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
3pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
plugins/Unity/Session/CMakeLists.txt−2
@@ -1,5 +1,3 @@
1−include(FindPkgConfig)
2−
3pkg_search_module(GIO REQUIRED gio-2.0)
1pkg_search_module(GIO REQUIRED gio-2.0)
4
2
5include_directories(
3include_directories(
plugins/Utils/CMakeLists.txt−3
@@ -1,6 +1,3 @@
1−# Dependencies
2−include(FindPkgConfig)
3−
4pkg_search_module(GIO REQUIRED gio-2.0)
1pkg_search_module(GIO REQUIRED gio-2.0)
5
2
6include_directories(
3include_directories(
po/am.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"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"
12"Last-Translator: samson <Unknown>\n"
12"Last-Translator: samson <Unknown>\n"
13"Language-Team: Amharic <am@li.org>\n"
13"Language-Team: Amharic <am@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"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"
19"X-Generator: Launchpad (build 17306)\n"
19"X-Generator: Launchpad (build 17306)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -282,7 +282,7 @@ msgstr "አልተቻለም: እንደገና ለመሞከር መታ ያድርጉ"
282
282
283#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
283#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
284msgid "Reply"
284msgid "Reply"
285−msgstr ""
285+msgstr "መመለሻ"
286
286
287#: qml/Panel/Indicators/ModemInfoItem.qml:105
287#: qml/Panel/Indicators/ModemInfoItem.qml:105
288msgid "Unlock SIM"
288msgid "Unlock SIM"
po/be.po+49−42
@@ -8,16 +8,16 @@ msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2014-09-24 17:12+0000\n"
11+"PO-Revision-Date: 2015-02-03 22:02+0000\n"
12−"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12+"Last-Translator: Arsień Šachalevič <semen.shah@gmail.com>\n"
13"Language-Team: Belarusian <be@li.org>\n"
13"Language-Team: Belarusian <be@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
18"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-02-04 07:13+0000\n"
20−"X-Generator: Launchpad (build 17306)\n"
20+"X-Generator: Launchpad (build 17331)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
23msgid "Password: "
23msgid "Password: "
@@ -291,7 +291,7 @@ msgstr "Памылка, націсніце для паўтору"
291
291
292#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
292#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
293msgid "Reply"
293msgid "Reply"
294−msgstr ""
294+msgstr "Адказаць"
295
295
296#: qml/Panel/Indicators/ModemInfoItem.qml:105
296#: qml/Panel/Indicators/ModemInfoItem.qml:105
297msgid "Unlock SIM"
297msgid "Unlock SIM"
@@ -361,98 +361,99 @@ msgstr ""
361
361
362#: qml/Wizard/Page.qml:89
362#: qml/Wizard/Page.qml:89
363msgid "Back"
363msgid "Back"
364−msgstr ""
364+msgstr "Назад"
365
365
366#: qml/Wizard/Pages/10-welcome.qml:27
366#: qml/Wizard/Pages/10-welcome.qml:27
367msgid "Hi!"
367msgid "Hi!"
368−msgstr ""
368+msgstr "Вітай!"
369
369
370#: qml/Wizard/Pages/10-welcome.qml:44
370#: qml/Wizard/Pages/10-welcome.qml:44
371msgid "Welcome to your Ubuntu phone."
371msgid "Welcome to your Ubuntu phone."
372−msgstr ""
372+msgstr "Вітаем Вас у сістэме тэлефона Ubuntu."
373
373
374#: qml/Wizard/Pages/10-welcome.qml:52
374#: qml/Wizard/Pages/10-welcome.qml:52
375msgid "Let’s get started."
375msgid "Let’s get started."
376−msgstr ""
376+msgstr "Пачнем."
377
377
378#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
378#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
379#: qml/Wizard/Pages/40-wifi.qml:197 qml/Wizard/Pages/50-location.qml:131
379#: qml/Wizard/Pages/40-wifi.qml:197 qml/Wizard/Pages/50-location.qml:131
380#: qml/Wizard/Pages/60-reporting.qml:50 qml/Wizard/Pages/passwd-confirm.qml:82
380#: qml/Wizard/Pages/60-reporting.qml:50 qml/Wizard/Pages/passwd-confirm.qml:82
381#: qml/Wizard/Pages/passwd-set.qml:90
381#: qml/Wizard/Pages/passwd-set.qml:90
382msgid "Continue"
382msgid "Continue"
383−msgstr ""
383+msgstr "Працягнуць"
384
384
385#: qml/Wizard/Pages/20-sim.qml:25
385#: qml/Wizard/Pages/20-sim.qml:25
386msgid "Add a SIM card and restart your device"
386msgid "Add a SIM card and restart your device"
387−msgstr ""
387+msgstr "Дадайце SIM-карту і перазагрузіце Вашую прыладу"
388
388
389#: qml/Wizard/Pages/20-sim.qml:55
389#: qml/Wizard/Pages/20-sim.qml:55
390msgid "Without it, you won’t be able to make calls or use text messaging."
390msgid "Without it, you won’t be able to make calls or use text messaging."
391−msgstr ""
391+msgstr "Без яе вы не зможаце тэлефанаваць ці адпраўляць паведамленні."
392
392
393#: qml/Wizard/Pages/20-sim.qml:69 qml/Wizard/Pages/40-wifi.qml:197
393#: qml/Wizard/Pages/20-sim.qml:69 qml/Wizard/Pages/40-wifi.qml:197
394msgid "Skip"
394msgid "Skip"
395−msgstr ""
395+msgstr "Прапусціць"
396
396
397#: qml/Wizard/Pages/30-passwd-type.qml:39
397#: qml/Wizard/Pages/30-passwd-type.qml:39
398msgid "Lock security"
398msgid "Lock security"
399−msgstr ""
399+msgstr "Блакаванне бяспекі"
400
400
401#: qml/Wizard/Pages/30-passwd-type.qml:74
401#: qml/Wizard/Pages/30-passwd-type.qml:74
402msgid "Please select how you’d like to unlock your phone."
402msgid "Please select how you’d like to unlock your phone."
403−msgstr ""
403+msgstr "Калі ласка, абярыце спосаб разблакавання тэлефона."
404
404
405#: qml/Wizard/Pages/30-passwd-type.qml:97
405#: qml/Wizard/Pages/30-passwd-type.qml:97
406msgid "Swipe"
406msgid "Swipe"
407−msgstr ""
407+msgstr "Свайп(Рух пальцам)"
408
408
409#: qml/Wizard/Pages/30-passwd-type.qml:98
409#: qml/Wizard/Pages/30-passwd-type.qml:98
410msgid "No security"
410msgid "No security"
411−msgstr ""
411+msgstr "Без абароны"
412
412
413#: qml/Wizard/Pages/30-passwd-type.qml:100
413#: qml/Wizard/Pages/30-passwd-type.qml:100
414msgid "Passcode"
414msgid "Passcode"
415−msgstr ""
415+msgstr "Код-пароль"
416
416
417#: qml/Wizard/Pages/30-passwd-type.qml:101
417#: qml/Wizard/Pages/30-passwd-type.qml:101
418msgid "4 digits only"
418msgid "4 digits only"
419−msgstr ""
419+msgstr "Толькі 4 лічбы"
420
420
421#: qml/Wizard/Pages/30-passwd-type.qml:103
421#: qml/Wizard/Pages/30-passwd-type.qml:103
422msgid "Passphrase"
422msgid "Passphrase"
423−msgstr ""
423+msgstr "Пароль"
424
424
425#: qml/Wizard/Pages/30-passwd-type.qml:104
425#: qml/Wizard/Pages/30-passwd-type.qml:104
426msgid "Numbers and letters"
426msgid "Numbers and letters"
427−msgstr ""
427+msgstr "Лічбы і літары"
428
428
429#: qml/Wizard/Pages/40-wifi.qml:28
429#: qml/Wizard/Pages/40-wifi.qml:28
430msgid "Connect to Wi‑Fi"
430msgid "Connect to Wi‑Fi"
431−msgstr ""
431+msgstr "Злучыцца з Wi-Fi"
432
432
433#: qml/Wizard/Pages/40-wifi.qml:147
433#: qml/Wizard/Pages/40-wifi.qml:147
434msgid "Available networks…"
434msgid "Available networks…"
435−msgstr ""
435+msgstr "Даступныя сеткі..."
436
436
437#: qml/Wizard/Pages/40-wifi.qml:148
437#: qml/Wizard/Pages/40-wifi.qml:148
438msgid "No available networks."
438msgid "No available networks."
439−msgstr ""
439+msgstr "Няма даступных сетак."
440
440
441#: qml/Wizard/Pages/50-location.qml:27
441#: qml/Wizard/Pages/50-location.qml:27
442msgid "Location"
442msgid "Location"
443−msgstr ""
443+msgstr "Месца"
444
444
445#: qml/Wizard/Pages/50-location.qml:62
445#: qml/Wizard/Pages/50-location.qml:62
446msgid "Let the phone detect your location:"
446msgid "Let the phone detect your location:"
447−msgstr ""
447+msgstr "Дазволіць тэлефону вызначаць месцазнаходжанне:"
448
448
449#: qml/Wizard/Pages/50-location.qml:69
449#: qml/Wizard/Pages/50-location.qml:69
450msgid "Using GPS only (less accurate)"
450msgid "Using GPS only (less accurate)"
451−msgstr ""
451+msgstr "З дапамогай толькі GPS (найменш дакладна)"
452
452
453#: qml/Wizard/Pages/50-location.qml:86
453#: qml/Wizard/Pages/50-location.qml:86
454msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
454msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
455msgstr ""
455msgstr ""
456+"На аснове GPS, ананімізаванага Wi-Fi і дадзеных сотавай сеткі (рэкамендуецца)"
456
457
457#. TRANSLATORS: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
458#. TRANSLATORS: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
458#: qml/Wizard/Pages/50-location.qml:103
459#: qml/Wizard/Pages/50-location.qml:103
@@ -460,81 +461,87 @@ msgid ""
460"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
461"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
461"conditions</a>."
462"conditions</a>."
462msgstr ""
463msgstr ""
464+"Выбарам гэтага варыянту дзеянняў вы згаджаецеся з <a href='#'> умовамі "
465+"прадстаўлення паслуг Nokia HERE</a>."
463
466
464#: qml/Wizard/Pages/50-location.qml:112
467#: qml/Wizard/Pages/50-location.qml:112
465msgid "Not at all"
468msgid "Not at all"
466−msgstr ""
469+msgstr "Не дазваляць"
467
470
468#: qml/Wizard/Pages/50-location.qml:124
471#: qml/Wizard/Pages/50-location.qml:124
469msgid "You can change your mind later in <b>System Settings</b>."
472msgid "You can change your mind later in <b>System Settings</b>."
470−msgstr ""
473+msgstr "Пасля змяніць налады можна з дапамогай <b>Сістэмных параметраў</b>."
471
474
472#: qml/Wizard/Pages/60-reporting.qml:24
475#: qml/Wizard/Pages/60-reporting.qml:24
473msgid "Improving your experience"
476msgid "Improving your experience"
474−msgstr ""
477+msgstr "Спрашчэнне вашай працы"
475
478
476#: qml/Wizard/Pages/60-reporting.qml:36
479#: qml/Wizard/Pages/60-reporting.qml:36
477msgid ""
480msgid ""
478"Your phone is set up to automatically report errors to Canonical and its "
481"Your phone is set up to automatically report errors to Canonical and its "
479"partners, the makers of the operating system."
482"partners, the makers of the operating system."
480msgstr ""
483msgstr ""
484+"Ваш тэлефон настроены на аўтаматычную адпраўку справаздач пра памылкі ў "
485+"Canonical і партнёрскія установы, вытворцам аперацыйнай сістэмы."
481
486
482#: qml/Wizard/Pages/60-reporting.qml:43
487#: qml/Wizard/Pages/60-reporting.qml:43
483msgid ""
488msgid ""
484"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
489"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
485"Privacy</b>"
490"Privacy</b>"
486msgstr ""
491msgstr ""
492+"Гэтае можна адключыць у <b>Сістэмных параметрах</b>, <b>Бяспека &amp; "
493+"канфедэнцыйнасць</b>"
487
494
488#: qml/Wizard/Pages/80-finished.qml:24
495#: qml/Wizard/Pages/80-finished.qml:24
489msgid "All done"
496msgid "All done"
490−msgstr ""
497+msgstr "Зроблена"
491
498
492#: qml/Wizard/Pages/80-finished.qml:39
499#: qml/Wizard/Pages/80-finished.qml:39
493msgid "Nice work!"
500msgid "Nice work!"
494−msgstr ""
501+msgstr "Выдатная праца!"
495
502
496#: qml/Wizard/Pages/80-finished.qml:46
503#: qml/Wizard/Pages/80-finished.qml:46
497msgid "Your phone is now ready to use."
504msgid "Your phone is now ready to use."
498−msgstr ""
505+msgstr "Цяпер Вашым тэлефонам можна карыстацца."
499
506
500#: qml/Wizard/Pages/80-finished.qml:53
507#: qml/Wizard/Pages/80-finished.qml:53
501msgid "Finish"
508msgid "Finish"
502−msgstr ""
509+msgstr "Скончыць"
503
510
504#: qml/Wizard/Pages/here-terms.qml:27
511#: qml/Wizard/Pages/here-terms.qml:27
505msgid "Terms & Conditions"
512msgid "Terms & Conditions"
506−msgstr ""
513+msgstr "Умовы карыстання"
507
514
508#: qml/Wizard/Pages/passwd-confirm.qml:49
515#: qml/Wizard/Pages/passwd-confirm.qml:49
509msgid "Confirm passphrase"
516msgid "Confirm passphrase"
510−msgstr ""
517+msgstr "Пацвердзіце пароль"
511
518
512#: qml/Wizard/Pages/passwd-confirm.qml:50
519#: qml/Wizard/Pages/passwd-confirm.qml:50
513msgid "Confirm passcode"
520msgid "Confirm passcode"
514−msgstr ""
521+msgstr "Пацвердзіце код-пароль"
515
522
516#: qml/Wizard/Pages/passwd-confirm.qml:53
523#: qml/Wizard/Pages/passwd-confirm.qml:53
517#: qml/Wizard/Pages/passwd-confirm.qml:54
524#: qml/Wizard/Pages/passwd-confirm.qml:54
518msgid "Please try again."
525msgid "Please try again."
519−msgstr ""
526+msgstr "Калі ласка, паспрабуйце яшчэ раз."
520
527
521#: qml/Wizard/Pages/passwd-set.qml:61
528#: qml/Wizard/Pages/passwd-set.qml:61
522msgid "Choose your passcode"
529msgid "Choose your passcode"
523−msgstr ""
530+msgstr "Выберыце ваш код-пароль"
524
531
525#: qml/Wizard/Pages/passwd-set.qml:68
532#: qml/Wizard/Pages/passwd-set.qml:68
526msgid "Passphrase must be 4 characters long"
533msgid "Passphrase must be 4 characters long"
527−msgstr ""
534+msgstr "Пароль мусіць складацца мінімум з 4 сімвалаў"
528
535
529#: qml/Wizard/StackButton.qml:39
536#: qml/Wizard/StackButton.qml:39
530#, qt-format
537#, qt-format
531msgid "〈 %1"
538msgid "〈 %1"
532−msgstr ""
539+msgstr "〈 %1"
533
540
534#: qml/Wizard/StackButton.qml:42
541#: qml/Wizard/StackButton.qml:42
535#, qt-format
542#, qt-format
536msgid "%1 〉"
543msgid "%1 〉"
537−msgstr ""
544+msgstr "%1 〉"
538
545
539#~ msgid "Confirm"
546#~ msgid "Confirm"
540#~ msgstr "Пацвердзіць"
547#~ msgstr "Пацвердзіць"
po/ca.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"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"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
13"Language-Team: Catalan <ca@li.org>\n"
13"Language-Team: Catalan <ca@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"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"
19"X-Generator: Launchpad (build 17306)\n"
19"X-Generator: Launchpad (build 17306)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -293,7 +293,7 @@ msgstr "Ha fallat, feu un toc per tornar-ho a intentar"
293
293
294#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
294#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
295msgid "Reply"
295msgid "Reply"
296−msgstr ""
296+msgstr "Respon"
297
297
298#: qml/Panel/Indicators/ModemInfoItem.qml:105
298#: qml/Panel/Indicators/ModemInfoItem.qml:105
299msgid "Unlock SIM"
299msgid "Unlock SIM"
po/de.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"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"
12"Last-Translator: Niklas Wenzel <nikwen.developer@gmail.com>\n"
12"Last-Translator: Niklas Wenzel <nikwen.developer@gmail.com>\n"
13"Language-Team: German <de@li.org>\n"
13"Language-Team: German <de@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"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"
19"X-Generator: Launchpad (build 17306)\n"
19"X-Generator: Launchpad (build 17306)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -290,7 +290,7 @@ msgstr "Fehlgeschlagen, tippen Sie zum Wiederholen"
290
290
291#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
291#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
292msgid "Reply"
292msgid "Reply"
293−msgstr ""
293+msgstr "Antworten"
294
294
295#: qml/Panel/Indicators/ModemInfoItem.qml:105
295#: qml/Panel/Indicators/ModemInfoItem.qml:105
296msgid "Unlock SIM"
296msgid "Unlock SIM"
po/en_AU.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"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"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"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"
19"X-Generator: Launchpad (build 17306)\n"
19"X-Generator: Launchpad (build 17306)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -283,7 +283,7 @@ msgstr "Failed, tap to retry"
283
283
284#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
284#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
285msgid "Reply"
285msgid "Reply"
286−msgstr ""
286+msgstr "Reply"
287
287
288#: qml/Panel/Indicators/ModemInfoItem.qml:105
288#: qml/Panel/Indicators/ModemInfoItem.qml:105
289msgid "Unlock SIM"
289msgid "Unlock SIM"
po/es.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"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"
12"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
12"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
13"Language-Team: Spanish <es@li.org>\n"
13"Language-Team: Spanish <es@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"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"
19"X-Generator: Launchpad (build 17306)\n"
19"X-Generator: Launchpad (build 17306)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -290,7 +290,7 @@ msgstr "Falló, toque para reintentar"
290
290
291#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
291#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
292msgid "Reply"
292msgid "Reply"
293−msgstr ""
293+msgstr "Responder"
294
294
295#: qml/Panel/Indicators/ModemInfoItem.qml:105
295#: qml/Panel/Indicators/ModemInfoItem.qml:105
296msgid "Unlock SIM"
296msgid "Unlock SIM"
po/fa.po+4−4
@@ -8,15 +8,15 @@ msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"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"
12"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
12"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
13"Language-Team: Persian <fa@li.org>\n"
13"Language-Team: Persian <fa@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2015-01-28 06:30+0000\n"
18+"X-Launchpad-Export-Date: 2015-02-05 07:41+0000\n"
19−"X-Generator: Launchpad (build 17306)\n"
19+"X-Generator: Launchpad (build 17331)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
22msgid "Password: "
22msgid "Password: "
@@ -283,7 +283,7 @@ msgstr "شکست خورد، برای تلاش دوباره ضربه بزنید"
283
283
284#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
284#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
285msgid "Reply"
285msgid "Reply"
286−msgstr ""
286+msgstr "پاسخ"
287
287
288#: qml/Panel/Indicators/ModemInfoItem.qml:105
288#: qml/Panel/Indicators/ModemInfoItem.qml:105
289msgid "Unlock SIM"
289msgid "Unlock SIM"
po/fi.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"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"
12"Last-Translator: Jiri Grönroos <Unknown>\n"
12"Last-Translator: Jiri Grönroos <Unknown>\n"
13"Language-Team: Finnish <fi@li.org>\n"
13"Language-Team: Finnish <fi@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"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"
19"X-Generator: Launchpad (build 17306)\n"
19"X-Generator: Launchpad (build 17306)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -285,7 +285,7 @@ msgstr "Epäonnistunut, napauta yrittääksesi uudelleen"
285
285
286#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
286#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
287msgid "Reply"
287msgid "Reply"
288−msgstr ""
288+msgstr "Vastaa"
289
289
290#: qml/Panel/Indicators/ModemInfoItem.qml:105
290#: qml/Panel/Indicators/ModemInfoItem.qml:105
291msgid "Unlock SIM"
291msgid "Unlock SIM"
po/fr.po+4−4
@@ -8,15 +8,15 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"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"
12"Last-Translator: Jean Marc <Unknown>\n"
12"Last-Translator: Jean Marc <Unknown>\n"
13"Language-Team: French <fr@li.org>\n"
13"Language-Team: French <fr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"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-04 07:13+0000\n"
19−"X-Generator: Launchpad (build 17306)\n"
19+"X-Generator: Launchpad (build 17331)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
22msgid "Password: "
22msgid "Password: "
@@ -294,7 +294,7 @@ msgstr "Échec, appuyez pour réessayer"
294
294
295#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
295#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
296msgid "Reply"
296msgid "Reply"
297−msgstr ""
297+msgstr "Répondre"
298
298
299#: qml/Panel/Indicators/ModemInfoItem.qml:105
299#: qml/Panel/Indicators/ModemInfoItem.qml:105
300msgid "Unlock SIM"
300msgid "Unlock SIM"
po/gl.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"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"
12"Last-Translator: Marcos Lans <Unknown>\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
13"Language-Team: Galician <gl@li.org>\n"
13"Language-Team: Galician <gl@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"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"
19"X-Generator: Launchpad (build 17306)\n"
19"X-Generator: Launchpad (build 17306)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -283,7 +283,7 @@ msgstr "Fallou, toque para reintentar"
283
283
284#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
284#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
285msgid "Reply"
285msgid "Reply"
286−msgstr ""
286+msgstr "Responder"
287
287
288#: qml/Panel/Indicators/ModemInfoItem.qml:105
288#: qml/Panel/Indicators/ModemInfoItem.qml:105
289msgid "Unlock SIM"
289msgid "Unlock SIM"
po/hu.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"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"
12"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
12"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"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"
19"X-Generator: Launchpad (build 17306)\n"
19"X-Generator: Launchpad (build 17306)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -285,7 +285,7 @@ msgstr "Sikertelen, koppintson az újrapróbáláshoz"
285
285
286#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
286#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
287msgid "Reply"
287msgid "Reply"
288−msgstr ""
288+msgstr "Válasz"
289
289
290#: qml/Panel/Indicators/ModemInfoItem.qml:105
290#: qml/Panel/Indicators/ModemInfoItem.qml:105
291msgid "Unlock SIM"
291msgid "Unlock SIM"
po/it.po+4−4
@@ -8,14 +8,14 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2015-01-27 13:59+0000\n"
11+"PO-Revision-Date: 2015-01-28 10:55+0000\n"
12−"Last-Translator: Gio <gio.scino@gmail.com>\n"
12+"Last-Translator: Milo Casagrande <milo.casagrande@gmail.com>\n"
13"Language-Team: Italian <it@li.org>\n"
13"Language-Team: Italian <it@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"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"
19"X-Generator: Launchpad (build 17306)\n"
19"X-Generator: Launchpad (build 17306)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -292,7 +292,7 @@ msgstr "Non riuscito. Tocca per riprovare"
292
292
293#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
293#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
294msgid "Reply"
294msgid "Reply"
295−msgstr ""
295+msgstr "Rispondi"
296
296
297#: qml/Panel/Indicators/ModemInfoItem.qml:105
297#: qml/Panel/Indicators/ModemInfoItem.qml:105
298msgid "Unlock SIM"
298msgid "Unlock SIM"
po/nb.po+3−3
@@ -8,14 +8,14 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"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"
12"Last-Translator: Åka Sikrom <Unknown>\n"
12"Last-Translator: Åka Sikrom <Unknown>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"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"
19"X-Generator: Launchpad (build 17306)\n"
19"X-Generator: Launchpad (build 17306)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -285,7 +285,7 @@ msgstr "Feilet. Trykk for å prøve på nytt"
285
285
286#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
286#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
287msgid "Reply"
287msgid "Reply"
288−msgstr ""
288+msgstr "Svar"
289
289
290#: qml/Panel/Indicators/ModemInfoItem.qml:105
290#: qml/Panel/Indicators/ModemInfoItem.qml:105
291msgid "Unlock SIM"
291msgid "Unlock SIM"
po/ro.po+4−4
@@ -8,15 +8,15 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
11−"PO-Revision-Date: 2015-01-07 11:11+0000\n"
11+"PO-Revision-Date: 2015-01-28 14:27+0000\n"
12−"Last-Translator: Marian Vasile <marianvasile1972@gmail.com>\n"
12+"Last-Translator: Meriuță Cornel <meriutacornel@neacornel.eu>\n"
13"Language-Team: Romanian <ro@li.org>\n"
13"Language-Team: Romanian <ro@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
17"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
18"== 0) && (n != 0))) ? 2: 1));\n"
18"== 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"
20"X-Generator: Launchpad (build 17306)\n"
20"X-Generator: Launchpad (build 17306)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -291,7 +291,7 @@ msgstr "Eșec, atingeți pentru a încerca din nou"
291
291
292#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
292#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
293msgid "Reply"
293msgid "Reply"
294−msgstr ""
294+msgstr "Răspuns"
295
295
296#: qml/Panel/Indicators/ModemInfoItem.qml:105
296#: qml/Panel/Indicators/ModemInfoItem.qml:105
297msgid "Unlock SIM"
297msgid "Unlock SIM"
po/ru.po+5−5
@@ -8,7 +8,7 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"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"
12"Last-Translator: ☠Jay ZDLin☠ <Unknown>\n"
12"Last-Translator: ☠Jay ZDLin☠ <Unknown>\n"
13"Language-Team: Russian <ru@li.org>\n"
13"Language-Team: Russian <ru@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"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"
20"X-Generator: Launchpad (build 17306)\n"
20"X-Generator: Launchpad (build 17306)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -292,7 +292,7 @@ msgstr "Сбой, коснитесь для повтора"
292
292
293#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
293#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
294msgid "Reply"
294msgid "Reply"
295−msgstr ""
295+msgstr "Ответить"
296
296
297#: qml/Panel/Indicators/ModemInfoItem.qml:105
297#: qml/Panel/Indicators/ModemInfoItem.qml:105
298msgid "Unlock SIM"
298msgid "Unlock SIM"
@@ -468,7 +468,7 @@ msgstr ""
468
468
469#: qml/Wizard/Pages/50-location.qml:112
469#: qml/Wizard/Pages/50-location.qml:112
470msgid "Not at all"
470msgid "Not at all"
471−msgstr ""
471+msgstr "Нет (никогда)"
472
472
473#: qml/Wizard/Pages/50-location.qml:124
473#: qml/Wizard/Pages/50-location.qml:124
474msgid "You can change your mind later in <b>System Settings</b>."
474msgid "You can change your mind later in <b>System Settings</b>."
@@ -477,7 +477,7 @@ msgstr ""
477
477
478#: qml/Wizard/Pages/60-reporting.qml:24
478#: qml/Wizard/Pages/60-reporting.qml:24
479msgid "Improving your experience"
479msgid "Improving your experience"
480−msgstr ""
480+msgstr "Улучшение производительности"
481
481
482#: qml/Wizard/Pages/60-reporting.qml:36
482#: qml/Wizard/Pages/60-reporting.qml:36
483msgid ""
483msgid ""
po/sl.po+3−3
@@ -8,7 +8,7 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"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"
12"Last-Translator: Damir Jerovšek <Unknown>\n"
12"Last-Translator: Damir Jerovšek <Unknown>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
18"n%100==4 ? 3 : 0);\n"
18"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"
20"X-Generator: Launchpad (build 17306)\n"
20"X-Generator: Launchpad (build 17306)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -288,7 +288,7 @@ msgstr "Spodletelo, tapnite za ponovni poskus"
288
288
289#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
289#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
290msgid "Reply"
290msgid "Reply"
291−msgstr ""
291+msgstr "Odgovori"
292
292
293#: qml/Panel/Indicators/ModemInfoItem.qml:105
293#: qml/Panel/Indicators/ModemInfoItem.qml:105
294msgid "Unlock SIM"
294msgid "Unlock SIM"
po/tr.po+79−69
@@ -8,19 +8,19 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-01-22 11:09+0100\n"
10"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"
12"Last-Translator: Volkan Gezer <Unknown>\n"
12"Last-Translator: Volkan Gezer <Unknown>\n"
13"Language-Team: Turkish <tr@li.org>\n"
13"Language-Team: Turkish <tr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"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-02-05 07:41+0000\n"
19−"X-Generator: Launchpad (build 17306)\n"
19+"X-Generator: Launchpad (build 17331)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
22msgid "Password: "
22msgid "Password: "
23−msgstr ""
23+msgstr "Parola: "
24
24
25#: plugins/Unity/Launcher/launcheritem.cpp:45
25#: plugins/Unity/Launcher/launcheritem.cpp:45
26#: plugins/Unity/Launcher/launcheritem.cpp:100
26#: plugins/Unity/Launcher/launcheritem.cpp:100
@@ -33,30 +33,30 @@ msgstr "Kısayol iğnesini kaldır"
33
33
34#: qml/Components/DelayedLockscreen.qml:47
34#: qml/Components/DelayedLockscreen.qml:47
35msgid "Device Locked"
35msgid "Device Locked"
36−msgstr ""
36+msgstr "Cihaz Kilitli"
37
37
38#: qml/Components/DelayedLockscreen.qml:62
38#: qml/Components/DelayedLockscreen.qml:62
39msgid "You have been locked out due to too many failed passphrase attempts."
39msgid "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."
41
41
42#: qml/Components/DelayedLockscreen.qml:63
42#: qml/Components/DelayedLockscreen.qml:63
43msgid "You have been locked out due to too many failed passcode attempts."
43msgid "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."
45
45
46#: qml/Components/DelayedLockscreen.qml:72
46#: qml/Components/DelayedLockscreen.qml:72
47#, qt-format
47#, qt-format
48msgid "Please wait %1 minute and then try again…"
48msgid "Please wait %1 minute and then try again…"
49msgid_plural "Please wait %1 minutes and then try again…"
49msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
50+msgstr[0] "Lütfen %1 dakika bekleyin ve yeniden deneyin..."
51−msgstr[1] ""
51+msgstr[1] "Lütfen %1 dakika bekleyin ve yeniden deneyin..."
52
52
53#: qml/Components/Dialogs.qml:86
53#: qml/Components/Dialogs.qml:86
54msgid "Log out"
54msgid "Log out"
55−msgstr ""
55+msgstr "Oturumu kapat"
56
56
57#: qml/Components/Dialogs.qml:87
57#: qml/Components/Dialogs.qml:87
58msgid "Are you sure you want to log out?"
58msgid "Are you sure you want to log out?"
59−msgstr ""
59+msgstr "Oturumu kapatmak istediğinize emin misiniz?"
60
60
61#: qml/Components/Dialogs.qml:89 qml/Components/Dialogs.qml:111
61#: qml/Components/Dialogs.qml:89 qml/Components/Dialogs.qml:111
62#: qml/Components/Dialogs.qml:134
62#: qml/Components/Dialogs.qml:134
@@ -74,7 +74,7 @@ msgstr "Bilgisayarı Kapat"
74
74
75#: qml/Components/Dialogs.qml:109
75#: qml/Components/Dialogs.qml:109
76msgid "Are you sure you want to shut down?"
76msgid "Are you sure you want to shut down?"
77−msgstr ""
77+msgstr "Kapatmak istediğinize emin misiniz?"
78
78
79#: qml/Components/Dialogs.qml:131
79#: qml/Components/Dialogs.qml:131
80msgid "Reboot"
80msgid "Reboot"
@@ -86,7 +86,7 @@ msgstr "Bilgisayarı yeniden başlatmak istediğinize emin misiniz?"
86
86
87#: qml/Components/Dialogs.qml:154
87#: qml/Components/Dialogs.qml:154
88msgid "Power"
88msgid "Power"
89−msgstr ""
89+msgstr "Güç"
90
90
91#: qml/Components/Dialogs.qml:155
91#: qml/Components/Dialogs.qml:155
92msgid ""
92msgid ""
@@ -96,15 +96,15 @@ msgstr "Bilgisayarı kapatmak istediğinize emin misiniz?"
96
96
97#: qml/Components/Dialogs.qml:157
97#: qml/Components/Dialogs.qml:157
98msgid "Power off"
98msgid "Power off"
99−msgstr ""
99+msgstr "Kapat"
100
100
101#: qml/Components/Dialogs.qml:166
101#: qml/Components/Dialogs.qml:166
102msgid "Restart"
102msgid "Restart"
103−msgstr ""
103+msgstr "Yeniden başlat"
104
104
105#: qml/Components/Dialogs.qml:175
105#: qml/Components/Dialogs.qml:175
106msgid "Cancel"
106msgid "Cancel"
107−msgstr ""
107+msgstr "İptal"
108
108
109#: qml/Components/EdgeDemoOverlay.qml:151
109#: qml/Components/EdgeDemoOverlay.qml:151
110msgid "Skip intro"
110msgid "Skip intro"
@@ -157,7 +157,7 @@ msgstr ""
157
157
158#: qml/Components/Lockscreen.qml:238
158#: qml/Components/Lockscreen.qml:238
159msgid "Return to Call"
159msgid "Return to Call"
160−msgstr ""
160+msgstr "Çağrıya Dön"
161
161
162#: qml/Components/Lockscreen.qml:238
162#: qml/Components/Lockscreen.qml:238
163msgid "Emergency Call"
163msgid "Emergency Call"
@@ -186,11 +186,11 @@ msgstr "Mağaza"
186
186
187#: qml/Dash/PageHeader.qml:284
187#: qml/Dash/PageHeader.qml:284
188msgid "Settings"
188msgid "Settings"
189−msgstr ""
189+msgstr "Ayarlar"
190
190
191#: qml/Dash/PageHeader.qml:291
191#: qml/Dash/PageHeader.qml:291
192msgid "Remove from Favorites"
192msgid "Remove from Favorites"
193−msgstr ""
193+msgstr "Sık kullanılanlardan kaldır"
194
194
195#: qml/Dash/PageHeader.qml:291
195#: qml/Dash/PageHeader.qml:291
196msgid "Add to Favorites"
196msgid "Add to Favorites"
@@ -218,27 +218,27 @@ msgstr "Gönder"
218
218
219#: qml/Dash/PullToRefreshScopeStyle.qml:55
219#: qml/Dash/PullToRefreshScopeStyle.qml:55
220msgid "Pull to refresh…"
220msgid "Pull to refresh…"
221−msgstr ""
221+msgstr "Yenilemek için çekin..."
222
222
223#: qml/Dash/PullToRefreshScopeStyle.qml:60
223#: qml/Dash/PullToRefreshScopeStyle.qml:60
224msgid "Release to refresh…"
224msgid "Release to refresh…"
225−msgstr ""
225+msgstr "Yenilemek için bırakın..."
226
226
227#: qml/Dash/ScopesList.qml:66
227#: qml/Dash/ScopesList.qml:66
228msgid "Manage"
228msgid "Manage"
229−msgstr ""
229+msgstr "Yönet"
230
230
231#: qml/Dash/ScopesList.qml:112
231#: qml/Dash/ScopesList.qml:112
232msgid "Home"
232msgid "Home"
233−msgstr ""
233+msgstr "Ev"
234
234
235#: qml/Dash/ScopesList.qml:113
235#: qml/Dash/ScopesList.qml:113
236msgid "Also installed"
236msgid "Also installed"
237−msgstr ""
237+msgstr "Ayrıca kurulan"
238
238
239#: qml/Greeter/Greeter.qml:133
239#: qml/Greeter/Greeter.qml:133
240msgid "Unlock"
240msgid "Unlock"
241−msgstr ""
241+msgstr "Kilidi Aç"
242
242
243#: qml/Notifications/NotificationMenuItemFactory.qml:128
243#: qml/Notifications/NotificationMenuItemFactory.qml:128
244msgid "Show password"
244msgid "Show password"
@@ -246,15 +246,15 @@ msgstr "Parolayı göster"
246
246
247#: qml/Panel/ActiveCallHint.qml:79
247#: qml/Panel/ActiveCallHint.qml:79
248msgid "Tap to return to call..."
248msgid "Tap to return to call..."
249−msgstr ""
249+msgstr "Çağrıya dönmek için dokunun..."
250
250
251#: qml/Panel/ActiveCallHint.qml:92
251#: qml/Panel/ActiveCallHint.qml:92
252msgid "Conference"
252msgid "Conference"
253−msgstr ""
253+msgstr "Konferans"
254
254
255#: qml/Panel/Indicators/MenuItemFactory.qml:643
255#: qml/Panel/Indicators/MenuItemFactory.qml:643
256msgid "Nothing is playing"
256msgid "Nothing is playing"
257−msgstr ""
257+msgstr "Hiçbir şey çalmıyor"
258
258
259#: qml/Panel/Indicators/MenuItemFactory.qml:791
259#: qml/Panel/Indicators/MenuItemFactory.qml:791
260msgid "In queue…"
260msgid "In queue…"
@@ -282,7 +282,7 @@ msgstr "Başarısız, yeniden denemek için dokunun"
282
282
283#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
283#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
284msgid "Reply"
284msgid "Reply"
285−msgstr ""
285+msgstr "Yanıtla"
286
286
287#: qml/Panel/Indicators/ModemInfoItem.qml:105
287#: qml/Panel/Indicators/ModemInfoItem.qml:105
288msgid "Unlock SIM"
288msgid "Unlock SIM"
@@ -290,20 +290,20 @@ msgstr "SIM kilidini aç"
290
290
291#: qml/Panel/Indicators/RoamingIndication.qml:27
291#: qml/Panel/Indicators/RoamingIndication.qml:27
292msgid "Roaming"
292msgid "Roaming"
293−msgstr ""
293+msgstr "Dolaşım"
294
294
295#: qml/Shell.qml:390
295#: qml/Shell.qml:390
296#, qt-format
296#, qt-format
297msgid "Enter %1"
297msgid "Enter %1"
298−msgstr ""
298+msgstr "%1 Girin"
299
299
300#: qml/Shell.qml:391 qml/Wizard/Pages/passwd-set.qml:60
300#: qml/Shell.qml:391 qml/Wizard/Pages/passwd-set.qml:60
301msgid "Enter passphrase"
301msgid "Enter passphrase"
302−msgstr ""
302+msgstr "Parolayı girin"
303
303
304#: qml/Shell.qml:392
304#: qml/Shell.qml:392
305msgid "Enter passcode"
305msgid "Enter passcode"
306−msgstr ""
306+msgstr "Parolayı girin"
307
307
308#: qml/Shell.qml:393
308#: qml/Shell.qml:393
309#, qt-format
309#, qt-format
@@ -316,7 +316,7 @@ msgstr "Üzgünüm, hatalı parola"
316
316
317#: qml/Shell.qml:395
317#: qml/Shell.qml:395
318msgid "Please re-enter"
318msgid "Please re-enter"
319−msgstr ""
319+msgstr "Lütfen yeniden girin"
320
320
321#: qml/Shell.qml:396
321#: qml/Shell.qml:396
322msgid "Sorry, incorrect passcode"
322msgid "Sorry, incorrect passcode"
@@ -352,98 +352,101 @@ msgstr ""
352
352
353#: qml/Wizard/Page.qml:89
353#: qml/Wizard/Page.qml:89
354msgid "Back"
354msgid "Back"
355−msgstr ""
355+msgstr "Geri"
356
356
357#: qml/Wizard/Pages/10-welcome.qml:27
357#: qml/Wizard/Pages/10-welcome.qml:27
358msgid "Hi!"
358msgid "Hi!"
359−msgstr ""
359+msgstr "Merhaba!"
360
360
361#: qml/Wizard/Pages/10-welcome.qml:44
361#: qml/Wizard/Pages/10-welcome.qml:44
362msgid "Welcome to your Ubuntu phone."
362msgid "Welcome to your Ubuntu phone."
363−msgstr ""
363+msgstr "Ubuntu telefonunuza hoş geldiniz."
364
364
365#: qml/Wizard/Pages/10-welcome.qml:52
365#: qml/Wizard/Pages/10-welcome.qml:52
366msgid "Let’s get started."
366msgid "Let’s get started."
367−msgstr ""
367+msgstr "Hadi başlayalım."
368
368
369#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
369#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
370#: qml/Wizard/Pages/40-wifi.qml:197 qml/Wizard/Pages/50-location.qml:131
370#: qml/Wizard/Pages/40-wifi.qml:197 qml/Wizard/Pages/50-location.qml:131
371#: qml/Wizard/Pages/60-reporting.qml:50 qml/Wizard/Pages/passwd-confirm.qml:82
371#: qml/Wizard/Pages/60-reporting.qml:50 qml/Wizard/Pages/passwd-confirm.qml:82
372#: qml/Wizard/Pages/passwd-set.qml:90
372#: qml/Wizard/Pages/passwd-set.qml:90
373msgid "Continue"
373msgid "Continue"
374−msgstr ""
374+msgstr "Devam Et"
375
375
376#: qml/Wizard/Pages/20-sim.qml:25
376#: qml/Wizard/Pages/20-sim.qml:25
377msgid "Add a SIM card and restart your device"
377msgid "Add a SIM card and restart your device"
378−msgstr ""
378+msgstr "Bir SIM kartı ekleyin ve cihazınızı yeniden başlatın"
379
379
380#: qml/Wizard/Pages/20-sim.qml:55
380#: qml/Wizard/Pages/20-sim.qml:55
381msgid "Without it, you won’t be able to make calls or use text messaging."
381msgid "Without it, you won’t be able to make calls or use text messaging."
382msgstr ""
382msgstr ""
383+"Bir kart olmadan arama yapamaz veya metin mesaj gönderimini kullanamazsınız."
383
384
384#: qml/Wizard/Pages/20-sim.qml:69 qml/Wizard/Pages/40-wifi.qml:197
385#: qml/Wizard/Pages/20-sim.qml:69 qml/Wizard/Pages/40-wifi.qml:197
385msgid "Skip"
386msgid "Skip"
386−msgstr ""
387+msgstr "Atla"
387
388
388#: qml/Wizard/Pages/30-passwd-type.qml:39
389#: qml/Wizard/Pages/30-passwd-type.qml:39
389msgid "Lock security"
390msgid "Lock security"
390−msgstr ""
391+msgstr "Kilitleme güvenliği"
391
392
392#: qml/Wizard/Pages/30-passwd-type.qml:74
393#: qml/Wizard/Pages/30-passwd-type.qml:74
393msgid "Please select how you’d like to unlock your phone."
394msgid "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."
395
396
396#: qml/Wizard/Pages/30-passwd-type.qml:97
397#: qml/Wizard/Pages/30-passwd-type.qml:97
397msgid "Swipe"
398msgid "Swipe"
398−msgstr ""
399+msgstr "Kaydır"
399
400
400#: qml/Wizard/Pages/30-passwd-type.qml:98
401#: qml/Wizard/Pages/30-passwd-type.qml:98
401msgid "No security"
402msgid "No security"
402−msgstr ""
403+msgstr "Güvenlik yok"
403
404
404#: qml/Wizard/Pages/30-passwd-type.qml:100
405#: qml/Wizard/Pages/30-passwd-type.qml:100
405msgid "Passcode"
406msgid "Passcode"
406−msgstr ""
407+msgstr "Parola"
407
408
408#: qml/Wizard/Pages/30-passwd-type.qml:101
409#: qml/Wizard/Pages/30-passwd-type.qml:101
409msgid "4 digits only"
410msgid "4 digits only"
410−msgstr ""
411+msgstr "Sadece 4 hane"
411
412
412#: qml/Wizard/Pages/30-passwd-type.qml:103
413#: qml/Wizard/Pages/30-passwd-type.qml:103
413msgid "Passphrase"
414msgid "Passphrase"
414−msgstr ""
415+msgstr "Parola"
415
416
416#: qml/Wizard/Pages/30-passwd-type.qml:104
417#: qml/Wizard/Pages/30-passwd-type.qml:104
417msgid "Numbers and letters"
418msgid "Numbers and letters"
418−msgstr ""
419+msgstr "Sayı ve harfler"
419
420
420#: qml/Wizard/Pages/40-wifi.qml:28
421#: qml/Wizard/Pages/40-wifi.qml:28
421msgid "Connect to Wi‑Fi"
422msgid "Connect to Wi‑Fi"
422−msgstr ""
423+msgstr "Wi-Fi'ye Bağlan"
423
424
424#: qml/Wizard/Pages/40-wifi.qml:147
425#: qml/Wizard/Pages/40-wifi.qml:147
425msgid "Available networks…"
426msgid "Available networks…"
426−msgstr ""
427+msgstr "Kullanılabilir ağlar..."
427
428
428#: qml/Wizard/Pages/40-wifi.qml:148
429#: qml/Wizard/Pages/40-wifi.qml:148
429msgid "No available networks."
430msgid "No available networks."
430−msgstr ""
431+msgstr "Kullanılabilir ağ yok."
431
432
432#: qml/Wizard/Pages/50-location.qml:27
433#: qml/Wizard/Pages/50-location.qml:27
433msgid "Location"
434msgid "Location"
434−msgstr ""
435+msgstr "Konum"
435
436
436#: qml/Wizard/Pages/50-location.qml:62
437#: qml/Wizard/Pages/50-location.qml:62
437msgid "Let the phone detect your location:"
438msgid "Let the phone detect your location:"
438−msgstr ""
439+msgstr "Telefonun konumunuzu bulmasına izin verin:"
439
440
440#: qml/Wizard/Pages/50-location.qml:69
441#: qml/Wizard/Pages/50-location.qml:69
441msgid "Using GPS only (less accurate)"
442msgid "Using GPS only (less accurate)"
442−msgstr ""
443+msgstr "Sadece GPS kullanarak (daha az kesinlik)"
443
444
444#: qml/Wizard/Pages/50-location.qml:86
445#: qml/Wizard/Pages/50-location.qml:86
445msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
446msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
446msgstr ""
447msgstr ""
448+"GPS, anonimleştirilmiş Wi-Fi ve cep telefonu ağı bilgileri kullanarak "
449+"(önerilir)"
447
450
448#. TRANSLATORS: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
451#. TRANSLATORS: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
449#: qml/Wizard/Pages/50-location.qml:103
452#: qml/Wizard/Pages/50-location.qml:103
@@ -451,81 +454,88 @@ msgid ""
451"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
454"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
452"conditions</a>."
455"conditions</a>."
453msgstr ""
456msgstr ""
457+"Bu seçeneği işaretleyerek Nokia HERE <a href='#'>koşul ve şartlarını</a>nı "
458+"kabul ediyorsunuz."
454
459
455#: qml/Wizard/Pages/50-location.qml:112
460#: qml/Wizard/Pages/50-location.qml:112
456msgid "Not at all"
461msgid "Not at all"
457−msgstr ""
462+msgstr "Etmiyorum"
458
463
459#: qml/Wizard/Pages/50-location.qml:124
464#: qml/Wizard/Pages/50-location.qml:124
460msgid "You can change your mind later in <b>System Settings</b>."
465msgid "You can change your mind later in <b>System Settings</b>."
461msgstr ""
466msgstr ""
467+"Kararınızı daha sonra <b>Sistem Ayarları</b> içerisinden değiştirebilirsiniz."
462
468
463#: qml/Wizard/Pages/60-reporting.qml:24
469#: qml/Wizard/Pages/60-reporting.qml:24
464msgid "Improving your experience"
470msgid "Improving your experience"
465−msgstr ""
471+msgstr "Deneyiminizi arttırmak"
466
472
467#: qml/Wizard/Pages/60-reporting.qml:36
473#: qml/Wizard/Pages/60-reporting.qml:36
468msgid ""
474msgid ""
469"Your phone is set up to automatically report errors to Canonical and its "
475"Your phone is set up to automatically report errors to Canonical and its "
470"partners, the makers of the operating system."
476"partners, the makers of the operating system."
471msgstr ""
477msgstr ""
478+"Telefonunuz, işletim sisteminin üreticileri olan Canonical ve ortaklarına "
479+"hataları otomatik olarak bildirmek üzere yapılandırıldı."
472
480
473#: qml/Wizard/Pages/60-reporting.qml:43
481#: qml/Wizard/Pages/60-reporting.qml:43
474msgid ""
482msgid ""
475"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
483"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
476"Privacy</b>"
484"Privacy</b>"
477msgstr ""
485msgstr ""
486+"Bu <b>Sistem Ayarları</b> içerisindeki <b>Güvenlik ve Gizlilik</b> altından "
487+"devre dışı bırakılabilir"
478
488
479#: qml/Wizard/Pages/80-finished.qml:24
489#: qml/Wizard/Pages/80-finished.qml:24
480msgid "All done"
490msgid "All done"
481−msgstr ""
491+msgstr "Her şey tamam"
482
492
483#: qml/Wizard/Pages/80-finished.qml:39
493#: qml/Wizard/Pages/80-finished.qml:39
484msgid "Nice work!"
494msgid "Nice work!"
485−msgstr ""
495+msgstr "İyi iş!"
486
496
487#: qml/Wizard/Pages/80-finished.qml:46
497#: qml/Wizard/Pages/80-finished.qml:46
488msgid "Your phone is now ready to use."
498msgid "Your phone is now ready to use."
489−msgstr ""
499+msgstr "Telefonunuz artık kullanıma hazır."
490
500
491#: qml/Wizard/Pages/80-finished.qml:53
501#: qml/Wizard/Pages/80-finished.qml:53
492msgid "Finish"
502msgid "Finish"
493−msgstr ""
503+msgstr "Son"
494
504
495#: qml/Wizard/Pages/here-terms.qml:27
505#: qml/Wizard/Pages/here-terms.qml:27
496msgid "Terms & Conditions"
506msgid "Terms & Conditions"
497−msgstr ""
507+msgstr "Şartlar ve Koşullar"
498
508
499#: qml/Wizard/Pages/passwd-confirm.qml:49
509#: qml/Wizard/Pages/passwd-confirm.qml:49
500msgid "Confirm passphrase"
510msgid "Confirm passphrase"
501−msgstr ""
511+msgstr "Parolayı yinele"
502
512
503#: qml/Wizard/Pages/passwd-confirm.qml:50
513#: qml/Wizard/Pages/passwd-confirm.qml:50
504msgid "Confirm passcode"
514msgid "Confirm passcode"
505−msgstr ""
515+msgstr "Parolayı yinele"
506
516
507#: qml/Wizard/Pages/passwd-confirm.qml:53
517#: qml/Wizard/Pages/passwd-confirm.qml:53
508#: qml/Wizard/Pages/passwd-confirm.qml:54
518#: qml/Wizard/Pages/passwd-confirm.qml:54
509msgid "Please try again."
519msgid "Please try again."
510−msgstr ""
520+msgstr "Lütfen yeniden deneyin."
511
521
512#: qml/Wizard/Pages/passwd-set.qml:61
522#: qml/Wizard/Pages/passwd-set.qml:61
513msgid "Choose your passcode"
523msgid "Choose your passcode"
514−msgstr ""
524+msgstr "Parolanızı seçin"
515
525
516#: qml/Wizard/Pages/passwd-set.qml:68
526#: qml/Wizard/Pages/passwd-set.qml:68
517msgid "Passphrase must be 4 characters long"
527msgid "Passphrase must be 4 characters long"
518−msgstr ""
528+msgstr "Parola 4 karakter olmalı"
519
529
520#: qml/Wizard/StackButton.qml:39
530#: qml/Wizard/StackButton.qml:39
521#, qt-format
531#, qt-format
522msgid "〈 %1"
532msgid "〈 %1"
523−msgstr ""
533+msgstr "〈 %1"
524
534
525#: qml/Wizard/StackButton.qml:42
535#: qml/Wizard/StackButton.qml:42
526#, qt-format
536#, qt-format
527msgid "%1 〉"
537msgid "%1 〉"
528−msgstr ""
538+msgstr "%1 〉"
529
539
530#~ msgid "Confirm"
540#~ msgid "Confirm"
531#~ msgstr "Onayla"
541#~ msgstr "Onayla"
qml/Components/Carousel.qml+6−2
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -14,7 +14,7 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17−import QtQuick 2.0
17+import QtQuick 2.3
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import "carousel.js" as CarouselJS
19import "carousel.js" as CarouselJS
20
20
@@ -38,6 +38,8 @@ Item {
38 property alias tileAspectRatio: listView.tileAspectRatio
38 property alias tileAspectRatio: listView.tileAspectRatio
39 /// Used to cache some delegates for performance reasons. See the ListView documentation for details
39 /// Used to cache some delegates for performance reasons. See the ListView documentation for details
40 property alias cacheBuffer: listView.cacheBuffer
40 property alias cacheBuffer: listView.cacheBuffer
41+ property alias displayMarginBeginning: listView.displayMarginBeginning
42+ property alias displayMarginEnd: listView.displayMarginEnd
41 /// Width of the "draw buffer" in pixel. The drawBuffer is an additional area at start/end where
43 /// Width of the "draw buffer" in pixel. The drawBuffer is an additional area at start/end where
42 /// items drawn, even if it is not in the visible area.
44 /// items drawn, even if it is not in the visible area.
43 /// cacheBuffer controls only the to retain delegates outside the visible area (and is used on top of the drawBuffer)
45 /// cacheBuffer controls only the to retain delegates outside the visible area (and is used on top of the drawBuffer)
@@ -51,6 +53,8 @@ Item {
51 readonly property alias currentItem: listView.currentItem
53 readonly property alias currentItem: listView.currentItem
52 /// exposes the distance to the next row (only one row in carousel, so it's the topMargins)
54 /// exposes the distance to the next row (only one row in carousel, so it's the topMargins)
53 readonly property alias verticalSpacing: listView.verticalMargin
55 readonly property alias verticalSpacing: listView.verticalMargin
56+ /// the width of the internal list
57+ readonly property alias innerWidth: listView.width
54
58
55 implicitHeight: listView.tileHeight * selectedItemScaleFactor
59 implicitHeight: listView.tileHeight * selectedItemScaleFactor
56 opacity: listView.highlightIndex === -1 ? 1 : 0.6
60 opacity: listView.highlightIndex === -1 ? 1 : 0.6
qml/Dash/CardCarousel.qml+6−2
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -23,6 +23,8 @@ DashRenderer {
23
23
24 expandedHeight: carousel.implicitHeight + units.gu(6)
24 expandedHeight: carousel.implicitHeight + units.gu(6)
25 collapsedHeight: expandedHeight
25 collapsedHeight: expandedHeight
26+ growsVertically: false
27+ innerWidth: carousel.innerWidth
26
28
27 Carousel {
29 Carousel {
28 id: carousel
30 id: carousel
@@ -32,7 +34,9 @@ DashRenderer {
32 // and push others back.
34 // and push others back.
33 minimumTileWidth: cardTool.cardWidth / selectedItemScaleFactor
35 minimumTileWidth: cardTool.cardWidth / selectedItemScaleFactor
34 selectedItemScaleFactor: cardTool.carouselSelectedItemScaleFactor
36 selectedItemScaleFactor: cardTool.carouselSelectedItemScaleFactor
35− cacheBuffer: 1404 // 18px * 13gu * 6
37+ cacheBuffer: cardCarousel.cacheBuffer
38+ displayMarginBeginning: cardCarousel.displayMarginBeginning
39+ displayMarginEnd: cardCarousel.displayMarginEnd
36 model: cardCarousel.model
40 model: cardCarousel.model
37
41
38 property real fontScale: 1 / selectedItemScaleFactor
42 property real fontScale: 1 / selectedItemScaleFactor
qml/Dash/CardHorizontalList.qml+7−2
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2014-2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -14,7 +14,7 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17−import QtQuick 2.2
17+import QtQuick 2.3
18import Ubuntu.Components 1.1
18import Ubuntu.Components 1.1
19import "../Components"
19import "../Components"
20
20
@@ -23,6 +23,8 @@ DashRenderer {
23
23
24 expandedHeight: cardTool.cardHeight + units.gu(2)
24 expandedHeight: cardTool.cardHeight + units.gu(2)
25 collapsedHeight: expandedHeight
25 collapsedHeight: expandedHeight
26+ growsVertically: false
27+ innerWidth: Math.max(0, listView.width)
26 clip: true
28 clip: true
27
29
28 ListView {
30 ListView {
@@ -36,6 +38,9 @@ DashRenderer {
36 spacing: units.gu(1)
38 spacing: units.gu(1)
37 model: root.model
39 model: root.model
38 orientation: ListView.Horizontal
40 orientation: ListView.Horizontal
41+ cacheBuffer: root.cacheBuffer
42+ displayMarginBeginning: root.displayMarginBeginning
43+ displayMarginEnd: root.displayMarginEnd
39
44
40 delegate: Loader {
45 delegate: Loader {
41 id: loader
46 id: loader
qml/Dash/DashRenderer.qml+6−1
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -31,6 +31,11 @@ Item {
31
31
32 property real originY: 0
32 property real originY: 0
33
33
34+ property bool growsVertically: true
35+
36+ // If growsVertically the width of the item inside the renderer
37+ property real innerWidth: 0
38+
34 // The model to renderer
39 // The model to renderer
35 property var model
40 property var model
36
41
qml/Dash/GenericScopeView.qml+91−48
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013-2014 Canonical, Ltd.
2+ * Copyright (C) 2013-2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -401,59 +401,102 @@ FocusScope {
401 }
401 }
402
402
403 if (item && item.hasOwnProperty("displayMarginBeginning")) {
403 if (item && item.hasOwnProperty("displayMarginBeginning")) {
404+ if (item.growsVertically) {
404− // A item view creates its delegates synchronously from
405+ // A item view creates its delegates synchronously from
405− // -displayMarginBeginning
406+ // -displayMarginBeginning
406− // to
407+ // to
407− // height + displayMarginEnd
408+ // height + displayMarginEnd
408− // Around that area it adds the cacheBuffer area where delegates are created async
409+ // Around that area it adds the cacheBuffer area where delegates are created async
409− //
410+ //
410− // We adjust displayMarginBeginning and displayMarginEnd so
411+ // We adjust displayMarginBeginning and displayMarginEnd so
411− // * In non visible scopes nothing is considered visible and we set cacheBuffer
412+ // * 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+ // 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+ // * 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+ // use cacheBuffer to create extra items for categoryView.height * 1.5
415− // to make scrolling nicer by mantaining a higher number of
416+ // to make scrolling nicer by mantaining a higher number of
416− // cached items
417+ // cached items
417− // * For non current but visible scopes (i.e. when the user changes from one scope
418+ // * 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+ // to the next, we set the visible range to the viewport so
419− // items are not culled (invisible) but still use no cacheBuffer
420+ // items are not culled (invisible) but still use no cacheBuffer
420− // (it will be set once the scope is the current one)
421+ // (it will be set once the scope is the current one)
421− var displayMarginBeginning = baseItem.y;
422+ var displayMarginBeginning = baseItem.y;
422− displayMarginBeginning = -Math.max(-displayMarginBeginning, 0);
423+ displayMarginBeginning = -Math.max(-displayMarginBeginning, 0);
423− displayMarginBeginning = -Math.min(-displayMarginBeginning, baseItem.height);
424+ displayMarginBeginning = -Math.min(-displayMarginBeginning, baseItem.height);
424− displayMarginBeginning = Math.round(displayMarginBeginning);
425+ displayMarginBeginning = Math.round(displayMarginBeginning);
425− var displayMarginEnd = -baseItem.height + seeAll.height + categoryView.height - baseItem.y;
426+ var displayMarginEnd = -baseItem.height + seeAll.height + categoryView.height - baseItem.y;
426− displayMarginEnd = -Math.max(-displayMarginEnd, 0);
427+ displayMarginEnd = -Math.max(-displayMarginEnd, 0);
427− displayMarginEnd = -Math.min(-displayMarginEnd, baseItem.height);
428+ displayMarginEnd = -Math.min(-displayMarginEnd, baseItem.height);
428− displayMarginEnd = Math.round(displayMarginEnd);
429+ displayMarginEnd = Math.round(displayMarginEnd);
430+
429− if (scopeView.isCurrent || scopeView.visibleToParent) {
431+ if (scopeView.isCurrent || scopeView.visibleToParent) {
430− item.displayMarginBeginning = displayMarginBeginning;
432+ item.displayMarginBeginning = displayMarginBeginning;
431− item.displayMarginEnd = displayMarginEnd;
433+ item.displayMarginEnd = displayMarginEnd;
432− if (holdingList && holdingList.moving) {
434+ if (holdingList && holdingList.moving) {
433− // If we are moving we need to reset the cache buffer of the
435+ // 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
436+ // 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
437+ // 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
438+ // visible range will trigger some item creations and we want move to
437− // be as smooth as possible meaning no need creations
439+ // be as smooth as possible meaning no need creations
438− if (!wasCurrentOnMoveStart) {
440+ if (!wasCurrentOnMoveStart) {
441+ item.cacheBuffer = 0;
442+ }
443+ } else {
439− item.cacheBuffer = 0;
444+ item.cacheBuffer = categoryView.height * 1.5;
440 }
445 }
441 } else {
446 } 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+ }
443 }
460 }
444 } else {
461 } else {
445− var visibleRange = baseItem.height + displayMarginEnd + displayMarginBeginning;
462+ var buffer = wasCurrentOnMoveStart ? categoryView.height * 1.5 : 0;
446− if (visibleRange < 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
447− item.displayMarginBeginning = displayMarginBeginning;
469+ item.displayMarginBeginning = 0;
448− item.displayMarginEnd = displayMarginEnd;
470+ item.displayMarginEnd = -item.innerWidth;
449 item.cacheBuffer = 0;
471 item.cacheBuffer = 0;
450 } else {
472 } else {
451− // This should be visibleRange/2 in each of the properties
473+ if (onViewport && (scopeView.isCurrent || scopeView.visibleToParent)) {
452− // but some item views still (like GridView) like creating sync delegates even if
474+ // If on the buffered viewport and the viewport and the on a visible scope
453− // the visible range is 0 so let's make sure the visible range is negative
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
454− item.displayMarginBeginning = displayMarginBeginning - visibleRange;
496+ item.displayMarginBeginning = 0;
455− item.displayMarginEnd = displayMarginEnd - visibleRange;
497+ item.displayMarginEnd = -item.innerWidth;
456− item.cacheBuffer = visibleRange;
498+ item.cacheBuffer = item.innerWidth;
499+ }
457 }
500 }
458 }
501 }
459 }
502 }
qml/Greeter/Greeter.qml+8
@@ -30,6 +30,9 @@ Showable {
30
30
31 property url background
31 property url background
32
32
33+ // so that it can be replaced in tests with a mock object
34+ property var inputMethod: Qt.inputMethod
35+
33 prepareToHide: function () {
36 prepareToHide: function () {
34 hideTranslation.to = greeter.x > 0 || d.forceRightOnNextHideAnimation ? greeter.width : -greeter.width;
37 hideTranslation.to = greeter.x > 0 || d.forceRightOnNextHideAnimation ? greeter.width : -greeter.width;
35 d.forceRightOnNextHideAnimation = false;
38 d.forceRightOnNextHideAnimation = false;
@@ -102,6 +105,11 @@ Showable {
102 }
105 }
103 onUnlocked: greeter.unlocked(uid);
106 onUnlocked: greeter.unlocked(uid);
104 }
107 }
108+ Binding {
109+ target: greeterContentLoader.item
110+ property: "inputMethod"
111+ value: greeter.inputMethod
112+ }
105 }
113 }
106
114
107 DragHandle {
115 DragHandle {
qml/Greeter/GreeterContent.qml+6−2
@@ -24,6 +24,8 @@ Item {
24 id: root
24 id: root
25 anchors.fill: parent
25 anchors.fill: parent
26
26
27+ property var inputMethod
28+
27 property bool ready: background.source == "" || background.status == Image.Ready || background.status == Image.Error
29 property bool ready: background.source == "" || background.status == Image.Ready || background.status == Image.Error
28
30
29 signal selected(int uid)
31 signal selected(int uid)
@@ -74,10 +76,12 @@ Item {
74 anchors {
76 anchors {
75 left: parent.left
77 left: parent.left
76 leftMargin: Math.min(parent.width * 0.16, units.gu(20))
78 leftMargin: Math.min(parent.width * 0.16, units.gu(20))
77− verticalCenter: parent.verticalCenter
79+ top: parent.top
78 }
80 }
79 width: units.gu(29)
81 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 {} }
81
85
82 // TODO: Once we have a system API for determining which mode we are
86 // TODO: Once we have a system API for determining which mode we are
83 // in, tablet/phone/desktop, that should be used instead of narrowMode.
87 // in, tablet/phone/desktop, that should be used instead of narrowMode.
qml/Shell.qml+1−1
@@ -420,7 +420,7 @@ Item {
420 onShownChanged: if (shown) greeter.lockedApp = ""
420 onShownChanged: if (shown) greeter.lockedApp = ""
421
421
422 function maybeShow() {
422 function maybeShow() {
423− if (!shell.forcedUnlock) {
423+ if (!shell.forcedUnlock && !shown) {
424 showNow();
424 showNow();
425 }
425 }
426 }
426 }
qml/Wizard/Pages.qml+2
@@ -41,6 +41,8 @@ Item {
41 }
41 }
42
42
43 function quitWizard() {
43 function quitWizard() {
44+ pageStack.currentPage.enabled = false;
45+
44 var errorMsg = securityPrivacy.setSecurity("", password, passwordMethod)
46 var errorMsg = securityPrivacy.setSecurity("", password, passwordMethod)
45 if (errorMsg !== "") {
47 if (errorMsg !== "") {
46 // Ignore (but log) any errors, since we're past where the user set
48 // 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 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import QMenuModel 0.1 as QMenuModel
18import QMenuModel 0.1 as QMenuModel
19+import QtSystemInfo 5.0
19import Ubuntu.Components 0.1
20import Ubuntu.Components 0.1
20import Ubuntu.Components.ListItems 0.1 as ListItem
21import Ubuntu.Components.ListItems 0.1 as ListItem
21import Ubuntu.Settings.Menus 0.1 as Menus
22import Ubuntu.Settings.Menus 0.1 as Menus
@@ -28,7 +29,7 @@ LocalComponents.Page {
28 title: i18n.tr("Connect to Wi‑Fi")
29 title: i18n.tr("Connect to Wi‑Fi")
29 forwardButtonSourceComponent: forwardButton
30 forwardButtonSourceComponent: forwardButton
30
31
31− readonly property bool connected: mainMenu.connectedAPs === 1
32+ readonly property bool connected: networkInfo.accessPointName
32
33
33 function getExtendedProperty(object, propertyName, defaultValue) {
34 function getExtendedProperty(object, propertyName, defaultValue) {
34 if (object && object.hasOwnProperty(propertyName)) {
35 if (object && object.hasOwnProperty(propertyName)) {
@@ -44,6 +45,31 @@ LocalComponents.Page {
44 menuObjectPath: "/com/canonical/indicator/network/phone_wifi_settings"
45 menuObjectPath: "/com/canonical/indicator/network/phone_wifi_settings"
45 }
46 }
46
47
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+
47 Component {
73 Component {
48 id: accessPointComponent
74 id: accessPointComponent
49 ListItem.Standard {
75 ListItem.Standard {
@@ -119,11 +145,6 @@ LocalComponents.Page {
119 onCheckedChanged: {
145 onCheckedChanged: {
120 // Can't rely on binding. Checked is assigned on click.
146 // Can't rely on binding. Checked is assigned on click.
121 checkBoxActive.checked = checked;
147 checkBoxActive.checked = checked;
122− if (checked) {
123− mainMenu.connectedAPs++
124− } else {
125− mainMenu.connectedAPs--
126− }
127 }
148 }
128 onActivate: unityMenuModel.activate(menuIndex);
149 onActivate: unityMenuModel.activate(menuIndex);
129 }
150 }
@@ -165,9 +186,6 @@ LocalComponents.Page {
165 Repeater {
186 Repeater {
166 id: mainMenu
187 id: mainMenu
167
188
168− // FIXME Check connection better https://bugs.launchpad.net/indicator-network/+bug/1349371
169− property int connectedAPs: 0
170−
171 model: menuModel
189 model: menuModel
172
190
173 delegate: Loader {
191 delegate: Loader {
run.sh+3−26
@@ -6,8 +6,6 @@ export QML2_IMPORT_PATH
6QML_PHONE_SHELL_PATH=./builddir/src/unity8
6QML_PHONE_SHELL_PATH=./builddir/src/unity8
7GDB=false
7GDB=false
8FAKE=false
8FAKE=false
9−PINLOCK=false
10−KEYLOCK=false
11USE_MOCKS=false
9USE_MOCKS=false
12MOUSE_TOUCH=true
10MOUSE_TOUCH=true
13
11
@@ -16,9 +14,6 @@ usage() {
16 echo "Script to run the shell.\n" >&2
14 echo "Script to run the shell.\n" >&2
17 echo "OPTIONS:" >&2
15 echo "OPTIONS:" >&2
18 echo " -f, --fake Force use of fake Qml modules." >&2
16 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
22 echo " -g, --gdb Run through gdb." >&2
17 echo " -g, --gdb Run through gdb." >&2
23 echo " -h, --help Show this help." >&2
18 echo " -h, --help Show this help." >&2
24 echo " -m, --nomousetouch Run without -mousetouch argument." >&2
19 echo " -m, --nomousetouch Run without -mousetouch argument." >&2
@@ -26,7 +21,7 @@ usage() {
26 exit 1
21 exit 1
27}
22}
28
23
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" -- "$@"`
30[ $? -ne 0 ] && usage
25[ $? -ne 0 ] && usage
31eval set -- "$ARGS"
26eval set -- "$ARGS"
32
27
@@ -34,12 +29,6 @@ while [ $# -gt 0 ]
34do
29do
35 case "$1" in
30 case "$1" in
36 -f|--fake) USE_MOCKS=true;;
31 -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;;
43 -g|--gdb) GDB=true;;
32 -g|--gdb) GDB=true;;
44 -h|--help) usage;;
33 -h|--help) usage;;
45 -m|--nomousetouch) MOUSE_TOUCH=false;;
34 -m|--nomousetouch) MOUSE_TOUCH=false;;
@@ -48,23 +37,11 @@ do
48 shift
37 shift
49done
38done
50
39
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−
60if $USE_MOCKS; then
40if $USE_MOCKS; then
61− rm -f $PWD/builddir/nonmirplugins/LightDM # undo symlink (from below) for cleanliness
62 export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
41 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
64else
43else
65− # Just link our LightDM mock into the nonmirplugins folder. We don't want
44+ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/plugins/LightDM/liblightdm
66− # the rest of our plugins to be used.
67− ln -sf $PWD/builddir/tests/mocks/LightDM $PWD/builddir/nonmirplugins/
68fi
45fi
69
46
70QML_PHONE_SHELL_ARGS=""
47QML_PHONE_SHELL_ARGS=""
tests/autopilot/unity8/shell/__init__.py−13
@@ -27,19 +27,6 @@ import logging
27
27
28logger = logging.getLogger(__name__)
28logger = logging.getLogger(__name__)
29
29
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−
43def disable_qml_mocking(fn):
30def disable_qml_mocking(fn):
44 """Simple decorator that disables the QML mocks from being loaded."""
31 """Simple decorator that disables the QML mocks from being loaded."""
45 @wraps(fn)
32 @wraps(fn)
tests/autopilot/unity8/shell/tests/__init__.py+8−11
@@ -153,7 +153,6 @@ class UnityTestCase(AutopilotTestCase):
153 self.useFixture(toolkit_fixtures.HideUnity7Launcher())
153 self.useFixture(toolkit_fixtures.HideUnity7Launcher())
154
154
155 self._proxy = None
155 self._proxy = None
156− self._lightdm_mock_type = None
157 self._qml_mock_enabled = True
156 self._qml_mock_enabled = True
158 self._data_dirs_mock_enabled = True
157 self._data_dirs_mock_enabled = True
159 self._environment = {}
158 self._environment = {}
@@ -265,8 +264,7 @@ class UnityTestCase(AutopilotTestCase):
265 binary_path
264 binary_path
266 )
265 )
267
266
268− if self._lightdm_mock_type is None:
269− self.patch_lightdm_mock()
267+ self.patch_lightdm_mock()
270
268
271 if self._qml_mock_enabled:
269 if self._qml_mock_enabled:
272 self._environment['QML2_IMPORT_PATH'] = (
270 self._environment['QML2_IMPORT_PATH'] = (
@@ -338,12 +336,11 @@ class UnityTestCase(AutopilotTestCase):
338 if data_dirs is not None:
336 if data_dirs is not None:
339 self._environment['XDG_DATA_DIRS'] = data_dirs
337 self._environment['XDG_DATA_DIRS'] = data_dirs
340
338
341− def patch_lightdm_mock(self, mock_type='single'):
339+ def patch_lightdm_mock(self):
342− self._lightdm_mock_type = mock_type
343− logger.info("Setting up LightDM mock type '%s'", mock_type)
340+ logger.info("Setting up LightDM mock lib")
344 new_ld_library_path = [
341 new_ld_library_path = [
345 get_default_extra_mock_libraries(),
342 get_default_extra_mock_libraries(),
346− self._get_lightdm_mock_path(mock_type)
343+ self._get_lightdm_mock_path()
347 ]
344 ]
348 if os.getenv('LD_LIBRARY_PATH') is not None:
345 if os.getenv('LD_LIBRARY_PATH') is not None:
349 new_ld_library_path.append(os.getenv('LD_LIBRARY_PATH'))
346 new_ld_library_path.append(os.getenv('LD_LIBRARY_PATH'))
@@ -353,16 +350,16 @@ class UnityTestCase(AutopilotTestCase):
353
350
354 self._environment['LD_LIBRARY_PATH'] = new_ld_library_path
351 self._environment['LD_LIBRARY_PATH'] = new_ld_library_path
355
352
356− def _get_lightdm_mock_path(self, mock_type):
353+ def _get_lightdm_mock_path(self):
357 lib_path = get_mocks_library_path()
354 lib_path = get_mocks_library_path()
358 lightdm_mock_path = os.path.abspath(
355 lightdm_mock_path = os.path.abspath(
359− os.path.join(lib_path, "LightDM", mock_type)
356+ os.path.join(lib_path, "LightDM", "liblightdm")
360 )
357 )
361
358
362 if not os.path.exists(lightdm_mock_path):
359 if not os.path.exists(lightdm_mock_path):
363 raise RuntimeError(
360 raise RuntimeError(
364− "LightDM mock '%s' does not exist at path '%s'."
361+ "LightDM mock does not exist at path '%s'."
365− % (mock_type, lightdm_mock_path)
362+ % (lightdm_mock_path)
366 )
363 )
367 return lightdm_mock_path
364 return lightdm_mock_path
368
365
tests/autopilot/unity8/shell/tests/test_edges_demo.py−1
@@ -34,7 +34,6 @@ class EdgesDemoTestCase(tests.UnityTestCase):
34 super(EdgesDemoTestCase, self).setUp()
34 super(EdgesDemoTestCase, self).setUp()
35 self._qml_mock_enabled = False
35 self._qml_mock_enabled = False
36 self._data_dirs_mock_enabled = False
36 self._data_dirs_mock_enabled = False
37− self._lightdm_mock_type = False
38
37
39 self.useFixture(fixture_setup.EdgesDemo(True))
38 self.useFixture(fixture_setup.EdgesDemo(True))
40 self.unity = self.launch_unity()
39 self.unity = self.launch_unity()
tests/autopilot/unity8/shell/tests/test_lock_screen.py+6−5
@@ -20,7 +20,6 @@
20
20
21from __future__ import absolute_import
21from __future__ import absolute_import
22
22
23−from unity8.shell import with_lightdm_mock
24from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
23from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
25
24
26from autopilot.matchers import Eventually
25from autopilot.matchers import Eventually
@@ -41,9 +40,10 @@ class TestLockscreen(UnityTestCase):
41
40
42 scenarios = _get_device_emulation_scenarios()
41 scenarios = _get_device_emulation_scenarios()
43
42
44− @with_lightdm_mock("single-pin")
45 def test_can_unlock_pin_screen(self):
43 def test_can_unlock_pin_screen(self):
46 """Must be able to unlock the PIN entry lock screen."""
44 """Must be able to unlock the PIN entry lock screen."""
45+
46+ self._environment['LIBLIGHTDM_MOCK_MODE'] = "single-pin"
47 self.launch_unity()
47 self.launch_unity()
48 greeter = self.main_window.get_greeter()
48 greeter = self.main_window.get_greeter()
49
49
@@ -56,9 +56,10 @@ class TestLockscreen(UnityTestCase):
56 self._enter_prompt_passphrase("1234\n")
56 self._enter_prompt_passphrase("1234\n")
57 self.assertThat(greeter.shown, Eventually(Equals(False)))
57 self.assertThat(greeter.shown, Eventually(Equals(False)))
58
58
59− @with_lightdm_mock("single-passphrase")
60 def test_can_unlock_passphrase_screen(self):
59 def test_can_unlock_passphrase_screen(self):
61 """Must be able to unlock the passphrase entry screen."""
60 """Must be able to unlock the passphrase entry screen."""
61+
62+ self._environment['LIBLIGHTDM_MOCK_MODE'] = "single-passphrase"
62 self.launch_unity()
63 self.launch_unity()
63 greeter = self.main_window.get_greeter()
64 greeter = self.main_window.get_greeter()
64
65
@@ -71,9 +72,9 @@ class TestLockscreen(UnityTestCase):
71 self._enter_prompt_passphrase("password")
72 self._enter_prompt_passphrase("password")
72 self.assertThat(greeter.shown, Eventually(Equals(False)))
73 self.assertThat(greeter.shown, Eventually(Equals(False)))
73
74
74− @with_lightdm_mock("single-pin")
75 def test_pin_screen_wrong_code(self):
75 def test_pin_screen_wrong_code(self):
76 """Entering the wrong pin code must not dismiss the lock screen."""
76 """Entering the wrong pin code must not dismiss the lock screen."""
77+ self._environment['LIBLIGHTDM_MOCK_MODE'] = "single-pin"
77 self.launch_unity()
78 self.launch_unity()
78 greeter = self.main_window.get_greeter()
79 greeter = self.main_window.get_greeter()
79
80
@@ -90,9 +91,9 @@ class TestLockscreen(UnityTestCase):
90 self.assertThat(prompt.text, Eventually(Equals("")))
91 self.assertThat(prompt.text, Eventually(Equals("")))
91 self.assertThat(greeter.shown, Eventually(Equals(True)))
92 self.assertThat(greeter.shown, Eventually(Equals(True)))
92
93
93− @with_lightdm_mock("single-passphrase")
94 def test_passphrase_screen_wrong_password(self):
94 def test_passphrase_screen_wrong_password(self):
95 """Entering the wrong password must not dismiss the lock screen."""
95 """Entering the wrong password must not dismiss the lock screen."""
96+ self._environment['LIBLIGHTDM_MOCK_MODE'] = "single-passphrase"
96 self.launch_unity()
97 self.launch_unity()
97 greeter = self.main_window.get_greeter()
98 greeter = self.main_window.get_greeter()
98
99
tests/mocks/LightDM/CMakeLists.txt+8−9
@@ -4,16 +4,13 @@
4# actually using the system liblightdm in the normal plugin, this version can
4# actually using the system liblightdm in the normal plugin, this version can
5# be deleted.
5# be deleted.
6
6
7−add_subdirectory(demo)
7+add_subdirectory(liblightdm)
8−add_subdirectory(full)
9−add_subdirectory(single)
10−add_subdirectory(single-pin)
11−add_subdirectory(single-passphrase)
12
8
13include_directories(
9include_directories(
14 ${CMAKE_CURRENT_SOURCE_DIR}
10 ${CMAKE_CURRENT_SOURCE_DIR}
15 ${CMAKE_CURRENT_BINARY_DIR}
11 ${CMAKE_CURRENT_BINARY_DIR}
16 ${CMAKE_SOURCE_DIR}/plugins/Utils
12 ${CMAKE_SOURCE_DIR}/plugins/Utils
13+ ${CMAKE_SOURCE_DIR}/plugins/LightDM
17 ${CMAKE_SOURCE_DIR}/tests/mocks/libusermetrics
14 ${CMAKE_SOURCE_DIR}/tests/mocks/libusermetrics
18 ${libunity8-private_SOURCE_DIR}
15 ${libunity8-private_SOURCE_DIR}
19)
16)
@@ -22,9 +19,11 @@ set(QMLPLUGIN_SRC
22 ${CMAKE_SOURCE_DIR}/plugins/LightDM/DBusGreeter.cpp
19 ${CMAKE_SOURCE_DIR}/plugins/LightDM/DBusGreeter.cpp
23 ${CMAKE_SOURCE_DIR}/plugins/LightDM/DBusGreeterList.cpp
20 ${CMAKE_SOURCE_DIR}/plugins/LightDM/DBusGreeterList.cpp
24 ${CMAKE_SOURCE_DIR}/plugins/LightDM/Greeter.cpp
21 ${CMAKE_SOURCE_DIR}/plugins/LightDM/Greeter.cpp
25− ${CMAKE_SOURCE_DIR}/plugins/LightDM/plugin.cpp
26 ${CMAKE_SOURCE_DIR}/plugins/LightDM/UsersModel.cpp
22 ${CMAKE_SOURCE_DIR}/plugins/LightDM/UsersModel.cpp
27 ${CMAKE_SOURCE_DIR}/plugins/Utils/unitysortfilterproxymodelqml.cpp
23 ${CMAKE_SOURCE_DIR}/plugins/Utils/unitysortfilterproxymodelqml.cpp
24+ MockGreeter.cpp
25+ MockUsersModel.cpp
26+ plugin.cpp
28 )
27 )
29
28
30add_library(MockLightDM-qml MODULE
29add_library(MockLightDM-qml MODULE
@@ -35,9 +34,9 @@ add_library(MockLightDM-qml MODULE
35# installed on the system. So we make sure we link to our full fake version
34# installed on the system. So we make sure we link to our full fake version
36# At run time, we can point to whichever version we happen to be using via
35# At run time, we can point to whichever version we happen to be using via
37# LD_LIBRARY_PATH.
36# LD_LIBRARY_PATH.
38−add_dependencies(MockLightDM-qml MockLightDM-full MockUserMetrics)
37+add_dependencies(MockLightDM-qml MockLightDM MockUserMetrics)
39target_link_libraries(MockLightDM-qml
38target_link_libraries(MockLightDM-qml
40− -L${CMAKE_CURRENT_BINARY_DIR}/full
39+ -L${CMAKE_CURRENT_BINARY_DIR}/liblightdm
41 -llightdm-qt5-2
40 -llightdm-qt5-2
42 -L${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics
41 -L${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics
43 -lusermetricsoutput
42 -lusermetricsoutput
@@ -49,5 +48,5 @@ qt5_use_modules(MockLightDM-qml DBus Gui Qml)
49add_unity8_mock(LightDM 0.1 LightDM
48add_unity8_mock(LightDM 0.1 LightDM
50 PREFIX mocks
49 PREFIX mocks
51 TARGETS MockLightDM-qml
50 TARGETS MockLightDM-qml
52− ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_CURRENT_BINARY_DIR}/full"
51+ ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_CURRENT_BINARY_DIR}/liblightdm"
53)
52)
tests/mocks/LightDM/single/UsersModelPrivate.cpp → tests/mocks/LightDM/MockGreeter.cpprenamed+13−11
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -13,21 +13,23 @@
13 * You should have received a copy of the GNU General Public License
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/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
15 *
16− * Author: Michael Terry <michael.terry@canonical.com>
17 */
16 */
18
17
19−#include "../UsersModelPrivate.h"
18+#include "MockGreeter.h"
19+#include <GreeterPrivate.h>
20
20
21−namespace QLightDM
21+QString MockGreeter::mockMode() const
22{
22{
23+ Q_D(const Greeter);
24+ return d->m_greeter->mockMode();
25+}
23
26
24−UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
27+void MockGreeter::setMockMode(QString mockMode)
25− : q_ptr(parent)
26{
28{
27− entries =
29+ Q_D(Greeter);
28− {
29− { "single", "Single User", 0, 0, false, false, 0, 0 },
30− };
31−}
32
30
31+ if (d->m_greeter->mockMode() != mockMode) {
32+ d->m_greeter->setMockMode(mockMode);
33+ Q_EMIT mockModeChanged(mockMode);
34+ }
33}
35}
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 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -13,34 +13,25 @@
13 * You should have received a copy of the GNU General Public License
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/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
15 *
16− * Author: Michael Terry <michael.terry@canonical.com>
17 */
16 */
18
17
19−#include "../Greeter.h"
18+#ifndef MOCK_UNITY_USERSMODEL_H
20−#include "../GreeterPrivate.h"
19+#define MOCK_UNITY_USERSMODEL_H
21
20
22−namespace QLightDM
21+#include <UsersModel.h>
23−{
24
22
25−GreeterPrivate::GreeterPrivate(Greeter* parent)
23+class MockUsersModel : public UsersModel
26− : authenticated(false),
27− authenticationUser(),
28− twoFactorDone(false),
29− q_ptr(parent)
30{
24{
31−}
25+ Q_OBJECT
32
26
33−void GreeterPrivate::handleAuthenticate()
27+ Q_PROPERTY(QString mockMode READ mockMode WRITE setMockMode NOTIFY mockModeChanged)
34−{
35− Q_Q(Greeter);
36
28
37− authenticated = true;
29+public:
38− Q_EMIT q->authenticationComplete();
30+ QString mockMode() const;
39−}
31+ void setMockMode(QString mockMode);
40
32
41−void GreeterPrivate::handleRespond(QString const &response)
33+Q_SIGNALS:
42−{
34+ void mockModeChanged(QString mode);
43− Q_UNUSED(response)
44−}
35+};
45
36
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 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -12,12 +12,10 @@
12 *
12 *
13 * You should have received a copy of the GNU General Public License
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/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
17 */
15 */
18
16
19−#include "../Greeter.h"
17+#include "Greeter.h"
20−#include "../GreeterPrivate.h"
18+#include "GreeterPrivate.h"
21
19
22namespace QLightDM
20namespace QLightDM
23{
21{
@@ -26,14 +24,33 @@ GreeterPrivate::GreeterPrivate(Greeter* parent)
26 : authenticated(false),
24 : authenticated(false),
27 authenticationUser(),
25 authenticationUser(),
28 twoFactorDone(false),
26 twoFactorDone(false),
27+ mockMode("single"),
29 q_ptr(parent)
28 q_ptr(parent)
30{
29{
30+ char *envMockMode = getenv("LIBLIGHTDM_MOCK_MODE");
31+ if (envMockMode) {
32+ mockMode = envMockMode;
33+ }
31}
34}
32
35
33void GreeterPrivate::handleAuthenticate()
36void GreeterPrivate::handleAuthenticate()
34{
37{
35 Q_Q(Greeter);
38 Q_Q(Greeter);
36
39
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+
37 // Send out any messages we need to
54 // Send out any messages we need to
38 if (authenticationUser == "info-prompt")
55 if (authenticationUser == "info-prompt")
39 Q_EMIT q->showMessage("Welcome to Unity Greeter", Greeter::MessageTypeInfo);
56 Q_EMIT q->showMessage("Welcome to Unity Greeter", Greeter::MessageTypeInfo);
@@ -65,7 +82,24 @@ void GreeterPrivate::handleAuthenticate()
65 }
82 }
66}
83}
67
84
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)
69{
103{
70 Q_Q(Greeter);
104 Q_Q(Greeter);
71
105
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 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -12,17 +12,69 @@
12 *
12 *
13 * You should have received a copy of the GNU General Public License
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/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
17 */
15 */
18
16
19−#include "../UsersModelPrivate.h"
17+#include "UsersModelPrivate.h"
18+#include "UsersModel.h"
20
19
21namespace QLightDM
20namespace QLightDM
22{
21{
23
22
24UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
23UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
24+ : mockMode("single")
25− : q_ptr(parent)
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()
26{
78{
27 entries =
79 entries =
28 {
80 {
@@ -49,4 +101,4 @@ UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
49 };
101 };
50}
102}
51
103
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 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -12,22 +12,21 @@
12 *
12 *
13 * You should have received a copy of the GNU General Public License
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/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
17 */
15 */
18
16
19−#include "../UsersModelPrivate.h"
17+#ifndef MOCK_LIGHTDM_PLUGIN_H
18+#define MOCK_LIGHTDM_PLUGIN_H
20
19
21−namespace QLightDM
20+#include <QtQml/QQmlEngine>
22−{
21+#include <QtQml/QQmlExtensionPlugin>
23
22
24−UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
23+class LightDMPlugin : public QQmlExtensionPlugin
25− : q_ptr(parent)
26{
24{
27− entries =
25+ Q_OBJECT
28− {
26+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29− { "single", "Has Passphrase", 0, 0, false, false, 0, 0 },
27+
28+public:
29+ void registerTypes(const char *uri);
30− };
30+};
31−}
32
31
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
40 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/SettingsModelInterface.h
40 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/SettingsModelInterface.h
41)
41)
42
42
43+# Workaround for gcc failure LP: #1417664
44+set_source_files_properties(fake_scopes.cpp PROPERTIES COMPILE_FLAGS -O1)
45+
43add_library(FakeUnityQml MODULE ${UnityQML_SOURCES})
46add_library(FakeUnityQml MODULE ${UnityQML_SOURCES})
44target_link_libraries(FakeUnityQml
47target_link_libraries(FakeUnityQml
45 ${Qt5Core_LIBRARIES}
48 ${Qt5Core_LIBRARIES}
tests/plugins/LightDM/CMakeLists.txt+3−3
@@ -11,10 +11,10 @@ include_directories(
11 ${LIBLIGHTDM_INCLUDE_DIRS}
11 ${LIBLIGHTDM_INCLUDE_DIRS}
12 )
12 )
13
13
14−add_dependencies(GreeterDBusTestExec MockLightDM-full)
14+add_dependencies(GreeterDBusTestExec MockLightDM)
15−target_link_libraries(GreeterDBusTestExec -L${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full
15+target_link_libraries(GreeterDBusTestExec -L${CMAKE_BINARY_DIR}/tests/mocks/LightDM/liblightdm
16 -llightdm-qt5-2)
16 -llightdm-qt5-2)
17
17
18add_definitions(-DCURRENT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
18add_definitions(-DCURRENT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
19
19
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
19
19
20Item {
20Item {
21 property var greeter: LightDM.Greeter
21 property var greeter: LightDM.Greeter
22+ Binding {
23+ target: LightDM.Greeter
24+ property: "mockMode"
25+ value: "full"
26+ }
22}
27}
tests/qmltests/CMakeLists.txt+19−19
@@ -16,11 +16,11 @@ add_qml_test(utils/Unity/Test UnityTest)
16
16
17set(qmltest_DEFAULT_TARGETS qmluitests)
17set(qmltest_DEFAULT_TARGETS qmluitests)
18set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
18set(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")
20
20
21−add_qml_test(. Shell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single:${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
21+add_qml_test(. Shell)
22−add_qml_test(. ShellWithPin ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single-pin:${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
22+add_qml_test(. ShellWithPin)
23−add_qml_test(. TabletShell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full:${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
23+add_qml_test(. TabletShell)
24add_qml_test(Components Background)
24add_qml_test(Components Background)
25add_qml_test(Components Carousel)
25add_qml_test(Components Carousel)
26add_qml_test(Components Dialogs)
26add_qml_test(Components Dialogs)
@@ -61,10 +61,10 @@ add_qml_test(Dash/ScopeSettings ScopeSettingList)
61add_qml_test(Dash/ScopeSettings ScopeSettingNumber)
61add_qml_test(Dash/ScopeSettings ScopeSettingNumber)
62add_qml_test(Dash/ScopeSettings ScopeSettingString)
62add_qml_test(Dash/ScopeSettings ScopeSettingString)
63add_qml_test(Dash/ScopeSettings ScopeSettingsWidgetFactory)
63add_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")
64+add_qml_test(Greeter MultiGreeter)
65−add_qml_test(Greeter SingleGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
65+add_qml_test(Greeter SingleGreeter)
66−add_qml_test(Greeter Infographics ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
66+add_qml_test(Greeter Infographics)
67−add_qml_test(Greeter Clock ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
67+add_qml_test(Greeter Clock)
68add_qml_test(Launcher Launcher)
68add_qml_test(Launcher Launcher)
69add_qml_test(Notifications Notifications)
69add_qml_test(Notifications Notifications)
70add_qml_test(Notifications VisualSnapDecisionsQueue)
70add_qml_test(Notifications VisualSnapDecisionsQueue)
@@ -72,22 +72,22 @@ add_qml_test(Notifications OptionToggle)
72add_qml_test(Notifications SwipeToAct)
72add_qml_test(Notifications SwipeToAct)
73add_qml_test(Panel ActiveCallHint)
73add_qml_test(Panel ActiveCallHint)
74add_qml_test(Panel IndicatorItem)
74add_qml_test(Panel IndicatorItem)
75−add_qml_test(Panel IndicatorItemRow ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
75+add_qml_test(Panel IndicatorItemRow)
76−add_qml_test(Panel IndicatorPage ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
76+add_qml_test(Panel IndicatorPage)
77−add_qml_test(Panel IndicatorsBar ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
77+add_qml_test(Panel IndicatorsBar)
78−add_qml_test(Panel IndicatorsMenu ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
78+add_qml_test(Panel IndicatorsMenu)
79−add_qml_test(Panel MenuContent ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
79+add_qml_test(Panel MenuContent)
80−add_qml_test(Panel Panel ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
80+add_qml_test(Panel Panel)
81add_qml_test(Panel SearchIndicator)
81add_qml_test(Panel SearchIndicator)
82add_qml_test(Panel/Indicators IndicatorsLight ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
82add_qml_test(Panel/Indicators IndicatorsLight ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
83# These MenuItemFactory tests need the test/mocks/ to come before plugins/
83# These MenuItemFactory tests need the test/mocks/ to come before plugins/
84add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
84add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
85add_qml_test(Panel/Indicators MessageMenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
85add_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")
86+add_qml_test(Stages ApplicationWindow)
87−add_qml_test(Stages PhoneStage ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
87+add_qml_test(Stages PhoneStage ENVIRONMENT)
88−add_qml_test(Stages SpreadDelegate ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
88+add_qml_test(Stages SpreadDelegate ENVIRONMENT)
89−add_qml_test(Stages SurfaceContainer ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
89+add_qml_test(Stages SurfaceContainer ENVIRONMENT)
90−add_qml_test(Stages SessionContainer ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
90+add_qml_test(Stages SessionContainer ENVIRONMENT)
91add_qml_test(Stages TabletStage)
91add_qml_test(Stages TabletStage)
92add_qml_test(Stages WindowMoveResizeArea)
92add_qml_test(Stages WindowMoveResizeArea)
93add_qml_test(Stages Splash)
93add_qml_test(Stages Splash)
tests/qmltests/Dash/tst_Card.qml+7−1
@@ -60,7 +60,7 @@ Rectangle {
60 "layout": { "components": Helpers.update(JSON.parse(Helpers.fullMapping), { "art": { "aspect-ratio": 0.7 } }) }
60 "layout": { "components": Helpers.update(JSON.parse(Helpers.fullMapping), { "art": { "aspect-ratio": 0.7 } }) }
61 },
61 },
62 {
62 {
63− "name": "Art, header, summary - horizontal",
63+ "name": "Art, header, summary, background - horizontal",
64 "layout": { "template": { "card-layout": "horizontal", "card-background": { "type": "gradient", "elements": ["grey", "white"] } },
64 "layout": { "template": { "card-layout": "horizontal", "card-background": { "type": "gradient", "elements": ["grey", "white"] } },
65 "components": JSON.parse(Helpers.fullMapping) }
65 "components": JSON.parse(Helpers.fullMapping) }
66 },
66 },
@@ -101,6 +101,11 @@ Rectangle {
101 "layout": { "template": { "overlay": true },
101 "layout": { "template": { "overlay": true },
102 "components": { "art": "art", "title": "title" } }
102 "components": { "art": "art", "title": "title" } }
103 },
103 },
104+ {
105+ "name": "Art, header, summary - horizontal",
106+ "layout": { "template": { "card-layout": "horizontal" },
107+ "components": JSON.parse(Helpers.fullMapping) }
108+ },
104 ]
109 ]
105
110
106 CardTool {
111 CardTool {
@@ -415,6 +420,7 @@ Rectangle {
415 background: Qt.resolvedUrl("artwork/checkers.png"), index: 10 },
420 background: Qt.resolvedUrl("artwork/checkers.png"), index: 10 },
416 { tag: "Gradient background", visible: true, color: "#808080", gradientColor: "#ffffff", index: 11 },
421 { tag: "Gradient background", visible: true, color: "#808080", gradientColor: "#ffffff", index: 11 },
417 { tag: "Image background", visible: true, image: Qt.resolvedUrl("artwork/checkers.png"), index: 12 },
422 { tag: "Image background", visible: true, image: Qt.resolvedUrl("artwork/checkers.png"), index: 12 },
423+ { tag: "Horizontal no background", visible: false, index: 14 },
418 ];
424 ];
419 }
425 }
420
426
tests/qmltests/Greeter/tst_Infographics.qml+10
@@ -23,6 +23,16 @@ import Unity.Test 0.1 as UT
23import LightDM 0.1 as LightDM
23import LightDM 0.1 as LightDM
24
24
25Item {
25Item {
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+ }
26 property variant infographicModel: LightDM.Infographic
36 property variant infographicModel: LightDM.Infographic
27
37
28 width: units.gu(120)
38 width: units.gu(120)
tests/qmltests/Greeter/tst_MultiGreeter.qml+91−2
@@ -15,6 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18+import QtQuick.Layouts 1.1
18import QtTest 1.0
19import QtTest 1.0
19import ".."
20import ".."
20import "../../../qml/Greeter"
21import "../../../qml/Greeter"
@@ -23,12 +24,37 @@ import LightDM 0.1 as LightDM
23import Unity.Test 0.1 as UT
24import Unity.Test 0.1 as UT
24
25
25Item {
26Item {
27+ id: root
26− width: units.gu(120)
28+ width: units.gu(140)
27 height: units.gu(80)
29 height: units.gu(80)
28
30
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+
29 Greeter {
53 Greeter {
30 id: greeter
54 id: greeter
31− anchors.fill: parent
55+ width: units.gu(120)
56+ height: root.height
57+ inputMethod: fakeInputMethod
32 locked: !LightDM.Greeter.authenticated
58 locked: !LightDM.Greeter.authenticated
33 }
59 }
34
60
@@ -43,6 +69,44 @@ Item {
43 }
69 }
44 }
70 }
45
71
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+
46 SignalSpy {
110 SignalSpy {
47 id: unlockSpy
111 id: unlockSpy
48 target: greeter
112 target: greeter
@@ -65,6 +129,10 @@ Item {
65 name: "MultiGreeter"
129 name: "MultiGreeter"
66 when: windowShown
130 when: windowShown
67
131
132+ function cleanup() {
133+ keyboardVisibleCheckbox.checked = false;
134+ }
135+
68 function select_index(i) {
136 function select_index(i) {
69 // We could be anywhere in list; find target index to know which direction
137 // We could be anywhere in list; find target index to know which direction
70 var userlist = findChild(greeter, "userList")
138 var userlist = findChild(greeter, "userList")
@@ -382,5 +450,26 @@ Item {
382 tryCompare(spy, "count", 1)
450 tryCompare(spy, "count", 1)
383 greeterObj.destroy()
451 greeterObj.destroy()
384 }
452 }
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+ }
385 }
474 }
386}
475}
tests/qmltests/tst_Shell.qml+8
@@ -36,6 +36,13 @@ Item {
36 width: units.gu(60)
36 width: units.gu(60)
37 height: units.gu(71)
37 height: units.gu(71)
38
38
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+
39 QtObject {
46 QtObject {
40 id: applicationArguments
47 id: applicationArguments
41
48
@@ -58,6 +65,7 @@ Item {
58 id: shellLoader
65 id: shellLoader
59 focus: true
66 focus: true
60
67
68+ active: false
61 property bool itemDestroyed: false
69 property bool itemDestroyed: false
62 sourceComponent: Component {
70 sourceComponent: Component {
63 Shell {
71 Shell {
tests/qmltests/tst_ShellWithPin.qml+56
@@ -33,6 +33,13 @@ Item {
33 width: contentRow.width
33 width: contentRow.width
34 height: contentRow.height
34 height: contentRow.height
35
35
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+
36 QtObject {
43 QtObject {
37 id: applicationArguments
44 id: applicationArguments
38
45
@@ -54,6 +61,7 @@ Item {
54
61
55 Loader {
62 Loader {
56 id: shellLoader
63 id: shellLoader
64+ active: false
57
65
58 width: units.gu(40)
66 width: units.gu(40)
59 height: units.gu(71)
67 height: units.gu(71)
@@ -503,5 +511,53 @@ Item {
503 var lockscreen = findChild(shell, "lockscreen");
511 var lockscreen = findChild(shell, "lockscreen");
504 verify(lockscreen.shown);
512 verify(lockscreen.shown);
505 }
513 }
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+ }
506 }
562 }
507}
563}
tests/qmltests/tst_TabletShell.qml+8
@@ -32,6 +32,13 @@ Row {
32 id: root
32 id: root
33 spacing: 0
33 spacing: 0
34
34
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+
35 QtObject {
42 QtObject {
36 id: applicationArguments
43 id: applicationArguments
37
44
@@ -51,6 +58,7 @@ Row {
51 Loader {
58 Loader {
52 id: shellLoader
59 id: shellLoader
53
60
61+ active: false
54 width: units.gu(100)
62 width: units.gu(100)
55 height: units.gu(80)
63 height: units.gu(80)
56
64