on xenial help sign in
Merge trunk
commit247b8a3119288b88c77ba7e2f5ea0f9e5d6819df authorAlbert Astals <albert.astals@canonical.com> dateFri 22 Aug 2014, 16:40 (12 years ago) parent4fe9bbfd8c7c26
67 files changed+1512−845
debian/changelog+72 debian/control+2−1 plugins/LightDM/Greeter.cpp+2 plugins/LightDM/Greeter.h+2−1 plugins/Powerd/Powerd.cpp+16 plugins/Ubuntu/CMakeLists.txt+1 plugins/Ubuntu/Connectivity/CMakeLists.txt+10 plugins/Ubuntu/Connectivity/Connectivity.cpp+33 plugins/Ubuntu/Connectivity/Connectivity.h+33 plugins/Ubuntu/Connectivity/Connectivity.qmltypes+17 plugins/Ubuntu/Connectivity/plugin.cpp+34 plugins/Ubuntu/Connectivity/plugin.h+31 plugins/Ubuntu/Connectivity/qmldir+3 plugins/Unity/Indicators/CachedUnityMenuModel.qml−60 plugins/Unity/Indicators/qmldir−3 plugins/Unity/Indicators/unitymenumodelcache.cpp+22−7 plugins/Unity/Indicators/unitymenumodelcache.h+5−3 po/de.po+20−16 po/el.po+18−18 po/gl.po+4−4 po/hu.po+33−29 po/ja.po+53−52 po/km.po+32−26 po/ko.po+42−40 po/lv.po+14−14 po/pl.po+20−20 po/pt_BR.po+33−29 po/ru.po+39−35 po/sl.po+41−37 po/unity8.pot+31−35 qml/Components/Lockscreen.qml+33−75 qml/Components/PassphraseLockscreen.qml+3−3 qml/Components/PinLockscreen.qml+151−163 qml/Components/PinPadButton.qml+31−45 qml/Dash/Previews/PreviewExpandable.qml+3−3 qml/Dash/Previews/PreviewPayments.qml+22−3 qml/Greeter/Clock.qml+2−1 qml/Greeter/GreeterContent.qml−1 qml/Notifications/Notification.qml+4−3 qml/Notifications/NotificationMenuItemFactory.qml+9−1 qml/Notifications/Notifications.qml+5−3 tests/mocks/Unity/Indicators/CachedUnityMenuModel.qml → qml/Panel/Indicators/CachedUnityMenuModel.qml+14−5 qml/Panel/Indicators/DefaultIndicatorWidget.qml+2−1 qml/Panel/Indicators/IndicatorBase.qml+4−2 qml/Shell.qml+16−7 tests/autopilot/unity8/shell/tests/test_lock_screen.py+2−2 tests/mocks/LightDM/demo/GreeterPrivate.cpp+60−21 tests/mocks/QMenuModel/unitymenumodel.cpp+4−5 tests/mocks/Ubuntu/CMakeLists.txt+1 tests/mocks/Ubuntu/Connectivity/CMakeLists.txt+10 tests/mocks/Ubuntu/Connectivity/Connectivity.qmltypes+18 tests/mocks/Ubuntu/Connectivity/MockConnectivity.cpp+27 tests/mocks/Ubuntu/Connectivity/MockConnectivity.h+36 tests/mocks/Ubuntu/Connectivity/plugin.cpp+34 tests/mocks/Ubuntu/Connectivity/plugin.h+31 tests/mocks/Ubuntu/Connectivity/qmldir+3 tests/mocks/Unity/Indicators/CMakeLists.txt+6−1 tests/mocks/Unity/Indicators/fakeplugin.cpp+9 tests/mocks/Unity/Indicators/qmldir−1 tests/qmltests/CMakeLists.txt+1 tests/qmltests/Dash/Previews/tst_PreviewExpandable.qml+12−6 tests/qmltests/Dash/Previews/tst_PreviewPayments.qml+24 tests/qmltests/Dash/tst_Dash.qml+12−6 tests/qmltests/Greeter/tst_Lockscreen.qml+65−46 tests/qmltests/Panel/Indicators/tst_CachedUnityMenuModel.qml+137 tests/qmltests/tst_Shell.qml+32 tests/qmltests/tst_ShellWithPin.qml+26−11
debian/changelog+72
@@ -1,3 +1,75 @@
1+unity8 (8.00+14.10.20140822-0ubuntu1) utopic; urgency=low
2+
3+ [ Albert Astals ]
4+ * More stable dash overview tests
5+ * PreviewExpandable: "widgets" is a model, not an array
6+
7+ [ Alberto Aguirre ]
8+ * Proxy inactivity timeout values from gsettings into Unity.Screen
9+ (LP: #1230345)
10+
11+ [ Gerry Boland ]
12+ * Cancel open PAM interactions on shutdown - fixes hang on logout on
13+ desktop (LP: #1353041)
14+
15+ [ Diego Sarmentero ]
16+ * Show progress bar on payment button click The payment process has a
17+ small delay before the UI comes up which might cause confusion. Show
18+ a progress bar with unknown value to indicate activity. (LP:
19+ #1354139)
20+
21+ [ Mirco Müller ]
22+ * Made notification qml-test pass again by using Component.onCompleted
23+ instead of onOpacityChanged for the time being.
24+
25+ [ Michael Zanetti ]
26+ * Implement new lockscreen designs
27+
28+ [ Michael Terry ]
29+ * Show the SIM unlock dialog immediately after booting, and enable its
30+ emergency call button.
31+ * Always keep indicator/launcher locked state in sync with whether the
32+ user is authenticated. (LP:# 1357230) (LP: #1357230)
33+ * Allow logging into a desktop or tablet session again, by properly
34+ dismissing old PAM conversations. (LP: #1350878) In a desktop or
35+ tablet, we were accidentally starting two PAM conversations in
36+ sequence on startup. Which is a small bug; it shouldn't normally be
37+ a problem, since each new PAM conversation should kill the old
38+ one.But the way we were killing the old one was subject to a thread
39+ race condition. See, a PAM conversation thread won't exit until all
40+ its prompts are answered. And what we do when we kill a PAM
41+ conversation is to answer all prompts with empty strings.But it's
42+ possible that when we want to kill a PAM conversation that it hasn't
43+ actually gotten to the point of prompting us yet. And when those
44+ prompts do come through, we were treating them as prompts for the
45+ new PAM conversation.So I've changed the PAM conversation logic to
46+ include a pam_handle and compare the handle with the current handle
47+ when being prompted. If it's an old handle, we just dismiss the
48+ prompt with an empty string response.Oh, and I fixed the bug that
49+ caused two prompts on startup in the first place. (But we still need
50+ the above logic anyway, for when you switch users quickly.) (LP:
51+ #1350878)
52+
53+ [ Martin Pitt ]
54+ * Mark for using language packs.
55+
56+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 22 Aug 2014 09:29:41 +0000
57+
58+unity8 (8.00+14.10.20140820-0ubuntu1) utopic; urgency=low
59+
60+ [ CI bot ]
61+ * Resync trunk
62+
63+ [ Nick Dedekind ]
64+ * Fixed CachedUnityMenuModel destruction unhinging indicators. (LP:
65+ #1328646)
66+
67+ [ Mirco Müller ]
68+ * Temporarily disable any opacity-animation for notifications to
69+ unblock the train due to LP: 1354406. (LP: #1354406)
70+
71+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 20 Aug 2014 20:03:55 +0000
72+
173unity8 (8.00+14.10.20140817-0ubuntu1) utopic; urgency=low
274
375 [ CI bot ]
debian/control+2−1
@@ -54,6 +54,7 @@ Homepage: http://launchpad.net/unity
5454# and sync up the code again.
5555Vcs-Bzr: https://code.launchpad.net/unity8
5656Vcs-Browser: https://bazaar.launchpad.net/~unity-team/unity8/trunk
57+X-Ubuntu-Use-Langpack: yes
5758
5859Package: indicators-client
5960Architecture: amd64 armhf i386
@@ -168,7 +169,7 @@ Architecture: any
168169Multi-Arch: same
169170Pre-Depends: ${misc:Pre-Depends},
170171Depends: accountsservice-ubuntu-schemas,
171− gsettings-ubuntu-schemas,
172+ gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
172173 libhardware2,
173174 libunity-core-6.0-9,
174175 pay-service,
plugins/LightDM/Greeter.cpp+2
@@ -106,6 +106,7 @@ void Greeter::authenticate(const QString &username)
106106 }
107107
108108 d->m_greeter->authenticate(username);
109+ Q_EMIT isAuthenticatedChanged();
109110 Q_EMIT authenticationUserChanged(username);
110111}
111112
@@ -150,5 +151,6 @@ void Greeter::authenticationCompleteFilter()
150151 Q_EMIT promptlessChanged();
151152 }
152153
154+ Q_EMIT isAuthenticatedChanged();
153155 Q_EMIT authenticationComplete();
154156}
plugins/LightDM/Greeter.h+2−1
@@ -35,7 +35,7 @@ class Greeter : public QObject
3535 Q_OBJECT
3636
3737 Q_PROPERTY(bool active READ isActive WRITE setIsActive NOTIFY isActiveChanged)
38− Q_PROPERTY(bool authenticated READ isAuthenticated)
38+ Q_PROPERTY(bool authenticated READ isAuthenticated NOTIFY isAuthenticatedChanged)
3939 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
4040 Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
4141
@@ -59,6 +59,7 @@ Q_SIGNALS:
5959 void authenticationComplete();
6060 void authenticationUserChanged(const QString &user);
6161 void isActiveChanged();
62+ void isAuthenticatedChanged();
6263 void promptlessChanged();
6364 void showGreeter();
6465
plugins/Powerd/Powerd.cpp+16
@@ -25,6 +25,18 @@ void autoBrightnessChanged(GSettings *settings, const gchar *key, QDBusInterface
2525 unityScreen->asyncCall("userAutobrightnessEnable", QVariant(value));
2626}
2727
28+void activityTimeoutChanged(GSettings *settings, const gchar *key, QDBusInterface *unityScreen)
29+{
30+ int value = g_settings_get_uint(settings, key);
31+ unityScreen->asyncCall("setInactivityTimeouts", QVariant(value), QVariant(-1));
32+}
33+
34+void dimTimeoutChanged(GSettings *settings, const gchar *key, QDBusInterface *unityScreen)
35+{
36+ int value = g_settings_get_uint(settings, key);
37+ unityScreen->asyncCall("setInactivityTimeouts", QVariant(-1), QVariant(value));
38+}
39+
2840Powerd::Powerd(QObject* parent)
2941 : QObject(parent),
3042 unityScreen(NULL)
@@ -43,7 +55,11 @@ Powerd::Powerd(QObject* parent)
4355
4456 systemSettings = g_settings_new("com.ubuntu.touch.system");
4557 g_signal_connect(systemSettings, "changed::auto-brightness", G_CALLBACK(autoBrightnessChanged), unityScreen);
58+ g_signal_connect(systemSettings, "changed::activity-timeout", G_CALLBACK(activityTimeoutChanged), unityScreen);
59+ g_signal_connect(systemSettings, "changed::dim-timeout", G_CALLBACK(dimTimeoutChanged), unityScreen);
4660 autoBrightnessChanged(systemSettings, "auto-brightness", unityScreen);
61+ activityTimeoutChanged(systemSettings, "activity-timeout", unityScreen);
62+ dimTimeoutChanged(systemSettings, "dim-timeout", unityScreen);
4763}
4864
4965Powerd::~Powerd()
plugins/Ubuntu/CMakeLists.txt+1
@@ -1,3 +1,4 @@
1+add_subdirectory(Connectivity)
12add_subdirectory(Gestures)
23add_subdirectory(DownloadDaemonListener)
34add_subdirectory(Payments)
plugins/Ubuntu/Connectivity/CMakeLists.txtnew file+10
@@ -0,0 +1,10 @@
1+set(CONNECTIVITY_SOURCES
2+ plugin.cpp
3+ Connectivity.cpp
4+)
5+
6+add_library(Connectivity MODULE ${CONNECTIVITY_SOURCES})
7+
8+qt5_use_modules(Connectivity Qml DBus Core)
9+
10+add_unity8_plugin(Ubuntu.Connectivity 0.1 Ubuntu/Connectivity TARGETS Connectivity)
plugins/Ubuntu/Connectivity/Connectivity.cppnew file+33
@@ -0,0 +1,33 @@
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 "Connectivity.h"
18+#include <QDBusConnection>
19+#include <QDBusInterface>
20+#include <QDBusPendingCall>
21+
22+Connectivity::Connectivity(QObject *parent)
23+ : QObject(parent)
24+{
25+}
26+
27+void Connectivity::unlockAllModems()
28+{
29+ QDBusInterface iface("com.ubuntu.connectivity1",
30+ "/com/ubuntu/connectivity1/Private",
31+ "com.ubuntu.connectivity1.Private");
32+ iface.asyncCall("UnlockAllModems");
33+}
plugins/Ubuntu/Connectivity/Connectivity.hnew file+33
@@ -0,0 +1,33 @@
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 CONNECTIVITY_H
18+#define CONNECTIVITY_H
19+
20+#include <QObject>
21+
22+class Connectivity : public QObject
23+{
24+ Q_OBJECT
25+ Q_DISABLE_COPY(Connectivity)
26+
27+public:
28+ explicit Connectivity(QObject *parent = 0);
29+
30+ Q_INVOKABLE void unlockAllModems();
31+};
32+
33+#endif // CONNECTIVITY_H
plugins/Ubuntu/Connectivity/Connectivity.qmltypesnew file+17
@@ -0,0 +1,17 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Ubuntu.Connectivity 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "Connectivity"
12+ prototype: "QObject"
13+ exports: ["Ubuntu.Connectivity/Connectivity 0.1"]
14+ exportMetaObjectRevisions: [0]
15+ Method { name: "unlockAllModems" }
16+ }
17+}
plugins/Ubuntu/Connectivity/plugin.cppnew file+34
@@ -0,0 +1,34 @@
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 "Connectivity.h"
19+
20+#include <QtQml>
21+
22+static QObject *service_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
23+{
24+ Q_UNUSED(engine)
25+ Q_UNUSED(scriptEngine)
26+ return new Connectivity();
27+}
28+
29+void BackendPlugin::registerTypes(const char *uri)
30+{
31+ Q_ASSERT(uri == QLatin1String("Ubuntu.Connectivity"));
32+
33+ qmlRegisterSingletonType<Connectivity>(uri, 0, 1, "Connectivity", service_provider);
34+}
plugins/Ubuntu/Connectivity/plugin.hnew file+31
@@ -0,0 +1,31 @@
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 CONNECTIVITY_PLUGIN_H
18+#define CONNECTIVITY_PLUGIN_H
19+
20+#include <QQmlExtensionPlugin>
21+
22+class BackendPlugin : public QQmlExtensionPlugin
23+{
24+ Q_OBJECT
25+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26+
27+public:
28+ void registerTypes(const char *uri);
29+};
30+
31+#endif // CONNECTIVITY_PLUGIN_H
plugins/Ubuntu/Connectivity/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module Ubuntu.Connectivity
2+plugin Connectivity
3+typeinfo Connectivity.qmltypes
plugins/Unity/Indicators/CachedUnityMenuModel.qmldeleted−60
@@ -1,60 +0,0 @@
1−/*
2− * Copyright 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 Lesser 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 Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import QMenuModel 0.1 as QMenuModel
22−import Unity.Indicators 0.1 as Indicators
23−
24−// Make sure we don't duplicate models.
25−Item {
26− id: cachedModel
27− property string busName: ""
28− property string actionsObjectPath: ""
29− property string menuObjectPath: ""
30−
31− readonly property bool ready: busName!=="" && actionsObjectPath!=="" && menuObjectPath!==""
32−
33− property QtObject model: {
34− if (!ready) {
35− return null;
36− }
37−
38− var component = Indicators.UnityMenuModelCache.model(menuObjectPath);
39− if (!component) {
40− component = modelComponent.createObject(cachedModel);
41− return component;
42− }
43− return component;
44− }
45−
46− Component {
47− id: modelComponent
48−
49− QMenuModel.UnityMenuModel {
50− id: unityModel
51− busName: cachedModel.busName
52− actions: { "indicator": cachedModel.actionsObjectPath }
53− menuObjectPath: cachedModel.menuObjectPath
54−
55− Component.onCompleted: {
56− Indicators.UnityMenuModelCache.registerModel(cachedModel.menuObjectPath, unityModel);
57− }
58− }
59− }
60−}
plugins/Unity/Indicators/qmldir−3
@@ -1,6 +1,3 @@
11module Unity.Indicators
22plugin IndicatorsQml
33typeinfo Indicators.qmltypes
4−
5−CachedUnityMenuModel 0.1 CachedUnityMenuModel.qml
6−IndicatorBase 0.1 IndicatorBase.qml
plugins/Unity/Indicators/unitymenumodelcache.cpp+22−7
@@ -29,14 +29,29 @@ UnityMenuModelCache::~UnityMenuModelCache()
2929{
3030}
3131
32−
33−UnityMenuModel* UnityMenuModelCache::model(const QString& path) const
32+UnityMenuModel* UnityMenuModelCache::model(const QByteArray& bus,
33+ const QByteArray& path,
34+ const QVariantMap& actions)
3435{
35− return m_menuModels.value(path, NULL);
36+ if (m_registry.contains(path))
37+ return m_registry[path];
38+
39+ UnityMenuModel* menuModel = new UnityMenuModel;
40+ connect(menuModel, &QObject::destroyed, this, [menuModel, this](QObject*) {
41+ QList<QByteArray> keys = m_registry.keys(menuModel);
42+ Q_FOREACH(const QByteArray& key, keys) {
43+ m_registry.remove(key);
44+ }
45+ });
46+ m_registry[path] = menuModel;
47+
48+ menuModel->setBusName(bus);
49+ menuModel->setMenuObjectPath(path);
50+ menuModel->setActions(actions);
51+ return menuModel;
3652}
3753
38−void UnityMenuModelCache::registerModel(const QString& path, UnityMenuModel* menuModel)
54+bool UnityMenuModelCache::contains(const QByteArray& path)
3955{
40− menuModel->setParent(this);
41− m_menuModels[path] = menuModel;
42−}
56+ return m_registry.contains(path);
57+}
plugins/Unity/Indicators/unitymenumodelcache.h+5−3
@@ -34,11 +34,13 @@ public:
3434 UnityMenuModelCache(QObject*parent=NULL);
3535 ~UnityMenuModelCache();
3636
37− Q_INVOKABLE UnityMenuModel* model(const QString& path) const;
38− Q_INVOKABLE void registerModel(const QString& path, UnityMenuModel* menuModel);
37+ Q_INVOKABLE UnityMenuModel* model(const QByteArray& bus,
38+ const QByteArray& path,
39+ const QVariantMap& actions);
40+ Q_INVOKABLE bool contains(const QByteArray& path);
3941
4042private:
41− QHash<QString, UnityMenuModel*> m_menuModels;
43+ QHash<QByteArray, UnityMenuModel*> m_registry;
4244};
4345
4446#endif // UNITYMENUMODELCACHE_H
po/de.po+20−16
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-17 21:46+0000\n"
12−"Last-Translator: Phillip Sz <Unknown>\n"
11+"PO-Revision-Date: 2014-08-21 16:18+0000\n"
12+"Last-Translator: Martin Pitt <martin.pitt@ubuntu.com>\n"
1313"Language-Team: German <de@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-08-18 07:20+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
17+"X-Launchpad-Export-Date: 2014-08-22 07:39+0000\n"
18+"X-Generator: Launchpad (build 17163)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:129
2121msgid "Password: "
@@ -32,7 +32,7 @@ msgstr "Verknüpfung entfernen"
3232
3333#: qml/Components/Dialogs.qml:142
3434msgid "Are you sure you would like to turn power off?"
35−msgstr ""
35+msgstr "Sind Sie sicher dass das Telefon ausgeschaltet werden soll?"
3636
3737#: qml/Components/Dialogs.qml:144
3838msgid "Power off"
@@ -99,7 +99,7 @@ msgstr ""
9999
100100#: qml/Components/Lockscreen.qml:161
101101msgid "Too many incorrect attempts"
102−msgstr ""
102+msgstr "Zu viele falsche Versuche"
103103
104104#: qml/Components/Lockscreen.qml:163
105105msgid "Please wait"
@@ -164,7 +164,7 @@ msgstr "Senden"
164164
165165#: qml/Dash/ScopesOverview.qml:201
166166msgid "Manage Dash"
167−msgstr ""
167+msgstr "Dash verwalten"
168168
169169#: qml/Dash/ScopesOverview.qml:408
170170msgid "Done"
@@ -172,7 +172,7 @@ msgstr "Erledigt"
172172
173173#: qml/Dash/ScopesOverview.qml:434
174174msgid "Store"
175−msgstr ""
175+msgstr "Store"
176176
177177#: qml/Dash/ScopesOverviewTab.qml:36
178178msgid "Favorites"
@@ -248,7 +248,7 @@ msgstr "Fehlgeschlagen, tippen Sie zum Wiederholen"
248248
249249#: qml/Panel/Indicators/ModemInfoItem.qml:105
250250msgid "Unlock SIM"
251−msgstr ""
251+msgstr "SIM-Karte entsprerren"
252252
253253#: qml/Panel/Indicators/RoamingIndication.qml:27
254254msgid "Roaming"
@@ -260,42 +260,46 @@ msgstr "Passwort"
260260
261261#: qml/Shell.qml:267
262262msgid "passcode"
263−msgstr ""
263+msgstr "Passwort"
264264
265265#: qml/Shell.qml:269
266266#, qt-format
267267msgid "Enter your %1"
268−msgstr ""
268+msgstr "%1 eingeben"
269269
270270#: qml/Shell.qml:270
271271#, qt-format
272272msgid "Incorrect %1"
273−msgstr ""
273+msgstr "%1 falsch"
274274
275275#: qml/Shell.qml:272
276276msgid "Please re-enter"
277−msgstr ""
277+msgstr "Bitte neu eingeben"
278278
279279#: qml/Shell.qml:306
280280msgid "Sorry, incorrect passphrase."
281−msgstr ""
281+msgstr "Falsches Passwort."
282282
283283#: qml/Shell.qml:307
284284msgid "Sorry, incorrect passcode."
285−msgstr ""
285+msgstr "Falsche PIN"
286286
287287#: qml/Shell.qml:308
288288msgid "This will be your last attempt."
289−msgstr ""
289+msgstr "Dies ist Ihr letzter Versuch."
290290
291291#: qml/Shell.qml:310
292292msgid ""
293293"If passphrase is entered incorrectly, your phone will conduct a factory "
294294"reset and all personal data will be deleted."
295295msgstr ""
296+"Wird das Passwort falsch eingegeben, wird das Telefon auf den Werkszustand "
297+"zurückgesetzt und alle Daten werden gelöscht."
296298
297299#: qml/Shell.qml:311
298300msgid ""
299301"If passcode is entered incorrectly, your phone will conduct a factory reset "
300302"and all personal data will be deleted."
301303msgstr ""
304+"Wird die PIN falsch eingegeben, wird das Telefon auf den Werkszustand "
305+"zurückgesetzt und alle Daten werden gelöscht."
po/el.po+18−18
@@ -8,18 +8,18 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-08 13:03+0000\n"
12−"Last-Translator: Simos Xenitellis <Unknown>\n"
11+"PO-Revision-Date: 2014-08-21 12:06+0000\n"
12+"Last-Translator: Chris Taklis (aka Kailor) <ctaklis@gmail.com>\n"
1313"Language-Team: Greek <el@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
17+"X-Launchpad-Export-Date: 2014-08-22 07:39+0000\n"
18+"X-Generator: Launchpad (build 17163)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:129
2121msgid "Password: "
22−msgstr ""
22+msgstr "Κωδικός πρόσβασης: "
2323
2424#: plugins/Unity/Launcher/launcheritem.cpp:43
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -36,15 +36,15 @@ msgstr ""
3636
3737#: qml/Components/Dialogs.qml:144
3838msgid "Power off"
39−msgstr ""
39+msgstr "Τερματισμός"
4040
4141#: qml/Components/Dialogs.qml:153
4242msgid "Restart"
43−msgstr ""
43+msgstr "Επανεκκίνηση"
4444
4545#: qml/Components/Dialogs.qml:162
4646msgid "Cancel"
47−msgstr ""
47+msgstr "Ακύρωση"
4848
4949#: qml/Components/EdgeDemoOverlay.qml:151
5050msgid "Skip intro"
@@ -98,11 +98,11 @@ msgstr ""
9898
9999#: qml/Components/Lockscreen.qml:161
100100msgid "Too many incorrect attempts"
101−msgstr ""
101+msgstr "Πολλές άκυρες προσπάθειες"
102102
103103#: qml/Components/Lockscreen.qml:163
104104msgid "Please wait"
105−msgstr ""
105+msgstr "Παρακαλώ περιμένετε"
106106
107107#: qml/Components/Lockscreen.qml:245
108108msgid "Emergency Call"
@@ -167,19 +167,19 @@ msgstr ""
167167
168168#: qml/Dash/ScopesOverview.qml:408
169169msgid "Done"
170−msgstr ""
170+msgstr "Ολοκληρώθηκε"
171171
172172#: qml/Dash/ScopesOverview.qml:434
173173msgid "Store"
174−msgstr ""
174+msgstr "Κατάστημα"
175175
176176#: qml/Dash/ScopesOverviewTab.qml:36
177177msgid "Favorites"
178−msgstr ""
178+msgstr "Αγαπημένα"
179179
180180#: qml/Dash/ScopesOverviewTab.qml:54
181181msgid "All"
182−msgstr ""
182+msgstr "Όλα"
183183
184184#: qml/Greeter/Greeter.qml:157
185185msgid "Swipe to unlock"
@@ -247,11 +247,11 @@ msgstr "Αποτυχία, πατήστε για να ξαναπροσπαθήσ
247247
248248#: qml/Panel/Indicators/ModemInfoItem.qml:105
249249msgid "Unlock SIM"
250−msgstr ""
250+msgstr "Ξεκλείδωμα SIM"
251251
252252#: qml/Panel/Indicators/RoamingIndication.qml:27
253253msgid "Roaming"
254−msgstr ""
254+msgstr "Περιαγωγή"
255255
256256#: qml/Shell.qml:267
257257msgid "passphrase"
@@ -264,7 +264,7 @@ msgstr ""
264264#: qml/Shell.qml:269
265265#, qt-format
266266msgid "Enter your %1"
267−msgstr ""
267+msgstr "Εισάγετε το %1"
268268
269269#: qml/Shell.qml:270
270270#, qt-format
@@ -273,7 +273,7 @@ msgstr ""
273273
274274#: qml/Shell.qml:272
275275msgid "Please re-enter"
276−msgstr ""
276+msgstr "Παρακαλούμε εισάγετε ξανά"
277277
278278#: qml/Shell.qml:306
279279msgid "Sorry, incorrect passphrase."
po/gl.po+4−4
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-14 14:23+0000\n"
11+"PO-Revision-Date: 2014-08-21 14:32+0000\n"
1212"Last-Translator: Marcos Lans <Unknown>\n"
1313"Language-Team: Galician <gl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
17+"X-Launchpad-Export-Date: 2014-08-22 07:39+0000\n"
18+"X-Generator: Launchpad (build 17163)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:129
2121msgid "Password: "
@@ -163,7 +163,7 @@ msgstr "Enviar"
163163
164164#: qml/Dash/ScopesOverview.qml:201
165165msgid "Manage Dash"
166−msgstr "Xestionar o Panel"
166+msgstr "Xestión do Panel"
167167
168168#: qml/Dash/ScopesOverview.qml:408
169169msgid "Done"
po/hu.po+33−29
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-16 12:36+0000\n"
11+"PO-Revision-Date: 2014-08-19 07:08+0000\n"
1212"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
1313"Language-Team: Hungarian <hu@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-08-18 07:20+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
17+"X-Launchpad-Export-Date: 2014-08-20 06:23+0000\n"
18+"X-Generator: Launchpad (build 17163)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:129
2121msgid "Password: "
@@ -32,7 +32,7 @@ msgstr "Indító feloldása"
3232
3333#: qml/Components/Dialogs.qml:142
3434msgid "Are you sure you would like to turn power off?"
35−msgstr ""
35+msgstr "Biztos benne, hogy ki szeretné kapcsolni?"
3636
3737#: qml/Components/Dialogs.qml:144
3838msgid "Power off"
@@ -44,7 +44,7 @@ msgstr "Újraindítás"
4444
4545#: qml/Components/Dialogs.qml:162
4646msgid "Cancel"
47−msgstr ""
47+msgstr "Mégse"
4848
4949#: qml/Components/EdgeDemoOverlay.qml:151
5050msgid "Skip intro"
@@ -98,46 +98,46 @@ msgstr ""
9898
9999#: qml/Components/Lockscreen.qml:161
100100msgid "Too many incorrect attempts"
101−msgstr ""
101+msgstr "Túl sok sikertelen kísérlet"
102102
103103#: qml/Components/Lockscreen.qml:163
104104msgid "Please wait"
105105msgstr "Kérem várjon"
106106
107−#: qml/Components/Lockscreen.qml:245
107+#: qml/Components/Lockscreen.qml:220
108108msgid "Emergency Call"
109109msgstr "Vészhívás"
110110
111−#: qml/Components/Lockscreen.qml:268
111+#: qml/Components/Lockscreen.qml:243
112112msgid "OK"
113113msgstr "Ok"
114114
115−#: qml/Components/PassphraseLockscreen.qml:61
115+#: qml/Components/PassphraseLockscreen.qml:62
116116#, qt-format
117117msgid "Hello %1"
118118msgstr "Üdv %1"
119119
120−#: qml/Components/PassphraseLockscreen.qml:61
120+#: qml/Components/PassphraseLockscreen.qml:62
121121msgid "Hello"
122122msgstr "Üdvözöljük"
123123
124−#: qml/Components/PinLockscreen.qml:197
124+#: qml/Components/PinLockscreen.qml:198
125125msgid "CANCEL"
126126msgstr "MÉGSE"
127127
128−#: qml/Components/PinLockscreen.qml:215
128+#: qml/Components/PinLockscreen.qml:216
129129msgid "DONE"
130130msgstr "KÉSZ"
131131
132−#: qml/Dash/GenericScopeView.qml:360
132+#: qml/Dash/GenericScopeView.qml:358
133133msgid "See less"
134134msgstr "Kevesebb"
135135
136−#: qml/Dash/GenericScopeView.qml:360
136+#: qml/Dash/GenericScopeView.qml:358
137137msgid "See all"
138138msgstr "Összes megtekintése"
139139
140−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
140+#: qml/Panel/SearchIndicator.qml:27
141141msgid "Search"
142142msgstr "Keresés"
143143
@@ -161,17 +161,17 @@ msgstr "Értékelés hozzáadása"
161161msgid "Send"
162162msgstr "Küldés"
163163
164−#: qml/Dash/ScopesOverview.qml:201
164+#: qml/Dash/ScopesOverview.qml:200
165165msgid "Manage Dash"
166−msgstr ""
166+msgstr "Dash kezelése"
167167
168−#: qml/Dash/ScopesOverview.qml:408
168+#: qml/Dash/ScopesOverview.qml:405
169169msgid "Done"
170−msgstr ""
170+msgstr "Kész"
171171
172−#: qml/Dash/ScopesOverview.qml:434
172+#: qml/Dash/ScopesOverview.qml:431
173173msgid "Store"
174−msgstr ""
174+msgstr "Áruház"
175175
176176#: qml/Dash/ScopesOverviewTab.qml:36
177177msgid "Favorites"
@@ -255,46 +255,50 @@ msgstr "Barangolás"
255255
256256#: qml/Shell.qml:267
257257msgid "passphrase"
258−msgstr ""
258+msgstr "jelmondat"
259259
260260#: qml/Shell.qml:267
261261msgid "passcode"
262−msgstr ""
262+msgstr "jelkód"
263263
264264#: qml/Shell.qml:269
265265#, qt-format
266266msgid "Enter your %1"
267−msgstr ""
267+msgstr "Adja meg a következőt: %1"
268268
269269#: qml/Shell.qml:270
270270#, qt-format
271271msgid "Incorrect %1"
272−msgstr ""
272+msgstr "Helytelen %1"
273273
274274#: qml/Shell.qml:272
275275msgid "Please re-enter"
276−msgstr ""
276+msgstr "Kérjük adja meg újra"
277277
278278#: qml/Shell.qml:306
279279msgid "Sorry, incorrect passphrase."
280−msgstr ""
280+msgstr "Sajnáljuk, helytelen jelmondat."
281281
282282#: qml/Shell.qml:307
283283msgid "Sorry, incorrect passcode."
284−msgstr ""
284+msgstr "Sajnáljuk, helytelen jelkód."
285285
286286#: qml/Shell.qml:308
287287msgid "This will be your last attempt."
288−msgstr ""
288+msgstr "Ez az utolsó próbálkozási lehetősége."
289289
290290#: qml/Shell.qml:310
291291msgid ""
292292"If passphrase is entered incorrectly, your phone will conduct a factory "
293293"reset and all personal data will be deleted."
294294msgstr ""
295+"Ha helytelen jelmondatot ad meg, a telefonja visszaállítja a gyári "
296+"beállításokat és törli minden személyes adatát."
295297
296298#: qml/Shell.qml:311
297299msgid ""
298300"If passcode is entered incorrectly, your phone will conduct a factory reset "
299301"and all personal data will be deleted."
300302msgstr ""
303+"Ha helytelen jelkódot ad meg, a telefonja visszaállítja a gyári "
304+"beállításokat és törli minden személyes adatát."
po/ja.po+53−52
@@ -8,43 +8,43 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-12 07:14+0000\n"
12−"Last-Translator: Shushi Kurose <md81bird@hitaki.net>\n"
11+"PO-Revision-Date: 2014-08-18 15:03+0000\n"
12+"Last-Translator: Mitsuya Shibata <mty.shibata@gmail.com>\n"
1313"Language-Team: Japanese <ja@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-19 06:59+0000\n"
1818"X-Generator: Launchpad (build 17156)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:129
2121msgid "Password: "
22−msgstr ""
22+msgstr "パスワード: "
2323
2424#: plugins/Unity/Launcher/launcheritem.cpp:43
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Pin shortcut"
27−msgstr ""
27+msgstr "ショートカットを追加する"
2828
2929#: plugins/Unity/Launcher/launcheritem.cpp:73
3030msgid "Unpin shortcut"
31−msgstr ""
31+msgstr "ショートカットを削除する"
3232
3333#: qml/Components/Dialogs.qml:142
3434msgid "Are you sure you would like to turn power off?"
35−msgstr ""
35+msgstr "本当に電源を切りますか?"
3636
3737#: qml/Components/Dialogs.qml:144
3838msgid "Power off"
39−msgstr ""
39+msgstr "電源を切る"
4040
4141#: qml/Components/Dialogs.qml:153
4242msgid "Restart"
43−msgstr ""
43+msgstr "再起動"
4444
4545#: qml/Components/Dialogs.qml:162
4646msgid "Cancel"
47−msgstr ""
47+msgstr "キャンセル"
4848
4949#: qml/Components/EdgeDemoOverlay.qml:151
5050msgid "Skip intro"
@@ -56,7 +56,7 @@ msgstr "右端"
5656
5757#: qml/Components/EdgeDemo.qml:113
5858msgid "Try swiping from the right edge to unlock the phone"
59−msgstr ""
59+msgstr "アンロックするには右端からスワイプしてみてください"
6060
6161#: qml/Components/EdgeDemo.qml:144
6262msgid "Top edge"
@@ -91,63 +91,64 @@ msgid ""
9191"You have now mastered the edge gestures and can start using the "
9292"phone<br><br>Tap on the screen to start"
9393msgstr ""
94+"これでスマートフォンの操作に必要な、画面端を用いたジェスチャーを習得できました。<br><br>利用を開始するなら画面をタップしてください"
9495
9596#: qml/Components/Lockscreen.qml:161
9697msgid "Too many incorrect attempts"
97−msgstr ""
98+msgstr "失敗回数が上限に達しました"
9899
99100#: qml/Components/Lockscreen.qml:163
100101msgid "Please wait"
101−msgstr ""
102+msgstr "お待ちください"
102103
103−#: qml/Components/Lockscreen.qml:245
104+#: qml/Components/Lockscreen.qml:220
104105msgid "Emergency Call"
105106msgstr "緊急通報"
106107
107−#: qml/Components/Lockscreen.qml:268
108+#: qml/Components/Lockscreen.qml:243
108109msgid "OK"
109110msgstr "OK"
110111
111−#: qml/Components/PassphraseLockscreen.qml:61
112+#: qml/Components/PassphraseLockscreen.qml:62
112113#, qt-format
113114msgid "Hello %1"
114115msgstr "こんにちは %1 さん"
115116
116−#: qml/Components/PassphraseLockscreen.qml:61
117+#: qml/Components/PassphraseLockscreen.qml:62
117118msgid "Hello"
118119msgstr "こんにちは"
119120
120−#: qml/Components/PinLockscreen.qml:197
121+#: qml/Components/PinLockscreen.qml:198
121122msgid "CANCEL"
122−msgstr ""
123+msgstr "キャンセル"
123124
124−#: qml/Components/PinLockscreen.qml:215
125+#: qml/Components/PinLockscreen.qml:216
125126msgid "DONE"
126−msgstr ""
127+msgstr "完了"
127128
128−#: qml/Dash/GenericScopeView.qml:360
129+#: qml/Dash/GenericScopeView.qml:358
129130msgid "See less"
130131msgstr ""
131132
132−#: qml/Dash/GenericScopeView.qml:360
133+#: qml/Dash/GenericScopeView.qml:358
133134msgid "See all"
134−msgstr ""
135+msgstr "すべて表示する"
135136
136−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
137+#: qml/Panel/SearchIndicator.qml:27
137138msgid "Search"
138139msgstr "検索"
139140
140141#: qml/Dash/Previews/PreviewActionCombo.qml:34
141142msgid "More..."
142−msgstr ""
143+msgstr "さらに ..."
143144
144145#: qml/Dash/Previews/PreviewActionCombo.qml:34
145146msgid "Less..."
146−msgstr ""
147+msgstr "隠す..."
147148
148149#: qml/Dash/Previews/PreviewRatingInput.qml:81
149150msgid "Rate this"
150−msgstr ""
151+msgstr "評価する"
151152
152153#: qml/Dash/Previews/PreviewRatingInput.qml:126
153154msgid "Add a review"
@@ -157,21 +158,21 @@ msgstr "レビューを追加"
157158msgid "Send"
158159msgstr "送信"
159160
160−#: qml/Dash/ScopesOverview.qml:201
161+#: qml/Dash/ScopesOverview.qml:200
161162msgid "Manage Dash"
162−msgstr ""
163+msgstr "Dashの管理"
163164
164−#: qml/Dash/ScopesOverview.qml:408
165+#: qml/Dash/ScopesOverview.qml:405
165166msgid "Done"
166−msgstr ""
167+msgstr "完了"
167168
168−#: qml/Dash/ScopesOverview.qml:434
169+#: qml/Dash/ScopesOverview.qml:431
169170msgid "Store"
170−msgstr ""
171+msgstr "保存"
171172
172173#: qml/Dash/ScopesOverviewTab.qml:36
173174msgid "Favorites"
174−msgstr ""
175+msgstr "お気に入り"
175176
176177#: qml/Dash/ScopesOverviewTab.qml:54
177178msgid "All"
@@ -179,7 +180,7 @@ msgstr "すべて"
179180
180181#: qml/Greeter/Greeter.qml:157
181182msgid "Swipe to unlock"
182−msgstr ""
183+msgstr "スワイプしてロック解除"
183184
184185#: qml/Hud/HudParametrizedActionsPage.qml:132
185186msgid "Confirm"
@@ -187,7 +188,7 @@ msgstr "確認"
187188
188189#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
189190msgid "Type or say a command"
190−msgstr ""
191+msgstr "コマンドを音声かキーボードから入力"
191192
192193#: qml/Hud/Hud.qml:84
193194msgid "Loading. Please Wait..."
@@ -207,11 +208,11 @@ msgstr "パスワードを表示"
207208
208209#: qml/Notifications/NotificationMenuItemFactory.qml:115
209210msgid "Please enter SIM PIN"
210−msgstr ""
211+msgstr "SIM PINを入力してください"
211212
212213#: qml/Panel/ActiveCallHint.qml:77
213214msgid "Tap to return to call..."
214−msgstr ""
215+msgstr "タップすると通話に戻ります..."
215216
216217#: qml/Panel/ActiveCallHint.qml:90
217218msgid "Conference"
@@ -223,11 +224,11 @@ msgstr ""
223224
224225#: qml/Panel/Indicators/MenuItemFactory.qml:655
225226msgid "Downloading"
226−msgstr ""
227+msgstr "ダウンロード中"
227228
228229#: qml/Panel/Indicators/MenuItemFactory.qml:657
229230msgid "Paused, tap to resume"
230−msgstr ""
231+msgstr "停止中、再開するにはタップしてください"
231232
232233#: qml/Panel/Indicators/MenuItemFactory.qml:659
233234msgid "Canceled"
@@ -239,49 +240,49 @@ msgstr ""
239240
240241#: qml/Panel/Indicators/MenuItemFactory.qml:663
241242msgid "Failed, tap to retry"
242−msgstr ""
243+msgstr "失敗しました、再試行するにはタップしてください"
243244
244245#: qml/Panel/Indicators/ModemInfoItem.qml:105
245246msgid "Unlock SIM"
246−msgstr ""
247+msgstr "SIMのアンロック"
247248
248249#: qml/Panel/Indicators/RoamingIndication.qml:27
249250msgid "Roaming"
250−msgstr ""
251+msgstr "ローミング"
251252
252253#: qml/Shell.qml:267
253254msgid "passphrase"
254−msgstr ""
255+msgstr "パスフレーズ"
255256
256257#: qml/Shell.qml:267
257258msgid "passcode"
258−msgstr ""
259+msgstr "パスコード"
259260
260261#: qml/Shell.qml:269
261262#, qt-format
262263msgid "Enter your %1"
263−msgstr ""
264+msgstr "%1を入力してください"
264265
265266#: qml/Shell.qml:270
266267#, qt-format
267268msgid "Incorrect %1"
268−msgstr ""
269+msgstr "%1が間違っています"
269270
270271#: qml/Shell.qml:272
271272msgid "Please re-enter"
272−msgstr ""
273+msgstr "再入力してください"
273274
274275#: qml/Shell.qml:306
275276msgid "Sorry, incorrect passphrase."
276−msgstr ""
277+msgstr "パスフレーズが間違っています。"
277278
278279#: qml/Shell.qml:307
279280msgid "Sorry, incorrect passcode."
280−msgstr ""
281+msgstr "パスコードが間違っています。"
281282
282283#: qml/Shell.qml:308
283284msgid "This will be your last attempt."
284−msgstr ""
285+msgstr "これが最後のチャンスです。"
285286
286287#: qml/Shell.qml:310
287288msgid ""
po/km.po+32−26
@@ -8,18 +8,18 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-13 04:57+0000\n"
11+"PO-Revision-Date: 2014-08-20 02:48+0000\n"
1212"Last-Translator: Sok Sophea <sksophea@gmail.com>\n"
1313"Language-Team: Khmer <km@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
17+"X-Launchpad-Export-Date: 2014-08-21 06:48+0000\n"
18+"X-Generator: Launchpad (build 17163)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:129
2121msgid "Password: "
22−msgstr ""
22+msgstr "ពាក្យសម្ងាត់៖ "
2323
2424#: plugins/Unity/Launcher/launcheritem.cpp:43
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -98,46 +98,46 @@ msgstr ""
9898
9999#: qml/Components/Lockscreen.qml:161
100100msgid "Too many incorrect attempts"
101−msgstr ""
101+msgstr "បាន​ព្យាយាម​ខុស​ច្រើន​ដង​ពេក"
102102
103103#: qml/Components/Lockscreen.qml:163
104104msgid "Please wait"
105−msgstr ""
105+msgstr "សូមរង់ចាំ"
106106
107−#: qml/Components/Lockscreen.qml:245
107+#: qml/Components/Lockscreen.qml:220
108108msgid "Emergency Call"
109109msgstr "ការ​ហៅ​ពេល​អាសន្ន"
110110
111−#: qml/Components/Lockscreen.qml:268
111+#: qml/Components/Lockscreen.qml:243
112112msgid "OK"
113113msgstr "យល់ព្រម"
114114
115−#: qml/Components/PassphraseLockscreen.qml:61
115+#: qml/Components/PassphraseLockscreen.qml:62
116116#, qt-format
117117msgid "Hello %1"
118118msgstr "សួស្ដី %1"
119119
120−#: qml/Components/PassphraseLockscreen.qml:61
120+#: qml/Components/PassphraseLockscreen.qml:62
121121msgid "Hello"
122122msgstr "សួស្តី"
123123
124−#: qml/Components/PinLockscreen.qml:197
124+#: qml/Components/PinLockscreen.qml:198
125125msgid "CANCEL"
126126msgstr "បោះបង់"
127127
128−#: qml/Components/PinLockscreen.qml:215
128+#: qml/Components/PinLockscreen.qml:216
129129msgid "DONE"
130130msgstr "រួចរាល់"
131131
132−#: qml/Dash/GenericScopeView.qml:360
132+#: qml/Dash/GenericScopeView.qml:358
133133msgid "See less"
134134msgstr "មើល​តិច​ជាង"
135135
136−#: qml/Dash/GenericScopeView.qml:360
136+#: qml/Dash/GenericScopeView.qml:358
137137msgid "See all"
138138msgstr "មើល​ទាំងអស់"
139139
140−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
140+#: qml/Panel/SearchIndicator.qml:27
141141msgid "Search"
142142msgstr "ស្វែង​រក"
143143
@@ -161,15 +161,15 @@ msgstr "បន្ថែម​ការ​ពិនិត្យ"
161161msgid "Send"
162162msgstr "ផ្ញើ"
163163
164−#: qml/Dash/ScopesOverview.qml:201
164+#: qml/Dash/ScopesOverview.qml:200
165165msgid "Manage Dash"
166166msgstr "គ្រប់គ្រង​ផ្ទាំង"
167167
168−#: qml/Dash/ScopesOverview.qml:408
168+#: qml/Dash/ScopesOverview.qml:405
169169msgid "Done"
170170msgstr "ធ្វើរួច"
171171
172−#: qml/Dash/ScopesOverview.qml:434
172+#: qml/Dash/ScopesOverview.qml:431
173173msgid "Store"
174174msgstr "រក្សាទុក"
175175
@@ -255,46 +255,52 @@ msgstr "រ៉ូមីង"
255255
256256#: qml/Shell.qml:267
257257msgid "passphrase"
258−msgstr ""
258+msgstr "ឃ្លា​សម្ងាត់"
259259
260260#: qml/Shell.qml:267
261261msgid "passcode"
262−msgstr ""
262+msgstr "កូដ​សម្ងាត់"
263263
264264#: qml/Shell.qml:269
265265#, qt-format
266266msgid "Enter your %1"
267−msgstr ""
267+msgstr "បញ្ចូល %1 របស់​អ្នក"
268268
269269#: qml/Shell.qml:270
270270#, qt-format
271271msgid "Incorrect %1"
272−msgstr ""
272+msgstr "មិន​ត្រឹមត្រូវ %1"
273273
274274#: qml/Shell.qml:272
275275msgid "Please re-enter"
276−msgstr ""
276+msgstr "សូម​បញ្ចូល​ឡើងវិញ"
277277
278278#: qml/Shell.qml:306
279279msgid "Sorry, incorrect passphrase."
280−msgstr ""
280+msgstr "សូមទោស! ឃ្លា​សម្ងាត់​មិន​ត្រឹមត្រូវ។"
281281
282282#: qml/Shell.qml:307
283283msgid "Sorry, incorrect passcode."
284−msgstr ""
284+msgstr "សូមទោស! កូដ​សម្ងាត់​មិន​ត្រឹមត្រូវ។"
285285
286286#: qml/Shell.qml:308
287287msgid "This will be your last attempt."
288−msgstr ""
288+msgstr "នេះ​គឺ​ការ​ព្យាយាម​លើក​ចុងក្រោយ។"
289289
290290#: qml/Shell.qml:310
291291msgid ""
292292"If passphrase is entered incorrectly, your phone will conduct a factory "
293293"reset and all personal data will be deleted."
294294msgstr ""
295+"បើ​បញ្ចូល​ឃ្លា​សម្ងាត់​មិន​ត្រឹមត្រូវ "
296+"ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ "
297+"ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
295298
296299#: qml/Shell.qml:311
297300msgid ""
298301"If passcode is entered incorrectly, your phone will conduct a factory reset "
299302"and all personal data will be deleted."
300303msgstr ""
304+"បើ​បញ្ចូល​កូដ​សម្ងាត់​មិន​ត្រឹមត្រូវ "
305+"ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ "
306+"ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
po/ko.po+42−40
@@ -8,18 +8,18 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-07-17 03:56+0000\n"
11+"PO-Revision-Date: 2014-08-19 13:02+0000\n"
1212"Last-Translator: MinSik CHO <Unknown>\n"
1313"Language-Team: Korean <ko@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
17+"X-Launchpad-Export-Date: 2014-08-20 06:23+0000\n"
18+"X-Generator: Launchpad (build 17163)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:129
2121msgid "Password: "
22−msgstr ""
22+msgstr "열쇠글: "
2323
2424#: plugins/Unity/Launcher/launcheritem.cpp:43
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -32,19 +32,19 @@ msgstr "바로가기를 고정 해제하기"
3232
3333#: qml/Components/Dialogs.qml:142
3434msgid "Are you sure you would like to turn power off?"
35−msgstr ""
35+msgstr "정말로 전원을 끌까요?"
3636
3737#: qml/Components/Dialogs.qml:144
3838msgid "Power off"
39−msgstr ""
39+msgstr "전원 끄기"
4040
4141#: qml/Components/Dialogs.qml:153
4242msgid "Restart"
43−msgstr ""
43+msgstr "재시작"
4444
4545#: qml/Components/Dialogs.qml:162
4646msgid "Cancel"
47−msgstr ""
47+msgstr "취소"
4848
4949#: qml/Components/EdgeDemoOverlay.qml:151
5050msgid "Skip intro"
@@ -96,46 +96,46 @@ msgstr ""
9696
9797#: qml/Components/Lockscreen.qml:161
9898msgid "Too many incorrect attempts"
99−msgstr ""
99+msgstr "너무 많이 틀리셨습니다"
100100
101101#: qml/Components/Lockscreen.qml:163
102102msgid "Please wait"
103−msgstr ""
103+msgstr "기다려주십시오"
104104
105−#: qml/Components/Lockscreen.qml:245
105+#: qml/Components/Lockscreen.qml:220
106106msgid "Emergency Call"
107107msgstr "긴급 통화"
108108
109−#: qml/Components/Lockscreen.qml:268
109+#: qml/Components/Lockscreen.qml:243
110110msgid "OK"
111111msgstr "확인"
112112
113−#: qml/Components/PassphraseLockscreen.qml:61
113+#: qml/Components/PassphraseLockscreen.qml:62
114114#, qt-format
115115msgid "Hello %1"
116116msgstr "안녕하세요 %1"
117117
118−#: qml/Components/PassphraseLockscreen.qml:61
118+#: qml/Components/PassphraseLockscreen.qml:62
119119msgid "Hello"
120120msgstr "안녕하세요"
121121
122−#: qml/Components/PinLockscreen.qml:197
122+#: qml/Components/PinLockscreen.qml:198
123123msgid "CANCEL"
124124msgstr "취소"
125125
126−#: qml/Components/PinLockscreen.qml:215
126+#: qml/Components/PinLockscreen.qml:216
127127msgid "DONE"
128128msgstr "완료"
129129
130−#: qml/Dash/GenericScopeView.qml:360
130+#: qml/Dash/GenericScopeView.qml:358
131131msgid "See less"
132132msgstr "간단히 표시하기"
133133
134−#: qml/Dash/GenericScopeView.qml:360
134+#: qml/Dash/GenericScopeView.qml:358
135135msgid "See all"
136−msgstr ""
136+msgstr "모두 보기"
137137
138−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
138+#: qml/Panel/SearchIndicator.qml:27
139139msgid "Search"
140140msgstr "검색"
141141
@@ -159,25 +159,25 @@ msgstr "평가 제출하기"
159159msgid "Send"
160160msgstr "보내기"
161161
162−#: qml/Dash/ScopesOverview.qml:201
162+#: qml/Dash/ScopesOverview.qml:200
163163msgid "Manage Dash"
164−msgstr ""
164+msgstr "대시 관리"
165165
166−#: qml/Dash/ScopesOverview.qml:408
166+#: qml/Dash/ScopesOverview.qml:405
167167msgid "Done"
168−msgstr ""
168+msgstr "완료"
169169
170−#: qml/Dash/ScopesOverview.qml:434
170+#: qml/Dash/ScopesOverview.qml:431
171171msgid "Store"
172−msgstr ""
172+msgstr "장터"
173173
174174#: qml/Dash/ScopesOverviewTab.qml:36
175175msgid "Favorites"
176−msgstr ""
176+msgstr "즐겨찾기"
177177
178178#: qml/Dash/ScopesOverviewTab.qml:54
179179msgid "All"
180−msgstr ""
180+msgstr "모두"
181181
182182#: qml/Greeter/Greeter.qml:157
183183msgid "Swipe to unlock"
@@ -213,11 +213,11 @@ msgstr "심카드의 PIN 번호를 입력하세요."
213213
214214#: qml/Panel/ActiveCallHint.qml:77
215215msgid "Tap to return to call..."
216−msgstr ""
216+msgstr "통화로 돌아가려면 터치하세요..."
217217
218218#: qml/Panel/ActiveCallHint.qml:90
219219msgid "Conference"
220−msgstr ""
220+msgstr "회의"
221221
222222#: qml/Panel/Indicators/MenuItemFactory.qml:651
223223msgid "In queue…"
@@ -245,54 +245,56 @@ msgstr "실패하였습니다. 재시도하려면 누르세요."
245245
246246#: qml/Panel/Indicators/ModemInfoItem.qml:105
247247msgid "Unlock SIM"
248−msgstr ""
248+msgstr "SIM 카드 보안 해제"
249249
250250#: qml/Panel/Indicators/RoamingIndication.qml:27
251251msgid "Roaming"
252−msgstr ""
252+msgstr "로밍"
253253
254254#: qml/Shell.qml:267
255255msgid "passphrase"
256−msgstr ""
256+msgstr "비밀번호"
257257
258258#: qml/Shell.qml:267
259259msgid "passcode"
260−msgstr ""
260+msgstr "비밀번호"
261261
262262#: qml/Shell.qml:269
263263#, qt-format
264264msgid "Enter your %1"
265−msgstr ""
265+msgstr "%1를 입력하세요"
266266
267267#: qml/Shell.qml:270
268268#, qt-format
269269msgid "Incorrect %1"
270−msgstr ""
270+msgstr "잘못된 %1입니다"
271271
272272#: qml/Shell.qml:272
273273msgid "Please re-enter"
274−msgstr ""
274+msgstr "다시 입력하세요"
275275
276276#: qml/Shell.qml:306
277277msgid "Sorry, incorrect passphrase."
278−msgstr ""
278+msgstr "잘못된 비밀번호입니다."
279279
280280#: qml/Shell.qml:307
281281msgid "Sorry, incorrect passcode."
282−msgstr ""
282+msgstr "잘못된 비밀번호입니다."
283283
284284#: qml/Shell.qml:308
285285msgid "This will be your last attempt."
286−msgstr ""
286+msgstr "마지막 시도입니다."
287287
288288#: qml/Shell.qml:310
289289msgid ""
290290"If passphrase is entered incorrectly, your phone will conduct a factory "
291291"reset and all personal data will be deleted."
292292msgstr ""
293+"만약 이번 시도에서 잘못 입력하면, 보안을 위해 휴대 전화가 공장 초기화 과정을 거쳐 모든 사용자 데이터를 삭제할 것입니다."
293294
294295#: qml/Shell.qml:311
295296msgid ""
296297"If passcode is entered incorrectly, your phone will conduct a factory reset "
297298"and all personal data will be deleted."
298299msgstr ""
300+"만약 이번 시도에서 잘못 입력하면, 보안을 위해 휴대 전화가 공장 초기화 과정을 거쳐 모든 사용자 데이터를 삭제할 것입니다."
po/lv.po+14−14
@@ -8,18 +8,18 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-12 19:07+0000\n"
11+"PO-Revision-Date: 2014-08-21 09:46+0000\n"
1212"Last-Translator: Jānis-Marks Gailis <jm-gailis@fai-vianet.fr>\n"
1313"Language-Team: Latvian <lv@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
17+"X-Launchpad-Export-Date: 2014-08-22 07:39+0000\n"
18+"X-Generator: Launchpad (build 17163)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:129
2121msgid "Password: "
22−msgstr ""
22+msgstr "Parole: "
2323
2424#: plugins/Unity/Launcher/launcheritem.cpp:43
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -32,7 +32,7 @@ msgstr ""
3232
3333#: qml/Components/Dialogs.qml:142
3434msgid "Are you sure you would like to turn power off?"
35−msgstr ""
35+msgstr "Vai esat drošs ka vēlaties izslēgt?"
3636
3737#: qml/Components/Dialogs.qml:144
3838msgid "Power off"
@@ -98,7 +98,7 @@ msgstr ""
9898
9999#: qml/Components/Lockscreen.qml:163
100100msgid "Please wait"
101−msgstr ""
101+msgstr "Lūdzu, uzgaidiet"
102102
103103#: qml/Components/Lockscreen.qml:245
104104msgid "Emergency Call"
@@ -167,7 +167,7 @@ msgstr "Pabeigts"
167167
168168#: qml/Dash/ScopesOverview.qml:434
169169msgid "Store"
170−msgstr ""
170+msgstr "Veikals"
171171
172172#: qml/Dash/ScopesOverviewTab.qml:36
173173msgid "Favorites"
@@ -219,7 +219,7 @@ msgstr "Konference"
219219
220220#: qml/Panel/Indicators/MenuItemFactory.qml:651
221221msgid "In queue…"
222−msgstr ""
222+msgstr "Sarakstā..."
223223
224224#: qml/Panel/Indicators/MenuItemFactory.qml:655
225225msgid "Downloading"
@@ -239,7 +239,7 @@ msgstr "Pabeigts"
239239
240240#: qml/Panel/Indicators/MenuItemFactory.qml:663
241241msgid "Failed, tap to retry"
242−msgstr ""
242+msgstr "Neizdevās, spiest lai mēģināt vēlreiz"
243243
244244#: qml/Panel/Indicators/ModemInfoItem.qml:105
245245msgid "Unlock SIM"
@@ -247,7 +247,7 @@ msgstr "Atbloķēt SIM"
247247
248248#: qml/Panel/Indicators/RoamingIndication.qml:27
249249msgid "Roaming"
250−msgstr ""
250+msgstr "Viesabonēšana"
251251
252252#: qml/Shell.qml:267
253253msgid "passphrase"
@@ -260,16 +260,16 @@ msgstr ""
260260#: qml/Shell.qml:269
261261#, qt-format
262262msgid "Enter your %1"
263−msgstr ""
263+msgstr "Ievadiet jūsu %1"
264264
265265#: qml/Shell.qml:270
266266#, qt-format
267267msgid "Incorrect %1"
268−msgstr ""
268+msgstr "Nepareizs %1"
269269
270270#: qml/Shell.qml:272
271271msgid "Please re-enter"
272−msgstr ""
272+msgstr "Lūdzu ievadiet vēlreiz"
273273
274274#: qml/Shell.qml:306
275275msgid "Sorry, incorrect passphrase."
@@ -281,7 +281,7 @@ msgstr ""
281281
282282#: qml/Shell.qml:308
283283msgid "This will be your last attempt."
284−msgstr ""
284+msgstr "Šīs būs jūs pēdējais mēģinājums."
285285
286286#: qml/Shell.qml:310
287287msgid ""
po/pl.po+20−20
@@ -8,13 +8,13 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-07-31 13:51+0000\n"
12−"Last-Translator: Michał Radwański <radwanski.michal@outlook.com>\n"
11+"PO-Revision-Date: 2014-08-18 20:25+0000\n"
12+"Last-Translator: Paweł Stroka <pawstr@gmail.com>\n"
1313"Language-Team: Polish <pl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-19 06:59+0000\n"
1818"X-Generator: Launchpad (build 17156)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:129
@@ -104,40 +104,40 @@ msgstr ""
104104msgid "Please wait"
105105msgstr ""
106106
107−#: qml/Components/Lockscreen.qml:245
107+#: qml/Components/Lockscreen.qml:220
108108msgid "Emergency Call"
109109msgstr "Telefon ratunkowy"
110110
111−#: qml/Components/Lockscreen.qml:268
111+#: qml/Components/Lockscreen.qml:243
112112msgid "OK"
113113msgstr "OK"
114114
115−#: qml/Components/PassphraseLockscreen.qml:61
115+#: qml/Components/PassphraseLockscreen.qml:62
116116#, qt-format
117117msgid "Hello %1"
118118msgstr "Witaj %1"
119119
120−#: qml/Components/PassphraseLockscreen.qml:61
120+#: qml/Components/PassphraseLockscreen.qml:62
121121msgid "Hello"
122122msgstr "Witaj"
123123
124−#: qml/Components/PinLockscreen.qml:197
124+#: qml/Components/PinLockscreen.qml:198
125125msgid "CANCEL"
126126msgstr "ANULUJ"
127127
128−#: qml/Components/PinLockscreen.qml:215
128+#: qml/Components/PinLockscreen.qml:216
129129msgid "DONE"
130130msgstr "ZROBIONE"
131131
132−#: qml/Dash/GenericScopeView.qml:360
132+#: qml/Dash/GenericScopeView.qml:358
133133msgid "See less"
134134msgstr "Zobacz mniej"
135135
136−#: qml/Dash/GenericScopeView.qml:360
136+#: qml/Dash/GenericScopeView.qml:358
137137msgid "See all"
138138msgstr "Zobacz wszystko"
139139
140−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
140+#: qml/Panel/SearchIndicator.qml:27
141141msgid "Search"
142142msgstr "Szukaj"
143143
@@ -161,15 +161,15 @@ msgstr "Dodaj recenzję"
161161msgid "Send"
162162msgstr "Wyślij"
163163
164−#: qml/Dash/ScopesOverview.qml:201
164+#: qml/Dash/ScopesOverview.qml:200
165165msgid "Manage Dash"
166166msgstr ""
167167
168−#: qml/Dash/ScopesOverview.qml:408
168+#: qml/Dash/ScopesOverview.qml:405
169169msgid "Done"
170170msgstr ""
171171
172−#: qml/Dash/ScopesOverview.qml:434
172+#: qml/Dash/ScopesOverview.qml:431
173173msgid "Store"
174174msgstr ""
175175
@@ -255,11 +255,11 @@ msgstr ""
255255
256256#: qml/Shell.qml:267
257257msgid "passphrase"
258−msgstr ""
258+msgstr "hasło"
259259
260260#: qml/Shell.qml:267
261261msgid "passcode"
262−msgstr ""
262+msgstr "kod"
263263
264264#: qml/Shell.qml:269
265265#, qt-format
@@ -273,15 +273,15 @@ msgstr ""
273273
274274#: qml/Shell.qml:272
275275msgid "Please re-enter"
276−msgstr ""
276+msgstr "Proszę wprowadzić ponownie"
277277
278278#: qml/Shell.qml:306
279279msgid "Sorry, incorrect passphrase."
280−msgstr ""
280+msgstr "Niestety, błędne hasło"
281281
282282#: qml/Shell.qml:307
283283msgid "Sorry, incorrect passcode."
284−msgstr ""
284+msgstr "Niestety, błędny kod"
285285
286286#: qml/Shell.qml:308
287287msgid "This will be your last attempt."
po/pt_BR.po+33−29
@@ -8,18 +8,18 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-13 04:53+0000\n"
12−"Last-Translator: Tiago Hillebrandt <tiagohillebrandt@gmail.com>\n"
11+"PO-Revision-Date: 2014-08-18 14:14+0000\n"
12+"Last-Translator: Rafael Neri <Unknown>\n"
1313"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-19 06:59+0000\n"
1818"X-Generator: Launchpad (build 17156)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:129
2121msgid "Password: "
22−msgstr ""
22+msgstr "Senha: "
2323
2424#: plugins/Unity/Launcher/launcheritem.cpp:43
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -98,46 +98,46 @@ msgstr ""
9898
9999#: qml/Components/Lockscreen.qml:161
100100msgid "Too many incorrect attempts"
101−msgstr ""
101+msgstr "Muitas tentativas incorretas"
102102
103103#: qml/Components/Lockscreen.qml:163
104104msgid "Please wait"
105−msgstr ""
105+msgstr "Por favor, aguarde"
106106
107−#: qml/Components/Lockscreen.qml:245
107+#: qml/Components/Lockscreen.qml:220
108108msgid "Emergency Call"
109109msgstr "Chamada de emergência"
110110
111−#: qml/Components/Lockscreen.qml:268
111+#: qml/Components/Lockscreen.qml:243
112112msgid "OK"
113113msgstr "OK"
114114
115−#: qml/Components/PassphraseLockscreen.qml:61
115+#: qml/Components/PassphraseLockscreen.qml:62
116116#, qt-format
117117msgid "Hello %1"
118118msgstr "Olá %1"
119119
120−#: qml/Components/PassphraseLockscreen.qml:61
120+#: qml/Components/PassphraseLockscreen.qml:62
121121msgid "Hello"
122122msgstr "Olá"
123123
124−#: qml/Components/PinLockscreen.qml:197
124+#: qml/Components/PinLockscreen.qml:198
125125msgid "CANCEL"
126126msgstr "CANCELAR"
127127
128−#: qml/Components/PinLockscreen.qml:215
128+#: qml/Components/PinLockscreen.qml:216
129129msgid "DONE"
130130msgstr "FEITO"
131131
132−#: qml/Dash/GenericScopeView.qml:360
132+#: qml/Dash/GenericScopeView.qml:358
133133msgid "See less"
134134msgstr "Ver menos"
135135
136−#: qml/Dash/GenericScopeView.qml:360
136+#: qml/Dash/GenericScopeView.qml:358
137137msgid "See all"
138138msgstr "Ver todos"
139139
140−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
140+#: qml/Panel/SearchIndicator.qml:27
141141msgid "Search"
142142msgstr "Pesquisar"
143143
@@ -161,15 +161,15 @@ msgstr "Adicionar uma análise"
161161msgid "Send"
162162msgstr "Enviar"
163163
164−#: qml/Dash/ScopesOverview.qml:201
164+#: qml/Dash/ScopesOverview.qml:200
165165msgid "Manage Dash"
166−msgstr ""
166+msgstr "Gerencia painel"
167167
168−#: qml/Dash/ScopesOverview.qml:408
168+#: qml/Dash/ScopesOverview.qml:405
169169msgid "Done"
170−msgstr ""
170+msgstr "Concluído"
171171
172−#: qml/Dash/ScopesOverview.qml:434
172+#: qml/Dash/ScopesOverview.qml:431
173173msgid "Store"
174174msgstr "Loja"
175175
@@ -179,7 +179,7 @@ msgstr "Favoritos"
179179
180180#: qml/Dash/ScopesOverviewTab.qml:54
181181msgid "All"
182−msgstr ""
182+msgstr "Tudo"
183183
184184#: qml/Greeter/Greeter.qml:157
185185msgid "Swipe to unlock"
@@ -255,46 +255,50 @@ msgstr "Roaming"
255255
256256#: qml/Shell.qml:267
257257msgid "passphrase"
258−msgstr ""
258+msgstr "senha"
259259
260260#: qml/Shell.qml:267
261261msgid "passcode"
262−msgstr ""
262+msgstr "código de acesso"
263263
264264#: qml/Shell.qml:269
265265#, qt-format
266266msgid "Enter your %1"
267−msgstr ""
267+msgstr "Digite o seu %1"
268268
269269#: qml/Shell.qml:270
270270#, qt-format
271271msgid "Incorrect %1"
272−msgstr ""
272+msgstr "%1 incorreto"
273273
274274#: qml/Shell.qml:272
275275msgid "Please re-enter"
276−msgstr ""
276+msgstr "Por favor, digite novamente"
277277
278278#: qml/Shell.qml:306
279279msgid "Sorry, incorrect passphrase."
280−msgstr ""
280+msgstr "Desculpe, senha incorreta."
281281
282282#: qml/Shell.qml:307
283283msgid "Sorry, incorrect passcode."
284−msgstr ""
284+msgstr "Desculpe, código de acesso incorreto."
285285
286286#: qml/Shell.qml:308
287287msgid "This will be your last attempt."
288−msgstr ""
288+msgstr "Esta será a sua última tentativa."
289289
290290#: qml/Shell.qml:310
291291msgid ""
292292"If passphrase is entered incorrectly, your phone will conduct a factory "
293293"reset and all personal data will be deleted."
294294msgstr ""
295+"Se a senha for digitada incorretamente, o telefone será restaurado aos "
296+"padrões de fábrica e todos os dados pessoais serão apagados."
295297
296298#: qml/Shell.qml:311
297299msgid ""
298300"If passcode is entered incorrectly, your phone will conduct a factory reset "
299301"and all personal data will be deleted."
300302msgstr ""
303+"Se o código de acesso for digitado incorretamente, o telefone será "
304+"restaurado aos padrões de fábrica e todos os dados pessoais serão apagados."
po/ru.po+39−35
@@ -8,18 +8,18 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-07-31 09:39+0000\n"
11+"PO-Revision-Date: 2014-08-20 12:41+0000\n"
1212"Last-Translator: Jay ZDLin <Unknown>\n"
1313"Language-Team: Russian <ru@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
17+"X-Launchpad-Export-Date: 2014-08-21 06:48+0000\n"
18+"X-Generator: Launchpad (build 17163)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:129
2121msgid "Password: "
22−msgstr ""
22+msgstr "Пароль: "
2323
2424#: plugins/Unity/Launcher/launcheritem.cpp:43
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -32,19 +32,19 @@ msgstr "Изъять ярлык"
3232
3333#: qml/Components/Dialogs.qml:142
3434msgid "Are you sure you would like to turn power off?"
35−msgstr ""
35+msgstr "Отключить питание?"
3636
3737#: qml/Components/Dialogs.qml:144
3838msgid "Power off"
39−msgstr ""
39+msgstr "Отключить"
4040
4141#: qml/Components/Dialogs.qml:153
4242msgid "Restart"
43−msgstr ""
43+msgstr "Перезапустить"
4444
4545#: qml/Components/Dialogs.qml:162
4646msgid "Cancel"
47−msgstr ""
47+msgstr "Отменить"
4848
4949#: qml/Components/EdgeDemoOverlay.qml:151
5050msgid "Skip intro"
@@ -101,46 +101,46 @@ msgstr ""
101101
102102#: qml/Components/Lockscreen.qml:161
103103msgid "Too many incorrect attempts"
104−msgstr ""
104+msgstr "Слишком много ошибок ввода"
105105
106106#: qml/Components/Lockscreen.qml:163
107107msgid "Please wait"
108−msgstr ""
108+msgstr "Подождите"
109109
110−#: qml/Components/Lockscreen.qml:245
110+#: qml/Components/Lockscreen.qml:220
111111msgid "Emergency Call"
112112msgstr "Экстренный вызов"
113113
114−#: qml/Components/Lockscreen.qml:268
114+#: qml/Components/Lockscreen.qml:243
115115msgid "OK"
116116msgstr "ОК"
117117
118−#: qml/Components/PassphraseLockscreen.qml:61
118+#: qml/Components/PassphraseLockscreen.qml:62
119119#, qt-format
120120msgid "Hello %1"
121121msgstr "Привет, %1"
122122
123−#: qml/Components/PassphraseLockscreen.qml:61
123+#: qml/Components/PassphraseLockscreen.qml:62
124124msgid "Hello"
125125msgstr "Привет"
126126
127−#: qml/Components/PinLockscreen.qml:197
127+#: qml/Components/PinLockscreen.qml:198
128128msgid "CANCEL"
129129msgstr "ОТМЕНИТЬ"
130130
131−#: qml/Components/PinLockscreen.qml:215
131+#: qml/Components/PinLockscreen.qml:216
132132msgid "DONE"
133133msgstr "ГОТОВО"
134134
135−#: qml/Dash/GenericScopeView.qml:360
135+#: qml/Dash/GenericScopeView.qml:358
136136msgid "See less"
137137msgstr "Вкратце"
138138
139−#: qml/Dash/GenericScopeView.qml:360
139+#: qml/Dash/GenericScopeView.qml:358
140140msgid "See all"
141141msgstr "Показать всё"
142142
143−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
143+#: qml/Panel/SearchIndicator.qml:27
144144msgid "Search"
145145msgstr "Поиск"
146146
@@ -164,25 +164,25 @@ msgstr "Добавьте отзыв"
164164msgid "Send"
165165msgstr "Отправить"
166166
167−#: qml/Dash/ScopesOverview.qml:201
167+#: qml/Dash/ScopesOverview.qml:200
168168msgid "Manage Dash"
169169msgstr ""
170170
171−#: qml/Dash/ScopesOverview.qml:408
171+#: qml/Dash/ScopesOverview.qml:405
172172msgid "Done"
173−msgstr ""
173+msgstr "Готово"
174174
175−#: qml/Dash/ScopesOverview.qml:434
175+#: qml/Dash/ScopesOverview.qml:431
176176msgid "Store"
177177msgstr ""
178178
179179#: qml/Dash/ScopesOverviewTab.qml:36
180180msgid "Favorites"
181−msgstr ""
181+msgstr "Избранное"
182182
183183#: qml/Dash/ScopesOverviewTab.qml:54
184184msgid "All"
185−msgstr ""
185+msgstr "Все"
186186
187187#: qml/Greeter/Greeter.qml:157
188188msgid "Swipe to unlock"
@@ -250,54 +250,58 @@ msgstr "Сбой, коснитесь для повтора"
250250
251251#: qml/Panel/Indicators/ModemInfoItem.qml:105
252252msgid "Unlock SIM"
253−msgstr ""
253+msgstr "Разблокировать SIM-карту"
254254
255255#: qml/Panel/Indicators/RoamingIndication.qml:27
256256msgid "Roaming"
257−msgstr ""
257+msgstr "Роуминг"
258258
259259#: qml/Shell.qml:267
260260msgid "passphrase"
261−msgstr ""
261+msgstr "ключевая фраза"
262262
263263#: qml/Shell.qml:267
264264msgid "passcode"
265−msgstr ""
265+msgstr "секретный код"
266266
267267#: qml/Shell.qml:269
268268#, qt-format
269269msgid "Enter your %1"
270−msgstr ""
270+msgstr "Введите %1"
271271
272272#: qml/Shell.qml:270
273273#, qt-format
274274msgid "Incorrect %1"
275−msgstr ""
275+msgstr "Некорректно введён %1"
276276
277277#: qml/Shell.qml:272
278278msgid "Please re-enter"
279−msgstr ""
279+msgstr "Повторите ввод"
280280
281281#: qml/Shell.qml:306
282282msgid "Sorry, incorrect passphrase."
283−msgstr ""
283+msgstr "Неверная ключевая фраза."
284284
285285#: qml/Shell.qml:307
286286msgid "Sorry, incorrect passcode."
287−msgstr ""
287+msgstr "Неверный секретный код."
288288
289289#: qml/Shell.qml:308
290290msgid "This will be your last attempt."
291−msgstr ""
291+msgstr "Осталась последняя попытка."
292292
293293#: qml/Shell.qml:310
294294msgid ""
295295"If passphrase is entered incorrectly, your phone will conduct a factory "
296296"reset and all personal data will be deleted."
297297msgstr ""
298+"Если ключевая фраза будет введена неверно, то телефон вернётся к заводским "
299+"настройкам, а все личные данные будут удалены."
298300
299301#: qml/Shell.qml:311
300302msgid ""
301303"If passcode is entered incorrectly, your phone will conduct a factory reset "
302304"and all personal data will be deleted."
303305msgstr ""
306+"Если секретный код будет введен неверно, то телефон вернётся к заводским "
307+"настройкам, а все личные данные будут удалены."
po/sl.po+41−37
@@ -8,18 +8,18 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-06 06:11+0000\n"
11+"PO-Revision-Date: 2014-08-19 12:54+0000\n"
1212"Last-Translator: Damir Jerovšek <Unknown>\n"
1313"Language-Team: Slovenian <sl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
17+"X-Launchpad-Export-Date: 2014-08-20 06:23+0000\n"
18+"X-Generator: Launchpad (build 17163)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:129
2121msgid "Password: "
22−msgstr ""
22+msgstr "Geslo: "
2323
2424#: plugins/Unity/Launcher/launcheritem.cpp:43
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -32,19 +32,19 @@ msgstr "Odpni bližnjico"
3232
3333#: qml/Components/Dialogs.qml:142
3434msgid "Are you sure you would like to turn power off?"
35−msgstr ""
35+msgstr "Ali ste prepričani, da želite izklopiti?"
3636
3737#: qml/Components/Dialogs.qml:144
3838msgid "Power off"
39−msgstr ""
39+msgstr "Izklopi"
4040
4141#: qml/Components/Dialogs.qml:153
4242msgid "Restart"
43−msgstr ""
43+msgstr "Ponovno zaženi"
4444
4545#: qml/Components/Dialogs.qml:162
4646msgid "Cancel"
47−msgstr ""
47+msgstr "Prekliči"
4848
4949#: qml/Components/EdgeDemoOverlay.qml:151
5050msgid "Skip intro"
@@ -98,46 +98,46 @@ msgstr ""
9898
9999#: qml/Components/Lockscreen.qml:161
100100msgid "Too many incorrect attempts"
101−msgstr ""
101+msgstr "Preveč nepravilnih poskusov"
102102
103103#: qml/Components/Lockscreen.qml:163
104104msgid "Please wait"
105−msgstr ""
105+msgstr "Počakajte"
106106
107−#: qml/Components/Lockscreen.qml:245
107+#: qml/Components/Lockscreen.qml:220
108108msgid "Emergency Call"
109109msgstr "Klic v sili"
110110
111−#: qml/Components/Lockscreen.qml:268
111+#: qml/Components/Lockscreen.qml:243
112112msgid "OK"
113113msgstr "V REDU"
114114
115−#: qml/Components/PassphraseLockscreen.qml:61
115+#: qml/Components/PassphraseLockscreen.qml:62
116116#, qt-format
117117msgid "Hello %1"
118118msgstr "Pozdravljeni, %1"
119119
120−#: qml/Components/PassphraseLockscreen.qml:61
120+#: qml/Components/PassphraseLockscreen.qml:62
121121msgid "Hello"
122122msgstr "Pozdravljeni"
123123
124−#: qml/Components/PinLockscreen.qml:197
124+#: qml/Components/PinLockscreen.qml:198
125125msgid "CANCEL"
126126msgstr "PREKLIČI"
127127
128−#: qml/Components/PinLockscreen.qml:215
128+#: qml/Components/PinLockscreen.qml:216
129129msgid "DONE"
130130msgstr "KONČANO"
131131
132−#: qml/Dash/GenericScopeView.qml:360
132+#: qml/Dash/GenericScopeView.qml:358
133133msgid "See less"
134134msgstr "Pokaži manj"
135135
136−#: qml/Dash/GenericScopeView.qml:360
136+#: qml/Dash/GenericScopeView.qml:358
137137msgid "See all"
138138msgstr "Ogled vsega"
139139
140−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
140+#: qml/Panel/SearchIndicator.qml:27
141141msgid "Search"
142142msgstr "Iskanje"
143143
@@ -161,25 +161,25 @@ msgstr "Dodaj oceno"
161161msgid "Send"
162162msgstr "Pošlji"
163163
164−#: qml/Dash/ScopesOverview.qml:201
164+#: qml/Dash/ScopesOverview.qml:200
165165msgid "Manage Dash"
166−msgstr ""
166+msgstr "Upravljaj s pregledno ploščo"
167167
168−#: qml/Dash/ScopesOverview.qml:408
168+#: qml/Dash/ScopesOverview.qml:405
169169msgid "Done"
170−msgstr ""
170+msgstr "Končano"
171171
172−#: qml/Dash/ScopesOverview.qml:434
172+#: qml/Dash/ScopesOverview.qml:431
173173msgid "Store"
174−msgstr ""
174+msgstr "Trgovina"
175175
176176#: qml/Dash/ScopesOverviewTab.qml:36
177177msgid "Favorites"
178−msgstr ""
178+msgstr "Priljubljeni"
179179
180180#: qml/Dash/ScopesOverviewTab.qml:54
181181msgid "All"
182−msgstr ""
182+msgstr "Vse"
183183
184184#: qml/Greeter/Greeter.qml:157
185185msgid "Swipe to unlock"
@@ -247,54 +247,58 @@ msgstr "Spodletelo, tapnite za ponovni poskus"
247247
248248#: qml/Panel/Indicators/ModemInfoItem.qml:105
249249msgid "Unlock SIM"
250−msgstr ""
250+msgstr "Odkleni SIM"
251251
252252#: qml/Panel/Indicators/RoamingIndication.qml:27
253253msgid "Roaming"
254−msgstr ""
254+msgstr "Gostovanje"
255255
256256#: qml/Shell.qml:267
257257msgid "passphrase"
258−msgstr ""
258+msgstr "šifrirno reklo"
259259
260260#: qml/Shell.qml:267
261261msgid "passcode"
262−msgstr ""
262+msgstr "geslo"
263263
264264#: qml/Shell.qml:269
265265#, qt-format
266266msgid "Enter your %1"
267−msgstr ""
267+msgstr "Vnesite vaš %1"
268268
269269#: qml/Shell.qml:270
270270#, qt-format
271271msgid "Incorrect %1"
272−msgstr ""
272+msgstr "Nepravilen %1"
273273
274274#: qml/Shell.qml:272
275275msgid "Please re-enter"
276−msgstr ""
276+msgstr "Ponovno vnesite"
277277
278278#: qml/Shell.qml:306
279279msgid "Sorry, incorrect passphrase."
280−msgstr ""
280+msgstr "Nepravilno geslo."
281281
282282#: qml/Shell.qml:307
283283msgid "Sorry, incorrect passcode."
284−msgstr ""
284+msgstr "Nepravilno geslo."
285285
286286#: qml/Shell.qml:308
287287msgid "This will be your last attempt."
288−msgstr ""
288+msgstr "To je vaš zadnji poskus"
289289
290290#: qml/Shell.qml:310
291291msgid ""
292292"If passphrase is entered incorrectly, your phone will conduct a factory "
293293"reset and all personal data will be deleted."
294294msgstr ""
295+"Če je vneseno nepravilno šifrirno reklo, bo telefon ponastavljen na "
296+"tovarniške nastavitve ter vsi osebni podatki bodo izbrisani."
295297
296298#: qml/Shell.qml:311
297299msgid ""
298300"If passcode is entered incorrectly, your phone will conduct a factory reset "
299301"and all personal data will be deleted."
300302msgstr ""
303+"Če je vneseno nepravilno geslo, bo telefon ponastavljen na tovarniške "
304+"nastavitve ter vsi osebni podatki bodo izbrisani."
po/unity8.pot+31−35
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11+"POT-Creation-Date: 2014-08-21 11:36+0200\n"
1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -92,19 +92,19 @@ msgid ""
9292"phone<br><br>Tap on the screen to start"
9393msgstr ""
9494
95−#: qml/Components/Lockscreen.qml:161
96−msgid "Too many incorrect attempts"
95+#: qml/Components/Lockscreen.qml:167
96+msgid "Please wait"
9797msgstr ""
9898
99−#: qml/Components/Lockscreen.qml:163
100−msgid "Please wait"
99+#: qml/Components/Lockscreen.qml:172
100+msgid "Too many incorrect attempts"
101101msgstr ""
102102
103−#: qml/Components/Lockscreen.qml:245
103+#: qml/Components/Lockscreen.qml:206
104104msgid "Emergency Call"
105105msgstr ""
106106
107−#: qml/Components/Lockscreen.qml:268
107+#: qml/Components/Lockscreen.qml:226
108108msgid "OK"
109109msgstr ""
110110
@@ -117,23 +117,15 @@ msgstr ""
117117msgid "Hello"
118118msgstr ""
119119
120−#: qml/Components/PinLockscreen.qml:197
121−msgid "CANCEL"
122−msgstr ""
123−
124−#: qml/Components/PinLockscreen.qml:215
125−msgid "DONE"
126−msgstr ""
127−
128−#: qml/Dash/GenericScopeView.qml:360
120+#: qml/Dash/GenericScopeView.qml:361
129121msgid "See less"
130122msgstr ""
131123
132−#: qml/Dash/GenericScopeView.qml:360
124+#: qml/Dash/GenericScopeView.qml:361
133125msgid "See all"
134126msgstr ""
135127
136−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
128+#: qml/Dash/GenericScopeView.qml:424 qml/Panel/SearchIndicator.qml:27
137129msgid "Search"
138130msgstr ""
139131
@@ -201,12 +193,16 @@ msgstr ""
201193msgid "Speaking..."
202194msgstr ""
203195
204−#: qml/Notifications/NotificationMenuItemFactory.qml:100
196+#: qml/Notifications/NotificationMenuItemFactory.qml:105
205197msgid "Show password"
206198msgstr ""
207199
208−#: qml/Notifications/NotificationMenuItemFactory.qml:115
209−msgid "Please enter SIM PIN"
200+#: qml/Notifications/NotificationMenuItemFactory.qml:120
201+msgid "Enter SIM PIN"
202+msgstr ""
203+
204+#: qml/Notifications/NotificationMenuItemFactory.qml:121 qml/Shell.qml:270
205+msgid "Sorry, incorrect PIN"
210206msgstr ""
211207
212208#: qml/Panel/ActiveCallHint.qml:77
@@ -249,47 +245,47 @@ msgstr ""
249245msgid "Roaming"
250246msgstr ""
251247
252−#: qml/Shell.qml:267
253−msgid "passphrase"
248+#: qml/Shell.qml:266
249+msgid "Enter your passphrase"
254250msgstr ""
255251
256252#: qml/Shell.qml:267
257−msgid "passcode"
253+msgid "Sorry, incorrect passphrase"
258254msgstr ""
259255
260256#: qml/Shell.qml:269
261−#, qt-format
262−msgid "Enter your %1"
257+msgid "Enter your PIN"
263258msgstr ""
264259
265−#: qml/Shell.qml:270
260+#: qml/Shell.qml:273
266261#, qt-format
267−msgid "Incorrect %1"
262+msgid "Enter your %1"
268263msgstr ""
269264
270−#: qml/Shell.qml:272
271−msgid "Please re-enter"
265+#: qml/Shell.qml:274
266+#, qt-format
267+msgid "Sorry, incorrect %1"
272268msgstr ""
273269
274−#: qml/Shell.qml:306
270+#: qml/Shell.qml:310
275271msgid "Sorry, incorrect passphrase."
276272msgstr ""
277273
278−#: qml/Shell.qml:307
274+#: qml/Shell.qml:311
279275msgid "Sorry, incorrect passcode."
280276msgstr ""
281277
282−#: qml/Shell.qml:308
278+#: qml/Shell.qml:312
283279msgid "This will be your last attempt."
284280msgstr ""
285281
286−#: qml/Shell.qml:310
282+#: qml/Shell.qml:314
287283msgid ""
288284"If passphrase is entered incorrectly, your phone will conduct a factory "
289285"reset and all personal data will be deleted."
290286msgstr ""
291287
292−#: qml/Shell.qml:311
288+#: qml/Shell.qml:315
293289msgid ""
294290"If passcode is entered incorrectly, your phone will conduct a factory reset "
295291"and all personal data will be deleted."
qml/Components/Lockscreen.qml+33−75
@@ -24,15 +24,14 @@ Showable {
2424 // Determine if a numeric or alphanumeric pad is used.
2525 property bool alphaNumeric: false
2626
27− // Placeholder text
28− property string placeholderText: ""
29− // Placeholder text while shaking (e.g. Incorrect passprase)
30− property string wrongPlaceholderText: ""
27+ // Informational text. (e.g. some text to tell which domain this is pin is entered for)
28+ property string infoText: ""
29+
3130 // Retries text (e.g. 3 retries left)
3231 property string retryText: ""
3332
34− // Informational text. (e.g. some text to tell which domain this is pin is entered for.
35− property string infoText: ""
33+ // The text to be displayed in case the login failed
34+ property string errorText: ""
3635
3736 // In case the Lockscreen can show a greeter message, this is the username
3837 property string username: ""
@@ -110,41 +109,6 @@ Showable {
110109 anchors.fill: root
111110 }
112111
113− Column {
114− spacing: units.gu(2)
115− anchors {
116− left: parent.left
117− right: parent.right
118− bottom: pinPadLoader.top
119− bottomMargin: units.gu(2)
120− }
121− Label {
122− objectName: "retryCountLabel"
123− anchors {
124− left: parent.left
125− right: parent.right
126− }
127− text: root.retryText
128− horizontalAlignment: Text.AlignHCenter
129− color: "#f3f3e7"
130− opacity: 0.6
131− visible: root.retryText.length > 0
132− }
133− Label {
134− id: infoTextLabel
135− objectName: "infoTextLabel"
136− anchors {
137− left: parent.left
138− right: parent.right
139− }
140− text: root.infoText
141− horizontalAlignment: Text.AlignHCenter
142− color: "#f3f3e7"
143− opacity: 0.6
144− visible: root.infoText.length > 0
145− }
146− }
147−
148112 Loader {
149113 id: pinPadLoader
150114 objectName: "pinPadLoader"
@@ -152,21 +116,22 @@ Showable {
152116 left: parent.left
153117 right: parent.right
154118 verticalCenter: parent.verticalCenter
155− verticalCenterOffset: root.alphaNumeric ? -units.gu(10) : -units.gu(4)
119+ verticalCenterOffset: root.alphaNumeric ? -units.gu(10) : 0
156120 }
157121 property bool resetting: false
158122 property bool waiting: false
159123 property bool showWrongText: false
160124
161− readonly property string forcedDelayText: i18n.tr("Too many incorrect attempts") +
162− "\n" +
163− i18n.tr("Please wait")
164−
165125 source: (!resetting && root.required) ? (root.alphaNumeric ? "PassphraseLockscreen.qml" : "PinLockscreen.qml") : ""
166126 onSourceChanged: {
167127 waiting = false
168128 showWrongText = false
169129 }
130+ onLoaded: {
131+ if (forcedDelayTimer.running) {
132+ pinPadLoader.item.clear(true)
133+ }
134+ }
170135
171136 Connections {
172137 target: pinPadLoader.item
@@ -193,10 +158,19 @@ Showable {
193158 }
194159 Binding {
195160 target: pinPadLoader.item
196− property: "placeholderText"
197− value: forcedDelayTimer.running ? pinPadLoader.forcedDelayText :
198− (pinPadLoader.showWrongText ? root.wrongPlaceholderText :
199− root.placeholderText)
161+ property: "infoText"
162+ value: root.infoText
163+ }
164+ Binding {
165+ target: pinPadLoader.item
166+ property: "retryText"
167+ value: forcedDelayTimer.running ? i18n.tr("Please wait") : root.retryText
168+ }
169+ Binding {
170+ target: pinPadLoader.item
171+ property: "errorText"
172+ value: forcedDelayTimer.running ? i18n.tr("Too many incorrect attempts") :
173+ (pinPadLoader.showWrongText ? root.errorText : "")
200174 }
201175 Binding {
202176 target: pinPadLoader.item
@@ -210,8 +184,9 @@ Showable {
210184 }
211185 }
212186
213− Column {
214− id: emergencyCallColumn
187+ Label {
188+ id: emergencyCallLabel
189+ objectName: "emergencyCallLabel"
215190
216191 // FIXME: We *should* show emergency dialer if there is a SIM present,
217192 // regardless of whether the side stage is enabled. But right now,
@@ -223,37 +198,20 @@ Showable {
223198 visible: !shell.sideStageEnabled
224199
225200 anchors {
226− left: parent.left
227201 bottom: parent.bottom
228202 bottomMargin: units.gu(4)
229− right: parent.right
230− }
231− height: childrenRect.height
232− spacing: units.gu(1)
233−
234− Icon {
235− objectName: "emergencyCallIcon"
236− height: units.gu(3)
237− width: height
238− anchors.horizontalCenter: parent.horizontalCenter
239− name: "phone-app-call-symbolic"
240− color: "#f3f3e7"
241− opacity: 0.6
203+ horizontalCenter: parent.horizontalCenter
242204 }
243205
244− Label {
245− text: i18n.tr("Emergency Call")
246− color: "#f3f3e7"
247− opacity: 0.6
248− fontSize: "medium"
249− anchors.horizontalCenter: parent.horizontalCenter
250− }
206+ text: i18n.tr("Emergency Call")
207+ color: "#f3f3e7"
208+ opacity: 0.6
251209 }
252210
253211 MouseArea {
254− anchors.fill: emergencyCallColumn
212+ anchors.fill: emergencyCallLabel
255213 onClicked: root.emergencyCall()
256− enabled: emergencyCallColumn.visible
214+ enabled: emergencyCallLabel.visible
257215 }
258216
259217 Component {
qml/Components/PassphraseLockscreen.qml+3−3
@@ -22,7 +22,7 @@ Item {
2222 id: root
2323 height: highlightItem.height
2424
25− property string placeholderText
25+ property string infoText
2626 property string username: ""
2727 property bool entryEnabled: true
2828
@@ -75,8 +75,8 @@ Item {
7575 echoMode: TextInput.Password
7676 opacity: 0.9
7777 hasClearButton: false
78− enabled: entryEnabled
79− placeholderText: root.placeholderText
78+ enabled: root.entryEnabled
79+ placeholderText: root.infoText
8080
8181 onAccepted: {
8282 if (pinentryField.text) {
qml/Components/PinLockscreen.qml+151−163
@@ -22,9 +22,11 @@ import "../Components"
2222Column {
2323 id: root
2424 anchors.centerIn: parent
25− spacing: units.gu(3.5)
25+ spacing: units.gu(2)
2626
27− property alias placeholderText: pinentryField.placeholderText
27+ property string infoText
28+ property string retryText
29+ property string errorText
2830 property int padWidth: units.gu(34)
2931 property int padHeight: units.gu(28)
3032 property int minPinLength: -1
@@ -35,199 +37,185 @@ Column {
3537
3638 property bool entryEnabled: true
3739
38− function clear(playAnimation) {
40+ function clear(showAnimation) {
3941 pinentryField.text = "";
40− if (playAnimation) {
42+ if (showAnimation) {
43+ pinentryField.incorrectOverride = true;
4144 wrongPasswordAnimation.start();
4245 }
4346 }
4447
45− QtObject {
46− id: priv
47− property bool autoConfirm: root.minPinLength == root.maxPinLength && root.minPinLength != -1
48− }
49−
50− UbuntuShape {
51− id: pinentryField
52− objectName: "pinentryField"
48+ Column {
49+ id: shakeContainer
5350 anchors.horizontalCenter: parent.horizontalCenter
54− color: "#55000000"
55− width:root.padWidth
56− height: units.gu(5)
57− radius: "medium"
58− property string text: ""
59− property string placeholderText: ""
60−
61− function appendChar(character) {
62− if (root.maxPinLength == -1 || pinentryField.text.length < root.maxPinLength) {
63− pinentryField.text = pinentryField.text + character;
64− }
65− }
66−
67− onTextChanged: {
68− pinentryFieldLabel.text = "";
69− for (var i = 0; i < text.length; ++i) {
70− pinentryFieldLabel.text += "•";
71− }
72− if (priv.autoConfirm && text.length === root.maxPinLength) {
73− root.entered(text);
74− }
75− }
51+ width: parent.width
52+ spacing: units.gu(2)
7653
7754 Label {
78− id: pinentryFieldLabel
79− anchors.centerIn: parent
80− width: parent.width - (backspaceIcon.width + backspaceIcon.anchors.rightMargin) * 2
81− elide: Text.ElideMiddle
82− horizontalAlignment: Text.AlignHCenter
83− font.pixelSize: units.dp(44)
55+ id: infoField
56+ objectName: "infoTextLabel"
57+ fontSize: "large"
8458 color: "#f3f3e7"
85− opacity: 0.6
86− }
87− Label {
88− id: pinentryFieldPlaceHolder
89− objectName: "pinentryFieldPlaceHolder"
90− anchors.centerIn: parent
91− horizontalAlignment: Text.AlignHCenter
92− color: "#f3f3e7"
93− opacity: 0.6
94− text: parent.placeholderText
95− visible: pinentryFieldLabel.text.length == 0
59+ anchors.horizontalCenter: parent.horizontalCenter
60+ text: root.infoText
9661 }
9762
98− Icon {
99− id: backspaceIcon
100− objectName: "backspaceIcon"
101− anchors {
102− top: parent.top
103− topMargin: units.gu(1)
104− right: parent.right
105− rightMargin: units.gu(2)
106− bottom: parent.bottom
107− bottomMargin: units.gu(1)
108− }
109− visible: entryEnabled && !priv.autoConfirm
110− width: height
111− name: "erase"
112− color: "#f3f3e7"
113− opacity: 0.6
114− MouseArea {
115− anchors.fill: parent
116− onClicked: pinentryField.text = pinentryField.text.substring(0, pinentryField.text.length-1);
117− }
118− }
119− }
63+ Item {
64+ id: pinContainer
65+ anchors { left: parent.left; right: parent.right; margins: units.gu(2) }
66+ height: units.gu(4)
67+
68+ Row {
69+ id: pinentryField
70+ objectName: "pinentryField"
71+ anchors.horizontalCenter: parent.horizontalCenter
72+ anchors.verticalCenter: parent.verticalCenter
73+ spacing: Math.max(0, Math.min(units.gu(3), (parent.width / root.maxPinLength) - units.gu(3)))
74+
75+ property string text
76+ property bool incorrectOverride: false
77+
78+ Repeater {
79+ model: pinentryField.text.length
80+ delegate: Rectangle {
81+ color: "#f3f3e7"
82+ width: Math.min(units.gu(2), (pinContainer.width - pinContainer.height*2 ) / (root.maxPinLength >= 0 ? root.maxPinLength : 16))
83+ height: width
84+ radius: width / 2
85+ }
86+ }
12087
121− UbuntuShape {
122− anchors {
123− left: parent.left
124− right: parent.right
125− margins: (parent.width - root.padWidth) / 2
126− }
127− height: root.padHeight
128− color: "#55000000"
129− radius: "medium"
130−
131− ThinDivider {
132− anchors {
133− left: parent.left
134− right: parent.right
135− top: parent.top
136− topMargin: root.padHeight / 4
137− }
138− }
139− ThinDivider {
140− anchors {
141− left: parent.left
142− right: parent.right
143− verticalCenter: parent.verticalCenter
144− }
145− }
146− ThinDivider {
147− anchors {
148− left: parent.left
149− right: parent.right
150− bottom: parent.bottom
151− bottomMargin: root.padHeight / 4
152− }
153− }
88+ function appendNumber(number) {
89+ if (incorrectOverride) {
90+ incorrectOverride = false;
91+ }
15492
155− ThinDivider {
156− anchors.centerIn: parent
157− anchors.horizontalCenterOffset: -root.padWidth / 6
158− width: root.padHeight
159− rotation: -90
160− }
161− ThinDivider {
162− anchors.centerIn: parent
163− anchors.horizontalCenterOffset: root.padWidth / 6
164− width: root.padHeight
165− rotation: -90
166− }
93+ pinentryField.text = pinentryField.text + number
94+
95+ if (root.minPinLength > 0 && root.maxPinLength > 0
96+ && root.minPinLength == root.maxPinLength && pinentryField.text.length == root.minPinLength) {
97+ root.entered(pinentryField.text)
98+ }
99+ }
167100
168− Grid {
169− anchors {
170− left: parent.left
171− right: parent.right
172− margins: (parent.width - root.padWidth) / 2
101+ function backspace() {
102+ pinentryField.text = pinentryField.text.substring(0, pinentryField.text.length-1)
103+ }
104+ }
105+ Label {
106+ id: wrongNoticeLabel
107+ objectName: "wrongNoticeLabel"
108+ fontSize: "x-large"
109+ color: "#f3f3e7"
110+ anchors.horizontalCenter: parent.horizontalCenter
111+ text: root.errorText
112+ visible: pinentryField.incorrectOverride
173113 }
174114
175− columns: 3
115+ AbstractButton {
116+ objectName: "backspaceIcon"
117+ anchors { right: parent.right; top: parent.top; bottom: parent.bottom }
118+ width: height
176119
177− Repeater {
178− model: 9
120+ Icon {
121+ anchors.fill: parent
122+ name: "erase"
123+ color: "#f3f3e7"
124+ }
179125
180− PinPadButton {
181− objectName: "pinPadButton" + (index + 1)
182− width: root.padWidth / 3
183− height: root.padHeight / 4
184− text: index + 1
185− enabled: entryEnabled
126+ opacity: (pinentryField.text.length && !pinentryField.incorrectOverride) > 0 ? 1 : 0
186127
187− onClicked: {
188− pinentryField.appendChar(text);
189− }
128+ Behavior on opacity {
129+ UbuntuNumberAnimation {}
190130 }
191− }
192131
193− PinPadButton {
194− objectName: "pinPadButtonBack"
195− width: root.padWidth / 3
196− height: root.padHeight / 4
197− subText: i18n.tr("CANCEL")
198− onClicked: root.cancel();
132+ onClicked: pinentryField.backspace()
199133 }
134+ }
200135
201− PinPadButton {
202− objectName: "pinPadButton0"
203− width: root.padWidth / 3
204− height: root.padHeight / 4
205− text: "0"
206− onClicked: pinentryField.appendChar(text);
207− enabled: entryEnabled
208− }
136+ Label {
137+ objectName: "retryLabel"
138+ fontSize: "x-small"
139+ color: "#f3f3e7"
140+ anchors.horizontalCenter: parent.horizontalCenter
141+ text: root.retryText || " "
142+ }
143+ }
144+
145+ ThinDivider {
146+ anchors { left: parent.left; right: parent.right; margins: units.gu(2) }
147+ }
148+
149+ Grid {
150+ id: numbersGrid
151+ anchors { horizontalCenter: parent.horizontalCenter }
152+ columns: 3
153+
154+ property int buttonHeight: units.gu(8)
155+ property int buttonWidth: units.gu(12)
156+
157+ Repeater {
158+ model: 9
209159
210160 PinPadButton {
211− objectName: "pinPadButtonErase"
212− width: root.padWidth / 3
213− height: root.padHeight / 4
214− iconName: priv.autoConfirm ? "erase" : ""
215− subText: priv.autoConfirm ? "" : i18n.tr("DONE")
161+ objectName: "pinPadButton" + text
162+ text: index + 1
163+ height: numbersGrid.buttonHeight
164+ width: numbersGrid.buttonWidth
165+ enabled: root.entryEnabled && (root.maxPinLength == -1 ||
166+ pinentryField.text.length < root.maxPinLength ||
167+ pinentryField.incorrectOverride)
168+
216169 onClicked: {
217− if (priv.autoConfirm) {
218− pinentryField.text = pinentryField.text.substring(0, pinentryField.text.length-1);
219− } else {
220− root.entered(pinentryField.text);
221− }
170+ pinentryField.appendNumber(index + 1)
222171 }
223− enabled: priv.autoConfirm ? entryEnabled : pinentryField.text.length >= root.minPinLength
224172 }
225173 }
226− }
174+ Item {
175+ height: numbersGrid.buttonHeight
176+ width: numbersGrid.buttonWidth
177+ }
178+ PinPadButton {
179+ text: "0"
180+ height: numbersGrid.buttonHeight
181+ width: numbersGrid.buttonWidth
182+ enabled: root.entryEnabled && (root.maxPinLength == -1 ||
183+ pinentryField.text.length < root.maxPinLength ||
184+ pinentryField.incorrectOverride)
185+
186+ onClicked: {
187+ pinentryField.appendNumber(0)
188+ }
189+ }
190+ Item {
191+ height: numbersGrid.buttonHeight
192+ width: numbersGrid.buttonWidth
193+ }
194+ PinPadButton {
195+ iconName: "close"
196+ height: numbersGrid.buttonHeight
197+ width: numbersGrid.buttonWidth
227198
199+ onClicked: root.cancel()
200+ }
201+ Item {
202+ height: numbersGrid.buttonHeight
203+ width: numbersGrid.buttonWidth
204+ }
205+ PinPadButton {
206+ iconName: "tick"
207+ objectName: "confirmButton"
208+ height: numbersGrid.buttonHeight
209+ width: numbersGrid.buttonWidth
210+ enabled: root.enabled && pinentryField.text.length >= root.minPinLength
211+ visible: root.minPinLength == -1 || root.minPinLength !== root.maxPinLength
212+
213+ onClicked: root.entered(pinentryField.text)
214+ }
215+ }
228216 WrongPasswordAnimation {
229217 id: wrongPasswordAnimation
230218 objectName: "wrongPasswordAnimation"
231− target: pinentryField
219+ target: shakeContainer
232220 }
233221}
qml/Components/PinPadButton.qml+31−45
@@ -15,62 +15,48 @@
1515 */
1616
1717import QtQuick 2.0
18−import Ubuntu.Components 0.1
18+import Ubuntu.Components 1.1
1919
20−Item {
20+AbstractButton {
2121 id: root
2222 opacity: enabled ? 1 : 0.6
2323
2424 property alias text: label.text
25− property alias subText: subTextLabel.text
2625 property string iconName
2726
28− signal clicked()
27+ UbuntuShape {
28+ anchors.fill: parent
29+ opacity: root.pressed ? 1 : 0
30+ Behavior on opacity {
31+ UbuntuNumberAnimation {}
32+ }
33+ }
2934
30− Column {
35+ Label {
36+ id: label
3137 anchors.centerIn: parent
32− width: parent.width
33− height: childrenRect.height
34−
35− Item {
36− anchors {
37− left: parent.left
38− right: parent.right
39− }
40− height: label.visible || icon.visible ? Math.max(label.height, icon.height) : 0
41−
42− Label {
43− id: label
44− anchors.centerIn: parent
45− width: parent.width
46− horizontalAlignment: Text.AlignHCenter
47− color: "#f3f3e7"
48− fontSize: "large"
49− font.weight: Font.DemiBold
50− visible: text.length > 0
51− }
52−
53− Icon {
54− id: icon
55− height: units.gu(3)
56− width: height
57− anchors.centerIn: parent
58− name: root.iconName
59− color: "#f3f3e7"
60− visible: name.length > 0
61− }
62− }
63− Label {
64− id: subTextLabel
65− fontSize: "small"
66− color: "#f3f3e7"
67− anchors.horizontalCenter: parent.horizontalCenter
68− visible: text.length > 0
38+ horizontalAlignment: Text.AlignHCenter
39+ color: "#f3f3e7"
40+ fontSize: "x-large"
41+ font.weight: Font.DemiBold
42+ visible: text.length > 0
43+ scale: root.pressed ? 0.9 : 1
44+ Behavior on scale {
45+ UbuntuNumberAnimation {}
6946 }
7047 }
7148
72− MouseArea {
73− anchors.fill: parent
74− onClicked: root.clicked()
49+ Icon {
50+ id: icon
51+ height: units.gu(3)
52+ width: height
53+ anchors.centerIn: parent
54+ name: root.iconName
55+ color: "#f3f3e7"
56+ visible: name.length > 0
57+ scale: root.pressed ? 0.9 : 1
58+ Behavior on scale {
59+ UbuntuNumberAnimation { duration: UbuntuAnimation.SlowDuration }
60+ }
7561 }
7662}
qml/Dash/Previews/PreviewExpandable.qml+3−3
@@ -81,9 +81,9 @@ PreviewWidget {
8181 delegate: PreviewWidgetFactory {
8282 height: visible ? implicitHeight : 0
8383 width: parent.width
84− widgetId: modelData.widgetId
85− widgetType: modelData.type
86− widgetData: modelData.properties
84+ widgetId: model.widgetId
85+ widgetType: model.type
86+ widgetData: model.properties
8787 isCurrentPreview: root.isCurrentPreview
8888 scopeStyle: root.scopeStyle
8989 anchors {
qml/Dash/Previews/PreviewPayments.qml+22−3
@@ -37,9 +37,15 @@ PreviewWidget {
3737
3838 color: Theme.palette.selected.foreground
3939 text: paymentClient.formattedPrice
40− onClicked: paymentClient.start()
40+ onClicked: {
41+ paymentClient.start();
42+ paymentButton.opacity = 0;
43+ }
4144 anchors.right: parent.right
4245 width: (root.width - units.gu(1)) / 2
46+ opacity: 1
47+ visible: paymentButton.opacity == 0 ? false : true
48+ Behavior on opacity { PropertyAnimation { duration: UbuntuAnimation.FastDuration } }
4349
4450 Payments {
4551 id: paymentClient
@@ -49,8 +55,21 @@ PreviewWidget {
4955 price: source["price"]
5056 currency: source["currency"]
5157 storeItemId: source["store_item_id"]
52− onPurchaseCompleted: root.triggered(widgetId, "purchaseCompleted", source)
53− onPurchaseError: root.triggered(widgetId, "purchaseError", source)
58+ onPurchaseCompleted: {
59+ root.triggered(widgetId, "purchaseCompleted", source);
60+ }
61+ onPurchaseError: {
62+ root.triggered(widgetId, "purchaseError", source);
63+ }
5464 }
5565 }
66+
67+ ProgressBar {
68+ id: loadingBar
69+ objectName: "loadingBar"
70+ indeterminate: true
71+ anchors.fill: paymentButton
72+ opacity: 1 - paymentButton.opacity
73+ visible: !paymentButton.visible
74+ }
5675}
qml/Greeter/Clock.qml+2−1
@@ -16,6 +16,7 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19+import "../Panel/Indicators"
1920import Unity.Indicators 0.1 as Indicators
2021
2122Item {
@@ -33,7 +34,7 @@ Item {
3334 }
3435 }
3536
36− Indicators.CachedUnityMenuModel {
37+ CachedUnityMenuModel {
3738 id: timeModel
3839 objectName: "timeModel"
3940
qml/Greeter/GreeterContent.qml−1
@@ -87,7 +87,6 @@ Item {
8787
8888 onLoaded: {
8989 item.currentIndex = greeterContentLoader.currentIndex;
90− item.resetAuthentication();
9190 }
9291
9392 Binding {
qml/Notifications/Notification.qml+4−3
@@ -52,7 +52,7 @@ Item {
5252 implicitHeight: type !== Notification.PlaceHolder ? (fullscreen ? maxHeight : contentColumn.height + contentColumn.spacing * 2) : 0
5353
5454 color: Qt.rgba(0.132, 0.117, 0.109, 0.97)
55− opacity: 0
55+ opacity: 1 // FIXME: 1 because of LP: #1354406 workaround, has to be 0 really
5656
5757 state: {
5858 var result = "";
@@ -82,7 +82,8 @@ Item {
8282 source: hints["suppress-sound"] != "true" && hints["sound-file"] != undefined ? hints["sound-file"] : ""
8383 }
8484
85− onOpacityChanged: {
85+ // FIXME: using onCompleted because of LP: #1354406 workaround, has to be onOpacityChanged really
86+ Component.onCompleted: {
8687 if (opacity == 1.0 && hints["suppress-sound"] != "true" && sound.source) {
8788 sound.play();
8889 }
@@ -380,7 +381,7 @@ Item {
380381 id: comboRepeater
381382
382383 onVisibleChanged: {
383− comboButton.text = comboRepeater.itemAt(2).actionLabel
384+ comboButton.text = comboRepeater.count >= 3 ? comboRepeater.itemAt(2).actionLabel : ""
384385 }
385386
386387 model: notification.actions
qml/Notifications/NotificationMenuItemFactory.qml+9−1
@@ -117,7 +117,10 @@ Loader {
117117 right: parent.right
118118 }
119119 height: menuFactory.maxHeight
120− placeholderText: i18n.tr("Please enter SIM PIN")
120+ infoText: i18n.tr("Enter SIM PIN")
121+ errorText: i18n.tr("Sorry, incorrect PIN")
122+ minPinLength: 4
123+ maxPinLength: 8
121124 background: shell.background
122125
123126 onEntered: {
@@ -127,6 +130,11 @@ Loader {
127130 onCancel: {
128131 menuModel.activate(menuIndex, false);
129132 }
133+
134+ onEmergencyCall: {
135+ shell.activateApplication("dialer-app")
136+ menuModel.activate(menuIndex, false)
137+ }
130138 }
131139 }
132140}
qml/Notifications/Notifications.qml+5−3
@@ -63,7 +63,8 @@ ListView {
6363
6464 // make sure there's no opacity-difference between the several
6565 // elements in a notification
66− layer.enabled: add.running || remove.running || populate.running
66+ // FIXME: disabled all transitions because of LP: #1354406 workaround
67+ //layer.enabled: add.running || remove.running || populate.running
6768
6869 Component.onCompleted: {
6970 if (index == 1) {
@@ -79,7 +80,8 @@ ListView {
7980 }
8081 }
8182
82− populate: Transition {
83+ // FIXME: disabled all transitions because of LP: #1354406 workaround
84+ /*populate: Transition {
8385 UbuntuNumberAnimation {
8486 property: "opacity"
8587 to: 1
@@ -107,5 +109,5 @@ ListView {
107109 properties: "x,y"
108110 duration: UbuntuAnimation.SnapDuration
109111 }
110− }
112+ }*/
111113}
tests/mocks/Unity/Indicators/CachedUnityMenuModel.qml → qml/Panel/Indicators/CachedUnityMenuModel.qmlrenamed+14−5
@@ -18,13 +18,22 @@
1818 */
1919
2020import QtQuick 2.0
21+import QMenuModel 0.1
22+import Unity.Indicators 0.1 as Indicators
2123
24+// Make sure we don't duplicate models.
2225Item {
23− property string busName: ""
24− property string actionsObjectPath: ""
25− property string menuObjectPath: ""
26+ id: cachedModel
27+ property string busName
28+ property string actionsObjectPath
29+ property string menuObjectPath
30+ readonly property bool ready: busName!=="" && actionsObjectPath!=="" && menuObjectPath!==""
2631
27− readonly property bool ready: false
32+ property var model: {
33+ if (!ready) return null;
2834
29− property QtObject model: null
35+ return Indicators.UnityMenuModelCache.model(cachedModel.busName,
36+ cachedModel.menuObjectPath,
37+ { "indicator": cachedModel.actionsObjectPath });
38+ }
3039}
qml/Panel/Indicators/DefaultIndicatorWidget.qml+2−1
@@ -63,6 +63,7 @@ IndicatorBase {
6363 }
6464
6565 Row {
66+ id: iconRow
6667 anchors {
6768 top: parent.top
6869 bottom: parent.bottom
@@ -73,7 +74,7 @@ IndicatorBase {
7374
7475 Item {
7576 width: itemImage.width + units.gu(1)
76− anchors { top: parent.top; bottom: parent.bottom }
77+ height: iconRow.height
7778
7879 StatusIcon {
7980 id: itemImage
qml/Panel/Indicators/IndicatorBase.qml+4−2
@@ -34,6 +34,7 @@ Item {
3434 property string deviceMenuObjectPath: menuObjectPath
3535
3636 property alias menuModel: cachedModel.model
37+ property alias rootActionState: rootAction
3738
3839 CachedUnityMenuModel {
3940 id: cachedModel
@@ -42,8 +43,9 @@ Item {
4243 menuObjectPath: indicatorItem.deviceMenuObjectPath
4344 }
4445
45− property RootActionState rootActionState: RootActionState {
46− menu: menuModel
46+ RootActionState {
47+ id: rootAction
48+ menu: menuModel ? menuModel : null
4749 onUpdated: indicatorItem.rootActionStateChanged()
4850 }
4951}
qml/Shell.qml+16−7
@@ -20,6 +20,7 @@ import GSettings 1.0
2020import Unity.Application 0.1
2121import Ubuntu.Components 0.1
2222import Ubuntu.Components.Popups 1.0
23+import Ubuntu.Connectivity 0.1
2324import Ubuntu.Gestures 0.1
2425import Ubuntu.SystemImage 0.1
2526import Unity.Launcher 0.1
@@ -273,15 +274,19 @@ Item {
273274
274275 onShowPrompt: {
275276 if (greeter.narrowMode) {
276− var promptText = text.toLowerCase()
277277 if (isDefaultPrompt) {
278− promptText = lockscreen.alphaNumeric ?
279− i18n.tr("passphrase") : i18n.tr("passcode")
278+ if (lockscreen.alphaNumeric) {
279+ lockscreen.infoText = i18n.tr("Enter your passphrase")
280+ lockscreen.errorText = i18n.tr("Sorry, incorrect passphrase")
281+ } else {
282+ lockscreen.infoText = i18n.tr("Enter your PIN")
283+ lockscreen.errorText = i18n.tr("Sorry, incorrect PIN")
284+ }
285+ } else {
286+ lockscreen.infoText = i18n.tr("Enter your %1").arg(text.toLowerCase())
287+ lockscreen.errorText = i18n.tr("Sorry, incorrect %1").arg(text.toLowerCase())
280288 }
281− lockscreen.placeholderText = i18n.tr("Enter your %1").arg(promptText)
282− lockscreen.wrongPlaceholderText = i18n.tr("Incorrect %1").arg(promptText) +
283− "\n" +
284− i18n.tr("Please re-enter")
289+
285290 lockscreen.show();
286291 }
287292 }
@@ -416,6 +421,10 @@ Item {
416421 }
417422 }
418423
424+ Component.onCompleted: {
425+ Connectivity.unlockAllModems()
426+ }
427+
419428 onUnlocked: greeter.hide()
420429 onSelected: {
421430 // Update launcher items for new user
tests/autopilot/unity8/shell/tests/test_lock_screen.py+2−2
@@ -54,7 +54,7 @@ class TestLockscreen(UnityTestCase):
5454 self.main_window.enter_pin_code("1234")
5555 self.assertThat(lockscreen.shown, Eventually(Equals(False)))
5656 else:
57− self._enter_prompt_passphrase("1234")
57+ self._enter_prompt_passphrase("1234\n")
5858 self.assertThat(greeter.shown, Eventually(Equals(False)))
5959
6060 @with_lightdm_mock("single-passphrase")
@@ -86,7 +86,7 @@ class TestLockscreen(UnityTestCase):
8686 self.assertThat(pinentryField.text, Eventually(Equals("")))
8787 self.assertThat(lockscreen.shown, Eventually(Equals(True)))
8888 else:
89− self._enter_prompt_passphrase("4231")
89+ self._enter_prompt_passphrase("4231\n")
9090 prompt = self.main_window.get_greeter().get_prompt()
9191 self.assertThat(prompt.text, Eventually(Equals("")))
9292 self.assertThat(greeter.shown, Eventually(Equals(True)))
tests/mocks/LightDM/demo/GreeterPrivate.cpp+60−21
@@ -33,6 +33,12 @@ class GreeterImpl : public QObject
3333{
3434 Q_OBJECT
3535
36+ struct AppData
37+ {
38+ GreeterImpl *impl;
39+ pam_handle *handle;
40+ };
41+
3642 typedef QFutureInterface<QString> ResponseFuture;
3743
3844public:
@@ -46,32 +52,36 @@ public:
4652
4753 connect(&futureWatcher, SIGNAL(finished()),
4854 this, SLOT(finishPam()));
49− connect(this, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)),
50− greeter, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)));
55+ connect(this, SIGNAL(showMessage(pam_handle *, QString, QLightDM::Greeter::MessageType)),
56+ this, SLOT(handleMessage(pam_handle *, QString, QLightDM::Greeter::MessageType)));
5157 // This next connect is how we pass ResponseFutures between threads
52− connect(this, SIGNAL(showPrompt(QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)),
53− this, SLOT(handlePrompt(QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)));
58+ connect(this, SIGNAL(showPrompt(pam_handle *, QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)),
59+ this, SLOT(handlePrompt(pam_handle *, QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)));
60+ }
61+
62+ ~GreeterImpl()
63+ {
64+ cancelPam();
5465 }
5566
5667 void start(QString username)
5768 {
58− // Clear out any existing PAM interactions first (we can't simply
59− // cancel our QFuture because QtConcurrent::run doesn't support cancel)
60− if (pamHandle != NULL) {
61− pam_handle *handle = pamHandle;
62− pamHandle = NULL; // to disable normal finishPam() handling
63− while (respond(QString())); // clear our local queue of QFutures
64− pam_end(handle, PAM_CONV_ERR);
65− }
69+ // Clear out any existing PAM interactions first
70+ cancelPam();
71+
72+ AppData *appData = new AppData();
73+ appData->impl = this;
6674
6775 // Now actually start a new conversation with PAM
6876 pam_conv conversation;
6977 conversation.conv = converseWithPam;
70− conversation.appdata_ptr = static_cast<void*>(this);
78+ conversation.appdata_ptr = static_cast<void*>(appData);
7179
7280 if (pam_start("lightdm", username.toUtf8(), &conversation, &pamHandle) == PAM_SUCCESS) {
81+ appData->handle = pamHandle;
7382 futureWatcher.setFuture(QtConcurrent::run(authenticateWithPam, pamHandle));
7483 } else {
84+ delete appData;
7585 greeterPrivate->authenticated = false;
7686 Q_EMIT greeter->showMessage("Internal error: could not start PAM authentication", QLightDM::Greeter::MessageTypeError);
7787 Q_EMIT greeter->authenticationComplete();
@@ -103,7 +113,9 @@ public:
103113 if (!tmp_response)
104114 return PAM_CONV_ERR;
105115
106− GreeterImpl* impl = static_cast<GreeterImpl*>(appdata_ptr);
116+ AppData *appData = static_cast<AppData*>(appdata_ptr);
117+ GreeterImpl *impl = appData->impl;
118+ pam_handle *handle = appData->handle;
107119
108120 int count;
109121 QVector<ResponseFuture> responses;
@@ -117,7 +129,7 @@ public:
117129 QString message(msg[count]->msg);
118130 responses.append(ResponseFuture());
119131 responses.last().reportStarted();
120− Q_EMIT impl->showPrompt(message, Greeter::PromptTypeQuestion, responses.last());
132+ Q_EMIT impl->showPrompt(handle, message, Greeter::PromptTypeQuestion, responses.last());
121133 break;
122134 }
123135 case PAM_PROMPT_ECHO_OFF:
@@ -125,19 +137,19 @@ public:
125137 QString message(msg[count]->msg);
126138 responses.append(ResponseFuture());
127139 responses.last().reportStarted();
128− Q_EMIT impl->showPrompt(message, Greeter::PromptTypeSecret, responses.last());
140+ Q_EMIT impl->showPrompt(handle, message, Greeter::PromptTypeSecret, responses.last());
129141 break;
130142 }
131143 case PAM_TEXT_INFO:
132144 {
133145 QString message(msg[count]->msg);
134− Q_EMIT impl->showMessage(message, Greeter::MessageTypeInfo);
146+ Q_EMIT impl->showMessage(handle, message, Greeter::MessageTypeInfo);
135147 break;
136148 }
137149 default:
138150 {
139151 QString message(msg[count]->msg);
140− Q_EMIT impl->showMessage(message, Greeter::MessageTypeError);
152+ Q_EMIT impl->showMessage(handle, message, Greeter::MessageTypeError);
141153 break;
142154 }
143155 }
@@ -159,6 +171,8 @@ public:
159171 }
160172 }
161173
174+ delete appData;
175+
162176 if (raise_error)
163177 {
164178 for (int i = 0; i < count; ++i)
@@ -186,8 +200,8 @@ public Q_SLOTS:
186200 }
187201
188202Q_SIGNALS:
189− void showMessage(QString text, QLightDM::Greeter::MessageType type);
190− void showPrompt(QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture response);
203+ void showMessage(pam_handle *handle, QString text, QLightDM::Greeter::MessageType type);
204+ void showPrompt(pam_handle *handle, QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture response);
191205
192206private Q_SLOTS:
193207 void finishPam()
@@ -205,13 +219,38 @@ private Q_SLOTS:
205219 Q_EMIT greeter->authenticationComplete();
206220 }
207221
208− void handlePrompt(QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture future)
222+ void handleMessage(pam_handle *handle, QString text, QLightDM::Greeter::MessageType type)
223+ {
224+ if (handle != pamHandle)
225+ return;
226+
227+ Q_EMIT greeter->showMessage(text, type);
228+ }
229+
230+ void handlePrompt(pam_handle *handle, QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture future)
209231 {
232+ if (handle != pamHandle) {
233+ future.reportResult(QString());
234+ future.reportFinished();
235+ return;
236+ }
237+
210238 futures.enqueue(future);
211239 Q_EMIT greeter->showPrompt(text, type);
212240 }
213241
214242private:
243+ void cancelPam()
244+ {
245+ // Unfortunately we can't simply cancel our QFuture because QtConcurrent::run doesn't support cancel
246+ if (pamHandle != NULL) {
247+ pam_handle *handle = pamHandle;
248+ pamHandle = NULL; // to disable normal finishPam() handling
249+ while (respond(QString())); // clear our local queue of QFutures
250+ pam_end(handle, PAM_CONV_ERR);
251+ }
252+ }
253+
215254 Greeter *greeter;
216255 GreeterPrivate *greeterPrivate;
217256 pam_handle* pamHandle;
tests/mocks/QMenuModel/unitymenumodel.cpp+4−5
@@ -17,7 +17,6 @@
1717 */
1818
1919#include "unitymenumodel.h"
20−#include <QDebug>
2120
2221enum MenuRoles {
2322 LabelRole = Qt::DisplayRole + 1,
@@ -38,6 +37,10 @@ UnityMenuModel::UnityMenuModel(QObject *parent)
3837{
3938}
4039
40+UnityMenuModel::~UnityMenuModel()
41+{
42+}
43+
4144QVariant UnityMenuModel::modelData() const
4245{
4346 return m_modelData;
@@ -83,10 +86,6 @@ void UnityMenuModel::removeRow(int row)
8386 endRemoveRows();
8487}
8588
86−UnityMenuModel::~UnityMenuModel()
87−{
88−}
89−
9089QByteArray UnityMenuModel::busName() const
9190{
9291 return m_busName;
tests/mocks/Ubuntu/CMakeLists.txt+1
@@ -1,3 +1,4 @@
1+add_subdirectory(Connectivity)
12add_subdirectory(DownloadDaemonListener)
23add_subdirectory(Payments)
34add_subdirectory(SystemImage)
tests/mocks/Ubuntu/Connectivity/CMakeLists.txtnew file+10
@@ -0,0 +1,10 @@
1+set(MOCK_CONNECTIVITY_SOURCES
2+ plugin.cpp
3+ MockConnectivity.cpp
4+)
5+
6+add_library(MockConnectivity MODULE ${MOCK_CONNECTIVITY_SOURCES})
7+
8+qt5_use_modules(MockConnectivity Qml Quick Core)
9+
10+add_unity8_mock(Ubuntu.Connectivity 0.1 Ubuntu/Connectivity TARGETS MockConnectivity)
tests/mocks/Ubuntu/Connectivity/Connectivity.qmltypesnew file+18
@@ -0,0 +1,18 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Ubuntu.Connectivity 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "MockConnectivity"
12+ prototype: "QObject"
13+ exports: ["Ubuntu.Connectivity/Connectivity 0.1"]
14+ exportMetaObjectRevisions: [0]
15+ Signal { name: "unlockingAllModems" }
16+ Method { name: "unlockAllModems" }
17+ }
18+}
tests/mocks/Ubuntu/Connectivity/MockConnectivity.cppnew file+27
@@ -0,0 +1,27 @@
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 "MockConnectivity.h"
18+
19+MockConnectivity::MockConnectivity(QObject *parent)
20+ : QObject(parent)
21+{
22+}
23+
24+void MockConnectivity::unlockAllModems()
25+{
26+ Q_EMIT unlockingAllModems();
27+}
tests/mocks/Ubuntu/Connectivity/MockConnectivity.hnew file+36
@@ -0,0 +1,36 @@
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 MOCK_CONNECTIVITY_H
18+#define MOCK_CONNECTIVITY_H
19+
20+#include <QObject>
21+
22+class MockConnectivity : public QObject
23+{
24+ Q_OBJECT
25+ Q_DISABLE_COPY(MockConnectivity)
26+
27+public:
28+ explicit MockConnectivity(QObject *parent = 0);
29+
30+ Q_INVOKABLE void unlockAllModems();
31+
32+Q_SIGNALS:
33+ void unlockingAllModems(); // only for mock
34+};
35+
36+#endif // MOCK_CONNECTIVITY_H
tests/mocks/Ubuntu/Connectivity/plugin.cppnew file+34
@@ -0,0 +1,34 @@
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 "MockConnectivity.h"
19+
20+#include <QtQml>
21+
22+static QObject *service_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
23+{
24+ Q_UNUSED(engine)
25+ Q_UNUSED(scriptEngine)
26+ return new MockConnectivity();
27+}
28+
29+void BackendPlugin::registerTypes(const char *uri)
30+{
31+ Q_ASSERT(uri == QLatin1String("Ubuntu.Connectivity"));
32+
33+ qmlRegisterSingletonType<MockConnectivity>(uri, 0, 1, "Connectivity", service_provider);
34+}
tests/mocks/Ubuntu/Connectivity/plugin.hnew file+31
@@ -0,0 +1,31 @@
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 MOCK_CONNECTIVITY_PLUGIN_H
18+#define MOCK_CONNECTIVITY_PLUGIN_H
19+
20+#include <QQmlExtensionPlugin>
21+
22+class BackendPlugin : public QQmlExtensionPlugin
23+{
24+ Q_OBJECT
25+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26+
27+public:
28+ void registerTypes(const char *uri);
29+};
30+
31+#endif // MOCK_CONNECTIVITY_PLUGIN_H
tests/mocks/Ubuntu/Connectivity/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module Ubuntu.Connectivity
2+plugin MockConnectivity
3+typeinfo Connectivity.qmltypes
tests/mocks/Unity/Indicators/CMakeLists.txt+6−1
@@ -14,6 +14,7 @@ set(IndicatorsFakeQml_SOURCES
1414 fakeplugin.cpp
1515 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/indicators.h
1616 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/menucontentactivator.cpp
17+ ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/unitymenumodelcache.cpp
1718 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/unitymenumodelstack.cpp
1819 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/visibleindicatorsmodel.cpp
1920 fakeindicatorsmodel.cpp
@@ -33,7 +34,11 @@ add_library(IndicatorsFakeQml SHARED
3334)
3435add_definitions(-DUNITYINDICATORS_LIBRARY)
3536
36−target_link_libraries(IndicatorsFakeQml)
37+add_dependencies(IndicatorsFakeQml QMenuModelQml)
38+target_link_libraries(IndicatorsFakeQml
39+ -L${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel
40+ -lqmenumodel
41+)
3742
3843qt5_use_modules(IndicatorsFakeQml Core Qml Quick)
3944
tests/mocks/Unity/Indicators/fakeplugin.cpp+9
@@ -26,9 +26,16 @@
2626#include "fakeindicatorsmodel.h"
2727#include "indicators.h"
2828#include "menucontentactivator.h"
29+#include "unitymenumodelcache.h"
2930#include "unitymenumodelstack.h"
3031#include "visibleindicatorsmodel.h"
3132
33+static QObject* menuModelCacheSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
34+ Q_UNUSED(engine);
35+ Q_UNUSED(scriptEngine);
36+ return new UnityMenuModelCache;
37+}
38+
3239void IndicatorsFakePlugin::registerTypes(const char * uri)
3340{
3441 Q_INIT_RESOURCE(indicators_fake);
@@ -41,6 +48,8 @@ void IndicatorsFakePlugin::registerTypes(const char * uri)
4148 qmlRegisterType<UnityMenuModelStack>(uri, 0, 1, "UnityMenuModelStack");
4249 qmlRegisterType<VisibleIndicatorsModel>(uri, 0, 1, "VisibleIndicatorsModel");
4350
51+ qmlRegisterSingletonType<UnityMenuModelCache>(uri, 0, 1, "UnityMenuModelCache", menuModelCacheSingleton);
52+
4453 // external uncreatables
4554 qmlRegisterUncreatableType<MenuContentState>(uri, 0, 1, "MenuContentState", "Can't create MenuContentState class");
4655 qmlRegisterUncreatableType<ActionState>(uri, 0, 1, "ActionState", "Can't create ActionState class");
tests/mocks/Unity/Indicators/qmldir−1
@@ -2,7 +2,6 @@ module Unity.Indicators
22plugin IndicatorsFakeQml
33typeinfo Indicators.qmltypes
44
5−CachedUnityMenuModel 0.1 CachedUnityMenuModel.qml
65IndicatorsModel 0.1 IndicatorsModel.qml
76FakeMenuPage 0.1 FakeMenuPage.qml
87RootActionState 0.1 RootActionState.qml
tests/qmltests/CMakeLists.txt+1
@@ -73,6 +73,7 @@ add_qml_test(Panel Panel)
7373add_qml_test(Panel SearchIndicator)
7474add_qml_test(Panel/Indicators DefaultIndicatorWidget ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
7575add_qml_test(Panel/Indicators DefaultIndicatorPage ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
76+add_qml_test(Panel/Indicators CachedUnityMenuModel ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
7677# These MenuItemFactory tests need the test/mocks/ to come before plugins/
7778add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
7879add_qml_test(Panel/Indicators MessageMenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
tests/qmltests/Dash/Previews/tst_PreviewExpandable.qml+12−6
@@ -34,15 +34,21 @@ Rectangle {
3434 "values": [ [ "Long Label 1", "Value 1"], [ "Label 2", "Long Value 2"], [ "Label 3", "Value 3"], [ "Label 4", "Value 4"], [ "Label 5", "Value 5"] ]
3535 }
3636
37+ ListModel {
38+ id: widgetsModel
39+ }
40+
3741 property var widgetData: {
3842 "title": "Title here",
3943 "collapsed-widgets": 2,
40− "widgets": [
41− { "type": "text", "widgetId" : "text1", "properties" : { "text": longText } },
42− { "type": "table", "widgetId" : "table1", "properties" : tableData },
43− { "type": "text", "widgetId" : "text3", "properties" : { "text": shortText } },
44− { "type": "text", "widgetId" : "text4", "properties" : { "text": longText } }
45− ]
44+ "widgets": widgetsModel
45+ }
46+
47+ Component.onCompleted: {
48+ widgetsModel.append({"type": "text", "widgetId": "text1", "properties": { "text": longText }});
49+ widgetsModel.append({"type": "text", "widgetId": "table1", "properties": { "text": tableData }});
50+ widgetsModel.append({"type": "text", "widgetId": "text3", "properties": { "text": shortText }});
51+ widgetsModel.append({"type": "text", "widgetId": "text4", "properties": { "text": longText }});
4652 }
4753
4854 PreviewExpandable {
tests/qmltests/Dash/Previews/tst_PreviewPayments.qml+24
@@ -52,6 +52,8 @@ Rectangle {
5252 function cleanup()
5353 {
5454 spy.clear();
55+ var button = findChild(root, "paymentButton");
56+ button.opacity = 1;
5557 }
5658
5759 function test_purchase_text_display() {
@@ -79,6 +81,28 @@ Rectangle {
7981 compare(args[2], jsonPurchase["source"]);
8082 }
8183
84+ function test_progress_show() {
85+ // Make sure the progress bar is shown.
86+ previewPayments.widgetData = jsonPurchase;
87+
88+ var button = findChild(root, "paymentButton");
89+ var progress = findChild(root, "loadingBar");
90+
91+ tryCompare(progress, "visible", false);
92+ tryCompare(progress, "opacity", 0);
93+ tryCompare(button, "visible", true);
94+ tryCompare(button, "opacity", 1);
95+
96+ mouseClick(button, button.width / 2, button.height / 2);
97+
98+ spy.wait();
99+
100+ tryCompare(progress, "visible", true);
101+ tryCompare(progress, "opacity", 1);
102+ tryCompare(button, "visible", false);
103+ tryCompare(button, "opacity", 0);
104+ }
105+
82106 function test_purchase_error() {
83107 // The mock Payments triggers an error when com.example.invalid is
84108 // passed to it as store_item_id. Exercise it here
tests/qmltests/Dash/tst_Dash.qml+12−6
@@ -96,8 +96,10 @@ Item {
9696 tryCompare(scopes, "loaded", true);
9797 var dashContentList = findChild(dash, "dashContentList");
9898 tryCompare(dashContentList, "count", 6);
99− var mockScope1Loader = findChild(dash, "MockScope1 loader");
100− tryCompareFunction(function() { return mockScope1Loader.item != null; }, true);
99+ tryCompareFunction(function() {
100+ var mockScope1Loader = findChild(dash, "MockScope1 loader");
101+ return mockScope1Loader && mockScope1Loader.item != null; },
102+ true);
101103
102104 // Show the overview
103105 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, dash.height - units.gu(18));
@@ -159,8 +161,10 @@ Item {
159161 tryCompare(scopes, "loaded", true);
160162 var dashContentList = findChild(dash, "dashContentList");
161163 tryCompare(dashContentList, "count", 6);
162− var mockScope1Loader = findChild(dash, "MockScope1 loader");
163− tryCompareFunction(function() { return mockScope1Loader.item != null; }, true);
164+ tryCompareFunction(function() {
165+ var mockScope1Loader = findChild(dash, "MockScope1 loader");
166+ return mockScope1Loader && mockScope1Loader.item != null; },
167+ true);
164168
165169 // Show the overview
166170 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, dash.height - units.gu(18));
@@ -224,8 +228,10 @@ Item {
224228 tryCompare(scopes, "loaded", true);
225229 var dashContentList = findChild(dash, "dashContentList");
226230 tryCompare(dashContentList, "count", 6);
227− var mockScope1Loader = findChild(dash, "MockScope1 loader");
228− tryCompareFunction(function() { return mockScope1Loader.item != null; }, true);
231+ tryCompareFunction(function() {
232+ var mockScope1Loader = findChild(dash, "MockScope1 loader");
233+ return mockScope1Loader && mockScope1Loader.item != null; },
234+ true);
229235
230236 // Swipe right to Apps scope
231237 touchFlick(dash, dash.width - 1, units.gu(1), dash.width - units.gu(10), units.gu(1));
tests/qmltests/Greeter/tst_Lockscreen.qml+65−46
@@ -26,22 +26,21 @@ import Unity.Test 0.1 as UT
2626Rectangle {
2727 id: root
2828 width: units.gu(80)
29− height: units.gu(80)
29+ height: units.gu(70)
3030 color: "orange"
3131
3232 Lockscreen {
3333 id: lockscreen
3434 anchors.fill: parent
35− anchors.rightMargin: units.gu(30)
36− placeholderText: "Please enter your PIN"
37− wrongPlaceholderText: "Incorrect PIN"
35+ anchors.rightMargin: units.gu(40)
36+ infoText: infoTextTextField.text
3837 retryText: retryCountTextField.text
38+ errorText: errorTextTextField.text
3939 alphaNumeric: pinPadCheckBox.checked
4040 minPinLength: minPinLengthTextField.text
4141 maxPinLength: maxPinLengthTextField.text
4242 username: "Lola"
4343 background: "../../../qml/graphics/phone_background.jpg"
44− infoText: infoTextTextField.text
4544 }
4645
4746 Connections {
@@ -68,7 +67,7 @@ Rectangle {
6867 } else {
6968 pinPadCheckBox.checked = true
7069 }
71− lockscreen.placeholderText = text;
70+ lockscreen.infoText = text;
7271 }
7372 }
7473
@@ -157,7 +156,14 @@ Rectangle {
157156 id: infoTextTextField
158157 width: parent.width
159158 placeholderText: "Infotext"
160− text: "+49 179 3253553"
159+ text: "Enter SIM1 PIN"
160+ }
161+
162+ TextField {
163+ id: errorTextTextField
164+ width: parent.width
165+ placeholderText: "Error text"
166+ text: "Sorry, incorrect PIN"
161167 }
162168
163169 TextField {
@@ -223,7 +229,7 @@ Rectangle {
223229 emergencyCheckBox.checked = false
224230 pinPadCheckBox.checked = data.alphanumeric
225231 waitForLockscreenReady();
226− var emergencyButton = findChild(lockscreen, "emergencyCallIcon")
232+ var emergencyButton = findChild(lockscreen, "emergencyCallLabel")
227233 mouseClick(emergencyButton, units.gu(1), units.gu(1))
228234 tryCompare(emergencyCheckBox, "checked", true)
229235
@@ -231,18 +237,20 @@ Rectangle {
231237
232238 function test_labels_data() {
233239 return [
234− {tag: "numeric", alphanumeric: false, placeholderText: "Please enter your PIN", username: "foobar" },
235− {tag: "alphanumeric", alphanumeric: true, placeholderText: "Please enter your password", username: "Lola" }
240+ {tag: "numeric", alphanumeric: false, infoText: "Please enter your PIN", username: "foobar" },
241+ {tag: "alphanumeric", alphanumeric: true, infoText: "Please enter your password", username: "Lola" }
236242 ]
237243 }
238244
239245 function test_labels(data) {
240246 pinPadCheckBox.checked = data.alphanumeric
241− lockscreen.placeholderText = data.placeholderText
247+ lockscreen.infoText = data.infoText
242248 waitForLockscreenReady();
243− compare(findChild(lockscreen, "pinentryField").placeholderText, data.placeholderText, "Placeholdertext is not what it should be")
244249 if (data.alphanumeric) {
250+ compare(findChild(lockscreen, "pinentryField").placeholderText, data.infoText, "Placeholdertext is not what it should be")
245251 compare(findChild(lockscreen, "greeterLabel").text, "Hello " + data.username, "Greeter is not set correctly")
252+ } else {
253+ compare(findChild(lockscreen, "infoTextLabel").text, data.infoText, "Placeholdertext is not what it should be")
246254 }
247255 }
248256
@@ -276,10 +284,8 @@ Rectangle {
276284 var button = findChild(lockscreen, "pinPadButton" + character)
277285 mouseClick(button, units.gu(1), units.gu(1))
278286 }
279− if (data.minPinLength !== data.maxPinLength || data.minPinLength == -1) {
280− var pinPadButtonErase = findChild(lockscreen, "pinPadButtonErase");
281− mouseClick(pinPadButtonErase, units.gu(1), units.gu(1));
282− }
287+ var confirmButton = findChild(lockscreen, "confirmButton");
288+ mouseClick(confirmButton, units.gu(1), units.gu(1));
283289 }
284290 tryCompare(enteredLabel, "text", data.password)
285291 }
@@ -317,11 +323,9 @@ Rectangle {
317323 wait(0) // Trigger event loop to make sure the animation would start running
318324 compare(animation.running, data.animation)
319325 if (data.animation) {
320− if (data.alphanumeric) {
321− tryCompare(inputField, "placeholderText", lockscreen.wrongPlaceholderText)
322− } else {
323− var label = findChild(lockscreen, "pinentryFieldPlaceHolder");
324− tryCompare(label, "text", lockscreen.wrongPlaceholderText)
326+ if (!data.alphanumeric) {
327+ var label = findChild(lockscreen, "wrongNoticeLabel");
328+ tryCompare(label, "visible", true)
325329 }
326330 }
327331
@@ -343,24 +347,21 @@ Rectangle {
343347 maxPinLengthTextField.text = data.maxPinLength
344348 waitForLockscreenReady();
345349
346− var pinPadButtonErase = findChild(lockscreen, "pinPadButtonErase");
347350 var backspaceIcon = findChild(lockscreen, "backspaceIcon");
348351 var pinEntryField = findChild(lockscreen, "pinentryField");
349352
350− var autoConfirmEnabled = data.minPinLength === data.maxPinLength && data.minPinLength !== -1;
351− compare(pinPadButtonErase.iconName, autoConfirmEnabled ? "erase" : "");
352− compare(backspaceIcon.visible, !autoConfirmEnabled);
353+ compare(backspaceIcon.opacity, 0);
353354
354355 var pinPadButton5 = findChild(lockscreen, "pinPadButton5");
355356 mouseClick(pinPadButton5, units.gu(1), units.gu(1));
356357 compare(pinEntryField.text, "5");
357358
358− if (data.minPinLength !== data.maxPinLength) {
359− mouseClick(backspaceIcon, units.gu(1), units.gu(1));
360− } else {
361− mouseClick(pinPadButtonErase, units.gu(1), units.gu(1));
362− }
359+ tryCompare(backspaceIcon, "opacity", 1);
360+
361+ mouseClick(backspaceIcon, units.gu(1), units.gu(1));
363362 compare(pinEntryField.text, "");
363+
364+ tryCompare(backspaceIcon, "opacity", 0);
364365 }
365366
366367 function test_minMaxLength_data() {
@@ -373,37 +374,55 @@ Rectangle {
373374
374375 function test_minMaxLength(data) {
375376 pinPadCheckBox.checked = false
376− minPinLengthTextField.text = data.minPinLength
377− maxPinLengthTextField.text = data.maxPinLength
377+ minPinLengthTextField.text = data.minPinLength;
378+ maxPinLengthTextField.text = data.maxPinLength;
378379 waitForLockscreenReady();
379380
380381 var pinPadButton5 = findChild(lockscreen, "pinPadButton5");
381− var pinPadButtonErase = findChild(lockscreen, "pinPadButtonErase");
382− var inputField = findChild(lockscreen, "pinentryField")
382+ var backspaceButton = findChild(lockscreen, "backspaceIcon");
383+ var confirmButton = findChild(lockscreen, "confirmButton");
384+ var inputField = findChild(lockscreen, "pinentryField");
385+
386+ tryCompare(backspaceButton, "opacity", 0);
387+
388+ tryCompare(confirmButton, "visible", (data.minPinLength != data.maxPinLength) || (data.minPinLength == -1));
383389
384390 for (var i = 0; i < 10; i++) {
385391 mouseClick(pinPadButton5, units.gu(1), units.gu(1));
392+ tryCompare(backspaceButton, "opacity", 1)
386393
387− if (data.minPinLength == data.maxPinLength && data.minPinLength != -1) {
388− // auto confirm mode...
389− compare(inputField.text.length, (i+1) % data.minPinLength);
394+ if (data.maxPinLength == data.minPinLength && data.minPinLength > 0) {
395+ // Autoconfirm mode. This will automatically confirm (and with it reset)
396+ // the textfield every data.minPinLength presses
397+ if (i+1 < data.minPinLength) {
398+ compare(inputField.text.length, i + 1);
399+ } else {
400+ compare(inputField.text.length, (i+1) % data.minPinLength)
401+ }
390402 } else {
391− // manual confirm mode
392− tryCompare(pinPadButtonErase, "enabled", (i+1) >= data.minPinLength)
393403 if (data.maxPinLength == -1) {
404+ // Undefined maxLength... make sure all presses are recorded
394405 compare(inputField.text.length, i+1);
395406 } else {
407+ // We have a max length. Make sure we're only accepting maxLength presses
396408 compare(inputField.text.length, Math.min(data.maxPinLength, i+1));
397409 }
398410
411+ if (data.minPinLength == -1) {
412+ // Undefined minLength. Make sure confirm button is always enabled
413+ compare(confirmButton.enabled, true);
414+ } else {
415+ // We have a min length. Make sure the confirm button is only enabled when met.
416+ compare(confirmButton.enabled, (i+1) >= data.minPinLength);
417+ }
399418 }
400419 }
401420 }
402421
403422 function test_retryDisplay_data() {
404423 return [
405− {tag: "empty", retryText: "", shown: false},
406− {tag: "3 retries left", retryText: "3 retries left", shown: true},
424+ {tag: "empty", retryText: " "},
425+ {tag: "3 retries left", retryText: "3 retries left"},
407426 ]
408427 }
409428
@@ -412,8 +431,8 @@ Rectangle {
412431 waitForLockscreenReady();
413432
414433 retryCountTextField.text = data.retryText;
415− var label = findChild(lockscreen, "retryCountLabel")
416− compare(label.visible, data.shown);
434+ var label = findChild(lockscreen, "retryLabel")
435+ compare(label.text, data.retryText);
417436 }
418437
419438 function test_infoPopup() {
@@ -438,8 +457,8 @@ Rectangle {
438457
439458 function test_infoTextDisplay_data() {
440459 return [
441− {tag: "empty string", text: "", shown: false},
442− {tag: "hello world", text: "hello world", shown: true},
460+ {tag: "empty string", text: ""},
461+ {tag: "hello world", text: "hello world"},
443462 ]
444463 }
445464
@@ -449,7 +468,7 @@ Rectangle {
449468
450469 infoTextTextField.text = data.text;
451470 var label = findChild(lockscreen, "infoTextLabel")
452− compare(label.visible, data.shown);
471+ compare(label.text, data.text);
453472 }
454473 }
455474
tests/qmltests/Panel/Indicators/tst_CachedUnityMenuModel.qmlnew file+137
@@ -0,0 +1,137 @@
1+/*
2+ * Copyright 2014 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import QtTest 1.0
19+import Unity.Test 0.1 as UT
20+import QMenuModel 0.1
21+import Unity.Indicators 0.1 as Indicators
22+import "../../../../qml/Panel/Indicators"
23+
24+Item {
25+ id: root
26+ width: units.gu(40)
27+ height: units.gu(70)
28+
29+ Component {
30+ id: model
31+ CachedUnityMenuModel {}
32+ }
33+
34+ UT.UnityTestCase {
35+ name: "CachedUnityMenuModel"
36+ when: windowShown
37+
38+ function cleanup() {
39+ doGC();
40+ }
41+
42+ function doGC() {
43+ // need to put some wait cycles here to get gc going properly.
44+ wait(10);
45+ gc();
46+ wait(10);
47+ }
48+
49+ function test_createDifferent() {
50+ var cachedObject = model.createObject(null,
51+ {
52+ "busName": "com.canonical.test1",
53+ "menuObjectPath": "/com/canonical/test1",
54+ "actionsObjectPath": "/com/canonical/test1"
55+ });
56+
57+ var cachedObject2 = model.createObject(null,
58+ {
59+ "busName": "com.canonical.test2",
60+ "menuObjectPath": "/com/canonical/test2",
61+ "actionsObjectPath": "/com/canonical/test2"
62+ });
63+
64+ verify(cachedObject.model !== cachedObject2.model);
65+ }
66+
67+ function test_createSame() {
68+ var cachedObject = model.createObject(null,
69+ {
70+ "busName": "com.canonical.test3",
71+ "menuObjectPath": "/com/canonical/test3",
72+ "actionsObjectPath": "/com/canonical/test3"
73+ });
74+
75+ var cachedObject2 = model.createObject(null,
76+ {
77+ "busName": "com.canonical.test3",
78+ "menuObjectPath": "/com/canonical/test3",
79+ "actionsObjectPath": "/com/canonical/test3"
80+ });
81+
82+ verify(cachedObject.model === cachedObject2.model);
83+ }
84+
85+ // Tests that changing cached model data does not change the model path of others
86+ function test_lp1328646() {
87+ var cachedObject = model.createObject(null,
88+ {
89+ "busName": "com.canonical.test4",
90+ "menuObjectPath": "/com/canonical/test4",
91+ "actionsObjectPath": "/com/canonical/test4"
92+ });
93+
94+ var cachedObject2 = model.createObject(null,
95+ {
96+ "busName": "com.canonical.test4",
97+ "menuObjectPath": "/com/canonical/test4",
98+ "actionsObjectPath": "/com/canonical/test4"
99+ });
100+
101+ cachedObject.menuObjectPath = "/com/canonical/test5";
102+ compare(cachedObject.model.menuObjectPath, "/com/canonical/test5");
103+ compare(cachedObject2.model.menuObjectPath, "/com/canonical/test4");
104+
105+ verify(cachedObject.model !== cachedObject2.model);
106+ }
107+
108+ function createAndDestroy(test) {
109+ var cachedObject = model.createObject(null,
110+ {
111+ "busName": "com.canonical."+test,
112+ "menuObjectPath": "/com/canonical/"+test,
113+ "actionsObjectPath": "/com/canonical/"+test
114+ });
115+ var cachedObject2 = model.createObject(null,
116+ {
117+ "busName": "com.canonical."+test,
118+ "menuObjectPath": "/com/canonical/"+test,
119+ "actionsObjectPath": "/com/canonical/"+test
120+ });
121+ cachedObject.destroy();
122+ return cachedObject2;
123+ }
124+
125+ function test_destroyAllDeletesModel() {
126+ createAndDestroy("test6");
127+ doGC();
128+ compare(Indicators.UnityMenuModelCache.contains("/com/canonical/test6"), false);
129+ }
130+
131+ function test_destroyPartialKeepsModel() {
132+ var model = createAndDestroy("test7");
133+ doGC();
134+ compare(Indicators.UnityMenuModelCache.contains("/com/canonical/test7"), true);
135+ }
136+ }
137+}
tests/qmltests/tst_Shell.qml+32
@@ -21,6 +21,7 @@ import QtQuick 2.0
2121import QtTest 1.0
2222import GSettings 1.0
2323import LightDM 0.1 as LightDM
24+import Ubuntu.Connectivity 0.1
2425import Unity.Application 0.1
2526import Unity.Test 0.1 as UT
2627import Powerd 0.1
@@ -28,6 +29,7 @@ import Powerd 0.1
2829import "../../qml"
2930
3031Item {
32+ id: root
3133 width: shell.width
3234 height: shell.height
3335
@@ -51,6 +53,11 @@ Item {
5153 id: shell
5254 }
5355
56+ Component {
57+ id: shellComponent
58+ Shell {}
59+ }
60+
5461 SignalSpy {
5562 id: sessionSpy
5663 signalName: "sessionStarted"
@@ -61,6 +68,12 @@ Item {
6168 signalName: "setCurrentScopeCalled"
6269 }
6370
71+ SignalSpy {
72+ id: unlockAllModemsSpy
73+ target: Connectivity
74+ signalName: "unlockingAllModems"
75+ }
76+
6477 UT.UnityTestCase {
6578 name: "Shell"
6679 when: windowShown
@@ -431,5 +444,24 @@ Item {
431444
432445 touchRelease(shell);
433446 }
447+
448+ function test_unlockedProperties() {
449+ // Confirm that various properties have the correct values when unlocked
450+ tryCompare(shell, "locked", false)
451+
452+ var launcher = findChild(shell, "launcher")
453+ tryCompare(launcher, "available", true)
454+
455+ var indicators = findChild(shell, "indicators")
456+ tryCompare(indicators, "available", true)
457+ }
458+
459+ function test_unlockAllModemsOnBoot() {
460+ unlockAllModemsSpy.clear()
461+ // actually create an object so we notice the onCompleted signal
462+ var greeter = shellComponent.createObject(root)
463+ tryCompare(unlockAllModemsSpy, "count", 1)
464+ greeter.destroy()
465+ }
434466 }
435467}
tests/qmltests/tst_ShellWithPin.qml+26−11
@@ -15,6 +15,7 @@
1515 */
1616
1717import QtQuick 2.0
18+import Ubuntu.Components 1.0
1819import QtTest 1.0
1920import AccountsService 0.1
2021import GSettings 1.0
@@ -28,7 +29,7 @@ import "../../qml"
2829
2930Item {
3031 id: root
31− width: shell.width
32+ width: shell.width + units.gu(20)
3233 height: shell.height
3334
3435 QtObject {
@@ -49,6 +50,20 @@ Item {
4950
5051 Shell {
5152 id: shell
53+ maxFailedLogins: maxRetriesTextField.text
54+ }
55+ Column {
56+ anchors { top: parent.top; right: parent.right; bottom: parent.bottom; margins:units.gu(1) }
57+ width: units.gu(18)
58+
59+ Label {
60+ text: "Max retries:"
61+ color: "black"
62+ }
63+ TextField {
64+ id: maxRetriesTextField
65+ text: "-1"
66+ }
5267 }
5368
5469 SignalSpy {
@@ -74,7 +89,7 @@ Item {
7489 function init() {
7590 swipeAwayGreeter()
7691 shell.failedLoginsDelayAttempts = -1
77− shell.maxFailedLogins = -1
92+ maxRetriesTextField.text = "-1"
7893 }
7994
8095 function cleanup() {
@@ -139,7 +154,7 @@ Item {
139154 function test_emergencyCall() {
140155 var greeter = findChild(shell, "greeter")
141156 var lockscreen = findChild(shell, "lockscreen")
142− var emergencyButton = findChild(lockscreen, "emergencyCallIcon")
157+ var emergencyButton = findChild(lockscreen, "emergencyCallLabel")
143158 var panel = findChild(shell, "panel")
144159 var indicators = findChild(shell, "indicators")
145160 var launcher = findChild(shell, "launcher")
@@ -170,7 +185,7 @@ Item {
170185
171186 function test_emergencyCallCrash() {
172187 var lockscreen = findChild(shell, "lockscreen")
173− var emergencyButton = findChild(lockscreen, "emergencyCallIcon")
188+ var emergencyButton = findChild(lockscreen, "emergencyCallLabel")
174189 mouseClick(emergencyButton, units.gu(1), units.gu(1))
175190
176191 tryCompare(lockscreen, "shown", false)
@@ -180,7 +195,7 @@ Item {
180195
181196 function test_emergencyCallAppLaunch() {
182197 var lockscreen = findChild(shell, "lockscreen")
183− var emergencyButton = findChild(lockscreen, "emergencyCallIcon")
198+ var emergencyButton = findChild(lockscreen, "emergencyCallLabel")
184199 mouseClick(emergencyButton, units.gu(1), units.gu(1))
185200
186201 tryCompare(lockscreen, "shown", false)
@@ -201,21 +216,21 @@ Item {
201216 function test_wrongEntries() {
202217 shell.failedLoginsDelayAttempts = 3
203218
204− var placeHolder = findChild(shell, "pinentryFieldPlaceHolder")
205− tryCompare(placeHolder, "text", "Enter your passcode")
219+ var placeHolder = findChild(shell, "wrongNoticeLabel")
220+ tryCompare(placeHolder, "text", "")
206221
207222 enterPin("1111")
208− tryCompare(placeHolder, "text", "Incorrect passcode\nPlease re-enter")
223+ tryCompare(placeHolder, "text", "Sorry, incorrect PIN")
209224
210225 enterPin("1111")
211− tryCompare(placeHolder, "text", "Incorrect passcode\nPlease re-enter")
226+ tryCompare(placeHolder, "text", "Sorry, incorrect PIN")
212227
213228 enterPin("1111")
214− tryCompare(placeHolder, "text", "Too many incorrect attempts\nPlease wait")
229+ tryCompare(placeHolder, "text", "Too many incorrect attempts")
215230 }
216231
217232 function test_factoryReset() {
218− shell.maxFailedLogins = 3
233+ maxRetriesTextField.text = "3"
219234 resetSpy.clear()
220235
221236 enterPin("1111")