on xenial help sign in
merge lp:unity8
commit26ed56e8a26d44d9bc8dd8114d4bf5cf3d3ca1c9 authorAlberto Aguirre <alberto.aguirre@canonical.com> dateWed 1 Oct 2014, 09:48 (12 years ago) parent803ab7d6ed5fb3
38 files changed+678−393
CODING+4 cmake/modules/QmlTest.cmake+8 data/unity8.conf+5−1 debian/changelog+41 plugins/Unity/Session/orientationlock.cpp+6−6 plugins/Unity/Session/orientationlock.h+1−3 po/br.po+5−5 po/de.po+28−28 po/es.po+28−28 po/gd.po+4−4 po/it.po+5−5 po/nb.po+27−27 po/pt_BR.po+5−5 po/ug.po+24−24 qml/Components/DelayedLockscreen.qml+92 qml/Components/Lockscreen.qml+126−102 qml/Components/PassphraseLockscreen.qml+96−43 qml/Components/PinLockscreen.qml+10−5 qml/Dash/Dash.qml+1 qml/Dash/Previews/PreviewHeader.qml−1 qml/Greeter/Greeter.qml+1−1 qml/Greeter/GreeterContent.qml+3 qml/Panel/ActiveCallHint.qml+1−1 qml/Panel/IndicatorItem.qml+6 qml/Panel/Indicators/DefaultIndicatorPage.qml+1−1 qml/Panel/Indicators/IndicatorBase.qml+1 qml/Panel/Indicators/MenuItemFactory.qml+1−1 qml/Panel/Indicators/VisibleIndicators.qml+1 qml/Panel/MenuContent.qml+6 qml/Shell.qml+46−17 tests/autopilot/unity8/shell/tests/test_lock_screen.py+3−1 tests/mocks/Ubuntu/Telephony/MockCallEntry.cpp+26−1 tests/mocks/Ubuntu/Telephony/MockCallEntry.h+9−1 tests/qmltests/CMakeLists.txt+1−1 tests/qmltests/Greeter/tst_Lockscreen.qml → tests/qmltests/Components/tst_Lockscreen.qml+31−51 tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml+3−23 tests/qmltests/Panel/tst_ActiveCallHint.qml+19−6 tests/qmltests/tst_ShellWithPin.qml+3−1
CODING+4
@@ -154,6 +154,10 @@ So, for the DragHandle component that would be:
154154
155155$ make testDragHandle
156156
157+To run the tests for a single component/class under gdb (so you can catch SEGFAULTS)
158+
159+$ make gdbtestComponentName
160+
157161To run a test application that allow you to manually test or to simply try out
158162a given component:
159163
cmake/modules/QmlTest.cmake+8
@@ -12,6 +12,7 @@
1212# Two targets will be created:
1313# - testComponentName - Runs the test with qmltestrunner
1414# - tryComponentName - Runs the test with uqmlscene, for manual interaction
15+# - gdbtestComponentName - Runs the test with qmltestrunner under gdb
1516#
1617# To change/set a default value for the whole test suite, prior to calling add_qml_test, set:
1718# qmltest_DEFAULT_NO_ADD_TEST (default: FALSE)
@@ -81,6 +82,7 @@ macro(add_qml_test_internal SUBPATH COMPONENT_NAME ITERATIONS)
8182 cmake_parse_arguments(qmltest_default "${options}" "" "${multi_value_keywords}" ${qmltest_DEFAULT_PROPERTIES})
8283
8384 set(qmltest_TARGET test${COMPONENT_NAME})
85+ set(qmltest_gdb_TARGET gdbtest${COMPONENT_NAME})
8486 set(qmltest_xvfb_TARGET xvfbtest${COMPONENT_NAME})
8587 set(qmltest_FILE ${SUBPATH}/tst_${COMPONENT_NAME})
8688
@@ -138,8 +140,14 @@ macro(add_qml_test_internal SUBPATH COMPONENT_NAME ITERATIONS)
138140 ${function_ARGS}
139141 )
140142
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+
141148 add_qmltest_target(${qmltest_TARGET} "${qmltest_command}" TRUE ${qmltest_NO_ADD_TEST})
142149 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)
143151 add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
144152endmacro(add_qml_test_internal)
145153
data/unity8.conf+5−1
@@ -34,11 +34,15 @@ pre-start script
3434 gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
3535 fi
3636
37− # Remove the socket if still there
37+ # Remove the normal and trusted sockets if still there
3838 if [ -S "$MIR_SERVER_FILE" ]; then
3939 rm "$MIR_SERVER_FILE"
4040 fi
4141
42+ if [ -S "${MIR_SERVER_FILE}_trusted" ]; then
43+ rm "${MIR_SERVER_FILE}_trusted"
44+ fi
45+
4246 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
4347
4448 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+
142unity8 (8.00+14.10.20140926-0ubuntu1) utopic; urgency=low
243
344 [ CI bot ]
plugins/Unity/Session/orientationlock.cpp+6−6
@@ -24,16 +24,16 @@ OrientationLock::OrientationLock(QObject *parent)
2424 , m_enabled(false)
2525 , m_savedOrientation(Qt::PortraitOrientation)
2626{
27− systemSettings = g_settings_new("com.ubuntu.touch.system");
28− g_signal_connect(systemSettings, "changed::rotation-lock",
27+ m_systemSettings = g_settings_new("com.ubuntu.touch.system");
28+ g_signal_connect(m_systemSettings, "changed::rotation-lock",
2929 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");
3131}
3232
3333OrientationLock::~OrientationLock()
3434{
35− g_signal_handlers_disconnect_by_data(systemSettings, this);
36− g_object_unref(systemSettings);
35+ g_signal_handlers_disconnect_by_data(m_systemSettings, this);
36+ g_object_unref(m_systemSettings);
3737}
3838
3939bool OrientationLock::enabled() const
@@ -54,7 +54,7 @@ void OrientationLock::onEnabledChangedProxy(GSettings */*settings*/, const gchar
5454
5555void OrientationLock::onEnabledChanged()
5656{
57− const bool enabled = g_settings_get_boolean(systemSettings, "rotation-lock");
57+ const bool enabled = g_settings_get_boolean(m_systemSettings, "rotation-lock");
5858 if (m_enabled != enabled) {
5959 m_enabled = enabled;
6060 Q_EMIT enabledChanged();
plugins/Unity/Session/orientationlock.h+1−3
@@ -19,7 +19,6 @@
1919
2020#include <gio/gio.h>
2121#include <QtCore/QObject>
22−#include <QtDBus/QDBusInterface>
2322
2423/**
2524 * @brief The OrientationLock class exports orientation lock related properties to QML
@@ -52,8 +51,7 @@ private Q_SLOTS:
5251 void onEnabledChanged();
5352
5453private:
55− QDBusInterface *dbusInterface;
56− GSettings *systemSettings;
54+ GSettings *m_systemSettings;
5755
5856 bool m_enabled;
5957 Qt::ScreenOrientation m_savedOrientation;
po/br.po+5−5
@@ -8,13 +8,13 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"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"
1212"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
1313"Language-Team: Breton <br@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
17+"X-Launchpad-Export-Date: 2014-10-01 06:25+0000\n"
1818"X-Generator: Launchpad (build 17196)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:130
@@ -82,7 +82,7 @@ msgstr "Lazhañ"
8282
8383#: qml/Components/Dialogs.qml:157
8484msgid "Restart"
85−msgstr ""
85+msgstr "Adloc'hañ"
8686
8787#: qml/Components/Dialogs.qml:167
8888msgid "Cancel"
@@ -213,7 +213,7 @@ msgstr "Kas"
213213
214214#: qml/Dash/ScopesOverview.qml:206
215215msgid "Manage Scopes"
216−msgstr ""
216+msgstr "Merañ ar c'hefluskerioù enklask"
217217
218218#: qml/Dash/ScopesOverview.qml:428
219219msgid "Done"
@@ -277,7 +277,7 @@ msgstr "Kendiviz"
277277
278278#: qml/Panel/Indicators/MenuItemFactory.qml:600
279279msgid "Nothing is playing"
280−msgstr ""
280+msgstr "Ne lenner netra bremañ"
281281
282282#: qml/Panel/Indicators/MenuItemFactory.qml:748
283283msgid "In queue…"
po/de.po+28−28
@@ -8,25 +8,25 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-23 08:31+0000\n"
12−"Last-Translator: Martin Pitt <martin.pitt@ubuntu.com>\n"
11+"PO-Revision-Date: 2014-09-29 06:33+0000\n"
12+"Last-Translator: Niklas Wenzel <nikwen.developer@gmail.com>\n"
1313"Language-Team: German <de@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
17+"X-Launchpad-Export-Date: 2014-09-30 07:10+0000\n"
1818"X-Generator: Launchpad (build 17196)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:130
2121msgid "Password: "
2222msgstr "Passwort: "
2323
24−#: plugins/Unity/Launcher/launcheritem.cpp:45
25−#: plugins/Unity/Launcher/launcheritem.cpp:91
24+#: plugins/Unity/Launcher/launcheritem.cpp:44
25+#: plugins/Unity/Launcher/launcheritem.cpp:74
2626msgid "Pin shortcut"
2727msgstr "Verknüpfung anheften"
2828
29−#: plugins/Unity/Launcher/launcheritem.cpp:91
29+#: plugins/Unity/Launcher/launcheritem.cpp:74
3030msgid "Unpin shortcut"
3131msgstr "Verknüpfung entfernen"
3232
@@ -164,15 +164,15 @@ msgstr "Hallo %1"
164164msgid "Hello"
165165msgstr "Hallo"
166166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:533
167+#: qml/Dash/GenericScopeView.qml:364 qml/Dash/GenericScopeView.qml:483
168168msgid "See less"
169169msgstr "Weniger ansehen"
170170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:364
172172msgid "See all"
173173msgstr "Alle anzeigen"
174174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:427 qml/Dash/PageHeader.qml:258
176176#: qml/Panel/SearchIndicator.qml:27
177177msgid "Search"
178178msgstr "Suchen"
@@ -211,7 +211,7 @@ msgstr "Senden"
211211
212212#: qml/Dash/ScopesOverview.qml:206
213213msgid "Manage Scopes"
214−msgstr ""
214+msgstr "Filter verwalten"
215215
216216#: qml/Dash/ScopesOverview.qml:428
217217msgid "Done"
@@ -275,29 +275,29 @@ msgstr "Konferenz"
275275
276276#: qml/Panel/Indicators/MenuItemFactory.qml:600
277277msgid "Nothing is playing"
278−msgstr ""
278+msgstr "Nichts wird abgespielt"
279279
280−#: qml/Panel/Indicators/MenuItemFactory.qml:748
280+#: qml/Panel/Indicators/MenuItemFactory.qml:651
281281msgid "In queue…"
282282msgstr "In Warteschlange …"
283283
284−#: qml/Panel/Indicators/MenuItemFactory.qml:752
284+#: qml/Panel/Indicators/MenuItemFactory.qml:655
285285msgid "Downloading"
286286msgstr "Wird heruntergeladen"
287287
288−#: qml/Panel/Indicators/MenuItemFactory.qml:754
288+#: qml/Panel/Indicators/MenuItemFactory.qml:657
289289msgid "Paused, tap to resume"
290290msgstr "Pausiert, tippen Sie zum fortsetzen"
291291
292−#: qml/Panel/Indicators/MenuItemFactory.qml:756
292+#: qml/Panel/Indicators/MenuItemFactory.qml:659
293293msgid "Canceled"
294294msgstr "Abgebrochen"
295295
296−#: qml/Panel/Indicators/MenuItemFactory.qml:758
296+#: qml/Panel/Indicators/MenuItemFactory.qml:661
297297msgid "Finished"
298298msgstr "Erledigt"
299299
300−#: qml/Panel/Indicators/MenuItemFactory.qml:760
300+#: qml/Panel/Indicators/MenuItemFactory.qml:663
301301msgid "Failed, tap to retry"
302302msgstr "Fehlgeschlagen, tippen Sie zum Wiederholen"
303303
@@ -309,45 +309,45 @@ msgstr "SIM-Karte entsperren"
309309msgid "Roaming"
310310msgstr "Roaming"
311311
312−#: qml/Shell.qml:320
312+#: qml/Shell.qml:292
313313msgid "Enter your passphrase"
314314msgstr "Geben Sie Ihr Passwort ein"
315315
316−#: qml/Shell.qml:321
316+#: qml/Shell.qml:293
317317msgid "Sorry, incorrect passphrase"
318318msgstr "Das Passwort ist nicht korrekt"
319319
320−#: qml/Shell.qml:323
320+#: qml/Shell.qml:295
321321msgid "Enter your passcode"
322322msgstr "Passwort eingeben"
323323
324−#: qml/Shell.qml:324
324+#: qml/Shell.qml:296
325325msgid "Sorry, incorrect passcode"
326326msgstr "Falsches Passwort"
327327
328−#: qml/Shell.qml:327
328+#: qml/Shell.qml:299
329329#, qt-format
330330msgid "Enter your %1"
331331msgstr "%1 eingeben"
332332
333−#: qml/Shell.qml:328
333+#: qml/Shell.qml:300
334334#, qt-format
335335msgid "Sorry, incorrect %1"
336336msgstr "%1 falsch"
337337
338−#: qml/Shell.qml:363
338+#: qml/Shell.qml:335
339339msgid "Sorry, incorrect passphrase."
340340msgstr "Falsches Passwort."
341341
342−#: qml/Shell.qml:364
342+#: qml/Shell.qml:336
343343msgid "Sorry, incorrect passcode."
344344msgstr "Falsche PIN"
345345
346−#: qml/Shell.qml:365
346+#: qml/Shell.qml:337
347347msgid "This will be your last attempt."
348348msgstr "Dies ist Ihr letzter Versuch."
349349
350−#: qml/Shell.qml:367
350+#: qml/Shell.qml:339
351351msgid ""
352352"If passphrase is entered incorrectly, your phone will conduct a factory "
353353"reset and all personal data will be deleted."
@@ -355,7 +355,7 @@ msgstr ""
355355"Wird das Passwort falsch eingegeben, wird das Telefon auf den Werkszustand "
356356"zurückgesetzt und alle Daten werden gelöscht."
357357
358−#: qml/Shell.qml:368
358+#: qml/Shell.qml:340
359359msgid ""
360360"If passcode is entered incorrectly, your phone will conduct a factory reset "
361361"and all personal data will be deleted."
po/es.po+28−28
@@ -8,25 +8,25 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-23 04:06+0000\n"
12−"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
11+"PO-Revision-Date: 2014-09-29 20:25+0000\n"
12+"Last-Translator: Víctor R. Ruiz <Unknown>\n"
1313"Language-Team: Spanish <es@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
17+"X-Launchpad-Export-Date: 2014-09-30 07:10+0000\n"
1818"X-Generator: Launchpad (build 17196)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:130
2121msgid "Password: "
2222msgstr "Contraseña: "
2323
24−#: plugins/Unity/Launcher/launcheritem.cpp:45
25−#: plugins/Unity/Launcher/launcheritem.cpp:91
24+#: plugins/Unity/Launcher/launcheritem.cpp:44
25+#: plugins/Unity/Launcher/launcheritem.cpp:74
2626msgid "Pin shortcut"
2727msgstr "Anclar"
2828
29−#: plugins/Unity/Launcher/launcheritem.cpp:91
29+#: plugins/Unity/Launcher/launcheritem.cpp:74
3030msgid "Unpin shortcut"
3131msgstr "Desanclar"
3232
@@ -164,15 +164,15 @@ msgstr "Hola, %1"
164164msgid "Hello"
165165msgstr "Hola"
166166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:533
167+#: qml/Dash/GenericScopeView.qml:364 qml/Dash/GenericScopeView.qml:483
168168msgid "See less"
169169msgstr "Ver menos"
170170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:364
172172msgid "See all"
173173msgstr "Ver todo"
174174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:427 qml/Dash/PageHeader.qml:258
176176#: qml/Panel/SearchIndicator.qml:27
177177msgid "Search"
178178msgstr "Buscar"
@@ -211,7 +211,7 @@ msgstr "Enviar"
211211
212212#: qml/Dash/ScopesOverview.qml:206
213213msgid "Manage Scopes"
214−msgstr ""
214+msgstr "Administrar ámbitos"
215215
216216#: qml/Dash/ScopesOverview.qml:428
217217msgid "Done"
@@ -275,29 +275,29 @@ msgstr "Conferencia"
275275
276276#: qml/Panel/Indicators/MenuItemFactory.qml:600
277277msgid "Nothing is playing"
278−msgstr ""
278+msgstr "Ningún contenido en reproducción"
279279
280−#: qml/Panel/Indicators/MenuItemFactory.qml:748
280+#: qml/Panel/Indicators/MenuItemFactory.qml:651
281281msgid "In queue…"
282282msgstr "En espera…"
283283
284−#: qml/Panel/Indicators/MenuItemFactory.qml:752
284+#: qml/Panel/Indicators/MenuItemFactory.qml:655
285285msgid "Downloading"
286286msgstr "Descargando"
287287
288−#: qml/Panel/Indicators/MenuItemFactory.qml:754
288+#: qml/Panel/Indicators/MenuItemFactory.qml:657
289289msgid "Paused, tap to resume"
290290msgstr "Pausado, toque para reanudar"
291291
292−#: qml/Panel/Indicators/MenuItemFactory.qml:756
292+#: qml/Panel/Indicators/MenuItemFactory.qml:659
293293msgid "Canceled"
294294msgstr "Cancelado"
295295
296−#: qml/Panel/Indicators/MenuItemFactory.qml:758
296+#: qml/Panel/Indicators/MenuItemFactory.qml:661
297297msgid "Finished"
298298msgstr "Finalizado"
299299
300−#: qml/Panel/Indicators/MenuItemFactory.qml:760
300+#: qml/Panel/Indicators/MenuItemFactory.qml:663
301301msgid "Failed, tap to retry"
302302msgstr "Falló, toque para reintentar"
303303
@@ -309,45 +309,45 @@ msgstr "Desbloquear SIM"
309309msgid "Roaming"
310310msgstr "Itinerancia"
311311
312−#: qml/Shell.qml:320
312+#: qml/Shell.qml:292
313313msgid "Enter your passphrase"
314314msgstr "Escriba su contraseña"
315315
316−#: qml/Shell.qml:321
316+#: qml/Shell.qml:293
317317msgid "Sorry, incorrect passphrase"
318318msgstr "La contraseña es incorrecta"
319319
320−#: qml/Shell.qml:323
320+#: qml/Shell.qml:295
321321msgid "Enter your passcode"
322322msgstr "Escriba su código de acceso"
323323
324−#: qml/Shell.qml:324
324+#: qml/Shell.qml:296
325325msgid "Sorry, incorrect passcode"
326326msgstr "El código es incorrecto"
327327
328−#: qml/Shell.qml:327
328+#: qml/Shell.qml:299
329329#, qt-format
330330msgid "Enter your %1"
331331msgstr "Introduzca su %1"
332332
333−#: qml/Shell.qml:328
333+#: qml/Shell.qml:300
334334#, qt-format
335335msgid "Sorry, incorrect %1"
336336msgstr "Incorrecto (%1)"
337337
338−#: qml/Shell.qml:363
338+#: qml/Shell.qml:335
339339msgid "Sorry, incorrect passphrase."
340340msgstr "La contraseña es incorrecta."
341341
342−#: qml/Shell.qml:364
342+#: qml/Shell.qml:336
343343msgid "Sorry, incorrect passcode."
344344msgstr "Código de acceso incorrecto."
345345
346−#: qml/Shell.qml:365
346+#: qml/Shell.qml:337
347347msgid "This will be your last attempt."
348348msgstr "Este será su último intento."
349349
350−#: qml/Shell.qml:367
350+#: qml/Shell.qml:339
351351msgid ""
352352"If passphrase is entered incorrectly, your phone will conduct a factory "
353353"reset and all personal data will be deleted."
@@ -355,7 +355,7 @@ msgstr ""
355355"Si se introduce la frase incorrectamente, el teléfono volverá a la "
356356"configuración de fábrica y se perderán todos los datos personales."
357357
358−#: qml/Shell.qml:368
358+#: qml/Shell.qml:340
359359msgid ""
360360"If passcode is entered incorrectly, your phone will conduct a factory reset "
361361"and all personal data will be deleted."
po/gd.po+4−4
@@ -8,13 +8,13 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"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"
1212"Last-Translator: GunChleoc <Unknown>\n"
1313"Language-Team: Fòram na Gàidhlig\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
17+"X-Launchpad-Export-Date: 2014-10-01 06:25+0000\n"
1818"X-Generator: Launchpad (build 17196)\n"
1919"Language: gd\n"
2020
@@ -215,7 +215,7 @@ msgstr "Cuir"
215215
216216#: qml/Dash/ScopesOverview.qml:206
217217msgid "Manage Scopes"
218−msgstr ""
218+msgstr "Stiùirich na sgòpaichean"
219219
220220#: qml/Dash/ScopesOverview.qml:428
221221msgid "Done"
@@ -279,7 +279,7 @@ msgstr "Gairm co-labhairt"
279279
280280#: qml/Panel/Indicators/MenuItemFactory.qml:600
281281msgid "Nothing is playing"
282−msgstr ""
282+msgstr "Chan eil dad 'ga chluich"
283283
284284#: qml/Panel/Indicators/MenuItemFactory.qml:748
285285msgid "In queue…"
po/it.po+5−5
@@ -8,13 +8,13 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-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"
1212"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
1313"Language-Team: Italian <it@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
17+"X-Launchpad-Export-Date: 2014-10-01 06:25+0000\n"
1818"X-Generator: Launchpad (build 17196)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:130
@@ -82,7 +82,7 @@ msgstr "Spegni"
8282
8383#: qml/Components/Dialogs.qml:157
8484msgid "Restart"
85−msgstr ""
85+msgstr "Riavvia"
8686
8787#: qml/Components/Dialogs.qml:167
8888msgid "Cancel"
@@ -213,7 +213,7 @@ msgstr "Invia"
213213
214214#: qml/Dash/ScopesOverview.qml:206
215215msgid "Manage Scopes"
216−msgstr ""
216+msgstr "Gestisci Scope"
217217
218218#: qml/Dash/ScopesOverview.qml:428
219219msgid "Done"
@@ -277,7 +277,7 @@ msgstr "Conferenza"
277277
278278#: qml/Panel/Indicators/MenuItemFactory.qml:600
279279msgid "Nothing is playing"
280−msgstr ""
280+msgstr "Niente in riproduzione"
281281
282282#: qml/Panel/Indicators/MenuItemFactory.qml:748
283283msgid "In queue…"
po/nb.po+27−27
@@ -8,25 +8,25 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"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"
1212"Last-Translator: Åka Sikrom <Unknown>\n"
1313"Language-Team: Norwegian Bokmal <nb@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
17+"X-Launchpad-Export-Date: 2014-09-30 07:10+0000\n"
1818"X-Generator: Launchpad (build 17196)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:130
2121msgid "Password: "
2222msgstr "Passord: "
2323
24−#: plugins/Unity/Launcher/launcheritem.cpp:45
25−#: plugins/Unity/Launcher/launcheritem.cpp:91
24+#: plugins/Unity/Launcher/launcheritem.cpp:44
25+#: plugins/Unity/Launcher/launcheritem.cpp:74
2626msgid "Pin shortcut"
2727msgstr "Fest snarvei"
2828
29−#: plugins/Unity/Launcher/launcheritem.cpp:91
29+#: plugins/Unity/Launcher/launcheritem.cpp:74
3030msgid "Unpin shortcut"
3131msgstr "Fjern snarvei"
3232
@@ -161,15 +161,15 @@ msgstr "Hei, %1"
161161msgid "Hello"
162162msgstr "Hei"
163163
164−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:533
164+#: qml/Dash/GenericScopeView.qml:364 qml/Dash/GenericScopeView.qml:483
165165msgid "See less"
166166msgstr "Vis mindre"
167167
168−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:364
169169msgid "See all"
170170msgstr "Vis alt"
171171
172−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:427 qml/Dash/PageHeader.qml:258
173173#: qml/Panel/SearchIndicator.qml:27
174174msgid "Search"
175175msgstr "Søk"
@@ -208,7 +208,7 @@ msgstr "Send"
208208
209209#: qml/Dash/ScopesOverview.qml:206
210210msgid "Manage Scopes"
211−msgstr ""
211+msgstr "Håndter virkefelt"
212212
213213#: qml/Dash/ScopesOverview.qml:428
214214msgid "Done"
@@ -272,29 +272,29 @@ msgstr "Konferanse"
272272
273273#: qml/Panel/Indicators/MenuItemFactory.qml:600
274274msgid "Nothing is playing"
275−msgstr ""
275+msgstr "Ingenting spilles nå"
276276
277−#: qml/Panel/Indicators/MenuItemFactory.qml:748
277+#: qml/Panel/Indicators/MenuItemFactory.qml:651
278278msgid "In queue…"
279279msgstr "I kø …"
280280
281−#: qml/Panel/Indicators/MenuItemFactory.qml:752
281+#: qml/Panel/Indicators/MenuItemFactory.qml:655
282282msgid "Downloading"
283283msgstr "Laster ned"
284284
285−#: qml/Panel/Indicators/MenuItemFactory.qml:754
285+#: qml/Panel/Indicators/MenuItemFactory.qml:657
286286msgid "Paused, tap to resume"
287287msgstr "Satt på pause (trykk for å fortsette)"
288288
289−#: qml/Panel/Indicators/MenuItemFactory.qml:756
289+#: qml/Panel/Indicators/MenuItemFactory.qml:659
290290msgid "Canceled"
291291msgstr "Avbrutt"
292292
293−#: qml/Panel/Indicators/MenuItemFactory.qml:758
293+#: qml/Panel/Indicators/MenuItemFactory.qml:661
294294msgid "Finished"
295295msgstr "Ferdig"
296296
297−#: qml/Panel/Indicators/MenuItemFactory.qml:760
297+#: qml/Panel/Indicators/MenuItemFactory.qml:663
298298msgid "Failed, tap to retry"
299299msgstr "Feilet. Trykk for å prøve på nytt"
300300
@@ -306,45 +306,45 @@ msgstr "Lås opp SIM"
306306msgid "Roaming"
307307msgstr "Fremmednett"
308308
309−#: qml/Shell.qml:320
309+#: qml/Shell.qml:292
310310msgid "Enter your passphrase"
311311msgstr "Skriv inn passordfrasen din"
312312
313−#: qml/Shell.qml:321
313+#: qml/Shell.qml:293
314314msgid "Sorry, incorrect passphrase"
315315msgstr "Feil passordfrase"
316316
317−#: qml/Shell.qml:323
317+#: qml/Shell.qml:295
318318msgid "Enter your passcode"
319319msgstr "Tast koden din"
320320
321−#: qml/Shell.qml:324
321+#: qml/Shell.qml:296
322322msgid "Sorry, incorrect passcode"
323323msgstr "Feil kode"
324324
325−#: qml/Shell.qml:327
325+#: qml/Shell.qml:299
326326#, qt-format
327327msgid "Enter your %1"
328328msgstr "Skriv inn %1"
329329
330−#: qml/Shell.qml:328
330+#: qml/Shell.qml:300
331331#, qt-format
332332msgid "Sorry, incorrect %1"
333333msgstr "Feil %1"
334334
335−#: qml/Shell.qml:363
335+#: qml/Shell.qml:335
336336msgid "Sorry, incorrect passphrase."
337337msgstr "Feil passordfrase."
338338
339−#: qml/Shell.qml:364
339+#: qml/Shell.qml:336
340340msgid "Sorry, incorrect passcode."
341341msgstr "Feil kode."
342342
343−#: qml/Shell.qml:365
343+#: qml/Shell.qml:337
344344msgid "This will be your last attempt."
345345msgstr "Dette er ditt siste forsøk."
346346
347−#: qml/Shell.qml:367
347+#: qml/Shell.qml:339
348348msgid ""
349349"If passphrase is entered incorrectly, your phone will conduct a factory "
350350"reset and all personal data will be deleted."
@@ -352,7 +352,7 @@ msgstr ""
352352"Hvis du skriver feil passordfrase en gang til, tilbakestilles telefonen til "
353353"fabrikkinnstillinger, og alle personlige data slettes."
354354
355−#: qml/Shell.qml:368
355+#: qml/Shell.qml:340
356356msgid ""
357357"If passcode is entered incorrectly, your phone will conduct a factory reset "
358358"and all personal data will be deleted."
po/pt_BR.po+5−5
@@ -8,13 +8,13 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-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"
1212"Last-Translator: Rafael Neri <Unknown>\n"
1313"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
17+"X-Launchpad-Export-Date: 2014-10-01 06:25+0000\n"
1818"X-Generator: Launchpad (build 17196)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:130
@@ -82,7 +82,7 @@ msgstr "Desligar"
8282
8383#: qml/Components/Dialogs.qml:157
8484msgid "Restart"
85−msgstr ""
85+msgstr "Reiniciar"
8686
8787#: qml/Components/Dialogs.qml:167
8888msgid "Cancel"
@@ -210,7 +210,7 @@ msgstr "Enviar"
210210
211211#: qml/Dash/ScopesOverview.qml:206
212212msgid "Manage Scopes"
213−msgstr ""
213+msgstr "Gerenciar Plugins"
214214
215215#: qml/Dash/ScopesOverview.qml:428
216216msgid "Done"
@@ -274,7 +274,7 @@ msgstr "Conferência"
274274
275275#: qml/Panel/Indicators/MenuItemFactory.qml:600
276276msgid "Nothing is playing"
277−msgstr ""
277+msgstr "Nada está tocando"
278278
279279#: qml/Panel/Indicators/MenuItemFactory.qml:748
280280msgid "In queue…"
po/ug.po+24−24
@@ -14,19 +14,19 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
17+"X-Launchpad-Export-Date: 2014-09-30 07:10+0000\n"
1818"X-Generator: Launchpad (build 17196)\n"
1919
2020#: plugins/LightDM/Greeter.cpp:130
2121msgid "Password: "
2222msgstr "ئىم: "
2323
24−#: plugins/Unity/Launcher/launcheritem.cpp:45
25−#: plugins/Unity/Launcher/launcheritem.cpp:91
24+#: plugins/Unity/Launcher/launcheritem.cpp:44
25+#: plugins/Unity/Launcher/launcheritem.cpp:74
2626msgid "Pin shortcut"
2727msgstr "تېزلەتمىنى قوي"
2828
29−#: plugins/Unity/Launcher/launcheritem.cpp:91
29+#: plugins/Unity/Launcher/launcheritem.cpp:74
3030msgid "Unpin shortcut"
3131msgstr "تېزلەتمىنى ئېلىۋەت"
3232
@@ -161,15 +161,15 @@ msgstr "سالام %1"
161161msgid "Hello"
162162msgstr "ئەسسالامۇئەلەيكۇم"
163163
164−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:533
164+#: qml/Dash/GenericScopeView.qml:364 qml/Dash/GenericScopeView.qml:483
165165msgid "See less"
166166msgstr "ئازراق كۆرۈش"
167167
168−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:364
169169msgid "See all"
170170msgstr "ھەممىنى كۆرۈش…"
171171
172−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:427 qml/Dash/PageHeader.qml:258
173173#: qml/Panel/SearchIndicator.qml:27
174174msgid "Search"
175175msgstr "ئىزدە"
@@ -274,27 +274,27 @@ msgstr "يىغىن"
274274msgid "Nothing is playing"
275275msgstr "ھېچ نېمە قويۇلمايۋاتىدۇ"
276276
277−#: qml/Panel/Indicators/MenuItemFactory.qml:748
277+#: qml/Panel/Indicators/MenuItemFactory.qml:651
278278msgid "In queue…"
279279msgstr "قاتاردا…"
280280
281−#: qml/Panel/Indicators/MenuItemFactory.qml:752
281+#: qml/Panel/Indicators/MenuItemFactory.qml:655
282282msgid "Downloading"
283283msgstr "چۈشۈرۈۋاتىدۇ"
284284
285−#: qml/Panel/Indicators/MenuItemFactory.qml:754
285+#: qml/Panel/Indicators/MenuItemFactory.qml:657
286286msgid "Paused, tap to resume"
287287msgstr "توختىتىلغان، چەكسە داۋاملىشىدۇ"
288288
289−#: qml/Panel/Indicators/MenuItemFactory.qml:756
289+#: qml/Panel/Indicators/MenuItemFactory.qml:659
290290msgid "Canceled"
291291msgstr "قالدۇرۇۋېتىلدى"
292292
293−#: qml/Panel/Indicators/MenuItemFactory.qml:758
293+#: qml/Panel/Indicators/MenuItemFactory.qml:661
294294msgid "Finished"
295295msgstr "تاماملاندى"
296296
297−#: qml/Panel/Indicators/MenuItemFactory.qml:760
297+#: qml/Panel/Indicators/MenuItemFactory.qml:663
298298msgid "Failed, tap to retry"
299299msgstr "مەغلۇپ بولدى، چېكىپ قايتا سىناڭ"
300300
@@ -306,45 +306,45 @@ msgstr "SIM نى قۇلۇپسىزلاش"
306306msgid "Roaming"
307307msgstr "كەزمە"
308308
309−#: qml/Shell.qml:320
309+#: qml/Shell.qml:292
310310msgid "Enter your passphrase"
311311msgstr "ئىمىڭىزنى كىرگۈزۈڭ"
312312
313−#: qml/Shell.qml:321
313+#: qml/Shell.qml:293
314314msgid "Sorry, incorrect passphrase"
315315msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
316316
317−#: qml/Shell.qml:323
317+#: qml/Shell.qml:295
318318msgid "Enter your passcode"
319319msgstr "ئىمىڭىزنى كىرگۈزۈڭ"
320320
321−#: qml/Shell.qml:324
321+#: qml/Shell.qml:296
322322msgid "Sorry, incorrect passcode"
323323msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
324324
325−#: qml/Shell.qml:327
325+#: qml/Shell.qml:299
326326#, qt-format
327327msgid "Enter your %1"
328328msgstr "%1 نى كىرگۈزۈڭ"
329329
330−#: qml/Shell.qml:328
330+#: qml/Shell.qml:300
331331#, qt-format
332332msgid "Sorry, incorrect %1"
333333msgstr "كەچۈرۈڭ، %1 توغرا ئەمەس"
334334
335−#: qml/Shell.qml:363
335+#: qml/Shell.qml:335
336336msgid "Sorry, incorrect passphrase."
337337msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
338338
339−#: qml/Shell.qml:364
339+#: qml/Shell.qml:336
340340msgid "Sorry, incorrect passcode."
341341msgstr "كەچۈرۈڭ، ئىم كودى ئەمەس"
342342
343−#: qml/Shell.qml:365
343+#: qml/Shell.qml:337
344344msgid "This will be your last attempt."
345345msgstr "بۇ سىزنىڭ ئەڭ ئاخىرقى پۇرسىتىڭىز"
346346
347−#: qml/Shell.qml:367
347+#: qml/Shell.qml:339
348348msgid ""
349349"If passphrase is entered incorrectly, your phone will conduct a factory "
350350"reset and all personal data will be deleted."
@@ -352,7 +352,7 @@ msgstr ""
352352"ئەگەر ئىم توغرا بولمىسا، تېلېفونىڭىز ئەسلىگە قايتۇرۇلۇپ، زاۋۇتتىن چىققان "
353353"ھالەتكە كېلىپ قالىدۇ. بارلىق مەزمۇنلار يوقىلىدۇ."
354354
355−#: qml/Shell.qml:368
355+#: qml/Shell.qml:340
356356msgid ""
357357"If passcode is entered incorrectly, your phone will conduct a factory reset "
358358"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 {
2424 // Determine if a numeric or alphanumeric pad is used.
2525 property bool alphaNumeric: false
2626
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+
2733 // Informational text. (e.g. some text to tell which domain this is pin is entered for)
2834 property string infoText: ""
2935
3036 // Retries text (e.g. 3 retries left)
37+ // (This is not currently used, but will be necessary for SIM unlock screen)
3138 property string retryText: ""
3239
3340 // The text to be displayed in case the login failed
3441 property string errorText: ""
3542
36− // In case the Lockscreen can show a greeter message, this is the username
37− property string username: ""
43+ // If > 0, a forced delay is happening
44+ property int delayMinutes: 0
3845
3946 // Set those to a value greater 0 to restrict the pin length.
4047 // If both are unset, the Lockscreen will show a confirm button and allow typing any length of pin before
@@ -54,16 +61,7 @@ Showable {
5461 signal emergencyCall()
5562 signal infoPopupConfirmed()
5663
57− onRequiredChanged: {
58− if (required && pinPadLoader.item) {
59− clear(false)
60− }
61− }
62−
63− function forceDelay(delay) {
64− forcedDelayTimer.interval = delay
65− forcedDelayTimer.start()
66− }
64+ onActiveFocusChanged: if (activeFocus && pinPadLoader.item) pinPadLoader.item.forceActiveFocus()
6765
6866 function reset() {
6967 // This causes the loader below to destry and recreate the source
@@ -83,16 +81,12 @@ Showable {
8381 PopupUtils.open(infoPopupComponent, root, {title: title, text: text})
8482 }
8583
86− Timer {
87− id: forcedDelayTimer
88− onTriggered: pinPadLoader.showWrongText = false
89− }
90−
9184 Rectangle {
92− // In case background fails to load or is undefined
85+ // In case background fails to load
9386 id: backgroundBackup
9487 anchors.fill: parent
9588 color: "black"
89+ visible: root.background.toString() !== ""
9690 }
9791
9892 Image {
@@ -107,111 +101,141 @@ Showable {
107101
108102 MouseArea {
109103 anchors.fill: root
104+ onClicked: {
105+ if (pinPadLoader.item)
106+ pinPadLoader.item.forceActiveFocus()
107+ }
110108 }
111109
112− Loader {
113− id: pinPadLoader
114− objectName: "pinPadLoader"
115− anchors {
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
122− property bool waiting: false
123− property bool showWrongText: false
124−
125− source: (!resetting && root.required) ? (root.alphaNumeric ? "PassphraseLockscreen.qml" : "PinLockscreen.qml") : ""
126− onSourceChanged: {
127− waiting = false
128− showWrongText = false
129− }
130− onLoaded: {
131− if (forcedDelayTimer.running) {
132− pinPadLoader.item.clear(true)
110+ FocusScope {
111+ id: loaderScope
112+ anchors.fill: parent
113+
114+ Loader {
115+ id: pinPadLoader
116+ objectName: "pinPadLoader"
117+ anchors.fill: parent
118+ property bool resetting: false
119+ property bool waiting: false
120+ property bool showWrongText: false
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) {
128+ return "PassphraseLockscreen.qml"
129+ } else {
130+ return "PinLockscreen.qml"
131+ }
132+ }
133+ onSourceChanged: {
134+ waiting = false
135+ showWrongText = false
136+ if (loaderScope.activeFocus && pinPadLoader.item)
137+ pinPadLoader.item.forceActiveFocus()
133138 }
134− }
135139
136− Connections {
137− target: pinPadLoader.item
140+ Connections {
141+ target: pinPadLoader.item
138142
139− onEntered: {
140− pinPadLoader.waiting = true
141− root.entered(passphrase);
142− }
143+ onEntered: {
144+ pinPadLoader.waiting = true
145+ root.entered(passphrase);
146+ }
143147
144− onCancel: {
145− root.cancel()
148+ onCancel: {
149+ root.cancel()
150+ }
146151 }
147− }
148152
149− Binding {
150− target: pinPadLoader.item
151− property: "minPinLength"
152− value: root.minPinLength
153− }
154− Binding {
155− target: pinPadLoader.item
156− property: "maxPinLength"
157− value: root.maxPinLength
158− }
159− Binding {
160− target: pinPadLoader.item
161− property: "infoText"
162− value: root.infoText
163− }
164− Binding {
165− target: pinPadLoader.item
166− property: "retryText"
167− value: forcedDelayTimer.running ? i18n.tr("Please wait") : root.retryText
168− }
169− Binding {
170− target: pinPadLoader.item
171− property: "errorText"
172− value: forcedDelayTimer.running ? i18n.tr("Too many incorrect attempts") :
173− (pinPadLoader.showWrongText ? root.errorText : "")
174− }
175− Binding {
176− target: pinPadLoader.item
177− property: "username"
178− value: root.username
153+ Binding {
154+ target: pinPadLoader.item
155+ property: "minPinLength"
156+ value: root.minPinLength
157+ }
158+ Binding {
159+ target: pinPadLoader.item
160+ property: "maxPinLength"
161+ value: root.maxPinLength
162+ }
163+ Binding {
164+ target: pinPadLoader.item
165+ property: "infoText"
166+ value: root.infoText
167+ }
168+ Binding {
169+ target: pinPadLoader.item
170+ property: "retryText"
171+ value: root.retryText
172+ }
173+ Binding {
174+ target: pinPadLoader.item
175+ property: "errorText"
176+ value: pinPadLoader.showWrongText ? root.errorText : ""
177+ }
178+ Binding {
179+ target: pinPadLoader.item
180+ property: "entryEnabled"
181+ value: !pinPadLoader.waiting
182+ }
183+ Binding {
184+ target: pinPadLoader.item
185+ property: "alphaNumeric"
186+ value: root.alphaNumeric
187+ }
188+ Binding {
189+ target: pinPadLoader.item
190+ property: "delayMinutes"
191+ value: root.delayMinutes
192+ }
179193 }
180194 Binding {
181195 target: pinPadLoader.item
182− property: "entryEnabled"
183− value: !pinPadLoader.waiting && !forcedDelayTimer.running
196+ property: "showCancelButton"
197+ value: root.showCancelButton
184198 }
185199 }
186200
187− Label {
188− id: emergencyCallLabel
189− objectName: "emergencyCallLabel"
201+ Item {
202+ id: emergencyCallRow
190203
191− // FIXME: We *should* show emergency dialer if there is a SIM present,
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
204+ visible: showEmergencyCallButton
199205
200206 anchors {
201207 bottom: parent.bottom
202− bottomMargin: units.gu(4)
203− horizontalCenter: parent.horizontalCenter
208+ bottomMargin: units.gu(7) + (Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0)
209+ left: parent.left
210+ right: parent.right
204211 }
205212
206− text: i18n.tr("Emergency Call")
207− color: "#f3f3e7"
208− opacity: 0.6
209− }
213+ Label {
214+ id: emergencyCallLabel
215+ objectName: "emergencyCallLabel"
216+ anchors.horizontalCenter: parent.horizontalCenter
210217
211− MouseArea {
212− anchors.fill: emergencyCallLabel
213− onClicked: root.emergencyCall()
214− enabled: emergencyCallLabel.visible
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+
232+ MouseArea {
233+ anchors.top: emergencyCallLabel.top
234+ anchors.bottom: emergencyCallLabel.bottom
235+ anchors.left: emergencyCallLabel.left
236+ anchors.right: emergencyCallIcon.right
237+ onClicked: root.emergencyCall()
238+ }
215239 }
216240
217241 Component {
qml/Components/PassphraseLockscreen.qml+96−43
@@ -20,10 +20,12 @@ import "../Components"
2020
2121Item {
2222 id: root
23− height: highlightItem.height
23+ anchors.top: parent.top
24+ anchors.topMargin: units.gu(4)
25+ height: shakeContainer.height
2426
2527 property string infoText
26− property string username: ""
28+ property string errorText
2729 property bool entryEnabled: true
2830
2931 signal entered(string passphrase)
@@ -31,64 +33,115 @@ Item {
3133
3234 function clear(playAnimation) {
3335 pinentryField.text = "";
36+ pinentryField.incorrectOverride = false;
37+ pinentryField.forceActiveFocus();
3438 if (playAnimation) {
3539 wrongPasswordAnimation.start();
36− pinentryField.forceActiveFocus();
37− } else {
38− pinentryField.focus = false
3940 }
4041 }
4142
42− Rectangle {
43− id: highlightItem
44− width: units.gu(32)
45− height: units.gu(10)
46− anchors.centerIn: parent
47− color: Qt.rgba(0.1, 0.1, 0.1, 0.4)
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)
51− antialiasing: true
43+ onActiveFocusChanged: if (activeFocus) pinentryField.forceActiveFocus()
44+
45+ Column {
46+ id: shakeContainer
47+ anchors.horizontalCenter: parent.horizontalCenter
48+ width: parent.width
49+ spacing: units.gu(2)
5250
5351 Label {
54− objectName: "greeterLabel"
55− anchors {
56− left: parent.left
57− top: parent.top
58− right: parent.right
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"
52+ id: infoField
53+ objectName: "infoTextLabel"
54+ fontSize: "x-large"
55+ color: "#f3f3e7"
56+ anchors.horizontalCenter: parent.horizontalCenter
57+ text: root.infoText
6358 }
6459
65− TextField {
66− id: pinentryField
67− objectName: "pinentryField"
68− anchors {
69− horizontalCenter: parent.horizontalCenter
70− bottom: parent.bottom
71− margins: units.gu(1)
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
67+ objectName: "pinentryField"
68+
69+ property bool incorrectOverride: false
70+
71+ anchors {
72+ top: parent.top
73+ left: parent.left
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+ }
72109 }
73− height: units.gu(4.5)
74− width: parent.width - units.gu(2)
75− echoMode: TextInput.Password
76− opacity: 0.9
77− hasClearButton: false
78− enabled: root.entryEnabled
79− placeholderText: root.infoText
80−
81− onAccepted: {
82− if (pinentryField.text) {
83− root.entered(pinentryField.text);
110+
111+ Row {
112+ id: dotRow
113+ anchors.centerIn: entryContainer
114+
115+ property real dotSize: Math.min(units.gu(2), entryContainer.width / pinentryField.length)
116+ spacing: Math.min(units.gu(2), Math.max(0, (entryContainer.width / pinentryField.length) - dotSize))
117+
118+ Repeater {
119+ model: pinentryField.length
120+ delegate: Rectangle {
121+ color: "#f3f3e7"
122+ width: dotRow.dotSize
123+ height: width
124+ radius: width / 2
125+ }
84126 }
85127 }
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+ }
86139 }
87140 }
88141
89142 WrongPasswordAnimation {
90143 id: wrongPasswordAnimation
91144 objectName: "wrongPasswordAnimation"
92− target: pinentryField
145+ target: shakeContainer
93146 }
94147}
qml/Components/PinLockscreen.qml+10−5
@@ -21,7 +21,9 @@ import "../Components"
2121
2222Column {
2323 id: root
24− anchors.centerIn: parent
24+ anchors.top: parent.top
25+ anchors.topMargin: units.gu(4)
26+ anchors.horizontalCenter: parent.horizontalCenter
2527 spacing: units.gu(2)
2628
2729 property string infoText
@@ -31,6 +33,7 @@ Column {
3133 property int padHeight: units.gu(28)
3234 property int minPinLength: -1
3335 property int maxPinLength: -1
36+ property bool showCancelButton: true
3437
3538 signal entered(string passphrase)
3639 signal cancel()
@@ -49,7 +52,7 @@ Column {
4952 id: shakeContainer
5053 anchors.horizontalCenter: parent.horizontalCenter
5154 width: parent.width
52− spacing: units.gu(2)
55+ spacing: units.gu(1)
5356
5457 Label {
5558 id: infoField
@@ -108,6 +111,7 @@ Column {
108111 fontSize: "x-large"
109112 color: "#f3f3e7"
110113 anchors.horizontalCenter: parent.horizontalCenter
114+ horizontalAlignment: Text.AlignHCenter
111115 text: root.errorText
112116 visible: pinentryField.incorrectOverride
113117 }
@@ -193,19 +197,20 @@ Column {
193197 }
194198 PinPadButton {
195199 iconName: "close"
196− height: numbersGrid.buttonHeight
200+ height: units.gu(5) // visual spec has this row a little closer in
197201 width: numbersGrid.buttonWidth
198202
199203 onClicked: root.cancel()
204+ visible: root.showCancelButton
200205 }
201206 Item {
202− height: numbersGrid.buttonHeight
207+ height: units.gu(5)
203208 width: numbersGrid.buttonWidth
204209 }
205210 PinPadButton {
206211 iconName: "tick"
207212 objectName: "confirmButton"
208− height: numbersGrid.buttonHeight
213+ height: units.gu(5)
209214 width: numbersGrid.buttonWidth
210215 enabled: root.enabled && pinentryField.text.length >= root.minPinLength
211216 visible: root.minPinLength == -1 || root.minPinLength !== root.maxPinLength
qml/Dash/Dash.qml+1
@@ -275,6 +275,7 @@ Showable {
275275 left: parent.left
276276 right: parent.right
277277 bottom: parent.bottom
278+ bottomMargin: Qt.inputMethod.keyboardRectangle.height
278279 }
279280 height: units.dp(3)
280281 color: scopeStyle.backgroundLuminance > 0.7 ? "#50000000" : "#50ffffff"
qml/Dash/Previews/PreviewHeader.qml−1
@@ -97,7 +97,6 @@ PreviewWidget {
9797 font.weight: Font.Normal
9898 fontSize: "large"
9999 wrapMode: Text.Wrap
100− maximumLineCount: 2
101100 color: headerRoot.fontColor
102101 text: headerRoot.title
103102 }
qml/Greeter/Greeter.qml+1−1
@@ -154,7 +154,7 @@ Showable {
154154 anchors.horizontalCenter: parent.horizontalCenter
155155 anchors.bottom: parent.bottom
156156 anchors.bottomMargin: units.gu(5)
157− text: i18n.tr("Swipe to unlock")
157+ text: "《 " + i18n.tr("Unlock") + " 》"
158158 color: "white"
159159 font.weight: Font.Light
160160
qml/Greeter/GreeterContent.qml+3
@@ -47,6 +47,9 @@ Item {
4747 topMargin: backgroundTopMargin
4848 }
4949 fillMode: Image.PreserveAspectCrop
50+ // Limit how much memory we'll reserve for this image
51+ sourceSize.height: height
52+ sourceSize.width: width
5053 }
5154
5255 // See Shell.qml's backgroundSettings treatment for why we need a separate
qml/Panel/ActiveCallHint.qml+1−1
@@ -117,7 +117,7 @@ Item {
117117 verticalAlignment: Text.AlignVCenter
118118 horizontalAlignment: Text.AlignRight
119119 text: {
120− var m = Math.round(d.callTime/60);
120+ var m = Math.floor(d.callTime/60);
121121 var ss = d.callTime % 60;
122122 if (ss >= 10) {
123123 return m + ":" + ss;
qml/Panel/IndicatorItem.qml+6
@@ -39,6 +39,12 @@ Loader {
3939 }
4040 }
4141
42+ Binding {
43+ target: item
44+ property: "identifier"
45+ value: identifier
46+ }
47+
4248 Binding {
4349 target: item
4450 property: "objectName"
qml/Panel/Indicators/DefaultIndicatorPage.qml+1−1
@@ -130,7 +130,7 @@ IndicatorBase {
130130 visible: status == Loader.Ready
131131
132132 property int modelIndex: index
133− sourceComponent: factory.load(model, identifier)
133+ sourceComponent: factory.load(model, main.identifier)
134134
135135 onLoaded: {
136136 if (item.hasOwnProperty("selected")) {
qml/Panel/Indicators/IndicatorBase.qml+1
@@ -26,6 +26,7 @@ Item {
2626 enabled: menuObjectPath != ""
2727
2828 //const
29+ property string identifier
2930 property string busName
3031 property string actionsObjectPath
3132 property string menuObjectPath
qml/Panel/Indicators/MenuItemFactory.qml+1−1
@@ -823,7 +823,7 @@ Item {
823823 }
824824
825825 function load(modelData, context) {
826− if (modelData.type !== undefined) {
826+ if (modelData.type !== undefined && modelData.type !== "") {
827827 var component = undefined;
828828
829829 var contextComponents = _map[context];
qml/Panel/Indicators/VisibleIndicators.qml+1
@@ -55,6 +55,7 @@ Item {
5555 delegate: IndicatorDelegate {
5656 id: item
5757 objectName: model.identifier + "-delegate"
58+ identifier: model.identifier
5859 Component.onCompleted: {
5960 for(var pName in indicatorProperties) {
6061 if (item.hasOwnProperty(pName)) {
qml/Panel/MenuContent.qml+6
@@ -123,6 +123,12 @@ Rectangle {
123123 }
124124 }
125125
126+ Binding {
127+ target: loader.item
128+ property: "identifier"
129+ value: identifier
130+ }
131+
126132 Binding {
127133 target: loader.item
128134 property: "objectName"
qml/Shell.qml+46−17
@@ -60,7 +60,7 @@ Item {
6060
6161 property int maxFailedLogins: -1 // disabled by default for now, will enable via settings in future
6262 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
6464
6565 property int orientation
6666 readonly property int deviceOrientationAngle: Screen.angleBetween(Screen.primaryOrientation, Screen.orientation)
@@ -285,8 +285,6 @@ Item {
285285 id: lockscreen
286286 objectName: "lockscreen"
287287
288− readonly property int backgroundTopMargin: -panel.panelHeight
289−
290288 hides: [launcher, panel.indicators]
291289 shown: false
292290 enabled: true
@@ -301,12 +299,34 @@ Item {
301299 minPinLength: 4
302300 maxPinLength: 4
303301
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+
304311 onEntered: LightDM.Greeter.respond(passphrase);
305312 onCancel: greeter.show()
306313 onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter fake-active mode
307314
308315 onShownChanged: if (shown) greeter.fakeActiveForApp = ""
309316
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+
310330 Component.onCompleted: {
311331 if (greeter.narrowMode) {
312332 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole))
@@ -324,14 +344,15 @@ Item {
324344 if (greeter.narrowMode) {
325345 if (isDefaultPrompt) {
326346 if (lockscreen.alphaNumeric) {
327− lockscreen.infoText = i18n.tr("Enter your passphrase")
328− lockscreen.errorText = i18n.tr("Sorry, incorrect passphrase")
347+ lockscreen.infoText = i18n.tr("Enter passphrase")
348+ lockscreen.errorText = i18n.tr("Sorry, incorrect passphrase") + "\n" +
349+ i18n.tr("Please re-enter")
329350 } else {
330− lockscreen.infoText = i18n.tr("Enter your passcode")
351+ lockscreen.infoText = i18n.tr("Enter passcode")
331352 lockscreen.errorText = i18n.tr("Sorry, incorrect passcode")
332353 }
333354 } else {
334− lockscreen.infoText = i18n.tr("Enter your %1").arg(text.toLowerCase())
355+ lockscreen.infoText = i18n.tr("Enter %1").arg(text.toLowerCase())
335356 lockscreen.errorText = i18n.tr("Sorry, incorrect %1").arg(text.toLowerCase())
336357 }
337358
@@ -379,7 +400,8 @@ Item {
379400 }
380401 }
381402 if (failedLoginsDelayAttempts > 0 && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
382− lockscreen.forceDelay(failedLoginsDelaySeconds * 1000)
403+ lockscreen.delayMinutes = failedLoginsDelayMinutes
404+ forcedDelayTimer.start()
383405 }
384406
385407 lockscreen.clear(true);
@@ -425,7 +447,15 @@ Item {
425447 }
426448
427449 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
428− onShowProgressChanged: if (LightDM.Greeter.authenticated && showProgress === 0) greeter.login()
450+ onShowProgressChanged: {
451+ if (showProgress === 0) {
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+ }
429459
430460 Greeter {
431461 id: greeter
@@ -521,16 +551,19 @@ Item {
521551 }
522552
523553 function showDash() {
524− if (shell.locked) {
525− return;
554+ if (greeter.fakeActiveForApp !== "") { // just in case user gets here
555+ return
526556 }
557+
527558 if (greeter.shown) {
528559 greeter.hideRight();
529560 launcher.fadeOut();
530561 }
531562
532− ApplicationManager.requestFocusApplication("unity8-dash")
533− launcher.fadeOut();
563+ if (ApplicationManager.focusedApplicationId != "unity8-dash") {
564+ ApplicationManager.requestFocusApplication("unity8-dash")
565+ launcher.fadeOut();
566+ }
534567 }
535568
536569 Item {
@@ -576,10 +609,6 @@ Item {
576609 if (ApplicationManager.focusedApplicationId != "unity8-dash") {
577610 showDash()
578611 }
579− if (greeter.shown) {
580− launcher.fadeOut()
581− greeter.hideRight()
582− }
583612 }
584613 onDashSwipeChanged: {
585614 if (dashSwipe) {
tests/autopilot/unity8/shell/tests/test_lock_screen.py+3−1
@@ -132,8 +132,10 @@ class TestLockscreen(UnityTestCase):
132132 )
133133
134134 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)
136137 logger.debug("Typed passphrase: %s", pin_entry_field.text)
138+ self.assertEqual(pin_entry_field.text, passphrase)
137139 self.keyboard.type("\n")
138140
139141 def _enter_prompt_passphrase(self, passphrase):
tests/mocks/Ubuntu/Telephony/MockCallEntry.cpp+26−1
@@ -22,8 +22,8 @@ MockCallEntry::MockCallEntry(QObject *parent)
2222 : QObject(parent)
2323 , m_conference(false)
2424 , m_elapsed(0)
25+ , m_timer(0)
2526{
26− startTimer(1000);
2727}
2828
2929QString MockCallEntry::phoneNumber() const
@@ -52,11 +52,36 @@ void MockCallEntry::setIsConference(bool isConference)
5252 }
5353}
5454
55+void MockCallEntry::setElapsedTime(int elapsedTime)
56+{
57+ if (m_elapsed != elapsedTime) {
58+ m_elapsed = elapsedTime;
59+ Q_EMIT elapsedTimeChanged();
60+ }
61+}
62+
5563int MockCallEntry::elapsedTime() const
5664{
5765 return m_elapsed;
5866}
5967
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+
6085void MockCallEntry::timerEvent(QTimerEvent * event)
6186{
6287 Q_UNUSED(event);
tests/mocks/Ubuntu/Telephony/MockCallEntry.h+9−1
@@ -28,7 +28,10 @@ class MockCallEntry : public QObject
2828
2929 Q_PROPERTY(QString phoneNumber READ phoneNumber WRITE setPhoneNumber NOTIFY phoneNumberChanged)
3030 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)
3235
3336public:
3437 MockCallEntry(QObject *parent = 0);
@@ -36,14 +39,18 @@ public:
3639 QString phoneNumber() const;
3740 bool isConference() const;
3841 int elapsedTime() const;
42+ bool elapsedTimerRunning() const;
3943
4044 void setPhoneNumber(const QString& phoneNumber);
4145 void setIsConference(bool isConference);
46+ void setElapsedTime(int elapsedTime);
47+ void setSlapsedTimerRunning(bool elapsedTimerRunning);
4248
4349Q_SIGNALS:
4450 void phoneNumberChanged();
4551 void isConferenceChanged();
4652 void elapsedTimeChanged();
53+ void elapsedTimerRunningChanged();
4754
4855protected:
4956 void timerEvent(QTimerEvent * event);
@@ -52,6 +59,7 @@ private:
5259 QString m_phoneNumber;
5360 bool m_conference;
5461 int m_elapsed;
62+ int m_timer;
5563};
5664
5765#endif // MOCKCALLENTRY_H
tests/qmltests/CMakeLists.txt+1−1
@@ -26,6 +26,7 @@ add_qml_test(Components Carousel)
2626add_qml_test(Components DraggingArea)
2727add_qml_test(Components EdgeDemoOverlay)
2828add_qml_test(Components LazyImage)
29+add_qml_test(Components Lockscreen)
2930add_qml_test(Components Rating)
3031add_qml_test(Components ResponsiveFlowView)
3132add_qml_test(Components ResponsiveGridView)
@@ -60,7 +61,6 @@ add_qml_test(Dash/ScopeSettings ScopeSettingList)
6061add_qml_test(Dash/ScopeSettings ScopeSettingNumber)
6162add_qml_test(Dash/ScopeSettings ScopeSettingString)
6263add_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")
6464add_qml_test(Greeter MultiGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
6565add_qml_test(Greeter SingleGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
6666add_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
1818import QtTest 1.0
1919import ".."
2020import "../../../qml/Components"
21−import AccountsService 0.1
22−import LightDM 0.1 as LightDM
2321import Ubuntu.Components 0.1
2422import Unity.Test 0.1 as UT
2523
2624Rectangle {
2725 id: root
2826 width: units.gu(80)
29− height: units.gu(70)
27+ height: units.gu(76)
3028 color: "orange"
3129
3230 Lockscreen {
@@ -39,7 +37,7 @@ Rectangle {
3937 alphaNumeric: pinPadCheckBox.checked
4038 minPinLength: minPinLengthTextField.text
4139 maxPinLength: maxPinLengthTextField.text
42− username: "Lola"
40+ delayMinutes: delayMinutesTextField.text
4341 background: "../../../qml/graphics/phone_background.jpg"
4442 }
4543
@@ -53,24 +51,6 @@ Rectangle {
5351 }
5452 }
5553
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−
7454 Rectangle {
7555 anchors.fill: parent
7656 anchors.leftMargin: lockscreen.width
@@ -129,6 +109,16 @@ Rectangle {
129109 text: "Retries left"
130110 }
131111 }
112+ Row {
113+ TextField {
114+ id: delayMinutesTextField
115+ width: units.gu(7)
116+ text: "0"
117+ }
118+ Label {
119+ text: "Delay Minutes"
120+ }
121+ }
132122 Label {
133123 id: pinLabel
134124 anchors.verticalCenter: parent.verticalCenter
@@ -141,17 +131,6 @@ Rectangle {
141131 id: enteredLabel
142132 }
143133 }
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−
155134 TextField {
156135 id: infoTextTextField
157136 width: parent.width
@@ -193,6 +172,7 @@ Rectangle {
193172
194173 function cleanup() {
195174 lockscreen.clear(false);
175+ delayMinutesTextField.text = "0"
196176 }
197177
198178 function waitForLockscreenReady() {
@@ -237,8 +217,8 @@ Rectangle {
237217
238218 function test_labels_data() {
239219 return [
240− {tag: "numeric", alphanumeric: false, infoText: "Please enter your PIN", username: "foobar" },
241− {tag: "alphanumeric", alphanumeric: true, infoText: "Please enter your password", username: "Lola" }
220+ {tag: "numeric", alphanumeric: false, infoText: "Please enter your PIN" },
221+ {tag: "alphanumeric", alphanumeric: true, infoText: "Please enter your password" }
242222 ]
243223 }
244224
@@ -246,22 +226,16 @@ Rectangle {
246226 pinPadCheckBox.checked = data.alphanumeric
247227 lockscreen.infoText = data.infoText
248228 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")
254− }
229+ compare(findChild(lockscreen, "infoTextLabel").text, data.infoText, "Placeholdertext is not what it should be")
255230 }
256231
257−
258232 function test_unlock_data() {
259233 return [
260− {tag: "numeric", alphanumeric: false, username: "has-pin", password: "1234", minPinLength: 4, maxPinLength: 4},
261− {tag: "alphanumeric", alphanumeric: true, username: "has-password", password: "password", minPinLength: -1, maxPinLength: -1},
262− {tag: "numeric (wrong)", alphanumeric: false, username: "has-pin", password: "4321", minPinLength: 4, maxPinLength: 4},
263− {tag: "alphanumeric (wrong)", alphanumeric: true, username: "has-password", password: "drowssap", minPinLength: -1, maxPinLength: -1},
264− {tag: "flexible length", alphanumeric: false, username: "has-pin", password: "1234", minPinLength: -1, maxPinLength: -1},
234+ {tag: "numeric", alphanumeric: false, password: "1234", minPinLength: 4, maxPinLength: 4},
235+ {tag: "alphanumeric", alphanumeric: true, password: "password", minPinLength: -1, maxPinLength: -1},
236+ {tag: "numeric (wrong)", alphanumeric: false, password: "4321", minPinLength: 4, maxPinLength: 4},
237+ {tag: "alphanumeric (wrong)", alphanumeric: true, password: "drowssap", minPinLength: -1, maxPinLength: -1},
238+ {tag: "flexible length", alphanumeric: false, password: "1234", minPinLength: -1, maxPinLength: -1},
265239 ]
266240 }
267241
@@ -269,13 +243,13 @@ Rectangle {
269243 enteredLabel.text = ""
270244 minPinLengthTextField.text = data.minPinLength
271245 maxPinLengthTextField.text = data.maxPinLength
272− setUser(data.username)
246+ pinPadCheckBox.checked = data.alphanumeric
247+ infoTextTextField.text = "Enter " + (data.alphanumeric ? "passphrase" : "passcode")
273248 waitForLockscreenReady();
274249
275250 var inputField = findChild(lockscreen, "pinentryField")
276251 if (data.alphanumeric) {
277− mouseClick(inputField, units.gu(1), units.gu(1))
278− tryCompare(inputField, "focus", true);
252+ tryCompare(inputField, "activeFocus", true);
279253 typeString(data.password)
280254 keyClick(Qt.Key_Enter)
281255 } else {
@@ -305,7 +279,6 @@ Rectangle {
305279
306280 var inputField = findChild(lockscreen, "pinentryField")
307281 if (data.alphanumeric) {
308− mouseClick(inputField, units.gu(1), units.gu(1))
309282 tryCompare(inputField, "activeFocus", true);
310283 typeString("1")
311284 } else {
@@ -470,6 +443,13 @@ Rectangle {
470443 var label = findChild(lockscreen, "infoTextLabel")
471444 compare(label.text, data.text);
472445 }
446+
447+ function test_delayMinutes() {
448+ delayMinutesTextField.text = "4"
449+ waitForLockscreenReady()
450+ var label = findChild(lockscreen, "deviceLockedLabel")
451+ compare(label.text, "Device Locked")
452+ }
473453 }
474454
475455 SignalSpy {
tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml+3−23
@@ -29,14 +29,14 @@ Item {
2929 id: page
3030
3131 anchors.fill: parent
32− contentActive: true
3332
3433 menuModel: UnityMenuModel {}
3534 busName: "test"
3635 actionsObjectPath: "test"
3736 menuObjectPath: "test"
3837
39− rootMenuType: ""
38+ identifier: "test-indicator"
39+ rootMenuType: "com.canonical.indicator.root"
4040 }
4141
4242 property var fullMenuData: [{
@@ -117,13 +117,8 @@ Item {
117117 name: "DefaultIndicatorPage"
118118
119119 function init() {
120− page.stop();
121120 var mainMenu = findChild(page, "mainMenu");
122− verify(mainMenu.model === undefined);
123−
124− page.rootMenuType = "com.canonical.indicator.root";
125− page.start();
126−
121+ page.menuModel.modelData = [];
127122 verify(mainMenu.model !== null);
128123 }
129124
@@ -157,20 +152,5 @@ Item {
157152 var mainMenu = findChild(page, "mainMenu");
158153 tryCompare(mainMenu, "count", data.expectedCount);
159154 }
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− }
175155 }
176156}
tests/qmltests/Panel/tst_ActiveCallHint.qml+19−6
@@ -39,6 +39,7 @@ Item {
3939 Telephony.CallEntry {
4040 id: call3
4141 phoneNumber: "+447812221113"
42+ elapsedTimerRunning: true
4243 }
4344
4445 ActiveCallHint {
@@ -69,6 +70,7 @@ Item {
6970 callManager.foregroundCall = null;
7071 callManager.backgroundCall = null;
7172 callHint.labelSwitchInterval = 300;
73+ call1.elapsedTime = 0;
7274
7375 ApplicationManager.stopApplication("dialer-app");
7476 }
@@ -139,16 +141,27 @@ Item {
139141 compare(contactLabel.text, "Freddy", "Contact label does not match call");
140142 }
141143
142− function test_timeLapse() {
143− callManager.backgroundCall = call3;
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) {
156+ callManager.backgroundCall = call1;
157+ call1.elapsedTime = data.elpasedTime;
144158
145159 var timeLabel = findChild(callHint, "timeLabel");
146160 verify(timeLabel !== null);
147161
148− var currentLabel = timeLabel.text;
149− tryCompareFunction(function() { return timeLabel.text !== currentLabel }, true);
150− currentLabel = timeLabel.text;
151− tryCompareFunction(function() { return timeLabel.text !== currentLabel }, true);
162+ compare(timeLabel.text, data.initial);
163+ call1.elapsedTime = call1.elapsedTime + 1;
164+ compare(timeLabel.text, data.expected);
152165 }
153166
154167 function test_displayedLabelChangesOverTime() {
tests/qmltests/tst_ShellWithPin.qml+3−1
@@ -230,8 +230,10 @@ Item {
230230 enterPin("1111")
231231 tryCompare(placeHolder, "text", "Sorry, incorrect passcode")
232232
233+ var lockscreen = findChild(shell, "lockscreen")
234+ tryCompare(lockscreen, "delayMinutes", 0)
233235 enterPin("1111")
234− tryCompare(placeHolder, "text", "Too many incorrect attempts")
236+ tryCompare(lockscreen, "delayMinutes", shell.failedLoginsDelayMinutes)
235237 }
236238
237239 function test_factoryReset() {