on xenial help sign in
merge lp:unity8
26ed56eAlberto Aguirre
@@ -154,6 +154,10 @@ So, for the DragHandle component that would be:
154
154
155$ make testDragHandle
155$ make testDragHandle
156
156
157+To run the tests for a single component/class under gdb (so you can catch SEGFAULTS)
158+
159+$ make gdbtestComponentName
160+
157To run a test application that allow you to manually test or to simply try out
161To run a test application that allow you to manually test or to simply try out
158a given component:
162a given component:
159
163
cmake/modules/QmlTest.cmake+8
@@ -12,6 +12,7 @@
12# Two targets will be created:
12# Two targets will be created:
13# - testComponentName - Runs the test with qmltestrunner
13# - testComponentName - Runs the test with qmltestrunner
14# - tryComponentName - Runs the test with uqmlscene, for manual interaction
14# - tryComponentName - Runs the test with uqmlscene, for manual interaction
15+# - gdbtestComponentName - Runs the test with qmltestrunner under gdb
15#
16#
16# To change/set a default value for the whole test suite, prior to calling add_qml_test, set:
17# To change/set a default value for the whole test suite, prior to calling add_qml_test, set:
17# qmltest_DEFAULT_NO_ADD_TEST (default: FALSE)
18# qmltest_DEFAULT_NO_ADD_TEST (default: FALSE)
@@ -81,6 +82,7 @@ macro(add_qml_test_internal SUBPATH COMPONENT_NAME ITERATIONS)
81 cmake_parse_arguments(qmltest_default "${options}" "" "${multi_value_keywords}" ${qmltest_DEFAULT_PROPERTIES})
82 cmake_parse_arguments(qmltest_default "${options}" "" "${multi_value_keywords}" ${qmltest_DEFAULT_PROPERTIES})
82
83
83 set(qmltest_TARGET test${COMPONENT_NAME})
84 set(qmltest_TARGET test${COMPONENT_NAME})
85+ set(qmltest_gdb_TARGET gdbtest${COMPONENT_NAME})
84 set(qmltest_xvfb_TARGET xvfbtest${COMPONENT_NAME})
86 set(qmltest_xvfb_TARGET xvfbtest${COMPONENT_NAME})
85 set(qmltest_FILE ${SUBPATH}/tst_${COMPONENT_NAME})
87 set(qmltest_FILE ${SUBPATH}/tst_${COMPONENT_NAME})
86
88
@@ -138,8 +140,14 @@ macro(add_qml_test_internal SUBPATH COMPONENT_NAME ITERATIONS)
138 ${function_ARGS}
140 ${function_ARGS}
139 )
141 )
140
142
143+ set(qmltest_gdb_command
144+ env ${test_env} ${qmltest_ENVIRONMENT} ${LD_PRELOAD_PATH}
145+ gdb -e ${qmltestrunner_exe} -ex \"run -input ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml ${qmltestrunner_imports} ${ITERATIONS_STRING}\"
146+ )
147+
141 add_qmltest_target(${qmltest_TARGET} "${qmltest_command}" TRUE ${qmltest_NO_ADD_TEST})
148 add_qmltest_target(${qmltest_TARGET} "${qmltest_command}" TRUE ${qmltest_NO_ADD_TEST})
142 add_qmltest_target(${qmltest_xvfb_TARGET} "${qmltest_xvfb_command}" ${qmltest_NO_TARGETS} TRUE)
149 add_qmltest_target(${qmltest_xvfb_TARGET} "${qmltest_xvfb_command}" ${qmltest_NO_TARGETS} TRUE)
150+ add_qmltest_target(${qmltest_gdb_TARGET} "${qmltest_gdb_command}" TRUE TRUE)
143 add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
151 add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
144endmacro(add_qml_test_internal)
152endmacro(add_qml_test_internal)
145
153
data/unity8.conf+5−1
@@ -34,11 +34,15 @@ pre-start script
34 gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
34 gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
35 fi
35 fi
36
36
37− # Remove the socket if still there
37+ # Remove the normal and trusted sockets if still there
38 if [ -S "$MIR_SERVER_FILE" ]; then
38 if [ -S "$MIR_SERVER_FILE" ]; then
39 rm "$MIR_SERVER_FILE"
39 rm "$MIR_SERVER_FILE"
40 fi
40 fi
41
41
42+ if [ -S "${MIR_SERVER_FILE}_trusted" ]; then
43+ rm "${MIR_SERVER_FILE}_trusted"
44+ fi
45+
42 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
46 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
43
47
44 initctl emit --no-wait indicator-services-start
48 initctl emit --no-wait indicator-services-start
debian/changelog+41
@@ -1,3 +1,44 @@
1+unity8 (8.00+14.10.20140930.2-0ubuntu1) utopic; urgency=low
2+
3+ [ Alexandros Frantzis ]
4+ * Remove stale trusted socket before starting unity8 from upstart (LP:
5+ #1371597) (LP: #1371597)
6+
7+ [ CI bot ]
8+ * Resync trunk
9+
10+ [ Andrea Cimitan ]
11+ * Move activity indicator on top of keyboard (LP: #1354519)
12+
13+ [ Gerry Boland ]
14+ * Cleanup: Remove unused member and fix small syntax error in
15+ OrientationLock
16+
17+ [ josharenson ]
18+ * Fix lp:1367894 by correcting how the minute value is calculated in
19+ the panel. (LP: #1367894)
20+
21+ [ Nick Dedekind ]
22+ * Fixed DefaultIndicatorPage test. Fixed warnings from test.
23+
24+ [ Ying-Chun Liu ]
25+ * Remove maxLineCount in preview. (LP: 1328513) (LP: #1328513)
26+
27+ [ Michael Terry ]
28+ * Fix some code that accidentally landed in trunk before it got
29+ cleaned up. The current code just has some duplication to it that
30+ should be unified.
31+ * Implement latest visual designs for passphrase lockscreen.
32+ * Make it easier to use the Lockscreen component from the welcome
33+ wizard.
34+ * Limit how much memory we reserve for the greeter background image,
35+ allowing giant images to appear correctly.
36+
37+ [ Daniel d'Andrada ]
38+ * Add gdbTestComponentName build targets
39+
40+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 30 Sep 2014 16:57:28 +0000
41+
1unity8 (8.00+14.10.20140926-0ubuntu1) utopic; urgency=low
42unity8 (8.00+14.10.20140926-0ubuntu1) utopic; urgency=low
2
43
3 [ CI bot ]
44 [ CI bot ]
plugins/Unity/Session/orientationlock.cpp+6−6
@@ -24,16 +24,16 @@ OrientationLock::OrientationLock(QObject *parent)
24 , m_enabled(false)
24 , m_enabled(false)
25 , m_savedOrientation(Qt::PortraitOrientation)
25 , m_savedOrientation(Qt::PortraitOrientation)
26{
26{
27− systemSettings = g_settings_new("com.ubuntu.touch.system");
27+ m_systemSettings = g_settings_new("com.ubuntu.touch.system");
28− g_signal_connect(systemSettings, "changed::rotation-lock",
28+ g_signal_connect(m_systemSettings, "changed::rotation-lock",
29 G_CALLBACK(OrientationLock::onEnabledChangedProxy), this);
29 G_CALLBACK(OrientationLock::onEnabledChangedProxy), this);
30− m_enabled = g_settings_get_boolean(systemSettings, "rotation-lock");
30+ m_enabled = g_settings_get_boolean(m_systemSettings, "rotation-lock");
31}
31}
32
32
33OrientationLock::~OrientationLock()
33OrientationLock::~OrientationLock()
34{
34{
35− g_signal_handlers_disconnect_by_data(systemSettings, this);
35+ g_signal_handlers_disconnect_by_data(m_systemSettings, this);
36− g_object_unref(systemSettings);
36+ g_object_unref(m_systemSettings);
37}
37}
38
38
39bool OrientationLock::enabled() const
39bool OrientationLock::enabled() const
@@ -54,7 +54,7 @@ void OrientationLock::onEnabledChangedProxy(GSettings */*settings*/, const gchar
54
54
55void OrientationLock::onEnabledChanged()
55void OrientationLock::onEnabledChanged()
56{
56{
57− const bool enabled = g_settings_get_boolean(systemSettings, "rotation-lock");
57+ const bool enabled = g_settings_get_boolean(m_systemSettings, "rotation-lock");
58 if (m_enabled != enabled) {
58 if (m_enabled != enabled) {
59 m_enabled = enabled;
59 m_enabled = enabled;
60 Q_EMIT enabledChanged();
60 Q_EMIT enabledChanged();
plugins/Unity/Session/orientationlock.h+1−3
@@ -19,7 +19,6 @@
19
19
20#include <gio/gio.h>
20#include <gio/gio.h>
21#include <QtCore/QObject>
21#include <QtCore/QObject>
22−#include <QtDBus/QDBusInterface>
23
22
24/**
23/**
25 * @brief The OrientationLock class exports orientation lock related properties to QML
24 * @brief The OrientationLock class exports orientation lock related properties to QML
@@ -52,8 +51,7 @@ private Q_SLOTS:
52 void onEnabledChanged();
51 void onEnabledChanged();
53
52
54private:
53private:
55− QDBusInterface *dbusInterface;
54+ GSettings *m_systemSettings;
56− GSettings *systemSettings;
57
55
58 bool m_enabled;
56 bool m_enabled;
59 Qt::ScreenOrientation m_savedOrientation;
57 Qt::ScreenOrientation m_savedOrientation;
po/br.po+5−5
@@ -8,13 +8,13 @@ msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-08-26 08:28+0000\n"
11+"PO-Revision-Date: 2014-09-30 06:25+0000\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
13"Language-Team: Breton <br@li.org>\n"
13"Language-Team: Breton <br@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
17+"X-Launchpad-Export-Date: 2014-10-01 06:25+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
18"X-Generator: Launchpad (build 17196)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:130
20#: plugins/LightDM/Greeter.cpp:130
@@ -82,7 +82,7 @@ msgstr "Lazhañ"
82
82
83#: qml/Components/Dialogs.qml:157
83#: qml/Components/Dialogs.qml:157
84msgid "Restart"
84msgid "Restart"
85−msgstr ""
85+msgstr "Adloc'hañ"
86
86
87#: qml/Components/Dialogs.qml:167
87#: qml/Components/Dialogs.qml:167
88msgid "Cancel"
88msgid "Cancel"
@@ -213,7 +213,7 @@ msgstr "Kas"
213
213
214#: qml/Dash/ScopesOverview.qml:206
214#: qml/Dash/ScopesOverview.qml:206
215msgid "Manage Scopes"
215msgid "Manage Scopes"
216−msgstr ""
216+msgstr "Merañ ar c'hefluskerioù enklask"
217
217
218#: qml/Dash/ScopesOverview.qml:428
218#: qml/Dash/ScopesOverview.qml:428
219msgid "Done"
219msgid "Done"
@@ -277,7 +277,7 @@ msgstr "Kendiviz"
277
277
278#: qml/Panel/Indicators/MenuItemFactory.qml:600
278#: qml/Panel/Indicators/MenuItemFactory.qml:600
279msgid "Nothing is playing"
279msgid "Nothing is playing"
280−msgstr ""
280+msgstr "Ne lenner netra bremañ"
281
281
282#: qml/Panel/Indicators/MenuItemFactory.qml:748
282#: qml/Panel/Indicators/MenuItemFactory.qml:748
283msgid "In queue…"
283msgid "In queue…"
po/de.po+28−28
@@ -8,25 +8,25 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-23 08:31+0000\n"
11+"PO-Revision-Date: 2014-09-29 06:33+0000\n"
12−"Last-Translator: Martin Pitt <martin.pitt@ubuntu.com>\n"
12+"Last-Translator: Niklas Wenzel <nikwen.developer@gmail.com>\n"
13"Language-Team: German <de@li.org>\n"
13"Language-Team: German <de@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
17+"X-Launchpad-Export-Date: 2014-09-30 07:10+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
18"X-Generator: Launchpad (build 17196)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:130
20#: plugins/LightDM/Greeter.cpp:130
21msgid "Password: "
21msgid "Password: "
22msgstr "Passwort: "
22msgstr "Passwort: "
23
23
24−#: plugins/Unity/Launcher/launcheritem.cpp:45
24+#: plugins/Unity/Launcher/launcheritem.cpp:44
25−#: plugins/Unity/Launcher/launcheritem.cpp:91
25+#: plugins/Unity/Launcher/launcheritem.cpp:74
26msgid "Pin shortcut"
26msgid "Pin shortcut"
27msgstr "Verknüpfung anheften"
27msgstr "Verknüpfung anheften"
28
28
29−#: plugins/Unity/Launcher/launcheritem.cpp:91
29+#: plugins/Unity/Launcher/launcheritem.cpp:74
30msgid "Unpin shortcut"
30msgid "Unpin shortcut"
31msgstr "Verknüpfung entfernen"
31msgstr "Verknüpfung entfernen"
32
32
@@ -164,15 +164,15 @@ msgstr "Hallo %1"
164msgid "Hello"
164msgid "Hello"
165msgstr "Hallo"
165msgstr "Hallo"
166
166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:533
167+#: qml/Dash/GenericScopeView.qml:364 qml/Dash/GenericScopeView.qml:483
168msgid "See less"
168msgid "See less"
169msgstr "Weniger ansehen"
169msgstr "Weniger ansehen"
170
170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:364
172msgid "See all"
172msgid "See all"
173msgstr "Alle anzeigen"
173msgstr "Alle anzeigen"
174
174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:427 qml/Dash/PageHeader.qml:258
176#: qml/Panel/SearchIndicator.qml:27
176#: qml/Panel/SearchIndicator.qml:27
177msgid "Search"
177msgid "Search"
178msgstr "Suchen"
178msgstr "Suchen"
@@ -211,7 +211,7 @@ msgstr "Senden"
211
211
212#: qml/Dash/ScopesOverview.qml:206
212#: qml/Dash/ScopesOverview.qml:206
213msgid "Manage Scopes"
213msgid "Manage Scopes"
214−msgstr ""
214+msgstr "Filter verwalten"
215
215
216#: qml/Dash/ScopesOverview.qml:428
216#: qml/Dash/ScopesOverview.qml:428
217msgid "Done"
217msgid "Done"
@@ -275,29 +275,29 @@ msgstr "Konferenz"
275
275
276#: qml/Panel/Indicators/MenuItemFactory.qml:600
276#: qml/Panel/Indicators/MenuItemFactory.qml:600
277msgid "Nothing is playing"
277msgid "Nothing is playing"
278−msgstr ""
278+msgstr "Nichts wird abgespielt"
279
279
280−#: qml/Panel/Indicators/MenuItemFactory.qml:748
280+#: qml/Panel/Indicators/MenuItemFactory.qml:651
281msgid "In queue…"
281msgid "In queue…"
282msgstr "In Warteschlange …"
282msgstr "In Warteschlange …"
283
283
284−#: qml/Panel/Indicators/MenuItemFactory.qml:752
284+#: qml/Panel/Indicators/MenuItemFactory.qml:655
285msgid "Downloading"
285msgid "Downloading"
286msgstr "Wird heruntergeladen"
286msgstr "Wird heruntergeladen"
287
287
288−#: qml/Panel/Indicators/MenuItemFactory.qml:754
288+#: qml/Panel/Indicators/MenuItemFactory.qml:657
289msgid "Paused, tap to resume"
289msgid "Paused, tap to resume"
290msgstr "Pausiert, tippen Sie zum fortsetzen"
290msgstr "Pausiert, tippen Sie zum fortsetzen"
291
291
292−#: qml/Panel/Indicators/MenuItemFactory.qml:756
292+#: qml/Panel/Indicators/MenuItemFactory.qml:659
293msgid "Canceled"
293msgid "Canceled"
294msgstr "Abgebrochen"
294msgstr "Abgebrochen"
295
295
296−#: qml/Panel/Indicators/MenuItemFactory.qml:758
296+#: qml/Panel/Indicators/MenuItemFactory.qml:661
297msgid "Finished"
297msgid "Finished"
298msgstr "Erledigt"
298msgstr "Erledigt"
299
299
300−#: qml/Panel/Indicators/MenuItemFactory.qml:760
300+#: qml/Panel/Indicators/MenuItemFactory.qml:663
301msgid "Failed, tap to retry"
301msgid "Failed, tap to retry"
302msgstr "Fehlgeschlagen, tippen Sie zum Wiederholen"
302msgstr "Fehlgeschlagen, tippen Sie zum Wiederholen"
303
303
@@ -309,45 +309,45 @@ msgstr "SIM-Karte entsperren"
309msgid "Roaming"
309msgid "Roaming"
310msgstr "Roaming"
310msgstr "Roaming"
311
311
312−#: qml/Shell.qml:320
312+#: qml/Shell.qml:292
313msgid "Enter your passphrase"
313msgid "Enter your passphrase"
314msgstr "Geben Sie Ihr Passwort ein"
314msgstr "Geben Sie Ihr Passwort ein"
315
315
316−#: qml/Shell.qml:321
316+#: qml/Shell.qml:293
317msgid "Sorry, incorrect passphrase"
317msgid "Sorry, incorrect passphrase"
318msgstr "Das Passwort ist nicht korrekt"
318msgstr "Das Passwort ist nicht korrekt"
319
319
320−#: qml/Shell.qml:323
320+#: qml/Shell.qml:295
321msgid "Enter your passcode"
321msgid "Enter your passcode"
322msgstr "Passwort eingeben"
322msgstr "Passwort eingeben"
323
323
324−#: qml/Shell.qml:324
324+#: qml/Shell.qml:296
325msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
326msgstr "Falsches Passwort"
326msgstr "Falsches Passwort"
327
327
328−#: qml/Shell.qml:327
328+#: qml/Shell.qml:299
329#, qt-format
329#, qt-format
330msgid "Enter your %1"
330msgid "Enter your %1"
331msgstr "%1 eingeben"
331msgstr "%1 eingeben"
332
332
333−#: qml/Shell.qml:328
333+#: qml/Shell.qml:300
334#, qt-format
334#, qt-format
335msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
336msgstr "%1 falsch"
336msgstr "%1 falsch"
337
337
338−#: qml/Shell.qml:363
338+#: qml/Shell.qml:335
339msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
340msgstr "Falsches Passwort."
340msgstr "Falsches Passwort."
341
341
342−#: qml/Shell.qml:364
342+#: qml/Shell.qml:336
343msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
344msgstr "Falsche PIN"
344msgstr "Falsche PIN"
345
345
346−#: qml/Shell.qml:365
346+#: qml/Shell.qml:337
347msgid "This will be your last attempt."
347msgid "This will be your last attempt."
348msgstr "Dies ist Ihr letzter Versuch."
348msgstr "Dies ist Ihr letzter Versuch."
349
349
350−#: qml/Shell.qml:367
350+#: qml/Shell.qml:339
351msgid ""
351msgid ""
352"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
353"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
@@ -355,7 +355,7 @@ msgstr ""
355"Wird das Passwort falsch eingegeben, wird das Telefon auf den Werkszustand "
355"Wird das Passwort falsch eingegeben, wird das Telefon auf den Werkszustand "
356"zurückgesetzt und alle Daten werden gelöscht."
356"zurückgesetzt und alle Daten werden gelöscht."
357
357
358−#: qml/Shell.qml:368
358+#: qml/Shell.qml:340
359msgid ""
359msgid ""
360"If passcode is entered incorrectly, your phone will conduct a factory reset "
360"If passcode is entered incorrectly, your phone will conduct a factory reset "
361"and all personal data will be deleted."
361"and all personal data will be deleted."
po/es.po+28−28
@@ -8,25 +8,25 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-23 04:06+0000\n"
11+"PO-Revision-Date: 2014-09-29 20:25+0000\n"
12−"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
12+"Last-Translator: Víctor R. Ruiz <Unknown>\n"
13"Language-Team: Spanish <es@li.org>\n"
13"Language-Team: Spanish <es@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
17+"X-Launchpad-Export-Date: 2014-09-30 07:10+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
18"X-Generator: Launchpad (build 17196)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:130
20#: plugins/LightDM/Greeter.cpp:130
21msgid "Password: "
21msgid "Password: "
22msgstr "Contraseña: "
22msgstr "Contraseña: "
23
23
24−#: plugins/Unity/Launcher/launcheritem.cpp:45
24+#: plugins/Unity/Launcher/launcheritem.cpp:44
25−#: plugins/Unity/Launcher/launcheritem.cpp:91
25+#: plugins/Unity/Launcher/launcheritem.cpp:74
26msgid "Pin shortcut"
26msgid "Pin shortcut"
27msgstr "Anclar"
27msgstr "Anclar"
28
28
29−#: plugins/Unity/Launcher/launcheritem.cpp:91
29+#: plugins/Unity/Launcher/launcheritem.cpp:74
30msgid "Unpin shortcut"
30msgid "Unpin shortcut"
31msgstr "Desanclar"
31msgstr "Desanclar"
32
32
@@ -164,15 +164,15 @@ msgstr "Hola, %1"
164msgid "Hello"
164msgid "Hello"
165msgstr "Hola"
165msgstr "Hola"
166
166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:533
167+#: qml/Dash/GenericScopeView.qml:364 qml/Dash/GenericScopeView.qml:483
168msgid "See less"
168msgid "See less"
169msgstr "Ver menos"
169msgstr "Ver menos"
170
170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:364
172msgid "See all"
172msgid "See all"
173msgstr "Ver todo"
173msgstr "Ver todo"
174
174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:427 qml/Dash/PageHeader.qml:258
176#: qml/Panel/SearchIndicator.qml:27
176#: qml/Panel/SearchIndicator.qml:27
177msgid "Search"
177msgid "Search"
178msgstr "Buscar"
178msgstr "Buscar"
@@ -211,7 +211,7 @@ msgstr "Enviar"
211
211
212#: qml/Dash/ScopesOverview.qml:206
212#: qml/Dash/ScopesOverview.qml:206
213msgid "Manage Scopes"
213msgid "Manage Scopes"
214−msgstr ""
214+msgstr "Administrar ámbitos"
215
215
216#: qml/Dash/ScopesOverview.qml:428
216#: qml/Dash/ScopesOverview.qml:428
217msgid "Done"
217msgid "Done"
@@ -275,29 +275,29 @@ msgstr "Conferencia"
275
275
276#: qml/Panel/Indicators/MenuItemFactory.qml:600
276#: qml/Panel/Indicators/MenuItemFactory.qml:600
277msgid "Nothing is playing"
277msgid "Nothing is playing"
278−msgstr ""
278+msgstr "Ningún contenido en reproducción"
279
279
280−#: qml/Panel/Indicators/MenuItemFactory.qml:748
280+#: qml/Panel/Indicators/MenuItemFactory.qml:651
281msgid "In queue…"
281msgid "In queue…"
282msgstr "En espera…"
282msgstr "En espera…"
283
283
284−#: qml/Panel/Indicators/MenuItemFactory.qml:752
284+#: qml/Panel/Indicators/MenuItemFactory.qml:655
285msgid "Downloading"
285msgid "Downloading"
286msgstr "Descargando"
286msgstr "Descargando"
287
287
288−#: qml/Panel/Indicators/MenuItemFactory.qml:754
288+#: qml/Panel/Indicators/MenuItemFactory.qml:657
289msgid "Paused, tap to resume"
289msgid "Paused, tap to resume"
290msgstr "Pausado, toque para reanudar"
290msgstr "Pausado, toque para reanudar"
291
291
292−#: qml/Panel/Indicators/MenuItemFactory.qml:756
292+#: qml/Panel/Indicators/MenuItemFactory.qml:659
293msgid "Canceled"
293msgid "Canceled"
294msgstr "Cancelado"
294msgstr "Cancelado"
295
295
296−#: qml/Panel/Indicators/MenuItemFactory.qml:758
296+#: qml/Panel/Indicators/MenuItemFactory.qml:661
297msgid "Finished"
297msgid "Finished"
298msgstr "Finalizado"
298msgstr "Finalizado"
299
299
300−#: qml/Panel/Indicators/MenuItemFactory.qml:760
300+#: qml/Panel/Indicators/MenuItemFactory.qml:663
301msgid "Failed, tap to retry"
301msgid "Failed, tap to retry"
302msgstr "Falló, toque para reintentar"
302msgstr "Falló, toque para reintentar"
303
303
@@ -309,45 +309,45 @@ msgstr "Desbloquear SIM"
309msgid "Roaming"
309msgid "Roaming"
310msgstr "Itinerancia"
310msgstr "Itinerancia"
311
311
312−#: qml/Shell.qml:320
312+#: qml/Shell.qml:292
313msgid "Enter your passphrase"
313msgid "Enter your passphrase"
314msgstr "Escriba su contraseña"
314msgstr "Escriba su contraseña"
315
315
316−#: qml/Shell.qml:321
316+#: qml/Shell.qml:293
317msgid "Sorry, incorrect passphrase"
317msgid "Sorry, incorrect passphrase"
318msgstr "La contraseña es incorrecta"
318msgstr "La contraseña es incorrecta"
319
319
320−#: qml/Shell.qml:323
320+#: qml/Shell.qml:295
321msgid "Enter your passcode"
321msgid "Enter your passcode"
322msgstr "Escriba su código de acceso"
322msgstr "Escriba su código de acceso"
323
323
324−#: qml/Shell.qml:324
324+#: qml/Shell.qml:296
325msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
326msgstr "El código es incorrecto"
326msgstr "El código es incorrecto"
327
327
328−#: qml/Shell.qml:327
328+#: qml/Shell.qml:299
329#, qt-format
329#, qt-format
330msgid "Enter your %1"
330msgid "Enter your %1"
331msgstr "Introduzca su %1"
331msgstr "Introduzca su %1"
332
332
333−#: qml/Shell.qml:328
333+#: qml/Shell.qml:300
334#, qt-format
334#, qt-format
335msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
336msgstr "Incorrecto (%1)"
336msgstr "Incorrecto (%1)"
337
337
338−#: qml/Shell.qml:363
338+#: qml/Shell.qml:335
339msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
340msgstr "La contraseña es incorrecta."
340msgstr "La contraseña es incorrecta."
341
341
342−#: qml/Shell.qml:364
342+#: qml/Shell.qml:336
343msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
344msgstr "Código de acceso incorrecto."
344msgstr "Código de acceso incorrecto."
345
345
346−#: qml/Shell.qml:365
346+#: qml/Shell.qml:337
347msgid "This will be your last attempt."
347msgid "This will be your last attempt."
348msgstr "Este será su último intento."
348msgstr "Este será su último intento."
349
349
350−#: qml/Shell.qml:367
350+#: qml/Shell.qml:339
351msgid ""
351msgid ""
352"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
353"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
@@ -355,7 +355,7 @@ msgstr ""
355"Si se introduce la frase incorrectamente, el teléfono volverá a la "
355"Si se introduce la frase incorrectamente, el teléfono volverá a la "
356"configuración de fábrica y se perderán todos los datos personales."
356"configuración de fábrica y se perderán todos los datos personales."
357
357
358−#: qml/Shell.qml:368
358+#: qml/Shell.qml:340
359msgid ""
359msgid ""
360"If passcode is entered incorrectly, your phone will conduct a factory reset "
360"If passcode is entered incorrectly, your phone will conduct a factory reset "
361"and all personal data will be deleted."
361"and all personal data will be deleted."
po/gd.po+4−4
@@ -8,13 +8,13 @@ msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-25 12:40+0000\n"
11+"PO-Revision-Date: 2014-09-30 11:56+0000\n"
12"Last-Translator: GunChleoc <Unknown>\n"
12"Last-Translator: GunChleoc <Unknown>\n"
13"Language-Team: Fòram na Gàidhlig\n"
13"Language-Team: Fòram na Gàidhlig\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
17+"X-Launchpad-Export-Date: 2014-10-01 06:25+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
18"X-Generator: Launchpad (build 17196)\n"
19"Language: gd\n"
19"Language: gd\n"
20
20
@@ -215,7 +215,7 @@ msgstr "Cuir"
215
215
216#: qml/Dash/ScopesOverview.qml:206
216#: qml/Dash/ScopesOverview.qml:206
217msgid "Manage Scopes"
217msgid "Manage Scopes"
218−msgstr ""
218+msgstr "Stiùirich na sgòpaichean"
219
219
220#: qml/Dash/ScopesOverview.qml:428
220#: qml/Dash/ScopesOverview.qml:428
221msgid "Done"
221msgid "Done"
@@ -279,7 +279,7 @@ msgstr "Gairm co-labhairt"
279
279
280#: qml/Panel/Indicators/MenuItemFactory.qml:600
280#: qml/Panel/Indicators/MenuItemFactory.qml:600
281msgid "Nothing is playing"
281msgid "Nothing is playing"
282−msgstr ""
282+msgstr "Chan eil dad 'ga chluich"
283
283
284#: qml/Panel/Indicators/MenuItemFactory.qml:748
284#: qml/Panel/Indicators/MenuItemFactory.qml:748
285msgid "In queue…"
285msgid "In queue…"
po/it.po+5−5
@@ -8,13 +8,13 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-08-28 15:31+0000\n"
11+"PO-Revision-Date: 2014-09-30 10:56+0000\n"
12"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
12"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
13"Language-Team: Italian <it@li.org>\n"
13"Language-Team: Italian <it@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
17+"X-Launchpad-Export-Date: 2014-10-01 06:25+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
18"X-Generator: Launchpad (build 17196)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:130
20#: plugins/LightDM/Greeter.cpp:130
@@ -82,7 +82,7 @@ msgstr "Spegni"
82
82
83#: qml/Components/Dialogs.qml:157
83#: qml/Components/Dialogs.qml:157
84msgid "Restart"
84msgid "Restart"
85−msgstr ""
85+msgstr "Riavvia"
86
86
87#: qml/Components/Dialogs.qml:167
87#: qml/Components/Dialogs.qml:167
88msgid "Cancel"
88msgid "Cancel"
@@ -213,7 +213,7 @@ msgstr "Invia"
213
213
214#: qml/Dash/ScopesOverview.qml:206
214#: qml/Dash/ScopesOverview.qml:206
215msgid "Manage Scopes"
215msgid "Manage Scopes"
216−msgstr ""
216+msgstr "Gestisci Scope"
217
217
218#: qml/Dash/ScopesOverview.qml:428
218#: qml/Dash/ScopesOverview.qml:428
219msgid "Done"
219msgid "Done"
@@ -277,7 +277,7 @@ msgstr "Conferenza"
277
277
278#: qml/Panel/Indicators/MenuItemFactory.qml:600
278#: qml/Panel/Indicators/MenuItemFactory.qml:600
279msgid "Nothing is playing"
279msgid "Nothing is playing"
280−msgstr ""
280+msgstr "Niente in riproduzione"
281
281
282#: qml/Panel/Indicators/MenuItemFactory.qml:748
282#: qml/Panel/Indicators/MenuItemFactory.qml:748
283msgid "In queue…"
283msgid "In queue…"
po/nb.po+27−27
@@ -8,25 +8,25 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-20 12:02+0000\n"
11+"PO-Revision-Date: 2014-09-29 05:32+0000\n"
12"Last-Translator: Åka Sikrom <Unknown>\n"
12"Last-Translator: Åka Sikrom <Unknown>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
17+"X-Launchpad-Export-Date: 2014-09-30 07:10+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
18"X-Generator: Launchpad (build 17196)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:130
20#: plugins/LightDM/Greeter.cpp:130
21msgid "Password: "
21msgid "Password: "
22msgstr "Passord: "
22msgstr "Passord: "
23
23
24−#: plugins/Unity/Launcher/launcheritem.cpp:45
24+#: plugins/Unity/Launcher/launcheritem.cpp:44
25−#: plugins/Unity/Launcher/launcheritem.cpp:91
25+#: plugins/Unity/Launcher/launcheritem.cpp:74
26msgid "Pin shortcut"
26msgid "Pin shortcut"
27msgstr "Fest snarvei"
27msgstr "Fest snarvei"
28
28
29−#: plugins/Unity/Launcher/launcheritem.cpp:91
29+#: plugins/Unity/Launcher/launcheritem.cpp:74
30msgid "Unpin shortcut"
30msgid "Unpin shortcut"
31msgstr "Fjern snarvei"
31msgstr "Fjern snarvei"
32
32
@@ -161,15 +161,15 @@ msgstr "Hei, %1"
161msgid "Hello"
161msgid "Hello"
162msgstr "Hei"
162msgstr "Hei"
163
163
164−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:533
164+#: qml/Dash/GenericScopeView.qml:364 qml/Dash/GenericScopeView.qml:483
165msgid "See less"
165msgid "See less"
166msgstr "Vis mindre"
166msgstr "Vis mindre"
167
167
168−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:364
169msgid "See all"
169msgid "See all"
170msgstr "Vis alt"
170msgstr "Vis alt"
171
171
172−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:427 qml/Dash/PageHeader.qml:258
173#: qml/Panel/SearchIndicator.qml:27
173#: qml/Panel/SearchIndicator.qml:27
174msgid "Search"
174msgid "Search"
175msgstr "Søk"
175msgstr "Søk"
@@ -208,7 +208,7 @@ msgstr "Send"
208
208
209#: qml/Dash/ScopesOverview.qml:206
209#: qml/Dash/ScopesOverview.qml:206
210msgid "Manage Scopes"
210msgid "Manage Scopes"
211−msgstr ""
211+msgstr "Håndter virkefelt"
212
212
213#: qml/Dash/ScopesOverview.qml:428
213#: qml/Dash/ScopesOverview.qml:428
214msgid "Done"
214msgid "Done"
@@ -272,29 +272,29 @@ msgstr "Konferanse"
272
272
273#: qml/Panel/Indicators/MenuItemFactory.qml:600
273#: qml/Panel/Indicators/MenuItemFactory.qml:600
274msgid "Nothing is playing"
274msgid "Nothing is playing"
275−msgstr ""
275+msgstr "Ingenting spilles nå"
276
276
277−#: qml/Panel/Indicators/MenuItemFactory.qml:748
277+#: qml/Panel/Indicators/MenuItemFactory.qml:651
278msgid "In queue…"
278msgid "In queue…"
279msgstr "I kø …"
279msgstr "I kø …"
280
280
281−#: qml/Panel/Indicators/MenuItemFactory.qml:752
281+#: qml/Panel/Indicators/MenuItemFactory.qml:655
282msgid "Downloading"
282msgid "Downloading"
283msgstr "Laster ned"
283msgstr "Laster ned"
284
284
285−#: qml/Panel/Indicators/MenuItemFactory.qml:754
285+#: qml/Panel/Indicators/MenuItemFactory.qml:657
286msgid "Paused, tap to resume"
286msgid "Paused, tap to resume"
287msgstr "Satt på pause (trykk for å fortsette)"
287msgstr "Satt på pause (trykk for å fortsette)"
288
288
289−#: qml/Panel/Indicators/MenuItemFactory.qml:756
289+#: qml/Panel/Indicators/MenuItemFactory.qml:659
290msgid "Canceled"
290msgid "Canceled"
291msgstr "Avbrutt"
291msgstr "Avbrutt"
292
292
293−#: qml/Panel/Indicators/MenuItemFactory.qml:758
293+#: qml/Panel/Indicators/MenuItemFactory.qml:661
294msgid "Finished"
294msgid "Finished"
295msgstr "Ferdig"
295msgstr "Ferdig"
296
296
297−#: qml/Panel/Indicators/MenuItemFactory.qml:760
297+#: qml/Panel/Indicators/MenuItemFactory.qml:663
298msgid "Failed, tap to retry"
298msgid "Failed, tap to retry"
299msgstr "Feilet. Trykk for å prøve på nytt"
299msgstr "Feilet. Trykk for å prøve på nytt"
300
300
@@ -306,45 +306,45 @@ msgstr "Lås opp SIM"
306msgid "Roaming"
306msgid "Roaming"
307msgstr "Fremmednett"
307msgstr "Fremmednett"
308
308
309−#: qml/Shell.qml:320
309+#: qml/Shell.qml:292
310msgid "Enter your passphrase"
310msgid "Enter your passphrase"
311msgstr "Skriv inn passordfrasen din"
311msgstr "Skriv inn passordfrasen din"
312
312
313−#: qml/Shell.qml:321
313+#: qml/Shell.qml:293
314msgid "Sorry, incorrect passphrase"
314msgid "Sorry, incorrect passphrase"
315msgstr "Feil passordfrase"
315msgstr "Feil passordfrase"
316
316
317−#: qml/Shell.qml:323
317+#: qml/Shell.qml:295
318msgid "Enter your passcode"
318msgid "Enter your passcode"
319msgstr "Tast koden din"
319msgstr "Tast koden din"
320
320
321−#: qml/Shell.qml:324
321+#: qml/Shell.qml:296
322msgid "Sorry, incorrect passcode"
322msgid "Sorry, incorrect passcode"
323msgstr "Feil kode"
323msgstr "Feil kode"
324
324
325−#: qml/Shell.qml:327
325+#: qml/Shell.qml:299
326#, qt-format
326#, qt-format
327msgid "Enter your %1"
327msgid "Enter your %1"
328msgstr "Skriv inn %1"
328msgstr "Skriv inn %1"
329
329
330−#: qml/Shell.qml:328
330+#: qml/Shell.qml:300
331#, qt-format
331#, qt-format
332msgid "Sorry, incorrect %1"
332msgid "Sorry, incorrect %1"
333msgstr "Feil %1"
333msgstr "Feil %1"
334
334
335−#: qml/Shell.qml:363
335+#: qml/Shell.qml:335
336msgid "Sorry, incorrect passphrase."
336msgid "Sorry, incorrect passphrase."
337msgstr "Feil passordfrase."
337msgstr "Feil passordfrase."
338
338
339−#: qml/Shell.qml:364
339+#: qml/Shell.qml:336
340msgid "Sorry, incorrect passcode."
340msgid "Sorry, incorrect passcode."
341msgstr "Feil kode."
341msgstr "Feil kode."
342
342
343−#: qml/Shell.qml:365
343+#: qml/Shell.qml:337
344msgid "This will be your last attempt."
344msgid "This will be your last attempt."
345msgstr "Dette er ditt siste forsøk."
345msgstr "Dette er ditt siste forsøk."
346
346
347−#: qml/Shell.qml:367
347+#: qml/Shell.qml:339
348msgid ""
348msgid ""
349"If passphrase is entered incorrectly, your phone will conduct a factory "
349"If passphrase is entered incorrectly, your phone will conduct a factory "
350"reset and all personal data will be deleted."
350"reset and all personal data will be deleted."
@@ -352,7 +352,7 @@ msgstr ""
352"Hvis du skriver feil passordfrase en gang til, tilbakestilles telefonen til "
352"Hvis du skriver feil passordfrase en gang til, tilbakestilles telefonen til "
353"fabrikkinnstillinger, og alle personlige data slettes."
353"fabrikkinnstillinger, og alle personlige data slettes."
354
354
355−#: qml/Shell.qml:368
355+#: qml/Shell.qml:340
356msgid ""
356msgid ""
357"If passcode is entered incorrectly, your phone will conduct a factory reset "
357"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"and all personal data will be deleted."
358"and all personal data will be deleted."
po/pt_BR.po+5−5
@@ -8,13 +8,13 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-08-27 19:23+0000\n"
11+"PO-Revision-Date: 2014-09-30 17:37+0000\n"
12"Last-Translator: Rafael Neri <Unknown>\n"
12"Last-Translator: Rafael Neri <Unknown>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
17+"X-Launchpad-Export-Date: 2014-10-01 06:25+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
18"X-Generator: Launchpad (build 17196)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:130
20#: plugins/LightDM/Greeter.cpp:130
@@ -82,7 +82,7 @@ msgstr "Desligar"
82
82
83#: qml/Components/Dialogs.qml:157
83#: qml/Components/Dialogs.qml:157
84msgid "Restart"
84msgid "Restart"
85−msgstr ""
85+msgstr "Reiniciar"
86
86
87#: qml/Components/Dialogs.qml:167
87#: qml/Components/Dialogs.qml:167
88msgid "Cancel"
88msgid "Cancel"
@@ -210,7 +210,7 @@ msgstr "Enviar"
210
210
211#: qml/Dash/ScopesOverview.qml:206
211#: qml/Dash/ScopesOverview.qml:206
212msgid "Manage Scopes"
212msgid "Manage Scopes"
213−msgstr ""
213+msgstr "Gerenciar Plugins"
214
214
215#: qml/Dash/ScopesOverview.qml:428
215#: qml/Dash/ScopesOverview.qml:428
216msgid "Done"
216msgid "Done"
@@ -274,7 +274,7 @@ msgstr "Conferência"
274
274
275#: qml/Panel/Indicators/MenuItemFactory.qml:600
275#: qml/Panel/Indicators/MenuItemFactory.qml:600
276msgid "Nothing is playing"
276msgid "Nothing is playing"
277−msgstr ""
277+msgstr "Nada está tocando"
278
278
279#: qml/Panel/Indicators/MenuItemFactory.qml:748
279#: qml/Panel/Indicators/MenuItemFactory.qml:748
280msgid "In queue…"
280msgid "In queue…"
po/ug.po+24−24
@@ -14,19 +14,19 @@ msgstr ""
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
17+"X-Launchpad-Export-Date: 2014-09-30 07:10+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
18"X-Generator: Launchpad (build 17196)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:130
20#: plugins/LightDM/Greeter.cpp:130
21msgid "Password: "
21msgid "Password: "
22msgstr "ئىم: "
22msgstr "ئىم: "
23
23
24−#: plugins/Unity/Launcher/launcheritem.cpp:45
24+#: plugins/Unity/Launcher/launcheritem.cpp:44
25−#: plugins/Unity/Launcher/launcheritem.cpp:91
25+#: plugins/Unity/Launcher/launcheritem.cpp:74
26msgid "Pin shortcut"
26msgid "Pin shortcut"
27msgstr "تېزلەتمىنى قوي"
27msgstr "تېزلەتمىنى قوي"
28
28
29−#: plugins/Unity/Launcher/launcheritem.cpp:91
29+#: plugins/Unity/Launcher/launcheritem.cpp:74
30msgid "Unpin shortcut"
30msgid "Unpin shortcut"
31msgstr "تېزلەتمىنى ئېلىۋەت"
31msgstr "تېزلەتمىنى ئېلىۋەت"
32
32
@@ -161,15 +161,15 @@ msgstr "سالام %1"
161msgid "Hello"
161msgid "Hello"
162msgstr "ئەسسالامۇئەلەيكۇم"
162msgstr "ئەسسالامۇئەلەيكۇم"
163
163
164−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:533
164+#: qml/Dash/GenericScopeView.qml:364 qml/Dash/GenericScopeView.qml:483
165msgid "See less"
165msgid "See less"
166msgstr "ئازراق كۆرۈش"
166msgstr "ئازراق كۆرۈش"
167
167
168−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:364
169msgid "See all"
169msgid "See all"
170msgstr "ھەممىنى كۆرۈش…"
170msgstr "ھەممىنى كۆرۈش…"
171
171
172−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:427 qml/Dash/PageHeader.qml:258
173#: qml/Panel/SearchIndicator.qml:27
173#: qml/Panel/SearchIndicator.qml:27
174msgid "Search"
174msgid "Search"
175msgstr "ئىزدە"
175msgstr "ئىزدە"
@@ -274,27 +274,27 @@ msgstr "يىغىن"
274msgid "Nothing is playing"
274msgid "Nothing is playing"
275msgstr "ھېچ نېمە قويۇلمايۋاتىدۇ"
275msgstr "ھېچ نېمە قويۇلمايۋاتىدۇ"
276
276
277−#: qml/Panel/Indicators/MenuItemFactory.qml:748
277+#: qml/Panel/Indicators/MenuItemFactory.qml:651
278msgid "In queue…"
278msgid "In queue…"
279msgstr "قاتاردا…"
279msgstr "قاتاردا…"
280
280
281−#: qml/Panel/Indicators/MenuItemFactory.qml:752
281+#: qml/Panel/Indicators/MenuItemFactory.qml:655
282msgid "Downloading"
282msgid "Downloading"
283msgstr "چۈشۈرۈۋاتىدۇ"
283msgstr "چۈشۈرۈۋاتىدۇ"
284
284
285−#: qml/Panel/Indicators/MenuItemFactory.qml:754
285+#: qml/Panel/Indicators/MenuItemFactory.qml:657
286msgid "Paused, tap to resume"
286msgid "Paused, tap to resume"
287msgstr "توختىتىلغان، چەكسە داۋاملىشىدۇ"
287msgstr "توختىتىلغان، چەكسە داۋاملىشىدۇ"
288
288
289−#: qml/Panel/Indicators/MenuItemFactory.qml:756
289+#: qml/Panel/Indicators/MenuItemFactory.qml:659
290msgid "Canceled"
290msgid "Canceled"
291msgstr "قالدۇرۇۋېتىلدى"
291msgstr "قالدۇرۇۋېتىلدى"
292
292
293−#: qml/Panel/Indicators/MenuItemFactory.qml:758
293+#: qml/Panel/Indicators/MenuItemFactory.qml:661
294msgid "Finished"
294msgid "Finished"
295msgstr "تاماملاندى"
295msgstr "تاماملاندى"
296
296
297−#: qml/Panel/Indicators/MenuItemFactory.qml:760
297+#: qml/Panel/Indicators/MenuItemFactory.qml:663
298msgid "Failed, tap to retry"
298msgid "Failed, tap to retry"
299msgstr "مەغلۇپ بولدى، چېكىپ قايتا سىناڭ"
299msgstr "مەغلۇپ بولدى، چېكىپ قايتا سىناڭ"
300
300
@@ -306,45 +306,45 @@ msgstr "SIM نى قۇلۇپسىزلاش"
306msgid "Roaming"
306msgid "Roaming"
307msgstr "كەزمە"
307msgstr "كەزمە"
308
308
309−#: qml/Shell.qml:320
309+#: qml/Shell.qml:292
310msgid "Enter your passphrase"
310msgid "Enter your passphrase"
311msgstr "ئىمىڭىزنى كىرگۈزۈڭ"
311msgstr "ئىمىڭىزنى كىرگۈزۈڭ"
312
312
313−#: qml/Shell.qml:321
313+#: qml/Shell.qml:293
314msgid "Sorry, incorrect passphrase"
314msgid "Sorry, incorrect passphrase"
315msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
315msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
316
316
317−#: qml/Shell.qml:323
317+#: qml/Shell.qml:295
318msgid "Enter your passcode"
318msgid "Enter your passcode"
319msgstr "ئىمىڭىزنى كىرگۈزۈڭ"
319msgstr "ئىمىڭىزنى كىرگۈزۈڭ"
320
320
321−#: qml/Shell.qml:324
321+#: qml/Shell.qml:296
322msgid "Sorry, incorrect passcode"
322msgid "Sorry, incorrect passcode"
323msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
323msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
324
324
325−#: qml/Shell.qml:327
325+#: qml/Shell.qml:299
326#, qt-format
326#, qt-format
327msgid "Enter your %1"
327msgid "Enter your %1"
328msgstr "%1 نى كىرگۈزۈڭ"
328msgstr "%1 نى كىرگۈزۈڭ"
329
329
330−#: qml/Shell.qml:328
330+#: qml/Shell.qml:300
331#, qt-format
331#, qt-format
332msgid "Sorry, incorrect %1"
332msgid "Sorry, incorrect %1"
333msgstr "كەچۈرۈڭ، %1 توغرا ئەمەس"
333msgstr "كەچۈرۈڭ، %1 توغرا ئەمەس"
334
334
335−#: qml/Shell.qml:363
335+#: qml/Shell.qml:335
336msgid "Sorry, incorrect passphrase."
336msgid "Sorry, incorrect passphrase."
337msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
337msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
338
338
339−#: qml/Shell.qml:364
339+#: qml/Shell.qml:336
340msgid "Sorry, incorrect passcode."
340msgid "Sorry, incorrect passcode."
341msgstr "كەچۈرۈڭ، ئىم كودى ئەمەس"
341msgstr "كەچۈرۈڭ، ئىم كودى ئەمەس"
342
342
343−#: qml/Shell.qml:365
343+#: qml/Shell.qml:337
344msgid "This will be your last attempt."
344msgid "This will be your last attempt."
345msgstr "بۇ سىزنىڭ ئەڭ ئاخىرقى پۇرسىتىڭىز"
345msgstr "بۇ سىزنىڭ ئەڭ ئاخىرقى پۇرسىتىڭىز"
346
346
347−#: qml/Shell.qml:367
347+#: qml/Shell.qml:339
348msgid ""
348msgid ""
349"If passphrase is entered incorrectly, your phone will conduct a factory "
349"If passphrase is entered incorrectly, your phone will conduct a factory "
350"reset and all personal data will be deleted."
350"reset and all personal data will be deleted."
@@ -352,7 +352,7 @@ msgstr ""
352"ئەگەر ئىم توغرا بولمىسا، تېلېفونىڭىز ئەسلىگە قايتۇرۇلۇپ، زاۋۇتتىن چىققان "
352"ئەگەر ئىم توغرا بولمىسا، تېلېفونىڭىز ئەسلىگە قايتۇرۇلۇپ، زاۋۇتتىن چىققان "
353"ھالەتكە كېلىپ قالىدۇ. بارلىق مەزمۇنلار يوقىلىدۇ."
353"ھالەتكە كېلىپ قالىدۇ. بارلىق مەزمۇنلار يوقىلىدۇ."
354
354
355−#: qml/Shell.qml:368
355+#: qml/Shell.qml:340
356msgid ""
356msgid ""
357"If passcode is entered incorrectly, your phone will conduct a factory reset "
357"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"and all personal data will be deleted."
358"and all personal data will be deleted."
qml/Components/DelayedLockscreen.qmlnew file+92
@@ -0,0 +1,92 @@
1+/*
2+ * Copyright (C) 2013,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 Ubuntu.Components 0.1
19+import "../Components"
20+
21+Item {
22+ id: root
23+ anchors.fill: parent
24+
25+ property int delayMinutes
26+ property bool alphaNumeric
27+
28+ function clear(playAnimation) {}
29+
30+ Column {
31+ anchors.left: parent.left
32+ anchors.right: parent.right
33+ anchors.leftMargin: units.gu(4)
34+ anchors.rightMargin: units.gu(4)
35+ anchors.verticalCenter: parent.verticalCenter
36+ spacing: units.gu(2)
37+
38+ Label {
39+ id: deviceLockedLabel
40+ objectName: "deviceLockedLabel"
41+ anchors.left: parent.left
42+ anchors.right: parent.right
43+ horizontalAlignment: Text.AlignHCenter
44+ wrapMode: Text.Wrap
45+ fontSize: "x-large"
46+ color: "#f3f3e7"
47+ text: i18n.tr("Device Locked")
48+ }
49+
50+ Item { // spacer
51+ width: units.gu(1)
52+ height: units.gu(1)
53+ }
54+
55+ Label {
56+ anchors.left: parent.left
57+ anchors.right: parent.right
58+ horizontalAlignment: Text.AlignHCenter
59+ wrapMode: Text.Wrap
60+ color: "#f3f3e7"
61+ text: alphaNumeric ?
62+ i18n.tr("You have been locked out due to too many failed passphrase attempts.") :
63+ i18n.tr("You have been locked out due to too many failed passcode attempts.")
64+ }
65+
66+ Label {
67+ anchors.left: parent.left
68+ anchors.right: parent.right
69+ horizontalAlignment: Text.AlignHCenter
70+ wrapMode: Text.Wrap
71+ color: "#f3f3e7"
72+ text: i18n.tr("Please wait %1 minute and then try again…",
73+ "Please wait %1 minutes and then try again…",
74+ root.delayMinutes).arg(root.delayMinutes)
75+ }
76+
77+ Item { // spacer
78+ width: units.gu(1)
79+ height: units.gu(1)
80+ }
81+
82+ Icon {
83+ // It would be nice to use a less network-specific name,
84+ // but this is the only lock icon we have.
85+ name: "network-secure"
86+ color: "#f3f3e7"
87+ height: units.gu(4)
88+ width: units.gu(4)
89+ anchors.horizontalCenter: parent.horizontalCenter
90+ }
91+ }
92+}
qml/Components/Lockscreen.qml+126−102
@@ -24,17 +24,24 @@ Showable {
24 // Determine if a numeric or alphanumeric pad is used.
24 // Determine if a numeric or alphanumeric pad is used.
25 property bool alphaNumeric: false
25 property bool alphaNumeric: false
26
26
27+ // Whether to show an emergency call button
28+ property bool showEmergencyCallButton: true
29+
30+ // Whether to show a cancel button (not all lockscreen types normally do anyway)
31+ property bool showCancelButton: true
32+
27 // Informational text. (e.g. some text to tell which domain this is pin is entered for)
33 // Informational text. (e.g. some text to tell which domain this is pin is entered for)
28 property string infoText: ""
34 property string infoText: ""
29
35
30 // Retries text (e.g. 3 retries left)
36 // Retries text (e.g. 3 retries left)
37+ // (This is not currently used, but will be necessary for SIM unlock screen)
31 property string retryText: ""
38 property string retryText: ""
32
39
33 // The text to be displayed in case the login failed
40 // The text to be displayed in case the login failed
34 property string errorText: ""
41 property string errorText: ""
35
42
36− // In case the Lockscreen can show a greeter message, this is the username
43+ // If > 0, a forced delay is happening
37− property string username: ""
44+ property int delayMinutes: 0
38
45
39 // Set those to a value greater 0 to restrict the pin length.
46 // Set those to a value greater 0 to restrict the pin length.
40 // If both are unset, the Lockscreen will show a confirm button and allow typing any length of pin before
47 // If both are unset, the Lockscreen will show a confirm button and allow typing any length of pin before
@@ -54,16 +61,7 @@ Showable {
54 signal emergencyCall()
61 signal emergencyCall()
55 signal infoPopupConfirmed()
62 signal infoPopupConfirmed()
56
63
57− onRequiredChanged: {
64+ onActiveFocusChanged: if (activeFocus && pinPadLoader.item) pinPadLoader.item.forceActiveFocus()
58− if (required && pinPadLoader.item) {
59− clear(false)
60− }
61− }
62−
63− function forceDelay(delay) {
64− forcedDelayTimer.interval = delay
65− forcedDelayTimer.start()
66− }
67
65
68 function reset() {
66 function reset() {
69 // This causes the loader below to destry and recreate the source
67 // This causes the loader below to destry and recreate the source
@@ -83,16 +81,12 @@ Showable {
83 PopupUtils.open(infoPopupComponent, root, {title: title, text: text})
81 PopupUtils.open(infoPopupComponent, root, {title: title, text: text})
84 }
82 }
85
83
86− Timer {
87− id: forcedDelayTimer
88− onTriggered: pinPadLoader.showWrongText = false
89− }
90−
91 Rectangle {
84 Rectangle {
92− // In case background fails to load or is undefined
85+ // In case background fails to load
93 id: backgroundBackup
86 id: backgroundBackup
94 anchors.fill: parent
87 anchors.fill: parent
95 color: "black"
88 color: "black"
89+ visible: root.background.toString() !== ""
96 }
90 }
97
91
98 Image {
92 Image {
@@ -107,111 +101,141 @@ Showable {
107
101
108 MouseArea {
102 MouseArea {
109 anchors.fill: root
103 anchors.fill: root
104+ onClicked: {
105+ if (pinPadLoader.item)
106+ pinPadLoader.item.forceActiveFocus()
107+ }
110 }
108 }
111
109
110+ FocusScope {
111+ id: loaderScope
112+ anchors.fill: parent
113+
112− Loader {
114+ Loader {
113− id: pinPadLoader
115+ id: pinPadLoader
114− objectName: "pinPadLoader"
116+ objectName: "pinPadLoader"
115− anchors {
117+ anchors.fill: parent
116− left: parent.left
117− right: parent.right
118− verticalCenter: parent.verticalCenter
119− verticalCenterOffset: root.alphaNumeric ? -units.gu(10) : 0
120− }
121− property bool resetting: false
118+ property bool resetting: false
122− property bool waiting: false
119+ property bool waiting: false
123− property bool showWrongText: false
120+ property bool showWrongText: false
124−
121+
122+ source: {
123+ if (resetting || !root.required) {
124+ return ""
125+ } else if (root.delayMinutes > 0) {
126+ return "DelayedLockscreen.qml"
127+ } else if (root.alphaNumeric) {
125− source: (!resetting && root.required) ? (root.alphaNumeric ? "PassphraseLockscreen.qml" : "PinLockscreen.qml") : ""
128+ return "PassphraseLockscreen.qml"
129+ } else {
130+ return "PinLockscreen.qml"
131+ }
132+ }
126− onSourceChanged: {
133+ onSourceChanged: {
127− waiting = false
134+ waiting = false
128− showWrongText = false
135+ showWrongText = false
129− }
136+ if (loaderScope.activeFocus && pinPadLoader.item)
130− onLoaded: {
131− if (forcedDelayTimer.running) {
132− pinPadLoader.item.clear(true)
137+ pinPadLoader.item.forceActiveFocus()
133 }
138 }
134− }
135
139
136− Connections {
140+ Connections {
137− target: pinPadLoader.item
141+ target: pinPadLoader.item
138
142
139− onEntered: {
143+ onEntered: {
140− pinPadLoader.waiting = true
144+ pinPadLoader.waiting = true
141− root.entered(passphrase);
145+ root.entered(passphrase);
142− }
146+ }
143
147
144− onCancel: {
148+ onCancel: {
145− root.cancel()
149+ root.cancel()
150+ }
146 }
151 }
147− }
148
152
149− Binding {
153+ Binding {
150− target: pinPadLoader.item
154+ target: pinPadLoader.item
151− property: "minPinLength"
155+ property: "minPinLength"
152− value: root.minPinLength
156+ value: root.minPinLength
153− }
157+ }
154− Binding {
158+ Binding {
155− target: pinPadLoader.item
159+ target: pinPadLoader.item
156− property: "maxPinLength"
160+ property: "maxPinLength"
157− value: root.maxPinLength
161+ value: root.maxPinLength
158− }
162+ }
159− Binding {
163+ Binding {
160− target: pinPadLoader.item
164+ target: pinPadLoader.item
161− property: "infoText"
165+ property: "infoText"
162− value: root.infoText
166+ value: root.infoText
163− }
167+ }
164− Binding {
168+ Binding {
165− target: pinPadLoader.item
169+ target: pinPadLoader.item
166− property: "retryText"
170+ property: "retryText"
167− value: forcedDelayTimer.running ? i18n.tr("Please wait") : root.retryText
171+ value: root.retryText
168− }
172+ }
169− Binding {
173+ Binding {
170− target: pinPadLoader.item
174+ target: pinPadLoader.item
171− property: "errorText"
175+ property: "errorText"
172− value: forcedDelayTimer.running ? i18n.tr("Too many incorrect attempts") :
173− (pinPadLoader.showWrongText ? root.errorText : "")
176+ value: pinPadLoader.showWrongText ? root.errorText : ""
174− }
177+ }
175− Binding {
178+ Binding {
179+ target: pinPadLoader.item
180+ property: "entryEnabled"
181+ value: !pinPadLoader.waiting
182+ }
183+ Binding {
176− target: pinPadLoader.item
184+ target: pinPadLoader.item
177− property: "username"
185+ property: "alphaNumeric"
186+ value: root.alphaNumeric
187+ }
188+ Binding {
189+ target: pinPadLoader.item
190+ property: "delayMinutes"
178− value: root.username
191+ value: root.delayMinutes
192+ }
179 }
193 }
180 Binding {
194 Binding {
181 target: pinPadLoader.item
195 target: pinPadLoader.item
182− property: "entryEnabled"
196+ property: "showCancelButton"
183− value: !pinPadLoader.waiting && !forcedDelayTimer.running
197+ value: root.showCancelButton
184 }
198 }
185 }
199 }
186
200
187− Label {
201+ Item {
188− id: emergencyCallLabel
202+ id: emergencyCallRow
189− objectName: "emergencyCallLabel"
190
203
191− // FIXME: We *should* show emergency dialer if there is a SIM present,
204+ visible: showEmergencyCallButton
192− // regardless of whether the side stage is enabled. But right now,
193− // the assumption is that narrow screens are phones which have SIMs
194− // and wider screens are tablets which don't. When we do allow this
195− // on devices with a side stage and a SIM, work should be done to
196− // ensure that the main stage is disabled while the dialer is present
197− // in the side stage.
198− visible: !shell.sideStageEnabled
199
205
200 anchors {
206 anchors {
201 bottom: parent.bottom
207 bottom: parent.bottom
202− bottomMargin: units.gu(4)
208+ bottomMargin: units.gu(7) + (Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0)
203− horizontalCenter: parent.horizontalCenter
209+ left: parent.left
210+ right: parent.right
204 }
211 }
205
212
206− text: i18n.tr("Emergency Call")
213+ Label {
207− color: "#f3f3e7"
214+ id: emergencyCallLabel
208− opacity: 0.6
215+ objectName: "emergencyCallLabel"
209− }
216+ anchors.horizontalCenter: parent.horizontalCenter
210
217
218+ text: i18n.tr("Emergency Call")
219+ color: "#f3f3e7"
220+ }
221+
222+ Icon {
223+ id: emergencyCallIcon
224+ anchors.left: emergencyCallLabel.right
225+ anchors.leftMargin: units.gu(1)
226+ width: emergencyCallLabel.height
227+ height: emergencyCallLabel.height
228+ name: "call-start"
229+ color: "#f3f3e7"
230+ }
231+
211− MouseArea {
232+ MouseArea {
233+ anchors.top: emergencyCallLabel.top
234+ anchors.bottom: emergencyCallLabel.bottom
212− anchors.fill: emergencyCallLabel
235+ anchors.left: emergencyCallLabel.left
236+ anchors.right: emergencyCallIcon.right
213− onClicked: root.emergencyCall()
237+ onClicked: root.emergencyCall()
214− enabled: emergencyCallLabel.visible
238+ }
215 }
239 }
216
240
217 Component {
241 Component {
qml/Components/PassphraseLockscreen.qml+96−43
@@ -20,10 +20,12 @@ import "../Components"
20
20
21Item {
21Item {
22 id: root
22 id: root
23+ anchors.top: parent.top
24+ anchors.topMargin: units.gu(4)
23− height: highlightItem.height
25+ height: shakeContainer.height
24
26
25 property string infoText
27 property string infoText
26− property string username: ""
28+ property string errorText
27 property bool entryEnabled: true
29 property bool entryEnabled: true
28
30
29 signal entered(string passphrase)
31 signal entered(string passphrase)
@@ -31,64 +33,115 @@ Item {
31
33
32 function clear(playAnimation) {
34 function clear(playAnimation) {
33 pinentryField.text = "";
35 pinentryField.text = "";
36+ pinentryField.incorrectOverride = false;
37+ pinentryField.forceActiveFocus();
34 if (playAnimation) {
38 if (playAnimation) {
35 wrongPasswordAnimation.start();
39 wrongPasswordAnimation.start();
36− pinentryField.forceActiveFocus();
37− } else {
38− pinentryField.focus = false
39 }
40 }
40 }
41 }
41
42
42− Rectangle {
43+ onActiveFocusChanged: if (activeFocus) pinentryField.forceActiveFocus()
43− id: highlightItem
44+
44− width: units.gu(32)
45+ Column {
45− height: units.gu(10)
46+ id: shakeContainer
46− anchors.centerIn: parent
47+ anchors.horizontalCenter: parent.horizontalCenter
47− color: Qt.rgba(0.1, 0.1, 0.1, 0.4)
48+ width: parent.width
48− border.color: Qt.rgba(0.4, 0.4, 0.4, 0.4)
49− border.width: units.dp(1)
50− radius: units.gu(1.5)
49+ spacing: units.gu(2)
51− antialiasing: true
52
50
53 Label {
51 Label {
52+ id: infoField
54− objectName: "greeterLabel"
53+ objectName: "infoTextLabel"
55− anchors {
54+ fontSize: "x-large"
56− left: parent.left
55+ color: "#f3f3e7"
57− top: parent.top
56+ anchors.horizontalCenter: parent.horizontalCenter
58− right: parent.right
57+ text: root.infoText
59− margins: units.gu(1.5)
60− }
61− text: root.username.length > 0 ? i18n.tr("Hello %1").arg(root.username) : i18n.tr("Hello")
62− color: "white"
63 }
58 }
64
59
65− TextField {
60+ Item {
61+ id: entryContainer
62+ anchors { left: parent.left; right: parent.right; margins: units.gu(2) }
63+ height: units.gu(4)
64+
65+ TextInput {
66− id: pinentryField
66+ id: pinentryField
67− objectName: "pinentryField"
67+ objectName: "pinentryField"
68+
69+ property bool incorrectOverride: false
70+
68− anchors {
71+ anchors {
69− horizontalCenter: parent.horizontalCenter
72+ top: parent.top
70− bottom: parent.bottom
73+ left: parent.left
71− margins: units.gu(1)
74+ right: parent.right
75+ }
76+ horizontalAlignment: Text.AlignHCenter
77+ font.pixelSize: FontUtils.sizeToPixels("large")
78+ echoMode: TextInput.Password
79+ inputMethodHints: Qt.ImhHiddenText | Qt.ImhSensitiveData |
80+ Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText
81+ color: "#f3f3e7"
82+ cursorDelegate: Item {} // disable cursor
83+ onCursorPositionChanged: {
84+ // And because we don't show the cursor, always position the
85+ // cursor at the end of the string (so backspace works like
86+ // the user expects, even if they've clicked on us and
87+ // thus accidentally moved the cursor)
88+ if (cursorPosition !== length) {
89+ cursorPosition = length
90+ }
91+ }
92+ clip: true
93+
94+ // This is so that we can draw our own dots, for we want
95+ // complete control over the pixel sizes. (The ubuntu font
96+ // has oddly sized password characters that don't scale right)
97+ opacity: 0
98+
99+ // simulate being disabled, but without removing OSK focus
100+ maximumLength: root.entryEnabled ? 32767 : length
101+
102+ onTextChanged: incorrectOverride = true
103+
104+ onAccepted: {
105+ if (pinentryField.text) {
106+ root.entered(pinentryField.text);
107+ }
108+ }
72 }
109 }
73− height: units.gu(4.5)
110+
74− width: parent.width - units.gu(2)
111+ Row {
75− echoMode: TextInput.Password
112+ id: dotRow
76− opacity: 0.9
113+ anchors.centerIn: entryContainer
77− hasClearButton: false
114+
78− enabled: root.entryEnabled
115+ property real dotSize: Math.min(units.gu(2), entryContainer.width / pinentryField.length)
79− placeholderText: root.infoText
116+ spacing: Math.min(units.gu(2), Math.max(0, (entryContainer.width / pinentryField.length) - dotSize))
80−
117+
81− onAccepted: {
118+ Repeater {
82− if (pinentryField.text) {
119+ model: pinentryField.length
83− root.entered(pinentryField.text);
120+ delegate: Rectangle {
121+ color: "#f3f3e7"
122+ width: dotRow.dotSize
123+ height: width
124+ radius: width / 2
125+ }
84 }
126 }
85 }
127 }
128+
129+ Label {
130+ id: wrongNoticeLabel
131+ objectName: "wrongNoticeLabel"
132+ fontSize: "large"
133+ color: "#f3f3e7"
134+ anchors.horizontalCenter: parent.horizontalCenter
135+ horizontalAlignment: Text.AlignHCenter
136+ text: root.errorText
137+ visible: pinentryField.text.length == 0 && !pinentryField.incorrectOverride
138+ }
86 }
139 }
87 }
140 }
88
141
89 WrongPasswordAnimation {
142 WrongPasswordAnimation {
90 id: wrongPasswordAnimation
143 id: wrongPasswordAnimation
91 objectName: "wrongPasswordAnimation"
144 objectName: "wrongPasswordAnimation"
92− target: pinentryField
145+ target: shakeContainer
93 }
146 }
94}
147}
qml/Components/PinLockscreen.qml+10−5
@@ -21,7 +21,9 @@ import "../Components"
21
21
22Column {
22Column {
23 id: root
23 id: root
24− anchors.centerIn: parent
24+ anchors.top: parent.top
25+ anchors.topMargin: units.gu(4)
26+ anchors.horizontalCenter: parent.horizontalCenter
25 spacing: units.gu(2)
27 spacing: units.gu(2)
26
28
27 property string infoText
29 property string infoText
@@ -31,6 +33,7 @@ Column {
31 property int padHeight: units.gu(28)
33 property int padHeight: units.gu(28)
32 property int minPinLength: -1
34 property int minPinLength: -1
33 property int maxPinLength: -1
35 property int maxPinLength: -1
36+ property bool showCancelButton: true
34
37
35 signal entered(string passphrase)
38 signal entered(string passphrase)
36 signal cancel()
39 signal cancel()
@@ -49,7 +52,7 @@ Column {
49 id: shakeContainer
52 id: shakeContainer
50 anchors.horizontalCenter: parent.horizontalCenter
53 anchors.horizontalCenter: parent.horizontalCenter
51 width: parent.width
54 width: parent.width
52− spacing: units.gu(2)
55+ spacing: units.gu(1)
53
56
54 Label {
57 Label {
55 id: infoField
58 id: infoField
@@ -108,6 +111,7 @@ Column {
108 fontSize: "x-large"
111 fontSize: "x-large"
109 color: "#f3f3e7"
112 color: "#f3f3e7"
110 anchors.horizontalCenter: parent.horizontalCenter
113 anchors.horizontalCenter: parent.horizontalCenter
114+ horizontalAlignment: Text.AlignHCenter
111 text: root.errorText
115 text: root.errorText
112 visible: pinentryField.incorrectOverride
116 visible: pinentryField.incorrectOverride
113 }
117 }
@@ -193,19 +197,20 @@ Column {
193 }
197 }
194 PinPadButton {
198 PinPadButton {
195 iconName: "close"
199 iconName: "close"
196− height: numbersGrid.buttonHeight
200+ height: units.gu(5) // visual spec has this row a little closer in
197 width: numbersGrid.buttonWidth
201 width: numbersGrid.buttonWidth
198
202
199 onClicked: root.cancel()
203 onClicked: root.cancel()
204+ visible: root.showCancelButton
200 }
205 }
201 Item {
206 Item {
202− height: numbersGrid.buttonHeight
207+ height: units.gu(5)
203 width: numbersGrid.buttonWidth
208 width: numbersGrid.buttonWidth
204 }
209 }
205 PinPadButton {
210 PinPadButton {
206 iconName: "tick"
211 iconName: "tick"
207 objectName: "confirmButton"
212 objectName: "confirmButton"
208− height: numbersGrid.buttonHeight
213+ height: units.gu(5)
209 width: numbersGrid.buttonWidth
214 width: numbersGrid.buttonWidth
210 enabled: root.enabled && pinentryField.text.length >= root.minPinLength
215 enabled: root.enabled && pinentryField.text.length >= root.minPinLength
211 visible: root.minPinLength == -1 || root.minPinLength !== root.maxPinLength
216 visible: root.minPinLength == -1 || root.minPinLength !== root.maxPinLength
qml/Dash/Dash.qml+1
@@ -275,6 +275,7 @@ Showable {
275 left: parent.left
275 left: parent.left
276 right: parent.right
276 right: parent.right
277 bottom: parent.bottom
277 bottom: parent.bottom
278+ bottomMargin: Qt.inputMethod.keyboardRectangle.height
278 }
279 }
279 height: units.dp(3)
280 height: units.dp(3)
280 color: scopeStyle.backgroundLuminance > 0.7 ? "#50000000" : "#50ffffff"
281 color: scopeStyle.backgroundLuminance > 0.7 ? "#50000000" : "#50ffffff"
qml/Dash/Previews/PreviewHeader.qml−1
@@ -97,7 +97,6 @@ PreviewWidget {
97 font.weight: Font.Normal
97 font.weight: Font.Normal
98 fontSize: "large"
98 fontSize: "large"
99 wrapMode: Text.Wrap
99 wrapMode: Text.Wrap
100− maximumLineCount: 2
101 color: headerRoot.fontColor
100 color: headerRoot.fontColor
102 text: headerRoot.title
101 text: headerRoot.title
103 }
102 }
qml/Greeter/Greeter.qml+1−1
@@ -154,7 +154,7 @@ Showable {
154 anchors.horizontalCenter: parent.horizontalCenter
154 anchors.horizontalCenter: parent.horizontalCenter
155 anchors.bottom: parent.bottom
155 anchors.bottom: parent.bottom
156 anchors.bottomMargin: units.gu(5)
156 anchors.bottomMargin: units.gu(5)
157− text: i18n.tr("Swipe to unlock")
157+ text: "《 " + i18n.tr("Unlock") + " 》"
158 color: "white"
158 color: "white"
159 font.weight: Font.Light
159 font.weight: Font.Light
160
160
qml/Greeter/GreeterContent.qml+3
@@ -47,6 +47,9 @@ Item {
47 topMargin: backgroundTopMargin
47 topMargin: backgroundTopMargin
48 }
48 }
49 fillMode: Image.PreserveAspectCrop
49 fillMode: Image.PreserveAspectCrop
50+ // Limit how much memory we'll reserve for this image
51+ sourceSize.height: height
52+ sourceSize.width: width
50 }
53 }
51
54
52 // See Shell.qml's backgroundSettings treatment for why we need a separate
55 // See Shell.qml's backgroundSettings treatment for why we need a separate
qml/Panel/ActiveCallHint.qml+1−1
@@ -117,7 +117,7 @@ Item {
117 verticalAlignment: Text.AlignVCenter
117 verticalAlignment: Text.AlignVCenter
118 horizontalAlignment: Text.AlignRight
118 horizontalAlignment: Text.AlignRight
119 text: {
119 text: {
120− var m = Math.round(d.callTime/60);
120+ var m = Math.floor(d.callTime/60);
121 var ss = d.callTime % 60;
121 var ss = d.callTime % 60;
122 if (ss >= 10) {
122 if (ss >= 10) {
123 return m + ":" + ss;
123 return m + ":" + ss;
qml/Panel/IndicatorItem.qml+6
@@ -39,6 +39,12 @@ Loader {
39 }
39 }
40 }
40 }
41
41
42+ Binding {
43+ target: item
44+ property: "identifier"
45+ value: identifier
46+ }
47+
42 Binding {
48 Binding {
43 target: item
49 target: item
44 property: "objectName"
50 property: "objectName"
qml/Panel/Indicators/DefaultIndicatorPage.qml+1−1
@@ -130,7 +130,7 @@ IndicatorBase {
130 visible: status == Loader.Ready
130 visible: status == Loader.Ready
131
131
132 property int modelIndex: index
132 property int modelIndex: index
133− sourceComponent: factory.load(model, identifier)
133+ sourceComponent: factory.load(model, main.identifier)
134
134
135 onLoaded: {
135 onLoaded: {
136 if (item.hasOwnProperty("selected")) {
136 if (item.hasOwnProperty("selected")) {
qml/Panel/Indicators/IndicatorBase.qml+1
@@ -26,6 +26,7 @@ Item {
26 enabled: menuObjectPath != ""
26 enabled: menuObjectPath != ""
27
27
28 //const
28 //const
29+ property string identifier
29 property string busName
30 property string busName
30 property string actionsObjectPath
31 property string actionsObjectPath
31 property string menuObjectPath
32 property string menuObjectPath
qml/Panel/Indicators/MenuItemFactory.qml+1−1
@@ -823,7 +823,7 @@ Item {
823 }
823 }
824
824
825 function load(modelData, context) {
825 function load(modelData, context) {
826− if (modelData.type !== undefined) {
826+ if (modelData.type !== undefined && modelData.type !== "") {
827 var component = undefined;
827 var component = undefined;
828
828
829 var contextComponents = _map[context];
829 var contextComponents = _map[context];
qml/Panel/Indicators/VisibleIndicators.qml+1
@@ -55,6 +55,7 @@ Item {
55 delegate: IndicatorDelegate {
55 delegate: IndicatorDelegate {
56 id: item
56 id: item
57 objectName: model.identifier + "-delegate"
57 objectName: model.identifier + "-delegate"
58+ identifier: model.identifier
58 Component.onCompleted: {
59 Component.onCompleted: {
59 for(var pName in indicatorProperties) {
60 for(var pName in indicatorProperties) {
60 if (item.hasOwnProperty(pName)) {
61 if (item.hasOwnProperty(pName)) {
qml/Panel/MenuContent.qml+6
@@ -123,6 +123,12 @@ Rectangle {
123 }
123 }
124 }
124 }
125
125
126+ Binding {
127+ target: loader.item
128+ property: "identifier"
129+ value: identifier
130+ }
131+
126 Binding {
132 Binding {
127 target: loader.item
133 target: loader.item
128 property: "objectName"
134 property: "objectName"
qml/Shell.qml+46−17
@@ -60,7 +60,7 @@ Item {
60
60
61 property int maxFailedLogins: -1 // disabled by default for now, will enable via settings in future
61 property int maxFailedLogins: -1 // disabled by default for now, will enable via settings in future
62 property int failedLoginsDelayAttempts: 7 // number of failed logins
62 property int failedLoginsDelayAttempts: 7 // number of failed logins
63− property int failedLoginsDelaySeconds: 5 * 60 // seconds of forced waiting
63+ property int failedLoginsDelayMinutes: 5 // minutes of forced waiting
64
64
65 property int orientation
65 property int orientation
66 readonly property int deviceOrientationAngle: Screen.angleBetween(Screen.primaryOrientation, Screen.orientation)
66 readonly property int deviceOrientationAngle: Screen.angleBetween(Screen.primaryOrientation, Screen.orientation)
@@ -285,8 +285,6 @@ Item {
285 id: lockscreen
285 id: lockscreen
286 objectName: "lockscreen"
286 objectName: "lockscreen"
287
287
288− readonly property int backgroundTopMargin: -panel.panelHeight
289−
290 hides: [launcher, panel.indicators]
288 hides: [launcher, panel.indicators]
291 shown: false
289 shown: false
292 enabled: true
290 enabled: true
@@ -301,12 +299,34 @@ Item {
301 minPinLength: 4
299 minPinLength: 4
302 maxPinLength: 4
300 maxPinLength: 4
303
301
302+ // FIXME: We *should* show emergency dialer if there is a SIM present,
303+ // regardless of whether the side stage is enabled. But right now,
304+ // the assumption is that narrow screens are phones which have SIMs
305+ // and wider screens are tablets which don't. When we do allow this
306+ // on devices with a side stage and a SIM, work should be done to
307+ // ensure that the main stage is disabled while the dialer is present
308+ // in the side stage.
309+ showEmergencyCallButton: !shell.sideStageEnabled
310+
304 onEntered: LightDM.Greeter.respond(passphrase);
311 onEntered: LightDM.Greeter.respond(passphrase);
305 onCancel: greeter.show()
312 onCancel: greeter.show()
306 onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter fake-active mode
313 onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter fake-active mode
307
314
308 onShownChanged: if (shown) greeter.fakeActiveForApp = ""
315 onShownChanged: if (shown) greeter.fakeActiveForApp = ""
309
316
317+ Timer {
318+ id: forcedDelayTimer
319+ interval: 1000 * 60
320+ onTriggered: {
321+ if (lockscreen.delayMinutes > 0) {
322+ lockscreen.delayMinutes -= 1
323+ if (lockscreen.delayMinutes > 0) {
324+ start() // go again
325+ }
326+ }
327+ }
328+ }
329+
310 Component.onCompleted: {
330 Component.onCompleted: {
311 if (greeter.narrowMode) {
331 if (greeter.narrowMode) {
312 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole))
332 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole))
@@ -324,14 +344,15 @@ Item {
324 if (greeter.narrowMode) {
344 if (greeter.narrowMode) {
325 if (isDefaultPrompt) {
345 if (isDefaultPrompt) {
326 if (lockscreen.alphaNumeric) {
346 if (lockscreen.alphaNumeric) {
327− lockscreen.infoText = i18n.tr("Enter your passphrase")
347+ lockscreen.infoText = i18n.tr("Enter passphrase")
328− lockscreen.errorText = i18n.tr("Sorry, incorrect passphrase")
348+ lockscreen.errorText = i18n.tr("Sorry, incorrect passphrase") + "\n" +
349+ i18n.tr("Please re-enter")
329 } else {
350 } else {
330− lockscreen.infoText = i18n.tr("Enter your passcode")
351+ lockscreen.infoText = i18n.tr("Enter passcode")
331 lockscreen.errorText = i18n.tr("Sorry, incorrect passcode")
352 lockscreen.errorText = i18n.tr("Sorry, incorrect passcode")
332 }
353 }
333 } else {
354 } else {
334− lockscreen.infoText = i18n.tr("Enter your %1").arg(text.toLowerCase())
355+ lockscreen.infoText = i18n.tr("Enter %1").arg(text.toLowerCase())
335 lockscreen.errorText = i18n.tr("Sorry, incorrect %1").arg(text.toLowerCase())
356 lockscreen.errorText = i18n.tr("Sorry, incorrect %1").arg(text.toLowerCase())
336 }
357 }
337
358
@@ -379,7 +400,8 @@ Item {
379 }
400 }
380 }
401 }
381 if (failedLoginsDelayAttempts > 0 && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
402 if (failedLoginsDelayAttempts > 0 && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
382− lockscreen.forceDelay(failedLoginsDelaySeconds * 1000)
403+ lockscreen.delayMinutes = failedLoginsDelayMinutes
404+ forcedDelayTimer.start()
383 }
405 }
384
406
385 lockscreen.clear(true);
407 lockscreen.clear(true);
@@ -425,7 +447,15 @@ Item {
425 }
447 }
426
448
427 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
449 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
450+ onShowProgressChanged: {
451+ if (showProgress === 0) {
428− onShowProgressChanged: if (LightDM.Greeter.authenticated && showProgress === 0) greeter.login()
452+ if (LightDM.Greeter.authenticated) {
453+ greeter.login()
454+ } else if (greeter.narrowMode) {
455+ lockscreen.clear(false) // to reset focus if necessary
456+ }
457+ }
458+ }
429
459
430 Greeter {
460 Greeter {
431 id: greeter
461 id: greeter
@@ -521,16 +551,19 @@ Item {
521 }
551 }
522
552
523 function showDash() {
553 function showDash() {
524− if (shell.locked) {
554+ if (greeter.fakeActiveForApp !== "") { // just in case user gets here
525− return;
555+ return
526 }
556 }
557+
527 if (greeter.shown) {
558 if (greeter.shown) {
528 greeter.hideRight();
559 greeter.hideRight();
529 launcher.fadeOut();
560 launcher.fadeOut();
530 }
561 }
531
562
563+ if (ApplicationManager.focusedApplicationId != "unity8-dash") {
532− ApplicationManager.requestFocusApplication("unity8-dash")
564+ ApplicationManager.requestFocusApplication("unity8-dash")
533− launcher.fadeOut();
565+ launcher.fadeOut();
566+ }
534 }
567 }
535
568
536 Item {
569 Item {
@@ -576,10 +609,6 @@ Item {
576 if (ApplicationManager.focusedApplicationId != "unity8-dash") {
609 if (ApplicationManager.focusedApplicationId != "unity8-dash") {
577 showDash()
610 showDash()
578 }
611 }
579− if (greeter.shown) {
580− launcher.fadeOut()
581− greeter.hideRight()
582− }
583 }
612 }
584 onDashSwipeChanged: {
613 onDashSwipeChanged: {
585 if (dashSwipe) {
614 if (dashSwipe) {
tests/autopilot/unity8/shell/tests/test_lock_screen.py+3−1
@@ -132,8 +132,10 @@ class TestLockscreen(UnityTestCase):
132 )
132 )
133
133
134 pin_entry_field = self.main_window.get_pinentryField()
134 pin_entry_field = self.main_window.get_pinentryField()
135− pin_entry_field.write(passphrase)
135+ # pinentryField should automatically have focus
136+ self.keyboard.type(passphrase)
136 logger.debug("Typed passphrase: %s", pin_entry_field.text)
137 logger.debug("Typed passphrase: %s", pin_entry_field.text)
138+ self.assertEqual(pin_entry_field.text, passphrase)
137 self.keyboard.type("\n")
139 self.keyboard.type("\n")
138
140
139 def _enter_prompt_passphrase(self, passphrase):
141 def _enter_prompt_passphrase(self, passphrase):
tests/mocks/Ubuntu/Telephony/MockCallEntry.cpp+26−1
@@ -22,8 +22,8 @@ MockCallEntry::MockCallEntry(QObject *parent)
22 : QObject(parent)
22 : QObject(parent)
23 , m_conference(false)
23 , m_conference(false)
24 , m_elapsed(0)
24 , m_elapsed(0)
25+ , m_timer(0)
25{
26{
26− startTimer(1000);
27}
27}
28
28
29QString MockCallEntry::phoneNumber() const
29QString MockCallEntry::phoneNumber() const
@@ -52,11 +52,36 @@ void MockCallEntry::setIsConference(bool isConference)
52 }
52 }
53}
53}
54
54
55+void MockCallEntry::setElapsedTime(int elapsedTime)
56+{
57+ if (m_elapsed != elapsedTime) {
58+ m_elapsed = elapsedTime;
59+ Q_EMIT elapsedTimeChanged();
60+ }
61+}
62+
55int MockCallEntry::elapsedTime() const
63int MockCallEntry::elapsedTime() const
56{
64{
57 return m_elapsed;
65 return m_elapsed;
58}
66}
59
67
68+bool MockCallEntry::elapsedTimerRunning() const
69+{
70+ return m_timer != 0;
71+}
72+
73+void MockCallEntry::setSlapsedTimerRunning(bool elapsedTimerRunning)
74+{
75+ if (elapsedTimerRunning && m_timer == 0) {
76+ m_timer = startTimer(1000);
77+ Q_EMIT elapsedTimerRunningChanged();
78+ } else if (!elapsedTimerRunning && m_timer != 0) {
79+ killTimer(m_timer);
80+ m_timer = 0;
81+ Q_EMIT elapsedTimerRunningChanged();
82+ }
83+}
84+
60void MockCallEntry::timerEvent(QTimerEvent * event)
85void MockCallEntry::timerEvent(QTimerEvent * event)
61{
86{
62 Q_UNUSED(event);
87 Q_UNUSED(event);
tests/mocks/Ubuntu/Telephony/MockCallEntry.h+9−1
@@ -28,7 +28,10 @@ class MockCallEntry : public QObject
28
28
29 Q_PROPERTY(QString phoneNumber READ phoneNumber WRITE setPhoneNumber NOTIFY phoneNumberChanged)
29 Q_PROPERTY(QString phoneNumber READ phoneNumber WRITE setPhoneNumber NOTIFY phoneNumberChanged)
30 Q_PROPERTY(bool isConference READ isConference WRITE setIsConference NOTIFY isConferenceChanged)
30 Q_PROPERTY(bool isConference READ isConference WRITE setIsConference NOTIFY isConferenceChanged)
31− Q_PROPERTY(int elapsedTime READ elapsedTime NOTIFY elapsedTimeChanged)
31+ Q_PROPERTY(int elapsedTime READ elapsedTime WRITE setElapsedTime NOTIFY elapsedTimeChanged)
32+
33+ // For mock use only
34+ Q_PROPERTY(bool elapsedTimerRunning READ elapsedTimerRunning WRITE setSlapsedTimerRunning NOTIFY elapsedTimerRunningChanged)
32
35
33public:
36public:
34 MockCallEntry(QObject *parent = 0);
37 MockCallEntry(QObject *parent = 0);
@@ -36,14 +39,18 @@ public:
36 QString phoneNumber() const;
39 QString phoneNumber() const;
37 bool isConference() const;
40 bool isConference() const;
38 int elapsedTime() const;
41 int elapsedTime() const;
42+ bool elapsedTimerRunning() const;
39
43
40 void setPhoneNumber(const QString& phoneNumber);
44 void setPhoneNumber(const QString& phoneNumber);
41 void setIsConference(bool isConference);
45 void setIsConference(bool isConference);
46+ void setElapsedTime(int elapsedTime);
47+ void setSlapsedTimerRunning(bool elapsedTimerRunning);
42
48
43Q_SIGNALS:
49Q_SIGNALS:
44 void phoneNumberChanged();
50 void phoneNumberChanged();
45 void isConferenceChanged();
51 void isConferenceChanged();
46 void elapsedTimeChanged();
52 void elapsedTimeChanged();
53+ void elapsedTimerRunningChanged();
47
54
48protected:
55protected:
49 void timerEvent(QTimerEvent * event);
56 void timerEvent(QTimerEvent * event);
@@ -52,6 +59,7 @@ private:
52 QString m_phoneNumber;
59 QString m_phoneNumber;
53 bool m_conference;
60 bool m_conference;
54 int m_elapsed;
61 int m_elapsed;
62+ int m_timer;
55};
63};
56
64
57#endif // MOCKCALLENTRY_H
65#endif // MOCKCALLENTRY_H
tests/qmltests/CMakeLists.txt+1−1
@@ -26,6 +26,7 @@ add_qml_test(Components Carousel)
26add_qml_test(Components DraggingArea)
26add_qml_test(Components DraggingArea)
27add_qml_test(Components EdgeDemoOverlay)
27add_qml_test(Components EdgeDemoOverlay)
28add_qml_test(Components LazyImage)
28add_qml_test(Components LazyImage)
29+add_qml_test(Components Lockscreen)
29add_qml_test(Components Rating)
30add_qml_test(Components Rating)
30add_qml_test(Components ResponsiveFlowView)
31add_qml_test(Components ResponsiveFlowView)
31add_qml_test(Components ResponsiveGridView)
32add_qml_test(Components ResponsiveGridView)
@@ -60,7 +61,6 @@ add_qml_test(Dash/ScopeSettings ScopeSettingList)
60add_qml_test(Dash/ScopeSettings ScopeSettingNumber)
61add_qml_test(Dash/ScopeSettings ScopeSettingNumber)
61add_qml_test(Dash/ScopeSettings ScopeSettingString)
62add_qml_test(Dash/ScopeSettings ScopeSettingString)
62add_qml_test(Dash/ScopeSettings ScopeSettingsWidgetFactory)
63add_qml_test(Dash/ScopeSettings ScopeSettingsWidgetFactory)
63−add_qml_test(Greeter Lockscreen ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
64add_qml_test(Greeter MultiGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
64add_qml_test(Greeter MultiGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
65add_qml_test(Greeter SingleGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
65add_qml_test(Greeter SingleGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
66add_qml_test(Greeter Infographics ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
66add_qml_test(Greeter Infographics ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
tests/qmltests/Greeter/tst_Lockscreen.qml → tests/qmltests/Components/tst_Lockscreen.qmlrenamed+31−51
@@ -18,15 +18,13 @@ import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19import ".."
19import ".."
20import "../../../qml/Components"
20import "../../../qml/Components"
21−import AccountsService 0.1
22−import LightDM 0.1 as LightDM
23import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
24import Unity.Test 0.1 as UT
22import Unity.Test 0.1 as UT
25
23
26Rectangle {
24Rectangle {
27 id: root
25 id: root
28 width: units.gu(80)
26 width: units.gu(80)
29− height: units.gu(70)
27+ height: units.gu(76)
30 color: "orange"
28 color: "orange"
31
29
32 Lockscreen {
30 Lockscreen {
@@ -39,7 +37,7 @@ Rectangle {
39 alphaNumeric: pinPadCheckBox.checked
37 alphaNumeric: pinPadCheckBox.checked
40 minPinLength: minPinLengthTextField.text
38 minPinLength: minPinLengthTextField.text
41 maxPinLength: maxPinLengthTextField.text
39 maxPinLength: maxPinLengthTextField.text
42− username: "Lola"
40+ delayMinutes: delayMinutesTextField.text
43 background: "../../../qml/graphics/phone_background.jpg"
41 background: "../../../qml/graphics/phone_background.jpg"
44 }
42 }
45
43
@@ -53,24 +51,6 @@ Rectangle {
53 }
51 }
54 }
52 }
55
53
56− function setUser(username) {
57− AccountsService.user = username
58− LightDM.Greeter.authenticate(username)
59− }
60−
61− Connections {
62− target: LightDM.Greeter
63−
64− onShowPrompt: {
65− if (AccountsService.passwordDisplayHint === AccountsService.Numeric) {
66− pinPadCheckBox.checked = false
67− } else {
68− pinPadCheckBox.checked = true
69− }
70− lockscreen.infoText = text;
71− }
72− }
73−
74 Rectangle {
54 Rectangle {
75 anchors.fill: parent
55 anchors.fill: parent
76 anchors.leftMargin: lockscreen.width
56 anchors.leftMargin: lockscreen.width
@@ -129,6 +109,16 @@ Rectangle {
129 text: "Retries left"
109 text: "Retries left"
130 }
110 }
131 }
111 }
112+ Row {
113+ TextField {
114+ id: delayMinutesTextField
115+ width: units.gu(7)
116+ text: "0"
117+ }
118+ Label {
119+ text: "Delay Minutes"
120+ }
121+ }
132 Label {
122 Label {
133 id: pinLabel
123 id: pinLabel
134 anchors.verticalCenter: parent.verticalCenter
124 anchors.verticalCenter: parent.verticalCenter
@@ -141,17 +131,6 @@ Rectangle {
141 id: enteredLabel
131 id: enteredLabel
142 }
132 }
143 }
133 }
144− Button {
145− text: "start auth (1234)"
146− width: parent.width
147− onClicked: setUser("has-pin")
148− }
149− Button {
150− text: "start auth (password)"
151− width: parent.width
152− onClicked: setUser("has-password")
153− }
154−
155 TextField {
134 TextField {
156 id: infoTextTextField
135 id: infoTextTextField
157 width: parent.width
136 width: parent.width
@@ -193,6 +172,7 @@ Rectangle {
193
172
194 function cleanup() {
173 function cleanup() {
195 lockscreen.clear(false);
174 lockscreen.clear(false);
175+ delayMinutesTextField.text = "0"
196 }
176 }
197
177
198 function waitForLockscreenReady() {
178 function waitForLockscreenReady() {
@@ -237,8 +217,8 @@ Rectangle {
237
217
238 function test_labels_data() {
218 function test_labels_data() {
239 return [
219 return [
240− {tag: "numeric", alphanumeric: false, infoText: "Please enter your PIN", username: "foobar" },
220+ {tag: "numeric", alphanumeric: false, infoText: "Please enter your PIN" },
241− {tag: "alphanumeric", alphanumeric: true, infoText: "Please enter your password", username: "Lola" }
221+ {tag: "alphanumeric", alphanumeric: true, infoText: "Please enter your password" }
242 ]
222 ]
243 }
223 }
244
224
@@ -246,22 +226,16 @@ Rectangle {
246 pinPadCheckBox.checked = data.alphanumeric
226 pinPadCheckBox.checked = data.alphanumeric
247 lockscreen.infoText = data.infoText
227 lockscreen.infoText = data.infoText
248 waitForLockscreenReady();
228 waitForLockscreenReady();
249− if (data.alphanumeric) {
250− compare(findChild(lockscreen, "pinentryField").placeholderText, data.infoText, "Placeholdertext is not what it should be")
251− 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")
229+ compare(findChild(lockscreen, "infoTextLabel").text, data.infoText, "Placeholdertext is not what it should be")
254− }
255 }
230 }
256
231
257−
258 function test_unlock_data() {
232 function test_unlock_data() {
259 return [
233 return [
260− {tag: "numeric", alphanumeric: false, username: "has-pin", password: "1234", minPinLength: 4, maxPinLength: 4},
234+ {tag: "numeric", alphanumeric: false, password: "1234", minPinLength: 4, maxPinLength: 4},
261− {tag: "alphanumeric", alphanumeric: true, username: "has-password", password: "password", minPinLength: -1, maxPinLength: -1},
235+ {tag: "alphanumeric", alphanumeric: true, password: "password", minPinLength: -1, maxPinLength: -1},
262− {tag: "numeric (wrong)", alphanumeric: false, username: "has-pin", password: "4321", minPinLength: 4, maxPinLength: 4},
236+ {tag: "numeric (wrong)", alphanumeric: false, password: "4321", minPinLength: 4, maxPinLength: 4},
263− {tag: "alphanumeric (wrong)", alphanumeric: true, username: "has-password", password: "drowssap", minPinLength: -1, maxPinLength: -1},
237+ {tag: "alphanumeric (wrong)", alphanumeric: true, password: "drowssap", minPinLength: -1, maxPinLength: -1},
264− {tag: "flexible length", alphanumeric: false, username: "has-pin", password: "1234", minPinLength: -1, maxPinLength: -1},
238+ {tag: "flexible length", alphanumeric: false, password: "1234", minPinLength: -1, maxPinLength: -1},
265 ]
239 ]
266 }
240 }
267
241
@@ -269,13 +243,13 @@ Rectangle {
269 enteredLabel.text = ""
243 enteredLabel.text = ""
270 minPinLengthTextField.text = data.minPinLength
244 minPinLengthTextField.text = data.minPinLength
271 maxPinLengthTextField.text = data.maxPinLength
245 maxPinLengthTextField.text = data.maxPinLength
272− setUser(data.username)
246+ pinPadCheckBox.checked = data.alphanumeric
247+ infoTextTextField.text = "Enter " + (data.alphanumeric ? "passphrase" : "passcode")
273 waitForLockscreenReady();
248 waitForLockscreenReady();
274
249
275 var inputField = findChild(lockscreen, "pinentryField")
250 var inputField = findChild(lockscreen, "pinentryField")
276 if (data.alphanumeric) {
251 if (data.alphanumeric) {
277− mouseClick(inputField, units.gu(1), units.gu(1))
278− tryCompare(inputField, "focus", true);
252+ tryCompare(inputField, "activeFocus", true);
279 typeString(data.password)
253 typeString(data.password)
280 keyClick(Qt.Key_Enter)
254 keyClick(Qt.Key_Enter)
281 } else {
255 } else {
@@ -305,7 +279,6 @@ Rectangle {
305
279
306 var inputField = findChild(lockscreen, "pinentryField")
280 var inputField = findChild(lockscreen, "pinentryField")
307 if (data.alphanumeric) {
281 if (data.alphanumeric) {
308− mouseClick(inputField, units.gu(1), units.gu(1))
309 tryCompare(inputField, "activeFocus", true);
282 tryCompare(inputField, "activeFocus", true);
310 typeString("1")
283 typeString("1")
311 } else {
284 } else {
@@ -470,6 +443,13 @@ Rectangle {
470 var label = findChild(lockscreen, "infoTextLabel")
443 var label = findChild(lockscreen, "infoTextLabel")
471 compare(label.text, data.text);
444 compare(label.text, data.text);
472 }
445 }
446+
447+ function test_delayMinutes() {
448+ delayMinutesTextField.text = "4"
449+ waitForLockscreenReady()
450+ var label = findChild(lockscreen, "deviceLockedLabel")
451+ compare(label.text, "Device Locked")
452+ }
473 }
453 }
474
454
475 SignalSpy {
455 SignalSpy {
tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml+3−23
@@ -29,14 +29,14 @@ Item {
29 id: page
29 id: page
30
30
31 anchors.fill: parent
31 anchors.fill: parent
32− contentActive: true
33
32
34 menuModel: UnityMenuModel {}
33 menuModel: UnityMenuModel {}
35 busName: "test"
34 busName: "test"
36 actionsObjectPath: "test"
35 actionsObjectPath: "test"
37 menuObjectPath: "test"
36 menuObjectPath: "test"
38
37
38+ identifier: "test-indicator"
39− rootMenuType: ""
39+ rootMenuType: "com.canonical.indicator.root"
40 }
40 }
41
41
42 property var fullMenuData: [{
42 property var fullMenuData: [{
@@ -117,13 +117,8 @@ Item {
117 name: "DefaultIndicatorPage"
117 name: "DefaultIndicatorPage"
118
118
119 function init() {
119 function init() {
120− page.stop();
121 var mainMenu = findChild(page, "mainMenu");
120 var mainMenu = findChild(page, "mainMenu");
122− verify(mainMenu.model === undefined);
121+ page.menuModel.modelData = [];
123−
124− page.rootMenuType = "com.canonical.indicator.root";
125− page.start();
126−
127 verify(mainMenu.model !== null);
122 verify(mainMenu.model !== null);
128 }
123 }
129
124
@@ -157,20 +152,5 @@ Item {
157 var mainMenu = findChild(page, "mainMenu");
152 var mainMenu = findChild(page, "mainMenu");
158 tryCompare(mainMenu, "count", data.expectedCount);
153 tryCompare(mainMenu, "count", data.expectedCount);
159 }
154 }
160−
161− function test_empty_data() {
162− return [
163− { tag: "EmptyNoData", modelData: [], visible: true},
164− { tag: "EmptySubmenu", modelData: emptySubMenuData, visible: true},
165− { tag: "NotEmpty", modelData: fullMenuData, visible: false},
166− ]
167− }
168−
169− function test_empty(data) {
170− page.menuModel.modelData = data.modelData;
171−
172− var emptyLabel = findChild(page, "emptyLabel");
173− tryCompare(emptyLabel, "visible", data.visible);
174− }
175 }
155 }
176}
156}
tests/qmltests/Panel/tst_ActiveCallHint.qml+19−6
@@ -39,6 +39,7 @@ Item {
39 Telephony.CallEntry {
39 Telephony.CallEntry {
40 id: call3
40 id: call3
41 phoneNumber: "+447812221113"
41 phoneNumber: "+447812221113"
42+ elapsedTimerRunning: true
42 }
43 }
43
44
44 ActiveCallHint {
45 ActiveCallHint {
@@ -69,6 +70,7 @@ Item {
69 callManager.foregroundCall = null;
70 callManager.foregroundCall = null;
70 callManager.backgroundCall = null;
71 callManager.backgroundCall = null;
71 callHint.labelSwitchInterval = 300;
72 callHint.labelSwitchInterval = 300;
73+ call1.elapsedTime = 0;
72
74
73 ApplicationManager.stopApplication("dialer-app");
75 ApplicationManager.stopApplication("dialer-app");
74 }
76 }
@@ -139,16 +141,27 @@ Item {
139 compare(contactLabel.text, "Freddy", "Contact label does not match call");
141 compare(contactLabel.text, "Freddy", "Contact label does not match call");
140 }
142 }
141
143
142− function test_timeLapse() {
144+ function test_timeElapsed_data() {
145+ return [
146+ { tag: "0:00->0:01", elpasedTime: 0, initial: "0:00", expected: "0:01" },
147+ { tag: "0:29->0:30", elpasedTime: 29, initial: "0:29", expected: "0:30" },
148+ { tag: "0:59->1:00", elpasedTime: 59, initial: "0:59", expected: "1:00" },
149+
150+ { tag: "01:59->02:00", elpasedTime: 119, initial: "1:59", expected: "2:00" },
151+ { tag: "59:59->60:00", elpasedTime: 3599, initial: "59:59", expected: "60:00" }
152+ ];
153+ }
154+
155+ function test_timeElapsed(data) {
143− callManager.backgroundCall = call3;
156+ callManager.backgroundCall = call1;
157+ call1.elapsedTime = data.elpasedTime;
144
158
145 var timeLabel = findChild(callHint, "timeLabel");
159 var timeLabel = findChild(callHint, "timeLabel");
146 verify(timeLabel !== null);
160 verify(timeLabel !== null);
147
161
148− var currentLabel = timeLabel.text;
162+ compare(timeLabel.text, data.initial);
149− tryCompareFunction(function() { return timeLabel.text !== currentLabel }, true);
163+ call1.elapsedTime = call1.elapsedTime + 1;
150− currentLabel = timeLabel.text;
164+ compare(timeLabel.text, data.expected);
151− tryCompareFunction(function() { return timeLabel.text !== currentLabel }, true);
152 }
165 }
153
166
154 function test_displayedLabelChangesOverTime() {
167 function test_displayedLabelChangesOverTime() {
tests/qmltests/tst_ShellWithPin.qml+3−1
@@ -230,8 +230,10 @@ Item {
230 enterPin("1111")
230 enterPin("1111")
231 tryCompare(placeHolder, "text", "Sorry, incorrect passcode")
231 tryCompare(placeHolder, "text", "Sorry, incorrect passcode")
232
232
233+ var lockscreen = findChild(shell, "lockscreen")
234+ tryCompare(lockscreen, "delayMinutes", 0)
233 enterPin("1111")
235 enterPin("1111")
234− tryCompare(placeHolder, "text", "Too many incorrect attempts")
236+ tryCompare(lockscreen, "delayMinutes", shell.failedLoginsDelayMinutes)
235 }
237 }
236
238
237 function test_factoryReset() {
239 function test_factoryReset() {