on xenial help sign in
merge trunk
commit403f8e10aa816e95184d42bb2a1a56ab7ba9ca22 authorYing-Chun Liu <paul.liu@canonical.com> dateTue 14 Oct 2014, 22:37 (12 years ago) parent3d8a3eb10ac5e3
210 files changed+7455−3993
CMakeLists.txt+5 debian/changelog+84 debian/control+1−1 debian/unity8-private.install+1 libs/CMakeLists.txt+1 libs/UbuntuGestures/CMakeLists.txt+40 libs/UbuntuGestures/CandidateInactivityTimer.cpp+41 libs/UbuntuGestures/CandidateInactivityTimer.h+49 libs/UbuntuGestures/DebugHelpers.cpp+68 libs/UbuntuGestures/DebugHelpers.h+29 libs/UbuntuGestures/Pool.h+134 libs/UbuntuGestures/Timer.cpp+109 libs/UbuntuGestures/Timer.h+105 libs/UbuntuGestures/TouchOwnershipEvent.cpp+35 libs/UbuntuGestures/TouchOwnershipEvent.h+50 libs/UbuntuGestures/TouchRegistry.cpp+500 libs/UbuntuGestures/TouchRegistry.h+182 plugins/Ubuntu/Gestures/UbuntuGesturesGlobal.h → libs/UbuntuGestures/UbuntuGesturesGlobal.h+1−1 libs/UbuntuGestures/UnownedTouchEvent.cpp+39 libs/UbuntuGestures/UnownedTouchEvent.h+45 plugins/Dash/CardCreator.js+1−1 plugins/Dash/listviewwithpageheader.cpp+1−1 plugins/Ubuntu/Gestures/AxisVelocityCalculator.h+2−2 plugins/Ubuntu/Gestures/CMakeLists.txt+24−5 plugins/Ubuntu/Gestures/Direction.h+2−2 plugins/Ubuntu/Gestures/DirectionalDragArea.cpp+317−191 plugins/Ubuntu/Gestures/DirectionalDragArea.h+37−29 plugins/Ubuntu/Gestures/TimeSource.h+2−2 plugins/Ubuntu/Gestures/TouchGate.cpp+347 plugins/Ubuntu/Gestures/TouchGate.h+126 plugins/Ubuntu/Gestures/UbuntuGesturesQmlGlobal.h+23 plugins/Ubuntu/Gestures/plugin.cpp+3−1 plugins/Ubuntu/Gestures/plugin.h+1−1 plugins/Ubuntu/Gestures/qmldir+1−1 po/am.po+27−55 po/ar.po+20−38 po/ast.po+32−59 po/az.po+24−49 po/be.po+20−28 po/bg.po+20−35 po/br.po+27−55 po/bs.po+20−28 po/ca.po+27−55 po/ckb.po+20−35 po/cs.po+20−35 po/da.po+20−38 po/de.po+24−52 po/el.po+20−48 po/en_AU.po+35−69 po/en_GB.po+26−54 po/eo.po+20−28 po/es.po+28−56 po/eu.po+27−55 po/fa.po+23−57 po/fi.po+27−55 po/fo.po+20−28 po/fr.po+28−56 po/gd.po+27−55 po/gl.po+27−55 po/he.po+20−47 po/hi.po+20−31 po/hr.po+20−28 po/hu.po+24−58 po/hy.po+20−28 po/id.po+20−28 po/is.po+32−60 po/it.po+24−52 po/ja.po+24−52 po/km.po+24−52 po/kn.po+20−28 po/ko.po+24−52 po/ku.po+24−52 po/ky.po+20−28 po/lo.po+20−35 po/lt.po+20−38 po/lv.po+22−41 po/ml.po+20−35 po/mr.po+20−28 po/ms.po+20−35 po/my.po+20−35 po/nb.po+27−55 po/nl.po+27−55 po/pl.po+20−38 po/pt.po+27−55 po/pt_BR.po+24−52 po/ro.po+28−56 po/ru.po+24−52 po/shn.po+20−28 po/si.po+20−28 po/sl.po+27−55 po/sq.po+20−28 po/sr.po+24−52 po/sv.po+37−65 po/sw.po+20−28 po/ta.po+20−35 po/te.po+20−38 po/th.po+20−28 po/tr.po+22−46 po/ug.po+27−55 po/uk.po+27−55 po/unity8.pot+19−27 po/vi.po+20−28 po/xh.po+20−28 po/zh_CN.po+20−38 po/zh_HK.po+20−38 po/zh_TW.po+24−52 qml/Components/Carousel.qml+2−3 qml/Components/DragHandle.qml+2−2 qml/Components/EdgeDragArea.qml+2 qml/Components/Flickables/Flickable.qml+23 qml/Components/Flickables/GridView.qml+25 qml/Components/Flickables/ListView.qml+25 qml/Components/Flickables/ListViewWithPageHeader.qml+23 qml/Components/InputMethod.qml+13 qml/Components/ListItems/Base.qml−125 qml/Components/ListItems/Highlight.qml−46 qml/Components/Lockscreen.qml+3−1 qml/Components/PinLockscreen.qml+1 qml/Components/ResponsiveGridView.qml+2−1 qml/Components/ResponsiveVerticalJournal.qml+3−2 qml/Components/ZoomableImage.qml+2−2 qml/Dash/CardHorizontalList.qml+2−1 qml/Dash/Dash.qml+32−11 qml/Dash/DashCategoryBase.qml+62 qml/Dash/DashContent.qml+6−4 qml/Dash/DashNavigationButton.qml+2−1 qml/Dash/DashNavigationList.qml+2−1 qml/Dash/DashRenderer.qml+2−2 qml/Dash/GenericScopeView.qml+4−4 qml/Dash/PageHeader.qml+2−1 qml/Dash/PreviewListView.qml+2−3 qml/Dash/Previews/Preview.qml+2−1 qml/Dash/Previews/PreviewImageGallery.qml+3−2 qml/Dash/Previews/PreviewTextSummary.qml+1−1 qml/Dash/ScopeListView.qml+3−6 qml/Dash/ScopeSettingsPage.qml+2−1 qml/Dash/ScopesOverview.qml+9−1 qml/Dash/ScopesOverviewAll.qml+2−1 qml/Dash/ScopesOverviewFavorites.qml+4−2 qml/Greeter/Greeter.qml+13−1 qml/Greeter/GreeterContent.qml+12 qml/Greeter/LoginList.qml+21−8 qml/Hud/Hud.qml+2−1 qml/Hud/HudParametrizedActionsPage.qml+2−1 qml/Launcher/Launcher.qml+3−1 qml/Launcher/LauncherDelegate.qml+20−33 qml/Launcher/LauncherPanel.qml+8−15 qml/Notifications/Notification.qml+2−1 qml/Notifications/NotificationMenuItemFactory.qml+77−5 qml/Notifications/Notifications.qml+2−1 qml/Panel/IndicatorRow.qml+2−1 qml/Panel/Indicators/DefaultIndicatorPage.qml+2−1 qml/Panel/Indicators/MenuItemFactory.qml+18−3 qml/Panel/Indicators/client/IndicatorsList.qml+2−1 qml/Panel/Indicators/client/IndicatorsTree.qml+2−1 qml/Panel/MenuContent.qml+3−2 qml/Shell.qml+115−47 qml/Stages/ApplicationWindow.qml−18 qml/Stages/PhoneStage.qml+24−6 qml/Stages/SessionContainer.qml+1−13 qml/Stages/SurfaceContainer.qml+37−6 qml/Stages/TabletStage.qml+9−1 run_on_device.sh+4−5 src/CMakeLists.txt+6 src/Dash/CMakeLists.txt+5 src/Dash/main.cpp+6 src/main.cpp+5 tests/CMakeLists.txt+1 tests/autopilot/unity8/indicators/tests/test_indicators.py+2−2 tests/autopilot/unity8/shell/emulators/dash.py+1−1 tests/libs/CMakeLists.txt+1 tests/libs/UbuntuGestures/CMakeLists.txt+20 tests/libs/UbuntuGestures/tst_TouchRegistry.cpp+803 tests/mocks/AccountsService/AccountsService.cpp+5−3 tests/mocks/AccountsService/AccountsService.h+1 tests/mocks/Unity/Application/CMakeLists.txt+1 tests/mocks/Unity/Application/MirSurfaceItem.cpp+18−22 tests/mocks/Unity/Application/MirSurfaceItem.h+18−1 tests/mocks/Unity/Application/MirSurfaceItem.qml−12 tests/mocks/Unity/Application/UbuntuKeyboardInfo.cpp+28 tests/mocks/Unity/Application/UbuntuKeyboardInfo.h+60 tests/mocks/Unity/Application/plugin.cpp+7 tests/mocks/Unity/Launcher/MockLauncherModel.cpp+1 tests/mocks/libusermetrics/UserMetrics.cpp+2−2 tests/plugins/Ubuntu/Gestures/CMakeLists.txt+9−2 tests/plugins/Ubuntu/Gestures/RightwardsLauncher.qml+3 tests/plugins/Ubuntu/Gestures/touchGateExample.qml+27 tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp+491−14 tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.qml+1 tests/plugins/Ubuntu/Gestures/tst_TouchGate.cpp+345 tests/qmltests/CMakeLists.txt+1 tests/qmltests/Components/CMakeLists.txt+2−1 tests/qmltests/Components/tst_DragHandle.cpp+12−15 tests/qmltests/Greeter/tst_MultiGreeter.qml+2−2 tests/qmltests/Greeter/tst_SingleGreeter.qml+1−1 tests/qmltests/Launcher/tst_Launcher.qml+117−101 tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+24 tests/qmltests/Stages/tst_ApplicationWindow.qml+2−2 tests/qmltests/Stages/tst_PhoneStage.qml+19−1 tests/qmltests/Stages/tst_SurfaceContainer.qml+26−1 tests/qmltests/tst_Shell.qml+119−3 tests/qmltests/tst_ShellWithPin.qml+160−32 tests/qmltests/tst_TabletShell.qml+297 tests/uqmlscene/CMakeLists.txt+2 tests/uqmlscene/README+3−1 tests/uqmlscene/main.cpp+9 tests/utils/modules/Unity/Test/CMakeLists.txt+2 tests/utils/modules/Unity/Test/UnityTestCase.qml+20 tests/utils/modules/Unity/Test/testutil.cpp+41−2 tests/utils/modules/Unity/Test/testutil.h+3−1
CMakeLists.txt+5
@@ -58,6 +58,7 @@ find_package(Qt5DBus 5.2 REQUIRED)
5858include(GNUInstallDirs)
5959
6060set(SHELL_APP_DIR ${CMAKE_INSTALL_DATADIR}/unity8)
61+set(SHELL_PRIVATE_LIBDIR ${CMAKE_INSTALL_LIBDIR}/unity8)
6162
6263execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=plugindir_suffix unity-shell-api OUTPUT_VARIABLE SHELL_INSTALL_QML OUTPUT_STRIP_TRAILING_WHITESPACE)
6364if(SHELL_INSTALL_QML STREQUAL "")
@@ -87,6 +88,9 @@ endif()
8788# "signals" and "slots"
8889add_definitions(-DQT_NO_KEYWORDS)
8990
91+# Save a few container detach and conversions
92+add_definitions(-DQT_STRICT_ITERATORS)
93+
9094# Tests
9195include(CTest)
9296enable_testing()
@@ -106,6 +110,7 @@ include_directories(
106110
107111# add subdirectories to build
108112add_subdirectory(include)
113+add_subdirectory(libs)
109114add_subdirectory(src)
110115add_subdirectory(tools)
111116add_subdirectory(qml)
debian/changelog+84
@@ -1,3 +1,87 @@
1+unity8 (8.00+14.10.20141013.2-0ubuntu1) utopic; urgency=low
2+
3+ [ Michael Terry ]
4+ * Don't show initial lockscreen during the edge demo. The user just
5+ set up their phone with a password, it's pointless to ask them
6+ again. (LP: #1358283)
7+ * Distinguish between incoming calls and other dialer-app opens. (LP:
8+ #1378218) (LP: #1378218)
9+
10+ [ Andrea Cimitan ]
11+ * Fix flickable speed to be resolution independent, by subclassing
12+ components (LP: #1348557)
13+
14+ [ Michał Sawicz ]
15+ * Fix the ShellWithPin test and some functionality.
16+
17+ [ Albert Astals ]
18+ * Move Base.qml to DashCategoryBase
19+ * Fix first item positioning when m_clipItem->y() is not 0 (LP:
20+ #1251597)
21+ * Fix some small qml warnings
22+
23+ [ Daniel d'Andrada ]
24+ * Add touch ownership logic on top of qt input handling
25+
26+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 13 Oct 2014 15:43:03 +0000
27+
28+unity8 (8.00+14.10.20141009.4-0ubuntu1) utopic; urgency=low
29+
30+ [ Michał Sawicz ]
31+ * Rename datetime indicator in test
32+
33+ [ Albert Astals ]
34+ * Close overview temp scope on show dash (LP: #1373819)
35+ * Enable QT_STRICT_ITERATORS
36+ * Make Base not clickable, since we don't use it in anywhere clickable
37+ (we only use it for Category delegates in the LVWPH) (LP: #1300709)
38+ * Hide preview if it was visible when going to a scope (LP: #1374548)
39+ * Remove contentScale variable
40+
41+ [ Andrea Cimitan ]
42+ * Fix card implicitHeight when summary is declared, but its text is
43+ empty. Also fixes vertical journal height and clipping (LP:
44+ #1362160)
45+ * Redesign for pinned apps. Remove thindivider on top of ubuntu dash
46+ button (not needed anymore) (LP: #1377100)
47+
48+ [ Ying-Chun Liu ]
49+ * Fix run_on_device.sh to let it run again.
50+
51+ [ Nick Dedekind ]
52+ * Fixed indicator menu bindings to server toggle value broken by user
53+ interaction. (LP: #1336715)
54+ * Force rendering so we don't get stuck in "waitForRendering" loop in
55+ tests.
56+
57+ [ Daniel d'Andrada ]
58+ * PhoneStage: focus the new topmost app after the current one closes
59+ itself (LP: #1375267)
60+
61+ [ Michael Terry ]
62+ * Fix some security issues with the tablet greeter, which allowed the
63+ lockscreen to be bypassed. (LP: #1367715) (LP: #1367715)
64+
65+ [ Michael Zanetti ]
66+ * scale down errorText label if necessary (LP: #1378848)
67+
68+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 09 Oct 2014 14:05:54 +0000
69+
70+unity8 (8.00+14.10.20141008-0ubuntu1) utopic; urgency=low
71+
72+ [ Michael Zanetti ]
73+ * Dual SIM pin unlocking. Hook up the UI to the backend. (LP:
74+ #1267135)
75+
76+ [ Antti Kaijanmäki ]
77+ * Dual SIM pin unlocking. Hook up the UI to the backend. (LP:
78+ #1267135)
79+
80+ [ Ubuntu daily release ]
81+ * New rebuild forced
82+
83+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 08 Oct 2014 09:41:32 +0000
84+
185unity8 (8.00+14.10.20141006-0ubuntu1) utopic; urgency=low
286
387 [ Andrea Cimitan ]
debian/control+1−1
@@ -86,7 +86,7 @@ Depends: gsettings-desktop-schemas,
8686 qmenumodel-qml (>= 0.2.8),
8787 qml-module-qtquick-xmllistmodel,
8888 qtdeclarative5-gsettings1.0,
89− qtdeclarative5-qtmir-plugin (>= 0.4.3),
89+ qtdeclarative5-qtmir-plugin (>= 0.4.4),
9090 qtdeclarative5-ubuntu-telephony0.1,
9191 unity-launcher-impl-4,
9292 unity8-common (= ${source:Version}),
debian/unity8-private.install+1
@@ -9,5 +9,6 @@ usr/lib/*/unity8/qml/SessionBroadcast
99usr/lib/*/unity8/qml/Ubuntu
1010usr/lib/*/unity8/qml/Unity
1111usr/lib/*/unity8/qml/Utils
12+usr/lib/*/unity8/libUbuntuGestures*
1213usr/share/accountsservice/interfaces
1314usr/share/dbus-1/interfaces
libs/CMakeLists.txtnew file+1
@@ -0,0 +1 @@
1+add_subdirectory(UbuntuGestures)
libs/UbuntuGestures/CMakeLists.txtnew file+40
@@ -0,0 +1,40 @@
1+# in order to include Qt's private headers
2+remove_definitions(-DQT_NO_KEYWORDS)
3+
4+set(UbuntuGestures_SOURCES
5+ CandidateInactivityTimer.cpp
6+ DebugHelpers.cpp
7+ Timer.cpp
8+ TouchOwnershipEvent.cpp
9+ TouchRegistry.cpp
10+ UnownedTouchEvent.cpp
11+)
12+
13+add_definitions(-DUBUNTUGESTURES_LIBRARY)
14+
15+add_library(UbuntuGestures SHARED ${UbuntuGestures_SOURCES})
16+
17+qt5_use_modules(UbuntuGestures Core Quick)
18+
19+# So that Foo.cpp can #include "Foo.moc"
20+include_directories(${CMAKE_CURRENT_BINARY_DIR})
21+
22+install(TARGETS UbuntuGestures
23+ DESTINATION ${SHELL_PRIVATE_LIBDIR})
24+
25+
26+# There's no cmake var for v8 include path :-/ so create one
27+LIST(GET Qt5Core_INCLUDE_DIRS 0 QtCoreDir0)
28+if(${Qt5Core_VERSION_STRING} VERSION_LESS "5.1.0")
29+ SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/../QtV8/${Qt5Core_VERSION_STRING}/QtV8)
30+else()
31+ SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/QtV8/${Qt5Core_VERSION_STRING}/QtV8)
32+endif()
33+
34+# DANGER! DANGER! Using Qt's private API!
35+include_directories(
36+ ${Qt5Qml_PRIVATE_INCLUDE_DIRS}
37+ ${Qt5Quick_INCLUDE_DIRS}
38+ ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
39+ ${Qt5V8_PRIVATE_INCLUDE_DIR}
40+)
libs/UbuntuGestures/CandidateInactivityTimer.cppnew file+41
@@ -0,0 +1,41 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "CandidateInactivityTimer.h"
18+
19+namespace UbuntuGestures {
20+
21+CandidateInactivityTimer::CandidateInactivityTimer(int touchId, QQuickItem *candidate,
22+ AbstractTimerFactory &timerFactory, QObject *parent)
23+ : QObject(parent)
24+ , m_touchId(touchId)
25+ , m_candidate(candidate)
26+{
27+ m_timer = timerFactory.createTimer(this);
28+ connect(m_timer, &AbstractTimer::timeout,
29+ this, &CandidateInactivityTimer::onTimeout);
30+ m_timer->setInterval(durationMs);
31+ m_timer->setSingleShot(true);
32+ m_timer->start();
33+}
34+
35+void CandidateInactivityTimer::onTimeout()
36+{
37+ qWarning("[TouchRegistry] Candidate for touch %d defaulted!", m_touchId);
38+ Q_EMIT candidateDefaulted(m_touchId, m_candidate);
39+}
40+
41+} // namespace UbuntuGestures
libs/UbuntuGestures/CandidateInactivityTimer.hnew file+49
@@ -0,0 +1,49 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H
18+#define UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H
19+
20+#include <QObject>
21+
22+class QQuickItem;
23+
24+#include "Timer.h"
25+
26+namespace UbuntuGestures {
27+
28+class UBUNTUGESTURES_EXPORT CandidateInactivityTimer : public QObject {
29+ Q_OBJECT
30+public:
31+ CandidateInactivityTimer(int touchId, QQuickItem *candidate,
32+ AbstractTimerFactory &timerFactory,
33+ QObject *parent = nullptr);
34+
35+ const int durationMs = 350;
36+
37+Q_SIGNALS:
38+ void candidateDefaulted(int touchId, QQuickItem *candidate);
39+private Q_SLOTS:
40+ void onTimeout();
41+private:
42+ AbstractTimer *m_timer;
43+ int m_touchId;
44+ QQuickItem *m_candidate;
45+};
46+
47+} // namespace UbuntuGestures
48+
49+#endif // UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H
libs/UbuntuGestures/DebugHelpers.cppnew file+68
@@ -0,0 +1,68 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "DebugHelpers.h"
18+#include <QTouchEvent>
19+
20+QString touchPointStateToString(Qt::TouchPointState state)
21+{
22+ switch (state) {
23+ case Qt::TouchPointPressed:
24+ return QString("pressed");
25+ case Qt::TouchPointMoved:
26+ return QString("moved");
27+ case Qt::TouchPointStationary:
28+ return QString("stationary");
29+ case Qt::TouchPointReleased:
30+ return QString("released");
31+ default:
32+ return QString("INVALID_STATE");
33+ }
34+}
35+
36+QString touchEventToString(const QTouchEvent *ev)
37+{
38+ QString message;
39+
40+ switch (ev->type()) {
41+ case QEvent::TouchBegin:
42+ message.append("TouchBegin ");
43+ break;
44+ case QEvent::TouchUpdate:
45+ message.append("TouchUpdate ");
46+ break;
47+ case QEvent::TouchEnd:
48+ message.append("TouchEnd ");
49+ break;
50+ case QEvent::TouchCancel:
51+ message.append("TouchCancel ");
52+ break;
53+ default:
54+ message.append("INVALID_TOUCH_EVENT_TYPE ");
55+ }
56+
57+ foreach(const QTouchEvent::TouchPoint& touchPoint, ev->touchPoints()) {
58+ message.append(
59+ QString("(id:%1, state:%2, scenePos:(%3,%4)) ")
60+ .arg(touchPoint.id())
61+ .arg(touchPointStateToString(touchPoint.state()))
62+ .arg(touchPoint.scenePos().x())
63+ .arg(touchPoint.scenePos().y())
64+ );
65+ }
66+
67+ return message;
68+}
libs/UbuntuGestures/DebugHelpers.hnew file+29
@@ -0,0 +1,29 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef UBUNTUGESTURES_DEBUG_HELPER_H
18+#define UBUNTUGESTURES_DEBUG_HELPER_H
19+
20+#include <QString>
21+
22+#include "UbuntuGesturesGlobal.h"
23+
24+class QTouchEvent;
25+
26+UBUNTUGESTURES_EXPORT QString touchPointStateToString(Qt::TouchPointState state);
27+UBUNTUGESTURES_EXPORT QString touchEventToString(const QTouchEvent *ev);
28+
29+#endif // UBUNTUGESTURES_DEBUG_HELPER_H
libs/UbuntuGestures/Pool.hnew file+134
@@ -0,0 +1,134 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef UBUNTUGESTURES_POOL_H
18+#define UBUNTUGESTURES_POOL_H
19+
20+#include <QVector>
21+
22+#include "UbuntuGesturesGlobal.h"
23+
24+/*
25+ An object pool.
26+ Avoids unnecessary creations/initializations and deletions/destructions of items. Useful
27+ in a scenario where items are created and destroyed very frequently but the total number
28+ of items at any given time remains small. They're stored in a unordered fashion.
29+
30+ To be used in Pool, ItemType needs to have the following methods:
31+
32+ - ItemType();
33+
34+ A constructor that takes no parameters. An object contructed with it must return false if
35+ isValid() is called.
36+
37+ - bool isValid() const;
38+
39+ Returns wheter the object holds a valid , "filled" state or is empty.
40+ Used by Pool to check if the slot occupied by this object is actually available.
41+
42+ - void reset();
43+
44+ Resets the object to its initial, empty, state. After calling this method, isValid() must
45+ return false.
46+ */
47+template <class ItemType> class Pool
48+{
49+public:
50+ Pool() : m_lastUsedIndex(-1) {
51+ }
52+
53+ class Iterator {
54+ public:
55+ Iterator() : index(-1), item(nullptr) {}
56+ Iterator(int index, ItemType *item)
57+ : index(index), item(item) {}
58+
59+ ItemType *operator->() const { return item; }
60+ ItemType &operator*() const { return *item; }
61+ ItemType &value() const { return *item; }
62+
63+ Iterator &operator= (const Iterator& other) {
64+ index = other.index;
65+ item = other.item;
66+
67+ // by convention, always return *this
68+ return *this;
69+ }
70+
71+ operator bool() const { return item != nullptr; }
72+
73+ int index;
74+ ItemType *item;
75+ };
76+
77+ Iterator &end() const { return Iterator(); }
78+
79+ ItemType &getEmptySlot() {
80+ Q_ASSERT(m_lastUsedIndex < m_slots.size());
81+
82+ // Look for an in-between vacancy first
83+ for (int i = 0; i < m_lastUsedIndex; ++i) {
84+ ItemType &item = m_slots[i];
85+ if (!item.isValid()) {
86+ return item;
87+ }
88+ }
89+
90+ ++m_lastUsedIndex;
91+ if (m_lastUsedIndex >= m_slots.size()) {
92+ m_slots.resize(m_lastUsedIndex + 1);
93+ }
94+
95+ return m_slots[m_lastUsedIndex];
96+ }
97+
98+ void freeSlot(Iterator &iterator) {
99+ m_slots[iterator.index].reset();
100+ if (iterator.index == m_lastUsedIndex) {
101+ do {
102+ --m_lastUsedIndex;
103+ } while (m_lastUsedIndex >= 0 && !m_slots.at(m_lastUsedIndex).isValid());
104+ }
105+ }
106+
107+ // Iterates through all valid items (i.e. the occupied slots)
108+ // calling the given function, with the option of ending the loop early.
109+ //
110+ // bool Func(Iterator& item)
111+ //
112+ // Returning true means it wants to continue the "for" loop, false
113+ // terminates the loop.
114+ template<typename Func> void forEach(Func func) {
115+ Iterator it;
116+ for (it.index = 0; it.index <= m_lastUsedIndex; ++it.index) {
117+ it.item = &m_slots[it.index];
118+ if (!it.item->isValid())
119+ continue;
120+
121+ if (!func(it))
122+ break;
123+ }
124+ }
125+
126+ bool isEmpty() const { return m_lastUsedIndex == -1; }
127+
128+
129+private:
130+ QVector<ItemType> m_slots;
131+ int m_lastUsedIndex;
132+};
133+
134+#endif // UBUNTUGESTURES_POOL_H
libs/UbuntuGestures/Timer.cppnew file+109
@@ -0,0 +1,109 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "Timer.h"
18+
19+namespace UbuntuGestures {
20+
21+Timer::Timer(QObject *parent) : AbstractTimer(parent)
22+{
23+ m_timer.setSingleShot(false);
24+ connect(&m_timer, &QTimer::timeout, this, &AbstractTimer::timeout);
25+}
26+
27+int Timer::interval() const
28+{
29+ return m_timer.interval();
30+}
31+
32+void Timer::setInterval(int msecs)
33+{
34+ m_timer.setInterval(msecs);
35+}
36+
37+void Timer::start()
38+{
39+ m_timer.start();
40+ AbstractTimer::start();
41+}
42+
43+void Timer::stop()
44+{
45+ m_timer.stop();
46+ AbstractTimer::stop();
47+}
48+
49+bool Timer::isSingleShot() const
50+{
51+ return m_timer.isSingleShot();
52+}
53+
54+void Timer::setSingleShot(bool value)
55+{
56+ m_timer.setSingleShot(value);
57+}
58+
59+/////////////////////////////////// FakeTimer //////////////////////////////////
60+
61+FakeTimer::FakeTimer(QObject *parent)
62+ : UbuntuGestures::AbstractTimer(parent)
63+ , m_interval(0)
64+ , m_singleShot(false)
65+{
66+}
67+
68+int FakeTimer::interval() const
69+{
70+ return m_interval;
71+}
72+
73+void FakeTimer::setInterval(int msecs)
74+{
75+ m_interval = msecs;
76+}
77+
78+bool FakeTimer::isSingleShot() const
79+{
80+ return m_singleShot;
81+}
82+
83+void FakeTimer::setSingleShot(bool value)
84+{
85+ m_singleShot = value;
86+}
87+
88+/////////////////////////////////// FakeTimerFactory //////////////////////////////////
89+
90+AbstractTimer *FakeTimerFactory::createTimer(QObject *parent)
91+{
92+ FakeTimer *fakeTimer = new FakeTimer(parent);
93+
94+ timers.append(fakeTimer);
95+
96+ return fakeTimer;
97+}
98+
99+void FakeTimerFactory::makeRunningTimersTimeout()
100+{
101+ for (int i = 0; i < timers.count(); ++i) {
102+ FakeTimer *timer = timers[i].data();
103+ if (timer && timer->isRunning()) {
104+ timer->emitTimeout();
105+ }
106+ }
107+}
108+
109+} // namespace UbuntuGestures
libs/UbuntuGestures/Timer.hnew file+105
@@ -0,0 +1,105 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef UBUNTUGESTURES_TIMER_H
18+#define UBUNTUGESTURES_TIMER_H
19+
20+#include "UbuntuGesturesGlobal.h"
21+
22+#include <QObject>
23+#include <QPointer>
24+#include <QTimer>
25+
26+namespace UbuntuGestures {
27+
28+/* Defines an interface for a Timer. Useful for tests. */
29+class UBUNTUGESTURES_EXPORT AbstractTimer : public QObject
30+{
31+ Q_OBJECT
32+public:
33+ AbstractTimer(QObject *parent) : QObject(parent), m_isRunning(false) {}
34+ virtual int interval() const = 0;
35+ virtual void setInterval(int msecs) = 0;
36+ virtual void start() { m_isRunning = true; }
37+ virtual void stop() { m_isRunning = false; }
38+ bool isRunning() const { return m_isRunning; }
39+ virtual bool isSingleShot() const = 0;
40+ virtual void setSingleShot(bool value) = 0;
41+Q_SIGNALS:
42+ void timeout();
43+private:
44+ bool m_isRunning;
45+};
46+
47+/* Essentially a QTimer wrapper */
48+class UBUNTUGESTURES_EXPORT Timer : public AbstractTimer
49+{
50+ Q_OBJECT
51+public:
52+ Timer(QObject *parent = nullptr);
53+
54+ int interval() const override;
55+ void setInterval(int msecs) override;
56+ void start() override;
57+ void stop() override;
58+ bool isSingleShot() const override;
59+ void setSingleShot(bool value) override;
60+private:
61+ QTimer m_timer;
62+};
63+
64+/* For tests */
65+class UBUNTUGESTURES_EXPORT FakeTimer : public AbstractTimer
66+{
67+ Q_OBJECT
68+public:
69+ FakeTimer(QObject *parent = nullptr);
70+
71+ virtual void emitTimeout() { Q_EMIT timeout(); }
72+
73+ int interval() const override;
74+ void setInterval(int msecs) override;
75+ bool isSingleShot() const override;
76+ void setSingleShot(bool value) override;
77+private:
78+ int m_interval;
79+ bool m_singleShot;
80+};
81+
82+class UBUNTUGESTURES_EXPORT AbstractTimerFactory
83+{
84+public:
85+ virtual ~AbstractTimerFactory() {}
86+ virtual AbstractTimer *createTimer(QObject *parent = nullptr) = 0;
87+};
88+
89+class UBUNTUGESTURES_EXPORT TimerFactory : public AbstractTimerFactory
90+{
91+public:
92+ AbstractTimer *createTimer(QObject *parent = nullptr) override { return new Timer(parent); }
93+};
94+
95+class UBUNTUGESTURES_EXPORT FakeTimerFactory : public AbstractTimerFactory
96+{
97+public:
98+ AbstractTimer *createTimer(QObject *parent = nullptr) override;
99+ void makeRunningTimersTimeout();
100+ QList<QPointer<FakeTimer>> timers;
101+};
102+
103+} // namespace UbuntuGestures
104+
105+#endif // UBUNTUGESTURES_TIMER_H
libs/UbuntuGestures/TouchOwnershipEvent.cppnew file+35
@@ -0,0 +1,35 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "TouchOwnershipEvent.h"
18+
19+QEvent::Type TouchOwnershipEvent::m_touchOwnershipType = (QEvent::Type)-1;
20+
21+TouchOwnershipEvent::TouchOwnershipEvent(int touchId, bool gained)
22+ : QEvent(touchOwnershipEventType())
23+ , m_touchId(touchId)
24+ , m_gained(gained)
25+{
26+}
27+
28+QEvent::Type TouchOwnershipEvent::touchOwnershipEventType()
29+{
30+ if (m_touchOwnershipType == (QEvent::Type)-1) {
31+ m_touchOwnershipType = (QEvent::Type)registerEventType();
32+ }
33+
34+ return m_touchOwnershipType;
35+}
libs/UbuntuGestures/TouchOwnershipEvent.hnew file+50
@@ -0,0 +1,50 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef UBUNTU_TOUCHOWNERSHIPEVENT_H
18+#define UBUNTU_TOUCHOWNERSHIPEVENT_H
19+
20+#include <QEvent>
21+#include "UbuntuGesturesGlobal.h"
22+
23+/*
24+ When an item get an ownership event for a touch it can grab/steal that touch
25+ with a clean conscience.
26+ */
27+class UBUNTUGESTURES_EXPORT TouchOwnershipEvent : public QEvent
28+{
29+public:
30+ TouchOwnershipEvent(int touchId, bool gained);
31+
32+ static Type touchOwnershipEventType();
33+
34+ /*
35+ Whether ownership was gained (true) or lost (false)
36+ */
37+ bool gained() const { return m_gained; }
38+
39+ /*
40+ Id of the touch whose ownership was granted.
41+ */
42+ int touchId() const { return m_touchId; }
43+
44+private:
45+ static Type m_touchOwnershipType;
46+ int m_touchId;
47+ bool m_gained;
48+};
49+
50+#endif // UBUNTU_TOUCHOWNERSHIPEVENT_H
libs/UbuntuGestures/TouchRegistry.cppnew file+500
@@ -0,0 +1,500 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "TouchRegistry.h"
18+
19+#include <QCoreApplication>
20+#include <QDebug>
21+
22+#pragma GCC diagnostic push
23+#pragma GCC diagnostic ignored "-pedantic"
24+#include <private/qquickitem_p.h>
25+#pragma GCC diagnostic pop
26+
27+#include "CandidateInactivityTimer.h"
28+#include "Timer.h"
29+#include "TouchOwnershipEvent.h"
30+#include "UnownedTouchEvent.h"
31+
32+#define TOUCHREGISTRY_DEBUG 0
33+
34+#if TOUCHREGISTRY_DEBUG
35+ #include "DebugHelpers.h"
36+ #define UG_DEBUG qDebug() << "[TouchRegistry]"
37+#endif // TOUCHREGISTRY_DEBUG
38+
39+using namespace UbuntuGestures;
40+
41+TouchRegistry *TouchRegistry::m_instance = nullptr;
42+
43+TouchRegistry::TouchRegistry(QObject *parent)
44+ : TouchRegistry(parent, new TimerFactory)
45+{
46+}
47+
48+TouchRegistry::TouchRegistry(QObject *parent, AbstractTimerFactory *timerFactory)
49+ : QObject(parent)
50+ , m_inDispatchLoop(false)
51+ , m_timerFactory(timerFactory)
52+{
53+ if (m_instance == nullptr) {
54+ m_instance = this;
55+ } else {
56+ qFatal("Cannot have more than one instance of TouchRegistry. It must be a singleton.");
57+ }
58+}
59+
60+TouchRegistry::~TouchRegistry()
61+{
62+ Q_ASSERT(m_instance != nullptr);
63+ m_instance = nullptr;
64+ delete m_timerFactory;
65+}
66+
67+void TouchRegistry::update(const QTouchEvent *event)
68+{
69+ #if TOUCHREGISTRY_DEBUG
70+ UG_DEBUG << "got" << qPrintable(touchEventToString(event));
71+ #endif
72+
73+ const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
74+ for (int i = 0; i < touchPoints.count(); ++i) {
75+ const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
76+ if (touchPoint.state() == Qt::TouchPointPressed) {
77+ TouchInfo &touchInfo = m_touchInfoPool.getEmptySlot();
78+ touchInfo.init(touchPoint.id());
79+ } else if (touchPoint.state() == Qt::TouchPointReleased) {
80+ Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(touchPoint.id());
81+
82+ touchInfo->physicallyEnded = true;
83+ }
84+ }
85+
86+ deliverTouchUpdatesToUndecidedCandidatesAndWatchers(event);
87+
88+ freeEndedTouchInfos();
89+}
90+
91+void TouchRegistry::deliverTouchUpdatesToUndecidedCandidatesAndWatchers(const QTouchEvent *event)
92+{
93+ // TODO: Look into how we could optimize this whole thing.
94+ // Although it's not really a problem as we should have at most two candidates
95+ // for each point and there should not be many active points at any given moment.
96+ // But having three nested for-loops does scare.
97+
98+ // TODO: Don't send it to the object that is already receiving the regular event
99+ // because QQuickWindow is sending it to him (i.e., he's the touch owner from Qt's point of view)
100+ // Problem is, we cannnot easily get this information.
101+
102+ const QList<QTouchEvent::TouchPoint> &updatedTouchPoints = event->touchPoints();
103+
104+ // Maps an item to the touches in this event he should be informed about.
105+ // E.g.: a QTouchEvent might have three touches but a given item might be interested in only
106+ // one of them. So he will get a UnownedTouchEvent from this QTouchEvent containing only that
107+ // touch point.
108+ QMap<QQuickItem*, QList<int>> touchIdsForItems;
109+
110+ // Build touchIdsForItems
111+ m_touchInfoPool.forEach([&](Pool<TouchInfo>::Iterator &touchInfo) {
112+ if (touchInfo->isOwned() && touchInfo->watchers.isEmpty())
113+ return true;
114+
115+ for (int j = 0; j < updatedTouchPoints.count(); ++j) {
116+ if (updatedTouchPoints[j].id() == touchInfo->id) {
117+ if (!touchInfo->isOwned()) {
118+ for (int i = 0; i < touchInfo->candidates.count(); ++i) {
119+ CandidateInfo &candidate = touchInfo->candidates[i];
120+ Q_ASSERT(!candidate.item.isNull());
121+ touchIdsForItems[candidate.item.data()].append(touchInfo->id);
122+ }
123+ }
124+
125+ const QList<QPointer<QQuickItem>> &watchers = touchInfo->watchers;
126+ for (int i = 0; i < watchers.count(); ++i) {
127+ if (!watchers[i].isNull()) {
128+ touchIdsForItems[watchers[i].data()].append(touchInfo->id);
129+ }
130+ }
131+
132+ return true;
133+ }
134+ }
135+
136+ return true;
137+ });
138+
139+ // TODO: Consider what happens if an item calls any of TouchRegistry's public methods
140+ // from the event handler callback.
141+ m_inDispatchLoop = true;
142+ auto it = touchIdsForItems.constBegin();
143+ while (it != touchIdsForItems.constEnd()) {
144+ QQuickItem *item = it.key();
145+ const QList<int> &touchIds = it.value();
146+ dispatchPointsToItem(event, touchIds, item);
147+ ++it;
148+ };
149+ m_inDispatchLoop = false;
150+}
151+
152+void TouchRegistry::freeEndedTouchInfos()
153+{
154+ m_touchInfoPool.forEach([&](Pool<TouchInfo>::Iterator &touchInfo) {
155+ if (touchInfo->ended()) {
156+ m_touchInfoPool.freeSlot(touchInfo);
157+ }
158+ return true;
159+ });
160+}
161+
162+/*
163+ Extracts the touches with the given touchIds from event and send them in a
164+ UnownedTouchEvent to the given item
165+ */
166+void TouchRegistry::dispatchPointsToItem(const QTouchEvent *event, const QList<int> &touchIds,
167+ QQuickItem *item)
168+{
169+ Qt::TouchPointStates touchPointStates = 0;
170+ QList<QTouchEvent::TouchPoint> touchPoints;
171+
172+ const QList<QTouchEvent::TouchPoint> &allTouchPoints = event->touchPoints();
173+
174+ QTransform windowToCandidateTransform = QQuickItemPrivate::get(item)->windowToItemTransform();
175+ QMatrix4x4 windowToCandidateMatrix(windowToCandidateTransform);
176+
177+ for (int i = 0; i < allTouchPoints.count(); ++i) {
178+ const QTouchEvent::TouchPoint &originalTouchPoint = allTouchPoints[i];
179+ if (touchIds.contains(originalTouchPoint.id())) {
180+ QTouchEvent::TouchPoint touchPoint = originalTouchPoint;
181+
182+ translateTouchPointFromScreenToWindowCoords(touchPoint);
183+
184+ // Set the point's local coordinates to that of the item
185+ touchPoint.setRect(windowToCandidateTransform.mapRect(touchPoint.sceneRect()));
186+ touchPoint.setStartPos(windowToCandidateTransform.map(touchPoint.startScenePos()));
187+ touchPoint.setLastPos(windowToCandidateTransform.map(touchPoint.lastScenePos()));
188+ touchPoint.setVelocity(windowToCandidateMatrix.mapVector(touchPoint.velocity()).toVector2D());
189+
190+ touchPoints.append(touchPoint);
191+ touchPointStates |= touchPoint.state();
192+ }
193+ }
194+
195+ QTouchEvent *eventForItem = new QTouchEvent(event->type(),
196+ event->device(),
197+ event->modifiers(),
198+ touchPointStates,
199+ touchPoints);
200+ eventForItem->setWindow(event->window());
201+ eventForItem->setTimestamp(event->timestamp());
202+ eventForItem->setTarget(event->target());
203+
204+ UnownedTouchEvent unownedTouchEvent(eventForItem);
205+
206+ #if TOUCHREGISTRY_DEBUG
207+ UG_DEBUG << "Sending unowned" << qPrintable(touchEventToString(eventForItem))
208+ << "to" << item;
209+ #endif
210+
211+ QCoreApplication::sendEvent(item, &unownedTouchEvent);
212+}
213+
214+void TouchRegistry::translateTouchPointFromScreenToWindowCoords(QTouchEvent::TouchPoint &touchPoint)
215+{
216+ touchPoint.setScreenRect(touchPoint.sceneRect());
217+ touchPoint.setStartScreenPos(touchPoint.startScenePos());
218+ touchPoint.setLastScreenPos(touchPoint.lastScenePos());
219+
220+ touchPoint.setSceneRect(touchPoint.rect());
221+ touchPoint.setStartScenePos(touchPoint.startPos());
222+ touchPoint.setLastScenePos(touchPoint.lastPos());
223+}
224+
225+bool TouchRegistry::eventFilter(QObject *watched, QEvent *event)
226+{
227+ Q_UNUSED(watched);
228+
229+ switch (event->type()) {
230+ case QEvent::TouchBegin:
231+ case QEvent::TouchUpdate:
232+ case QEvent::TouchEnd:
233+ case QEvent::TouchCancel:
234+ update(static_cast<QTouchEvent*>(event));
235+ break;
236+ default:
237+ // do nothing
238+ break;
239+ }
240+
241+ // Do not filter out the event. i.e., let it be handled further as
242+ // we're just monitoring events
243+ return false;
244+}
245+
246+void TouchRegistry::addCandidateOwnerForTouch(int id, QQuickItem *candidate)
247+{
248+ #if TOUCHREGISTRY_DEBUG
249+ UG_DEBUG << "addCandidateOwnerForTouch id" << id << "candidate" << candidate;
250+ #endif
251+
252+ Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(id);
253+ if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); }
254+
255+ if (touchInfo->isOwned()) {
256+ qWarning("TouchRegistry: trying to add candidate owner for a touch that's already owned");
257+ return;
258+ }
259+
260+ // TODO: Check if candidate already exists
261+
262+ CandidateInfo candidateInfo;
263+ candidateInfo.undecided = true;
264+ candidateInfo.item = candidate;
265+ candidateInfo.inactivityTimer = new CandidateInactivityTimer(id, candidate,
266+ *m_timerFactory,
267+ this);
268+ connect(candidateInfo.inactivityTimer, &CandidateInactivityTimer::candidateDefaulted,
269+ this, &TouchRegistry::rejectCandidateOwnerForTouch);
270+
271+ touchInfo->candidates.append(candidateInfo);
272+}
273+
274+void TouchRegistry::addTouchWatcher(int touchId, QQuickItem *watcher)
275+{
276+ #if TOUCHREGISTRY_DEBUG
277+ UG_DEBUG << "addTouchWatcher id" << touchId << "watcher" << watcher;
278+ #endif
279+
280+ Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(touchId);
281+ if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); }
282+
283+ // TODO: Check if watcher already exists
284+
285+ touchInfo->watchers.append(watcher);
286+}
287+
288+void TouchRegistry::removeCandidateOwnerForTouch(int id, QQuickItem *candidate)
289+{
290+ #if TOUCHREGISTRY_DEBUG
291+ UG_DEBUG << "removeCandidateOwnerForTouch id" << id << "candidate" << candidate;
292+ #endif
293+
294+ Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(id);
295+ if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); }
296+
297+ int indexRemoved = -1;
298+
299+ // TODO: check if the candidate is in fact the owner of the touch
300+
301+ for (int i = 0; i < touchInfo->candidates.count() && indexRemoved == -1; ++i) {
302+ CandidateInfo &candidateInfo = touchInfo->candidates[i];
303+ if (candidateInfo.item == candidate) {
304+ Q_ASSERT(i > 0 || candidateInfo.undecided);
305+ if (i == 0 && !candidateInfo.undecided) {
306+ qCritical("TouchRegistry: touch owner is being removed.");
307+ }
308+ delete candidateInfo.inactivityTimer;
309+ candidateInfo.inactivityTimer = nullptr;
310+ touchInfo->candidates.removeAt(i);
311+ indexRemoved = i;
312+ }
313+ }
314+
315+ if (indexRemoved == 0) {
316+ // the top candidate has been removed. if the new top candidate
317+ // wants the touch let him know he's now the owner.
318+ if (touchInfo->isOwned()) {
319+ touchInfo->notifyCandidatesOfOwnershipResolution();
320+ }
321+ }
322+
323+ if (!m_inDispatchLoop && touchInfo->ended()) {
324+ m_touchInfoPool.freeSlot(touchInfo);
325+ }
326+}
327+
328+void TouchRegistry::requestTouchOwnership(int id, QQuickItem *candidate)
329+{
330+ #if TOUCHREGISTRY_DEBUG
331+ UG_DEBUG << "requestTouchOwnership id " << id << "candidate" << candidate;
332+ #endif
333+
334+ Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(id);
335+ if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); }
336+
337+ Q_ASSERT(!touchInfo->isOwned());
338+
339+ int candidateIndex = -1;
340+ for (int i = 0; i < touchInfo->candidates.count(); ++i) {
341+ CandidateInfo &candidateInfo = touchInfo->candidates[i];
342+ if (candidateInfo.item == candidate) {
343+ candidateInfo.undecided = false;
344+ delete candidateInfo.inactivityTimer;
345+ candidateInfo.inactivityTimer = nullptr;
346+ candidateIndex = i;
347+ break;
348+ }
349+ }
350+
351+ // add it as a candidate if not present yet
352+ if (candidateIndex < 0) {
353+ CandidateInfo candidateInfo;
354+ candidateInfo.undecided = false;
355+ candidateInfo.item = candidate;
356+ candidateInfo.inactivityTimer = nullptr;
357+ touchInfo->candidates.append(candidateInfo);
358+ // it's the last one
359+ candidateIndex = touchInfo->candidates.count() - 1;
360+ }
361+
362+ // If it's the top candidate it means it's now the owner. Let
363+ // it know about it.
364+ if (candidateIndex == 0) {
365+ touchInfo->notifyCandidatesOfOwnershipResolution();
366+ }
367+}
368+
369+Pool<TouchRegistry::TouchInfo>::Iterator TouchRegistry::findTouchInfo(int id)
370+{
371+ Pool<TouchInfo>::Iterator touchInfo;
372+
373+ m_touchInfoPool.forEach([&](Pool<TouchInfo>::Iterator &someTouchInfo) -> bool {
374+ if (someTouchInfo->id == id) {
375+ touchInfo = someTouchInfo;
376+ return false;
377+ } else {
378+ return true;
379+ }
380+ });
381+
382+ return touchInfo;
383+}
384+
385+
386+void TouchRegistry::rejectCandidateOwnerForTouch(int id, QQuickItem *candidate)
387+{
388+ // NB: It's technically possible that candidate is a dangling pointer at this point.
389+ // Although that would most likely be due to a bug in our code.
390+ // In any case, only dereference it after it's confirmed that it indeed exists.
391+
392+ #if TOUCHREGISTRY_DEBUG
393+ UG_DEBUG << "rejectCandidateOwnerForTouch id" << id << "candidate" << (void*)candidate;
394+ #endif
395+
396+ Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(id);
397+ if (!touchInfo) {
398+ #if TOUCHREGISTRY_DEBUG
399+ UG_DEBUG << "Failed to find TouchInfo for id" << id;
400+ #endif
401+ return;
402+ }
403+
404+ int rejectedCandidateIndex = -1;
405+
406+ // Check if the given candidate is valid and still undecided
407+ for (int i = 0; i < touchInfo->candidates.count() && rejectedCandidateIndex == -1; ++i) {
408+ CandidateInfo &candidateInfo = touchInfo->candidates[i];
409+ if (candidateInfo.item == candidate) {
410+ Q_ASSERT(i > 0 || candidateInfo.undecided);
411+ if (i == 0 && !candidateInfo.undecided) {
412+ qCritical() << "TouchRegistry: Can't reject item (" << (void*)candidate
413+ << ") as it already owns touch" << id;
414+ return;
415+ } else {
416+ // we found the guy and it's all fine.
417+ rejectedCandidateIndex = i;
418+ }
419+ }
420+ }
421+
422+ // If we reached this point it's because the given candidate exists and is indeed undecided.
423+
424+ Q_ASSERT(rejectedCandidateIndex >= 0 && rejectedCandidateIndex < touchInfo->candidates.size());
425+
426+ {
427+ TouchOwnershipEvent lostOwnershipEvent(id, false /*gained*/);
428+ QCoreApplication::sendEvent(candidate, &lostOwnershipEvent);
429+ }
430+
431+ touchInfo->candidates.removeAt(rejectedCandidateIndex);
432+
433+ if (rejectedCandidateIndex == 0) {
434+ // the top candidate has been removed. if the new top candidate
435+ // wants the touch let him know he's now the owner.
436+ if (touchInfo->isOwned()) {
437+ touchInfo->notifyCandidatesOfOwnershipResolution();
438+ }
439+ }
440+}
441+
442+////////////////////////////////////// TouchRegistry::TouchInfo ////////////////////////////////////
443+
444+TouchRegistry::TouchInfo::TouchInfo(int id)
445+{
446+ init(id);
447+}
448+
449+void TouchRegistry::TouchInfo::reset()
450+{
451+ id = -1;
452+
453+ for (int i = 0; i < candidates.count(); ++i) {
454+ CandidateInfo &candidate = candidates[i];
455+ delete candidate.inactivityTimer;
456+ candidate.inactivityTimer.clear(); // shoundn't be needed but anyway...
457+ }
458+}
459+
460+void TouchRegistry::TouchInfo::init(int id)
461+{
462+ this->id = id;
463+ physicallyEnded = false;
464+ candidates.clear();
465+ watchers.clear();
466+}
467+
468+bool TouchRegistry::TouchInfo::isOwned() const
469+{
470+ return !candidates.isEmpty() && !candidates.first().undecided;
471+}
472+
473+bool TouchRegistry::TouchInfo::ended() const
474+{
475+ Q_ASSERT(isValid());
476+ return physicallyEnded && (isOwned() || candidates.isEmpty());
477+}
478+
479+void TouchRegistry::TouchInfo::notifyCandidatesOfOwnershipResolution()
480+{
481+ Q_ASSERT(isOwned());
482+
483+ #if TOUCHREGISTRY_DEBUG
484+ UG_DEBUG << "sending TouchOwnershipEvent(id =" << id
485+ << " gained) to candidate" << candidates[0].item;
486+ #endif
487+
488+ TouchOwnershipEvent gainedOwnershipEvent(id, true /*gained*/);
489+ QCoreApplication::sendEvent(candidates[0].item, &gainedOwnershipEvent);
490+
491+
492+ TouchOwnershipEvent lostOwnershipEvent(id, false /*gained*/);
493+ for (int i = 1; i < candidates.count(); ++i) {
494+ #if TOUCHREGISTRY_DEBUG
495+ UG_DEBUG << "sending TouchWonershipEvent(id =" << id << " lost) to candidate"
496+ << candidates[i].item;
497+ #endif
498+ QCoreApplication::sendEvent(candidates[i].item, &lostOwnershipEvent);
499+ }
500+}
libs/UbuntuGestures/TouchRegistry.hnew file+182
@@ -0,0 +1,182 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef UNITY_TOUCHREGISTRY_H
18+#define UNITY_TOUCHREGISTRY_H
19+
20+#include <QQuickItem>
21+#include <QObject>
22+#include <QPointer>
23+#include <QTouchEvent>
24+#include <QVector>
25+
26+#include "UbuntuGesturesGlobal.h"
27+#include "CandidateInactivityTimer.h"
28+#include "Pool.h"
29+
30+namespace UbuntuGestures {
31+ class AbstractTimerFactory;
32+}
33+
34+/*
35+ Where the ownership of touches is registered.
36+
37+ Singleton used for adding a touch point ownership model analogous to the one
38+ described in the XInput 2.2 protocol[1] on top of the existing input dispatch logic in QQuickWindow.
39+
40+ It provides a much more flexible and powerful way of dealing with pointer ownership than the existing
41+ mechanisms in Qt. Namely QQuickItem::grabTouchPoints, QuickItem::keepTouchGrab,
42+ QQuickItem::setFiltersChildMouseEvents, QQuickItem::ungrabTouchPoints and QQuickItem::touchUngrabEvent.
43+
44+ Usage:
45+
46+ 1- An item receives a a new touch point. If he's not sure whether he wants it yet, he calls:
47+ TouchRegistry::instance()->addCandidateOwnerForTouch(touchId, this);
48+ touchEvent->ignore();
49+ Ignoring the event is crucial so that it can be seen by other interested parties, which will
50+ behave similarly.
51+
52+ 2- That item will then start receiving UnownedTouchEvents for that touch from step 1. Once he's
53+ made a decision he calls either:
54+ TouchRegistry::instance()->requestTouchOwnership(touchId, this);
55+ If he wants the touch point or:
56+ TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, this);
57+  if he does not want it.
58+
59+ Candidates are put in a priority queue. The first one to call addCandidateOwnerForTouch() will
60+ take precedence over the others for receiving ownership over the touch point (from now on called
61+ simply top-candidate).
62+
63+ If the top-candidate calls requestTouchOwnership() he will immediately receive a
64+ TouchOwnershipEvent(gained=true) for that touch point. He can then safely call
65+ QQuickItem::grabTouchPoints to actually get the owned touch points. The other candidates
66+ will receive TouchOwnershipEvent(gained=false) and will no longer receive UnownedTouchEvents
67+ for that touch point. They will have to undo whatever action they were performing with that
68+ touch point.
69+
70+ But if the top-candidate calls removeCandidateOwnerForTouch() instead, he's popped from the
71+ candidacy queue and ownership is given to the new top-most candidate if he has already
72+ made his decision, that is.
73+
74+ The TouchRegistry cannot enforce the results of this pointer ownership negotiation (i.e.,
75+ who gets to grab the touch points) as that would clash with QQuickWindow's input event
76+ dispatching logic. The candidates have to respect the decision and grab the touch points
77+ themselves.
78+
79+ If an item wants ownership over touches as soon as he receives the TouchBegin for them, his step 1
80+ would be instead:
81+ TouchRegistry::instance()->requestTouchOwnership(touchId, this);
82+ return true;
83+ He would then be notified once ownership has been granted to him, from which point onwards he could
84+ safely assume other TouchRegistry users wouldn't snatch this touch away from him.
85+
86+ Items oblivious to TouchRegistry will lose their touch points without warning, just like in plain Qt.
87+
88+ [1] - http://www.x.org/releases/X11R7.7/doc/inputproto/XI2proto.txt (see multitouch-ownership)
89+ */
90+class UBUNTUGESTURES_EXPORT TouchRegistry : public QObject
91+{
92+ Q_OBJECT
93+public:
94+ TouchRegistry(QObject *parent = nullptr);
95+ // Useful for tests, where you should feed a fake timer
96+ TouchRegistry(QObject *parent, UbuntuGestures::AbstractTimerFactory *timerFactory);
97+
98+ virtual ~TouchRegistry();
99+
100+ // Returns a pointer to the application's TouchRegistry instance.
101+ // If no instance has been allocated, null is returned.
102+ static TouchRegistry *instance() { return m_instance; }
103+
104+ void update(const QTouchEvent *event);
105+
106+ // Calls update() if the given event is a QTouchEvent
107+ bool eventFilter(QObject *watched, QEvent *event) override;
108+
109+ // An item that might later request ownership over the given touch point.
110+ // He will be kept informed about that touch point through UnownedTouchEvents
111+ // All candidates must eventually decide whether they want to own the touch point
112+ // or not. That decision is informed through requestTouchOwnership() or
113+ // removeCandidateOwnerForTouch()
114+ void addCandidateOwnerForTouch(int id, QQuickItem *candidate);
115+
116+ // The same as rejecting ownership of a touch
117+ void removeCandidateOwnerForTouch(int id, QQuickItem *candidate);
118+
119+ // The candidate object wants to be the owner of the touch with the given id.
120+ // If he's currently the oldest/top-most candidate, he will get an ownership
121+ // event immediately. If not, he will get ownership if (or once) he becomes the
122+ // top-most candidate.
123+ void requestTouchOwnership(int id, QQuickItem *candidate);
124+
125+ // An item that has no interest (effective or potential) in owning a touch point
126+ // but would nonetheless like to be kept up-to-date on its state.
127+ void addTouchWatcher(int touchId, QQuickItem *watcherItem);
128+
129+private Q_SLOTS:
130+ void rejectCandidateOwnerForTouch(int id, QQuickItem *candidate);
131+
132+private:
133+ class CandidateInfo {
134+ public:
135+ bool undecided;
136+ // TODO: Prune candidates that become null and resolve ownership accordingly.
137+ QPointer<QQuickItem> item;
138+ QPointer<UbuntuGestures::CandidateInactivityTimer> inactivityTimer;
139+ };
140+
141+ class TouchInfo {
142+ public:
143+ TouchInfo() : id(-1) {}
144+ TouchInfo(int id);
145+ bool isValid() const { return id >= 0; }
146+ void reset();
147+ void init(int id);
148+ int id;
149+ bool physicallyEnded;
150+ bool isOwned() const;
151+ bool ended() const;
152+ void notifyCandidatesOfOwnershipResolution();
153+
154+ // TODO optimize storage (s/QList/Pool)
155+ QList<CandidateInfo> candidates;
156+ QList<QPointer<QQuickItem>> watchers;
157+ };
158+
159+ Pool<TouchInfo>::Iterator findTouchInfo(int id);
160+
161+ void deliverTouchUpdatesToUndecidedCandidatesAndWatchers(const QTouchEvent *event);
162+
163+ static void translateTouchPointFromScreenToWindowCoords(QTouchEvent::TouchPoint &touchPoint);
164+
165+ static void dispatchPointsToItem(const QTouchEvent *event, const QList<int> &touchIds,
166+ QQuickItem *item);
167+ void freeEndedTouchInfos();
168+
169+ Pool<TouchInfo> m_touchInfoPool;
170+
171+ // the singleton instance
172+ static TouchRegistry *m_instance;
173+
174+ bool m_inDispatchLoop;
175+
176+ UbuntuGestures::AbstractTimerFactory *m_timerFactory;
177+
178+ friend class tst_TouchRegistry;
179+ friend class tst_DirectionalDragArea;
180+};
181+
182+#endif // UNITY_TOUCHREGISTRY_H
plugins/Ubuntu/Gestures/UbuntuGesturesGlobal.h → libs/UbuntuGestures/UbuntuGesturesGlobal.hrenamed+1−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
libs/UbuntuGestures/UnownedTouchEvent.cppnew file+39
@@ -0,0 +1,39 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "UnownedTouchEvent.h"
18+
19+QEvent::Type UnownedTouchEvent::m_unownedTouchEventType = (QEvent::Type)-1;
20+
21+UnownedTouchEvent::UnownedTouchEvent(QTouchEvent *touchEvent)
22+ : QEvent(unownedTouchEventType())
23+ , m_touchEvent(touchEvent)
24+{
25+}
26+
27+QEvent::Type UnownedTouchEvent::unownedTouchEventType()
28+{
29+ if (m_unownedTouchEventType == (QEvent::Type)-1) {
30+ m_unownedTouchEventType = (QEvent::Type)registerEventType();
31+ }
32+
33+ return m_unownedTouchEventType;
34+}
35+
36+QTouchEvent *UnownedTouchEvent::touchEvent()
37+{
38+ return m_touchEvent.data();
39+}
libs/UbuntuGestures/UnownedTouchEvent.hnew file+45
@@ -0,0 +1,45 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef UBUNTU_UNOWNEDTOUCHEVENT_H
18+#define UBUNTU_UNOWNEDTOUCHEVENT_H
19+
20+#include <QTouchEvent>
21+#include <QScopedPointer>
22+#include "UbuntuGesturesGlobal.h"
23+
24+/*
25+ A touch event with touch points that do not belong the item receiving it.
26+
27+ See TouchRegistry::addCandidateOwnerForTouch and TouchRegistry::addTouchWatcher
28+ */
29+class UBUNTUGESTURES_EXPORT UnownedTouchEvent : public QEvent
30+{
31+public:
32+ UnownedTouchEvent(QTouchEvent *touchEvent);
33+ static Type unownedTouchEventType();
34+
35+ // TODO: It might be cleaner to store the information directly in UnownedTouchEvent
36+ // instead of carrying around a synthesized QTouchEvent. But the latter option
37+ // is very convenient.
38+ QTouchEvent *touchEvent();
39+
40+private:
41+ static Type m_unownedTouchEventType;
42+ QScopedPointer<QTouchEvent> m_touchEvent;
43+};
44+
45+#endif // UBUNTU_UNOWNEDTOUCHEVENT_H
plugins/Dash/CardCreator.js+1−1
@@ -629,7 +629,7 @@ function cardString(template, components) {
629629
630630 var implicitHeight = 'implicitHeight: ';
631631 if (hasSummary) {
632− implicitHeight += 'summary.y + summary.height + (summary.text ? units.gu(1) : 0);\n';
632+ implicitHeight += 'summary.y + summary.height + units.gu(1);\n';
633633 } else if (hasHeaderRow) {
634634 implicitHeight += 'row.y + row.height + units.gu(1);\n';
635635 } else if (hasMascot) {
plugins/Dash/listviewwithpageheader.cpp+1−1
@@ -851,7 +851,7 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
851851 if (nextItem) {
852852 listItem->setY(nextItem->y() - listItem->height());
853853 } else if (modelIndex == 0) {
854− listItem->setY(m_headerItem ? m_headerItem->height() : 0);
854+ listItem->setY(-m_clipItem->y() + (m_headerItem ? m_headerItem->height() : 0));
855855 } else if (!m_visibleItems.isEmpty()) {
856856 lostItem = true;
857857 }
plugins/Ubuntu/Gestures/AxisVelocityCalculator.h+2−2
@@ -21,7 +21,7 @@
2121#ifndef VELOCITY_CALCULATOR_H
2222#define VELOCITY_CALCULATOR_H
2323
24−#include "UbuntuGesturesGlobal.h"
24+#include "UbuntuGesturesQmlGlobal.h"
2525#include <stdint.h>
2626#include <QtCore/QObject>
2727#include "TimeSource.h"
@@ -49,7 +49,7 @@
4949 }
5050 }
5151 */
52−class UBUNTUGESTURES_EXPORT AxisVelocityCalculator : public QObject
52+class UBUNTUGESTURESQML_EXPORT AxisVelocityCalculator : public QObject
5353{
5454 Q_OBJECT
5555
plugins/Ubuntu/Gestures/CMakeLists.txt+24−5
@@ -1,19 +1,38 @@
1−set(UbuntuGestureQml_SOURCES
1+# in order to include Qt's private headers
2+remove_definitions(-DQT_NO_KEYWORDS)
3+
4+set(UbuntuGesturesQml_SOURCES
25 plugin.cpp
36 AxisVelocityCalculator.cpp
47 Direction.cpp
58 DirectionalDragArea.cpp
69 PressedOutsideNotifier.cpp
710 TimeSource.cpp
11+ TouchGate.cpp
812)
913
10−add_definitions(-DUBUNTUGESTURES_LIBRARY)
14+add_definitions(-DUBUNTUGESTURESQML_LIBRARY)
1115
12−add_library(UbuntuGestureQml MODULE ${UbuntuGestureQml_SOURCES})
16+add_library(UbuntuGesturesQml MODULE ${UbuntuGesturesQml_SOURCES})
17+target_link_libraries(UbuntuGesturesQml UbuntuGestures)
1318
14−qt5_use_modules(UbuntuGestureQml Core Quick)
19+qt5_use_modules(UbuntuGesturesQml Core Quick)
1520
1621# So that Foo.cpp can #include "Foo.moc"
1722include_directories(${CMAKE_CURRENT_BINARY_DIR})
1823
19−add_unity8_plugin(Ubuntu.Gestures 0.1 Ubuntu/Gestures TARGETS UbuntuGestureQml)
24+include_directories(${CMAKE_SOURCE_DIR}/libs/UbuntuGestures)
25+
26+# There's no cmake var for v8 include path :-/ so create one
27+LIST(GET Qt5Core_INCLUDE_DIRS 0 QtCoreDir0)
28+SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/QtV8/${Qt5Core_VERSION_STRING}/QtV8)
29+
30+# DANGER! DANGER! Using Qt's private API!
31+include_directories(
32+ ${Qt5Qml_PRIVATE_INCLUDE_DIRS}
33+ ${Qt5Quick_INCLUDE_DIRS}
34+ ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
35+ ${Qt5V8_PRIVATE_INCLUDE_DIR}
36+)
37+
38+add_unity8_plugin(Ubuntu.Gestures 0.1 Ubuntu/Gestures TARGETS UbuntuGesturesQml)
plugins/Ubuntu/Gestures/Direction.h+2−2
@@ -17,14 +17,14 @@
1717#ifndef DIRECTION_H
1818#define DIRECTION_H
1919
20−#include "UbuntuGesturesGlobal.h"
20+#include "UbuntuGesturesQmlGlobal.h"
2121#include <QObject>
2222
2323/*
2424 A Direction enum wrapper so that we can do things like "direction: Direction.Righwards"
2525 from QML.
2626 */
27−class UBUNTUGESTURES_EXPORT Direction : public QObject {
27+class UBUNTUGESTURESQML_EXPORT Direction : public QObject {
2828 Q_OBJECT
2929 Q_ENUMS(Type)
3030
plugins/Ubuntu/Gestures/DirectionalDragArea.cpp+317−191
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -14,64 +14,32 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17+#define ACTIVETOUCHESINFO_DEBUG 0
18+#define DIRECTIONALDRAGAREA_DEBUG 0
19+
1720#include "DirectionalDragArea.h"
1821
22+#include <QQuickWindow>
1923#include <QtCore/qmath.h>
20−#include <QtCore/QTimer>
2124#include <QDebug>
2225
23−using namespace UbuntuGestures;
26+#pragma GCC diagnostic push
27+#pragma GCC diagnostic ignored "-pedantic"
28+#include <private/qquickwindow_p.h>
29+#pragma GCC diagnostic pop
2430
25−#define DIRECTIONALDRAGAREA_DEBUG 0
31+// local
32+#include "TouchOwnershipEvent.h"
33+#include "TouchRegistry.h"
34+#include "UnownedTouchEvent.h"
35+
36+using namespace UbuntuGestures;
2637
2738#if DIRECTIONALDRAGAREA_DEBUG
2839#define DDA_DEBUG(msg) qDebug("[DDA] " msg)
29−namespace {
30−QString touchPointStateToString(Qt::TouchPointState state) {
31− switch (state) {
32− case Qt::TouchPointPressed:
33− return QString("pressed");
34− case Qt::TouchPointMoved:
35− return QString("moved");
36− case Qt::TouchPointStationary:
37− return QString("stationary");
38− default: // Qt::TouchPointReleased:
39− return QString("released");
40− }
41−}
42−QString touchEventToString(QTouchEvent *ev)
43−{
44− QString message;
45−
46− switch (ev->type()) {
47− case QEvent::TouchBegin:
48− message.append("TouchBegin ");
49− break;
50− case QEvent::TouchUpdate:
51− message.append("TouchUpdate ");
52− break;
53− case QEvent::TouchEnd:
54− message.append("TouchEnd ");
55− break;
56− default: //QEvent::TouchCancel
57− message.append("TouchCancel ");
58− }
59−
60− for (int i=0; i < ev->touchPoints().size(); ++i) {
61−
62− const QTouchEvent::TouchPoint& touchPoint = ev->touchPoints().at(i);
63− message.append(
64− QString("(id:%1, state:%2, scenePos:(%3,%4)) ")
65− .arg(touchPoint.id())
66− .arg(touchPointStateToString(touchPoint.state()))
67− .arg(touchPoint.scenePos().x())
68− .arg(touchPoint.scenePos().y())
69− );
70− }
71−
72− return message;
73−}
40+#include "DebugHelpers.h"
7441
42+namespace {
7543const char *statusToString(DirectionalDragArea::Status status)
7644{
7745 if (status == DirectionalDragArea::WaitingForTouch) {
@@ -88,23 +56,6 @@ const char *statusToString(DirectionalDragArea::Status status)
8856#define DDA_DEBUG(msg) do{}while(0)
8957#endif // DIRECTIONALDRAGAREA_DEBUG
9058
91−// Essentially a QTimer wrapper
92−class RecognitionTimer : public UbuntuGestures::AbstractTimer
93−{
94− Q_OBJECT
95−public:
96− RecognitionTimer(QObject *parent) : UbuntuGestures::AbstractTimer(parent) {
97− m_timer.setSingleShot(false);
98− connect(&m_timer, &QTimer::timeout,
99− this, &UbuntuGestures::AbstractTimer::timeout);
100− }
101− virtual int interval() const { return m_timer.interval(); }
102− virtual void setInterval(int msecs) { m_timer.setInterval(msecs); }
103− virtual void start() { m_timer.start(); UbuntuGestures::AbstractTimer::start(); }
104− virtual void stop() { m_timer.stop(); UbuntuGestures::AbstractTimer::stop(); }
105−private:
106− QTimer m_timer;
107−};
10859
10960DirectionalDragArea::DirectionalDragArea(QQuickItem *parent)
11061 : QQuickItem(parent)
@@ -126,12 +77,14 @@ DirectionalDragArea::DirectionalDragArea(QQuickItem *parent)
12677 , m_timeSource(new RealTimeSource)
12778 , m_activeTouches(m_timeSource)
12879{
129− setRecognitionTimer(new RecognitionTimer(this));
80+ setRecognitionTimer(new Timer(this));
13081 m_recognitionTimer->setInterval(60);
82+ m_recognitionTimer->setSingleShot(false);
13183
13284 m_velocityCalculator = new AxisVelocityCalculator(this);
13385
134− connect(this, &QQuickItem::enabledChanged, this, &DirectionalDragArea::onEnabledChanged);
86+ connect(this, &QQuickItem::enabledChanged, this, &DirectionalDragArea::giveUpIfDisabledOrInvisible);
87+ connect(this, &QQuickItem::visibleChanged, this, &DirectionalDragArea::giveUpIfDisabledOrInvisible);
13588}
13689
13790Direction::Type DirectionalDragArea::direction() const
@@ -214,6 +167,7 @@ void DirectionalDragArea::setRecognitionTimer(UbuntuGestures::AbstractTimer *tim
214167{
215168 int interval = 0;
216169 bool timerWasRunning = false;
170+ bool wasSingleShot = false;
217171
218172 // can be null when called from the constructor
219173 if (m_recognitionTimer) {
@@ -226,6 +180,7 @@ void DirectionalDragArea::setRecognitionTimer(UbuntuGestures::AbstractTimer *tim
226180
227181 m_recognitionTimer = timer;
228182 timer->setInterval(interval);
183+ timer->setSingleShot(wasSingleShot);
229184 connect(timer, &UbuntuGestures::AbstractTimer::timeout,
230185 this, &DirectionalDragArea::checkSpeed);
231186 if (timerWasRunning) {
@@ -280,8 +235,144 @@ qreal DirectionalDragArea::touchSceneY() const
280235 return m_previousScenePos.y();
281236}
282237
238+bool DirectionalDragArea::event(QEvent *event)
239+{
240+ if (event->type() == TouchOwnershipEvent::touchOwnershipEventType()) {
241+ touchOwnershipEvent(static_cast<TouchOwnershipEvent *>(event));
242+ return true;
243+ } else if (event->type() == UnownedTouchEvent::unownedTouchEventType()) {
244+ unownedTouchEvent(static_cast<UnownedTouchEvent *>(event));
245+ return true;
246+ } else {
247+ return QQuickItem::event(event);
248+ }
249+}
250+
251+void DirectionalDragArea::touchOwnershipEvent(TouchOwnershipEvent *event)
252+{
253+ if (event->gained()) {
254+ QVector<int> ids;
255+ ids.append(event->touchId());
256+ DDA_DEBUG("grabbing touch");
257+ grabTouchPoints(ids);
258+
259+ // Work around for Qt bug. If we grab a touch that is being used for mouse pointer
260+ // emulation it will cause the emulation logic to go nuts.
261+ // Thus we have to also grab the mouse in this case.
262+ // TODO: Report bug to Qt
263+ if (window()) {
264+ QQuickWindowPrivate *windowPrivate = QQuickWindowPrivate::get(window());
265+ if (windowPrivate->touchMouseId == event->touchId() && window()->mouseGrabberItem()) {
266+ DDA_DEBUG("removing mouse grabber");
267+ window()->mouseGrabberItem()->ungrabMouse();
268+ }
269+ }
270+ } else {
271+ // We still wanna know when it ends for keeping the composition time window up-to-date
272+ TouchRegistry::instance()->addTouchWatcher(m_touchId, this);
273+
274+ setStatus(WaitingForTouch);
275+ }
276+}
277+
278+void DirectionalDragArea::unownedTouchEvent(UnownedTouchEvent *unownedTouchEvent)
279+{
280+ QTouchEvent *event = unownedTouchEvent->touchEvent();
281+
282+ Q_ASSERT(!event->touchPointStates().testFlag(Qt::TouchPointPressed));
283+
284+ #if DIRECTIONALDRAGAREA_DEBUG
285+ // TODO Consider using qCDebug() when available (Qt 5.2)
286+ qDebug() << "[DDA] Unowned" << m_timeSource->msecsSinceReference()
287+ << qPrintable(touchEventToString(event));
288+ #endif
289+
290+ switch (m_status) {
291+ case WaitingForTouch:
292+ // do nothing
293+ break;
294+ case Undecided:
295+ Q_ASSERT(isEnabled() && isVisible());
296+ unownedTouchEvent_undecided(unownedTouchEvent);
297+ break;
298+ default: // Recognized:
299+ // do nothing
300+ break;
301+ }
302+
303+ m_activeTouches.update(event);
304+}
305+
306+void DirectionalDragArea::unownedTouchEvent_undecided(UnownedTouchEvent *unownedTouchEvent)
307+{
308+ const QTouchEvent::TouchPoint *touchPoint = fetchTargetTouchPoint(unownedTouchEvent->touchEvent());
309+ if (!touchPoint) {
310+ qCritical() << "DirectionalDragArea[status=Undecided]: touch " << m_touchId
311+ << "missing from UnownedTouchEvent without first reaching state Qt::TouchPointReleased. "
312+ "Considering it as released.";
313+
314+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
315+ setStatus(WaitingForTouch);
316+ return;
317+ }
318+
319+ const QPointF &touchScenePos = touchPoint->scenePos();
320+
321+ if (touchPoint->state() == Qt::TouchPointReleased) {
322+ // touch has ended before recognition concluded
323+ DDA_DEBUG("Touch has ended before recognition concluded");
324+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
325+ emitSignalIfTapped();
326+ setStatus(WaitingForTouch);
327+ return;
328+ }
329+
330+ m_previousDampedScenePos.setX(m_dampedScenePos.x());
331+ m_previousDampedScenePos.setY(m_dampedScenePos.y());
332+ m_dampedScenePos.update(touchScenePos);
333+ updateVelocityCalculator(touchScenePos);
334+
335+ if (!pointInsideAllowedArea()) {
336+ DDA_DEBUG("Rejecting gesture because touch point is outside allowed area.");
337+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
338+ // We still wanna know when it ends for keeping the composition time window up-to-date
339+ TouchRegistry::instance()->addTouchWatcher(m_touchId, this);
340+ setStatus(WaitingForTouch);
341+ return;
342+ }
343+
344+ if (!movingInRightDirection()) {
345+ DDA_DEBUG("Rejecting gesture because touch point is moving in the wrong direction.");
346+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
347+ // We still wanna know when it ends for keeping the composition time window up-to-date
348+ TouchRegistry::instance()->addTouchWatcher(m_touchId, this);
349+ setStatus(WaitingForTouch);
350+ return;
351+ }
352+
353+ setPreviousPos(touchPoint->pos());
354+ setPreviousScenePos(touchScenePos);
355+
356+ if (isWithinTouchCompositionWindow()) {
357+ // There's still time for some new touch to appear and ruin our party as it would be combined
358+ // with our m_touchId one and therefore deny the possibility of a single-finger gesture.
359+ DDA_DEBUG("Sill within composition window. Let's wait more.");
360+ return;
361+ }
362+
363+ if (movedFarEnough(touchScenePos)) {
364+ TouchRegistry::instance()->requestTouchOwnership(m_touchId, this);
365+ setStatus(Recognized);
366+ } else {
367+ DDA_DEBUG("Didn't move far enough yet. Let's wait more.");
368+ }
369+}
370+
283371void DirectionalDragArea::touchEvent(QTouchEvent *event)
284372{
373+ // TODO: Consider when more than one touch starts in the same event (although it's not possible
374+ // with Mir's android-input). Have to track them all. Consider it a plus/bonus.
375+
285376 #if DIRECTIONALDRAGAREA_DEBUG
286377 // TODO Consider using qCDebug() when available (Qt 5.2)
287378 qDebug() << "[DDA]" << m_timeSource->msecsSinceReference()
@@ -310,29 +401,34 @@ void DirectionalDragArea::touchEvent(QTouchEvent *event)
310401
311402void DirectionalDragArea::touchEvent_absent(QTouchEvent *event)
312403{
404+ // TODO: accept/reject is for the whole event, not per touch id. See how that affects us.
405+
313406 if (!event->touchPointStates().testFlag(Qt::TouchPointPressed)) {
314407 // Nothing to see here. No touch starting in this event.
315408 return;
316409 }
317410
411+ // to be proven wrong, if that's the case
412+ bool allGood = true;
413+
318414 if (isWithinTouchCompositionWindow()) {
319415 // too close to the last touch start. So we consider them as starting roughly at the same time.
320416 // Can't be a single-touch gesture.
321417 #if DIRECTIONALDRAGAREA_DEBUG
322418 qDebug("[DDA] A new touch point came in but we're still within time composition window. Ignoring it.");
323419 #endif
324− return;
420+ allGood = false;
325421 }
326422
327423 const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
328424
329425 const QTouchEvent::TouchPoint *newTouchPoint = nullptr;
330− for (int i = 0; i < touchPoints.count(); ++i) {
426+ for (int i = 0; i < touchPoints.count() && allGood; ++i) {
331427 const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
332428 if (touchPoint.state() == Qt::TouchPointPressed) {
333429 if (newTouchPoint) {
334430 // more than one touch starting in this QTouchEvent. Can't be a single-touch gesture
335− return;
431+ allGood = false;
336432 } else {
337433 // that's our candidate
338434 m_touchId = touchPoint.id();
@@ -341,85 +437,61 @@ void DirectionalDragArea::touchEvent_absent(QTouchEvent *event)
341437 }
342438 }
343439
344− Q_ASSERT(newTouchPoint);
440+ if (allGood) {
441+ Q_ASSERT(newTouchPoint);
345442
346− // If we have made this far, we are good to go to the next status.
347−
348− m_startPos = newTouchPoint->pos();
349− m_startScenePos = newTouchPoint->scenePos();
350− m_touchId = newTouchPoint->id();
351− m_dampedScenePos.reset(m_startScenePos);
352− m_velocityCalculator->setTrackedPosition(0.);
353− m_velocityCalculator->reset();
354− m_numSamplesOnLastSpeedCheck = 0;
355− m_silenceTime = 0;
356− setPreviousPos(m_startPos);
357− setPreviousScenePos(m_startScenePos);
358− updateSceneDirectionVector();
359−
360− setStatus(Undecided);
443+ m_startPos = newTouchPoint->pos();
444+ m_startScenePos = newTouchPoint->scenePos();
445+ m_touchId = newTouchPoint->id();
446+ m_dampedScenePos.reset(m_startScenePos);
447+ m_velocityCalculator->setTrackedPosition(0.);
448+ m_velocityCalculator->reset();
449+ m_numSamplesOnLastSpeedCheck = 0;
450+ m_silenceTime = 0;
451+ setPreviousPos(m_startPos);
452+ setPreviousScenePos(m_startScenePos);
453+ updateSceneDirectionVector();
454+
455+ if (recognitionIsDisabled()) {
456+ // Behave like a dumb TouchArea
457+ TouchRegistry::instance()->requestTouchOwnership(m_touchId, this);
458+ setStatus(Recognized);
459+ event->accept();
460+ } else {
461+ // just monitor the touch points for now.
462+ TouchRegistry::instance()->addCandidateOwnerForTouch(m_touchId, this);
463+
464+ setStatus(Undecided);
465+ // Let the item below have it. We will monitor it and grab it later if a gesture
466+ // gets recognized.
467+ event->ignore();
468+ }
469+ } else {
470+ watchPressedTouchPoints(touchPoints);
471+ event->ignore();
472+ }
361473}
362474
363475void DirectionalDragArea::touchEvent_undecided(QTouchEvent *event)
364476{
365− const QTouchEvent::TouchPoint *touchPoint = fetchTargetTouchPoint(event);
477+ Q_ASSERT(event->type() == QEvent::TouchBegin);
478+ Q_ASSERT(fetchTargetTouchPoint(event) == nullptr);
366479
367− if (!touchPoint) {
368− qCritical() << "DirectionalDragArea[status=Undecided]: touch " << m_touchId
369− << "missing from QTouchEvent without first reaching state Qt::TouchPointReleased. "
370− "Considering it as released.";
371− setStatus(WaitingForTouch);
372− return;
373− }
374−
375− const QPointF &touchScenePos = touchPoint->scenePos();
376−
377− if (touchPoint->state() == Qt::TouchPointReleased) {
378− // touch has ended before recognition concluded
379− DDA_DEBUG("Touch has ended before recognition concluded");
380− setStatus(WaitingForTouch);
381− Q_EMIT tapped();
382− return;
383− }
480+ // We're not interested in new touch points. We already have our candidate (m_touchId).
481+ // But we do want to know when those new touches end for keeping the composition time
482+ // window up-to-date
483+ event->ignore();
484+ watchPressedTouchPoints(event->touchPoints());
384485
385486 if (event->touchPointStates().testFlag(Qt::TouchPointPressed) && isWithinTouchCompositionWindow()) {
386487 // multi-finger drags are not accepted
387488 DDA_DEBUG("Multi-finger drags are not accepted");
388− setStatus(WaitingForTouch);
389− return;
390− }
391489
392− m_previousDampedScenePos.setX(m_dampedScenePos.x());
393− m_previousDampedScenePos.setY(m_dampedScenePos.y());
394− m_dampedScenePos.update(touchScenePos);
395− updateVelocityCalculator(touchScenePos);
396−
397− if (!pointInsideAllowedArea()) {
398− DDA_DEBUG("Rejecting gesture because touch point is outside allowed area.");
399− setStatus(WaitingForTouch);
400− return;
401− }
490+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
491+ // We still wanna know when it ends for keeping the composition time window up-to-date
492+ TouchRegistry::instance()->addTouchWatcher(m_touchId, this);
402493
403− if (!movingInRightDirection()) {
404− DDA_DEBUG("Rejecting gesture becauuse touch point is moving in the wrong direction.");
405494 setStatus(WaitingForTouch);
406− return;
407− }
408−
409− setPreviousPos(touchPoint->pos());
410− setPreviousScenePos(touchScenePos);
411−
412− if (isWithinTouchCompositionWindow()) {
413− // There's still time for some new touch to appear and ruin our party as it would be combined
414− // with our m_touchId one and therefore deny the possibility of a single-finger gesture.
415− DDA_DEBUG("Sill within composition window. Let's wait more.");
416− return;
417− }
418−
419− if (movedFarEnough(touchScenePos)) {
420− setStatus(Recognized);
421− } else {
422− DDA_DEBUG("Didn't move far enough yet. Let's wait more.");
423495 }
424496}
425497
@@ -437,11 +509,35 @@ void DirectionalDragArea::touchEvent_recognized(QTouchEvent *event)
437509 setPreviousScenePos(touchPoint->scenePos());
438510
439511 if (touchPoint->state() == Qt::TouchPointReleased) {
512+ emitSignalIfTapped();
440513 setStatus(WaitingForTouch);
441514 }
442515 }
443516}
444517
518+void DirectionalDragArea::watchPressedTouchPoints(const QList<QTouchEvent::TouchPoint> &touchPoints)
519+{
520+ for (int i = 0; i < touchPoints.count(); ++i) {
521+ const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
522+ if (touchPoint.state() == Qt::TouchPointPressed) {
523+ TouchRegistry::instance()->addTouchWatcher(touchPoint.id(), this);
524+ }
525+ }
526+}
527+
528+bool DirectionalDragArea::recognitionIsDisabled() const
529+{
530+ return distanceThreshold() <= 0 && compositionTime() <= 0;
531+}
532+
533+void DirectionalDragArea::emitSignalIfTapped()
534+{
535+ qint64 touchDuration = m_timeSource->msecsSinceReference() - m_activeTouches.touchStartTime(m_touchId);
536+ if (touchDuration <= maxTapDuration()) {
537+ Q_EMIT tapped();
538+ }
539+}
540+
445541const QTouchEvent::TouchPoint *DirectionalDragArea::fetchTargetTouchPoint(QTouchEvent *event)
446542{
447543 const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
@@ -509,12 +605,16 @@ bool DirectionalDragArea::movedFarEnough(const QPointF &point) const
509605
510606void DirectionalDragArea::checkSpeed()
511607{
608+ Q_ASSERT(m_status == Undecided);
609+
512610 if (m_velocityCalculator->numSamples() >= AxisVelocityCalculator::MIN_SAMPLES_NEEDED) {
513611 qreal speed = qFabs(m_velocityCalculator->calculate());
514612 qreal minSpeedMsecs = m_minSpeed / 1000.0;
515613
516614 if (speed < minSpeedMsecs) {
517615 DDA_DEBUG("Rejecting gesture because it's below minimum speed.");
616+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
617+ TouchRegistry::instance()->addTouchWatcher(m_touchId, this);
518618 setStatus(WaitingForTouch);
519619 }
520620 }
@@ -523,7 +623,9 @@ void DirectionalDragArea::checkSpeed()
523623 m_silenceTime += m_recognitionTimer->interval();
524624
525625 if (m_silenceTime > m_maxSilenceTime) {
526− DDA_DEBUG("Rejecting gesture because it's silence time has been exceeded.");
626+ DDA_DEBUG("Rejecting gesture because its silence time has been exceeded.");
627+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
628+ TouchRegistry::instance()->addTouchWatcher(m_touchId, this);
527629 setStatus(WaitingForTouch);
528630 }
529631 } else {
@@ -532,10 +634,19 @@ void DirectionalDragArea::checkSpeed()
532634 m_numSamplesOnLastSpeedCheck = m_velocityCalculator->numSamples();
533635}
534636
535−void DirectionalDragArea::onEnabledChanged()
637+void DirectionalDragArea::giveUpIfDisabledOrInvisible()
536638{
537− if (!isEnabled() && m_status != WaitingForTouch) {
538− setStatus(WaitingForTouch);
639+ if (!isEnabled() || !isVisible()) {
640+ if (m_status == Undecided) {
641+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
642+ // We still wanna know when it ends for keeping the composition time window up-to-date
643+ TouchRegistry::instance()->addTouchWatcher(m_touchId, this);
644+ }
645+
646+ if (m_status != WaitingForTouch) {
647+ DDA_DEBUG("Resetting status because got disabled or made invisible");
648+ setStatus(WaitingForTouch);
649+ }
539650 }
540651}
541652
@@ -631,7 +742,9 @@ void DirectionalDragArea::updateVelocityCalculator(const QPointF &scenePos)
631742
632743bool DirectionalDragArea::isWithinTouchCompositionWindow()
633744{
634− return !m_activeTouches.isEmpty() &&
745+ return
746+ compositionTime() > 0 &&
747+ !m_activeTouches.isEmpty() &&
635748 m_timeSource->msecsSinceReference() <=
636749 m_activeTouches.mostRecentStartTime() + (qint64)compositionTime();
637750}
@@ -639,18 +752,17 @@ bool DirectionalDragArea::isWithinTouchCompositionWindow()
639752//************************** ActiveTouchesInfo **************************
640753
641754DirectionalDragArea::ActiveTouchesInfo::ActiveTouchesInfo(const SharedTimeSource &timeSource)
642− : m_timeSource(timeSource), m_lastUsedIndex(-1)
755+ : m_timeSource(timeSource)
643756{
644− // Estimate of the maximum number of active touches we might reach.
645− // Not a problem if it ends up being an underestimate as this is just
646− // an optimization.
647− m_vector.resize(3);
648757}
649758
650759void DirectionalDragArea::ActiveTouchesInfo::update(QTouchEvent *event)
651760{
652761 if (!(event->touchPointStates() & (Qt::TouchPointPressed | Qt::TouchPointReleased))) {
653762 // nothing to update
763+ #if ACTIVETOUCHESINFO_DEBUG
764+ qDebug("[DDA::ActiveTouchesInfo] Nothing to Update");
765+ #endif
654766 return;
655767 }
656768
@@ -658,74 +770,88 @@ void DirectionalDragArea::ActiveTouchesInfo::update(QTouchEvent *event)
658770 for (int i = 0; i < touchPoints.count(); ++i) {
659771 const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
660772 if (touchPoint.state() == Qt::TouchPointPressed) {
661− addTouchPoint(touchPoint);
773+ addTouchPoint(touchPoint.id());
662774 } else if (touchPoint.state() == Qt::TouchPointReleased) {
663− removeTouchPoint(touchPoint);
775+ removeTouchPoint(touchPoint.id());
664776 }
665777 }
666778}
667779
668−void DirectionalDragArea::ActiveTouchesInfo::addTouchPoint(const QTouchEvent::TouchPoint &touchPoint)
780+#if ACTIVETOUCHESINFO_DEBUG
781+QString DirectionalDragArea::ActiveTouchesInfo::toString()
669782{
670− ActiveTouchInfo &activeTouchInfo = getEmptySlot();
671− activeTouchInfo.id = touchPoint.id();
672− activeTouchInfo.startTime = m_timeSource->msecsSinceReference();
783+ QString string = "(";
784+
785+ {
786+ QTextStream stream(&string);
787+ m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &touchInfo) {
788+ stream << "(id=" << touchInfo->id << ",startTime=" << touchInfo->startTime << ")";
789+ return true;
790+ });
791+ }
792+
793+ string.append(")");
794+
795+ return string;
673796}
797+#endif // ACTIVETOUCHESINFO_DEBUG
674798
675−void DirectionalDragArea::ActiveTouchesInfo::removeTouchPoint(const QTouchEvent::TouchPoint &touchPoint)
799+void DirectionalDragArea::ActiveTouchesInfo::addTouchPoint(int touchId)
676800{
677− for (int i = 0; i <= m_lastUsedIndex; ++i) {
678− if (touchPoint.id() == m_vector.at(i).id) {
679− freeSlot(i);
680− return;
681− }
682− }
683− Q_ASSERT(false); // shouldn't reach this point
801+ ActiveTouchInfo &activeTouchInfo = m_touchInfoPool.getEmptySlot();
802+ activeTouchInfo.id = touchId;
803+ activeTouchInfo.startTime = m_timeSource->msecsSinceReference();
804+
805+ #if ACTIVETOUCHESINFO_DEBUG
806+ qDebug() << "[DDA::ActiveTouchesInfo]" << qPrintable(toString());
807+ #endif
684808}
685809
686−DirectionalDragArea::ActiveTouchInfo &DirectionalDragArea::ActiveTouchesInfo::getEmptySlot()
810+qint64 DirectionalDragArea::ActiveTouchesInfo::touchStartTime(int touchId)
687811{
688− Q_ASSERT(m_lastUsedIndex < m_vector.size());
812+ qint64 result = -1;
689813
690− // Look for an in-between vacancy first
691− for (int i = 0; i < m_lastUsedIndex; ++i) {
692− ActiveTouchInfo &activeTouchInfo = m_vector[i];
693− if (!activeTouchInfo.isValid()) {
694− return activeTouchInfo;
814+ m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &touchInfo) {
815+ if (touchId == touchInfo->id) {
816+ result = touchInfo->startTime;
817+ return false;
818+ } else {
819+ return true;
695820 }
696− }
697−
698− ++m_lastUsedIndex;
699− if (m_lastUsedIndex >= m_vector.size()) {
700− m_vector.resize(m_lastUsedIndex + 1);
701− }
821+ });
702822
703− return m_vector[m_lastUsedIndex];
823+ Q_ASSERT(result != -1);
824+ return result;
704825}
705826
706−void DirectionalDragArea::ActiveTouchesInfo::freeSlot(int index)
827+void DirectionalDragArea::ActiveTouchesInfo::removeTouchPoint(int touchId)
707828{
708− m_vector[index].reset();
709− if (index == m_lastUsedIndex) {
710− do {
711− --m_lastUsedIndex;
712− } while (m_lastUsedIndex >= 0 && !m_vector.at(m_lastUsedIndex).isValid());
713− }
829+ m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &touchInfo) {
830+ if (touchId == touchInfo->id) {
831+ m_touchInfoPool.freeSlot(touchInfo);
832+ return false;
833+ } else {
834+ return true;
835+ }
836+ });
837+
838+ #if ACTIVETOUCHESINFO_DEBUG
839+ qDebug() << "[DDA::ActiveTouchesInfo]" << qPrintable(toString());
840+ #endif
714841}
715842
716843qint64 DirectionalDragArea::ActiveTouchesInfo::mostRecentStartTime()
717844{
718− Q_ASSERT(m_lastUsedIndex >= 0);
845+ Q_ASSERT(!m_touchInfoPool.isEmpty());
846+
847+ qint64 highestStartTime = -1;
719848
720− qint64 highestStartTime = m_vector.at(0).startTime;
721− int i = 1;
722− do {
723− const ActiveTouchInfo &activeTouchInfo = m_vector.at(i);
724− if (activeTouchInfo.isValid() && activeTouchInfo.startTime > highestStartTime) {
725− highestStartTime = activeTouchInfo.startTime;
849+ m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &activeTouchInfo) {
850+ if (activeTouchInfo->startTime > highestStartTime) {
851+ highestStartTime = activeTouchInfo->startTime;
726852 }
727− ++i;
728− } while (i < m_lastUsedIndex);
853+ return true;
854+ });
729855
730856 return highestStartTime;
731857}
plugins/Ubuntu/Gestures/DirectionalDragArea.h+37−29
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013,2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -19,27 +19,16 @@
1919
2020#include <QtQuick/QQuickItem>
2121#include "AxisVelocityCalculator.h"
22−#include "UbuntuGesturesGlobal.h"
22+#include "UbuntuGesturesQmlGlobal.h"
2323#include "Damper.h"
2424#include "Direction.h"
2525
26−namespace UbuntuGestures {
27−/* Defines an interface for a Timer. */
28−class UBUNTUGESTURES_EXPORT AbstractTimer : public QObject {
29− Q_OBJECT
30−public:
31− AbstractTimer(QObject *parent) : QObject(parent), m_isRunning(false) {}
32− virtual int interval() const = 0;
33− virtual void setInterval(int msecs) = 0;
34− virtual void start() { m_isRunning = true; };
35− virtual void stop() { m_isRunning = false; }
36− bool isRunning() const { return m_isRunning; }
37−Q_SIGNALS:
38− void timeout();
39−private:
40− bool m_isRunning;
41−};
42−}
26+// lib UbuntuGestures
27+#include <Pool.h>
28+#include <Timer.h>
29+
30+class TouchOwnershipEvent;
31+class UnownedTouchEvent;
4332
4433/*
4534 An area that detects axis-aligned single-finger drag gestures
@@ -50,7 +39,7 @@ private:
5039
5140 See doc/DirectionalDragArea.svg
5241 */
53−class UBUNTUGESTURES_EXPORT DirectionalDragArea : public QQuickItem {
42+class UBUNTUGESTURESQML_EXPORT DirectionalDragArea : public QQuickItem {
5443 Q_OBJECT
5544
5645 // The direction in which the gesture should move in order to be recognized.
@@ -196,6 +185,12 @@ public:
196185 // Useful for testing, where a fake time source can be supplied
197186 void setTimeSource(const UbuntuGestures::SharedTimeSource &timeSource);
198187
188+ bool event(QEvent *e) override;
189+
190+ // Maximum time, in milliseconds, between a press and a release, for a touch
191+ // sequence to be considered a tap.
192+ int maxTapDuration() const { return 300; }
193+
199194Q_SIGNALS:
200195 void directionChanged(Direction::Type direction);
201196 void statusChanged(Status value);
@@ -212,6 +207,10 @@ Q_SIGNALS:
212207 void touchYChanged(qreal value);
213208 void touchSceneXChanged(qreal value);
214209 void touchSceneYChanged(qreal value);
210+
211+ // TODO: I would rather not have such signal as it has nothing to do with drag gestures.
212+ // Remove when no longer used or move its implementation to the QML code that uses it
213+ // See maxTapDuration()
215214 void tapped();
216215
217216protected:
@@ -219,7 +218,7 @@ protected:
219218
220219private Q_SLOTS:
221220 void checkSpeed();
222− void onEnabledChanged();
221+ void giveUpIfDisabledOrInvisible();
223222
224223private:
225224 void touchEvent_absent(QTouchEvent *event);
@@ -238,6 +237,12 @@ private:
238237 // returns the scalar projection between the given vector (in scene coordinates)
239238 // and m_sceneDirectionVector
240239 qreal projectOntoDirectionVector(const QPointF &sceneVector) const;
240+ void touchOwnershipEvent(TouchOwnershipEvent *event);
241+ void unownedTouchEvent(UnownedTouchEvent *event);
242+ void unownedTouchEvent_undecided(UnownedTouchEvent *unownedTouchEvent);
243+ void watchPressedTouchPoints(const QList<QTouchEvent::TouchPoint> &touchPoints);
244+ bool recognitionIsDisabled() const;
245+ void emitSignalIfTapped();
241246
242247 Status m_status;
243248
@@ -283,18 +288,21 @@ private:
283288 public:
284289 ActiveTouchesInfo(const UbuntuGestures::SharedTimeSource &timeSource);
285290 void update(QTouchEvent *event);
286− ActiveTouchInfo &touchInfo(int id);
291+ qint64 touchStartTime(int id);
292+ bool isEmpty() const { return m_touchInfoPool.isEmpty(); }
287293 qint64 mostRecentStartTime();
288294 UbuntuGestures::SharedTimeSource m_timeSource;
289− bool isEmpty() const { return m_lastUsedIndex == -1; }
290295 private:
291− void addTouchPoint(const QTouchEvent::TouchPoint &touchPoint);
292− ActiveTouchInfo &getEmptySlot();
293− void freeSlot(int index);
294− void removeTouchPoint(const QTouchEvent::TouchPoint &touchPoint);
295− QVector<struct ActiveTouchInfo> m_vector;
296− int m_lastUsedIndex;
296+ void addTouchPoint(int touchId);
297+ void removeTouchPoint(int touchId);
298+ #if ACTIVETOUCHESINFO_DEBUG
299+ QString toString();
300+ #endif
301+
302+ Pool<ActiveTouchInfo> m_touchInfoPool;
297303 } m_activeTouches;
304+
305+ friend class tst_DirectionalDragArea;
298306};
299307
300308#endif // DIRECTIONAL_DRAG_AREA_H
plugins/Ubuntu/Gestures/TimeSource.h+2−2
@@ -21,14 +21,14 @@
2121#ifndef UBUNTUGESTURES_TIMESOURCE_H
2222#define UBUNTUGESTURES_TIMESOURCE_H
2323
24−#include "UbuntuGesturesGlobal.h"
24+#include "UbuntuGesturesQmlGlobal.h"
2525#include <QSharedPointer>
2626
2727namespace UbuntuGestures {
2828/*
2929 Interface for a time source.
3030 */
31−class UBUNTUGESTURES_EXPORT TimeSource {
31+class UBUNTUGESTURESQML_EXPORT TimeSource {
3232public:
3333 virtual ~TimeSource() {}
3434 /* Returns the current time in milliseconds since some reference time in the past. */
plugins/Ubuntu/Gestures/TouchGate.cppnew file+347
@@ -0,0 +1,347 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "TouchGate.h"
18+
19+#include <QCoreApplication>
20+#include <QDebug>
21+
22+#include <TouchOwnershipEvent.h>
23+#include <TouchRegistry.h>
24+
25+#pragma GCC diagnostic push
26+#pragma GCC diagnostic ignored "-pedantic"
27+#include <private/qquickitem_p.h>
28+#pragma GCC diagnostic pop
29+
30+#if TOUCHGATE_DEBUG
31+#include <DebugHelpers.h>
32+#endif
33+
34+
35+bool TouchGate::event(QEvent *e)
36+{
37+ if (e->type() == TouchOwnershipEvent::touchOwnershipEventType()) {
38+ touchOwnershipEvent(static_cast<TouchOwnershipEvent *>(e));
39+ return true;
40+ } else {
41+ return QQuickItem::event(e);
42+ }
43+}
44+
45+void TouchGate::touchEvent(QTouchEvent *event)
46+{
47+ #if TOUCHGATE_DEBUG
48+ qDebug() << "[TouchGate] got touch event" << qPrintable(touchEventToString(event));
49+ #endif
50+ event->accept();
51+
52+ const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
53+ bool goodToGo = true;
54+ for (int i = 0; i < touchPoints.count(); ++i) {
55+ const QTouchEvent::TouchPoint &touchPoint = touchPoints[i];
56+
57+ if (touchPoint.state() == Qt::TouchPointPressed) {
58+ Q_ASSERT(!m_touchInfoMap.contains(touchPoint.id()));
59+ m_touchInfoMap[touchPoint.id()].ownership = OwnershipRequested;
60+ m_touchInfoMap[touchPoint.id()].ended = false;
61+ TouchRegistry::instance()->requestTouchOwnership(touchPoint.id(), this);
62+ }
63+
64+ goodToGo &= m_touchInfoMap.contains(touchPoint.id())
65+ && m_touchInfoMap[touchPoint.id()].ownership == OwnershipGranted;
66+
67+ if (touchPoint.state() == Qt::TouchPointReleased && m_touchInfoMap.contains(touchPoint.id())) {
68+ m_touchInfoMap[touchPoint.id()].ended = true;
69+ }
70+
71+ }
72+
73+ if (goodToGo) {
74+ if (m_storedEvents.isEmpty()) {
75+ // let it pass through
76+ dispatchTouchEventToTarget(event);
77+ } else {
78+ // Retain the event to ensure TouchGate dispatches them in order.
79+ // Otherwise the current event would come before the stored ones, which are older.
80+ #if TOUCHGATE_DEBUG
81+ qDebug("[TouchGate] Storing event because thouches %s are still pending ownership.",
82+ qPrintable(oldestPendingTouchIdsString()));
83+ #endif
84+ storeTouchEvent(event);
85+ }
86+ } else {
87+ // Retain events that have unowned touches
88+ storeTouchEvent(event);
89+ }
90+}
91+
92+void TouchGate::touchOwnershipEvent(TouchOwnershipEvent *event)
93+{
94+ // TODO: Optimization: batch those actions as TouchOwnershipEvents
95+ // might come one right after the other.
96+
97+ Q_ASSERT(m_touchInfoMap.contains(event->touchId()));
98+
99+ TouchInfo &touchInfo = m_touchInfoMap[event->touchId()];
100+
101+ if (event->gained()) {
102+ #if TOUCHGATE_DEBUG
103+ qDebug() << "[TouchGate] Got ownership of touch " << event->touchId();
104+ #endif
105+ touchInfo.ownership = OwnershipGranted;
106+ } else {
107+ #if TOUCHGATE_DEBUG
108+ qDebug() << "[TouchGate] Lost ownership of touch " << event->touchId();
109+ #endif
110+ m_touchInfoMap.remove(event->touchId());
111+ removeTouchFromStoredEvents(event->touchId());
112+ }
113+
114+ dispatchFullyOwnedEvents();
115+}
116+
117+bool TouchGate::isTouchPointOwned(int touchId) const
118+{
119+ return m_touchInfoMap[touchId].ownership == OwnershipGranted;
120+}
121+
122+void TouchGate::storeTouchEvent(const QTouchEvent *event)
123+{
124+ #if TOUCHGATE_DEBUG
125+ qDebug() << "[TouchGate] Storing" << qPrintable(touchEventToString(event));
126+ #endif
127+
128+ TouchEvent clonedEvent(event);
129+ m_storedEvents.append(std::move(clonedEvent));
130+}
131+
132+void TouchGate::removeTouchFromStoredEvents(int touchId)
133+{
134+ int i = 0;
135+ while (i < m_storedEvents.count()) {
136+ TouchEvent &event = m_storedEvents[i];
137+ bool removed = event.removeTouch(touchId);
138+
139+ if (removed && event.touchPoints.isEmpty()) {
140+ m_storedEvents.removeAt(i);
141+ } else {
142+ ++i;
143+ }
144+ }
145+}
146+
147+void TouchGate::dispatchFullyOwnedEvents()
148+{
149+ while (!m_storedEvents.isEmpty() && eventIsFullyOwned(m_storedEvents.first())) {
150+ TouchEvent event = m_storedEvents.takeFirst();
151+ dispatchTouchEventToTarget(event);
152+ }
153+}
154+
155+#if TOUCHGATE_DEBUG
156+QString TouchGate::oldestPendingTouchIdsString()
157+{
158+ Q_ASSERT(!m_storedEvents.isEmpty());
159+
160+ QString str;
161+
162+ const auto &touchPoints = m_storedEvents.first().touchPoints;
163+ for (int i = 0; i < touchPoints.count(); ++i) {
164+ if (!isTouchPointOwned(touchPoints[i].id())) {
165+ if (!str.isEmpty()) {
166+ str.append(", ");
167+ }
168+ str.append(QString::number(touchPoints[i].id()));
169+ }
170+ }
171+
172+ return str;
173+}
174+#endif
175+
176+bool TouchGate::eventIsFullyOwned(const TouchGate::TouchEvent &event) const
177+{
178+ for (int i = 0; i < event.touchPoints.count(); ++i) {
179+ if (!isTouchPointOwned(event.touchPoints[i].id())) {
180+ return false;
181+ }
182+ }
183+
184+ return true;
185+}
186+
187+void TouchGate::setTargetItem(QQuickItem *item)
188+{
189+ // TODO: changing the target item while dispatch of touch events is taking place will
190+ // create a mess
191+
192+ if (item == m_targetItem.data())
193+ return;
194+
195+ m_targetItem = item;
196+ Q_EMIT targetItemChanged(item);
197+}
198+
199+void TouchGate::dispatchTouchEventToTarget(const TouchEvent &event)
200+{
201+ dispatchTouchEventToTarget(event.eventType,
202+ event.device,
203+ event.modifiers,
204+ event.touchPoints,
205+ event.target,
206+ event.window,
207+ event.timestamp);
208+}
209+
210+void TouchGate::dispatchTouchEventToTarget(QTouchEvent* event)
211+{
212+ dispatchTouchEventToTarget(event->type(),
213+ event->device(),
214+ event->modifiers(),
215+ event->touchPoints(),
216+ event->target(),
217+ event->window(),
218+ event->timestamp());
219+}
220+
221+void TouchGate::dispatchTouchEventToTarget(QEvent::Type eventType,
222+ QTouchDevice *device,
223+ Qt::KeyboardModifiers modifiers,
224+ const QList<QTouchEvent::TouchPoint> &touchPoints,
225+ QObject *target,
226+ QWindow *window,
227+ ulong timestamp)
228+{
229+ removeTouchInfoForEndedTouches(touchPoints);
230+
231+ if (m_targetItem.isNull()) {
232+ qWarning("[TouchGate] Cannot dispatch touch event because target item is null");
233+ return;
234+ }
235+
236+ QQuickItem *targetItem = m_targetItem.data();
237+
238+ if (!targetItem->isEnabled() || !targetItem->isVisible()) {
239+ #if TOUCHGATE_DEBUG
240+ qDebug() << "[TouchGate] Cannot dispatch touch event to" << targetItem
241+ << "because it's disabled or invisible.";
242+ #endif
243+ return;
244+ }
245+
246+ // Map touch points to targetItem coordinates
247+ QList<QTouchEvent::TouchPoint> targetTouchPoints = touchPoints;
248+ transformTouchPoints(targetTouchPoints, QQuickItemPrivate::get(targetItem)->windowToItemTransform());
249+ QTouchEvent *eventForTargetItem = createQTouchEvent(eventType, device, modifiers, targetTouchPoints,
250+ target, window, timestamp);
251+
252+ #if TOUCHGATE_DEBUG
253+ qDebug() << "[TouchGate] dispatching" << qPrintable(touchEventToString(eventForTargetItem))
254+ << "to" << targetItem;
255+ #endif
256+
257+ QCoreApplication::sendEvent(targetItem, eventForTargetItem);
258+
259+ delete eventForTargetItem;
260+}
261+
262+// NB: From QQuickWindow
263+void TouchGate::transformTouchPoints(QList<QTouchEvent::TouchPoint> &touchPoints, const QTransform &transform)
264+{
265+ QMatrix4x4 transformMatrix(transform);
266+ for (int i=0; i<touchPoints.count(); i++) {
267+ QTouchEvent::TouchPoint &touchPoint = touchPoints[i];
268+ touchPoint.setRect(transform.mapRect(touchPoint.sceneRect()));
269+ touchPoint.setStartPos(transform.map(touchPoint.startScenePos()));
270+ touchPoint.setLastPos(transform.map(touchPoint.lastScenePos()));
271+ touchPoint.setVelocity(transformMatrix.mapVector(touchPoint.velocity()).toVector2D());
272+ }
273+}
274+
275+QTouchEvent *TouchGate::createQTouchEvent(QEvent::Type eventType,
276+ QTouchDevice *device,
277+ Qt::KeyboardModifiers modifiers,
278+ const QList<QTouchEvent::TouchPoint> &touchPoints,
279+ QObject *target,
280+ QWindow *window,
281+ ulong timestamp)
282+{
283+ Qt::TouchPointStates eventStates = 0;
284+ for (int i = 0; i < touchPoints.count(); i++)
285+ eventStates |= touchPoints[i].state();
286+ // if all points have the same state, set the event type accordingly
287+ switch (eventStates) {
288+ case Qt::TouchPointPressed:
289+ eventType = QEvent::TouchBegin;
290+ break;
291+ case Qt::TouchPointReleased:
292+ eventType = QEvent::TouchEnd;
293+ break;
294+ default:
295+ eventType = QEvent::TouchUpdate;
296+ break;
297+ }
298+
299+ QTouchEvent *touchEvent = new QTouchEvent(eventType);
300+ touchEvent->setWindow(window);
301+ touchEvent->setTarget(target);
302+ touchEvent->setDevice(device);
303+ touchEvent->setModifiers(modifiers);
304+ touchEvent->setTouchPoints(touchPoints);
305+ touchEvent->setTouchPointStates(eventStates);
306+ touchEvent->setTimestamp(timestamp);
307+ touchEvent->accept();
308+ return touchEvent;
309+}
310+
311+void TouchGate::removeTouchInfoForEndedTouches(const QList<QTouchEvent::TouchPoint> &touchPoints)
312+{
313+ for (int i = 0; i < touchPoints.size(); ++i) {\
314+ const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
315+
316+ if (touchPoint.state() == Qt::TouchPointReleased) {
317+ Q_ASSERT(m_touchInfoMap.contains(touchPoint.id()));
318+ Q_ASSERT(m_touchInfoMap[touchPoint.id()].ended);
319+ Q_ASSERT(m_touchInfoMap[touchPoint.id()].ownership == OwnershipGranted);
320+ m_touchInfoMap.remove(touchPoint.id());
321+ }
322+ }
323+}
324+
325+TouchGate::TouchEvent::TouchEvent(const QTouchEvent *event)
326+ : eventType(event->type())
327+ , device(event->device())
328+ , modifiers(event->modifiers())
329+ , touchPoints(event->touchPoints())
330+ , target(event->target())
331+ , window(event->window())
332+ , timestamp(event->timestamp())
333+{
334+}
335+
336+bool TouchGate::TouchEvent::removeTouch(int touchId)
337+{
338+ bool removed = false;
339+ for (int i = 0; i < touchPoints.count() && !removed; ++i) {
340+ if (touchPoints[i].id() == touchId) {
341+ touchPoints.removeAt(i);
342+ removed = true;
343+ }
344+ }
345+
346+ return removed;
347+}
plugins/Ubuntu/Gestures/TouchGate.hnew file+126
@@ -0,0 +1,126 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef UBUNTU_TOUCH_GATE_H
18+#define UBUNTU_TOUCH_GATE_H
19+
20+#include "UbuntuGesturesQmlGlobal.h"
21+
22+#include <QQuickItem>
23+#include <QList>
24+#include <QPointer>
25+#include <QMap>
26+
27+#define TOUCHGATE_DEBUG 0
28+
29+class TouchOwnershipEvent;
30+
31+/*
32+ Blocks the passage of events until ownership over the related touch points is granted.
33+
34+ Blocked touch events won't be discarded. Instead they will be buffered until ownership
35+ is granted. If ownership is given to another item, the event buffer is cleared.
36+
37+ A TouchGate is useful as a mediator for items that do not understand, or gracefully handle,
38+ touch canceling. By having a TouchGate in front of them you guarantee that only owned touches (i.e.,
39+ touches that won't be canceled later) reaches them.
40+ */
41+class UBUNTUGESTURESQML_EXPORT TouchGate : public QQuickItem {
42+ Q_OBJECT
43+
44+ // Item that's going to receive the touch events that make it through the gate.
45+ Q_PROPERTY(QQuickItem* targetItem READ targetItem WRITE setTargetItem NOTIFY targetItemChanged)
46+
47+public:
48+ bool event(QEvent *e) override;
49+
50+ QQuickItem *targetItem() { return m_targetItem; }
51+ void setTargetItem(QQuickItem *item);
52+
53+Q_SIGNALS:
54+ void targetItemChanged(QQuickItem *item);
55+
56+protected:
57+ void touchEvent(QTouchEvent *event) override;
58+private:
59+ class TouchEvent {
60+ public:
61+ TouchEvent(const QTouchEvent *event);
62+
63+ bool removeTouch(int touchId);
64+
65+ QEvent::Type eventType;
66+ QTouchDevice *device;
67+ Qt::KeyboardModifiers modifiers;
68+ QList<QTouchEvent::TouchPoint> touchPoints;
69+ QObject *target;
70+ QWindow *window;
71+ ulong timestamp;
72+ };
73+
74+ void touchOwnershipEvent(TouchOwnershipEvent *event);
75+ bool isTouchPointOwned(int touchId) const;
76+ void storeTouchEvent(const QTouchEvent *event);
77+ void removeTouchFromStoredEvents(int touchId);
78+ void dispatchFullyOwnedEvents();
79+ bool eventIsFullyOwned(const TouchEvent &event) const;
80+
81+ void dispatchTouchEventToTarget(const TouchEvent &event);
82+ void dispatchTouchEventToTarget(QTouchEvent* event);
83+ void dispatchTouchEventToTarget(
84+ QEvent::Type eventType,
85+ QTouchDevice *device,
86+ Qt::KeyboardModifiers modifiers,
87+ const QList<QTouchEvent::TouchPoint> &touchPoints,
88+ QObject *target,
89+ QWindow *window,
90+ ulong timestamp);
91+
92+ void transformTouchPoints(QList<QTouchEvent::TouchPoint> &touchPoints, const QTransform &transform);
93+ static QTouchEvent *createQTouchEvent(QEvent::Type eventType,
94+ QTouchDevice *device,
95+ Qt::KeyboardModifiers modifiers,
96+ const QList<QTouchEvent::TouchPoint> &touchPoints,
97+ QObject *target,
98+ QWindow *window,
99+ ulong timestamp);
100+ void removeTouchInfoForEndedTouches(const QList<QTouchEvent::TouchPoint> &touchPoints);
101+
102+ #if TOUCHGATE_DEBUG
103+ QString oldestPendingTouchIdsString();
104+ #endif
105+
106+ QList<TouchEvent> m_storedEvents;
107+
108+ enum {
109+ OwnershipUndefined,
110+ OwnershipRequested,
111+ OwnershipGranted,
112+ };
113+ class TouchInfo {
114+ public:
115+ TouchInfo() {ownership = OwnershipUndefined; ended = false;}
116+ int ownership;
117+ bool ended;
118+ };
119+ QMap<int, TouchInfo> m_touchInfoMap;
120+
121+ QPointer<QQuickItem> m_targetItem;
122+
123+ friend class tst_TouchGate;
124+};
125+
126+#endif // UBUNTU_TOUCH_GATE_H
plugins/Ubuntu/Gestures/UbuntuGesturesQmlGlobal.hnew file+23
@@ -0,0 +1,23 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include <QtCore/QtGlobal>
18+
19+#if defined(UBUNTUGESTURESQML_LIBRARY)
20+# define UBUNTUGESTURESQML_EXPORT Q_DECL_EXPORT
21+#else
22+# define UBUNTUGESTURESQML_EXPORT Q_DECL_IMPORT
23+#endif
plugins/Ubuntu/Gestures/plugin.cpp+3−1
@@ -19,6 +19,7 @@
1919#include "Direction.h"
2020#include "DirectionalDragArea.h"
2121#include "PressedOutsideNotifier.h"
22+#include "TouchGate.h"
2223
2324#include <qqml.h>
2425
@@ -28,10 +29,11 @@ static QObject* directionSingleton(QQmlEngine* engine, QJSEngine* scriptEngine)
2829 return new Direction;
2930}
3031
31−void UbuntuGestureQmlPlugin::registerTypes(const char *uri)
32+void UbuntuGesturesQmlPlugin::registerTypes(const char *uri)
3233{
3334 qmlRegisterSingletonType<Direction>(uri, 0, 1, "Direction", directionSingleton);
3435 qmlRegisterType<DirectionalDragArea>(uri, 0, 1, "DirectionalDragArea");
3536 qmlRegisterType<AxisVelocityCalculator>(uri, 0, 1, "AxisVelocityCalculator");
3637 qmlRegisterType<PressedOutsideNotifier>(uri, 0, 1, "PressedOutsideNotifier");
38+ qmlRegisterType<TouchGate>(uri, 0, 1, "TouchGate");
3739}
plugins/Ubuntu/Gestures/plugin.h+1−1
@@ -19,7 +19,7 @@
1919
2020#include <QtQml/QQmlExtensionPlugin>
2121
22−class UbuntuGestureQmlPlugin : public QQmlExtensionPlugin
22+class UbuntuGesturesQmlPlugin : public QQmlExtensionPlugin
2323{
2424 Q_OBJECT
2525 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
plugins/Ubuntu/Gestures/qmldir+1−1
@@ -1,3 +1,3 @@
11module Ubuntu.Gestures
2−plugin UbuntuGestureQml
2+plugin UbuntuGesturesQml
33typeinfo Gestures.qmltypes
po/am.po+27−55
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-04 15:36+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-08 00:48+0000\n"
1212"Last-Translator: samson <Unknown>\n"
1313"Language-Team: Amharic <am@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -155,23 +155,23 @@ msgid ""
155155msgstr ""
156156"አሁን የ ጠርዝ እንቅስቃሴን አውቀዋል እና መጀመር ይችላሉ ስልኩን መጠቀም <br><br>መመልከቻውን መታ ያድርጉ ለመጀመር"
157157
158−#: qml/Components/Lockscreen.qml:218
158+#: qml/Components/Lockscreen.qml:220
159159msgid "Emergency Call"
160160msgstr "የ ድንገተኛ ጥሪ"
161161
162−#: qml/Components/Lockscreen.qml:250
162+#: qml/Components/Lockscreen.qml:252
163163msgid "OK"
164164msgstr "እሺ"
165165
166−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
167167msgid "See less"
168168msgstr "አነስተኛ መመልከቻ"
169169
170−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
171171msgid "See all"
172172msgstr "ሁሉንም መመልከቻ"
173173
174−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
175175#: qml/Panel/SearchIndicator.qml:27
176176msgid "Search"
177177msgstr "መፈለጊያ"
@@ -210,11 +210,11 @@ msgstr "መላኪያ"
210210
211211#: qml/Dash/PullToRefreshScopeStyle.qml:55
212212msgid "Pull to refresh…"
213−msgstr ""
213+msgstr "ይሳቡ ለማነቃቃት…"
214214
215215#: qml/Dash/PullToRefreshScopeStyle.qml:60
216216msgid "Release to refresh…"
217−msgstr ""
217+msgstr "ይልቀቁ ለማነቃቃት…"
218218
219219#: qml/Dash/ScopesOverview.qml:206
220220msgid "Manage Scopes"
@@ -260,18 +260,10 @@ msgstr "አሁን ይናገሩ..."
260260msgid "Speaking..."
261261msgstr "በመናገር ላይ..."
262262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
264264msgid "Show password"
265265msgstr "የመግቢያ ቃል ማሳያ"
266266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:124
268−msgid "Enter SIM PIN"
269−msgstr "ሲም ፒን ያስገቡ"
270−
271−#: qml/Notifications/NotificationMenuItemFactory.qml:125
272−msgid "Sorry, incorrect PIN"
273−msgstr "አዝናለሁ የተሳሳተ ፒን"
274−
275267#: qml/Panel/ActiveCallHint.qml:77
276268msgid "Tap to return to call..."
277269msgstr "ወደ ጥሪው ለመመለስ መታ ያድርጉ..."
@@ -316,49 +308,49 @@ msgstr "ሲም መክፈቻ"
316308msgid "Roaming"
317309msgstr "ማዘዋወሪያ"
318310
319−#: qml/Shell.qml:340
311+#: qml/Shell.qml:346
320312msgid "Enter passphrase"
321313msgstr "የ ማለፊያ ሀረግ ያስገቡ"
322314
323−#: qml/Shell.qml:341
315+#: qml/Shell.qml:347
324316msgid "Sorry, incorrect passphrase"
325317msgstr "አዝናለሁ የተሳሳተ የማለፊያ ሐረግ"
326318
327−#: qml/Shell.qml:342
319+#: qml/Shell.qml:348
328320msgid "Please re-enter"
329321msgstr "እባክዎን እንደገና-ያስገቡ"
330322
331−#: qml/Shell.qml:344
323+#: qml/Shell.qml:350
332324msgid "Enter passcode"
333325msgstr "የ ማለፊያ ኮድ ያስገቡ"
334326
335−#: qml/Shell.qml:345
327+#: qml/Shell.qml:351
336328msgid "Sorry, incorrect passcode"
337329msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
338330
339−#: qml/Shell.qml:348
331+#: qml/Shell.qml:354
340332#, qt-format
341333msgid "Enter %1"
342334msgstr "ማስገቢያ %1"
343335
344−#: qml/Shell.qml:349
336+#: qml/Shell.qml:355
345337#, qt-format
346338msgid "Sorry, incorrect %1"
347339msgstr "አዝናለሁ: የተሳሳተ%1"
348340
349−#: qml/Shell.qml:384
341+#: qml/Shell.qml:390
350342msgid "Sorry, incorrect passphrase."
351343msgstr "አዝናለሁ የተሳሳተ የማለፊያ ሐረግ"
352344
353−#: qml/Shell.qml:385
345+#: qml/Shell.qml:391
354346msgid "Sorry, incorrect passcode."
355347msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
356348
357−#: qml/Shell.qml:386
349+#: qml/Shell.qml:392
358350msgid "This will be your last attempt."
359351msgstr "ይህ የመጨረሻ ሙከራዎ ነው"
360352
361−#: qml/Shell.qml:388
353+#: qml/Shell.qml:394
362354msgid ""
363355"If passphrase is entered incorrectly, your phone will conduct a factory "
364356"reset and all personal data will be deleted."
@@ -366,7 +358,7 @@ msgstr ""
366358"የተሳሳተ የማለፊያ ሐረግ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
367359"ይጠፋል"
368360
369−#: qml/Shell.qml:389
361+#: qml/Shell.qml:395
370362msgid ""
371363"If passcode is entered incorrectly, your phone will conduct a factory reset "
372364"and all personal data will be deleted."
@@ -374,28 +366,8 @@ msgstr ""
374366"የተሳሳተ የማለፊያ ኮድ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
375367"ይጠፋል"
376368
377−#, qt-format
378−#~ msgid "Hello %1"
379−#~ msgstr "ሰላም %1"
380−
381−#~ msgid "Hello"
382−#~ msgstr "ሰላም"
383−
384−#~ msgid "Swipe to unlock"
385−#~ msgstr "ለመክፈት ይጥረጉ"
386−
387−#~ msgid "Please wait"
388−#~ msgstr "እባክዎን ይቆዩ"
389−
390−#~ msgid "Too many incorrect attempts"
391−#~ msgstr "በርካታ የተሳሳቱ ሙከራዎች"
392−
393−#, qt-format
394−#~ msgid "Enter your %1"
395−#~ msgstr "ያስገቡ የ እርስዎን %1"
396−
397−#~ msgid "Enter your passphrase"
398−#~ msgstr "የማለፊያ ሐረግ ያስገቡ"
369+#~ msgid "Sorry, incorrect PIN"
370+#~ msgstr "አዝናለሁ የተሳሳተ ፒን"
399371
400−#~ msgid "Enter your passcode"
401−#~ msgstr "የ እርስዎን የማለፊያ ኮድ ያስገቡ"
372+#~ msgid "Enter SIM PIN"
373+#~ msgstr "ሲም ፒን ያስገቡ"
po/ar.po+20−38
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-05-22 08:22+0000\n"
1212"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
1313"Language-Team: Arabic <ar@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
1818"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -156,23 +156,23 @@ msgstr ""
156156"أنت الآن بارع في إيماءات الحواف ويمكنك البدء باستخدام هاتفك<br><br>انقر على "
157157"الشاشة للبدء"
158158
159−#: qml/Components/Lockscreen.qml:218
159+#: qml/Components/Lockscreen.qml:220
160160msgid "Emergency Call"
161161msgstr "مكالمة طوارئ"
162162
163−#: qml/Components/Lockscreen.qml:250
163+#: qml/Components/Lockscreen.qml:252
164164msgid "OK"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
167+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168168msgid "See less"
169169msgstr "شاهد أقل"
170170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:434
172172msgid "See all"
173173msgstr ""
174174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176176#: qml/Panel/SearchIndicator.qml:27
177177msgid "Search"
178178msgstr "ابحث"
@@ -261,18 +261,10 @@ msgstr "تكلم الآن..."
261261msgid "Speaking..."
262262msgstr "تتكلم الآن..."
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:108
264+#: qml/Notifications/NotificationMenuItemFactory.qml:116
265265msgid "Show password"
266266msgstr "عرض كلمة السر"
267267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:124
269−msgid "Enter SIM PIN"
270−msgstr ""
271−
272−#: qml/Notifications/NotificationMenuItemFactory.qml:125
273−msgid "Sorry, incorrect PIN"
274−msgstr ""
275−
276268#: qml/Panel/ActiveCallHint.qml:77
277269msgid "Tap to return to call..."
278270msgstr ""
@@ -317,66 +309,56 @@ msgstr ""
317309msgid "Roaming"
318310msgstr ""
319311
320−#: qml/Shell.qml:340
312+#: qml/Shell.qml:346
321313msgid "Enter passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:341
316+#: qml/Shell.qml:347
325317msgid "Sorry, incorrect passphrase"
326318msgstr ""
327319
328−#: qml/Shell.qml:342
320+#: qml/Shell.qml:348
329321msgid "Please re-enter"
330322msgstr ""
331323
332−#: qml/Shell.qml:344
324+#: qml/Shell.qml:350
333325msgid "Enter passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:345
328+#: qml/Shell.qml:351
337329msgid "Sorry, incorrect passcode"
338330msgstr ""
339331
340−#: qml/Shell.qml:348
332+#: qml/Shell.qml:354
341333#, qt-format
342334msgid "Enter %1"
343335msgstr ""
344336
345−#: qml/Shell.qml:349
337+#: qml/Shell.qml:355
346338#, qt-format
347339msgid "Sorry, incorrect %1"
348340msgstr ""
349341
350−#: qml/Shell.qml:384
342+#: qml/Shell.qml:390
351343msgid "Sorry, incorrect passphrase."
352344msgstr ""
353345
354−#: qml/Shell.qml:385
346+#: qml/Shell.qml:391
355347msgid "Sorry, incorrect passcode."
356348msgstr ""
357349
358−#: qml/Shell.qml:386
350+#: qml/Shell.qml:392
359351msgid "This will be your last attempt."
360352msgstr ""
361353
362−#: qml/Shell.qml:388
354+#: qml/Shell.qml:394
363355msgid ""
364356"If passphrase is entered incorrectly, your phone will conduct a factory "
365357"reset and all personal data will be deleted."
366358msgstr ""
367359
368−#: qml/Shell.qml:389
360+#: qml/Shell.qml:395
369361msgid ""
370362"If passcode is entered incorrectly, your phone will conduct a factory reset "
371363"and all personal data will be deleted."
372364msgstr ""
373−
374−#, qt-format
375−#~ msgid "Hello %1"
376−#~ msgstr "مرحبا %1"
377−
378−#~ msgid "Hello"
379−#~ msgstr "مرحبًا"
380−
381−#~ msgid "Swipe to unlock"
382−#~ msgstr "اسحب لفتح القفل"
po/ast.po+32−59
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-03 22:20+0000\n"
12−"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-09 09:49+0000\n"
12+"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
1313"Language-Team: Asturian <ast@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -37,11 +37,12 @@ msgstr "Preséu bloquiáu"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
40−msgstr ""
40+msgstr "Quedasti bloquiáu polos escesivos intentos fallíos de frase de pasu."
4141
4242#: qml/Components/DelayedLockscreen.qml:63
4343msgid "You have been locked out due to too many failed passcode attempts."
4444msgstr ""
45+"Quedasti bloquiáu polos escesivos intentos fallíos de códigu de pasu."
4546
4647#: qml/Components/DelayedLockscreen.qml:72
4748#, qt-format
@@ -158,23 +159,23 @@ msgstr ""
158159"Agora yá domines los xestos de los berbesos y pues entamar a usar el "
159160"teléfonu<br><br>Toca la pantalla pa comenzar"
160161
161−#: qml/Components/Lockscreen.qml:218
162+#: qml/Components/Lockscreen.qml:220
162163msgid "Emergency Call"
163164msgstr "Llamada d'emerxencia"
164165
165−#: qml/Components/Lockscreen.qml:250
166+#: qml/Components/Lockscreen.qml:252
166167msgid "OK"
167168msgstr "Aceutar"
168169
169−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
170+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
170171msgid "See less"
171172msgstr "Ver menos"
172173
173−#: qml/Dash/GenericScopeView.qml:411
174+#: qml/Dash/GenericScopeView.qml:434
174175msgid "See all"
175176msgstr "Ver too"
176177
177−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
178+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
178179#: qml/Panel/SearchIndicator.qml:27
179180msgid "Search"
180181msgstr "Guetar"
@@ -213,11 +214,11 @@ msgstr "Unviar"
213214
214215#: qml/Dash/PullToRefreshScopeStyle.qml:55
215216msgid "Pull to refresh…"
216−msgstr ""
217+msgstr "Tirar p'anovar..."
217218
218219#: qml/Dash/PullToRefreshScopeStyle.qml:60
219220msgid "Release to refresh…"
220−msgstr ""
221+msgstr "Soltar p'anovar..."
221222
222223#: qml/Dash/ScopesOverview.qml:206
223224msgid "Manage Scopes"
@@ -263,18 +264,10 @@ msgstr "Fala agora…"
263264msgid "Speaking..."
264265msgstr "Falando…"
265266
266−#: qml/Notifications/NotificationMenuItemFactory.qml:108
267+#: qml/Notifications/NotificationMenuItemFactory.qml:116
267268msgid "Show password"
268269msgstr "Amosar contraseña"
269270
270−#: qml/Notifications/NotificationMenuItemFactory.qml:124
271−msgid "Enter SIM PIN"
272−msgstr "Escribi'l PIN de la SIM"
273−
274−#: qml/Notifications/NotificationMenuItemFactory.qml:125
275−msgid "Sorry, incorrect PIN"
276−msgstr "PIN incorreutu"
277−
278271#: qml/Panel/ActiveCallHint.qml:77
279272msgid "Tap to return to call..."
280273msgstr "Tocar pa tornar a la llamada..."
@@ -319,49 +312,49 @@ msgstr "Desbloquiar SIM"
319312msgid "Roaming"
320313msgstr "Roaming"
321314
322−#: qml/Shell.qml:340
315+#: qml/Shell.qml:346
323316msgid "Enter passphrase"
324−msgstr ""
317+msgstr "Escribi la frase contraseña"
325318
326−#: qml/Shell.qml:341
319+#: qml/Shell.qml:347
327320msgid "Sorry, incorrect passphrase"
328321msgstr "Sentímoslo, contraseña incorreuta"
329322
330−#: qml/Shell.qml:342
323+#: qml/Shell.qml:348
331324msgid "Please re-enter"
332325msgstr "Vuelvi a escribila"
333326
334−#: qml/Shell.qml:344
327+#: qml/Shell.qml:350
335328msgid "Enter passcode"
336−msgstr ""
329+msgstr "Escribi'l códigu de pasu"
337330
338−#: qml/Shell.qml:345
331+#: qml/Shell.qml:351
339332msgid "Sorry, incorrect passcode"
340333msgstr "Sentímoslo, códigu de pasu incorreutu"
341334
342−#: qml/Shell.qml:348
335+#: qml/Shell.qml:354
343336#, qt-format
344337msgid "Enter %1"
345338msgstr "Escribi %1"
346339
347−#: qml/Shell.qml:349
340+#: qml/Shell.qml:355
348341#, qt-format
349342msgid "Sorry, incorrect %1"
350343msgstr "Sentímoslo, %1 incorreutu"
351344
352−#: qml/Shell.qml:384
345+#: qml/Shell.qml:390
353346msgid "Sorry, incorrect passphrase."
354347msgstr "Fras de pasu incorreuta"
355348
356−#: qml/Shell.qml:385
349+#: qml/Shell.qml:391
357350msgid "Sorry, incorrect passcode."
358351msgstr "Códigu de pasu incorreutu"
359352
360−#: qml/Shell.qml:386
353+#: qml/Shell.qml:392
361354msgid "This will be your last attempt."
362355msgstr "Esti ye'l caberu intentu."
363356
364−#: qml/Shell.qml:388
357+#: qml/Shell.qml:394
365358msgid ""
366359"If passphrase is entered incorrectly, your phone will conduct a factory "
367360"reset and all personal data will be deleted."
@@ -369,7 +362,7 @@ msgstr ""
369362"Si s'inxerta la fras incorreutamente, el teléfonu va volver a la "
370363"configuración de fábrica y van perdese tolos datos personales."
371364
372−#: qml/Shell.qml:389
365+#: qml/Shell.qml:395
373366msgid ""
374367"If passcode is entered incorrectly, your phone will conduct a factory reset "
375368"and all personal data will be deleted."
@@ -377,28 +370,8 @@ msgstr ""
377370"Si s'inxerta'l códigu incorreutamente, el teléfonu va volver a la "
378371"configuración de fábrica y van perdese tolos datos personales."
379372
380−#~ msgid "Hello"
381−#~ msgstr "Hola"
382−
383−#, qt-format
384−#~ msgid "Hello %1"
385−#~ msgstr "Hola %1"
386−
387−#~ msgid "Swipe to unlock"
388−#~ msgstr "Esliza pa desbloquiar"
389−
390−#~ msgid "Please wait"
391−#~ msgstr "Espera un segundu"
392−
393−#, qt-format
394−#~ msgid "Enter your %1"
395−#~ msgstr "Introduz %1"
396−
397−#~ msgid "Enter your passphrase"
398−#~ msgstr "Introduz contraseña"
399−
400−#~ msgid "Enter your passcode"
401−#~ msgstr "Introduz códigu de pasu"
373+#~ msgid "Sorry, incorrect PIN"
374+#~ msgstr "PIN incorreutu"
402375
403−#~ msgid "Too many incorrect attempts"
404−#~ msgstr "Munchos intentos incorreutos"
376+#~ msgid "Enter SIM PIN"
377+#~ msgstr "Escribi'l PIN de la SIM"
po/az.po+24−49
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-09-03 16:39+0000\n"
1212"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
1313"Language-Team: Azerbaijani <az@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -155,23 +155,23 @@ msgstr ""
155155"Siz künc hәrәkәtlәrini öyrәndiniz və telefonu istifadə etməyə başlaya "
156156"bilərsiniz.<br><br>Başlamaq üçün ekrana toxunun"
157157
158−#: qml/Components/Lockscreen.qml:218
158+#: qml/Components/Lockscreen.qml:220
159159msgid "Emergency Call"
160160msgstr "Zərurət zəngi"
161161
162−#: qml/Components/Lockscreen.qml:250
162+#: qml/Components/Lockscreen.qml:252
163163msgid "OK"
164164msgstr "Oldu"
165165
166−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
167167msgid "See less"
168168msgstr "Daha azını gör"
169169
170−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
171171msgid "See all"
172172msgstr "Hamısını gör"
173173
174−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
175175#: qml/Panel/SearchIndicator.qml:27
176176msgid "Search"
177177msgstr "Axtar"
@@ -260,18 +260,10 @@ msgstr "Danışın..."
260260msgid "Speaking..."
261261msgstr "Danışır..."
262262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
264264msgid "Show password"
265265msgstr "Şifrәni göstәr"
266266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:124
268−msgid "Enter SIM PIN"
269−msgstr "SIM PIN kodunuzu daxil edin"
270−
271−#: qml/Notifications/NotificationMenuItemFactory.qml:125
272−msgid "Sorry, incorrect PIN"
273−msgstr "Bağışlayın, PIN yanlışdır"
274−
275267#: qml/Panel/ActiveCallHint.qml:77
276268msgid "Tap to return to call..."
277269msgstr "Zəngə qayıtmaq üçün toxunun..."
@@ -316,49 +308,49 @@ msgstr "SIM kilidini aç"
316308msgid "Roaming"
317309msgstr "Rominq"
318310
319−#: qml/Shell.qml:340
311+#: qml/Shell.qml:346
320312msgid "Enter passphrase"
321313msgstr ""
322314
323−#: qml/Shell.qml:341
315+#: qml/Shell.qml:347
324316msgid "Sorry, incorrect passphrase"
325317msgstr "Bağışlayın, açar söz yanlışdır"
326318
327−#: qml/Shell.qml:342
319+#: qml/Shell.qml:348
328320msgid "Please re-enter"
329321msgstr ""
330322
331−#: qml/Shell.qml:344
323+#: qml/Shell.qml:350
332324msgid "Enter passcode"
333325msgstr ""
334326
335−#: qml/Shell.qml:345
327+#: qml/Shell.qml:351
336328msgid "Sorry, incorrect passcode"
337329msgstr ""
338330
339−#: qml/Shell.qml:348
331+#: qml/Shell.qml:354
340332#, qt-format
341333msgid "Enter %1"
342334msgstr ""
343335
344−#: qml/Shell.qml:349
336+#: qml/Shell.qml:355
345337#, qt-format
346338msgid "Sorry, incorrect %1"
347339msgstr "Bağışlayın, %1 yanlışdır"
348340
349−#: qml/Shell.qml:384
341+#: qml/Shell.qml:390
350342msgid "Sorry, incorrect passphrase."
351343msgstr "Bağışlayın, açar söz yanlışdır."
352344
353−#: qml/Shell.qml:385
345+#: qml/Shell.qml:391
354346msgid "Sorry, incorrect passcode."
355347msgstr "Təəssüf ki, açar kod yanlışdır."
356348
357−#: qml/Shell.qml:386
349+#: qml/Shell.qml:392
358350msgid "This will be your last attempt."
359351msgstr "Bu sizin son cəhdiniz olacaq."
360352
361−#: qml/Shell.qml:388
353+#: qml/Shell.qml:394
362354msgid ""
363355"If passphrase is entered incorrectly, your phone will conduct a factory "
364356"reset and all personal data will be deleted."
@@ -366,7 +358,7 @@ msgstr ""
366358"Əgər açar söz yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
367359"geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
368360
369−#: qml/Shell.qml:389
361+#: qml/Shell.qml:395
370362msgid ""
371363"If passcode is entered incorrectly, your phone will conduct a factory reset "
372364"and all personal data will be deleted."
@@ -374,25 +366,8 @@ msgstr ""
374366"Əgər açar kod yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
375367"geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
376368
377−#~ msgid "Swipe to unlock"
378−#~ msgstr "Kilidi açmaq üçün sürüşdürün"
379−
380−#, qt-format
381−#~ msgid "Enter your %1"
382−#~ msgstr "%1 daxil edin"
383−
384−#~ msgid "Enter your passphrase"
385−#~ msgstr "Açar sözünüzü daxil edin"
386−
387−#~ msgid "Please wait"
388−#~ msgstr "Xahiş edirik gözləyin"
389−
390−#~ msgid "Too many incorrect attempts"
391−#~ msgstr "Çoxlu yanlış cəhdlәr"
392−
393−#, qt-format
394−#~ msgid "Hello %1"
395−#~ msgstr "Salam %1"
369+#~ msgid "Enter SIM PIN"
370+#~ msgstr "SIM PIN kodunuzu daxil edin"
396371
397−#~ msgid "Hello"
398−#~ msgstr "Salam"
372+#~ msgid "Sorry, incorrect PIN"
373+#~ msgstr "Bağışlayın, PIN yanlışdır"
po/be.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-09-24 17:12+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Belarusian <be@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -153,23 +153,23 @@ msgid ""
153153"phone<br><br>Tap on the screen to start"
154154msgstr ""
155155
156−#: qml/Components/Lockscreen.qml:218
156+#: qml/Components/Lockscreen.qml:220
157157msgid "Emergency Call"
158158msgstr ""
159159
160−#: qml/Components/Lockscreen.qml:250
160+#: qml/Components/Lockscreen.qml:252
161161msgid "OK"
162162msgstr ""
163163
164−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
164+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
165165msgid "See less"
166166msgstr ""
167167
168−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:434
169169msgid "See all"
170170msgstr ""
171171
172−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
173173#: qml/Panel/SearchIndicator.qml:27
174174msgid "Search"
175175msgstr ""
@@ -258,18 +258,10 @@ msgstr ""
258258msgid "Speaking..."
259259msgstr ""
260260
261−#: qml/Notifications/NotificationMenuItemFactory.qml:108
261+#: qml/Notifications/NotificationMenuItemFactory.qml:116
262262msgid "Show password"
263263msgstr ""
264264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:124
266−msgid "Enter SIM PIN"
267−msgstr ""
268−
269−#: qml/Notifications/NotificationMenuItemFactory.qml:125
270−msgid "Sorry, incorrect PIN"
271−msgstr ""
272−
273265#: qml/Panel/ActiveCallHint.qml:77
274266msgid "Tap to return to call..."
275267msgstr ""
@@ -314,55 +306,55 @@ msgstr ""
314306msgid "Roaming"
315307msgstr ""
316308
317−#: qml/Shell.qml:340
309+#: qml/Shell.qml:346
318310msgid "Enter passphrase"
319311msgstr ""
320312
321−#: qml/Shell.qml:341
313+#: qml/Shell.qml:347
322314msgid "Sorry, incorrect passphrase"
323315msgstr ""
324316
325−#: qml/Shell.qml:342
317+#: qml/Shell.qml:348
326318msgid "Please re-enter"
327319msgstr ""
328320
329−#: qml/Shell.qml:344
321+#: qml/Shell.qml:350
330322msgid "Enter passcode"
331323msgstr ""
332324
333−#: qml/Shell.qml:345
325+#: qml/Shell.qml:351
334326msgid "Sorry, incorrect passcode"
335327msgstr ""
336328
337−#: qml/Shell.qml:348
329+#: qml/Shell.qml:354
338330#, qt-format
339331msgid "Enter %1"
340332msgstr ""
341333
342−#: qml/Shell.qml:349
334+#: qml/Shell.qml:355
343335#, qt-format
344336msgid "Sorry, incorrect %1"
345337msgstr ""
346338
347−#: qml/Shell.qml:384
339+#: qml/Shell.qml:390
348340msgid "Sorry, incorrect passphrase."
349341msgstr ""
350342
351−#: qml/Shell.qml:385
343+#: qml/Shell.qml:391
352344msgid "Sorry, incorrect passcode."
353345msgstr ""
354346
355−#: qml/Shell.qml:386
347+#: qml/Shell.qml:392
356348msgid "This will be your last attempt."
357349msgstr ""
358350
359−#: qml/Shell.qml:388
351+#: qml/Shell.qml:394
360352msgid ""
361353"If passphrase is entered incorrectly, your phone will conduct a factory "
362354"reset and all personal data will be deleted."
363355msgstr ""
364356
365−#: qml/Shell.qml:389
357+#: qml/Shell.qml:395
366358msgid ""
367359"If passcode is entered incorrectly, your phone will conduct a factory reset "
368360"and all personal data will be deleted."
po/bg.po+20−35
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-04-01 14:08+0000\n"
1212"Last-Translator: Atanas Kovachki <Unknown>\n"
1313"Language-Team: Bulgarian <bg@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -159,23 +159,23 @@ msgid ""
159159"phone<br><br>Tap on the screen to start"
160160msgstr ""
161161
162−#: qml/Components/Lockscreen.qml:218
162+#: qml/Components/Lockscreen.qml:220
163163msgid "Emergency Call"
164164msgstr "Спешно повикване"
165165
166−#: qml/Components/Lockscreen.qml:250
166+#: qml/Components/Lockscreen.qml:252
167167msgid "OK"
168168msgstr ""
169169
170−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
170+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
171171msgid "See less"
172172msgstr ""
173173
174−#: qml/Dash/GenericScopeView.qml:411
174+#: qml/Dash/GenericScopeView.qml:434
175175msgid "See all"
176176msgstr ""
177177
178−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
178+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
179179#: qml/Panel/SearchIndicator.qml:27
180180msgid "Search"
181181msgstr "Търсене"
@@ -264,18 +264,10 @@ msgstr "Говорете сега..."
264264msgid "Speaking..."
265265msgstr "Говорете..."
266266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:108
267+#: qml/Notifications/NotificationMenuItemFactory.qml:116
268268msgid "Show password"
269269msgstr "Покажи паролата"
270270
271−#: qml/Notifications/NotificationMenuItemFactory.qml:124
272−msgid "Enter SIM PIN"
273−msgstr ""
274−
275−#: qml/Notifications/NotificationMenuItemFactory.qml:125
276−msgid "Sorry, incorrect PIN"
277−msgstr ""
278−
279271#: qml/Panel/ActiveCallHint.qml:77
280272msgid "Tap to return to call..."
281273msgstr ""
@@ -320,63 +312,56 @@ msgstr ""
320312msgid "Roaming"
321313msgstr ""
322314
323−#: qml/Shell.qml:340
315+#: qml/Shell.qml:346
324316msgid "Enter passphrase"
325317msgstr ""
326318
327−#: qml/Shell.qml:341
319+#: qml/Shell.qml:347
328320msgid "Sorry, incorrect passphrase"
329321msgstr ""
330322
331−#: qml/Shell.qml:342
323+#: qml/Shell.qml:348
332324msgid "Please re-enter"
333325msgstr ""
334326
335−#: qml/Shell.qml:344
327+#: qml/Shell.qml:350
336328msgid "Enter passcode"
337329msgstr ""
338330
339−#: qml/Shell.qml:345
331+#: qml/Shell.qml:351
340332msgid "Sorry, incorrect passcode"
341333msgstr ""
342334
343−#: qml/Shell.qml:348
335+#: qml/Shell.qml:354
344336#, qt-format
345337msgid "Enter %1"
346338msgstr ""
347339
348−#: qml/Shell.qml:349
340+#: qml/Shell.qml:355
349341#, qt-format
350342msgid "Sorry, incorrect %1"
351343msgstr ""
352344
353−#: qml/Shell.qml:384
345+#: qml/Shell.qml:390
354346msgid "Sorry, incorrect passphrase."
355347msgstr ""
356348
357−#: qml/Shell.qml:385
349+#: qml/Shell.qml:391
358350msgid "Sorry, incorrect passcode."
359351msgstr ""
360352
361−#: qml/Shell.qml:386
353+#: qml/Shell.qml:392
362354msgid "This will be your last attempt."
363355msgstr ""
364356
365−#: qml/Shell.qml:388
357+#: qml/Shell.qml:394
366358msgid ""
367359"If passphrase is entered incorrectly, your phone will conduct a factory "
368360"reset and all personal data will be deleted."
369361msgstr ""
370362
371−#: qml/Shell.qml:389
363+#: qml/Shell.qml:395
372364msgid ""
373365"If passcode is entered incorrectly, your phone will conduct a factory reset "
374366"and all personal data will be deleted."
375367msgstr ""
376−
377−#~ msgid "Hello"
378−#~ msgstr "Здравей"
379−
380−#, qt-format
381−#~ msgid "Hello %1"
382−#~ msgstr "Здравей, %1"
po/br.po+27−55
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-03 06:52+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-07 07:03+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"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -165,23 +165,23 @@ msgstr ""
165165"Mestroniañ a rit ar jestroù ha gallout a rit kregiñ da implijout ar "
166166"pellgomzer<br><br>Touchit d'ar skramm evit kregiñ ganti"
167167
168−#: qml/Components/Lockscreen.qml:218
168+#: qml/Components/Lockscreen.qml:220
169169msgid "Emergency Call"
170170msgstr "Pellgomzadenn vallus"
171171
172−#: qml/Components/Lockscreen.qml:250
172+#: qml/Components/Lockscreen.qml:252
173173msgid "OK"
174174msgstr "Mat eo"
175175
176−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
176+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
177177msgid "See less"
178178msgstr "Gwelet nebeutoc'h"
179179
180−#: qml/Dash/GenericScopeView.qml:411
180+#: qml/Dash/GenericScopeView.qml:434
181181msgid "See all"
182182msgstr "Gwelet pep tra"
183183
184−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
184+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
185185#: qml/Panel/SearchIndicator.qml:27
186186msgid "Search"
187187msgstr "Klask"
@@ -220,11 +220,11 @@ msgstr "Kas"
220220
221221#: qml/Dash/PullToRefreshScopeStyle.qml:55
222222msgid "Pull to refresh…"
223−msgstr ""
223+msgstr "Tennañ evit freskaat..."
224224
225225#: qml/Dash/PullToRefreshScopeStyle.qml:60
226226msgid "Release to refresh…"
227−msgstr ""
227+msgstr "Lezel da vont evit freskaat..."
228228
229229#: qml/Dash/ScopesOverview.qml:206
230230msgid "Manage Scopes"
@@ -270,18 +270,10 @@ msgstr "Komzit bremañ..."
270270msgid "Speaking..."
271271msgstr "O komz..."
272272
273−#: qml/Notifications/NotificationMenuItemFactory.qml:108
273+#: qml/Notifications/NotificationMenuItemFactory.qml:116
274274msgid "Show password"
275275msgstr "Diskouez ar ger-tremen"
276276
277−#: qml/Notifications/NotificationMenuItemFactory.qml:124
278−msgid "Enter SIM PIN"
279−msgstr "Ebarzhit kod PIN ar gartenn SIM"
280−
281−#: qml/Notifications/NotificationMenuItemFactory.qml:125
282−msgid "Sorry, incorrect PIN"
283−msgstr "Siwazh, kod PIN direizh"
284−
285277#: qml/Panel/ActiveCallHint.qml:77
286278msgid "Tap to return to call..."
287279msgstr "Touchit evit distreiñ d'ar bellgomzadenn..."
@@ -326,49 +318,49 @@ msgstr "Dibrennañ ar gartenn SIM"
326318msgid "Roaming"
327319msgstr "O kantren"
328320
329−#: qml/Shell.qml:340
321+#: qml/Shell.qml:346
330322msgid "Enter passphrase"
331323msgstr "Merkañ ar frazenn-dremen"
332324
333−#: qml/Shell.qml:341
325+#: qml/Shell.qml:347
334326msgid "Sorry, incorrect passphrase"
335327msgstr "Siwazh, frazenn-dremen direizh"
336328
337−#: qml/Shell.qml:342
329+#: qml/Shell.qml:348
338330msgid "Please re-enter"
339331msgstr "Adverkañ, mar plij"
340332
341−#: qml/Shell.qml:344
333+#: qml/Shell.qml:350
342334msgid "Enter passcode"
343335msgstr "Merkañ ar c'hod-tremen"
344336
345−#: qml/Shell.qml:345
337+#: qml/Shell.qml:351
346338msgid "Sorry, incorrect passcode"
347339msgstr "Digarezit, kod-tremen direizh"
348340
349−#: qml/Shell.qml:348
341+#: qml/Shell.qml:354
350342#, qt-format
351343msgid "Enter %1"
352344msgstr "Merkañ %1"
353345
354−#: qml/Shell.qml:349
346+#: qml/Shell.qml:355
355347#, qt-format
356348msgid "Sorry, incorrect %1"
357349msgstr "Siwazh, %1 direizh"
358350
359−#: qml/Shell.qml:384
351+#: qml/Shell.qml:390
360352msgid "Sorry, incorrect passphrase."
361353msgstr "Siwazh, frazenn-dremen direizh"
362354
363−#: qml/Shell.qml:385
355+#: qml/Shell.qml:391
364356msgid "Sorry, incorrect passcode."
365357msgstr "Siwazh, kod-tremen direizh"
366358
367−#: qml/Shell.qml:386
359+#: qml/Shell.qml:392
368360msgid "This will be your last attempt."
369361msgstr "Ho taol-esae diwezhañ e vo."
370362
371−#: qml/Shell.qml:388
363+#: qml/Shell.qml:394
372364msgid ""
373365"If passphrase is entered incorrectly, your phone will conduct a factory "
374366"reset and all personal data will be deleted."
@@ -376,7 +368,7 @@ msgstr ""
376368"Ma vez ebarzhet ur frazenn-dremen direizh, e vo adderaouekaet ho pellgomzer "
377369"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel"
378370
379−#: qml/Shell.qml:389
371+#: qml/Shell.qml:395
380372msgid ""
381373"If passcode is entered incorrectly, your phone will conduct a factory reset "
382374"and all personal data will be deleted."
@@ -384,28 +376,8 @@ msgstr ""
384376"Ma vez ebarzhet ur c'hod-tremen direizh, e vo adderaouekaet ho pellgomzer "
385377"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel."
386378
387−#~ msgid "Hello"
388−#~ msgstr "Demat"
389−
390−#, qt-format
391−#~ msgid "Hello %1"
392−#~ msgstr "Demat %1"
393−
394−#~ msgid "Swipe to unlock"
395−#~ msgstr "Riklañ evit dibrennañ"
396−
397−#~ msgid "Please wait"
398−#~ msgstr "Gortozit, mar plij"
399−
400−#~ msgid "Too many incorrect attempts"
401−#~ msgstr "Re a daolioù-esae direizh"
402−
403−#~ msgid "Enter your passphrase"
404−#~ msgstr "Ebarzhit ho frazenn-dremen"
405−
406−#, qt-format
407−#~ msgid "Enter your %1"
408−#~ msgstr "Ebarzhit ho %1"
379+#~ msgid "Sorry, incorrect PIN"
380+#~ msgstr "Siwazh, kod PIN direizh"
409381
410−#~ msgid "Enter your passcode"
411−#~ msgstr "Ebarzhit ho kod-tremen"
382+#~ msgid "Enter SIM PIN"
383+#~ msgstr "Ebarzhit kod PIN ar gartenn SIM"
po/bs.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-01-16 22:33+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Bosnian <bs@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -153,23 +153,23 @@ msgid ""
153153"phone<br><br>Tap on the screen to start"
154154msgstr ""
155155
156−#: qml/Components/Lockscreen.qml:218
156+#: qml/Components/Lockscreen.qml:220
157157msgid "Emergency Call"
158158msgstr ""
159159
160−#: qml/Components/Lockscreen.qml:250
160+#: qml/Components/Lockscreen.qml:252
161161msgid "OK"
162162msgstr ""
163163
164−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
164+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
165165msgid "See less"
166166msgstr ""
167167
168−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:434
169169msgid "See all"
170170msgstr ""
171171
172−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
173173#: qml/Panel/SearchIndicator.qml:27
174174msgid "Search"
175175msgstr ""
@@ -258,18 +258,10 @@ msgstr ""
258258msgid "Speaking..."
259259msgstr ""
260260
261−#: qml/Notifications/NotificationMenuItemFactory.qml:108
261+#: qml/Notifications/NotificationMenuItemFactory.qml:116
262262msgid "Show password"
263263msgstr ""
264264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:124
266−msgid "Enter SIM PIN"
267−msgstr ""
268−
269−#: qml/Notifications/NotificationMenuItemFactory.qml:125
270−msgid "Sorry, incorrect PIN"
271−msgstr ""
272−
273265#: qml/Panel/ActiveCallHint.qml:77
274266msgid "Tap to return to call..."
275267msgstr ""
@@ -314,55 +306,55 @@ msgstr ""
314306msgid "Roaming"
315307msgstr ""
316308
317−#: qml/Shell.qml:340
309+#: qml/Shell.qml:346
318310msgid "Enter passphrase"
319311msgstr ""
320312
321−#: qml/Shell.qml:341
313+#: qml/Shell.qml:347
322314msgid "Sorry, incorrect passphrase"
323315msgstr ""
324316
325−#: qml/Shell.qml:342
317+#: qml/Shell.qml:348
326318msgid "Please re-enter"
327319msgstr ""
328320
329−#: qml/Shell.qml:344
321+#: qml/Shell.qml:350
330322msgid "Enter passcode"
331323msgstr ""
332324
333−#: qml/Shell.qml:345
325+#: qml/Shell.qml:351
334326msgid "Sorry, incorrect passcode"
335327msgstr ""
336328
337−#: qml/Shell.qml:348
329+#: qml/Shell.qml:354
338330#, qt-format
339331msgid "Enter %1"
340332msgstr ""
341333
342−#: qml/Shell.qml:349
334+#: qml/Shell.qml:355
343335#, qt-format
344336msgid "Sorry, incorrect %1"
345337msgstr ""
346338
347−#: qml/Shell.qml:384
339+#: qml/Shell.qml:390
348340msgid "Sorry, incorrect passphrase."
349341msgstr ""
350342
351−#: qml/Shell.qml:385
343+#: qml/Shell.qml:391
352344msgid "Sorry, incorrect passcode."
353345msgstr ""
354346
355−#: qml/Shell.qml:386
347+#: qml/Shell.qml:392
356348msgid "This will be your last attempt."
357349msgstr ""
358350
359−#: qml/Shell.qml:388
351+#: qml/Shell.qml:394
360352msgid ""
361353"If passphrase is entered incorrectly, your phone will conduct a factory "
362354"reset and all personal data will be deleted."
363355msgstr ""
364356
365−#: qml/Shell.qml:389
357+#: qml/Shell.qml:395
366358msgid ""
367359"If passcode is entered incorrectly, your phone will conduct a factory reset "
368360"and all personal data will be deleted."
po/ca.po+27−55
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-06 12:16+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-07 10:51+0000\n"
1212"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -166,23 +166,23 @@ msgstr ""
166166"Ja heu après com utilitzar els gestos de les vores per fer servir el "
167167"telèfon<br><br>Feu un toc a la pantalla per començar"
168168
169−#: qml/Components/Lockscreen.qml:218
169+#: qml/Components/Lockscreen.qml:220
170170msgid "Emergency Call"
171171msgstr "Trucada d'emergència"
172172
173−#: qml/Components/Lockscreen.qml:250
173+#: qml/Components/Lockscreen.qml:252
174174msgid "OK"
175175msgstr "D'acord"
176176
177−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
177+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
178178msgid "See less"
179179msgstr "Mostra'n menys"
180180
181−#: qml/Dash/GenericScopeView.qml:411
181+#: qml/Dash/GenericScopeView.qml:434
182182msgid "See all"
183183msgstr "Mostra-ho tot"
184184
185−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
185+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
186186#: qml/Panel/SearchIndicator.qml:27
187187msgid "Search"
188188msgstr "Cerca"
@@ -221,11 +221,11 @@ msgstr "Envia"
221221
222222#: qml/Dash/PullToRefreshScopeStyle.qml:55
223223msgid "Pull to refresh…"
224−msgstr ""
224+msgstr "Estireu per actualitzar..."
225225
226226#: qml/Dash/PullToRefreshScopeStyle.qml:60
227227msgid "Release to refresh…"
228−msgstr ""
228+msgstr "Deixeu anar per actualitzar..."
229229
230230#: qml/Dash/ScopesOverview.qml:206
231231msgid "Manage Scopes"
@@ -271,18 +271,10 @@ msgstr "Parleu..."
271271msgid "Speaking..."
272272msgstr "S'està parlant..."
273273
274−#: qml/Notifications/NotificationMenuItemFactory.qml:108
274+#: qml/Notifications/NotificationMenuItemFactory.qml:116
275275msgid "Show password"
276276msgstr "Mostra la contrasenya"
277277
278−#: qml/Notifications/NotificationMenuItemFactory.qml:124
279−msgid "Enter SIM PIN"
280−msgstr "Introduïu el PIN de la targeta SIM"
281−
282−#: qml/Notifications/NotificationMenuItemFactory.qml:125
283−msgid "Sorry, incorrect PIN"
284−msgstr "El PIN no és correcte"
285−
286278#: qml/Panel/ActiveCallHint.qml:77
287279msgid "Tap to return to call..."
288280msgstr "Feu un toc per tornar a la trucada..."
@@ -327,49 +319,49 @@ msgstr "Desbloca la SIM"
327319msgid "Roaming"
328320msgstr "Itinerància"
329321
330−#: qml/Shell.qml:340
322+#: qml/Shell.qml:346
331323msgid "Enter passphrase"
332324msgstr "Introduïu la contrasenya"
333325
334−#: qml/Shell.qml:341
326+#: qml/Shell.qml:347
335327msgid "Sorry, incorrect passphrase"
336328msgstr "La contrasenya no és correcta"
337329
338−#: qml/Shell.qml:342
330+#: qml/Shell.qml:348
339331msgid "Please re-enter"
340332msgstr "Torneu-ho a introduir"
341333
342−#: qml/Shell.qml:344
334+#: qml/Shell.qml:350
343335msgid "Enter passcode"
344336msgstr "Introduïu el codi d'accés"
345337
346−#: qml/Shell.qml:345
338+#: qml/Shell.qml:351
347339msgid "Sorry, incorrect passcode"
348340msgstr "El codi d'accés no és correcte"
349341
350−#: qml/Shell.qml:348
342+#: qml/Shell.qml:354
351343#, qt-format
352344msgid "Enter %1"
353345msgstr "Introduïu: %1"
354346
355−#: qml/Shell.qml:349
347+#: qml/Shell.qml:355
356348#, qt-format
357349msgid "Sorry, incorrect %1"
358350msgstr "Incorrecte (%1)"
359351
360−#: qml/Shell.qml:384
352+#: qml/Shell.qml:390
361353msgid "Sorry, incorrect passphrase."
362354msgstr "La contrasenya és incorrecta"
363355
364−#: qml/Shell.qml:385
356+#: qml/Shell.qml:391
365357msgid "Sorry, incorrect passcode."
366358msgstr "El codi d'accés no és correcte"
367359
368−#: qml/Shell.qml:386
360+#: qml/Shell.qml:392
369361msgid "This will be your last attempt."
370362msgstr "Aquest serà el darrer intent."
371363
372−#: qml/Shell.qml:388
364+#: qml/Shell.qml:394
373365msgid ""
374366"If passphrase is entered incorrectly, your phone will conduct a factory "
375367"reset and all personal data will be deleted."
@@ -378,7 +370,7 @@ msgstr ""
378370"reinicialitzarà a l'estat de fàbrica i se suprimiran totes les dades "
379371"personals."
380372
381−#: qml/Shell.qml:389
373+#: qml/Shell.qml:395
382374msgid ""
383375"If passcode is entered incorrectly, your phone will conduct a factory reset "
384376"and all personal data will be deleted."
@@ -387,28 +379,8 @@ msgstr ""
387379"reinicialitzarà a l'estat de fàbrica i se suprimiran totes les dades "
388380"personals."
389381
390−#~ msgid "Hello"
391−#~ msgstr "Hola"
392−
393−#, qt-format
394−#~ msgid "Hello %1"
395−#~ msgstr "Hola %1"
396−
397−#~ msgid "Swipe to unlock"
398−#~ msgstr "Feu lliscar el dit per desbloquejar"
399−
400−#~ msgid "Please wait"
401−#~ msgstr "Espereu"
402−
403−#~ msgid "Too many incorrect attempts"
404−#~ msgstr "Massa intents incorrectes"
405−
406−#, qt-format
407−#~ msgid "Enter your %1"
408−#~ msgstr "Introduïu la %1"
409−
410−#~ msgid "Enter your passphrase"
411−#~ msgstr "Escriviu la contrasenya"
382+#~ msgid "Sorry, incorrect PIN"
383+#~ msgstr "El PIN no és correcte"
412384
413−#~ msgid "Enter your passcode"
414−#~ msgstr "Introduïu el codi d'accés"
385+#~ msgid "Enter SIM PIN"
386+#~ msgstr "Introduïu el PIN de la targeta SIM"
po/ckb.po+20−35
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-01-21 11:05+0000\n"
1212"Last-Translator: Aras <aras.noori@gmail.com>\n"
1313"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr "هێڵی فریاگوزاری"
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "گەڕان"
@@ -257,18 +257,10 @@ msgstr "ئێستا قسە بکە"
257257msgid "Speaking..."
258258msgstr "قسە دەکات..."
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr "تێپەڕەوشە پیشان بدە"
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,63 +305,56 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
368360msgstr ""
369−
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "سڵاو %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "سڵاو"
po/cs.po+20−35
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-01-08 10:11+0000\n"
1212"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
1313"Language-Team: Czech <cs@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr "Tísňové volání"
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "Hledat"
@@ -257,18 +257,10 @@ msgstr "Mluvte..."
257257msgid "Speaking..."
258258msgstr "Mluvte..."
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr "Zobrazit heslo"
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,63 +305,56 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
368360msgstr ""
369−
370−#~ msgid "Hello"
371−#~ msgstr "Ahoj"
372−
373−#, qt-format
374−#~ msgid "Hello %1"
375−#~ msgstr "Ahoj %1"
po/da.po+20−38
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1212"PO-Revision-Date: 2014-07-30 12:37+0000\n"
1313"Last-Translator: Ask Hjorth Larsen <asklarsen@gmail.com>\n"
1414"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Type: text/plain; charset=UTF-8\n"
1717"Content-Transfer-Encoding: 8bit\n"
1818"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -155,23 +155,23 @@ msgstr ""
155155"Du mestrer nu kantbevægelserne og kan begynde at bruge telefonen<br><br>Tryk "
156156"på skærmen for at starte"
157157
158−#: qml/Components/Lockscreen.qml:218
158+#: qml/Components/Lockscreen.qml:220
159159msgid "Emergency Call"
160160msgstr "Nødopkald"
161161
162−#: qml/Components/Lockscreen.qml:250
162+#: qml/Components/Lockscreen.qml:252
163163msgid "OK"
164164msgstr "O.k."
165165
166−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
167167msgid "See less"
168168msgstr "Vis mindre"
169169
170−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
171171msgid "See all"
172172msgstr "Se alle"
173173
174−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
175175#: qml/Panel/SearchIndicator.qml:27
176176msgid "Search"
177177msgstr "Søg"
@@ -260,18 +260,10 @@ msgstr "Tal nu..."
260260msgid "Speaking..."
261261msgstr "Taler..."
262262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
264264msgid "Show password"
265265msgstr "Vis adgangskode"
266266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:124
268−msgid "Enter SIM PIN"
269−msgstr ""
270−
271−#: qml/Notifications/NotificationMenuItemFactory.qml:125
272−msgid "Sorry, incorrect PIN"
273−msgstr ""
274−
275267#: qml/Panel/ActiveCallHint.qml:77
276268msgid "Tap to return to call..."
277269msgstr "Tryk for at besvare opkaldet..."
@@ -316,66 +308,56 @@ msgstr ""
316308msgid "Roaming"
317309msgstr ""
318310
319−#: qml/Shell.qml:340
311+#: qml/Shell.qml:346
320312msgid "Enter passphrase"
321313msgstr ""
322314
323−#: qml/Shell.qml:341
315+#: qml/Shell.qml:347
324316msgid "Sorry, incorrect passphrase"
325317msgstr ""
326318
327−#: qml/Shell.qml:342
319+#: qml/Shell.qml:348
328320msgid "Please re-enter"
329321msgstr ""
330322
331−#: qml/Shell.qml:344
323+#: qml/Shell.qml:350
332324msgid "Enter passcode"
333325msgstr ""
334326
335−#: qml/Shell.qml:345
327+#: qml/Shell.qml:351
336328msgid "Sorry, incorrect passcode"
337329msgstr ""
338330
339−#: qml/Shell.qml:348
331+#: qml/Shell.qml:354
340332#, qt-format
341333msgid "Enter %1"
342334msgstr ""
343335
344−#: qml/Shell.qml:349
336+#: qml/Shell.qml:355
345337#, qt-format
346338msgid "Sorry, incorrect %1"
347339msgstr ""
348340
349−#: qml/Shell.qml:384
341+#: qml/Shell.qml:390
350342msgid "Sorry, incorrect passphrase."
351343msgstr ""
352344
353−#: qml/Shell.qml:385
345+#: qml/Shell.qml:391
354346msgid "Sorry, incorrect passcode."
355347msgstr ""
356348
357−#: qml/Shell.qml:386
349+#: qml/Shell.qml:392
358350msgid "This will be your last attempt."
359351msgstr ""
360352
361−#: qml/Shell.qml:388
353+#: qml/Shell.qml:394
362354msgid ""
363355"If passphrase is entered incorrectly, your phone will conduct a factory "
364356"reset and all personal data will be deleted."
365357msgstr ""
366358
367−#: qml/Shell.qml:389
359+#: qml/Shell.qml:395
368360msgid ""
369361"If passcode is entered incorrectly, your phone will conduct a factory reset "
370362"and all personal data will be deleted."
371363msgstr ""
372−
373−#, qt-format
374−#~ msgid "Hello %1"
375−#~ msgstr "Hej %1"
376−
377−#~ msgid "Hello"
378−#~ msgstr "Hej"
379−
380−#~ msgid "Swipe to unlock"
381−#~ msgstr "Stryg for at låse op"
po/de.po+24−52
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-09-29 06:33+0000\n"
1212"Last-Translator: Niklas Wenzel <nikwen.developer@gmail.com>\n"
1313"Language-Team: German <de@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -159,23 +159,23 @@ msgstr ""
159159"Sie haben nun die Kantengesten erfolgreich erlernt und können das Telefon "
160160"nun nutzen<br><br>Zum Starten auf den Bildschirm tippen"
161161
162−#: qml/Components/Lockscreen.qml:218
162+#: qml/Components/Lockscreen.qml:220
163163msgid "Emergency Call"
164164msgstr "Notruf"
165165
166−#: qml/Components/Lockscreen.qml:250
166+#: qml/Components/Lockscreen.qml:252
167167msgid "OK"
168168msgstr "OK"
169169
170−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
170+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
171171msgid "See less"
172172msgstr "Weniger ansehen"
173173
174−#: qml/Dash/GenericScopeView.qml:411
174+#: qml/Dash/GenericScopeView.qml:434
175175msgid "See all"
176176msgstr "Alle anzeigen"
177177
178−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
178+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
179179#: qml/Panel/SearchIndicator.qml:27
180180msgid "Search"
181181msgstr "Suchen"
@@ -264,18 +264,10 @@ msgstr "Sprechen Sie jetzt …"
264264msgid "Speaking..."
265265msgstr "Sprechen Sie …"
266266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:108
267+#: qml/Notifications/NotificationMenuItemFactory.qml:116
268268msgid "Show password"
269269msgstr "Passwort anzeigen"
270270
271−#: qml/Notifications/NotificationMenuItemFactory.qml:124
272−msgid "Enter SIM PIN"
273−msgstr "Geben Sie die SIM-PIN ein"
274−
275−#: qml/Notifications/NotificationMenuItemFactory.qml:125
276−msgid "Sorry, incorrect PIN"
277−msgstr "Die PIN ist nicht korrekt"
278−
279271#: qml/Panel/ActiveCallHint.qml:77
280272msgid "Tap to return to call..."
281273msgstr "Tippen um zum Anruf zurückzugehen"
@@ -320,49 +312,49 @@ msgstr "SIM-Karte entsperren"
320312msgid "Roaming"
321313msgstr "Roaming"
322314
323−#: qml/Shell.qml:340
315+#: qml/Shell.qml:346
324316msgid "Enter passphrase"
325317msgstr ""
326318
327−#: qml/Shell.qml:341
319+#: qml/Shell.qml:347
328320msgid "Sorry, incorrect passphrase"
329321msgstr "Das Passwort ist nicht korrekt"
330322
331−#: qml/Shell.qml:342
323+#: qml/Shell.qml:348
332324msgid "Please re-enter"
333325msgstr ""
334326
335−#: qml/Shell.qml:344
327+#: qml/Shell.qml:350
336328msgid "Enter passcode"
337329msgstr ""
338330
339−#: qml/Shell.qml:345
331+#: qml/Shell.qml:351
340332msgid "Sorry, incorrect passcode"
341333msgstr "Falsches Passwort"
342334
343−#: qml/Shell.qml:348
335+#: qml/Shell.qml:354
344336#, qt-format
345337msgid "Enter %1"
346338msgstr ""
347339
348−#: qml/Shell.qml:349
340+#: qml/Shell.qml:355
349341#, qt-format
350342msgid "Sorry, incorrect %1"
351343msgstr "%1 falsch"
352344
353−#: qml/Shell.qml:384
345+#: qml/Shell.qml:390
354346msgid "Sorry, incorrect passphrase."
355347msgstr "Falsches Passwort."
356348
357−#: qml/Shell.qml:385
349+#: qml/Shell.qml:391
358350msgid "Sorry, incorrect passcode."
359351msgstr "Falsche PIN"
360352
361−#: qml/Shell.qml:386
353+#: qml/Shell.qml:392
362354msgid "This will be your last attempt."
363355msgstr "Dies ist Ihr letzter Versuch."
364356
365−#: qml/Shell.qml:388
357+#: qml/Shell.qml:394
366358msgid ""
367359"If passphrase is entered incorrectly, your phone will conduct a factory "
368360"reset and all personal data will be deleted."
@@ -370,7 +362,7 @@ msgstr ""
370362"Wird das Passwort falsch eingegeben, wird das Telefon auf den Werkszustand "
371363"zurückgesetzt und alle Daten werden gelöscht."
372364
373−#: qml/Shell.qml:389
365+#: qml/Shell.qml:395
374366msgid ""
375367"If passcode is entered incorrectly, your phone will conduct a factory reset "
376368"and all personal data will be deleted."
@@ -378,28 +370,8 @@ msgstr ""
378370"Wird die PIN falsch eingegeben, wird das Telefon auf den Werkszustand "
379371"zurückgesetzt und alle Daten werden gelöscht."
380372
381−#, qt-format
382−#~ msgid "Hello %1"
383−#~ msgstr "Hallo %1"
384−
385−#~ msgid "Hello"
386−#~ msgstr "Hallo"
387−
388−#~ msgid "Swipe to unlock"
389−#~ msgstr "Wischen zum Entsperren"
390−
391−#~ msgid "Please wait"
392−#~ msgstr "Bitte warten"
393−
394−#~ msgid "Too many incorrect attempts"
395−#~ msgstr "Zu viele falsche Versuche"
396−
397−#, qt-format
398−#~ msgid "Enter your %1"
399−#~ msgstr "%1 eingeben"
400−
401−#~ msgid "Enter your passphrase"
402−#~ msgstr "Geben Sie Ihr Passwort ein"
373+#~ msgid "Sorry, incorrect PIN"
374+#~ msgstr "Die PIN ist nicht korrekt"
403375
404−#~ msgid "Enter your passcode"
405−#~ msgstr "Passwort eingeben"
376+#~ msgid "Enter SIM PIN"
377+#~ msgstr "Geben Sie die SIM-PIN ein"
po/el.po+20−48
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-08-21 12:06+0000\n"
1212"Last-Translator: Chris Taklis (aka Kailor) <ctaklis@gmail.com>\n"
1313"Language-Team: Greek <el@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -156,23 +156,23 @@ msgstr ""
156156"Πλέον γνωρίζετε τις χειρονομίες από τα άκρα και μπορείτε να ξεκινήσετε να "
157157"χρησιμοποιείτε το τηλέφωνο<br><br>Αγγίξτε την οθόνη για να ξεκινήσετε"
158158
159−#: qml/Components/Lockscreen.qml:218
159+#: qml/Components/Lockscreen.qml:220
160160msgid "Emergency Call"
161161msgstr "Κλήση έκτακτης ανάγκης"
162162
163−#: qml/Components/Lockscreen.qml:250
163+#: qml/Components/Lockscreen.qml:252
164164msgid "OK"
165165msgstr "OK"
166166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
167+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168168msgid "See less"
169169msgstr "Λιγότερα"
170170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:434
172172msgid "See all"
173173msgstr "Εμφάνιση όλων"
174174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176176#: qml/Panel/SearchIndicator.qml:27
177177msgid "Search"
178178msgstr "Αναζήτηση"
@@ -261,18 +261,10 @@ msgstr "Μιλήστε τώρα..."
261261msgid "Speaking..."
262262msgstr "Ομιλία..."
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:108
264+#: qml/Notifications/NotificationMenuItemFactory.qml:116
265265msgid "Show password"
266266msgstr "Εμφάνιση κωδικού"
267267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:124
269−msgid "Enter SIM PIN"
270−msgstr ""
271−
272−#: qml/Notifications/NotificationMenuItemFactory.qml:125
273−msgid "Sorry, incorrect PIN"
274−msgstr ""
275−
276268#: qml/Panel/ActiveCallHint.qml:77
277269msgid "Tap to return to call..."
278270msgstr "Πατήστε για να γυρίσετε στην κλήση..."
@@ -317,76 +309,56 @@ msgstr "Ξεκλείδωμα SIM"
317309msgid "Roaming"
318310msgstr "Περιαγωγή"
319311
320−#: qml/Shell.qml:340
312+#: qml/Shell.qml:346
321313msgid "Enter passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:341
316+#: qml/Shell.qml:347
325317msgid "Sorry, incorrect passphrase"
326318msgstr ""
327319
328−#: qml/Shell.qml:342
320+#: qml/Shell.qml:348
329321msgid "Please re-enter"
330322msgstr ""
331323
332−#: qml/Shell.qml:344
324+#: qml/Shell.qml:350
333325msgid "Enter passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:345
328+#: qml/Shell.qml:351
337329msgid "Sorry, incorrect passcode"
338330msgstr ""
339331
340−#: qml/Shell.qml:348
332+#: qml/Shell.qml:354
341333#, qt-format
342334msgid "Enter %1"
343335msgstr ""
344336
345−#: qml/Shell.qml:349
337+#: qml/Shell.qml:355
346338#, qt-format
347339msgid "Sorry, incorrect %1"
348340msgstr ""
349341
350−#: qml/Shell.qml:384
342+#: qml/Shell.qml:390
351343msgid "Sorry, incorrect passphrase."
352344msgstr ""
353345
354−#: qml/Shell.qml:385
346+#: qml/Shell.qml:391
355347msgid "Sorry, incorrect passcode."
356348msgstr ""
357349
358−#: qml/Shell.qml:386
350+#: qml/Shell.qml:392
359351msgid "This will be your last attempt."
360352msgstr ""
361353
362−#: qml/Shell.qml:388
354+#: qml/Shell.qml:394
363355msgid ""
364356"If passphrase is entered incorrectly, your phone will conduct a factory "
365357"reset and all personal data will be deleted."
366358msgstr ""
367359
368−#: qml/Shell.qml:389
360+#: qml/Shell.qml:395
369361msgid ""
370362"If passcode is entered incorrectly, your phone will conduct a factory reset "
371363"and all personal data will be deleted."
372364msgstr ""
373−
374−#~ msgid "Hello"
375−#~ msgstr "Γεια σας"
376−
377−#, qt-format
378−#~ msgid "Hello %1"
379−#~ msgstr "Γεια σας %1"
380−
381−#~ msgid "Swipe to unlock"
382−#~ msgstr "Σύρετε για να ξεκλειδώσετε"
383−
384−#~ msgid "Please wait"
385−#~ msgstr "Παρακαλώ περιμένετε"
386−
387−#~ msgid "Too many incorrect attempts"
388−#~ msgstr "Πολλές άκυρες προσπάθειες"
389−
390−#, qt-format
391−#~ msgid "Enter your %1"
392−#~ msgstr "Εισάγετε το %1"
po/en_AU.po+35−69
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-09-23 01:24+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-12 09:41+0000\n"
1212"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
1313"Language-Team: English (Australia) <en_AU@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-13 06:15+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -33,22 +33,22 @@ msgstr "Unpin shortcut"
3333
3434#: qml/Components/DelayedLockscreen.qml:47
3535msgid "Device Locked"
36−msgstr ""
36+msgstr "Device Locked"
3737
3838#: qml/Components/DelayedLockscreen.qml:62
3939msgid "You have been locked out due to too many failed passphrase attempts."
40−msgstr ""
40+msgstr "You have been locked out due to too many failed passphrase attempts."
4141
4242#: qml/Components/DelayedLockscreen.qml:63
4343msgid "You have been locked out due to too many failed passcode attempts."
44−msgstr ""
44+msgstr "You have been locked out due to too many failed passcode attempts."
4545
4646#: qml/Components/DelayedLockscreen.qml:72
4747#, qt-format
4848msgid "Please wait %1 minute and then try again…"
4949msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
51−msgstr[1] ""
50+msgstr[0] "Please wait %1 minute and then try again…"
51+msgstr[1] "Please wait %1 minutes and then try again…"
5252
5353#: qml/Components/Dialogs.qml:70
5454msgid "Log out"
@@ -156,23 +156,23 @@ msgstr ""
156156"You have now mastered the edge gestures and can start using the "
157157"phone<br><br>Tap on the screen to start"
158158
159−#: qml/Components/Lockscreen.qml:218
159+#: qml/Components/Lockscreen.qml:220
160160msgid "Emergency Call"
161161msgstr "Emergency Call"
162162
163−#: qml/Components/Lockscreen.qml:250
163+#: qml/Components/Lockscreen.qml:252
164164msgid "OK"
165165msgstr "OK"
166166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
167+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168168msgid "See less"
169169msgstr "See less"
170170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:434
172172msgid "See all"
173173msgstr "See all"
174174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176176#: qml/Panel/SearchIndicator.qml:27
177177msgid "Search"
178178msgstr "Search"
@@ -211,15 +211,15 @@ msgstr "Send"
211211
212212#: qml/Dash/PullToRefreshScopeStyle.qml:55
213213msgid "Pull to refresh…"
214−msgstr ""
214+msgstr "Pull to refresh…"
215215
216216#: qml/Dash/PullToRefreshScopeStyle.qml:60
217217msgid "Release to refresh…"
218−msgstr ""
218+msgstr "Release to refresh…"
219219
220220#: qml/Dash/ScopesOverview.qml:206
221221msgid "Manage Scopes"
222−msgstr ""
222+msgstr "Manage Scopes"
223223
224224#: qml/Dash/ScopesOverview.qml:428
225225msgid "Done"
@@ -239,7 +239,7 @@ msgstr "All"
239239
240240#: qml/Greeter/Greeter.qml:157
241241msgid "Unlock"
242−msgstr ""
242+msgstr "Unlock"
243243
244244#: qml/Hud/HudParametrizedActionsPage.qml:139
245245msgid "Confirm"
@@ -261,18 +261,10 @@ msgstr "Speak Now..."
261261msgid "Speaking..."
262262msgstr "Speaking..."
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:108
264+#: qml/Notifications/NotificationMenuItemFactory.qml:116
265265msgid "Show password"
266266msgstr "Show password"
267267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:124
269−msgid "Enter SIM PIN"
270−msgstr "Enter SIM PIN"
271−
272−#: qml/Notifications/NotificationMenuItemFactory.qml:125
273−msgid "Sorry, incorrect PIN"
274−msgstr "Sorry, incorrect PIN"
275−
276268#: qml/Panel/ActiveCallHint.qml:77
277269msgid "Tap to return to call..."
278270msgstr "Tap to return to call..."
@@ -283,7 +275,7 @@ msgstr "Conference"
283275
284276#: qml/Panel/Indicators/MenuItemFactory.qml:600
285277msgid "Nothing is playing"
286−msgstr ""
278+msgstr "Nothing is playing"
287279
288280#: qml/Panel/Indicators/MenuItemFactory.qml:748
289281msgid "In queue…"
@@ -317,49 +309,49 @@ msgstr "Unlock SIM"
317309msgid "Roaming"
318310msgstr "Roaming"
319311
320−#: qml/Shell.qml:340
312+#: qml/Shell.qml:346
321313msgid "Enter passphrase"
322−msgstr ""
314+msgstr "Enter passphrase"
323315
324−#: qml/Shell.qml:341
316+#: qml/Shell.qml:347
325317msgid "Sorry, incorrect passphrase"
326318msgstr "Sorry, incorrect passphrase"
327319
328−#: qml/Shell.qml:342
320+#: qml/Shell.qml:348
329321msgid "Please re-enter"
330−msgstr ""
322+msgstr "Please re-enter"
331323
332−#: qml/Shell.qml:344
324+#: qml/Shell.qml:350
333325msgid "Enter passcode"
334−msgstr ""
326+msgstr "Enter passcode"
335327
336−#: qml/Shell.qml:345
328+#: qml/Shell.qml:351
337329msgid "Sorry, incorrect passcode"
338330msgstr "Sorry, incorrect passcode"
339331
340−#: qml/Shell.qml:348
332+#: qml/Shell.qml:354
341333#, qt-format
342334msgid "Enter %1"
343−msgstr ""
335+msgstr "Enter %1"
344336
345−#: qml/Shell.qml:349
337+#: qml/Shell.qml:355
346338#, qt-format
347339msgid "Sorry, incorrect %1"
348340msgstr "Sorry, incorrect %1"
349341
350−#: qml/Shell.qml:384
342+#: qml/Shell.qml:390
351343msgid "Sorry, incorrect passphrase."
352344msgstr "Sorry, incorrect passphrase."
353345
354−#: qml/Shell.qml:385
346+#: qml/Shell.qml:391
355347msgid "Sorry, incorrect passcode."
356348msgstr "Sorry, incorrect passcode."
357349
358−#: qml/Shell.qml:386
350+#: qml/Shell.qml:392
359351msgid "This will be your last attempt."
360352msgstr "This will be your last attempt."
361353
362−#: qml/Shell.qml:388
354+#: qml/Shell.qml:394
363355msgid ""
364356"If passphrase is entered incorrectly, your phone will conduct a factory "
365357"reset and all personal data will be deleted."
@@ -367,36 +359,10 @@ msgstr ""
367359"If passphrase is entered incorrectly, your phone will conduct a factory "
368360"reset and all personal data will be deleted."
369361
370−#: qml/Shell.qml:389
362+#: qml/Shell.qml:395
371363msgid ""
372364"If passcode is entered incorrectly, your phone will conduct a factory reset "
373365"and all personal data will be deleted."
374366msgstr ""
375367"If passcode is entered incorrectly, your phone will conduct a factory reset "
376368"and all personal data will be deleted."
377−
378−#, qt-format
379−#~ msgid "Hello %1"
380−#~ msgstr "Hello %1"
381−
382−#~ msgid "Hello"
383−#~ msgstr "Hello"
384−
385−#~ msgid "Swipe to unlock"
386−#~ msgstr "Swipe to unlock"
387−
388−#~ msgid "Please wait"
389−#~ msgstr "Please wait"
390−
391−#~ msgid "Too many incorrect attempts"
392−#~ msgstr "Too many incorrect attempts"
393−
394−#, qt-format
395−#~ msgid "Enter your %1"
396−#~ msgstr "Enter your %1"
397−
398−#~ msgid "Enter your passphrase"
399−#~ msgstr "Enter your passphrase"
400−
401−#~ msgid "Enter your passcode"
402−#~ msgstr "Enter your passcode"
po/en_GB.po+26−54
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-10-03 12:46+0000\n"
1212"Last-Translator: Andi Chandler <Unknown>\n"
1313"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -156,23 +156,23 @@ msgstr ""
156156"You have now mastered the edge gestures and can start using the "
157157"phone<br><br>Tap on the screen to start"
158158
159−#: qml/Components/Lockscreen.qml:218
159+#: qml/Components/Lockscreen.qml:220
160160msgid "Emergency Call"
161161msgstr "Emergency Call"
162162
163−#: qml/Components/Lockscreen.qml:250
163+#: qml/Components/Lockscreen.qml:252
164164msgid "OK"
165165msgstr "OK"
166166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
167+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168168msgid "See less"
169169msgstr "See less"
170170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:434
172172msgid "See all"
173173msgstr "See all"
174174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176176#: qml/Panel/SearchIndicator.qml:27
177177msgid "Search"
178178msgstr "Search"
@@ -211,11 +211,11 @@ msgstr "Send"
211211
212212#: qml/Dash/PullToRefreshScopeStyle.qml:55
213213msgid "Pull to refresh…"
214−msgstr ""
214+msgstr "Pull to refresh…"
215215
216216#: qml/Dash/PullToRefreshScopeStyle.qml:60
217217msgid "Release to refresh…"
218−msgstr ""
218+msgstr "Release to refresh…"
219219
220220#: qml/Dash/ScopesOverview.qml:206
221221msgid "Manage Scopes"
@@ -261,18 +261,10 @@ msgstr "Speak Now..."
261261msgid "Speaking..."
262262msgstr "Speaking..."
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:108
264+#: qml/Notifications/NotificationMenuItemFactory.qml:116
265265msgid "Show password"
266266msgstr "Show password"
267267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:124
269−msgid "Enter SIM PIN"
270−msgstr "Enter SIM PIN"
271−
272−#: qml/Notifications/NotificationMenuItemFactory.qml:125
273−msgid "Sorry, incorrect PIN"
274−msgstr "Sorry, incorrect PIN"
275−
276268#: qml/Panel/ActiveCallHint.qml:77
277269msgid "Tap to return to call..."
278270msgstr "Tap to return to call..."
@@ -317,49 +309,49 @@ msgstr "Unlock SIM"
317309msgid "Roaming"
318310msgstr "Roaming"
319311
320−#: qml/Shell.qml:340
312+#: qml/Shell.qml:346
321313msgid "Enter passphrase"
322314msgstr "Enter passphrase"
323315
324−#: qml/Shell.qml:341
316+#: qml/Shell.qml:347
325317msgid "Sorry, incorrect passphrase"
326318msgstr "Sorry, incorrect passphrase"
327319
328−#: qml/Shell.qml:342
320+#: qml/Shell.qml:348
329321msgid "Please re-enter"
330322msgstr "Please re-enter"
331323
332−#: qml/Shell.qml:344
324+#: qml/Shell.qml:350
333325msgid "Enter passcode"
334326msgstr "Enter passcode"
335327
336−#: qml/Shell.qml:345
328+#: qml/Shell.qml:351
337329msgid "Sorry, incorrect passcode"
338330msgstr "Sorry, incorrect passcode"
339331
340−#: qml/Shell.qml:348
332+#: qml/Shell.qml:354
341333#, qt-format
342334msgid "Enter %1"
343335msgstr "Enter %1"
344336
345−#: qml/Shell.qml:349
337+#: qml/Shell.qml:355
346338#, qt-format
347339msgid "Sorry, incorrect %1"
348340msgstr "Sorry, incorrect %1"
349341
350−#: qml/Shell.qml:384
342+#: qml/Shell.qml:390
351343msgid "Sorry, incorrect passphrase."
352344msgstr "Sorry, incorrect passphrase."
353345
354−#: qml/Shell.qml:385
346+#: qml/Shell.qml:391
355347msgid "Sorry, incorrect passcode."
356348msgstr "Sorry, incorrect passcode."
357349
358−#: qml/Shell.qml:386
350+#: qml/Shell.qml:392
359351msgid "This will be your last attempt."
360352msgstr "This will be your last attempt."
361353
362−#: qml/Shell.qml:388
354+#: qml/Shell.qml:394
363355msgid ""
364356"If passphrase is entered incorrectly, your phone will conduct a factory "
365357"reset and all personal data will be deleted."
@@ -367,7 +359,7 @@ msgstr ""
367359"If passphrase is entered incorrectly, your phone will conduct a factory "
368360"reset and all personal data will be deleted."
369361
370−#: qml/Shell.qml:389
362+#: qml/Shell.qml:395
371363msgid ""
372364"If passcode is entered incorrectly, your phone will conduct a factory reset "
373365"and all personal data will be deleted."
@@ -375,28 +367,8 @@ msgstr ""
375367"If passcode is entered incorrectly, your phone will conduct a factory reset "
376368"and all personal data will be deleted."
377369
378−#, qt-format
379−#~ msgid "Hello %1"
380−#~ msgstr "Hello %1"
381−
382−#~ msgid "Hello"
383−#~ msgstr "Hello"
384−
385−#~ msgid "Swipe to unlock"
386−#~ msgstr "Swipe to unlock"
387−
388−#~ msgid "Please wait"
389−#~ msgstr "Please wait"
390−
391−#~ msgid "Too many incorrect attempts"
392−#~ msgstr "Too many incorrect attempts"
393−
394−#, qt-format
395−#~ msgid "Enter your %1"
396−#~ msgstr "Enter your %1"
397−
398−#~ msgid "Enter your passphrase"
399−#~ msgstr "Enter your passphrase"
370+#~ msgid "Sorry, incorrect PIN"
371+#~ msgstr "Sorry, incorrect PIN"
400372
401−#~ msgid "Enter your passcode"
402−#~ msgstr "Enter your passcode"
373+#~ msgid "Enter SIM PIN"
374+#~ msgstr "Enter SIM PIN"
po/eo.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2013-06-26 22:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Esperanto <eo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257257msgid "Speaking..."
258258msgstr ""
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
po/es.po+28−56
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-05 08:50+0000\n"
12−"Last-Translator: Paco Molinero <paco@byasl.com>\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-09 07:43+0000\n"
12+"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
1313"Language-Team: Spanish <es@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -163,23 +163,23 @@ msgstr ""
163163"Ahora domina los gestos de los bordes y puede usar el teléfono<br><br>Toque "
164164"la pantalla para comenzar"
165165
166−#: qml/Components/Lockscreen.qml:218
166+#: qml/Components/Lockscreen.qml:220
167167msgid "Emergency Call"
168168msgstr "Llamada de emergencia"
169169
170−#: qml/Components/Lockscreen.qml:250
170+#: qml/Components/Lockscreen.qml:252
171171msgid "OK"
172172msgstr "Aceptar"
173173
174−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
174+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
175175msgid "See less"
176176msgstr "Ver menos"
177177
178−#: qml/Dash/GenericScopeView.qml:411
178+#: qml/Dash/GenericScopeView.qml:434
179179msgid "See all"
180180msgstr "Ver todo"
181181
182−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
182+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
183183#: qml/Panel/SearchIndicator.qml:27
184184msgid "Search"
185185msgstr "Buscar"
@@ -218,11 +218,11 @@ msgstr "Enviar"
218218
219219#: qml/Dash/PullToRefreshScopeStyle.qml:55
220220msgid "Pull to refresh…"
221−msgstr ""
221+msgstr "Deslice para actualizar…"
222222
223223#: qml/Dash/PullToRefreshScopeStyle.qml:60
224224msgid "Release to refresh…"
225−msgstr ""
225+msgstr "Suelte para actualizar…"
226226
227227#: qml/Dash/ScopesOverview.qml:206
228228msgid "Manage Scopes"
@@ -268,18 +268,10 @@ msgstr "Hable ahora…"
268268msgid "Speaking..."
269269msgstr "Hablando…"
270270
271−#: qml/Notifications/NotificationMenuItemFactory.qml:108
271+#: qml/Notifications/NotificationMenuItemFactory.qml:116
272272msgid "Show password"
273273msgstr "Mostrar contraseña"
274274
275−#: qml/Notifications/NotificationMenuItemFactory.qml:124
276−msgid "Enter SIM PIN"
277−msgstr "Escriba el PIN de la SIM"
278−
279−#: qml/Notifications/NotificationMenuItemFactory.qml:125
280−msgid "Sorry, incorrect PIN"
281−msgstr "El PIN es incorrecto"
282−
283275#: qml/Panel/ActiveCallHint.qml:77
284276msgid "Tap to return to call..."
285277msgstr "Toque para volver a llamar..."
@@ -324,49 +316,49 @@ msgstr "Desbloquear SIM"
324316msgid "Roaming"
325317msgstr "Itinerancia"
326318
327−#: qml/Shell.qml:340
319+#: qml/Shell.qml:346
328320msgid "Enter passphrase"
329321msgstr "Introduzca la contraseña"
330322
331−#: qml/Shell.qml:341
323+#: qml/Shell.qml:347
332324msgid "Sorry, incorrect passphrase"
333325msgstr "La contraseña es incorrecta"
334326
335−#: qml/Shell.qml:342
327+#: qml/Shell.qml:348
336328msgid "Please re-enter"
337329msgstr "Reintroduzca"
338330
339−#: qml/Shell.qml:344
331+#: qml/Shell.qml:350
340332msgid "Enter passcode"
341333msgstr "Introduzca el código"
342334
343−#: qml/Shell.qml:345
335+#: qml/Shell.qml:351
344336msgid "Sorry, incorrect passcode"
345337msgstr "El código es incorrecto"
346338
347−#: qml/Shell.qml:348
339+#: qml/Shell.qml:354
348340#, qt-format
349341msgid "Enter %1"
350342msgstr "Introduzca %1"
351343
352−#: qml/Shell.qml:349
344+#: qml/Shell.qml:355
353345#, qt-format
354346msgid "Sorry, incorrect %1"
355347msgstr "Incorrecto (%1)"
356348
357−#: qml/Shell.qml:384
349+#: qml/Shell.qml:390
358350msgid "Sorry, incorrect passphrase."
359351msgstr "La contraseña es incorrecta."
360352
361−#: qml/Shell.qml:385
353+#: qml/Shell.qml:391
362354msgid "Sorry, incorrect passcode."
363355msgstr "Código de acceso incorrecto."
364356
365−#: qml/Shell.qml:386
357+#: qml/Shell.qml:392
366358msgid "This will be your last attempt."
367359msgstr "Este será su último intento."
368360
369−#: qml/Shell.qml:388
361+#: qml/Shell.qml:394
370362msgid ""
371363"If passphrase is entered incorrectly, your phone will conduct a factory "
372364"reset and all personal data will be deleted."
@@ -374,7 +366,7 @@ msgstr ""
374366"Si se introduce la frase incorrectamente, el teléfono volverá a la "
375367"configuración de fábrica y se perderán todos los datos personales."
376368
377−#: qml/Shell.qml:389
369+#: qml/Shell.qml:395
378370msgid ""
379371"If passcode is entered incorrectly, your phone will conduct a factory reset "
380372"and all personal data will be deleted."
@@ -382,28 +374,8 @@ msgstr ""
382374"Si se introduce el código incorrectamente, el teléfono volverá a la "
383375"configuración de fábrica y se perderán todos los datos personales."
384376
385−#~ msgid "Hello"
386−#~ msgstr "Hola"
387−
388−#, qt-format
389−#~ msgid "Hello %1"
390−#~ msgstr "Hola, %1"
391−
392−#~ msgid "Swipe to unlock"
393−#~ msgstr "Deslice para desbloquear"
394−
395−#~ msgid "Please wait"
396−#~ msgstr "Espere un momento"
397−
398−#~ msgid "Too many incorrect attempts"
399−#~ msgstr "Demasiados intentos incorrectos"
400−
401−#, qt-format
402−#~ msgid "Enter your %1"
403−#~ msgstr "Introduzca su %1"
404−
405−#~ msgid "Enter your passcode"
406−#~ msgstr "Escriba su código de acceso"
377+#~ msgid "Enter SIM PIN"
378+#~ msgstr "Escriba el PIN de la SIM"
407379
408−#~ msgid "Enter your passphrase"
409−#~ msgstr "Escriba su contraseña"
380+#~ msgid "Sorry, incorrect PIN"
381+#~ msgstr "El PIN es incorrecto"
po/eu.po+27−55
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-04 01:50+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-07 19:21+0000\n"
1212"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
1313"Language-Team: Basque <eu@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -160,23 +160,23 @@ msgstr ""
160160"Jadanik ezagutzen dituzu ertzetako keinuak, eta mugikorra erabiltzen has "
161161"zaitezke<br><br>Sakatu pantailan hasteko"
162162
163−#: qml/Components/Lockscreen.qml:218
163+#: qml/Components/Lockscreen.qml:220
164164msgid "Emergency Call"
165165msgstr "Larrialdi-deia"
166166
167−#: qml/Components/Lockscreen.qml:250
167+#: qml/Components/Lockscreen.qml:252
168168msgid "OK"
169169msgstr "Ados"
170170
171−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
171+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
172172msgid "See less"
173173msgstr "Ikusi gutxiago"
174174
175−#: qml/Dash/GenericScopeView.qml:411
175+#: qml/Dash/GenericScopeView.qml:434
176176msgid "See all"
177177msgstr "Ikusi guztiak"
178178
179−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
179+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
180180#: qml/Panel/SearchIndicator.qml:27
181181msgid "Search"
182182msgstr "Bilatu"
@@ -215,11 +215,11 @@ msgstr "Bidali"
215215
216216#: qml/Dash/PullToRefreshScopeStyle.qml:55
217217msgid "Pull to refresh…"
218−msgstr ""
218+msgstr "Tiratu freskatzeko…"
219219
220220#: qml/Dash/PullToRefreshScopeStyle.qml:60
221221msgid "Release to refresh…"
222−msgstr ""
222+msgstr "Askatu freskatzeko…"
223223
224224#: qml/Dash/ScopesOverview.qml:206
225225msgid "Manage Scopes"
@@ -265,18 +265,10 @@ msgstr "Hitz egin orain..."
265265msgid "Speaking..."
266266msgstr "Hitz egiten..."
267267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:108
268+#: qml/Notifications/NotificationMenuItemFactory.qml:116
269269msgid "Show password"
270270msgstr "Erakutsi pasahitza"
271271
272−#: qml/Notifications/NotificationMenuItemFactory.qml:124
273−msgid "Enter SIM PIN"
274−msgstr "Sartu SIMaren PINa"
275−
276−#: qml/Notifications/NotificationMenuItemFactory.qml:125
277−msgid "Sorry, incorrect PIN"
278−msgstr "Sentitzen dugu, PINa okerrekoa da"
279−
280272#: qml/Panel/ActiveCallHint.qml:77
281273msgid "Tap to return to call..."
282274msgstr "Sakatu deira itzultzeko..."
@@ -321,49 +313,49 @@ msgstr "Desblokeatu SIMa"
321313msgid "Roaming"
322314msgstr "Ibiltaritza"
323315
324−#: qml/Shell.qml:340
316+#: qml/Shell.qml:346
325317msgid "Enter passphrase"
326318msgstr "Sartu pasaesaldia"
327319
328−#: qml/Shell.qml:341
320+#: qml/Shell.qml:347
329321msgid "Sorry, incorrect passphrase"
330322msgstr "Sentitzen dugu, pasaesaldia okerrekoa da"
331323
332−#: qml/Shell.qml:342
324+#: qml/Shell.qml:348
333325msgid "Please re-enter"
334326msgstr "Errepikatu"
335327
336−#: qml/Shell.qml:344
328+#: qml/Shell.qml:350
337329msgid "Enter passcode"
338330msgstr "Sartu pasakodea"
339331
340−#: qml/Shell.qml:345
332+#: qml/Shell.qml:351
341333msgid "Sorry, incorrect passcode"
342334msgstr "Sentitzen dugu, pasakodea okerrekoa da"
343335
344−#: qml/Shell.qml:348
336+#: qml/Shell.qml:354
345337#, qt-format
346338msgid "Enter %1"
347339msgstr "Sartu %1"
348340
349−#: qml/Shell.qml:349
341+#: qml/Shell.qml:355
350342#, qt-format
351343msgid "Sorry, incorrect %1"
352344msgstr "Sentitzen dugu, %1 okerrekoa da"
353345
354−#: qml/Shell.qml:384
346+#: qml/Shell.qml:390
355347msgid "Sorry, incorrect passphrase."
356348msgstr "Sentitzen dugu, pasaesaldia okerrekoa da."
357349
358−#: qml/Shell.qml:385
350+#: qml/Shell.qml:391
359351msgid "Sorry, incorrect passcode."
360352msgstr "Sentitzen dugu, pasakodea okerrekoa da."
361353
362−#: qml/Shell.qml:386
354+#: qml/Shell.qml:392
363355msgid "This will be your last attempt."
364356msgstr "Hau duzu azken saiakera."
365357
366−#: qml/Shell.qml:388
358+#: qml/Shell.qml:394
367359msgid ""
368360"If passphrase is entered incorrectly, your phone will conduct a factory "
369361"reset and all personal data will be deleted."
@@ -371,7 +363,7 @@ msgstr ""
371363"Okerreko pasaesaldia sartzen baduzu, telefonoaren jatorrizko ezarpenak "
372364"berrezarri eta datu pertsonal guztiak ezabatuko dira."
373365
374−#: qml/Shell.qml:389
366+#: qml/Shell.qml:395
375367msgid ""
376368"If passcode is entered incorrectly, your phone will conduct a factory reset "
377369"and all personal data will be deleted."
@@ -379,28 +371,8 @@ msgstr ""
379371"Okerreko pasakodea sartzen baduzu, telefonoaren jatorrizko ezarpenak "
380372"berrezarri eta datu pertsonal guztiak ezabatuko dira."
381373
382−#, qt-format
383−#~ msgid "Hello %1"
384−#~ msgstr "Kaixo %1"
385−
386−#~ msgid "Hello"
387−#~ msgstr "Kaixo"
388−
389−#~ msgid "Swipe to unlock"
390−#~ msgstr "Pasatu hatza desblokeatzeko"
391−
392−#~ msgid "Please wait"
393−#~ msgstr "Itxaron"
394−
395−#~ msgid "Too many incorrect attempts"
396−#~ msgstr "Okerreko saiakera gehiegi"
374+#~ msgid "Sorry, incorrect PIN"
375+#~ msgstr "Sentitzen dugu, PINa okerrekoa da"
397376
398−#~ msgid "Enter your passphrase"
399−#~ msgstr "Sartu pasaesaldia"
400−
401−#~ msgid "Enter your passcode"
402−#~ msgstr "Sartu pasakodea"
403−
404−#, qt-format
405−#~ msgid "Enter your %1"
406−#~ msgstr "Sartu %1"
377+#~ msgid "Enter SIM PIN"
378+#~ msgstr "Sartu SIMaren PINa"
po/fa.po+23−57
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-02 23:07+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-11 23:41+0000\n"
1212"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
1313"Language-Team: Persian <fa@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-12 06:55+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -156,23 +156,23 @@ msgstr ""
156156"هم اکنون در استفاده از ژست های حرکتی مهارت لازم را دارید و می‌توانید استفاده "
157157"از تلفن را آغاز کنید<br><br>برای شروع صفحه را لمس کنید"
158158
159−#: qml/Components/Lockscreen.qml:218
159+#: qml/Components/Lockscreen.qml:220
160160msgid "Emergency Call"
161161msgstr "تماس اضطراری"
162162
163−#: qml/Components/Lockscreen.qml:250
163+#: qml/Components/Lockscreen.qml:252
164164msgid "OK"
165165msgstr "قبول"
166166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
167+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168168msgid "See less"
169169msgstr "کم‌تر ببینید"
170170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:434
172172msgid "See all"
173173msgstr "دیدن همه"
174174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176176#: qml/Panel/SearchIndicator.qml:27
177177msgid "Search"
178178msgstr "جست‌وجو"
@@ -211,11 +211,11 @@ msgstr "ارسال"
211211
212212#: qml/Dash/PullToRefreshScopeStyle.qml:55
213213msgid "Pull to refresh…"
214−msgstr ""
214+msgstr "برای تازه‌سازی بکشید…"
215215
216216#: qml/Dash/PullToRefreshScopeStyle.qml:60
217217msgid "Release to refresh…"
218−msgstr ""
218+msgstr "برای تازه‌سازی رها کنید…"
219219
220220#: qml/Dash/ScopesOverview.qml:206
221221msgid "Manage Scopes"
@@ -261,18 +261,10 @@ msgstr "اکنون صحبت کنید…"
261261msgid "Speaking..."
262262msgstr "در حال صحبت کردن…"
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:108
264+#: qml/Notifications/NotificationMenuItemFactory.qml:116
265265msgid "Show password"
266266msgstr "نمایش گذرواژه"
267267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:124
269−msgid "Enter SIM PIN"
270−msgstr "PIN سیم‌کارت را وارد کنید"
271−
272−#: qml/Notifications/NotificationMenuItemFactory.qml:125
273−msgid "Sorry, incorrect PIN"
274−msgstr "متأسّفیم، PIN نادرست بود"
275−
276268#: qml/Panel/ActiveCallHint.qml:77
277269msgid "Tap to return to call..."
278270msgstr "برای بازگشت به تماس ضربه بزنید…"
@@ -317,49 +309,49 @@ msgstr "باز کردن قفل سیم‌کارت"
317309msgid "Roaming"
318310msgstr "رومینگ"
319311
320−#: qml/Shell.qml:340
312+#: qml/Shell.qml:346
321313msgid "Enter passphrase"
322314msgstr "عبارت‌عبور را وارد کنید"
323315
324−#: qml/Shell.qml:341
316+#: qml/Shell.qml:347
325317msgid "Sorry, incorrect passphrase"
326318msgstr "متأسّفیم، عبارت‌عبور نادرست بود"
327319
328−#: qml/Shell.qml:342
320+#: qml/Shell.qml:348
329321msgid "Please re-enter"
330322msgstr "لطفاً دوباره وارد کنید"
331323
332−#: qml/Shell.qml:344
324+#: qml/Shell.qml:350
333325msgid "Enter passcode"
334326msgstr "رمزعبور را وارد کنید"
335327
336−#: qml/Shell.qml:345
328+#: qml/Shell.qml:351
337329msgid "Sorry, incorrect passcode"
338330msgstr "متأسّفیم، رمزعبور نادرست بود"
339331
340−#: qml/Shell.qml:348
332+#: qml/Shell.qml:354
341333#, qt-format
342334msgid "Enter %1"
343335msgstr "%1 را وارد کنید"
344336
345−#: qml/Shell.qml:349
337+#: qml/Shell.qml:355
346338#, qt-format
347339msgid "Sorry, incorrect %1"
348340msgstr "متأسّفیم، %1 نادرست بود"
349341
350−#: qml/Shell.qml:384
342+#: qml/Shell.qml:390
351343msgid "Sorry, incorrect passphrase."
352344msgstr "متأسّفیم، عبارت‌عبور نادرست است."
353345
354−#: qml/Shell.qml:385
346+#: qml/Shell.qml:391
355347msgid "Sorry, incorrect passcode."
356348msgstr "متأسّفیم، رمزعبور نادرست است."
357349
358−#: qml/Shell.qml:386
350+#: qml/Shell.qml:392
359351msgid "This will be your last attempt."
360352msgstr "این آخرین تلاش شما خواهد بود."
361353
362−#: qml/Shell.qml:388
354+#: qml/Shell.qml:394
363355msgid ""
364356"If passphrase is entered incorrectly, your phone will conduct a factory "
365357"reset and all personal data will be deleted."
@@ -367,36 +359,10 @@ msgstr ""
367359"اگر عبارت‌عبور نادرست وارد شود، تلفن شما بازنشانی کارخانه خواهد شد و تمامی "
368360"اطّلاعات شخصی حذف خواهند شد."
369361
370−#: qml/Shell.qml:389
362+#: qml/Shell.qml:395
371363msgid ""
372364"If passcode is entered incorrectly, your phone will conduct a factory reset "
373365"and all personal data will be deleted."
374366msgstr ""
375367"اگر رمزعبور نادرست وارد شود، تلفن شما بازنشانی کارخانه خواهد شد و تمامی "
376368"اطّلاعات شخصی حذف خواهند شد."
377−
378−#, qt-format
379−#~ msgid "Hello %1"
380−#~ msgstr "سلام %1"
381−
382−#~ msgid "Hello"
383−#~ msgstr "سلام"
384−
385−#~ msgid "Swipe to unlock"
386−#~ msgstr "برای باز کردن قفل بکشد"
387−
388−#~ msgid "Please wait"
389−#~ msgstr "لطفاً صبر کنید"
390−
391−#~ msgid "Too many incorrect attempts"
392−#~ msgstr "تلاش‌های ناموفّق زیاد"
393−
394−#, qt-format
395−#~ msgid "Enter your %1"
396−#~ msgstr "%1 خود را وارد کنید"
397−
398−#~ msgid "Enter your passphrase"
399−#~ msgstr "عبارت‌عبورتان را وارد کنید"
400−
401−#~ msgid "Enter your passcode"
402−#~ msgstr "رمزعبورتان را وارد کنید"
po/fi.po+27−55
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-04 08:00+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-07 13:10+0000\n"
1212"Last-Translator: Jiri Grönroos <Unknown>\n"
1313"Language-Team: Finnish <fi@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -158,23 +158,23 @@ msgstr ""
158158"Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
159159"käytön<br><br>Napauta näyttöä aloittaaksesi"
160160
161−#: qml/Components/Lockscreen.qml:218
161+#: qml/Components/Lockscreen.qml:220
162162msgid "Emergency Call"
163163msgstr "Hätäpuhelu"
164164
165−#: qml/Components/Lockscreen.qml:250
165+#: qml/Components/Lockscreen.qml:252
166166msgid "OK"
167167msgstr "OK"
168168
169−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
169+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
170170msgid "See less"
171171msgstr "Näytä vähemmän"
172172
173−#: qml/Dash/GenericScopeView.qml:411
173+#: qml/Dash/GenericScopeView.qml:434
174174msgid "See all"
175175msgstr "Näytä kaikki"
176176
177−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
177+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
178178#: qml/Panel/SearchIndicator.qml:27
179179msgid "Search"
180180msgstr "Hae"
@@ -213,11 +213,11 @@ msgstr "Lähetä"
213213
214214#: qml/Dash/PullToRefreshScopeStyle.qml:55
215215msgid "Pull to refresh…"
216−msgstr ""
216+msgstr "Vedä päivittääksesi…"
217217
218218#: qml/Dash/PullToRefreshScopeStyle.qml:60
219219msgid "Release to refresh…"
220−msgstr ""
220+msgstr "Vapauta päivittääksesi…"
221221
222222#: qml/Dash/ScopesOverview.qml:206
223223msgid "Manage Scopes"
@@ -263,18 +263,10 @@ msgstr "Puhu nyt..."
263263msgid "Speaking..."
264264msgstr "Puhutaan..."
265265
266−#: qml/Notifications/NotificationMenuItemFactory.qml:108
266+#: qml/Notifications/NotificationMenuItemFactory.qml:116
267267msgid "Show password"
268268msgstr "Näytä salasana"
269269
270−#: qml/Notifications/NotificationMenuItemFactory.qml:124
271−msgid "Enter SIM PIN"
272−msgstr "Anna SIM-kortin PIN-koodi"
273−
274−#: qml/Notifications/NotificationMenuItemFactory.qml:125
275−msgid "Sorry, incorrect PIN"
276−msgstr "Väärä PIN-koodi"
277−
278270#: qml/Panel/ActiveCallHint.qml:77
279271msgid "Tap to return to call..."
280272msgstr "Napauta palataksesi puheluun..."
@@ -319,49 +311,49 @@ msgstr "Avaa SIM-kortin lukitus"
319311msgid "Roaming"
320312msgstr "Verkkovierailu"
321313
322−#: qml/Shell.qml:340
314+#: qml/Shell.qml:346
323315msgid "Enter passphrase"
324316msgstr "Anna tunnuslause"
325317
326−#: qml/Shell.qml:341
318+#: qml/Shell.qml:347
327319msgid "Sorry, incorrect passphrase"
328320msgstr "Virheellinen tunnuslause"
329321
330−#: qml/Shell.qml:342
322+#: qml/Shell.qml:348
331323msgid "Please re-enter"
332324msgstr "Anna uudelleen"
333325
334−#: qml/Shell.qml:344
326+#: qml/Shell.qml:350
335327msgid "Enter passcode"
336328msgstr "Anna suojakoodi"
337329
338−#: qml/Shell.qml:345
330+#: qml/Shell.qml:351
339331msgid "Sorry, incorrect passcode"
340332msgstr "Väärä suojakoodi"
341333
342−#: qml/Shell.qml:348
334+#: qml/Shell.qml:354
343335#, qt-format
344336msgid "Enter %1"
345337msgstr "Anna %1"
346338
347−#: qml/Shell.qml:349
339+#: qml/Shell.qml:355
348340#, qt-format
349341msgid "Sorry, incorrect %1"
350342msgstr "Väärä %1"
351343
352−#: qml/Shell.qml:384
344+#: qml/Shell.qml:390
353345msgid "Sorry, incorrect passphrase."
354346msgstr "Virheellinen tunnuslause."
355347
356−#: qml/Shell.qml:385
348+#: qml/Shell.qml:391
357349msgid "Sorry, incorrect passcode."
358350msgstr "Virheellinen suojakoodi."
359351
360−#: qml/Shell.qml:386
352+#: qml/Shell.qml:392
361353msgid "This will be your last attempt."
362354msgstr "Tämä on viimeinen yritys."
363355
364−#: qml/Shell.qml:388
356+#: qml/Shell.qml:394
365357msgid ""
366358"If passphrase is entered incorrectly, your phone will conduct a factory "
367359"reset and all personal data will be deleted."
@@ -369,7 +361,7 @@ msgstr ""
369361"Jos kirjoitat tunnuslauseen virheellisesti, puhelimesi palautetaan "
370362"tehdastilaan ja kaikki henkilökohtaiset tietosi poistetaan."
371363
372−#: qml/Shell.qml:389
364+#: qml/Shell.qml:395
373365msgid ""
374366"If passcode is entered incorrectly, your phone will conduct a factory reset "
375367"and all personal data will be deleted."
@@ -377,28 +369,8 @@ msgstr ""
377369"Jos kirjoitat suojakoodin virheellisesti, puhelimesi palautetaan "
378370"tehdastilaan ja kaikki henkilökohtaiset tietosi poistetaan."
379371
380−#~ msgid "Hello"
381−#~ msgstr "Hei"
382−
383−#, qt-format
384−#~ msgid "Hello %1"
385−#~ msgstr "Hei %1!"
386−
387−#~ msgid "Swipe to unlock"
388−#~ msgstr "Avaa pyyhkäisemällä"
389−
390−#~ msgid "Please wait"
391−#~ msgstr "Odota hetki"
392−
393−#~ msgid "Too many incorrect attempts"
394−#~ msgstr "Liian monta virheellistä yritystä"
395−
396−#, qt-format
397−#~ msgid "Enter your %1"
398−#~ msgstr "Anna %1"
399−
400−#~ msgid "Enter your passphrase"
401−#~ msgstr "Anna tunnuslause"
372+#~ msgid "Sorry, incorrect PIN"
373+#~ msgstr "Väärä PIN-koodi"
402374
403−#~ msgid "Enter your passcode"
404−#~ msgstr "Anna suojakoodi"
375+#~ msgid "Enter SIM PIN"
376+#~ msgstr "Anna SIM-kortin PIN-koodi"
po/fo.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-01-14 20:08+0000\n"
1212"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
1313"Language-Team: Faroese <fo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "Leita"
@@ -257,18 +257,10 @@ msgstr "Snakka nú..."
257257msgid "Speaking..."
258258msgstr "Snakkar..."
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
po/fr.po+28−56
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-06 19:06+0000\n"
12−"Last-Translator: Jean Marc <Unknown>\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-09 19:00+0000\n"
12+"Last-Translator: Anne <anneonyme017@gmail.com>\n"
1313"Language-Team: French <fr@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -167,23 +167,23 @@ msgstr ""
167167"Vous maîtrisez maintenant les différents gestes et pouvez commencer à "
168168"utiliser le téléphone<br><br>Appuyez sur l'écran pour commencer"
169169
170−#: qml/Components/Lockscreen.qml:218
170+#: qml/Components/Lockscreen.qml:220
171171msgid "Emergency Call"
172172msgstr "Appel d'urgence"
173173
174−#: qml/Components/Lockscreen.qml:250
174+#: qml/Components/Lockscreen.qml:252
175175msgid "OK"
176176msgstr "OK"
177177
178−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
178+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
179179msgid "See less"
180180msgstr "Voir moins"
181181
182−#: qml/Dash/GenericScopeView.qml:411
182+#: qml/Dash/GenericScopeView.qml:434
183183msgid "See all"
184184msgstr "Tout voir"
185185
186−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
186+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
187187#: qml/Panel/SearchIndicator.qml:27
188188msgid "Search"
189189msgstr "Rechercher"
@@ -222,11 +222,11 @@ msgstr "Envoyer"
222222
223223#: qml/Dash/PullToRefreshScopeStyle.qml:55
224224msgid "Pull to refresh…"
225−msgstr ""
225+msgstr "Tirer pour actualiser..."
226226
227227#: qml/Dash/PullToRefreshScopeStyle.qml:60
228228msgid "Release to refresh…"
229−msgstr ""
229+msgstr "Relâcher pour actualiser..."
230230
231231#: qml/Dash/ScopesOverview.qml:206
232232msgid "Manage Scopes"
@@ -272,18 +272,10 @@ msgstr "Parlez maintenant…"
272272msgid "Speaking..."
273273msgstr "En cours d'écoute..."
274274
275−#: qml/Notifications/NotificationMenuItemFactory.qml:108
275+#: qml/Notifications/NotificationMenuItemFactory.qml:116
276276msgid "Show password"
277277msgstr "Afficher le mot de passe"
278278
279−#: qml/Notifications/NotificationMenuItemFactory.qml:124
280−msgid "Enter SIM PIN"
281−msgstr "Entrez le code PIN de la SIM"
282−
283−#: qml/Notifications/NotificationMenuItemFactory.qml:125
284−msgid "Sorry, incorrect PIN"
285−msgstr "Désolé, code PIN incorrect"
286−
287279#: qml/Panel/ActiveCallHint.qml:77
288280msgid "Tap to return to call..."
289281msgstr "Appuyez pour revenir à l'appel…"
@@ -328,49 +320,49 @@ msgstr "Déverrouiller la carte SIM"
328320msgid "Roaming"
329321msgstr "Roaming"
330322
331−#: qml/Shell.qml:340
323+#: qml/Shell.qml:346
332324msgid "Enter passphrase"
333325msgstr "Saisissez la phrase de passe"
334326
335−#: qml/Shell.qml:341
327+#: qml/Shell.qml:347
336328msgid "Sorry, incorrect passphrase"
337329msgstr "Désolé, phrase secrète incorrecte"
338330
339−#: qml/Shell.qml:342
331+#: qml/Shell.qml:348
340332msgid "Please re-enter"
341333msgstr "Veuillez ressaisir"
342334
343−#: qml/Shell.qml:344
335+#: qml/Shell.qml:350
344336msgid "Enter passcode"
345337msgstr "Saisissez le mot de passe"
346338
347−#: qml/Shell.qml:345
339+#: qml/Shell.qml:351
348340msgid "Sorry, incorrect passcode"
349341msgstr "Désolé, code incorrect"
350342
351−#: qml/Shell.qml:348
343+#: qml/Shell.qml:354
352344#, qt-format
353345msgid "Enter %1"
354346msgstr "Saisissez %1"
355347
356−#: qml/Shell.qml:349
348+#: qml/Shell.qml:355
357349#, qt-format
358350msgid "Sorry, incorrect %1"
359351msgstr "Désolé, %1 incorrect"
360352
361−#: qml/Shell.qml:384
353+#: qml/Shell.qml:390
362354msgid "Sorry, incorrect passphrase."
363355msgstr "Désolé, phrase secrète incorrecte."
364356
365−#: qml/Shell.qml:385
357+#: qml/Shell.qml:391
366358msgid "Sorry, incorrect passcode."
367359msgstr "Désolé, code incorrect."
368360
369−#: qml/Shell.qml:386
361+#: qml/Shell.qml:392
370362msgid "This will be your last attempt."
371363msgstr "Ceci sera votre dernière tentative."
372364
373−#: qml/Shell.qml:388
365+#: qml/Shell.qml:394
374366msgid ""
375367"If passphrase is entered incorrectly, your phone will conduct a factory "
376368"reset and all personal data will be deleted."
@@ -379,7 +371,7 @@ msgstr ""
379371"effectuera une réinitialisation aux paramètres d'usine et toutes les données "
380372"personnelles seront supprimées."
381373
382−#: qml/Shell.qml:389
374+#: qml/Shell.qml:395
383375msgid ""
384376"If passcode is entered incorrectly, your phone will conduct a factory reset "
385377"and all personal data will be deleted."
@@ -388,28 +380,8 @@ msgstr ""
388380"réinitialisation aux paramètres d'usine et toutes les données personnelles "
389381"seront supprimées."
390382
391−#~ msgid "Hello"
392−#~ msgstr "Bonjour"
393−
394−#, qt-format
395−#~ msgid "Hello %1"
396−#~ msgstr "Bonjour %1"
397−
398−#~ msgid "Swipe to unlock"
399−#~ msgstr "Faites glisser pour déverrouiller"
400−
401−#~ msgid "Please wait"
402−#~ msgstr "Veuillez patienter"
403−
404−#~ msgid "Too many incorrect attempts"
405−#~ msgstr "Trop de tentatives incorrectes"
406−
407−#, qt-format
408−#~ msgid "Enter your %1"
409−#~ msgstr "Saisissez votre %1"
410−
411−#~ msgid "Enter your passphrase"
412−#~ msgstr "Entrez votre phrase secrète"
383+#~ msgid "Sorry, incorrect PIN"
384+#~ msgstr "Désolé, code PIN incorrect"
413385
414−#~ msgid "Enter your passcode"
415−#~ msgstr "Entrez votre code"
386+#~ msgid "Enter SIM PIN"
387+#~ msgstr "Entrez le code PIN de la SIM"
po/gd.po+27−55
@@ -7,8 +7,8 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-03 19:54+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-09 18:09+0000\n"
1212"Last-Translator: GunChleoc <Unknown>\n"
1313"Language-Team: Fòram na Gàidhlig\n"
1414"MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
1818"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121"Language: gd\n"
2222
@@ -170,23 +170,23 @@ msgstr ""
170170"Fhuair thu air na gluasadan oire ceart a dhèanamh a-nis agus is urrainn dhut "
171171"am fòn a chleachdadh<br><br>Thoir gnogag air an sgrìn airson tòiseachadh"
172172
173−#: qml/Components/Lockscreen.qml:218
173+#: qml/Components/Lockscreen.qml:220
174174msgid "Emergency Call"
175175msgstr "Gairm èiginn"
176176
177−#: qml/Components/Lockscreen.qml:250
177+#: qml/Components/Lockscreen.qml:252
178178msgid "OK"
179179msgstr "Ceart ma-thà"
180180
181−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
181+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
182182msgid "See less"
183183msgstr "Seall nas lugha"
184184
185−#: qml/Dash/GenericScopeView.qml:411
185+#: qml/Dash/GenericScopeView.qml:434
186186msgid "See all"
187187msgstr "Seall na h-uile"
188188
189−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
189+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
190190#: qml/Panel/SearchIndicator.qml:27
191191msgid "Search"
192192msgstr "Lorg"
@@ -225,11 +225,11 @@ msgstr "Cuir"
225225
226226#: qml/Dash/PullToRefreshScopeStyle.qml:55
227227msgid "Pull to refresh…"
228−msgstr ""
228+msgstr "Tarraing airson ath-nuadhachadh…"
229229
230230#: qml/Dash/PullToRefreshScopeStyle.qml:60
231231msgid "Release to refresh…"
232−msgstr ""
232+msgstr "Leig às airson ath-nuadhachadh…"
233233
234234#: qml/Dash/ScopesOverview.qml:206
235235msgid "Manage Scopes"
@@ -275,18 +275,10 @@ msgstr "Can rud a-nis..."
275275msgid "Speaking..."
276276msgstr "A' bruidhinn..."
277277
278−#: qml/Notifications/NotificationMenuItemFactory.qml:108
278+#: qml/Notifications/NotificationMenuItemFactory.qml:116
279279msgid "Show password"
280280msgstr "Seall am facal-faire"
281281
282−#: qml/Notifications/NotificationMenuItemFactory.qml:124
283−msgid "Enter SIM PIN"
284−msgstr "Cuir a-steach PIN an t-SIM"
285−
286−#: qml/Notifications/NotificationMenuItemFactory.qml:125
287−msgid "Sorry, incorrect PIN"
288−msgstr "Duilich ach tha a' PIN cearr"
289−
290282#: qml/Panel/ActiveCallHint.qml:77
291283msgid "Tap to return to call..."
292284msgstr "Gnog gus tilleadh dhan ghairm..."
@@ -331,49 +323,49 @@ msgstr "Thoir a' ghlas far an SIM"
331323msgid "Roaming"
332324msgstr "Air fàrsan"
333325
334−#: qml/Shell.qml:340
326+#: qml/Shell.qml:346
335327msgid "Enter passphrase"
336328msgstr "Cuir abairt-fhaire a-steach"
337329
338−#: qml/Shell.qml:341
330+#: qml/Shell.qml:347
339331msgid "Sorry, incorrect passphrase"
340332msgstr "Duilich ach tha an abairt-fhaire cearr"
341333
342−#: qml/Shell.qml:342
334+#: qml/Shell.qml:348
343335msgid "Please re-enter"
344336msgstr "Cuir a-steach e a-rithist"
345337
346−#: qml/Shell.qml:344
338+#: qml/Shell.qml:350
347339msgid "Enter passcode"
348340msgstr "Cuir còd-faire a-steach"
349341
350−#: qml/Shell.qml:345
342+#: qml/Shell.qml:351
351343msgid "Sorry, incorrect passcode"
352344msgstr "Duilich ach tha an còd-faire cearr"
353345
354−#: qml/Shell.qml:348
346+#: qml/Shell.qml:354
355347#, qt-format
356348msgid "Enter %1"
357349msgstr "Cuir a-steach %1"
358350
359−#: qml/Shell.qml:349
351+#: qml/Shell.qml:355
360352#, qt-format
361353msgid "Sorry, incorrect %1"
362354msgstr "Duilich ach tha a' %1 cearr"
363355
364−#: qml/Shell.qml:384
356+#: qml/Shell.qml:390
365357msgid "Sorry, incorrect passphrase."
366358msgstr "Duilich ach tha an abairt-fhaire cearr."
367359
368−#: qml/Shell.qml:385
360+#: qml/Shell.qml:391
369361msgid "Sorry, incorrect passcode."
370362msgstr "Duilich ach tha an còd-faire cearr."
371363
372−#: qml/Shell.qml:386
364+#: qml/Shell.qml:392
373365msgid "This will be your last attempt."
374366msgstr "Seo an oidhirp mu dheireadh agad."
375367
376−#: qml/Shell.qml:388
368+#: qml/Shell.qml:394
377369msgid ""
378370"If passphrase is entered incorrectly, your phone will conduct a factory "
379371"reset and all personal data will be deleted."
@@ -382,7 +374,7 @@ msgstr ""
382374"ath-shuidheachadh air roghainnean an fhactaraidh agus thèid gach dàta "
383375"pearsanta a sguabadh às."
384376
385−#: qml/Shell.qml:389
377+#: qml/Shell.qml:395
386378msgid ""
387379"If passcode is entered incorrectly, your phone will conduct a factory reset "
388380"and all personal data will be deleted."
@@ -391,28 +383,8 @@ msgstr ""
391383"shuidheachadh air roghainnean an fhactaraidh agus thèid gach dàta pearsanta "
392384"a sguabadh às."
393385
394−#, qt-format
395−#~ msgid "Hello %1"
396−#~ msgstr "Shin thu, %1"
397−
398−#~ msgid "Hello"
399−#~ msgstr "Shin thu"
400−
401−#~ msgid "Swipe to unlock"
402−#~ msgstr "Dèan grad-shlaighdeadh gus a' ghlas a thoirt dheth"
403−
404−#~ msgid "Please wait"
405−#~ msgstr "Fuirich ort"
406−
407−#~ msgid "Too many incorrect attempts"
408−#~ msgstr "Cus oidhirpean leis nach do shoirbhich"
386+#~ msgid "Enter SIM PIN"
387+#~ msgstr "Cuir a-steach PIN an t-SIM"
409388
410−#~ msgid "Enter your passphrase"
411−#~ msgstr "Cuir an abairt-fhaire agad a-steach"
412−
413−#~ msgid "Enter your passcode"
414−#~ msgstr "Cuir an còd-faire agad a-steach"
415−
416−#, qt-format
417−#~ msgid "Enter your %1"
418−#~ msgstr "Cuir a-steach a' %1 agad"
389+#~ msgid "Sorry, incorrect PIN"
390+#~ msgstr "Duilich ach tha a' PIN cearr"
po/gl.po+27−55
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-03 04:55+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-07 10:01+0000\n"
1212"Last-Translator: Marcos Lans <Unknown>\n"
1313"Language-Team: Galician <gl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -156,23 +156,23 @@ msgstr ""
156156"Agora xa domina os xestos dos bordos e pode comezar a usar o "
157157"teléfono<br><br>Toque na pantalla para comezar"
158158
159−#: qml/Components/Lockscreen.qml:218
159+#: qml/Components/Lockscreen.qml:220
160160msgid "Emergency Call"
161161msgstr "Chamada de emerxencia"
162162
163−#: qml/Components/Lockscreen.qml:250
163+#: qml/Components/Lockscreen.qml:252
164164msgid "OK"
165165msgstr "Aceptar"
166166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
167+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168168msgid "See less"
169169msgstr "Ver menos"
170170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:434
172172msgid "See all"
173173msgstr "Ver todo"
174174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176176#: qml/Panel/SearchIndicator.qml:27
177177msgid "Search"
178178msgstr "Buscar"
@@ -211,11 +211,11 @@ msgstr "Enviar"
211211
212212#: qml/Dash/PullToRefreshScopeStyle.qml:55
213213msgid "Pull to refresh…"
214−msgstr ""
214+msgstr "Tirar para actualizar..."
215215
216216#: qml/Dash/PullToRefreshScopeStyle.qml:60
217217msgid "Release to refresh…"
218−msgstr ""
218+msgstr "Soltar para actualizar"
219219
220220#: qml/Dash/ScopesOverview.qml:206
221221msgid "Manage Scopes"
@@ -261,18 +261,10 @@ msgstr "Fale agora…"
261261msgid "Speaking..."
262262msgstr "Falando…"
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:108
264+#: qml/Notifications/NotificationMenuItemFactory.qml:116
265265msgid "Show password"
266266msgstr "Mostrar contrasinal"
267267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:124
269−msgid "Enter SIM PIN"
270−msgstr "Introduza o PIN da SIM"
271−
272−#: qml/Notifications/NotificationMenuItemFactory.qml:125
273−msgid "Sorry, incorrect PIN"
274−msgstr "Sentímolo, o PIN é incorrecto"
275−
276268#: qml/Panel/ActiveCallHint.qml:77
277269msgid "Tap to return to call..."
278270msgstr "Toque para volver a chamar..."
@@ -317,49 +309,49 @@ msgstr "Desbloquear a SIM"
317309msgid "Roaming"
318310msgstr "Itinerancia"
319311
320−#: qml/Shell.qml:340
312+#: qml/Shell.qml:346
321313msgid "Enter passphrase"
322314msgstr "Introduza a frase secreta"
323315
324−#: qml/Shell.qml:341
316+#: qml/Shell.qml:347
325317msgid "Sorry, incorrect passphrase"
326318msgstr "Sentímolo a frase é incorrecta"
327319
328−#: qml/Shell.qml:342
320+#: qml/Shell.qml:348
329321msgid "Please re-enter"
330322msgstr "Introducir de novo"
331323
332−#: qml/Shell.qml:344
324+#: qml/Shell.qml:350
333325msgid "Enter passcode"
334326msgstr "Introduza a clave"
335327
336−#: qml/Shell.qml:345
328+#: qml/Shell.qml:351
337329msgid "Sorry, incorrect passcode"
338330msgstr "Sentímolo, a clave é incorrecta"
339331
340−#: qml/Shell.qml:348
332+#: qml/Shell.qml:354
341333#, qt-format
342334msgid "Enter %1"
343335msgstr "Introducir %1"
344336
345−#: qml/Shell.qml:349
337+#: qml/Shell.qml:355
346338#, qt-format
347339msgid "Sorry, incorrect %1"
348340msgstr "Sentímolo, %1 non coincide"
349341
350−#: qml/Shell.qml:384
342+#: qml/Shell.qml:390
351343msgid "Sorry, incorrect passphrase."
352344msgstr "Sentímolo a frase é incorrecta."
353345
354−#: qml/Shell.qml:385
346+#: qml/Shell.qml:391
355347msgid "Sorry, incorrect passcode."
356348msgstr "Sentímolo, a clave é incorrecta."
357349
358−#: qml/Shell.qml:386
350+#: qml/Shell.qml:392
359351msgid "This will be your last attempt."
360352msgstr "Este será o seu último intento."
361353
362−#: qml/Shell.qml:388
354+#: qml/Shell.qml:394
363355msgid ""
364356"If passphrase is entered incorrectly, your phone will conduct a factory "
365357"reset and all personal data will be deleted."
@@ -367,7 +359,7 @@ msgstr ""
367359"Se a frase de paso introducida é incorrecta, o teléfono restabelecerá os "
368360"valores de fábrica e perderá todos os datos persoais."
369361
370−#: qml/Shell.qml:389
362+#: qml/Shell.qml:395
371363msgid ""
372364"If passcode is entered incorrectly, your phone will conduct a factory reset "
373365"and all personal data will be deleted."
@@ -375,28 +367,8 @@ msgstr ""
375367"Se a clave introducida é incorrecta, o teléfono restabelecerá os valores de "
376368"fábrica e perderá todos os datos persoais."
377369
378−#, qt-format
379−#~ msgid "Hello %1"
380−#~ msgstr "Ola %1"
381−
382−#~ msgid "Hello"
383−#~ msgstr "Ola"
384−
385−#~ msgid "Swipe to unlock"
386−#~ msgstr "Esvare o dedo para desbloquear"
387−
388−#~ msgid "Please wait"
389−#~ msgstr "Agarde"
390−
391−#~ msgid "Too many incorrect attempts"
392−#~ msgstr "Demasiados erros"
393−
394−#, qt-format
395−#~ msgid "Enter your %1"
396−#~ msgstr "Introducir %1"
397−
398−#~ msgid "Enter your passcode"
399−#~ msgstr "Introduza a clave"
370+#~ msgid "Sorry, incorrect PIN"
371+#~ msgstr "Sentímolo, o PIN é incorrecto"
400372
401−#~ msgid "Enter your passphrase"
402−#~ msgstr "Introduza a frase secreta"
373+#~ msgid "Enter SIM PIN"
374+#~ msgstr "Introduza o PIN da SIM"
po/he.po+20−47
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-08-23 14:19+0000\n"
1212"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
1313"Language-Team: Hebrew <he@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -154,23 +154,23 @@ msgstr ""
154154"ברגעים אלו סיימת את התמחותך בשימוש במחוות קצה והטלפון פתוח לשימושך<br><br>נא "
155155"לגעת במסך כדי להתחיל"
156156
157−#: qml/Components/Lockscreen.qml:218
157+#: qml/Components/Lockscreen.qml:220
158158msgid "Emergency Call"
159159msgstr "שיחת חירום"
160160
161−#: qml/Components/Lockscreen.qml:250
161+#: qml/Components/Lockscreen.qml:252
162162msgid "OK"
163163msgstr "אישור"
164164
165−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
165+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
166166msgid "See less"
167167msgstr "לראות פחות"
168168
169−#: qml/Dash/GenericScopeView.qml:411
169+#: qml/Dash/GenericScopeView.qml:434
170170msgid "See all"
171171msgstr "להציג הכול"
172172
173−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
173+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
174174#: qml/Panel/SearchIndicator.qml:27
175175msgid "Search"
176176msgstr "חיפוש"
@@ -259,18 +259,10 @@ msgstr "יש לדבר כעת..."
259259msgid "Speaking..."
260260msgstr "הדיבור מושמע…"
261261
262−#: qml/Notifications/NotificationMenuItemFactory.qml:108
262+#: qml/Notifications/NotificationMenuItemFactory.qml:116
263263msgid "Show password"
264264msgstr "הצגת הססמה"
265265
266−#: qml/Notifications/NotificationMenuItemFactory.qml:124
267−msgid "Enter SIM PIN"
268−msgstr ""
269−
270−#: qml/Notifications/NotificationMenuItemFactory.qml:125
271−msgid "Sorry, incorrect PIN"
272−msgstr ""
273−
274266#: qml/Panel/ActiveCallHint.qml:77
275267msgid "Tap to return to call..."
276268msgstr "יש לגעת כדי להחזיר שיחה…"
@@ -315,75 +307,56 @@ msgstr ""
315307msgid "Roaming"
316308msgstr "נדידה"
317309
318−#: qml/Shell.qml:340
310+#: qml/Shell.qml:346
319311msgid "Enter passphrase"
320312msgstr ""
321313
322−#: qml/Shell.qml:341
314+#: qml/Shell.qml:347
323315msgid "Sorry, incorrect passphrase"
324316msgstr "מילת הצופן שגויה, עמך הסליחה."
325317
326−#: qml/Shell.qml:342
318+#: qml/Shell.qml:348
327319msgid "Please re-enter"
328320msgstr ""
329321
330−#: qml/Shell.qml:344
322+#: qml/Shell.qml:350
331323msgid "Enter passcode"
332324msgstr ""
333325
334−#: qml/Shell.qml:345
326+#: qml/Shell.qml:351
335327msgid "Sorry, incorrect passcode"
336328msgstr ""
337329
338−#: qml/Shell.qml:348
330+#: qml/Shell.qml:354
339331#, qt-format
340332msgid "Enter %1"
341333msgstr ""
342334
343−#: qml/Shell.qml:349
335+#: qml/Shell.qml:355
344336#, qt-format
345337msgid "Sorry, incorrect %1"
346338msgstr ""
347339
348−#: qml/Shell.qml:384
340+#: qml/Shell.qml:390
349341msgid "Sorry, incorrect passphrase."
350342msgstr "מילת הצופן שגויה, עמך הסליחה."
351343
352−#: qml/Shell.qml:385
344+#: qml/Shell.qml:391
353345msgid "Sorry, incorrect passcode."
354346msgstr "הצופן שגוי, עם הסליחה."
355347
356−#: qml/Shell.qml:386
348+#: qml/Shell.qml:392
357349msgid "This will be your last attempt."
358350msgstr "זה יהיה הניסיון האחרון שלך."
359351
360−#: qml/Shell.qml:388
352+#: qml/Shell.qml:394
361353msgid ""
362354"If passphrase is entered incorrectly, your phone will conduct a factory "
363355"reset and all personal data will be deleted."
364356msgstr ""
365357
366−#: qml/Shell.qml:389
358+#: qml/Shell.qml:395
367359msgid ""
368360"If passcode is entered incorrectly, your phone will conduct a factory reset "
369361"and all personal data will be deleted."
370362msgstr ""
371−
372−#, qt-format
373−#~ msgid "Hello %1"
374−#~ msgstr "שלום %1"
375−
376−#~ msgid "Hello"
377−#~ msgstr "שלום"
378−
379−#~ msgid "Swipe to unlock"
380−#~ msgstr "יש להחליק לפתיחה"
381−
382−#~ msgid "Please wait"
383−#~ msgstr "נא להמתין"
384−
385−#~ msgid "Enter your passphrase"
386−#~ msgstr "נא להזין את מילת הצופן שלך"
387−
388−#~ msgid "Too many incorrect attempts"
389−#~ msgstr "יותר מדי ניסיונות שגויים"
po/hi.po+20−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-01-15 01:49+0000\n"
1212"Last-Translator: Siddhanathan S. <Unknown>\n"
1313"Language-Team: Hindi <hi@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr "आपातकालीन कॉल"
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "खोजें"
@@ -257,18 +257,10 @@ msgstr "अब बात करें"
257257msgid "Speaking..."
258258msgstr "अब बोल रहे हैं"
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,59 +305,56 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
368360msgstr ""
369−
370−#~ msgid "Hello"
371−#~ msgstr "नमस्ते"
po/hr.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2013-06-27 04:14+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Croatian <hr@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -153,23 +153,23 @@ msgid ""
153153"phone<br><br>Tap on the screen to start"
154154msgstr ""
155155
156−#: qml/Components/Lockscreen.qml:218
156+#: qml/Components/Lockscreen.qml:220
157157msgid "Emergency Call"
158158msgstr ""
159159
160−#: qml/Components/Lockscreen.qml:250
160+#: qml/Components/Lockscreen.qml:252
161161msgid "OK"
162162msgstr ""
163163
164−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
164+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
165165msgid "See less"
166166msgstr ""
167167
168−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:434
169169msgid "See all"
170170msgstr ""
171171
172−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
173173#: qml/Panel/SearchIndicator.qml:27
174174msgid "Search"
175175msgstr "Pretraživanje"
@@ -258,18 +258,10 @@ msgstr "Recite..."
258258msgid "Speaking..."
259259msgstr "Govor..."
260260
261−#: qml/Notifications/NotificationMenuItemFactory.qml:108
261+#: qml/Notifications/NotificationMenuItemFactory.qml:116
262262msgid "Show password"
263263msgstr ""
264264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:124
266−msgid "Enter SIM PIN"
267−msgstr ""
268−
269−#: qml/Notifications/NotificationMenuItemFactory.qml:125
270−msgid "Sorry, incorrect PIN"
271−msgstr ""
272−
273265#: qml/Panel/ActiveCallHint.qml:77
274266msgid "Tap to return to call..."
275267msgstr ""
@@ -314,55 +306,55 @@ msgstr ""
314306msgid "Roaming"
315307msgstr ""
316308
317−#: qml/Shell.qml:340
309+#: qml/Shell.qml:346
318310msgid "Enter passphrase"
319311msgstr ""
320312
321−#: qml/Shell.qml:341
313+#: qml/Shell.qml:347
322314msgid "Sorry, incorrect passphrase"
323315msgstr ""
324316
325−#: qml/Shell.qml:342
317+#: qml/Shell.qml:348
326318msgid "Please re-enter"
327319msgstr ""
328320
329−#: qml/Shell.qml:344
321+#: qml/Shell.qml:350
330322msgid "Enter passcode"
331323msgstr ""
332324
333−#: qml/Shell.qml:345
325+#: qml/Shell.qml:351
334326msgid "Sorry, incorrect passcode"
335327msgstr ""
336328
337−#: qml/Shell.qml:348
329+#: qml/Shell.qml:354
338330#, qt-format
339331msgid "Enter %1"
340332msgstr ""
341333
342−#: qml/Shell.qml:349
334+#: qml/Shell.qml:355
343335#, qt-format
344336msgid "Sorry, incorrect %1"
345337msgstr ""
346338
347−#: qml/Shell.qml:384
339+#: qml/Shell.qml:390
348340msgid "Sorry, incorrect passphrase."
349341msgstr ""
350342
351−#: qml/Shell.qml:385
343+#: qml/Shell.qml:391
352344msgid "Sorry, incorrect passcode."
353345msgstr ""
354346
355−#: qml/Shell.qml:386
347+#: qml/Shell.qml:392
356348msgid "This will be your last attempt."
357349msgstr ""
358350
359−#: qml/Shell.qml:388
351+#: qml/Shell.qml:394
360352msgid ""
361353"If passphrase is entered incorrectly, your phone will conduct a factory "
362354"reset and all personal data will be deleted."
363355msgstr ""
364356
365−#: qml/Shell.qml:389
357+#: qml/Shell.qml:395
366358msgid ""
367359"If passcode is entered incorrectly, your phone will conduct a factory reset "
368360"and all personal data will be deleted."
po/hu.po+24−58
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-03 10:57+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-11 10:50+0000\n"
1212"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
1313"Language-Team: Hungarian <hu@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-12 06:55+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -158,23 +158,23 @@ msgstr ""
158158"Elsajátította a gesztusokat, és megkezdheti a telefon "
159159"használatát.<br><br>Koppintson a képernyőre a kezdéshez."
160160
161−#: qml/Components/Lockscreen.qml:218
161+#: qml/Components/Lockscreen.qml:220
162162msgid "Emergency Call"
163163msgstr "Vészhívás"
164164
165−#: qml/Components/Lockscreen.qml:250
165+#: qml/Components/Lockscreen.qml:252
166166msgid "OK"
167167msgstr "Ok"
168168
169−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
169+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
170170msgid "See less"
171171msgstr "Kevesebb"
172172
173−#: qml/Dash/GenericScopeView.qml:411
173+#: qml/Dash/GenericScopeView.qml:434
174174msgid "See all"
175175msgstr "Összes megtekintése"
176176
177−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
177+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
178178#: qml/Panel/SearchIndicator.qml:27
179179msgid "Search"
180180msgstr "Keresés"
@@ -213,11 +213,11 @@ msgstr "Küldés"
213213
214214#: qml/Dash/PullToRefreshScopeStyle.qml:55
215215msgid "Pull to refresh…"
216−msgstr ""
216+msgstr "Húzza a frissítéshez…"
217217
218218#: qml/Dash/PullToRefreshScopeStyle.qml:60
219219msgid "Release to refresh…"
220−msgstr ""
220+msgstr "Engedje el a frissítéshez…"
221221
222222#: qml/Dash/ScopesOverview.qml:206
223223msgid "Manage Scopes"
@@ -263,18 +263,10 @@ msgstr "Most beszéljen…"
263263msgid "Speaking..."
264264msgstr "Beszéd…"
265265
266−#: qml/Notifications/NotificationMenuItemFactory.qml:108
266+#: qml/Notifications/NotificationMenuItemFactory.qml:116
267267msgid "Show password"
268268msgstr "Jelszó megjelenítése"
269269
270−#: qml/Notifications/NotificationMenuItemFactory.qml:124
271−msgid "Enter SIM PIN"
272−msgstr "Adja meg a SIM PIN kódját"
273−
274−#: qml/Notifications/NotificationMenuItemFactory.qml:125
275−msgid "Sorry, incorrect PIN"
276−msgstr "Sajnáljuk, helytelen PIN"
277−
278270#: qml/Panel/ActiveCallHint.qml:77
279271msgid "Tap to return to call..."
280272msgstr "Érintse meg, hogy visszatérjen a híváshoz..."
@@ -319,49 +311,49 @@ msgstr "SIM feloldása"
319311msgid "Roaming"
320312msgstr "Barangolás"
321313
322−#: qml/Shell.qml:340
314+#: qml/Shell.qml:346
323315msgid "Enter passphrase"
324316msgstr "Jelmondat megadása"
325317
326−#: qml/Shell.qml:341
318+#: qml/Shell.qml:347
327319msgid "Sorry, incorrect passphrase"
328320msgstr "Sajnáljuk, helytelen jelmondat"
329321
330−#: qml/Shell.qml:342
322+#: qml/Shell.qml:348
331323msgid "Please re-enter"
332−msgstr "Kérjük adja meg újra"
324+msgstr "Kérjük próbálja újra"
333325
334−#: qml/Shell.qml:344
326+#: qml/Shell.qml:350
335327msgid "Enter passcode"
336328msgstr "Jelkód megadása"
337329
338−#: qml/Shell.qml:345
330+#: qml/Shell.qml:351
339331msgid "Sorry, incorrect passcode"
340332msgstr "Sajnáljuk, helytelen jelkód"
341333
342−#: qml/Shell.qml:348
334+#: qml/Shell.qml:354
343335#, qt-format
344336msgid "Enter %1"
345337msgstr "Adja meg: %1"
346338
347−#: qml/Shell.qml:349
339+#: qml/Shell.qml:355
348340#, qt-format
349341msgid "Sorry, incorrect %1"
350342msgstr "Sajnáljuk, helytelen %1"
351343
352−#: qml/Shell.qml:384
344+#: qml/Shell.qml:390
353345msgid "Sorry, incorrect passphrase."
354346msgstr "Sajnáljuk, helytelen jelmondat."
355347
356−#: qml/Shell.qml:385
348+#: qml/Shell.qml:391
357349msgid "Sorry, incorrect passcode."
358350msgstr "Sajnáljuk, helytelen jelkód."
359351
360−#: qml/Shell.qml:386
352+#: qml/Shell.qml:392
361353msgid "This will be your last attempt."
362354msgstr "Ez az utolsó próbálkozási lehetősége."
363355
364−#: qml/Shell.qml:388
356+#: qml/Shell.qml:394
365357msgid ""
366358"If passphrase is entered incorrectly, your phone will conduct a factory "
367359"reset and all personal data will be deleted."
@@ -369,36 +361,10 @@ msgstr ""
369361"Ha helytelen jelmondatot ad meg, a telefonja visszaállítja a gyári "
370362"beállításokat és törli minden személyes adatát."
371363
372−#: qml/Shell.qml:389
364+#: qml/Shell.qml:395
373365msgid ""
374366"If passcode is entered incorrectly, your phone will conduct a factory reset "
375367"and all personal data will be deleted."
376368msgstr ""
377369"Ha helytelen jelkódot ad meg, a telefonja visszaállítja a gyári "
378370"beállításokat és törli minden személyes adatát."
379−
380−#, qt-format
381−#~ msgid "Hello %1"
382−#~ msgstr "Üdv %1"
383−
384−#~ msgid "Swipe to unlock"
385−#~ msgstr "Csúsztasson a feloldáshoz"
386−
387−#~ msgid "Hello"
388−#~ msgstr "Üdvözöljük"
389−
390−#~ msgid "Please wait"
391−#~ msgstr "Kérem várjon"
392−
393−#~ msgid "Too many incorrect attempts"
394−#~ msgstr "Túl sok sikertelen kísérlet"
395−
396−#~ msgid "Enter your passphrase"
397−#~ msgstr "Adja meg a jelmondatot"
398−
399−#, qt-format
400−#~ msgid "Enter your %1"
401−#~ msgstr "Kérjük adja meg: %1"
402−
403−#~ msgid "Enter your passcode"
404−#~ msgstr "Adja meg a jelkódját"
po/hy.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2013-06-27 04:43+0000\n"
1212"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
1313"Language-Team: Armenian <hy@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "Որոնում"
@@ -257,18 +257,10 @@ msgstr "Խոսի՛ր"
257257msgid "Speaking..."
258258msgstr "Խոսում եմ..."
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
po/id.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2013-06-26 22:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Indonesian <id@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257257msgid "Speaking..."
258258msgstr ""
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
po/is.po+32−60
@@ -9,15 +9,15 @@ msgid ""
99msgstr ""
1010"Project-Id-Version: po_unity8-is\n"
1111"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
12−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
13−"PO-Revision-Date: 2014-10-05 08:44+0000\n"
12+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
13+"PO-Revision-Date: 2014-10-09 10:49+0000\n"
1414"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
1515"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
1616"MIME-Version: 1.0\n"
1717"Content-Type: text/plain; charset=UTF-8\n"
1818"Content-Transfer-Encoding: 8bit\n"
1919"Plural-Forms: nplurals=2; plural=n != 1;\n"
20−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
2121"X-Generator: Launchpad (build 17196)\n"
2222"Language: is\n"
2323
@@ -36,7 +36,7 @@ msgstr "Losa flýtilykil"
3636
3737#: qml/Components/DelayedLockscreen.qml:47
3838msgid "Device Locked"
39−msgstr ""
39+msgstr "Tæki læst"
4040
4141#: qml/Components/DelayedLockscreen.qml:62
4242msgid "You have been locked out due to too many failed passphrase attempts."
@@ -50,8 +50,8 @@ msgstr ""
5050#, qt-format
5151msgid "Please wait %1 minute and then try again…"
5252msgid_plural "Please wait %1 minutes and then try again…"
53−msgstr[0] ""
54−msgstr[1] ""
53+msgstr[0] "Bíddu í %1 mínútu og reyndu svo aftur"
54+msgstr[1] "Bíddu í %1 mínútur og reyndu svo aftur"
5555
5656#: qml/Components/Dialogs.qml:70
5757msgid "Log out"
@@ -160,23 +160,23 @@ msgstr ""
160160"Þú ert núna með æfingu í að nota skjáhreyfingar og getur því farið að nota "
161161"símann<br><br>Sláðu létt á skjáinn til að byrja"
162162
163−#: qml/Components/Lockscreen.qml:218
163+#: qml/Components/Lockscreen.qml:220
164164msgid "Emergency Call"
165165msgstr "Neyðarsímtal"
166166
167−#: qml/Components/Lockscreen.qml:250
167+#: qml/Components/Lockscreen.qml:252
168168msgid "OK"
169169msgstr "Í lagi"
170170
171−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
171+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
172172msgid "See less"
173173msgstr "Sjá minna"
174174
175−#: qml/Dash/GenericScopeView.qml:411
175+#: qml/Dash/GenericScopeView.qml:434
176176msgid "See all"
177177msgstr "Sjá allt"
178178
179−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
179+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
180180#: qml/Panel/SearchIndicator.qml:27
181181msgid "Search"
182182msgstr "Leita"
@@ -219,7 +219,7 @@ msgstr ""
219219
220220#: qml/Dash/PullToRefreshScopeStyle.qml:60
221221msgid "Release to refresh…"
222−msgstr ""
222+msgstr "Slepptu til að endurlesa..."
223223
224224#: qml/Dash/ScopesOverview.qml:206
225225msgid "Manage Scopes"
@@ -243,7 +243,7 @@ msgstr "Allt"
243243
244244#: qml/Greeter/Greeter.qml:157
245245msgid "Unlock"
246−msgstr ""
246+msgstr "Aflæsa"
247247
248248#: qml/Hud/HudParametrizedActionsPage.qml:139
249249msgid "Confirm"
@@ -265,18 +265,10 @@ msgstr "Tala núna..."
265265msgid "Speaking..."
266266msgstr "Tala..."
267267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:108
268+#: qml/Notifications/NotificationMenuItemFactory.qml:116
269269msgid "Show password"
270270msgstr "Birta lykilorð"
271271
272−#: qml/Notifications/NotificationMenuItemFactory.qml:124
273−msgid "Enter SIM PIN"
274−msgstr "Settu inn PIN-númer SIM-kortsins"
275−
276−#: qml/Notifications/NotificationMenuItemFactory.qml:125
277−msgid "Sorry, incorrect PIN"
278−msgstr "Því miður, rangt PIN-númer"
279−
280272#: qml/Panel/ActiveCallHint.qml:77
281273msgid "Tap to return to call..."
282274msgstr "Slá til að svara símtali..."
@@ -321,49 +313,49 @@ msgstr "Aflæsa SIM-korti"
321313msgid "Roaming"
322314msgstr "Ráphamur"
323315
324−#: qml/Shell.qml:340
316+#: qml/Shell.qml:346
325317msgid "Enter passphrase"
326318msgstr ""
327319
328−#: qml/Shell.qml:341
320+#: qml/Shell.qml:347
329321msgid "Sorry, incorrect passphrase"
330322msgstr "Því miður, rangt lykilorð"
331323
332−#: qml/Shell.qml:342
324+#: qml/Shell.qml:348
333325msgid "Please re-enter"
334−msgstr ""
326+msgstr "Settu aftur inn"
335327
336−#: qml/Shell.qml:344
328+#: qml/Shell.qml:350
337329msgid "Enter passcode"
338330msgstr ""
339331
340−#: qml/Shell.qml:345
332+#: qml/Shell.qml:351
341333msgid "Sorry, incorrect passcode"
342334msgstr "Því miður, rangur aðgangskóði"
343335
344−#: qml/Shell.qml:348
336+#: qml/Shell.qml:354
345337#, qt-format
346338msgid "Enter %1"
347−msgstr ""
339+msgstr "Settu inn %1"
348340
349−#: qml/Shell.qml:349
341+#: qml/Shell.qml:355
350342#, qt-format
351343msgid "Sorry, incorrect %1"
352344msgstr "Því miður, rangt %1"
353345
354−#: qml/Shell.qml:384
346+#: qml/Shell.qml:390
355347msgid "Sorry, incorrect passphrase."
356348msgstr "Því miður, rangt lykilorð."
357349
358−#: qml/Shell.qml:385
350+#: qml/Shell.qml:391
359351msgid "Sorry, incorrect passcode."
360352msgstr "Því miður, rangur aðgangskóði."
361353
362−#: qml/Shell.qml:386
354+#: qml/Shell.qml:392
363355msgid "This will be your last attempt."
364356msgstr "Þetta mun verða síðasta tilraunin þín."
365357
366−#: qml/Shell.qml:388
358+#: qml/Shell.qml:394
367359msgid ""
368360"If passphrase is entered incorrectly, your phone will conduct a factory "
369361"reset and all personal data will be deleted."
@@ -371,7 +363,7 @@ msgstr ""
371363"Ef lykilorð er rangt, mun síminn frumstilla allt á verksmiðjustillingar og "
372364"öllum einkagögnum verður eytt."
373365
374−#: qml/Shell.qml:389
366+#: qml/Shell.qml:395
375367msgid ""
376368"If passcode is entered incorrectly, your phone will conduct a factory reset "
377369"and all personal data will be deleted."
@@ -379,28 +371,8 @@ msgstr ""
379371"Ef aðgangskóði er rangur, mun síminn frumstilla allt á verksmiðjustillingar "
380372"og öllum einkagögnum verður eytt."
381373
382−#, qt-format
383−#~ msgid "Hello %1"
384−#~ msgstr "Hæ %1"
385−
386−#~ msgid "Hello"
387−#~ msgstr "Hæ"
388−
389−#~ msgid "Swipe to unlock"
390−#~ msgstr "Strjúka til að aflæsa"
391−
392−#~ msgid "Please wait"
393−#~ msgstr "Bíddu aðeins"
374+#~ msgid "Sorry, incorrect PIN"
375+#~ msgstr "Því miður, rangt PIN-númer"
394376
395−#~ msgid "Too many incorrect attempts"
396−#~ msgstr "Of margar rangar tilraunir"
397−
398−#~ msgid "Enter your passphrase"
399−#~ msgstr "Sláðu inn lykilorðið þitt"
400−
401−#~ msgid "Enter your passcode"
402−#~ msgstr "Settu inn aðgangskóðann þinn"
403−
404−#, qt-format
405−#~ msgid "Enter your %1"
406−#~ msgstr "Settu inn %1"
377+#~ msgid "Enter SIM PIN"
378+#~ msgstr "Settu inn PIN-númer SIM-kortsins"
po/it.po+24−52
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"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"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -161,23 +161,23 @@ msgstr ""
161161"L'apprendimento dei gesti è stato completato. È ora possibile iniziare a "
162162"usare il telefono.<br><br>Toccare lo schermo per iniziare"
163163
164−#: qml/Components/Lockscreen.qml:218
164+#: qml/Components/Lockscreen.qml:220
165165msgid "Emergency Call"
166166msgstr "Chiamata di emergenza"
167167
168−#: qml/Components/Lockscreen.qml:250
168+#: qml/Components/Lockscreen.qml:252
169169msgid "OK"
170170msgstr "OK"
171171
172−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
172+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
173173msgid "See less"
174174msgstr "Mostra meno"
175175
176−#: qml/Dash/GenericScopeView.qml:411
176+#: qml/Dash/GenericScopeView.qml:434
177177msgid "See all"
178178msgstr "Mostra tutto"
179179
180−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
180+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
181181#: qml/Panel/SearchIndicator.qml:27
182182msgid "Search"
183183msgstr "Cerca"
@@ -266,18 +266,10 @@ msgstr "Parla ora..."
266266msgid "Speaking..."
267267msgstr "Sto parlando..."
268268
269−#: qml/Notifications/NotificationMenuItemFactory.qml:108
269+#: qml/Notifications/NotificationMenuItemFactory.qml:116
270270msgid "Show password"
271271msgstr "Mostra password"
272272
273−#: qml/Notifications/NotificationMenuItemFactory.qml:124
274−msgid "Enter SIM PIN"
275−msgstr "Inserire il PIN della SIM"
276−
277−#: qml/Notifications/NotificationMenuItemFactory.qml:125
278−msgid "Sorry, incorrect PIN"
279−msgstr "PIN errato"
280−
281273#: qml/Panel/ActiveCallHint.qml:77
282274msgid "Tap to return to call..."
283275msgstr "Tocca per tornare alla chiamata..."
@@ -322,49 +314,49 @@ msgstr "Sblocca SIM"
322314msgid "Roaming"
323315msgstr "Roaming"
324316
325−#: qml/Shell.qml:340
317+#: qml/Shell.qml:346
326318msgid "Enter passphrase"
327319msgstr ""
328320
329−#: qml/Shell.qml:341
321+#: qml/Shell.qml:347
330322msgid "Sorry, incorrect passphrase"
331323msgstr "Passphrase errata"
332324
333−#: qml/Shell.qml:342
325+#: qml/Shell.qml:348
334326msgid "Please re-enter"
335327msgstr ""
336328
337−#: qml/Shell.qml:344
329+#: qml/Shell.qml:350
338330msgid "Enter passcode"
339331msgstr ""
340332
341−#: qml/Shell.qml:345
333+#: qml/Shell.qml:351
342334msgid "Sorry, incorrect passcode"
343335msgstr "Passcode non corretto"
344336
345−#: qml/Shell.qml:348
337+#: qml/Shell.qml:354
346338#, qt-format
347339msgid "Enter %1"
348340msgstr ""
349341
350−#: qml/Shell.qml:349
342+#: qml/Shell.qml:355
351343#, qt-format
352344msgid "Sorry, incorrect %1"
353345msgstr "%1 non corretto"
354346
355−#: qml/Shell.qml:384
347+#: qml/Shell.qml:390
356348msgid "Sorry, incorrect passphrase."
357349msgstr "Passphrase non corretta"
358350
359−#: qml/Shell.qml:385
351+#: qml/Shell.qml:391
360352msgid "Sorry, incorrect passcode."
361353msgstr "Passcode non corretto"
362354
363−#: qml/Shell.qml:386
355+#: qml/Shell.qml:392
364356msgid "This will be your last attempt."
365357msgstr "Questo sarà l'ultimo tentativo."
366358
367−#: qml/Shell.qml:388
359+#: qml/Shell.qml:394
368360msgid ""
369361"If passphrase is entered incorrectly, your phone will conduct a factory "
370362"reset and all personal data will be deleted."
@@ -372,7 +364,7 @@ msgstr ""
372364"Se verrà inserita una passphrase errata, il telefono eseguirà un ripristino "
373365"delle impostazioni di fabbrica e tutti i dati personali verranno eliminati."
374366
375−#: qml/Shell.qml:389
367+#: qml/Shell.qml:395
376368msgid ""
377369"If passcode is entered incorrectly, your phone will conduct a factory reset "
378370"and all personal data will be deleted."
@@ -380,28 +372,8 @@ msgstr ""
380372"Se verrà inserito una passcode errato, il telefono eseguirà un ripristino "
381373"delle impostazioni di fabbrica e tutti i dati personali verranno eliminati."
382374
383−#, qt-format
384−#~ msgid "Hello %1"
385−#~ msgstr "Ciao %1"
386−
387−#~ msgid "Hello"
388−#~ msgstr "Ciao"
389−
390−#~ msgid "Swipe to unlock"
391−#~ msgstr "Scorrere per sbloccare"
392−
393−#~ msgid "Please wait"
394−#~ msgstr "Attendere"
395−
396−#~ msgid "Too many incorrect attempts"
397−#~ msgstr "Troppi tentativi errati"
398−
399−#, qt-format
400−#~ msgid "Enter your %1"
401−#~ msgstr "Inserire %1"
402−
403−#~ msgid "Enter your passphrase"
404−#~ msgstr "Digitare la passphrase"
375+#~ msgid "Sorry, incorrect PIN"
376+#~ msgstr "PIN errato"
405377
406−#~ msgid "Enter your passcode"
407−#~ msgstr "Inserire il passcode"
378+#~ msgid "Enter SIM PIN"
379+#~ msgstr "Inserire il PIN della SIM"
po/ja.po+24−52
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-09-18 09:47+0000\n"
1212"Last-Translator: Mitsuya Shibata <mty.shibata@gmail.com>\n"
1313"Language-Team: Japanese <ja@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -153,23 +153,23 @@ msgid ""
153153msgstr ""
154154"これでスマートフォンの操作に必要な、画面端を用いたジェスチャーを習得できました。<br><br>利用を開始するなら画面をタップしてください"
155155
156−#: qml/Components/Lockscreen.qml:218
156+#: qml/Components/Lockscreen.qml:220
157157msgid "Emergency Call"
158158msgstr "緊急通報"
159159
160−#: qml/Components/Lockscreen.qml:250
160+#: qml/Components/Lockscreen.qml:252
161161msgid "OK"
162162msgstr "OK"
163163
164−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
164+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
165165msgid "See less"
166166msgstr "隠す"
167167
168−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:434
169169msgid "See all"
170170msgstr "すべて表示する"
171171
172−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
173173#: qml/Panel/SearchIndicator.qml:27
174174msgid "Search"
175175msgstr "検索"
@@ -258,18 +258,10 @@ msgstr "音声入力を開始..."
258258msgid "Speaking..."
259259msgstr "入力中..."
260260
261−#: qml/Notifications/NotificationMenuItemFactory.qml:108
261+#: qml/Notifications/NotificationMenuItemFactory.qml:116
262262msgid "Show password"
263263msgstr "パスワードを表示"
264264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:124
266−msgid "Enter SIM PIN"
267−msgstr "SIM PINの入力"
268−
269−#: qml/Notifications/NotificationMenuItemFactory.qml:125
270−msgid "Sorry, incorrect PIN"
271−msgstr "PINが違います"
272−
273265#: qml/Panel/ActiveCallHint.qml:77
274266msgid "Tap to return to call..."
275267msgstr "タップすると通話に戻ります..."
@@ -314,82 +306,62 @@ msgstr "SIMのアンロック"
314306msgid "Roaming"
315307msgstr "ローミング"
316308
317−#: qml/Shell.qml:340
309+#: qml/Shell.qml:346
318310msgid "Enter passphrase"
319311msgstr ""
320312
321−#: qml/Shell.qml:341
313+#: qml/Shell.qml:347
322314msgid "Sorry, incorrect passphrase"
323315msgstr "パスフレーズが違います"
324316
325−#: qml/Shell.qml:342
317+#: qml/Shell.qml:348
326318msgid "Please re-enter"
327319msgstr ""
328320
329−#: qml/Shell.qml:344
321+#: qml/Shell.qml:350
330322msgid "Enter passcode"
331323msgstr ""
332324
333−#: qml/Shell.qml:345
325+#: qml/Shell.qml:351
334326msgid "Sorry, incorrect passcode"
335327msgstr "パスコードが違います"
336328
337−#: qml/Shell.qml:348
329+#: qml/Shell.qml:354
338330#, qt-format
339331msgid "Enter %1"
340332msgstr ""
341333
342−#: qml/Shell.qml:349
334+#: qml/Shell.qml:355
343335#, qt-format
344336msgid "Sorry, incorrect %1"
345337msgstr "%1が違います"
346338
347−#: qml/Shell.qml:384
339+#: qml/Shell.qml:390
348340msgid "Sorry, incorrect passphrase."
349341msgstr "パスフレーズが間違っています。"
350342
351−#: qml/Shell.qml:385
343+#: qml/Shell.qml:391
352344msgid "Sorry, incorrect passcode."
353345msgstr "パスコードが間違っています。"
354346
355−#: qml/Shell.qml:386
347+#: qml/Shell.qml:392
356348msgid "This will be your last attempt."
357349msgstr "これが最後のチャンスです。"
358350
359−#: qml/Shell.qml:388
351+#: qml/Shell.qml:394
360352msgid ""
361353"If passphrase is entered incorrectly, your phone will conduct a factory "
362354"reset and all personal data will be deleted."
363355msgstr "パスフレーズが間違っている場合、ファクトリーリセットを実施し、すべての個人データは削除されます。"
364356
365−#: qml/Shell.qml:389
357+#: qml/Shell.qml:395
366358msgid ""
367359"If passcode is entered incorrectly, your phone will conduct a factory reset "
368360"and all personal data will be deleted."
369361msgstr "パスコードが間違っている場合、ファクトリーリセットを実施し、すべての個人データは削除されます。"
370362
371−#, qt-format
372−#~ msgid "Hello %1"
373−#~ msgstr "こんにちは %1 さん"
374−
375−#~ msgid "Hello"
376−#~ msgstr "こんにちは"
377−
378−#~ msgid "Swipe to unlock"
379−#~ msgstr "スワイプしてロック解除"
380−
381−#~ msgid "Too many incorrect attempts"
382−#~ msgstr "失敗回数が上限に達しました"
383−
384−#~ msgid "Please wait"
385−#~ msgstr "お待ちください"
386−
387−#, qt-format
388−#~ msgid "Enter your %1"
389−#~ msgstr "%1を入力してください"
390−
391−#~ msgid "Enter your passphrase"
392−#~ msgstr "パスフレーズの入力"
363+#~ msgid "Sorry, incorrect PIN"
364+#~ msgstr "PINが違います"
393365
394−#~ msgid "Enter your passcode"
395−#~ msgstr "パスコードの入力"
366+#~ msgid "Enter SIM PIN"
367+#~ msgstr "SIM PINの入力"
po/km.po+24−52
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-08-20 02:48+0000\n"
1212"Last-Translator: Sophea Sok <sksophea@gmail.com>\n"
1313"Language-Team: Khmer <km@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -158,23 +158,23 @@ msgstr ""
158158"ឥឡូវ​អ្នក​បាន​ពិនិត្យ​កាយវិការ​គែម​ "
159159"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ<br><br>ប៉ះ លើ​អេក្រង់​ដើម្បី​ចាប់ផ្ដើម"
160160
161−#: qml/Components/Lockscreen.qml:218
161+#: qml/Components/Lockscreen.qml:220
162162msgid "Emergency Call"
163163msgstr "ការ​ហៅ​ពេល​អាសន្ន"
164164
165−#: qml/Components/Lockscreen.qml:250
165+#: qml/Components/Lockscreen.qml:252
166166msgid "OK"
167167msgstr "យល់ព្រម"
168168
169−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
169+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
170170msgid "See less"
171171msgstr "មើល​តិច​ជាង"
172172
173−#: qml/Dash/GenericScopeView.qml:411
173+#: qml/Dash/GenericScopeView.qml:434
174174msgid "See all"
175175msgstr "មើល​ទាំងអស់"
176176
177−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
177+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
178178#: qml/Panel/SearchIndicator.qml:27
179179msgid "Search"
180180msgstr "ស្វែង​រក"
@@ -263,18 +263,10 @@ msgstr "និយាយ​ឥឡូវ..."
263263msgid "Speaking..."
264264msgstr "កំពុង​និយាយ..."
265265
266−#: qml/Notifications/NotificationMenuItemFactory.qml:108
266+#: qml/Notifications/NotificationMenuItemFactory.qml:116
267267msgid "Show password"
268268msgstr "បង្ហាញ​ពាក្យ​សម្ងាត់"
269269
270−#: qml/Notifications/NotificationMenuItemFactory.qml:124
271−msgid "Enter SIM PIN"
272−msgstr "បញ្ចូល​លេខ​កូដ PIN ស៊ីម"
273−
274−#: qml/Notifications/NotificationMenuItemFactory.qml:125
275−msgid "Sorry, incorrect PIN"
276−msgstr "សូមទោស! លេខ​កូដ PIN មិន​ត្រឹមត្រូវ"
277−
278270#: qml/Panel/ActiveCallHint.qml:77
279271msgid "Tap to return to call..."
280272msgstr "ប៉ះ​ដើម្បី​ត្រឡប់​ទៅ​ការ​ហៅ..."
@@ -319,49 +311,49 @@ msgstr "ដោះ​សោ​ស៊ីម"
319311msgid "Roaming"
320312msgstr "រ៉ូមីង"
321313
322−#: qml/Shell.qml:340
314+#: qml/Shell.qml:346
323315msgid "Enter passphrase"
324316msgstr ""
325317
326−#: qml/Shell.qml:341
318+#: qml/Shell.qml:347
327319msgid "Sorry, incorrect passphrase"
328320msgstr "សូមទោស! ឃ្លា​សម្ងាត់​មិន​ត្រឹមត្រូវ"
329321
330−#: qml/Shell.qml:342
322+#: qml/Shell.qml:348
331323msgid "Please re-enter"
332324msgstr ""
333325
334−#: qml/Shell.qml:344
326+#: qml/Shell.qml:350
335327msgid "Enter passcode"
336328msgstr ""
337329
338−#: qml/Shell.qml:345
330+#: qml/Shell.qml:351
339331msgid "Sorry, incorrect passcode"
340332msgstr "សូមទោស! កូដ​សម្ងាត់​មិន​ត្រឹមត្រូវ"
341333
342−#: qml/Shell.qml:348
334+#: qml/Shell.qml:354
343335#, qt-format
344336msgid "Enter %1"
345337msgstr ""
346338
347−#: qml/Shell.qml:349
339+#: qml/Shell.qml:355
348340#, qt-format
349341msgid "Sorry, incorrect %1"
350342msgstr "សូមទោស! %1 មិន​ត្រឹមត្រូវ"
351343
352−#: qml/Shell.qml:384
344+#: qml/Shell.qml:390
353345msgid "Sorry, incorrect passphrase."
354346msgstr "សូមទោស! ឃ្លា​សម្ងាត់​មិន​ត្រឹមត្រូវ។"
355347
356−#: qml/Shell.qml:385
348+#: qml/Shell.qml:391
357349msgid "Sorry, incorrect passcode."
358350msgstr "សូមទោស! កូដ​សម្ងាត់​មិន​ត្រឹមត្រូវ។"
359351
360−#: qml/Shell.qml:386
352+#: qml/Shell.qml:392
361353msgid "This will be your last attempt."
362354msgstr "នេះ​គឺ​ការ​ព្យាយាម​លើក​ចុងក្រោយ។"
363355
364−#: qml/Shell.qml:388
356+#: qml/Shell.qml:394
365357msgid ""
366358"If passphrase is entered incorrectly, your phone will conduct a factory "
367359"reset and all personal data will be deleted."
@@ -370,7 +362,7 @@ msgstr ""
370362"ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ "
371363"ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
372364
373−#: qml/Shell.qml:389
365+#: qml/Shell.qml:395
374366msgid ""
375367"If passcode is entered incorrectly, your phone will conduct a factory reset "
376368"and all personal data will be deleted."
@@ -379,28 +371,8 @@ msgstr ""
379371"ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ "
380372"ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
381373
382−#, qt-format
383−#~ msgid "Hello %1"
384−#~ msgstr "សួស្ដី %1"
385−
386−#~ msgid "Hello"
387−#~ msgstr "សួស្តី"
388−
389−#~ msgid "Swipe to unlock"
390−#~ msgstr "អូស​ដើម្បី​ដោះសោ"
391−
392−#~ msgid "Please wait"
393−#~ msgstr "សូមរង់ចាំ"
394−
395−#~ msgid "Too many incorrect attempts"
396−#~ msgstr "បាន​ព្យាយាម​ខុស​ច្រើន​ដង​ពេក"
397−
398−#, qt-format
399−#~ msgid "Enter your %1"
400−#~ msgstr "បញ្ចូល %1 របស់​អ្នក"
401−
402−#~ msgid "Enter your passphrase"
403−#~ msgstr "បញ្ចូល​ឃ្លា​សម្ងាត់​របស់​អ្នក"
374+#~ msgid "Sorry, incorrect PIN"
375+#~ msgstr "សូមទោស! លេខ​កូដ PIN មិន​ត្រឹមត្រូវ"
404376
405−#~ msgid "Enter your passcode"
406−#~ msgstr "បញ្ចូល​កូដ​សម្ងាត់​របស់​អ្នក"
377+#~ msgid "Enter SIM PIN"
378+#~ msgstr "បញ្ចូល​លេខ​កូដ PIN ស៊ីម"
po/kn.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2013-06-27 05:43+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Kannada <kn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "ಹುಡುಕು"
@@ -257,18 +257,10 @@ msgstr "ಈಗ ಮಾತನಾಡಿ ..."
257257msgid "Speaking..."
258258msgstr "ಮಾತನಾಡುತಿದ್ದೀರಿ"
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
po/ko.po+24−52
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-08-19 13:02+0000\n"
1212"Last-Translator: MinSik CHO <Unknown>\n"
1313"Language-Team: Korean <ko@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152msgstr ""
153153"여러분은 가장자리에서 끌어오기 제스쳐를 완벽히 익히셨고 휴대 전화를 사용할 수 있습니다. <br><br> 스크린을 터치해서 시작하세요."
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr "긴급 통화"
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr "확인"
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr "간단히 표시"
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr "모두 보기"
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "검색"
@@ -257,18 +257,10 @@ msgstr "지금 말하세요..."
257257msgid "Speaking..."
258258msgstr "말하는 중..."
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr "암호 표시"
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr "심 카드의 개인 식별 번호 입력"
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr "죄송합니다. 개인 식별 번호가 올바르지 않습니다."
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr "통화로 돌아가려면 터치하세요..."
@@ -313,82 +305,62 @@ msgstr "심 카드 잠금 해제"
313305msgid "Roaming"
314306msgstr "로밍"
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr "패스프레이즈를 입력해주십시오."
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr "죄송합니다. 패스프레이즈가 올바르지 않습니다."
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr "다시 입력해주십시오."
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr "패스코드를 입력해주십시오."
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr "죄송합니다. 패스코드가 올바르지 않습니다."
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr "%1 입력"
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr "죄송합니다. %1이(가) 올바르지 않습니다."
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr "올바르지 않은 패스프레이즈입니다."
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr "최송합니다. 패스코드가 올바르지 않습니다."
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr "마지막 시도입니다."
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr "이번에도 올바르지 않은 패스프레이즈를 입력하면 휴대 전화를 공장 초기화하여 모든 개인 정보를 삭제합니다."
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
368360msgstr "이번에도 올바르지 않은 패스코드를 입력하면 휴대 전화를 공장 초기화하여 모든 개인 정보를 삭제합니다."
369361
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "안녕하세요 %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "안녕하세요"
362+#~ msgid "Sorry, incorrect PIN"
363+#~ msgstr "죄송합니다. 개인 식별 번호가 올바르지 않습니다."
376364
377−#~ msgid "Please wait"
378−#~ msgstr "기다려주십시오"
379−
380−#~ msgid "Too many incorrect attempts"
381−#~ msgstr "너무 많이 틀리셨습니다"
382−
383−#~ msgid "Enter your passphrase"
384−#~ msgstr "패스프레이즈를 입력해주십시오."
385−
386−#~ msgid "Enter your passcode"
387−#~ msgstr "패스코드를 입력해주십시오."
388−
389−#~ msgid "Swipe to unlock"
390−#~ msgstr "쓸어서 잠금 해제"
391−
392−#, qt-format
393−#~ msgid "Enter your %1"
394−#~ msgstr "%1을(를) 입력해주십시오."
365+#~ msgid "Enter SIM PIN"
366+#~ msgstr "심 카드의 개인 식별 번호 입력"
po/ku.po+24−52
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-09-10 13:14+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Kurdish <ku@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -155,23 +155,23 @@ msgid ""
155155msgstr ""
156156"Tu tevgerên kêlekê fêr bûyî<br><br>Ji bo destpêkirinê ekranê bipelîne"
157157
158−#: qml/Components/Lockscreen.qml:218
158+#: qml/Components/Lockscreen.qml:220
159159msgid "Emergency Call"
160160msgstr "Lêgerîna Lezgîn"
161161
162−#: qml/Components/Lockscreen.qml:250
162+#: qml/Components/Lockscreen.qml:252
163163msgid "OK"
164164msgstr "BAŞ E"
165165
166−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
167167msgid "See less"
168168msgstr "Hindiktir bibîne"
169169
170−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
171171msgid "See all"
172172msgstr "Tevî bibîne"
173173
174−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
175175#: qml/Panel/SearchIndicator.qml:27
176176msgid "Search"
177177msgstr "Lêgerîn"
@@ -260,18 +260,10 @@ msgstr "Niha biaxive..."
260260msgid "Speaking..."
261261msgstr "Diaxive..."
262262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
264264msgid "Show password"
265265msgstr "Şîfreyê nîşan bide"
266266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:124
268−msgid "Enter SIM PIN"
269−msgstr "PINa SIMê binivîse"
270−
271−#: qml/Notifications/NotificationMenuItemFactory.qml:125
272−msgid "Sorry, incorrect PIN"
273−msgstr "Bibore, PIN çewt e"
274−
275267#: qml/Panel/ActiveCallHint.qml:77
276268msgid "Tap to return to call..."
277269msgstr "Ji bo vegerî lêgerînê bipelîne..."
@@ -316,49 +308,49 @@ msgstr "Kilîda SIMê veke"
316308msgid "Roaming"
317309msgstr "Geriyan"
318310
319−#: qml/Shell.qml:340
311+#: qml/Shell.qml:346
320312msgid "Enter passphrase"
321313msgstr ""
322314
323−#: qml/Shell.qml:341
315+#: qml/Shell.qml:347
324316msgid "Sorry, incorrect passphrase"
325317msgstr "Bibore, parola çewt e"
326318
327−#: qml/Shell.qml:342
319+#: qml/Shell.qml:348
328320msgid "Please re-enter"
329321msgstr ""
330322
331−#: qml/Shell.qml:344
323+#: qml/Shell.qml:350
332324msgid "Enter passcode"
333325msgstr ""
334326
335−#: qml/Shell.qml:345
327+#: qml/Shell.qml:351
336328msgid "Sorry, incorrect passcode"
337329msgstr "Bibore, parola çewrt e"
338330
339−#: qml/Shell.qml:348
331+#: qml/Shell.qml:354
340332#, qt-format
341333msgid "Enter %1"
342334msgstr ""
343335
344−#: qml/Shell.qml:349
336+#: qml/Shell.qml:355
345337#, qt-format
346338msgid "Sorry, incorrect %1"
347339msgstr "Bibore, %1 çewt e"
348340
349−#: qml/Shell.qml:384
341+#: qml/Shell.qml:390
350342msgid "Sorry, incorrect passphrase."
351343msgstr "Bibore, parola çewt e."
352344
353−#: qml/Shell.qml:385
345+#: qml/Shell.qml:391
354346msgid "Sorry, incorrect passcode."
355347msgstr "Bibore, parola çewt e."
356348
357−#: qml/Shell.qml:386
349+#: qml/Shell.qml:392
358350msgid "This will be your last attempt."
359351msgstr "Ev ê ceribandina dawiyê be."
360352
361−#: qml/Shell.qml:388
353+#: qml/Shell.qml:394
362354msgid ""
363355"If passphrase is entered incorrectly, your phone will conduct a factory "
364356"reset and all personal data will be deleted."
@@ -366,7 +358,7 @@ msgstr ""
366358"Eger parola çewt bê nivîsandin, telefona te dê vegere eyarên fabrîkayê û "
367359"hemû daneyên te yên taybet dê bên jêbirin."
368360
369−#: qml/Shell.qml:389
361+#: qml/Shell.qml:395
370362msgid ""
371363"If passcode is entered incorrectly, your phone will conduct a factory reset "
372364"and all personal data will be deleted."
@@ -374,28 +366,8 @@ msgstr ""
374366"Eger parola çewt bê nivîsandin, telefona te dê vegere eyarên fabrîkayê û "
375367"hemû daneyên te yên taybet dê bên jêbirin."
376368
377−#~ msgid "Please wait"
378−#~ msgstr "Tika ye li bendê bimîne"
379−
380−#, qt-format
381−#~ msgid "Hello %1"
382−#~ msgstr "Silav %1"
383−
384−#~ msgid "Hello"
385−#~ msgstr "Silav"
386−
387−#~ msgid "Too many incorrect attempts"
388−#~ msgstr "Te gelek caran ceribandinên çewt kirin"
389−
390−#~ msgid "Swipe to unlock"
391−#~ msgstr "Ji bo vekirinê kaş bike"
392−
393−#~ msgid "Enter your passphrase"
394−#~ msgstr "Parolaya xwe binivîse"
395−
396−#, qt-format
397−#~ msgid "Enter your %1"
398−#~ msgstr "%1a xwe binivîse"
369+#~ msgid "Sorry, incorrect PIN"
370+#~ msgstr "Bibore, PIN çewt e"
399371
400−#~ msgid "Enter your passcode"
401−#~ msgstr "Parolaya xwe binivîse"
372+#~ msgid "Enter SIM PIN"
373+#~ msgstr "PINa SIMê binivîse"
po/ky.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2013-06-27 06:17+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Kirghiz <ky@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "Издөө"
@@ -257,18 +257,10 @@ msgstr "Азыр сүйлөңүз..."
257257msgid "Speaking..."
258258msgstr "Сүйлөнүүдө..."
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
po/lo.po+20−35
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2013-10-02 10:00+0000\n"
1212"Last-Translator: Anousak <anousak@gmail.com>\n"
1313"Language-Team: Lao <lo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "ຊອກຫາ"
@@ -257,18 +257,10 @@ msgstr "ເວົ້າໂລດ"
257257msgid "Speaking..."
258258msgstr "ກໍາລັງເວົ້າ"
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,63 +305,56 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
368360msgstr ""
369−
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "ສະບາຍດີ %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "ສະບາຍດີ"
po/lt.po+20−38
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-05-19 17:15+0000\n"
1212"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
1313"Language-Team: Lithuanian <lt@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"(n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -156,23 +156,23 @@ msgid ""
156156"phone<br><br>Tap on the screen to start"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:218
159+#: qml/Components/Lockscreen.qml:220
160160msgid "Emergency Call"
161161msgstr "Pagalbos skambutis"
162162
163−#: qml/Components/Lockscreen.qml:250
163+#: qml/Components/Lockscreen.qml:252
164164msgid "OK"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
167+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168168msgid "See less"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:434
172172msgid "See all"
173173msgstr ""
174174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176176#: qml/Panel/SearchIndicator.qml:27
177177msgid "Search"
178178msgstr "Paieška"
@@ -261,18 +261,10 @@ msgstr "Kalbėkite..."
261261msgid "Speaking..."
262262msgstr "Kalbama..."
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:108
264+#: qml/Notifications/NotificationMenuItemFactory.qml:116
265265msgid "Show password"
266266msgstr "Rodyti slaptažodį"
267267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:124
269−msgid "Enter SIM PIN"
270−msgstr ""
271−
272−#: qml/Notifications/NotificationMenuItemFactory.qml:125
273−msgid "Sorry, incorrect PIN"
274−msgstr ""
275−
276268#: qml/Panel/ActiveCallHint.qml:77
277269msgid "Tap to return to call..."
278270msgstr ""
@@ -317,66 +309,56 @@ msgstr ""
317309msgid "Roaming"
318310msgstr ""
319311
320−#: qml/Shell.qml:340
312+#: qml/Shell.qml:346
321313msgid "Enter passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:341
316+#: qml/Shell.qml:347
325317msgid "Sorry, incorrect passphrase"
326318msgstr ""
327319
328−#: qml/Shell.qml:342
320+#: qml/Shell.qml:348
329321msgid "Please re-enter"
330322msgstr ""
331323
332−#: qml/Shell.qml:344
324+#: qml/Shell.qml:350
333325msgid "Enter passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:345
328+#: qml/Shell.qml:351
337329msgid "Sorry, incorrect passcode"
338330msgstr ""
339331
340−#: qml/Shell.qml:348
332+#: qml/Shell.qml:354
341333#, qt-format
342334msgid "Enter %1"
343335msgstr ""
344336
345−#: qml/Shell.qml:349
337+#: qml/Shell.qml:355
346338#, qt-format
347339msgid "Sorry, incorrect %1"
348340msgstr ""
349341
350−#: qml/Shell.qml:384
342+#: qml/Shell.qml:390
351343msgid "Sorry, incorrect passphrase."
352344msgstr ""
353345
354−#: qml/Shell.qml:385
346+#: qml/Shell.qml:391
355347msgid "Sorry, incorrect passcode."
356348msgstr ""
357349
358−#: qml/Shell.qml:386
350+#: qml/Shell.qml:392
359351msgid "This will be your last attempt."
360352msgstr ""
361353
362−#: qml/Shell.qml:388
354+#: qml/Shell.qml:394
363355msgid ""
364356"If passphrase is entered incorrectly, your phone will conduct a factory "
365357"reset and all personal data will be deleted."
366358msgstr ""
367359
368−#: qml/Shell.qml:389
360+#: qml/Shell.qml:395
369361msgid ""
370362"If passcode is entered incorrectly, your phone will conduct a factory reset "
371363"and all personal data will be deleted."
372364msgstr ""
373−
374−#, qt-format
375−#~ msgid "Hello %1"
376−#~ msgstr "Laba diena, %1"
377−
378−#~ msgid "Hello"
379−#~ msgstr "Sveiki"
380−
381−#~ msgid "Swipe to unlock"
382−#~ msgstr "Braukite ir atrakinsite"
po/lv.po+22−41
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-08-21 09:46+0000\n"
1212"Last-Translator: Jānis-Marks Gailis <jm-gailis@fai-vianet.fr>\n"
1313"Language-Team: Latvian <lv@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr "Neatliekamās Palīdzības zvans"
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr "LABI"
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr "Redzēt mazāk"
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr "Skatīt visus"
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "Meklēt"
@@ -257,18 +257,10 @@ msgstr "Runajiet Tagad"
257257msgid "Speaking..."
258258msgstr "Runa..."
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr "Rādīt paroli"
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr "Ievadiet SIM PIN"
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,70 +305,59 @@ msgstr "Atbloķēt SIM"
313305msgid "Roaming"
314306msgstr "Viesabonēšana"
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr "Šīs būs jūs pēdējais mēģinājums."
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
368360msgstr ""
369361
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "Sveiki, %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "Sveiki"
376−
377−#, qt-format
378−#~ msgid "Enter your %1"
379−#~ msgstr "Ievadiet jūsu %1"
380−
381−#~ msgid "Please wait"
382−#~ msgstr "Lūdzu, uzgaidiet"
362+#~ msgid "Enter SIM PIN"
363+#~ msgstr "Ievadiet SIM PIN"
po/ml.po+20−35
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2013-11-23 11:44+0000\n"
1212"Last-Translator: ST Alfas <Unknown>\n"
1313"Language-Team: Malayalam <ml@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -154,23 +154,23 @@ msgid ""
154154"phone<br><br>Tap on the screen to start"
155155msgstr ""
156156
157−#: qml/Components/Lockscreen.qml:218
157+#: qml/Components/Lockscreen.qml:220
158158msgid "Emergency Call"
159159msgstr "അടിയന്തിര വിളി"
160160
161−#: qml/Components/Lockscreen.qml:250
161+#: qml/Components/Lockscreen.qml:252
162162msgid "OK"
163163msgstr ""
164164
165−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
165+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
166166msgid "See less"
167167msgstr ""
168168
169−#: qml/Dash/GenericScopeView.qml:411
169+#: qml/Dash/GenericScopeView.qml:434
170170msgid "See all"
171171msgstr ""
172172
173−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
173+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
174174#: qml/Panel/SearchIndicator.qml:27
175175msgid "Search"
176176msgstr "തിരയുക"
@@ -259,18 +259,10 @@ msgstr "ഇപ്പോള്‍ സംസാരിക്കുക..."
259259msgid "Speaking..."
260260msgstr "സംസാരിക്കുന്നു..."
261261
262−#: qml/Notifications/NotificationMenuItemFactory.qml:108
262+#: qml/Notifications/NotificationMenuItemFactory.qml:116
263263msgid "Show password"
264264msgstr "രഹസ്യവാക്ക് കാണിക്കുക"
265265
266−#: qml/Notifications/NotificationMenuItemFactory.qml:124
267−msgid "Enter SIM PIN"
268−msgstr ""
269−
270−#: qml/Notifications/NotificationMenuItemFactory.qml:125
271−msgid "Sorry, incorrect PIN"
272−msgstr ""
273−
274266#: qml/Panel/ActiveCallHint.qml:77
275267msgid "Tap to return to call..."
276268msgstr ""
@@ -315,63 +307,56 @@ msgstr ""
315307msgid "Roaming"
316308msgstr ""
317309
318−#: qml/Shell.qml:340
310+#: qml/Shell.qml:346
319311msgid "Enter passphrase"
320312msgstr ""
321313
322−#: qml/Shell.qml:341
314+#: qml/Shell.qml:347
323315msgid "Sorry, incorrect passphrase"
324316msgstr ""
325317
326−#: qml/Shell.qml:342
318+#: qml/Shell.qml:348
327319msgid "Please re-enter"
328320msgstr ""
329321
330−#: qml/Shell.qml:344
322+#: qml/Shell.qml:350
331323msgid "Enter passcode"
332324msgstr ""
333325
334−#: qml/Shell.qml:345
326+#: qml/Shell.qml:351
335327msgid "Sorry, incorrect passcode"
336328msgstr ""
337329
338−#: qml/Shell.qml:348
330+#: qml/Shell.qml:354
339331#, qt-format
340332msgid "Enter %1"
341333msgstr ""
342334
343−#: qml/Shell.qml:349
335+#: qml/Shell.qml:355
344336#, qt-format
345337msgid "Sorry, incorrect %1"
346338msgstr ""
347339
348−#: qml/Shell.qml:384
340+#: qml/Shell.qml:390
349341msgid "Sorry, incorrect passphrase."
350342msgstr ""
351343
352−#: qml/Shell.qml:385
344+#: qml/Shell.qml:391
353345msgid "Sorry, incorrect passcode."
354346msgstr ""
355347
356−#: qml/Shell.qml:386
348+#: qml/Shell.qml:392
357349msgid "This will be your last attempt."
358350msgstr ""
359351
360−#: qml/Shell.qml:388
352+#: qml/Shell.qml:394
361353msgid ""
362354"If passphrase is entered incorrectly, your phone will conduct a factory "
363355"reset and all personal data will be deleted."
364356msgstr ""
365357
366−#: qml/Shell.qml:389
358+#: qml/Shell.qml:395
367359msgid ""
368360"If passcode is entered incorrectly, your phone will conduct a factory reset "
369361"and all personal data will be deleted."
370362msgstr ""
371−
372−#, qt-format
373−#~ msgid "Hello %1"
374−#~ msgstr "ഹലോ %1"
375−
376−#~ msgid "Hello"
377−#~ msgstr "ഹലോ"
po/mr.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-01-14 19:54+0000\n"
1212"Last-Translator: Rohan Deshmukh <Unknown>\n"
1313"Language-Team: Marathi <mr@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257257msgid "Speaking..."
258258msgstr ""
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
po/ms.po+20−35
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-01-17 09:05+0000\n"
1212"Last-Translator: abuyop <Unknown>\n"
1313"Language-Team: Malay <ms@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr "panggilan Kecemasan"
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "Gelintar"
@@ -257,18 +257,10 @@ msgstr "Cakap Sekarang..."
257257msgid "Speaking..."
258258msgstr "Bercakap..."
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr "Tunjuk kata laluan"
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,63 +305,56 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
368360msgstr ""
369−
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "Hai %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "Hello"
po/my.po+20−35
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2013-12-12 11:12+0000\n"
1212"Last-Translator: Pyae Sone <Unknown>\n"
1313"Language-Team: Burmese <my@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr "အရေးပေါ်ခေါ်မည်"
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "ရှာဖွေ"
@@ -257,18 +257,10 @@ msgstr "ယခုပြောပါ"
257257msgid "Speaking..."
258258msgstr "ပြောနေသည်"
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr "စကားဝှက်ကိုပြ"
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,63 +305,56 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
368360msgstr ""
369−
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "ဟဲလို %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "ဟဲလို"
po/nb.po+27−55
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-03 08:44+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-07 10: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"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -158,23 +158,23 @@ msgstr ""
158158"Du har nå mestret kantbevegelsene, og er klar til å bruke "
159159"telefonen<br><br>Trykk på skjermen for å begynne"
160160
161−#: qml/Components/Lockscreen.qml:218
161+#: qml/Components/Lockscreen.qml:220
162162msgid "Emergency Call"
163163msgstr "Nødanrop"
164164
165−#: qml/Components/Lockscreen.qml:250
165+#: qml/Components/Lockscreen.qml:252
166166msgid "OK"
167167msgstr "OK"
168168
169−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
169+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
170170msgid "See less"
171171msgstr "Vis mindre"
172172
173−#: qml/Dash/GenericScopeView.qml:411
173+#: qml/Dash/GenericScopeView.qml:434
174174msgid "See all"
175175msgstr "Vis alt"
176176
177−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
177+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
178178#: qml/Panel/SearchIndicator.qml:27
179179msgid "Search"
180180msgstr "Søk"
@@ -213,11 +213,11 @@ msgstr "Send"
213213
214214#: qml/Dash/PullToRefreshScopeStyle.qml:55
215215msgid "Pull to refresh…"
216−msgstr ""
216+msgstr "Dra for å oppdatere …"
217217
218218#: qml/Dash/PullToRefreshScopeStyle.qml:60
219219msgid "Release to refresh…"
220−msgstr ""
220+msgstr "Slipp for å oppdatere …"
221221
222222#: qml/Dash/ScopesOverview.qml:206
223223msgid "Manage Scopes"
@@ -263,18 +263,10 @@ msgstr "Snakk nå …"
263263msgid "Speaking..."
264264msgstr "Snakker …"
265265
266−#: qml/Notifications/NotificationMenuItemFactory.qml:108
266+#: qml/Notifications/NotificationMenuItemFactory.qml:116
267267msgid "Show password"
268268msgstr "Vis passord"
269269
270−#: qml/Notifications/NotificationMenuItemFactory.qml:124
271−msgid "Enter SIM PIN"
272−msgstr "Tast SIM-kortets PIN-kode"
273−
274−#: qml/Notifications/NotificationMenuItemFactory.qml:125
275−msgid "Sorry, incorrect PIN"
276−msgstr "Feil PIN"
277−
278270#: qml/Panel/ActiveCallHint.qml:77
279271msgid "Tap to return to call..."
280272msgstr "Trykk for å gå tilbake til anrop …"
@@ -319,49 +311,49 @@ msgstr "Lås opp SIM"
319311msgid "Roaming"
320312msgstr "Fremmednett"
321313
322−#: qml/Shell.qml:340
314+#: qml/Shell.qml:346
323315msgid "Enter passphrase"
324316msgstr "Skriv inn passordfrase"
325317
326−#: qml/Shell.qml:341
318+#: qml/Shell.qml:347
327319msgid "Sorry, incorrect passphrase"
328320msgstr "Feil passordfrase"
329321
330−#: qml/Shell.qml:342
322+#: qml/Shell.qml:348
331323msgid "Please re-enter"
332324msgstr "Skriv inn på nytt"
333325
334−#: qml/Shell.qml:344
326+#: qml/Shell.qml:350
335327msgid "Enter passcode"
336328msgstr "Tast kode"
337329
338−#: qml/Shell.qml:345
330+#: qml/Shell.qml:351
339331msgid "Sorry, incorrect passcode"
340332msgstr "Feil kode"
341333
342−#: qml/Shell.qml:348
334+#: qml/Shell.qml:354
343335#, qt-format
344336msgid "Enter %1"
345337msgstr "Skriv inn %1"
346338
347−#: qml/Shell.qml:349
339+#: qml/Shell.qml:355
348340#, qt-format
349341msgid "Sorry, incorrect %1"
350342msgstr "Feil %1"
351343
352−#: qml/Shell.qml:384
344+#: qml/Shell.qml:390
353345msgid "Sorry, incorrect passphrase."
354346msgstr "Feil passordfrase."
355347
356−#: qml/Shell.qml:385
348+#: qml/Shell.qml:391
357349msgid "Sorry, incorrect passcode."
358350msgstr "Feil kode."
359351
360−#: qml/Shell.qml:386
352+#: qml/Shell.qml:392
361353msgid "This will be your last attempt."
362354msgstr "Dette er ditt siste forsøk."
363355
364−#: qml/Shell.qml:388
356+#: qml/Shell.qml:394
365357msgid ""
366358"If passphrase is entered incorrectly, your phone will conduct a factory "
367359"reset and all personal data will be deleted."
@@ -369,7 +361,7 @@ msgstr ""
369361"Hvis du skriver feil passordfrase en gang til, tilbakestilles telefonen til "
370362"fabrikkinnstillinger, og alle personlige data slettes."
371363
372−#: qml/Shell.qml:389
364+#: qml/Shell.qml:395
373365msgid ""
374366"If passcode is entered incorrectly, your phone will conduct a factory reset "
375367"and all personal data will be deleted."
@@ -377,28 +369,8 @@ msgstr ""
377369"Hvis du skriver feil kode en gang til, tilbakestilles telefonen til "
378370"fabrikkinnstillinger, og alle personlige data slettes."
379371
380−#~ msgid "Hello"
381−#~ msgstr "Hei"
382−
383−#, qt-format
384−#~ msgid "Hello %1"
385−#~ msgstr "Hei, %1"
386−
387−#~ msgid "Please wait"
388−#~ msgstr "Vent litt"
389−
390−#~ msgid "Too many incorrect attempts"
391−#~ msgstr "Du har tastet feil for mange ganger"
392−
393−#, qt-format
394−#~ msgid "Enter your %1"
395−#~ msgstr "Skriv inn %1"
396−
397−#~ msgid "Enter your passphrase"
398−#~ msgstr "Skriv inn passordfrasen din"
399−
400−#~ msgid "Swipe to unlock"
401−#~ msgstr "Skyv for å låse opp"
372+#~ msgid "Sorry, incorrect PIN"
373+#~ msgstr "Feil PIN"
402374
403−#~ msgid "Enter your passcode"
404−#~ msgstr "Tast koden din"
375+#~ msgid "Enter SIM PIN"
376+#~ msgstr "Tast SIM-kortets PIN-kode"
po/nl.po+27−55
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-03 18:53+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-08 19:53+0000\n"
1212"Last-Translator: rob <linuxned@gmail.com>\n"
1313"Language-Team: Dutch <nl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -160,23 +160,23 @@ msgstr ""
160160"Nu u de bewegingen vanuit de randen onder de knie heeft, kunt u beginnen met "
161161"het gebruiken van de telefoon<br><br>Tik op het scherm om te beginnen"
162162
163−#: qml/Components/Lockscreen.qml:218
163+#: qml/Components/Lockscreen.qml:220
164164msgid "Emergency Call"
165165msgstr "Noodoproep"
166166
167−#: qml/Components/Lockscreen.qml:250
167+#: qml/Components/Lockscreen.qml:252
168168msgid "OK"
169169msgstr "Ok"
170170
171−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
171+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
172172msgid "See less"
173173msgstr "Minder zien"
174174
175−#: qml/Dash/GenericScopeView.qml:411
175+#: qml/Dash/GenericScopeView.qml:434
176176msgid "See all"
177177msgstr "Alles zien"
178178
179−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
179+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
180180#: qml/Panel/SearchIndicator.qml:27
181181msgid "Search"
182182msgstr "Zoeken"
@@ -215,11 +215,11 @@ msgstr "Versturen"
215215
216216#: qml/Dash/PullToRefreshScopeStyle.qml:55
217217msgid "Pull to refresh…"
218−msgstr ""
218+msgstr "Trekken om te verversen…"
219219
220220#: qml/Dash/PullToRefreshScopeStyle.qml:60
221221msgid "Release to refresh…"
222−msgstr ""
222+msgstr "Loslaten om te verversen…"
223223
224224#: qml/Dash/ScopesOverview.qml:206
225225msgid "Manage Scopes"
@@ -265,18 +265,10 @@ msgstr "Nu inspreken…"
265265msgid "Speaking..."
266266msgstr "Inspreken…"
267267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:108
268+#: qml/Notifications/NotificationMenuItemFactory.qml:116
269269msgid "Show password"
270270msgstr "Wachtwoord tonen"
271271
272−#: qml/Notifications/NotificationMenuItemFactory.qml:124
273−msgid "Enter SIM PIN"
274−msgstr "Voer simpincode in"
275−
276−#: qml/Notifications/NotificationMenuItemFactory.qml:125
277−msgid "Sorry, incorrect PIN"
278−msgstr "Sorry, onjuiste pincode"
279−
280272#: qml/Panel/ActiveCallHint.qml:77
281273msgid "Tap to return to call..."
282274msgstr "Tik om terug te keren naar gesprek…"
@@ -321,49 +313,49 @@ msgstr "Simkaart deblokkeren"
321313msgid "Roaming"
322314msgstr "Roaming"
323315
324−#: qml/Shell.qml:340
316+#: qml/Shell.qml:346
325317msgid "Enter passphrase"
326318msgstr "Voer wachtwoordzin in"
327319
328−#: qml/Shell.qml:341
320+#: qml/Shell.qml:347
329321msgid "Sorry, incorrect passphrase"
330322msgstr "Sorry, onjuiste wachtwoordzin"
331323
332−#: qml/Shell.qml:342
324+#: qml/Shell.qml:348
333325msgid "Please re-enter"
334326msgstr "Herhaal deze a.u.b."
335327
336−#: qml/Shell.qml:344
328+#: qml/Shell.qml:350
337329msgid "Enter passcode"
338330msgstr "Voer toegangscode in"
339331
340−#: qml/Shell.qml:345
332+#: qml/Shell.qml:351
341333msgid "Sorry, incorrect passcode"
342334msgstr "Sorry, onjuiste toegangscode"
343335
344−#: qml/Shell.qml:348
336+#: qml/Shell.qml:354
345337#, qt-format
346338msgid "Enter %1"
347339msgstr "Voer %1 in"
348340
349−#: qml/Shell.qml:349
341+#: qml/Shell.qml:355
350342#, qt-format
351343msgid "Sorry, incorrect %1"
352344msgstr "Sorry, onjuiste %1"
353345
354−#: qml/Shell.qml:384
346+#: qml/Shell.qml:390
355347msgid "Sorry, incorrect passphrase."
356348msgstr "Sorry, onjuiste wachtwoordzin."
357349
358−#: qml/Shell.qml:385
350+#: qml/Shell.qml:391
359351msgid "Sorry, incorrect passcode."
360352msgstr "Sorry, onjuiste toegangscode."
361353
362−#: qml/Shell.qml:386
354+#: qml/Shell.qml:392
363355msgid "This will be your last attempt."
364356msgstr "Dit zal uw laatste poging worden."
365357
366−#: qml/Shell.qml:388
358+#: qml/Shell.qml:394
367359msgid ""
368360"If passphrase is entered incorrectly, your phone will conduct a factory "
369361"reset and all personal data will be deleted."
@@ -371,7 +363,7 @@ msgstr ""
371363"Wanneer de wachtwoordzin nu opnieuw onjuist wordt ingevoerd, zal uw telefoon "
372364"teruggaan naar de fabrieksinstellingen en zal al uw eigen data verloren gaan."
373365
374−#: qml/Shell.qml:389
366+#: qml/Shell.qml:395
375367msgid ""
376368"If passcode is entered incorrectly, your phone will conduct a factory reset "
377369"and all personal data will be deleted."
@@ -379,28 +371,8 @@ msgstr ""
379371"Wanneer de toegangscode nu opnieuw onjuist wordt ingevoerd, zal uw telefoon "
380372"teruggaan naar de fabrieksinstellingen en zal al uw eigen data verloren gaan."
381373
382−#, qt-format
383−#~ msgid "Hello %1"
384−#~ msgstr "Hallo %1"
385−
386−#~ msgid "Hello"
387−#~ msgstr "Hallo"
388−
389−#~ msgid "Swipe to unlock"
390−#~ msgstr "Veeg om te ontgrendelen"
391−
392−#~ msgid "Please wait"
393−#~ msgstr "Even geduld a.u.b."
394−
395−#, qt-format
396−#~ msgid "Enter your %1"
397−#~ msgstr "Voer uw %1 in"
398−
399−#~ msgid "Too many incorrect attempts"
400−#~ msgstr "Te veel mislukte pogingen"
401−
402−#~ msgid "Enter your passphrase"
403−#~ msgstr "Voer uw wachtwoordzin in"
374+#~ msgid "Sorry, incorrect PIN"
375+#~ msgstr "Sorry, onjuiste pincode"
404376
405−#~ msgid "Enter your passcode"
406−#~ msgstr "Voer uw toegangscode in"
377+#~ msgid "Enter SIM PIN"
378+#~ msgstr "Voer simpincode in"
po/pl.po+20−38
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-08-18 20:25+0000\n"
1212"Last-Translator: Paweł Stroka <pawstr@gmail.com>\n"
1313"Language-Team: Polish <pl@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
1818"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -157,23 +157,23 @@ msgstr ""
157157"Wydawanie poleceń krawędzi zostało opanowane. Urządzenie gotowe do "
158158"pracy.<br><br>Dotknij ekranu by rozpocząć"
159159
160−#: qml/Components/Lockscreen.qml:218
160+#: qml/Components/Lockscreen.qml:220
161161msgid "Emergency Call"
162162msgstr "Telefon ratunkowy"
163163
164−#: qml/Components/Lockscreen.qml:250
164+#: qml/Components/Lockscreen.qml:252
165165msgid "OK"
166166msgstr "OK"
167167
168−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
168+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
169169msgid "See less"
170170msgstr "Zobacz mniej"
171171
172−#: qml/Dash/GenericScopeView.qml:411
172+#: qml/Dash/GenericScopeView.qml:434
173173msgid "See all"
174174msgstr "Zobacz wszystko"
175175
176−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
176+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
177177#: qml/Panel/SearchIndicator.qml:27
178178msgid "Search"
179179msgstr "Szukaj"
@@ -262,18 +262,10 @@ msgstr "Mów teraz..."
262262msgid "Speaking..."
263263msgstr "Rozpoznanie..."
264264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:108
265+#: qml/Notifications/NotificationMenuItemFactory.qml:116
266266msgid "Show password"
267267msgstr "Wyświetl hasło"
268268
269−#: qml/Notifications/NotificationMenuItemFactory.qml:124
270−msgid "Enter SIM PIN"
271−msgstr ""
272−
273−#: qml/Notifications/NotificationMenuItemFactory.qml:125
274−msgid "Sorry, incorrect PIN"
275−msgstr ""
276−
277269#: qml/Panel/ActiveCallHint.qml:77
278270msgid "Tap to return to call..."
279271msgstr "Dotknij aby powrócić do połączenia..."
@@ -318,66 +310,56 @@ msgstr ""
318310msgid "Roaming"
319311msgstr ""
320312
321−#: qml/Shell.qml:340
313+#: qml/Shell.qml:346
322314msgid "Enter passphrase"
323315msgstr ""
324316
325−#: qml/Shell.qml:341
317+#: qml/Shell.qml:347
326318msgid "Sorry, incorrect passphrase"
327319msgstr ""
328320
329−#: qml/Shell.qml:342
321+#: qml/Shell.qml:348
330322msgid "Please re-enter"
331323msgstr ""
332324
333−#: qml/Shell.qml:344
325+#: qml/Shell.qml:350
334326msgid "Enter passcode"
335327msgstr ""
336328
337−#: qml/Shell.qml:345
329+#: qml/Shell.qml:351
338330msgid "Sorry, incorrect passcode"
339331msgstr ""
340332
341−#: qml/Shell.qml:348
333+#: qml/Shell.qml:354
342334#, qt-format
343335msgid "Enter %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:349
338+#: qml/Shell.qml:355
347339#, qt-format
348340msgid "Sorry, incorrect %1"
349341msgstr ""
350342
351−#: qml/Shell.qml:384
343+#: qml/Shell.qml:390
352344msgid "Sorry, incorrect passphrase."
353345msgstr "Niestety, błędne hasło"
354346
355−#: qml/Shell.qml:385
347+#: qml/Shell.qml:391
356348msgid "Sorry, incorrect passcode."
357349msgstr "Niestety, błędny kod"
358350
359−#: qml/Shell.qml:386
351+#: qml/Shell.qml:392
360352msgid "This will be your last attempt."
361353msgstr ""
362354
363−#: qml/Shell.qml:388
355+#: qml/Shell.qml:394
364356msgid ""
365357"If passphrase is entered incorrectly, your phone will conduct a factory "
366358"reset and all personal data will be deleted."
367359msgstr ""
368360
369−#: qml/Shell.qml:389
361+#: qml/Shell.qml:395
370362msgid ""
371363"If passcode is entered incorrectly, your phone will conduct a factory reset "
372364"and all personal data will be deleted."
373365msgstr ""
374−
375−#, qt-format
376−#~ msgid "Hello %1"
377−#~ msgstr "Witaj %1"
378−
379−#~ msgid "Hello"
380−#~ msgstr "Witaj"
381−
382−#~ msgid "Swipe to unlock"
383−#~ msgstr "Przeciągnij aby odblokować"
po/pt.po+27−55
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-03 16:17+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-07 08:31+0000\n"
1212"Last-Translator: Ivo Xavier <ivofernandes12@gmail.com>\n"
1313"Language-Team: Portuguese <pt@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -157,23 +157,23 @@ msgstr ""
157157"Já domina os gestos dos limites e pode começar a usar o "
158158"telefone<br><br>Toque no ecrã para começar"
159159
160−#: qml/Components/Lockscreen.qml:218
160+#: qml/Components/Lockscreen.qml:220
161161msgid "Emergency Call"
162162msgstr "Chamada de emergência"
163163
164−#: qml/Components/Lockscreen.qml:250
164+#: qml/Components/Lockscreen.qml:252
165165msgid "OK"
166166msgstr "OK"
167167
168−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
168+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
169169msgid "See less"
170170msgstr "Ver menos"
171171
172−#: qml/Dash/GenericScopeView.qml:411
172+#: qml/Dash/GenericScopeView.qml:434
173173msgid "See all"
174174msgstr "Ver todos"
175175
176−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
176+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
177177#: qml/Panel/SearchIndicator.qml:27
178178msgid "Search"
179179msgstr "Procurar"
@@ -212,11 +212,11 @@ msgstr "Enviar"
212212
213213#: qml/Dash/PullToRefreshScopeStyle.qml:55
214214msgid "Pull to refresh…"
215−msgstr ""
215+msgstr "Puxe para atualizar..."
216216
217217#: qml/Dash/PullToRefreshScopeStyle.qml:60
218218msgid "Release to refresh…"
219−msgstr ""
219+msgstr "Solte para atualizar..."
220220
221221#: qml/Dash/ScopesOverview.qml:206
222222msgid "Manage Scopes"
@@ -262,18 +262,10 @@ msgstr "Fale agora..."
262262msgid "Speaking..."
263263msgstr "A falar..."
264264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:108
265+#: qml/Notifications/NotificationMenuItemFactory.qml:116
266266msgid "Show password"
267267msgstr "Mostrar palavra-passe"
268268
269−#: qml/Notifications/NotificationMenuItemFactory.qml:124
270−msgid "Enter SIM PIN"
271−msgstr "Introduza o PIN do SIM"
272−
273−#: qml/Notifications/NotificationMenuItemFactory.qml:125
274−msgid "Sorry, incorrect PIN"
275−msgstr "Desculpe, PIN incorreto"
276−
277269#: qml/Panel/ActiveCallHint.qml:77
278270msgid "Tap to return to call..."
279271msgstr "Tocar para ligar de volta..."
@@ -318,49 +310,49 @@ msgstr "Desbloquear SIM"
318310msgid "Roaming"
319311msgstr "Roaming"
320312
321−#: qml/Shell.qml:340
313+#: qml/Shell.qml:346
322314msgid "Enter passphrase"
323315msgstr "Indique a frase-senha"
324316
325−#: qml/Shell.qml:341
317+#: qml/Shell.qml:347
326318msgid "Sorry, incorrect passphrase"
327319msgstr "Desculpe, frase-senha incorreta"
328320
329−#: qml/Shell.qml:342
321+#: qml/Shell.qml:348
330322msgid "Please re-enter"
331323msgstr "Por favor, volte a introduzir"
332324
333−#: qml/Shell.qml:344
325+#: qml/Shell.qml:350
334326msgid "Enter passcode"
335327msgstr "Introduza senha"
336328
337−#: qml/Shell.qml:345
329+#: qml/Shell.qml:351
338330msgid "Sorry, incorrect passcode"
339331msgstr "Desculpe, senha incorreta"
340332
341−#: qml/Shell.qml:348
333+#: qml/Shell.qml:354
342334#, qt-format
343335msgid "Enter %1"
344336msgstr "Introduziu %1"
345337
346−#: qml/Shell.qml:349
338+#: qml/Shell.qml:355
347339#, qt-format
348340msgid "Sorry, incorrect %1"
349341msgstr "Desculpe, incorreto %1"
350342
351−#: qml/Shell.qml:384
343+#: qml/Shell.qml:390
352344msgid "Sorry, incorrect passphrase."
353345msgstr "Desculpe, frase de acesso incorreta."
354346
355−#: qml/Shell.qml:385
347+#: qml/Shell.qml:391
356348msgid "Sorry, incorrect passcode."
357349msgstr "Desculpe, senha incorreta."
358350
359−#: qml/Shell.qml:386
351+#: qml/Shell.qml:392
360352msgid "This will be your last attempt."
361353msgstr "Esta será a sua última tentativa."
362354
363−#: qml/Shell.qml:388
355+#: qml/Shell.qml:394
364356msgid ""
365357"If passphrase is entered incorrectly, your phone will conduct a factory "
366358"reset and all personal data will be deleted."
@@ -368,7 +360,7 @@ msgstr ""
368360"Se a frase de acesso for introduzida incorretamente, o seu telemóvel vai "
369361"proceder ao restauro de fábrica e apagará toda a sua informação pessoal."
370362
371−#: qml/Shell.qml:389
363+#: qml/Shell.qml:395
372364msgid ""
373365"If passcode is entered incorrectly, your phone will conduct a factory reset "
374366"and all personal data will be deleted."
@@ -376,28 +368,8 @@ msgstr ""
376368"Se a senha for introduzida incorretamente, o seu telemóvel vai apagar todos "
377369"os seus dados pessoais."
378370
379−#, qt-format
380−#~ msgid "Hello %1"
381−#~ msgstr "Olá %1"
382−
383−#~ msgid "Hello"
384−#~ msgstr "Olá"
385−
386−#~ msgid "Swipe to unlock"
387−#~ msgstr "Deslize para desbloquear"
388−
389−#~ msgid "Please wait"
390−#~ msgstr "Por favor aguarde"
391−
392−#~ msgid "Too many incorrect attempts"
393−#~ msgstr "Demasiadas tentativas incorrectas"
394−
395−#, qt-format
396−#~ msgid "Enter your %1"
397−#~ msgstr "Introduza o seu %1"
398−
399−#~ msgid "Enter your passphrase"
400−#~ msgstr "Introduza a sua frase-senha"
371+#~ msgid "Sorry, incorrect PIN"
372+#~ msgstr "Desculpe, PIN incorreto"
401373
402−#~ msgid "Enter your passcode"
403−#~ msgstr "Introduza a sua senha"
374+#~ msgid "Enter SIM PIN"
375+#~ msgstr "Introduza o PIN do SIM"
po/pt_BR.po+24−52
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"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"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -158,23 +158,23 @@ msgstr ""
158158"Agora você já domina os gestos das bordas e pode começar a usar o "
159159"telefone<br><br>Toque na tela para iniciar"
160160
161−#: qml/Components/Lockscreen.qml:218
161+#: qml/Components/Lockscreen.qml:220
162162msgid "Emergency Call"
163163msgstr "Chamada de emergência"
164164
165−#: qml/Components/Lockscreen.qml:250
165+#: qml/Components/Lockscreen.qml:252
166166msgid "OK"
167167msgstr "OK"
168168
169−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
169+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
170170msgid "See less"
171171msgstr "Ver menos"
172172
173−#: qml/Dash/GenericScopeView.qml:411
173+#: qml/Dash/GenericScopeView.qml:434
174174msgid "See all"
175175msgstr "Ver todos"
176176
177−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
177+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
178178#: qml/Panel/SearchIndicator.qml:27
179179msgid "Search"
180180msgstr "Pesquisar"
@@ -263,18 +263,10 @@ msgstr "Fale agora..."
263263msgid "Speaking..."
264264msgstr "Falando..."
265265
266−#: qml/Notifications/NotificationMenuItemFactory.qml:108
266+#: qml/Notifications/NotificationMenuItemFactory.qml:116
267267msgid "Show password"
268268msgstr "Exibir senha"
269269
270−#: qml/Notifications/NotificationMenuItemFactory.qml:124
271−msgid "Enter SIM PIN"
272−msgstr "Digite o PIN do SIM"
273−
274−#: qml/Notifications/NotificationMenuItemFactory.qml:125
275−msgid "Sorry, incorrect PIN"
276−msgstr "Desculpe, PIN incorreto"
277−
278270#: qml/Panel/ActiveCallHint.qml:77
279271msgid "Tap to return to call..."
280272msgstr "Toque para retornar para a chamada..."
@@ -319,49 +311,49 @@ msgstr "Desbloquear SIM"
319311msgid "Roaming"
320312msgstr "Roaming"
321313
322−#: qml/Shell.qml:340
314+#: qml/Shell.qml:346
323315msgid "Enter passphrase"
324316msgstr ""
325317
326−#: qml/Shell.qml:341
318+#: qml/Shell.qml:347
327319msgid "Sorry, incorrect passphrase"
328320msgstr "Desculpe, senha incorreta"
329321
330−#: qml/Shell.qml:342
322+#: qml/Shell.qml:348
331323msgid "Please re-enter"
332324msgstr ""
333325
334−#: qml/Shell.qml:344
326+#: qml/Shell.qml:350
335327msgid "Enter passcode"
336328msgstr ""
337329
338−#: qml/Shell.qml:345
330+#: qml/Shell.qml:351
339331msgid "Sorry, incorrect passcode"
340332msgstr "Desculpe, senha incorreta"
341333
342−#: qml/Shell.qml:348
334+#: qml/Shell.qml:354
343335#, qt-format
344336msgid "Enter %1"
345337msgstr ""
346338
347−#: qml/Shell.qml:349
339+#: qml/Shell.qml:355
348340#, qt-format
349341msgid "Sorry, incorrect %1"
350342msgstr "Desculpe, %1 incorreto"
351343
352−#: qml/Shell.qml:384
344+#: qml/Shell.qml:390
353345msgid "Sorry, incorrect passphrase."
354346msgstr "Desculpe, senha incorreta."
355347
356−#: qml/Shell.qml:385
348+#: qml/Shell.qml:391
357349msgid "Sorry, incorrect passcode."
358350msgstr "Desculpe, código de acesso incorreto."
359351
360−#: qml/Shell.qml:386
352+#: qml/Shell.qml:392
361353msgid "This will be your last attempt."
362354msgstr "Esta será a sua última tentativa."
363355
364−#: qml/Shell.qml:388
356+#: qml/Shell.qml:394
365357msgid ""
366358"If passphrase is entered incorrectly, your phone will conduct a factory "
367359"reset and all personal data will be deleted."
@@ -369,7 +361,7 @@ msgstr ""
369361"Se a senha for digitada incorretamente, o telefone será restaurado aos "
370362"padrões de fábrica e todos os dados pessoais serão apagados."
371363
372−#: qml/Shell.qml:389
364+#: qml/Shell.qml:395
373365msgid ""
374366"If passcode is entered incorrectly, your phone will conduct a factory reset "
375367"and all personal data will be deleted."
@@ -377,28 +369,8 @@ msgstr ""
377369"Se o código de acesso for digitado incorretamente, o telefone será "
378370"restaurado aos padrões de fábrica e todos os dados pessoais serão apagados."
379371
380−#, qt-format
381−#~ msgid "Hello %1"
382−#~ msgstr "Olá %1"
383−
384−#~ msgid "Hello"
385−#~ msgstr "Olá"
386−
387−#~ msgid "Swipe to unlock"
388−#~ msgstr "Deslizar para desbloquear"
389−
390−#~ msgid "Too many incorrect attempts"
391−#~ msgstr "Muitas tentativas incorretas"
392−
393−#, qt-format
394−#~ msgid "Enter your %1"
395−#~ msgstr "Digite o seu %1"
396−
397−#~ msgid "Please wait"
398−#~ msgstr "Por favor, aguarde"
399−
400−#~ msgid "Enter your passphrase"
401−#~ msgstr "Digite sua senha"
372+#~ msgid "Sorry, incorrect PIN"
373+#~ msgstr "Desculpe, PIN incorreto"
402374
403−#~ msgid "Enter your passcode"
404−#~ msgstr "Digite sua senha"
375+#~ msgid "Enter SIM PIN"
376+#~ msgstr "Digite o PIN do SIM"
po/ro.po+28−56
@@ -7,8 +7,8 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-04 11:36+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-07 15:54+0000\n"
1212"Last-Translator: Marian Vasile <marianvasile1972@gmail.com>\n"
1313"Language-Team: Romanian <ro@li.org>\n"
1414"MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
1818"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -164,23 +164,23 @@ msgstr ""
164164"De acum stăpâniți gesturile de control și puteți începe să utilizați "
165165"telefonul<br><br>Atingeți ecranul pentru a începe"
166166
167−#: qml/Components/Lockscreen.qml:218
167+#: qml/Components/Lockscreen.qml:220
168168msgid "Emergency Call"
169169msgstr "Apel de urgență"
170170
171−#: qml/Components/Lockscreen.qml:250
171+#: qml/Components/Lockscreen.qml:252
172172msgid "OK"
173173msgstr "În regulă"
174174
175−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
175+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
176176msgid "See less"
177177msgstr "Afișează mai puține"
178178
179−#: qml/Dash/GenericScopeView.qml:411
179+#: qml/Dash/GenericScopeView.qml:434
180180msgid "See all"
181181msgstr "Afișează tot"
182182
183−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
183+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
184184#: qml/Panel/SearchIndicator.qml:27
185185msgid "Search"
186186msgstr "Căutare"
@@ -219,11 +219,11 @@ msgstr "Trimite"
219219
220220#: qml/Dash/PullToRefreshScopeStyle.qml:55
221221msgid "Pull to refresh…"
222−msgstr ""
222+msgstr "Trageți pentru a actualiza..."
223223
224224#: qml/Dash/PullToRefreshScopeStyle.qml:60
225225msgid "Release to refresh…"
226−msgstr ""
226+msgstr "Eliberați pentru a actualiza..."
227227
228228#: qml/Dash/ScopesOverview.qml:206
229229msgid "Manage Scopes"
@@ -269,18 +269,10 @@ msgstr "Vorbiți acum..."
269269msgid "Speaking..."
270270msgstr "Vorbire..."
271271
272−#: qml/Notifications/NotificationMenuItemFactory.qml:108
272+#: qml/Notifications/NotificationMenuItemFactory.qml:116
273273msgid "Show password"
274274msgstr "Arată parola"
275275
276−#: qml/Notifications/NotificationMenuItemFactory.qml:124
277−msgid "Enter SIM PIN"
278−msgstr "Introduceți codul PIN pentru SIM"
279−
280−#: qml/Notifications/NotificationMenuItemFactory.qml:125
281−msgid "Sorry, incorrect PIN"
282−msgstr "Cod PIN incorect"
283−
284276#: qml/Panel/ActiveCallHint.qml:77
285277msgid "Tap to return to call..."
286278msgstr "Atingeți pentru a vă întoarce la convorbire..."
@@ -325,49 +317,49 @@ msgstr "Deblocare SIM"
325317msgid "Roaming"
326318msgstr "Roaming"
327319
328−#: qml/Shell.qml:340
320+#: qml/Shell.qml:346
329321msgid "Enter passphrase"
330322msgstr "Introduceți fraza parolă"
331323
332−#: qml/Shell.qml:341
324+#: qml/Shell.qml:347
333325msgid "Sorry, incorrect passphrase"
334326msgstr "Frază secretă incorectă"
335327
336−#: qml/Shell.qml:342
328+#: qml/Shell.qml:348
337329msgid "Please re-enter"
338330msgstr "Introduceți din nou"
339331
340−#: qml/Shell.qml:344
332+#: qml/Shell.qml:350
341333msgid "Enter passcode"
342334msgstr "Introduceți parola"
343335
344−#: qml/Shell.qml:345
336+#: qml/Shell.qml:351
345337msgid "Sorry, incorrect passcode"
346338msgstr "Parolă incorectă"
347339
348−#: qml/Shell.qml:348
340+#: qml/Shell.qml:354
349341#, qt-format
350342msgid "Enter %1"
351−msgstr ""
343+msgstr "Introducere %1"
352344
353−#: qml/Shell.qml:349
345+#: qml/Shell.qml:355
354346#, qt-format
355347msgid "Sorry, incorrect %1"
356348msgstr "%1 incorectă"
357349
358−#: qml/Shell.qml:384
350+#: qml/Shell.qml:390
359351msgid "Sorry, incorrect passphrase."
360352msgstr "Frază parolă greșită"
361353
362−#: qml/Shell.qml:385
354+#: qml/Shell.qml:391
363355msgid "Sorry, incorrect passcode."
364356msgstr "Parolă greșită"
365357
366−#: qml/Shell.qml:386
358+#: qml/Shell.qml:392
367359msgid "This will be your last attempt."
368360msgstr "Aceasta va fi ultima încercare"
369361
370−#: qml/Shell.qml:388
362+#: qml/Shell.qml:394
371363msgid ""
372364"If passphrase is entered incorrectly, your phone will conduct a factory "
373365"reset and all personal data will be deleted."
@@ -376,7 +368,7 @@ msgstr ""
376368"configurările inițiale, ale fabricantului, iar toate datele personale vor fi "
377369"șterse."
378370
379−#: qml/Shell.qml:389
371+#: qml/Shell.qml:395
380372msgid ""
381373"If passcode is entered incorrectly, your phone will conduct a factory reset "
382374"and all personal data will be deleted."
@@ -385,28 +377,8 @@ msgstr ""
385377"configurările inițiale, ale fabricantului, iar toate datele personale vor fi "
386378"șterse."
387379
388−#, qt-format
389−#~ msgid "Hello %1"
390−#~ msgstr "Salutări %1"
391−
392−#~ msgid "Hello"
393−#~ msgstr "Salutări"
394−
395−#~ msgid "Swipe to unlock"
396−#~ msgstr "Glisați pentru deblocare"
397−
398−#~ msgid "Please wait"
399−#~ msgstr "Așteptați"
400−
401−#~ msgid "Too many incorrect attempts"
402−#~ msgstr "Prea multe încercări greșite"
403−
404−#, qt-format
405−#~ msgid "Enter your %1"
406−#~ msgstr "Introduceți %1"
407−
408−#~ msgid "Enter your passphrase"
409−#~ msgstr "Introduceți fraza dumneavoastră secretă"
380+#~ msgid "Enter SIM PIN"
381+#~ msgstr "Introduceți codul PIN pentru SIM"
410382
411−#~ msgid "Enter your passcode"
412−#~ msgstr "Introduceți parola"
383+#~ msgid "Sorry, incorrect PIN"
384+#~ msgstr "Cod PIN incorect"
po/ru.po+24−52
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-08-29 08:06+0000\n"
1212"Last-Translator: Jay ZDLin <Unknown>\n"
1313"Language-Team: Russian <ru@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -160,23 +160,23 @@ msgstr ""
160160"Вы научились пользоваться Ubuntu и можете начать использовать свой "
161161"телефон<br><br>Нажмите на экран"
162162
163−#: qml/Components/Lockscreen.qml:218
163+#: qml/Components/Lockscreen.qml:220
164164msgid "Emergency Call"
165165msgstr "Экстренный вызов"
166166
167−#: qml/Components/Lockscreen.qml:250
167+#: qml/Components/Lockscreen.qml:252
168168msgid "OK"
169169msgstr "ОК"
170170
171−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
171+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
172172msgid "See less"
173173msgstr "Вкратце"
174174
175−#: qml/Dash/GenericScopeView.qml:411
175+#: qml/Dash/GenericScopeView.qml:434
176176msgid "See all"
177177msgstr "Показать всё"
178178
179−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
179+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
180180#: qml/Panel/SearchIndicator.qml:27
181181msgid "Search"
182182msgstr "Поиск"
@@ -265,18 +265,10 @@ msgstr "Говорите..."
265265msgid "Speaking..."
266266msgstr "Говорите..."
267267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:108
268+#: qml/Notifications/NotificationMenuItemFactory.qml:116
269269msgid "Show password"
270270msgstr "Показать пароль"
271271
272−#: qml/Notifications/NotificationMenuItemFactory.qml:124
273−msgid "Enter SIM PIN"
274−msgstr "Введите ПИН-код SIM-карты"
275−
276−#: qml/Notifications/NotificationMenuItemFactory.qml:125
277−msgid "Sorry, incorrect PIN"
278−msgstr "Введён неверный ПИН-код"
279−
280272#: qml/Panel/ActiveCallHint.qml:77
281273msgid "Tap to return to call..."
282274msgstr "Коснитесь для возврата к вызову..."
@@ -321,49 +313,49 @@ msgstr "Разблокировать SIM-карту"
321313msgid "Roaming"
322314msgstr "Роуминг"
323315
324−#: qml/Shell.qml:340
316+#: qml/Shell.qml:346
325317msgid "Enter passphrase"
326318msgstr ""
327319
328−#: qml/Shell.qml:341
320+#: qml/Shell.qml:347
329321msgid "Sorry, incorrect passphrase"
330322msgstr "Введена неверная кодовая фраза"
331323
332−#: qml/Shell.qml:342
324+#: qml/Shell.qml:348
333325msgid "Please re-enter"
334326msgstr ""
335327
336−#: qml/Shell.qml:344
328+#: qml/Shell.qml:350
337329msgid "Enter passcode"
338330msgstr ""
339331
340−#: qml/Shell.qml:345
332+#: qml/Shell.qml:351
341333msgid "Sorry, incorrect passcode"
342334msgstr "Секретный код введён неверно"
343335
344−#: qml/Shell.qml:348
336+#: qml/Shell.qml:354
345337#, qt-format
346338msgid "Enter %1"
347339msgstr ""
348340
349−#: qml/Shell.qml:349
341+#: qml/Shell.qml:355
350342#, qt-format
351343msgid "Sorry, incorrect %1"
352344msgstr "Некорректный ввод %1"
353345
354−#: qml/Shell.qml:384
346+#: qml/Shell.qml:390
355347msgid "Sorry, incorrect passphrase."
356348msgstr "Неверная ключевая фраза."
357349
358−#: qml/Shell.qml:385
350+#: qml/Shell.qml:391
359351msgid "Sorry, incorrect passcode."
360352msgstr "Неверный секретный код."
361353
362−#: qml/Shell.qml:386
354+#: qml/Shell.qml:392
363355msgid "This will be your last attempt."
364356msgstr "Осталась последняя попытка."
365357
366−#: qml/Shell.qml:388
358+#: qml/Shell.qml:394
367359msgid ""
368360"If passphrase is entered incorrectly, your phone will conduct a factory "
369361"reset and all personal data will be deleted."
@@ -371,7 +363,7 @@ msgstr ""
371363"Если ключевая фраза будет введена неверно, то телефон вернётся к заводским "
372364"настройкам, а все личные данные будут удалены."
373365
374−#: qml/Shell.qml:389
366+#: qml/Shell.qml:395
375367msgid ""
376368"If passcode is entered incorrectly, your phone will conduct a factory reset "
377369"and all personal data will be deleted."
@@ -379,28 +371,8 @@ msgstr ""
379371"Если секретный код будет введен неверно, то телефон вернётся к заводским "
380372"настройкам, а все личные данные будут удалены."
381373
382−#, qt-format
383−#~ msgid "Hello %1"
384−#~ msgstr "Привет, %1"
385−
386−#~ msgid "Hello"
387−#~ msgstr "Привет"
388−
389−#~ msgid "Swipe to unlock"
390−#~ msgstr "Смахните, чтобы разблокировать"
391−
392−#, qt-format
393−#~ msgid "Enter your %1"
394−#~ msgstr "Введите %1"
395−
396−#~ msgid "Please wait"
397−#~ msgstr "Подождите"
398−
399−#~ msgid "Too many incorrect attempts"
400−#~ msgstr "Слишком много ошибок ввода"
401−
402−#~ msgid "Enter your passphrase"
403−#~ msgstr "Введите кодовую фразу"
374+#~ msgid "Sorry, incorrect PIN"
375+#~ msgstr "Введён неверный ПИН-код"
404376
405−#~ msgid "Enter your passcode"
406−#~ msgstr "Введите секретный код"
377+#~ msgid "Enter SIM PIN"
378+#~ msgstr "Введите ПИН-код SIM-карты"
po/shn.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2013-10-07 11:46+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Shan <shn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257257msgid "Speaking..."
258258msgstr ""
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
po/si.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2013-06-26 22:36+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Sinhalese <si@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257257msgid "Speaking..."
258258msgstr ""
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
po/sl.po+27−55
@@ -7,8 +7,8 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-03 17:37+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-07 09:28+0000\n"
1212"Last-Translator: Damir Jerovšek <Unknown>\n"
1313"Language-Team: Slovenian <sl@li.org>\n"
1414"MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
1818"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -161,23 +161,23 @@ msgstr ""
161161"Sedaj, ko ste osvojili poteze robov, lahko začnete uporabljati "
162162"telefon<br><br>Tapnite na zaslon za začetek"
163163
164−#: qml/Components/Lockscreen.qml:218
164+#: qml/Components/Lockscreen.qml:220
165165msgid "Emergency Call"
166166msgstr "Klic v sili"
167167
168−#: qml/Components/Lockscreen.qml:250
168+#: qml/Components/Lockscreen.qml:252
169169msgid "OK"
170170msgstr "V REDU"
171171
172−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
172+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
173173msgid "See less"
174174msgstr "Pokaži manj"
175175
176−#: qml/Dash/GenericScopeView.qml:411
176+#: qml/Dash/GenericScopeView.qml:434
177177msgid "See all"
178178msgstr "Ogled vsega"
179179
180−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
180+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
181181#: qml/Panel/SearchIndicator.qml:27
182182msgid "Search"
183183msgstr "Iskanje"
@@ -216,11 +216,11 @@ msgstr "Pošlji"
216216
217217#: qml/Dash/PullToRefreshScopeStyle.qml:55
218218msgid "Pull to refresh…"
219−msgstr ""
219+msgstr "Povlecite za osvežitev ..."
220220
221221#: qml/Dash/PullToRefreshScopeStyle.qml:60
222222msgid "Release to refresh…"
223−msgstr ""
223+msgstr "Spustite za osvežitev ..."
224224
225225#: qml/Dash/ScopesOverview.qml:206
226226msgid "Manage Scopes"
@@ -266,18 +266,10 @@ msgstr "Govorite zdaj ..."
266266msgid "Speaking..."
267267msgstr "Govorjenje ..."
268268
269−#: qml/Notifications/NotificationMenuItemFactory.qml:108
269+#: qml/Notifications/NotificationMenuItemFactory.qml:116
270270msgid "Show password"
271271msgstr "Pokaži geslo"
272272
273−#: qml/Notifications/NotificationMenuItemFactory.qml:124
274−msgid "Enter SIM PIN"
275−msgstr "Vnesite PIN kartice SIM"
276−
277−#: qml/Notifications/NotificationMenuItemFactory.qml:125
278−msgid "Sorry, incorrect PIN"
279−msgstr "Oprostite, napačen PIN"
280−
281273#: qml/Panel/ActiveCallHint.qml:77
282274msgid "Tap to return to call..."
283275msgstr "Tapnite za vrnitev v klic ..."
@@ -322,49 +314,49 @@ msgstr "Odkleni SIM"
322314msgid "Roaming"
323315msgstr "Gostovanje"
324316
325−#: qml/Shell.qml:340
317+#: qml/Shell.qml:346
326318msgid "Enter passphrase"
327319msgstr "Vnesite šifrirno reklo"
328320
329−#: qml/Shell.qml:341
321+#: qml/Shell.qml:347
330322msgid "Sorry, incorrect passphrase"
331323msgstr "Oprostite, napačno šifrirno reklo"
332324
333−#: qml/Shell.qml:342
325+#: qml/Shell.qml:348
334326msgid "Please re-enter"
335327msgstr "Ponovno vnesite"
336328
337−#: qml/Shell.qml:344
329+#: qml/Shell.qml:350
338330msgid "Enter passcode"
339331msgstr "Vnesite geslo"
340332
341−#: qml/Shell.qml:345
333+#: qml/Shell.qml:351
342334msgid "Sorry, incorrect passcode"
343335msgstr "Nepravilno geslo"
344336
345−#: qml/Shell.qml:348
337+#: qml/Shell.qml:354
346338#, qt-format
347339msgid "Enter %1"
348340msgstr "Vnesite %1"
349341
350−#: qml/Shell.qml:349
342+#: qml/Shell.qml:355
351343#, qt-format
352344msgid "Sorry, incorrect %1"
353345msgstr "Oprostite, napačen %1"
354346
355−#: qml/Shell.qml:384
347+#: qml/Shell.qml:390
356348msgid "Sorry, incorrect passphrase."
357349msgstr "Nepravilno geslo."
358350
359−#: qml/Shell.qml:385
351+#: qml/Shell.qml:391
360352msgid "Sorry, incorrect passcode."
361353msgstr "Nepravilno geslo."
362354
363−#: qml/Shell.qml:386
355+#: qml/Shell.qml:392
364356msgid "This will be your last attempt."
365357msgstr "To je vaš zadnji poskus"
366358
367−#: qml/Shell.qml:388
359+#: qml/Shell.qml:394
368360msgid ""
369361"If passphrase is entered incorrectly, your phone will conduct a factory "
370362"reset and all personal data will be deleted."
@@ -372,7 +364,7 @@ msgstr ""
372364"Če je vneseno nepravilno šifrirno reklo, bo telefon ponastavljen na "
373365"tovarniške nastavitve ter vsi osebni podatki bodo izbrisani."
374366
375−#: qml/Shell.qml:389
367+#: qml/Shell.qml:395
376368msgid ""
377369"If passcode is entered incorrectly, your phone will conduct a factory reset "
378370"and all personal data will be deleted."
@@ -380,28 +372,8 @@ msgstr ""
380372"Če je vneseno nepravilno geslo, bo telefon ponastavljen na tovarniške "
381373"nastavitve ter vsi osebni podatki bodo izbrisani."
382374
383−#, qt-format
384−#~ msgid "Hello %1"
385−#~ msgstr "Pozdravljeni, %1"
386−
387−#~ msgid "Hello"
388−#~ msgstr "Pozdravljeni"
389−
390−#~ msgid "Swipe to unlock"
391−#~ msgstr "Podrsajte za odklenitev"
392−
393−#~ msgid "Please wait"
394−#~ msgstr "Počakajte"
395−
396−#~ msgid "Too many incorrect attempts"
397−#~ msgstr "Preveč nepravilnih poskusov"
398−
399−#, qt-format
400−#~ msgid "Enter your %1"
401−#~ msgstr "Vnesite vaš %1"
402−
403−#~ msgid "Enter your passphrase"
404−#~ msgstr "Vnesite svoje šifrirno reklo"
375+#~ msgid "Sorry, incorrect PIN"
376+#~ msgstr "Oprostite, napačen PIN"
405377
406−#~ msgid "Enter your passcode"
407−#~ msgstr "Vnesite svoje geslo"
378+#~ msgid "Enter SIM PIN"
379+#~ msgstr "Vnesite PIN kartice SIM"
po/sq.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-01-15 13:51+0000\n"
1212"Last-Translator: Besmir Zanaj <besmirzanaj@gmail.com>\n"
1313"Language-Team: Albanian <sq@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -153,23 +153,23 @@ msgid ""
153153"phone<br><br>Tap on the screen to start"
154154msgstr ""
155155
156−#: qml/Components/Lockscreen.qml:218
156+#: qml/Components/Lockscreen.qml:220
157157msgid "Emergency Call"
158158msgstr ""
159159
160−#: qml/Components/Lockscreen.qml:250
160+#: qml/Components/Lockscreen.qml:252
161161msgid "OK"
162162msgstr ""
163163
164−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
164+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
165165msgid "See less"
166166msgstr ""
167167
168−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:434
169169msgid "See all"
170170msgstr ""
171171
172−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
173173#: qml/Panel/SearchIndicator.qml:27
174174msgid "Search"
175175msgstr ""
@@ -258,18 +258,10 @@ msgstr ""
258258msgid "Speaking..."
259259msgstr ""
260260
261−#: qml/Notifications/NotificationMenuItemFactory.qml:108
261+#: qml/Notifications/NotificationMenuItemFactory.qml:116
262262msgid "Show password"
263263msgstr ""
264264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:124
266−msgid "Enter SIM PIN"
267−msgstr ""
268−
269−#: qml/Notifications/NotificationMenuItemFactory.qml:125
270−msgid "Sorry, incorrect PIN"
271−msgstr ""
272−
273265#: qml/Panel/ActiveCallHint.qml:77
274266msgid "Tap to return to call..."
275267msgstr ""
@@ -314,55 +306,55 @@ msgstr ""
314306msgid "Roaming"
315307msgstr ""
316308
317−#: qml/Shell.qml:340
309+#: qml/Shell.qml:346
318310msgid "Enter passphrase"
319311msgstr ""
320312
321−#: qml/Shell.qml:341
313+#: qml/Shell.qml:347
322314msgid "Sorry, incorrect passphrase"
323315msgstr ""
324316
325−#: qml/Shell.qml:342
317+#: qml/Shell.qml:348
326318msgid "Please re-enter"
327319msgstr ""
328320
329−#: qml/Shell.qml:344
321+#: qml/Shell.qml:350
330322msgid "Enter passcode"
331323msgstr ""
332324
333−#: qml/Shell.qml:345
325+#: qml/Shell.qml:351
334326msgid "Sorry, incorrect passcode"
335327msgstr ""
336328
337−#: qml/Shell.qml:348
329+#: qml/Shell.qml:354
338330#, qt-format
339331msgid "Enter %1"
340332msgstr ""
341333
342−#: qml/Shell.qml:349
334+#: qml/Shell.qml:355
343335#, qt-format
344336msgid "Sorry, incorrect %1"
345337msgstr ""
346338
347−#: qml/Shell.qml:384
339+#: qml/Shell.qml:390
348340msgid "Sorry, incorrect passphrase."
349341msgstr ""
350342
351−#: qml/Shell.qml:385
343+#: qml/Shell.qml:391
352344msgid "Sorry, incorrect passcode."
353345msgstr ""
354346
355−#: qml/Shell.qml:386
347+#: qml/Shell.qml:392
356348msgid "This will be your last attempt."
357349msgstr ""
358350
359−#: qml/Shell.qml:388
351+#: qml/Shell.qml:394
360352msgid ""
361353"If passphrase is entered incorrectly, your phone will conduct a factory "
362354"reset and all personal data will be deleted."
363355msgstr ""
364356
365−#: qml/Shell.qml:389
357+#: qml/Shell.qml:395
366358msgid ""
367359"If passcode is entered incorrectly, your phone will conduct a factory reset "
368360"and all personal data will be deleted."
po/sr.po+24−52
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-09-24 13:29+0000\n"
1212"Last-Translator: Данило Шеган <Unknown>\n"
1313"Language-Team: Serbian <sr@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -157,23 +157,23 @@ msgstr ""
157157"Сада сте савладали превлачења са ивица и можете да користите "
158158"телефон<br><br>Тапните на екран да почнете"
159159
160−#: qml/Components/Lockscreen.qml:218
160+#: qml/Components/Lockscreen.qml:220
161161msgid "Emergency Call"
162162msgstr "Хитан позив"
163163
164−#: qml/Components/Lockscreen.qml:250
164+#: qml/Components/Lockscreen.qml:252
165165msgid "OK"
166166msgstr "У реду"
167167
168−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
168+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
169169msgid "See less"
170170msgstr "Сажетије"
171171
172−#: qml/Dash/GenericScopeView.qml:411
172+#: qml/Dash/GenericScopeView.qml:434
173173msgid "See all"
174174msgstr "Опширније"
175175
176−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
176+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
177177#: qml/Panel/SearchIndicator.qml:27
178178msgid "Search"
179179msgstr "Претрага"
@@ -262,18 +262,10 @@ msgstr "Изговорите сада..."
262262msgid "Speaking..."
263263msgstr "Говор..."
264264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:108
265+#: qml/Notifications/NotificationMenuItemFactory.qml:116
266266msgid "Show password"
267267msgstr "Прикажи лозинку"
268268
269−#: qml/Notifications/NotificationMenuItemFactory.qml:124
270−msgid "Enter SIM PIN"
271−msgstr "Унеси пин СИМ картице"
272−
273−#: qml/Notifications/NotificationMenuItemFactory.qml:125
274−msgid "Sorry, incorrect PIN"
275−msgstr "Жао ми је, погрешан ПИН код"
276−
277269#: qml/Panel/ActiveCallHint.qml:77
278270msgid "Tap to return to call..."
279271msgstr "Тапните да одговорите на позив"
@@ -318,49 +310,49 @@ msgstr "Откључај СИМ картицу"
318310msgid "Roaming"
319311msgstr "Роминг"
320312
321−#: qml/Shell.qml:340
313+#: qml/Shell.qml:346
322314msgid "Enter passphrase"
323315msgstr ""
324316
325−#: qml/Shell.qml:341
317+#: qml/Shell.qml:347
326318msgid "Sorry, incorrect passphrase"
327319msgstr "Жао ми је, погрешна лозинка"
328320
329−#: qml/Shell.qml:342
321+#: qml/Shell.qml:348
330322msgid "Please re-enter"
331323msgstr ""
332324
333−#: qml/Shell.qml:344
325+#: qml/Shell.qml:350
334326msgid "Enter passcode"
335327msgstr ""
336328
337−#: qml/Shell.qml:345
329+#: qml/Shell.qml:351
338330msgid "Sorry, incorrect passcode"
339331msgstr "Жао ми је, погрешан код"
340332
341−#: qml/Shell.qml:348
333+#: qml/Shell.qml:354
342334#, qt-format
343335msgid "Enter %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:349
338+#: qml/Shell.qml:355
347339#, qt-format
348340msgid "Sorry, incorrect %1"
349341msgstr "Жао ми је, погрешан %1"
350342
351−#: qml/Shell.qml:384
343+#: qml/Shell.qml:390
352344msgid "Sorry, incorrect passphrase."
353345msgstr "Жао ми је, погрешна лозинка."
354346
355−#: qml/Shell.qml:385
347+#: qml/Shell.qml:391
356348msgid "Sorry, incorrect passcode."
357349msgstr "Жао ми је, погрешан код."
358350
359−#: qml/Shell.qml:386
351+#: qml/Shell.qml:392
360352msgid "This will be your last attempt."
361353msgstr "Ово је ваш последњи покушај."
362354
363−#: qml/Shell.qml:388
355+#: qml/Shell.qml:394
364356msgid ""
365357"If passphrase is entered incorrectly, your phone will conduct a factory "
366358"reset and all personal data will be deleted."
@@ -368,7 +360,7 @@ msgstr ""
368360"Ако се унесе погрешна лозинка, ваш телефон ће се ресетовати и сви лични "
369361"подаци ће бити обрисани."
370362
371−#: qml/Shell.qml:389
363+#: qml/Shell.qml:395
372364msgid ""
373365"If passcode is entered incorrectly, your phone will conduct a factory reset "
374366"and all personal data will be deleted."
@@ -376,28 +368,8 @@ msgstr ""
376368"Ако се унесе погрешан код, ваш телефон ће се ресетовати и сви лични подаци "
377369"ће бити обрисани."
378370
379−#, qt-format
380−#~ msgid "Hello %1"
381−#~ msgstr "Здраво %1"
382−
383−#~ msgid "Please wait"
384−#~ msgstr "Сачекајте"
385−
386−#~ msgid "Too many incorrect attempts"
387−#~ msgstr "Превише нетачних покушаја"
388−
389−#~ msgid "Hello"
390−#~ msgstr "Здраво"
391−
392−#~ msgid "Enter your passphrase"
393−#~ msgstr "Унесите вашу лозинку"
394−
395−#, qt-format
396−#~ msgid "Enter your %1"
397−#~ msgstr "Унесите ваш %1"
398−
399−#~ msgid "Enter your passcode"
400−#~ msgstr "Унесите ваш код"
371+#~ msgid "Enter SIM PIN"
372+#~ msgstr "Унеси пин СИМ картице"
401373
402−#~ msgid "Swipe to unlock"
403−#~ msgstr "Повуците да откључате"
374+#~ msgid "Sorry, incorrect PIN"
375+#~ msgstr "Жао ми је, погрешан ПИН код"
po/sv.po+37−65
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-09-23 08:37+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-07 14:28+0000\n"
1212"Last-Translator: Josef Andersson <Unknown>\n"
1313"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020"Language: sv\n"
2121
@@ -34,22 +34,22 @@ msgstr "Släpp genväg"
3434
3535#: qml/Components/DelayedLockscreen.qml:47
3636msgid "Device Locked"
37−msgstr ""
37+msgstr "Enhet låst"
3838
3939#: qml/Components/DelayedLockscreen.qml:62
4040msgid "You have been locked out due to too many failed passphrase attempts."
41−msgstr ""
41+msgstr "Du har blivit utlåst efter för många misslyckade lösenfrasförsök."
4242
4343#: qml/Components/DelayedLockscreen.qml:63
4444msgid "You have been locked out due to too many failed passcode attempts."
45−msgstr ""
45+msgstr "Du har blivit utlåst efter för många misslyckade lösenkodsförsök."
4646
4747#: qml/Components/DelayedLockscreen.qml:72
4848#, qt-format
4949msgid "Please wait %1 minute and then try again…"
5050msgid_plural "Please wait %1 minutes and then try again…"
51−msgstr[0] ""
52−msgstr[1] ""
51+msgstr[0] "Vänta %1 minut och prova sedan igen..."
52+msgstr[1] "Vänta %1 minuter och prova sedan igen..."
5353
5454#: qml/Components/Dialogs.qml:70
5555msgid "Log out"
@@ -157,23 +157,23 @@ msgstr ""
157157"Du har nu bemästrat kantgesterna och kan börja använda "
158158"telefonen<br><br>Tryck på skärmen för att starta"
159159
160−#: qml/Components/Lockscreen.qml:218
160+#: qml/Components/Lockscreen.qml:220
161161msgid "Emergency Call"
162162msgstr "Nödsamtal"
163163
164−#: qml/Components/Lockscreen.qml:250
164+#: qml/Components/Lockscreen.qml:252
165165msgid "OK"
166166msgstr "Ok"
167167
168−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
168+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
169169msgid "See less"
170170msgstr "Visa mindre"
171171
172−#: qml/Dash/GenericScopeView.qml:411
172+#: qml/Dash/GenericScopeView.qml:434
173173msgid "See all"
174174msgstr "Visa alla"
175175
176−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
176+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
177177#: qml/Panel/SearchIndicator.qml:27
178178msgid "Search"
179179msgstr "Sök"
@@ -212,11 +212,11 @@ msgstr "Skicka"
212212
213213#: qml/Dash/PullToRefreshScopeStyle.qml:55
214214msgid "Pull to refresh…"
215−msgstr ""
215+msgstr "Dra för att uppdatera..."
216216
217217#: qml/Dash/PullToRefreshScopeStyle.qml:60
218218msgid "Release to refresh…"
219−msgstr ""
219+msgstr "Släpp för uppdatera..."
220220
221221#: qml/Dash/ScopesOverview.qml:206
222222msgid "Manage Scopes"
@@ -240,7 +240,7 @@ msgstr "Alla"
240240
241241#: qml/Greeter/Greeter.qml:157
242242msgid "Unlock"
243−msgstr ""
243+msgstr "Lås upp"
244244
245245#: qml/Hud/HudParametrizedActionsPage.qml:139
246246msgid "Confirm"
@@ -262,18 +262,10 @@ msgstr "Tala nu…"
262262msgid "Speaking..."
263263msgstr "Talar…"
264264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:108
265+#: qml/Notifications/NotificationMenuItemFactory.qml:116
266266msgid "Show password"
267267msgstr "Visa lösenord"
268268
269−#: qml/Notifications/NotificationMenuItemFactory.qml:124
270−msgid "Enter SIM PIN"
271−msgstr "Ange SIM PIN-kod"
272−
273−#: qml/Notifications/NotificationMenuItemFactory.qml:125
274−msgid "Sorry, incorrect PIN"
275−msgstr "Felaktig PIN"
276−
277269#: qml/Panel/ActiveCallHint.qml:77
278270msgid "Tap to return to call..."
279271msgstr "Tryck för att återgå till samtal..."
@@ -318,49 +310,49 @@ msgstr "Lås upp SIM-kort"
318310msgid "Roaming"
319311msgstr "Roaming"
320312
321−#: qml/Shell.qml:340
313+#: qml/Shell.qml:346
322314msgid "Enter passphrase"
323−msgstr ""
315+msgstr "Ange lösenfras"
324316
325−#: qml/Shell.qml:341
317+#: qml/Shell.qml:347
326318msgid "Sorry, incorrect passphrase"
327319msgstr "Felaktig lösenfras"
328320
329−#: qml/Shell.qml:342
321+#: qml/Shell.qml:348
330322msgid "Please re-enter"
331−msgstr ""
323+msgstr "Ange igen"
332324
333−#: qml/Shell.qml:344
325+#: qml/Shell.qml:350
334326msgid "Enter passcode"
335−msgstr ""
327+msgstr "Ange lösenkod"
336328
337−#: qml/Shell.qml:345
329+#: qml/Shell.qml:351
338330msgid "Sorry, incorrect passcode"
339331msgstr "Felaktig lösenkod"
340332
341−#: qml/Shell.qml:348
333+#: qml/Shell.qml:354
342334#, qt-format
343335msgid "Enter %1"
344−msgstr ""
336+msgstr "Ange %1"
345337
346−#: qml/Shell.qml:349
338+#: qml/Shell.qml:355
347339#, qt-format
348340msgid "Sorry, incorrect %1"
349341msgstr "Felaktig %1"
350342
351−#: qml/Shell.qml:384
343+#: qml/Shell.qml:390
352344msgid "Sorry, incorrect passphrase."
353345msgstr "Felaktig lösenfras."
354346
355−#: qml/Shell.qml:385
347+#: qml/Shell.qml:391
356348msgid "Sorry, incorrect passcode."
357349msgstr "Felaktig lösenkod."
358350
359−#: qml/Shell.qml:386
351+#: qml/Shell.qml:392
360352msgid "This will be your last attempt."
361353msgstr "Detta är ditt sista försök."
362354
363−#: qml/Shell.qml:388
355+#: qml/Shell.qml:394
364356msgid ""
365357"If passphrase is entered incorrectly, your phone will conduct a factory "
366358"reset and all personal data will be deleted."
@@ -368,7 +360,7 @@ msgstr ""
368360"Om lösenfrasen anges inkorrekt kommer telefonen att fabrikåterställas och "
369361"all personlig data kommer att tas bort."
370362
371−#: qml/Shell.qml:389
363+#: qml/Shell.qml:395
372364msgid ""
373365"If passcode is entered incorrectly, your phone will conduct a factory reset "
374366"and all personal data will be deleted."
@@ -376,28 +368,8 @@ msgstr ""
376368"Om lösenkoden anges felaktigt kommer telefonen att fabrikåterställas och all "
377369"personlig data kommer att tas bort."
378370
379−#, qt-format
380−#~ msgid "Hello %1"
381−#~ msgstr "Hej %1"
382−
383−#~ msgid "Hello"
384−#~ msgstr "Hej"
385−
386−#~ msgid "Swipe to unlock"
387−#~ msgstr "Svep för att låsa upp"
388−
389−#~ msgid "Please wait"
390−#~ msgstr "Var god vänta"
391−
392−#, qt-format
393−#~ msgid "Enter your %1"
394−#~ msgstr "Skriv in din %1"
395−
396−#~ msgid "Too many incorrect attempts"
397−#~ msgstr "För många felaktiga försök"
398−
399−#~ msgid "Enter your passphrase"
400−#~ msgstr "Ange din lösenfras"
371+#~ msgid "Enter SIM PIN"
372+#~ msgstr "Ange SIM PIN-kod"
401373
402−#~ msgid "Enter your passcode"
403−#~ msgstr "Ange din lösenkod"
374+#~ msgid "Sorry, incorrect PIN"
375+#~ msgstr "Felaktig PIN"
po/sw.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-01-14 19:28+0000\n"
1212"Last-Translator: Damas <Unknown>\n"
1313"Language-Team: Swahili <sw@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "Tafuta"
@@ -257,18 +257,10 @@ msgstr ""
257257msgid "Speaking..."
258258msgstr ""
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
po/ta.po+20−35
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2013-10-24 11:36+0000\n"
1212"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
1313"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020"Language: ta\n"
2121
@@ -155,23 +155,23 @@ msgid ""
155155"phone<br><br>Tap on the screen to start"
156156msgstr ""
157157
158−#: qml/Components/Lockscreen.qml:218
158+#: qml/Components/Lockscreen.qml:220
159159msgid "Emergency Call"
160160msgstr "அவசர அழைப்பு"
161161
162−#: qml/Components/Lockscreen.qml:250
162+#: qml/Components/Lockscreen.qml:252
163163msgid "OK"
164164msgstr ""
165165
166−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
167167msgid "See less"
168168msgstr ""
169169
170−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
171171msgid "See all"
172172msgstr ""
173173
174−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
175175#: qml/Panel/SearchIndicator.qml:27
176176msgid "Search"
177177msgstr "தெடு"
@@ -260,18 +260,10 @@ msgstr "இப்பொது பேசு..."
260260msgid "Speaking..."
261261msgstr "பேசுகிறது..."
262262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
264264msgid "Show password"
265265msgstr ""
266266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:124
268−msgid "Enter SIM PIN"
269−msgstr ""
270−
271−#: qml/Notifications/NotificationMenuItemFactory.qml:125
272−msgid "Sorry, incorrect PIN"
273−msgstr ""
274−
275267#: qml/Panel/ActiveCallHint.qml:77
276268msgid "Tap to return to call..."
277269msgstr ""
@@ -316,63 +308,56 @@ msgstr ""
316308msgid "Roaming"
317309msgstr ""
318310
319−#: qml/Shell.qml:340
311+#: qml/Shell.qml:346
320312msgid "Enter passphrase"
321313msgstr ""
322314
323−#: qml/Shell.qml:341
315+#: qml/Shell.qml:347
324316msgid "Sorry, incorrect passphrase"
325317msgstr ""
326318
327−#: qml/Shell.qml:342
319+#: qml/Shell.qml:348
328320msgid "Please re-enter"
329321msgstr ""
330322
331−#: qml/Shell.qml:344
323+#: qml/Shell.qml:350
332324msgid "Enter passcode"
333325msgstr ""
334326
335−#: qml/Shell.qml:345
327+#: qml/Shell.qml:351
336328msgid "Sorry, incorrect passcode"
337329msgstr ""
338330
339−#: qml/Shell.qml:348
331+#: qml/Shell.qml:354
340332#, qt-format
341333msgid "Enter %1"
342334msgstr ""
343335
344−#: qml/Shell.qml:349
336+#: qml/Shell.qml:355
345337#, qt-format
346338msgid "Sorry, incorrect %1"
347339msgstr ""
348340
349−#: qml/Shell.qml:384
341+#: qml/Shell.qml:390
350342msgid "Sorry, incorrect passphrase."
351343msgstr ""
352344
353−#: qml/Shell.qml:385
345+#: qml/Shell.qml:391
354346msgid "Sorry, incorrect passcode."
355347msgstr ""
356348
357−#: qml/Shell.qml:386
349+#: qml/Shell.qml:392
358350msgid "This will be your last attempt."
359351msgstr ""
360352
361−#: qml/Shell.qml:388
353+#: qml/Shell.qml:394
362354msgid ""
363355"If passphrase is entered incorrectly, your phone will conduct a factory "
364356"reset and all personal data will be deleted."
365357msgstr ""
366358
367−#: qml/Shell.qml:389
359+#: qml/Shell.qml:395
368360msgid ""
369361"If passcode is entered incorrectly, your phone will conduct a factory reset "
370362"and all personal data will be deleted."
371363msgstr ""
372−
373−#, qt-format
374−#~ msgid "Hello %1"
375−#~ msgstr "வணக்கம் %1"
376−
377−#~ msgid "Hello"
378−#~ msgstr "வணக்கம்"
po/te.po+20−38
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-07-19 10:04+0000\n"
1212"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
1313"Language-Team: Telugu <te@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr "అత్యవసర పిలుపు"
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr "సరే"
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "వెతుకు"
@@ -257,18 +257,10 @@ msgstr "ఇప్పుడు మాట్లాడండి..."
257257msgid "Speaking..."
258258msgstr "మాట్లాడుతున్నారు..."
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr "సంకేతపదాన్ని చూపించు"
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,66 +305,56 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
368360msgstr ""
369−
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "హలో %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "హలో"
376−
377−#~ msgid "Swipe to unlock"
378−#~ msgstr "తాళంతీయుటకు గీకండి"
po/th.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-10-02 04:55+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Thai <th@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257257msgid "Speaking..."
258258msgstr ""
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
po/tr.po+22−46
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-07-16 17:58+0000\n"
1212"Last-Translator: Volkan Gezer <Unknown>\n"
1313"Language-Team: Turkish <tr@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -155,23 +155,23 @@ msgstr ""
155155"Kenar haraketlerini öğrendiniz ve telefonu kullanmaya "
156156"başlayabilirsiniz<br><br>Başlamak için ekrana dokunun"
157157
158−#: qml/Components/Lockscreen.qml:218
158+#: qml/Components/Lockscreen.qml:220
159159msgid "Emergency Call"
160160msgstr "Acil Arama"
161161
162−#: qml/Components/Lockscreen.qml:250
162+#: qml/Components/Lockscreen.qml:252
163163msgid "OK"
164164msgstr "Tamam"
165165
166−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
167167msgid "See less"
168168msgstr "Daha azını gör"
169169
170−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
171171msgid "See all"
172172msgstr "Tümünü gör"
173173
174−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
175175#: qml/Panel/SearchIndicator.qml:27
176176msgid "Search"
177177msgstr "Ara"
@@ -260,18 +260,10 @@ msgstr "Şimdi Konuşun..."
260260msgid "Speaking..."
261261msgstr "Konuşuyor..."
262262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
264264msgid "Show password"
265265msgstr "Parolayı göster"
266266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:124
268−msgid "Enter SIM PIN"
269−msgstr ""
270−
271−#: qml/Notifications/NotificationMenuItemFactory.qml:125
272−msgid "Sorry, incorrect PIN"
273−msgstr "Üzgünüm, hatalı PIN"
274−
275267#: qml/Panel/ActiveCallHint.qml:77
276268msgid "Tap to return to call..."
277269msgstr ""
@@ -316,49 +308,49 @@ msgstr "SIM kilidini aç"
316308msgid "Roaming"
317309msgstr ""
318310
319−#: qml/Shell.qml:340
311+#: qml/Shell.qml:346
320312msgid "Enter passphrase"
321313msgstr ""
322314
323−#: qml/Shell.qml:341
315+#: qml/Shell.qml:347
324316msgid "Sorry, incorrect passphrase"
325317msgstr "Üzgünüm, hatalı parola"
326318
327−#: qml/Shell.qml:342
319+#: qml/Shell.qml:348
328320msgid "Please re-enter"
329321msgstr ""
330322
331−#: qml/Shell.qml:344
323+#: qml/Shell.qml:350
332324msgid "Enter passcode"
333325msgstr ""
334326
335−#: qml/Shell.qml:345
327+#: qml/Shell.qml:351
336328msgid "Sorry, incorrect passcode"
337329msgstr "Üzgünüm, hatalı parola"
338330
339−#: qml/Shell.qml:348
331+#: qml/Shell.qml:354
340332#, qt-format
341333msgid "Enter %1"
342334msgstr ""
343335
344−#: qml/Shell.qml:349
336+#: qml/Shell.qml:355
345337#, qt-format
346338msgid "Sorry, incorrect %1"
347339msgstr "Üzgünüm, hatalı %1"
348340
349−#: qml/Shell.qml:384
341+#: qml/Shell.qml:390
350342msgid "Sorry, incorrect passphrase."
351343msgstr "Üzgünüm, hatalı parola."
352344
353−#: qml/Shell.qml:385
345+#: qml/Shell.qml:391
354346msgid "Sorry, incorrect passcode."
355347msgstr "Üzgünüm, hatalı parola."
356348
357−#: qml/Shell.qml:386
349+#: qml/Shell.qml:392
358350msgid "This will be your last attempt."
359351msgstr "Bu son denemeniz olacak."
360352
361−#: qml/Shell.qml:388
353+#: qml/Shell.qml:394
362354msgid ""
363355"If passphrase is entered incorrectly, your phone will conduct a factory "
364356"reset and all personal data will be deleted."
@@ -366,7 +358,7 @@ msgstr ""
366358"Eğer hatalı parola girilirse, telefonunuz fabrika ayarlarına dönecek ve tüm "
367359"kişisel verileriniz silinecek."
368360
369−#: qml/Shell.qml:389
361+#: qml/Shell.qml:395
370362msgid ""
371363"If passcode is entered incorrectly, your phone will conduct a factory reset "
372364"and all personal data will be deleted."
@@ -374,21 +366,5 @@ msgstr ""
374366"Eğer hatalı parola girilirse, telefonunuz fabrika ayarlarına dönecek ve tüm "
375367"kişisel verileriniz silinecek."
376368
377−#~ msgid "Hello"
378−#~ msgstr "Merhaba"
379−
380−#, qt-format
381−#~ msgid "Hello %1"
382−#~ msgstr "Merhaba %1"
383−
384−#~ msgid "Swipe to unlock"
385−#~ msgstr "Açmak için kaydırın"
386−
387−#~ msgid "Too many incorrect attempts"
388−#~ msgstr "Çok fazla hatalı deneme yaptınız"
389−
390−#~ msgid "Enter your passphrase"
391−#~ msgstr "Parolanızı girin"
392−
393−#~ msgid "Enter your passcode"
394−#~ msgstr "Parolanızı girin"
369+#~ msgid "Sorry, incorrect PIN"
370+#~ msgstr "Üzgünüm, hatalı PIN"
po/ug.po+27−55
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-06 00:47+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-07 09:00+0000\n"
1212"Last-Translator: Gheyret T.Kenji <Unknown>\n"
1313"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -155,23 +155,23 @@ msgstr ""
155155"ئېكراننى چېكىپ باشلاڭ<br><br>سىز ھازىر گىرۋەك بارماق ئىشارەتلىرىنى ئىگىلەپ "
156156"بولدىڭىز،ئەمدى تېلېفوننى ئىشلىتىشنى باشلىسىڭىز بولىدۇ"
157157
158−#: qml/Components/Lockscreen.qml:218
158+#: qml/Components/Lockscreen.qml:220
159159msgid "Emergency Call"
160160msgstr "جىددىي تېلېفون"
161161
162−#: qml/Components/Lockscreen.qml:250
162+#: qml/Components/Lockscreen.qml:252
163163msgid "OK"
164164msgstr "تامام"
165165
166−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
167167msgid "See less"
168168msgstr "ئازراق كۆرۈش"
169169
170−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
171171msgid "See all"
172172msgstr "ھەممىنى كۆرۈش…"
173173
174−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
175175#: qml/Panel/SearchIndicator.qml:27
176176msgid "Search"
177177msgstr "ئىزدە"
@@ -210,11 +210,11 @@ msgstr "يوللا"
210210
211211#: qml/Dash/PullToRefreshScopeStyle.qml:55
212212msgid "Pull to refresh…"
213−msgstr ""
213+msgstr "تارتسا يېڭىلىنىدۇ…"
214214
215215#: qml/Dash/PullToRefreshScopeStyle.qml:60
216216msgid "Release to refresh…"
217−msgstr ""
217+msgstr "قويۇۋەتسە يېڭىلىنىدۇ…"
218218
219219#: qml/Dash/ScopesOverview.qml:206
220220msgid "Manage Scopes"
@@ -260,18 +260,10 @@ msgstr "ئەمدى سۆزلەڭ…"
260260msgid "Speaking..."
261261msgstr "سۆزلەۋاتىسىز…"
262262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
264264msgid "Show password"
265265msgstr "ئىم كۆرسەت"
266266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:124
268−msgid "Enter SIM PIN"
269−msgstr "SIM نىڭ ئىمى(PIN) نى كىرگۈزۈڭ"
270−
271−#: qml/Notifications/NotificationMenuItemFactory.qml:125
272−msgid "Sorry, incorrect PIN"
273−msgstr "كەچۈرۈڭ، PIN توغرا ئەمەس"
274−
275267#: qml/Panel/ActiveCallHint.qml:77
276268msgid "Tap to return to call..."
277269msgstr "سۆزلىشىشكە قايتىش ئۈچۈن چېكىڭ…"
@@ -316,49 +308,49 @@ msgstr "SIM نى قۇلۇپسىزلاش"
316308msgid "Roaming"
317309msgstr "كەزمە"
318310
319−#: qml/Shell.qml:340
311+#: qml/Shell.qml:346
320312msgid "Enter passphrase"
321313msgstr "ئىم كىرگۈزۈڭ"
322314
323−#: qml/Shell.qml:341
315+#: qml/Shell.qml:347
324316msgid "Sorry, incorrect passphrase"
325317msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
326318
327−#: qml/Shell.qml:342
319+#: qml/Shell.qml:348
328320msgid "Please re-enter"
329321msgstr "قايتا كىرگۈزۈڭ"
330322
331−#: qml/Shell.qml:344
323+#: qml/Shell.qml:350
332324msgid "Enter passcode"
333325msgstr "ئىم كودى(passcode)نى كىرگۈزۈڭ"
334326
335−#: qml/Shell.qml:345
327+#: qml/Shell.qml:351
336328msgid "Sorry, incorrect passcode"
337329msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
338330
339−#: qml/Shell.qml:348
331+#: qml/Shell.qml:354
340332#, qt-format
341333msgid "Enter %1"
342334msgstr "%1 نى كىرگۈزۈڭ"
343335
344−#: qml/Shell.qml:349
336+#: qml/Shell.qml:355
345337#, qt-format
346338msgid "Sorry, incorrect %1"
347339msgstr "كەچۈرۈڭ، %1 توغرا ئەمەس"
348340
349−#: qml/Shell.qml:384
341+#: qml/Shell.qml:390
350342msgid "Sorry, incorrect passphrase."
351343msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
352344
353−#: qml/Shell.qml:385
345+#: qml/Shell.qml:391
354346msgid "Sorry, incorrect passcode."
355347msgstr "كەچۈرۈڭ، ئىم كودى ئەمەس"
356348
357−#: qml/Shell.qml:386
349+#: qml/Shell.qml:392
358350msgid "This will be your last attempt."
359351msgstr "بۇ سىزنىڭ ئەڭ ئاخىرقى پۇرسىتىڭىز"
360352
361−#: qml/Shell.qml:388
353+#: qml/Shell.qml:394
362354msgid ""
363355"If passphrase is entered incorrectly, your phone will conduct a factory "
364356"reset and all personal data will be deleted."
@@ -366,7 +358,7 @@ msgstr ""
366358"ئەگەر ئىم توغرا بولمىسا، تېلېفونىڭىز ئەسلىگە قايتۇرۇلۇپ، زاۋۇتتىن چىققان "
367359"ھالەتكە كېلىپ قالىدۇ. بارلىق مەزمۇنلار يوقىلىدۇ."
368360
369−#: qml/Shell.qml:389
361+#: qml/Shell.qml:395
370362msgid ""
371363"If passcode is entered incorrectly, your phone will conduct a factory reset "
372364"and all personal data will be deleted."
@@ -374,28 +366,8 @@ msgstr ""
374366"ئەگەر ئىم كودى توغرا بولمىسا، تېلېفونىڭىز ئەسلىگە قايتۇرۇلۇپ، زاۋۇتتىن "
375367"چىققان ھالەتكە كېلىپ قالىدۇ. بارلىق مەزمۇنلار يوقىلىدۇ."
376368
377−#, qt-format
378−#~ msgid "Hello %1"
379−#~ msgstr "سالام %1"
380−
381−#~ msgid "Swipe to unlock"
382−#~ msgstr "سىيرىسىڭىز قۇلۇپسىزلىنىدۇ"
383−
384−#~ msgid "Hello"
385−#~ msgstr "ئەسسالامۇئەلەيكۇم"
386−
387−#~ msgid "Please wait"
388−#~ msgstr "سەل ساقلاڭ"
389−
390−#~ msgid "Enter your passphrase"
391−#~ msgstr "ئىمىڭىزنى كىرگۈزۈڭ"
369+#~ msgid "Enter SIM PIN"
370+#~ msgstr "SIM نىڭ ئىمى(PIN) نى كىرگۈزۈڭ"
392371
393−#~ msgid "Enter your passcode"
394−#~ msgstr "ئىمىڭىزنى كىرگۈزۈڭ"
395−
396−#~ msgid "Too many incorrect attempts"
397−#~ msgstr "مەغلۇپ بولۇش سانى چەكتىن ئېشىپ كەتتى"
398−
399−#, qt-format
400−#~ msgid "Enter your %1"
401−#~ msgstr "%1 نى كىرگۈزۈڭ"
372+#~ msgid "Sorry, incorrect PIN"
373+#~ msgstr "كەچۈرۈڭ، PIN توغرا ئەمەس"
po/uk.po+27−55
@@ -7,8 +7,8 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11−"PO-Revision-Date: 2014-10-03 12:44+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-08 12:02+0000\n"
1212"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
1313"Language-Team: Ukrainian <uk@li.org>\n"
1414"MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
2020"X-Generator: Launchpad (build 17196)\n"
2121
2222#: plugins/LightDM/Greeter.cpp:130
@@ -165,23 +165,23 @@ msgstr ""
165165"Вами налаштовано дії у відповідь на дотики на краях екрана. Тепер телефоном "
166166"можна користуватися.<br><br>Торкніться екрана, щоб розпочати."
167167
168−#: qml/Components/Lockscreen.qml:218
168+#: qml/Components/Lockscreen.qml:220
169169msgid "Emergency Call"
170170msgstr "Терміновий виклик"
171171
172−#: qml/Components/Lockscreen.qml:250
172+#: qml/Components/Lockscreen.qml:252
173173msgid "OK"
174174msgstr "Гаразд"
175175
176−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
176+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
177177msgid "See less"
178178msgstr "Стисліше"
179179
180−#: qml/Dash/GenericScopeView.qml:411
180+#: qml/Dash/GenericScopeView.qml:434
181181msgid "See all"
182182msgstr "Детальніше"
183183
184−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
184+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
185185#: qml/Panel/SearchIndicator.qml:27
186186msgid "Search"
187187msgstr "Пошук"
@@ -220,11 +220,11 @@ msgstr "Надіслати"
220220
221221#: qml/Dash/PullToRefreshScopeStyle.qml:55
222222msgid "Pull to refresh…"
223−msgstr ""
223+msgstr "Потягніть для оновлення…"
224224
225225#: qml/Dash/PullToRefreshScopeStyle.qml:60
226226msgid "Release to refresh…"
227−msgstr ""
227+msgstr "Відпустіть для оновлення…"
228228
229229#: qml/Dash/ScopesOverview.qml:206
230230msgid "Manage Scopes"
@@ -270,18 +270,10 @@ msgstr "Можна говорити…"
270270msgid "Speaking..."
271271msgstr "Мовлення…"
272272
273−#: qml/Notifications/NotificationMenuItemFactory.qml:108
273+#: qml/Notifications/NotificationMenuItemFactory.qml:116
274274msgid "Show password"
275275msgstr "Показати пароль"
276276
277−#: qml/Notifications/NotificationMenuItemFactory.qml:124
278−msgid "Enter SIM PIN"
279−msgstr "Введіть PIN-код SIM-картки"
280−
281−#: qml/Notifications/NotificationMenuItemFactory.qml:125
282−msgid "Sorry, incorrect PIN"
283−msgstr "Вибачте, помилковий PIN-код"
284−
285277#: qml/Panel/ActiveCallHint.qml:77
286278msgid "Tap to return to call..."
287279msgstr "Торкніться, щоб повернутися до дзвінка…"
@@ -326,49 +318,49 @@ msgstr "Розблокувати SIM"
326318msgid "Roaming"
327319msgstr "Роумінг"
328320
329−#: qml/Shell.qml:340
321+#: qml/Shell.qml:346
330322msgid "Enter passphrase"
331323msgstr "Введіть пароль"
332324
333−#: qml/Shell.qml:341
325+#: qml/Shell.qml:347
334326msgid "Sorry, incorrect passphrase"
335327msgstr "Вибачте, помилковий пароль"
336328
337−#: qml/Shell.qml:342
329+#: qml/Shell.qml:348
338330msgid "Please re-enter"
339331msgstr "Ввведіть ще раз"
340332
341−#: qml/Shell.qml:344
333+#: qml/Shell.qml:350
342334msgid "Enter passcode"
343335msgstr "Введіть код"
344336
345−#: qml/Shell.qml:345
337+#: qml/Shell.qml:351
346338msgid "Sorry, incorrect passcode"
347339msgstr "Вибачте, помилковий код-пароль"
348340
349−#: qml/Shell.qml:348
341+#: qml/Shell.qml:354
350342#, qt-format
351343msgid "Enter %1"
352344msgstr "Введіть %1"
353345
354−#: qml/Shell.qml:349
346+#: qml/Shell.qml:355
355347#, qt-format
356348msgid "Sorry, incorrect %1"
357349msgstr "Вибачте, помилковий %1"
358350
359−#: qml/Shell.qml:384
351+#: qml/Shell.qml:390
360352msgid "Sorry, incorrect passphrase."
361353msgstr "Вибачте, помилковий пароль."
362354
363−#: qml/Shell.qml:385
355+#: qml/Shell.qml:391
364356msgid "Sorry, incorrect passcode."
365357msgstr "Вибачте, помилковий код-пароль."
366358
367−#: qml/Shell.qml:386
359+#: qml/Shell.qml:392
368360msgid "This will be your last attempt."
369361msgstr "Ця спроба буде останньою."
370362
371−#: qml/Shell.qml:388
363+#: qml/Shell.qml:394
372364msgid ""
373365"If passphrase is entered incorrectly, your phone will conduct a factory "
374366"reset and all personal data will be deleted."
@@ -376,7 +368,7 @@ msgstr ""
376368"Якщо пароль буде вказано неправильно, телефон повернеться до початкового "
377369"стану, усі особисті дані буде вилучено."
378370
379−#: qml/Shell.qml:389
371+#: qml/Shell.qml:395
380372msgid ""
381373"If passcode is entered incorrectly, your phone will conduct a factory reset "
382374"and all personal data will be deleted."
@@ -384,28 +376,8 @@ msgstr ""
384376"Якщо код-пароль буде вказано неправильно, телефон повернеться до початкового "
385377"стану, усі особисті дані буде вилучено."
386378
387−#, qt-format
388−#~ msgid "Hello %1"
389−#~ msgstr "Привіт, %1"
390−
391−#~ msgid "Hello"
392−#~ msgstr "Привіт!"
393−
394−#~ msgid "Swipe to unlock"
395−#~ msgstr "Проведіть пальцем, щоб розблокувати"
396−
397−#~ msgid "Please wait"
398−#~ msgstr "Будь ласка, зачекайте"
399−
400−#~ msgid "Too many incorrect attempts"
401−#~ msgstr "Забагато помилкових спроб"
402−
403−#, qt-format
404−#~ msgid "Enter your %1"
405−#~ msgstr "Вкажіть ваш %1"
406−
407−#~ msgid "Enter your passphrase"
408−#~ msgstr "Введіть ваш пароль"
379+#~ msgid "Sorry, incorrect PIN"
380+#~ msgstr "Вибачте, помилковий PIN-код"
409381
410−#~ msgid "Enter your passcode"
411−#~ msgstr "Введіть ваш код-пароль"
382+#~ msgid "Enter SIM PIN"
383+#~ msgstr "Введіть PIN-код SIM-картки"
po/unity8.pot+19−27
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257257msgid "Speaking..."
258258msgstr ""
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
po/vi.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-01-15 01:19+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Vietnamese <vi@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257257msgid "Speaking..."
258258msgstr ""
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
po/xh.po+20−28
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2013-09-28 13:20+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Xhosa <xh@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr ""
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr ""
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr ""
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr ""
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr ""
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257257msgid "Speaking..."
258258msgstr ""
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr ""
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
po/zh_CN.po+20−38
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-08-12 14:09+0000\n"
1212"Last-Translator: Anthony Wong <anthony.wong@ubuntu.com>\n"
1313"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr "您现在已经掌握了边缘滑动手势,可以开始使用手机了<br><br>请点击屏幕开始使用"
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr "紧急电话"
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr "确定"
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr "显示更少"
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr "查看全部"
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "搜索"
@@ -257,18 +257,10 @@ msgstr "现在请讲..."
257257msgid "Speaking..."
258258msgstr "讲话中..."
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr "显示密码"
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr "点击回到通话..."
@@ -313,66 +305,56 @@ msgstr "解开 SIM"
313305msgid "Roaming"
314306msgstr "漫游"
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
368360msgstr ""
369−
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "你好,%1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "你好"
376−
377−#~ msgid "Swipe to unlock"
378−#~ msgstr "滑动解锁"
po/zh_HK.po+20−38
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-08-10 11:45+0000\n"
1212"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
1313"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152152"phone<br><br>Tap on the screen to start"
153153msgstr "您現在已熟練邊緣手勢,可以開始使用手機了<br><br>輕觸螢幕開始使用"
154154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156156msgid "Emergency Call"
157157msgstr "緊急電話"
158158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160160msgid "OK"
161161msgstr "確定"
162162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164164msgid "See less"
165165msgstr "縮減查看"
166166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168168msgid "See all"
169169msgstr "查看全部"
170170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172172#: qml/Panel/SearchIndicator.qml:27
173173msgid "Search"
174174msgstr "搜尋"
@@ -257,18 +257,10 @@ msgstr "請講..."
257257msgid "Speaking..."
258258msgstr "正在講..."
259259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261261msgid "Show password"
262262msgstr "顯示密碼"
263263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272264#: qml/Panel/ActiveCallHint.qml:77
273265msgid "Tap to return to call..."
274266msgstr "輕觸可返回通話…"
@@ -313,66 +305,56 @@ msgstr ""
313305msgid "Roaming"
314306msgstr ""
315307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317309msgid "Enter passphrase"
318310msgstr ""
319311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321313msgid "Sorry, incorrect passphrase"
322314msgstr ""
323315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325317msgid "Please re-enter"
326318msgstr ""
327319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329321msgid "Enter passcode"
330322msgstr ""
331323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333325msgid "Sorry, incorrect passcode"
334326msgstr ""
335327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337329#, qt-format
338330msgid "Enter %1"
339331msgstr ""
340332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342334#, qt-format
343335msgid "Sorry, incorrect %1"
344336msgstr ""
345337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347339msgid "Sorry, incorrect passphrase."
348340msgstr ""
349341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351343msgid "Sorry, incorrect passcode."
352344msgstr ""
353345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355347msgid "This will be your last attempt."
356348msgstr ""
357349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359351msgid ""
360352"If passphrase is entered incorrectly, your phone will conduct a factory "
361353"reset and all personal data will be deleted."
362354msgstr ""
363355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365357msgid ""
366358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367359"and all personal data will be deleted."
368360msgstr ""
369−
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "您好 %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "您好"
376−
377−#~ msgid "Swipe to unlock"
378−#~ msgstr "滑動解除鎖定"
po/zh_TW.po+24−52
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
1111"PO-Revision-Date: 2014-07-26 16:21+0000\n"
1212"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
1313"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1919"X-Generator: Launchpad (build 17196)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:130
@@ -151,23 +151,23 @@ msgid ""
151151"phone<br><br>Tap on the screen to start"
152152msgstr "您現在已熟練邊緣手勢,可以開始使用手機了<br><br>輕觸螢幕開始使用"
153153
154−#: qml/Components/Lockscreen.qml:218
154+#: qml/Components/Lockscreen.qml:220
155155msgid "Emergency Call"
156156msgstr "緊急通話"
157157
158−#: qml/Components/Lockscreen.qml:250
158+#: qml/Components/Lockscreen.qml:252
159159msgid "OK"
160160msgstr "確定"
161161
162−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
162+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
163163msgid "See less"
164164msgstr "縮減查看"
165165
166−#: qml/Dash/GenericScopeView.qml:411
166+#: qml/Dash/GenericScopeView.qml:434
167167msgid "See all"
168168msgstr "查看全部"
169169
170−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
170+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
171171#: qml/Panel/SearchIndicator.qml:27
172172msgid "Search"
173173msgstr "搜尋"
@@ -256,18 +256,10 @@ msgstr "請說..."
256256msgid "Speaking..."
257257msgstr "說話中..."
258258
259−#: qml/Notifications/NotificationMenuItemFactory.qml:108
259+#: qml/Notifications/NotificationMenuItemFactory.qml:116
260260msgid "Show password"
261261msgstr "顯示密碼"
262262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:124
264−msgid "Enter SIM PIN"
265−msgstr "輸入 SIM 卡 PIN 碼"
266−
267−#: qml/Notifications/NotificationMenuItemFactory.qml:125
268−msgid "Sorry, incorrect PIN"
269−msgstr "抱歉,PIN 碼不對"
270−
271263#: qml/Panel/ActiveCallHint.qml:77
272264msgid "Tap to return to call..."
273265msgstr "輕觸可返回通話…"
@@ -312,82 +304,62 @@ msgstr "為 SIM 卡解鎖"
312304msgid "Roaming"
313305msgstr "漫遊"
314306
315−#: qml/Shell.qml:340
307+#: qml/Shell.qml:346
316308msgid "Enter passphrase"
317309msgstr "輸入密語"
318310
319−#: qml/Shell.qml:341
311+#: qml/Shell.qml:347
320312msgid "Sorry, incorrect passphrase"
321313msgstr "抱歉,密語不對"
322314
323−#: qml/Shell.qml:342
315+#: qml/Shell.qml:348
324316msgid "Please re-enter"
325317msgstr "請再輸入"
326318
327−#: qml/Shell.qml:344
319+#: qml/Shell.qml:350
328320msgid "Enter passcode"
329321msgstr "輸入 passcode"
330322
331−#: qml/Shell.qml:345
323+#: qml/Shell.qml:351
332324msgid "Sorry, incorrect passcode"
333325msgstr "抱歉,passcode 不對"
334326
335−#: qml/Shell.qml:348
327+#: qml/Shell.qml:354
336328#, qt-format
337329msgid "Enter %1"
338330msgstr "輸入 %1"
339331
340−#: qml/Shell.qml:349
332+#: qml/Shell.qml:355
341333#, qt-format
342334msgid "Sorry, incorrect %1"
343335msgstr "抱歉,%1不對"
344336
345−#: qml/Shell.qml:384
337+#: qml/Shell.qml:390
346338msgid "Sorry, incorrect passphrase."
347339msgstr "抱歉,密語不對"
348340
349−#: qml/Shell.qml:385
341+#: qml/Shell.qml:391
350342msgid "Sorry, incorrect passcode."
351343msgstr "抱歉,passcode 不對。"
352344
353−#: qml/Shell.qml:386
345+#: qml/Shell.qml:392
354346msgid "This will be your last attempt."
355347msgstr "這將會是您最後一次嘗試的機會。"
356348
357−#: qml/Shell.qml:388
349+#: qml/Shell.qml:394
358350msgid ""
359351"If passphrase is entered incorrectly, your phone will conduct a factory "
360352"reset and all personal data will be deleted."
361353msgstr "如輸入的密語不對,本電話會進行重設,所有個人資料都會刪除。"
362354
363−#: qml/Shell.qml:389
355+#: qml/Shell.qml:395
364356msgid ""
365357"If passcode is entered incorrectly, your phone will conduct a factory reset "
366358"and all personal data will be deleted."
367359msgstr "如輸入的 passcode 不對,本電話會進行重設,所有個人資料都會刪除。"
368360
369−#, qt-format
370−#~ msgid "Hello %1"
371−#~ msgstr "%1 您好"
372−
373−#~ msgid "Hello"
374−#~ msgstr "您好"
375−
376−#~ msgid "Swipe to unlock"
377−#~ msgstr "滑開解除鎖定"
378−
379−#~ msgid "Please wait"
380−#~ msgstr "請稍候"
381−
382−#, qt-format
383−#~ msgid "Enter your %1"
384−#~ msgstr "輸入您的 %1"
385−
386−#~ msgid "Too many incorrect attempts"
387−#~ msgstr "錯得太多次"
388−
389−#~ msgid "Enter your passphrase"
390−#~ msgstr "輸入密語"
361+#~ msgid "Enter SIM PIN"
362+#~ msgstr "輸入 SIM 卡 PIN 碼"
391363
392−#~ msgid "Enter your passcode"
393−#~ msgstr "輸入密碼"
364+#~ msgid "Sorry, incorrect PIN"
365+#~ msgstr "抱歉,PIN 碼不對"
qml/Components/Carousel.qml+2−3
@@ -17,6 +17,7 @@
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import "carousel.js" as CarouselJS
20+import "Flickables" as Flickables
2021
2122/*! The Carousel component presents the items of a model in a carousel view. It's similar to a
2223 cover flow. But it stops at it's boundaries (therefore no PathView is used).
@@ -63,7 +64,7 @@ Item {
6364 and footer item to compensate that.
6465
6566 The scaling of the items is controlled by the variable continuousIndex, described below. */
66− ListView {
67+ Flickables.ListView {
6768 id: listView
6869 objectName: "listView"
6970
@@ -135,8 +136,6 @@ Item {
135136
136137 boundsBehavior: Flickable.DragOverBounds
137138 cacheBuffer: carousel.cacheBuffer
138− flickDeceleration: Math.max(1500 * Math.pow(realWidth / referenceWidth, 1.5), 1500) // 1500 is platform default
139− maximumFlickVelocity: Math.max(2500 * Math.pow(realWidth / referenceWidth, 1.5), 2500) // 2500 is platform default
140139 orientation: ListView.Horizontal
141140
142141 function getXFromContinuousIndex(index) {
qml/Components/DragHandle.qml+2−2
@@ -47,12 +47,12 @@ EdgeDragArea {
4747 id: dragArea
4848 objectName: "dragHandle"
4949
50− // Disable most of the gesture recognition parameters by default when hinting is used as
50+ // Disable gesture recognition by default when hinting is used as
5151 // it conflicts with the hinting idea.
52− // The only part we keep in this situation is that it must be a single-finger gesture.
5352 distanceThreshold: hintDisplacement > 0 ? 0 : defaultDistanceThreshold
5453 maxSilenceTime: hintDisplacement > 0 ? 60*60*1000 : defaultMaxSilenceTime
5554 maxDeviation: hintDisplacement > 0 ? 999999 : defaultMaxDeviation
55+ compositionTime: hintDisplacement > 0 ? 0 : defaultCompositionTime
5656
5757 property bool stretch: false
5858
qml/Components/EdgeDragArea.qml+2
@@ -34,6 +34,7 @@ DirectionalDragArea {
3434 distanceThreshold: defaultDistanceThreshold
3535 minSpeed: defaultMinSpeed
3636 maxSilenceTime: defaultMaxSilenceTime
37+ compositionTime: defaultCompositionTime
3738
3839 readonly property real defaultMaxDeviation: units.gu(3)
3940 readonly property real defaultWideningAngle: 50
@@ -41,4 +42,5 @@ DirectionalDragArea {
4142 // some people were getting false negatives with it enabled.
4243 readonly property real defaultMinSpeed: units.gu(0)
4344 readonly property int defaultMaxSilenceTime: 200
45+ readonly property int defaultCompositionTime: 60
4446}
qml/Components/Flickables/Flickable.qmlnew file+23
@@ -0,0 +1,23 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.3 as QtQuick
18+import Ubuntu.Components 1.1
19+
20+QtQuick.Flickable {
21+ flickDeceleration: 1500 * units.gridUnit / 8
22+ maximumFlickVelocity: 2500 * units.gridUnit / 8
23+}
qml/Components/Flickables/GridView.qmlnew file+25
@@ -0,0 +1,25 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.3 as QtQuick
18+import Ubuntu.Components 1.1
19+
20+QtQuick.GridView {
21+ // Attached components and usages like GridView.onRemove are known not to work
22+ // please use GridView directly from QtQuick if needed
23+ flickDeceleration: 1500 * units.gridUnit / 8
24+ maximumFlickVelocity: 2500 * units.gridUnit / 8
25+}
qml/Components/Flickables/ListView.qmlnew file+25
@@ -0,0 +1,25 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.3 as QtQuick
18+import Ubuntu.Components 1.1
19+
20+QtQuick.ListView {
21+ // Attached components and usages like ListView.onRemove are known not to work
22+ // please use ListView directly from QtQuick if needed
23+ flickDeceleration: 1500 * units.gridUnit / 8
24+ maximumFlickVelocity: 2500 * units.gridUnit / 8
25+}
qml/Components/Flickables/ListViewWithPageHeader.qmlnew file+23
@@ -0,0 +1,23 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import Dash 0.1
18+import Ubuntu.Components 1.1
19+
20+ListViewWithPageHeader {
21+ flickDeceleration: 1500 * units.gridUnit / 8
22+ maximumFlickVelocity: 2500 * units.gridUnit / 8
23+}
qml/Components/InputMethod.qml+13
@@ -17,6 +17,7 @@
1717import QtQuick 2.0
1818import Unity.Application 0.1
1919import Ubuntu.Components 0.1
20+import Ubuntu.Gestures 0.1
2021
2122Item {
2223 id: root
@@ -25,6 +26,18 @@ Item {
2526
2627 property int transitionDuration: UbuntuAnimation.FastDuration
2728
29+ Binding { target: surface; property: "z"; value: 0 }
30+
31+ TouchGate {
32+ x: UbuntuKeyboardInfo.x
33+ y: UbuntuKeyboardInfo.y
34+ z: 1
35+ width: UbuntuKeyboardInfo.width
36+ height: UbuntuKeyboardInfo.height
37+
38+ targetItem: root.surface
39+ }
40+
2841 state: {
2942 if (surface && surface.state != MirSurfaceItem.Minimized) {
3043 return "shown";
qml/Components/ListItems/Base.qmldeleted−125
@@ -1,125 +0,0 @@
1−/*
2− * Copyright (C) 2012 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−
20−AbstractButton {
21− id: emptyListItem
22− width: parent ? parent.width : units.gu(31)
23− height: body.height + bottomDividerLine.height
24−
25− /*!
26− \preliminary
27− Specifies whether the list item is selected.
28− */
29− property bool selected: false
30−
31− /*!
32− \preliminary
33− Highlight the list item when it is pressed.
34− This is used to disable the highlighting of the full list item
35− when custom highlighting needs to be implemented (for example in
36− ListItem.Standard which can have a split).
37− */
38− property bool highlightWhenPressed: true
39−
40− /*!
41− \preliminary
42− Set to show or hide the thin bottom divider line (drawn by the \l ThinDivider component).
43− This line is shown by default except in cases where this item is the delegate of a ListView.
44− */
45− property bool showDivider: __showDivider()
46−
47− /*!
48− \internal
49− Method to automatically determine if the bottom divider line should be drawn.
50− This always returns true, unless item is a delegate in a ListView. If in a ListView
51− it will return false only when:
52− + if this is the final item in the list, and ListView.footer is set (again as thin
53− divider line won't look well with footer below it)
54− */
55− function __showDivider() {
56− // if we're not in ListView, always show a thin dividing line at the bottom
57− var model = null;
58− if (typeof ListViewWithPageHeader !== 'undefined') {
59− if (typeof ListViewWithPageHeader.model !== 'undefined') {
60− model = ListViewWithPageHeader.model;
61− }
62− } else if (ListView.view !== null) {
63− model = ListView.view.model;
64− }
65− // if we're last item in ListView don't show divider
66− if (model && index === model.count - 1) return false;
67−
68− return true;
69− }
70−
71− /* Relevant really only for ListViewWithPageHeader case: specify how many pixels we can overlap with the section header */
72− readonly property int allowedOverlap: units.dp(1)
73−
74− property real __heightToClip: {
75− // Check this is in position where clipping is needed
76− if (typeof ListViewWithPageHeader !== 'undefined') {
77− if (typeof heightToClip !== 'undefined') {
78− if (heightToClip >= allowedOverlap) {
79− return heightToClip - allowedOverlap;
80− }
81− }
82− }
83− return 0;
84− }
85−
86− /*!
87− \internal
88− Reparent so that the visuals of the children does not
89− occlude the bottom divider line.
90− */
91− default property alias children: body.children
92−
93− Item {
94− id: clippingContainer
95− height: parent.height - __heightToClip
96− anchors { left: parent.left; right: parent.right; bottom: parent.bottom }
97− clip: __heightToClip > 0
98−
99− Item {
100− id: body
101− anchors {
102− left: parent.left
103− right: parent.right
104− bottom: bottomDividerLine.top
105− }
106− height: childrenRect.height
107− }
108−
109− ThinDivider {
110− id: bottomDividerLine
111− anchors.bottom: parent.bottom
112− visible: showDivider
113− }
114−
115− Highlight {
116− anchors {
117− top: parent.top
118− left: parent.left
119− right: parent.right
120− bottom: bottomDividerLine.top
121− }
122− pressed: (emptyListItem.selected || (emptyListItem.highlightWhenPressed && emptyListItem.pressed)) ? "pressed" : ""
123− }
124− }
125−}
qml/Components/ListItems/Highlight.qmldeleted−46
@@ -1,46 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−Rectangle {
20− id: highlight
21−
22− property bool pressed: false
23− property real pressedOpacity: 0.3
24−
25− color: "black"
26− opacity: 0
27− state: pressed ? "pressed" : ""
28− states: [
29− State {
30− name: "pressed"
31− PropertyChanges { target: highlight; opacity: pressedOpacity}
32− }
33− ]
34− transitions: [
35− Transition {
36− from: ""
37− to: "pressed"
38− NumberAnimation { target: highlight; property: "opacity"; duration: 50}
39− },
40− Transition {
41− from: "pressed"
42− to: ""
43− NumberAnimation { target: highlight; property: "opacity"; duration: 100}
44− }
45− ]
46−}
qml/Components/Lockscreen.qml+3−1
@@ -78,7 +78,9 @@ Showable {
7878 }
7979
8080 function showInfoPopup(title, text) {
81− PopupUtils.open(infoPopupComponent, root, {title: title, text: text})
81+ var popup = PopupUtils.open(infoPopupComponent, root, {title: title, text: text})
82+ // FIXME: SDK will do this internally soonish
83+ popup.z = Number.MAX_VALUE
8284 }
8385
8486 Rectangle {
qml/Components/PinLockscreen.qml+1
@@ -114,6 +114,7 @@ Column {
114114 horizontalAlignment: Text.AlignHCenter
115115 text: root.errorText
116116 visible: pinentryField.incorrectOverride
117+ scale: Math.min(1, parent.width / width)
117118 }
118119
119120 AbstractButton {
qml/Components/ResponsiveGridView.qml+2−1
@@ -16,6 +16,7 @@
1616
1717import QtQuick 2.3
1818import Ubuntu.Components 0.1
19+import "Flickables" as Flickables
1920
2021/*
2122 Essentially a GridView where you can specify the maximum number of columns it can have.
@@ -55,7 +56,7 @@ Item {
5556 return rows * height
5657 }
5758
58− GridView {
59+ Flickables.GridView {
5960 id: gridView
6061 objectName: "responsiveGridViewGrid"
6162 anchors {
qml/Components/ResponsiveVerticalJournal.qml+3−2
@@ -47,7 +47,9 @@ Item {
4747 property alias delegate: verticalJournalView.delegate
4848 property alias displayMarginBeginning: verticalJournalView.displayMarginBeginning
4949 property alias displayMarginEnd: verticalJournalView.displayMarginEnd
50− implicitHeight: verticalJournalView.implicitHeight
50+
51+ implicitHeight: verticalJournalView.implicitHeight + rowSpacing
52+ clip: height < implicitHeight
5153
5254 VerticalJournal {
5355 id: verticalJournalView
@@ -59,7 +61,6 @@ Item {
5961 topMargin: rowSpacing / 2
6062 bottomMargin: rowSpacing / 2
6163 }
62− clip: parent.height != implicitHeight
6364
6465 function px2gu(pixels) {
6566 return Math.floor(pixels / units.gu(1))
qml/Components/ZoomableImage.qml+2−2
@@ -16,7 +16,7 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19−import "../Components"
19+import "Flickables" as Flickables
2020
2121/*! \brief Zoomable for image.
2222
@@ -32,7 +32,7 @@ Item {
3232 property alias scaleTo: lazyImage.scaleTo
3333 property alias asynchronous: lazyImage.asynchronous
3434
35− Flickable {
35+ Flickables.Flickable {
3636 id: flickable
3737 objectName: "flickable"
3838 clip: true
qml/Dash/CardHorizontalList.qml+2−1
@@ -17,6 +17,7 @@
1717import QtQuick 2.2
1818import Ubuntu.Components 1.1
1919import "../Components"
20+import "../Components/Flickables" as Flickables
2021
2122DashRenderer {
2223 id: root
@@ -25,7 +26,7 @@ DashRenderer {
2526 collapsedHeight: expandedHeight
2627 clip: true
2728
28− ListView {
29+ Flickables.ListView {
2930 id: listView
3031 anchors {
3132 fill: parent
qml/Dash/Dash.qml+32−11
@@ -29,7 +29,6 @@ Showable {
2929 visible: shown
3030
3131 property string showScopeOnLoaded: "clickscope"
32− property real contentScale: 1.0
3332
3433 DashCommunicatorService {
3534 objectName: "dashCommunicatorService"
@@ -41,8 +40,9 @@ Showable {
4140 if (window.active) {
4241 dashContentCache.scheduleUpdate();
4342 }
44− overviewController.enableAnimation = window.active;
43+ overviewController.enableAnimation = window.active && !scopesOverview.showingNonFavoriteScope;
4544 overviewController.progress = 0;
45+ scopesOverview.closeTempScope();
4646 }
4747 }
4848 }
@@ -190,7 +190,6 @@ Showable {
190190 dash.showScopeOnLoaded = ""
191191 }
192192 }
193− scale: dash.contentScale
194193 clip: scale != 1.0 || scopeItem.visible || overviewController.progress != 0
195194 Behavior on x {
196195 UbuntuNumberAnimation {
@@ -208,6 +207,12 @@ Showable {
208207 }
209208 }
210209
210+ // This is to avoid the situation where a bottom-edge swipe would bring up the dash overview
211+ // (as expected) but would also cause the dash content flickable to move a bit, because
212+ // that flickable was getting the touch events while overviewDragHandle was still undecided
213+ // about whether that touch was indeed performing a directional drag gesture.
214+ forceNonInteractive: overviewDragHandle.status != DirectionalDragArea.WaitingForTouch
215+
211216 enabled: overviewController.progress == 0
212217 opacity: enabled ? 1 : 0
213218 }
@@ -245,7 +250,7 @@ Showable {
245250 y: overviewController.progress == 0 ? dashContent.y : overviewProgressY
246251 width: parent.width
247252 height: parent.height
248− scale: dash.contentScale * overviewProgressScale
253+ scale: overviewProgressScale
249254 enabled: opacity == 1
250255 opacity: 1 - overviewController.progress
251256 clip: scale != 1.0
@@ -364,16 +369,32 @@ Showable {
364369 height: units.gu(2)
365370
366371 onSceneDistanceChanged: {
367− if (overviewController.enableAnimation) {
368− dashContentCache.scheduleUpdate();
372+ if (status == DirectionalDragArea.Recognized && initialSceneDistance != -1) {
373+ if (overviewController.enableAnimation) {
374+ dashContentCache.scheduleUpdate();
375+ }
376+ overviewController.enableAnimation = false;
377+ var deltaDistance = sceneDistance - initialSceneDistance;
378+ overviewController.progress = Math.max(0, Math.min(1, deltaDistance / fullMovement));
369379 }
370− overviewController.enableAnimation = false;
371− overviewController.progress = Math.max(0, Math.min(1, sceneDistance / fullMovement));
372380 }
373381
374− onDraggingChanged: {
375− overviewController.enableAnimation = true;
376− overviewController.progress = (overviewController.progress > 0.7) ? 1 : 0;
382+ property int previousStatus: -1
383+ property int currentStatus: DirectionalDragArea.WaitingForTouch
384+ property real initialSceneDistance: -1
385+
386+ onStatusChanged: {
387+ previousStatus = currentStatus;
388+ currentStatus = status;
389+
390+ if (status == DirectionalDragArea.Recognized) {
391+ initialSceneDistance = sceneDistance;
392+ } else if (status == DirectionalDragArea.WaitingForTouch &&
393+ previousStatus == DirectionalDragArea.Recognized) {
394+ overviewController.enableAnimation = true;
395+ overviewController.progress = (overviewController.progress > 0.7) ? 1 : 0;
396+ initialSceneDistance = -1;
397+ }
377398 }
378399 }
379400
qml/Dash/DashCategoryBase.qmlnew file+62
@@ -0,0 +1,62 @@
1+/*
2+ * Copyright (C) 2012-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+
20+Item {
21+ width: parent.width
22+ height: body.height
23+
24+ /* Relevant really only for ListViewWithPageHeader case: specify how many pixels we can overlap with the section header */
25+ readonly property int allowedOverlap: units.dp(1)
26+
27+ property real __heightToClip: {
28+ // Check this is in position where clipping is needed
29+ if (typeof ListViewWithPageHeader !== 'undefined') {
30+ if (typeof heightToClip !== 'undefined') {
31+ if (heightToClip >= allowedOverlap) {
32+ return heightToClip - allowedOverlap;
33+ }
34+ }
35+ }
36+ return 0;
37+ }
38+
39+ /*!
40+ \internal
41+ Reparent so that the visuals of the children does not
42+ occlude the bottom divider line.
43+ */
44+ default property alias children: body.children
45+
46+ Item {
47+ id: clippingContainer
48+ height: parent.height - __heightToClip
49+ anchors { left: parent.left; right: parent.right; bottom: parent.bottom }
50+ clip: __heightToClip > 0
51+
52+ Item {
53+ id: body
54+ anchors {
55+ left: parent.left
56+ right: parent.right
57+ bottom: parent.bottom
58+ }
59+ height: childrenRect.height
60+ }
61+ }
62+}
qml/Dash/DashContent.qml+6−4
@@ -19,10 +19,12 @@ import Ubuntu.Components 0.1
1919import Unity 0.2
2020import Utils 0.1
2121import "../Components"
22+import "../Components/Flickables" as Flickables
2223
2324Item {
2425 id: dashContent
2526
27+ property bool forceNonInteractive: false
2628 property alias scopes: dashContentList.model
2729 readonly property alias currentIndex: dashContentList.currentIndex
2830 readonly property string currentScopeId: dashContentList.currentItem ? dashContentList.currentItem.scopeId : ""
@@ -97,16 +99,15 @@ Item {
9799 anchors.fill: parent
98100 }
99101
100− ListView {
102+ Flickables.ListView {
101103 id: dashContentList
102104 objectName: "dashContentList"
103105
104− interactive: dashContent.scopes.loaded && currentItem && !currentItem.moving && !currentItem.navigationShown && !currentItem.subPageShown
106+ interactive: !dashContent.forceNonInteractive && dashContent.scopes.loaded && currentItem
107+ && !currentItem.moving && !currentItem.navigationShown && !currentItem.subPageShown
105108 anchors.fill: parent
106109 orientation: ListView.Horizontal
107110 boundsBehavior: Flickable.DragAndOvershootBounds
108− flickDeceleration: units.gu(625)
109− maximumFlickVelocity: width * 5
110111 snapMode: ListView.SnapOneItem
111112 highlightMoveDuration: 250
112113 highlightRangeMode: ListView.StrictlyEnforceRange
@@ -180,6 +181,7 @@ Item {
180181 item.paginationCount = Qt.binding(function() { return dashContentList.count } )
181182 item.paginationIndex = Qt.binding(function() { return dashContentList.currentIndex } )
182183 item.holdingList = dashContentList;
184+ item.forceNonInteractive = Qt.binding(function() { return dashContent.forceNonInteractive } )
183185 }
184186 Connections {
185187 target: isCurrent ? scope : null
qml/Dash/DashNavigationButton.qml+2−1
@@ -16,6 +16,7 @@
1616
1717import QtQuick 2.2
1818import Ubuntu.Components 1.1
19+import "../Components/Flickables" as Flickables
1920
2021AbstractButton {
2122 id: root
@@ -75,7 +76,7 @@ AbstractButton {
7576 }
7677
7778 // navigationListView is outside root
78− ListView {
79+ Flickables.ListView {
7980 id: navigationListView
8081 objectName: "navigationListView"
8182 visible: height > 0
qml/Dash/DashNavigationList.qml+2−1
@@ -17,6 +17,7 @@
1717import QtQuick 2.2
1818import Ubuntu.Components 1.1
1919import "../Components"
20+import "../Components/Flickables" as Flickables
2021
2122Item {
2223 id: root
@@ -45,7 +46,7 @@ Item {
4546 }
4647 }
4748
48− Flickable {
49+ Flickables.Flickable {
4950 id: flickable
5051
5152 anchors.fill: parent
qml/Dash/DashRenderer.qml+2−2
@@ -17,9 +17,9 @@
1717import QtQuick 2.0
1818
1919Item {
20− property int collapsedHeight
20+ property real collapsedHeight
2121
22− property int expandedHeight
22+ property real expandedHeight
2323
2424 property int collapsedItemCount: -1
2525
qml/Dash/GenericScopeView.qml+4−4
@@ -26,6 +26,7 @@ FocusScope {
2626 id: scopeView
2727
2828 readonly property bool navigationShown: pageHeaderLoader.item ? pageHeaderLoader.item.bottomItem[0].openList : false
29+ property bool forceNonInteractive: false
2930 property var scope: null
3031 property SortFilterProxyModel categories: categoryFilter
3132 property bool isCurrent: false
@@ -155,6 +156,7 @@ FocusScope {
155156 ScopeListView {
156157 id: categoryView
157158 objectName: "categoryListView"
159+ interactive: !forceNonInteractive
158160
159161 x: subPageLoader.open ? -width : 0
160162 visible: x != -width
@@ -216,11 +218,9 @@ FocusScope {
216218 }
217219 }
218220
219− delegate: ListItems.Base {
221+ delegate: DashCategoryBase {
220222 id: baseItem
221223 objectName: "dashCategory" + category
222− highlightWhenPressed: false
223− showDivider: false
224224
225225 property Item seeAllButton: seeAll
226226
@@ -243,7 +243,7 @@ FocusScope {
243243 CardTool {
244244 id: cardTool
245245 objectName: "cardTool"
246− count: results.count
246+ count: results ? results.count : 0
247247 template: model.renderer
248248 components: model.components
249249 viewWidth: parent.width
qml/Dash/PageHeader.qml+2−1
@@ -21,6 +21,7 @@ import Ubuntu.Components.Popups 1.0
2121import Ubuntu.Components.ListItems 1.0
2222import "../Components"
2323import "../Components/SearchHistoryModel"
24+import "../Components/Flickables" as Flickables
2425
2526Item {
2627 id: root
@@ -127,7 +128,7 @@ Item {
127128 }
128129 }
129130
130− Flickable {
131+ Flickables.Flickable {
131132 id: headerContainer
132133 objectName: "headerContainer"
133134 clip: contentY < height
qml/Dash/PreviewListView.qml+2−3
@@ -18,6 +18,7 @@ import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import Unity 0.2
2020import "../Components"
21+import "../Components/Flickables" as Flickables
2122import "Previews" as Previews
2223
2324Item {
@@ -52,7 +53,7 @@ Item {
5253 onBackClicked: root.backClicked()
5354 }
5455
55− ListView {
56+ Flickables.ListView {
5657 id: previewListView
5758 objectName: "listView"
5859 anchors {
@@ -66,8 +67,6 @@ Item {
6667 snapMode: ListView.SnapOneItem
6768 boundsBehavior: Flickable.DragAndOvershootBounds
6869 highlightMoveDuration: 250
69− flickDeceleration: units.gu(625)
70− maximumFlickVelocity: width * 5
7170 cacheBuffer: 0
7271
7372 property bool open: false
qml/Dash/Previews/Preview.qml+2−1
@@ -16,6 +16,7 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19+import "../../Components/Flickables" as Flickables
1920
2021/*! \brief This component constructs the Preview UI.
2122 *
@@ -63,7 +64,7 @@ Item {
6364 Repeater {
6465 model: previewModel
6566
66− delegate: ListView {
67+ delegate: Flickables.ListView {
6768 id: column
6869 anchors { top: parent.top; bottom: parent.bottom }
6970 width: row.columnWidth
qml/Dash/Previews/PreviewImageGallery.qml+3−2
@@ -17,6 +17,7 @@
1717import QtQuick 2.0
1818import Ubuntu.Components 1.1
1919import "../../Components"
20+import "../../Components/Flickables" as Flickables
2021
2122/*! This preview widget shows a horizontal list of images.
2223 * The URIs for the images should be an array in widgetData["sources"].
@@ -28,7 +29,7 @@ PreviewWidget {
2829
2930 property Item rootItem: QuickUtils.rootItem(root)
3031
31− ListView {
32+ Flickables.ListView {
3233 id: previewImageListView
3334 objectName: "previewImageListView"
3435 spacing: units.gu(1)
@@ -102,7 +103,7 @@ PreviewWidget {
102103 UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
103104 }
104105
105− ListView {
106+ Flickables.ListView {
106107 id: slideShowListView
107108 objectName: "slideShowListView"
108109 anchors.fill: parent
qml/Dash/Previews/PreviewTextSummary.qml+1−1
@@ -63,7 +63,7 @@ PreviewWidget {
6363 lineHeight: 1.2
6464 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText
6565 opacity: .8
66− text: widgetData["text"]
66+ text: widgetData["text"] || ""
6767 wrapMode: Text.Wrap
6868
6969 Behavior on height {
qml/Dash/ScopeListView.qml+3−6
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -14,11 +14,8 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−import QtQuick 2.0
18−import Dash 0.1
17+import "../Components/Flickables" as Flickables
1918
20−ListViewWithPageHeader {
21− maximumFlickVelocity: height * 10
22− flickDeceleration: height * 2
19+Flickables.ListViewWithPageHeader {
2320 cacheBuffer: Number.MAX_VALUE
2421}
qml/Dash/ScopeSettingsPage.qml+2−1
@@ -18,6 +18,7 @@ import QtQuick 2.2
1818import Ubuntu.Components 1.1
1919import Unity 0.2
2020import "../Components"
21+import "../Components/Flickables" as Flickables
2122import "ScopeSettings"
2223
2324Item {
@@ -39,7 +40,7 @@ Item {
3940 onBackClicked: root.backClicked()
4041 }
4142
42− ListView {
43+ Flickables.ListView {
4344 id: scopeSettings
4445 objectName: "scopeSettings"
4546 anchors {
qml/Dash/ScopesOverview.qml+9−1
@@ -89,6 +89,7 @@ Item {
8989 } else {
9090 root.allFavoriteSelected(scopeId);
9191 }
92+ previewListView.open = false;
9293 }
9394 }
9495
@@ -98,6 +99,14 @@ Item {
9899 value: progress === 1
99100 }
100101
102+ function closeTempScope() {
103+ if (tempScopeItem.scope) {
104+ root.scope.closeScope(tempScopeItem.scope);
105+ tempScopeItem.scope = null;
106+ tempScopeItem.backClicked()
107+ }
108+ }
109+
101110 function animateDashFromAll(scopeId) {
102111 var currentScopePos = allScopeCardPosition(scopeId);
103112 if (currentScopePos) {
@@ -531,7 +540,6 @@ Item {
531540
532541 width: parent.width
533542 height: parent.height
534− scale: dash.contentScale
535543 clip: scale != 1.0
536544 visible: scope != null
537545 hasBackAction: true
qml/Dash/ScopesOverviewAll.qml+2−1
@@ -16,8 +16,9 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19+import "../Components/Flickables" as Flickables
1920
20−Flickable {
21+Flickables.Flickable {
2122 id: root
2223
2324 property alias model: cardGrid.model
qml/Dash/ScopesOverviewFavorites.qml+4−2
@@ -14,9 +14,11 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−import QtQuick 2.0
17+import QtQuick 2.3
18+import Ubuntu.Components 1.1
19+import "../Components/Flickables" as Flickables
1820
19−Flickable {
21+Flickables.Flickable {
2022 id: root
2123
2224 signal clicked(int index, var result, var itemModel)
qml/Greeter/Greeter.qml+13−1
@@ -36,7 +36,7 @@ Showable {
3636
3737 property alias dragHandleWidth: dragHandle.width
3838 property alias model: greeterContentLoader.model
39− property bool locked: shown && !LightDM.Greeter.promptless
39+ property bool locked: true
4040
4141 readonly property bool narrowMode: !multiUser && height > width
4242 readonly property bool multiUser: LightDM.Users.count > 1
@@ -57,6 +57,18 @@ Showable {
5757 }
5858 }
5959
60+ function tryToUnlock() {
61+ if (created) {
62+ greeterContentLoader.item.tryToUnlock()
63+ }
64+ }
65+
66+ function reset() {
67+ if (created) {
68+ greeterContentLoader.item.reset()
69+ }
70+ }
71+
6072 onRequiredChanged: {
6173 // Reset hide animation to default once we're finished with it
6274 if (required) {
qml/Greeter/GreeterContent.qml+12
@@ -29,6 +29,18 @@ Item {
2929 signal selected(int uid)
3030 signal unlocked(int uid)
3131
32+ function tryToUnlock() {
33+ if (loginLoader.item) {
34+ loginLoader.item.tryToUnlock()
35+ }
36+ }
37+
38+ function reset() {
39+ if (loginLoader.item) {
40+ loginLoader.item.reset()
41+ }
42+ }
43+
3244 Rectangle {
3345 // In case background fails to load
3446 id: backgroundBackup
qml/Greeter/LoginList.qml+21−8
@@ -18,6 +18,7 @@ import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import LightDM 0.1 as LightDM
2020import "../Components"
21+import "../Components/Flickables" as Flickables
2122
2223Item {
2324 id: root
@@ -35,6 +36,22 @@ Item {
3536 signal selected(int uid)
3637 signal unlocked(int uid)
3738
39+ function tryToUnlock() {
40+ if (LightDM.Greeter.promptless) {
41+ if (LightDM.Greeter.authenticated) {
42+ root.unlocked(userList.currentIndex)
43+ } else {
44+ root.resetAuthentication()
45+ }
46+ } else {
47+ passwordInput.forceActiveFocus()
48+ }
49+ }
50+
51+ function reset() {
52+ root.resetAuthentication()
53+ }
54+
3855 Keys.onEscapePressed: root.resetAuthentication()
3956
4057 Rectangle {
@@ -52,7 +69,7 @@ Item {
5269 antialiasing: true
5370 }
5471
55− ListView {
72+ Flickables.ListView {
5673 id: userList
5774 objectName: "userList"
5875
@@ -62,7 +79,6 @@ Item {
6279 preferredHighlightEnd: userList.height / 2 - root.highlightedHeight / 2
6380 highlightRangeMode: ListView.StrictlyEnforceRange
6481 highlightMoveDuration: root.moveDuration
65− flickDeceleration: 10000
6682
6783 readonly property bool movingInternally: moveTimer.running || userList.moving
6884
@@ -229,14 +245,11 @@ Item {
229245 }
230246
231247 MouseArea {
248+ id: passwordMouseArea
249+ objectName: "passwordMouseArea"
232250 anchors.fill: passwordInput
233251 enabled: LightDM.Greeter.promptless
234− onClicked: {
235− if (LightDM.Greeter.authenticated)
236− root.unlocked(userList.currentIndex);
237− else
238− root.resetAuthentication();
239− }
252+ onClicked: root.tryToUnlock()
240253 }
241254
242255 function resetAuthentication() {
qml/Hud/Hud.qml+2−1
@@ -19,6 +19,7 @@ import Ubuntu.Components 0.1
1919import HudClient 0.1
2020
2121import "../Components"
22+import "../Components/Flickables" as Flickables
2223
2324Item {
2425 id: hud
@@ -400,7 +401,7 @@ Item {
400401 }
401402 progress: MathUtils.clamp((y - hudShowable.y + height - units.gu(8))/elementsYSliding, 0, 1)
402403
403− Flickable {
404+ Flickables.Flickable {
404405 anchors.left: parent.left
405406 anchors.right: parent.right
406407 contentHeight: resultList.height
qml/Hud/HudParametrizedActionsPage.qml+2−1
@@ -18,6 +18,7 @@ import QtQuick 2.0
1818import Ubuntu.Components 1.1
1919import Ubuntu.Components.Themes.Ambiance 1.1
2020import "../Components"
21+import "../Components/Flickables" as Flickables
2122
2223Item {
2324 property alias header: header.title
@@ -74,7 +75,7 @@ Item {
7475 return values
7576 }
7677
77− Flickable {
78+ Flickables.Flickable {
7879 anchors.top: parent.top
7980 anchors.bottom: buttons.top
8081 anchors.left: parent.left
qml/Launcher/Launcher.qml+3−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -76,6 +76,7 @@ Item {
7676
7777 Timer {
7878 id: dismissTimer
79+ objectName: "dismissTimer"
7980 interval: 5000
8081 onTriggered: {
8182 if (!panel.preventHiding) {
@@ -218,6 +219,7 @@ Item {
218219
219220 EdgeDragArea {
220221 id: dragArea
222+ objectName: "launcherDragArea"
221223
222224 direction: Direction.Rightwards
223225
qml/Launcher/LauncherDelegate.qml+20−33
@@ -27,7 +27,7 @@ Item {
2727 property bool itemFocused: false
2828 property real maxAngle: 0
2929 property bool inverted: false
30− property bool clipCorner: false
30+ property alias pinned: pin.visible
3131
3232 readonly property int effectiveHeight: Math.cos(angle * Math.PI / 180) * itemHeight
3333 readonly property real foldedHeight: Math.cos(maxAngle * Math.PI / 180) * itemHeight
@@ -71,14 +71,31 @@ Item {
7171 height: root.itemHeight - units.gu(1)
7272 }
7373
74+ Rectangle {
75+ id: pin
76+ anchors {
77+ left: iconShape.left
78+ top: iconShape.top
79+ topMargin: -units.dp(2)
80+ }
81+ width: units.gu(1)
82+ height: width
83+ radius: width / 2
84+ color: "white"
85+ }
86+
7487 UbuntuShape {
88+ id: countEmblem
7589 objectName: "countEmblem"
90+
91+ readonly property real pinMargin: pin.visible ? pin.width + units.gu(1) - anchors.leftMargin : 0
92+
7693 anchors {
7794 right: parent.right
7895 top: parent.top
7996 margins: units.dp(3)
8097 }
81− width: Math.min(root.itemWidth, Math.max(units.gu(2), countLabel.implicitWidth + units.gu(1)))
98+ width: Math.min(root.itemWidth - pinMargin, Math.max(units.gu(2), countLabel.implicitWidth + units.gu(1)))
8299 height: units.gu(2)
83100 color: UbuntuColors.orange
84101 visible: root.countVisible
@@ -92,7 +109,7 @@ Item {
92109 // FIXME: verticalCenter seems to be off wee bit and QML doesn't have a centerLine
93110 // property for Text: https://bugreports.qt-project.org/browse/QTBUG-40479
94111 anchors.verticalCenterOffset: -units.dp(.5)
95− width: root.itemWidth - units.gu(1)
112+ width: root.itemWidth - units.gu(1) - countEmblem.pinMargin
96113 horizontalAlignment: Text.AlignHCenter
97114 elide: Text.ElideRight
98115 color: "white"
@@ -149,24 +166,6 @@ Item {
149166 }
150167 }
151168
152− Item {
153− id: clipper
154− anchors.centerIn: parent
155− width: iconItem.width
156− height: iconItem.height
157− Rectangle {
158− anchors {
159− fill: parent
160− topMargin: -units.gu(2)
161− leftMargin: -units.gu(2)
162− rightMargin: -units.gu(2)
163− bottomMargin: units.gu(1.2)
164− }
165− color: "red"
166− rotation: root.rotation + 45
167− }
168− }
169−
170169 ShaderEffect {
171170 id: transformEffect
172171 anchors.centerIn: parent
@@ -176,7 +175,6 @@ Item {
176175 property real itemOpacity: root.itemOpacity
177176 property real brightness: Math.max(-1, root.brightness)
178177 property real angle: root.angle
179− property bool clipCorner: root.clipCorner
180178 rotation: root.inverted ? 180 : 0
181179
182180 property variant source: ShaderEffectSource {
@@ -185,11 +183,6 @@ Item {
185183 hideSource: true
186184 }
187185
188− property var mask: ShaderEffectSource {
189− sourceItem: clipper
190− hideSource: true
191− }
192−
193186 transform: [
194187 // Rotating 3 times at top/bottom because that increases the perspective.
195188 // This is a hack, but as QML does not support real 3D coordinates
@@ -224,19 +217,13 @@ Item {
224217 fragmentShader: "
225218 varying highp vec2 qt_TexCoord0;
226219 uniform sampler2D source;
227− uniform sampler2D mask;
228220 uniform lowp float brightness;
229221 uniform lowp float itemOpacity;
230− uniform bool clipCorner;
231222 void main(void)
232223 {
233224 highp vec4 sourceColor = texture2D(source, qt_TexCoord0);
234− highp vec4 maskColor = texture2D(mask, qt_TexCoord0);
235225 sourceColor.rgb = mix(sourceColor.rgb, vec3(step(0.0, brightness)), abs(brightness));
236226 sourceColor *= itemOpacity;
237− if (clipCorner) {
238− sourceColor *= maskColor.a;
239− }
240227 gl_FragColor = sourceColor;
241228 }"
242229 }
qml/Launcher/LauncherPanel.qml+8−15
@@ -21,6 +21,7 @@ import Unity.Launcher 0.1
2121import Ubuntu.Components.Popups 0.1
2222import "../Components/ListItems"
2323import "../Components/"
24+import "../Components/Flickables" as Flickables
2425
2526Rectangle {
2627 id: root
@@ -45,6 +46,7 @@ Rectangle {
4546 }
4647
4748 Rectangle {
49+ objectName: "buttonShowDashHome"
4850 width: parent.width
4951 height: units.gu(7)
5052 color: UbuntuColors.orange
@@ -65,15 +67,6 @@ Rectangle {
6567 }
6668 }
6769
68− ThinDivider {
69− anchors {
70− left: parent.left
71− right: parent.right
72− margins: -mainColumn.anchors.leftMargin
73− }
74− rotation: root.rotation
75− }
76−
7770 Item {
7871 anchors.left: parent.left
7972 anchors.right: parent.right
@@ -83,7 +76,7 @@ Rectangle {
8376 anchors.fill: parent
8477 clip: true
8578
86− ListView {
79+ Flickables.ListView {
8780 id: launcherListView
8881 objectName: "launcherListView"
8982 anchors {
@@ -158,7 +151,7 @@ Rectangle {
158151 count: model.count
159152 countVisible: model.countVisible
160153 progress: model.progress
161− clipCorner: model.pinned
154+ pinned: model.pinned
162155 itemFocused: model.focused
163156 inverted: root.inverted
164157 z: -Math.abs(offset)
@@ -469,10 +462,10 @@ Rectangle {
469462 width: itemWidth
470463 rotation: root.rotation
471464 itemOpacity: 0.9
472− clipCorner: dndArea.draggedIndex > -1 &&
473− LauncherModel.get(dndArea.draggedIndex).pinned &&
474− !dndArea.preDragging &&
475− !dndArea.dragging
465+ pinned: dndArea.draggedIndex > -1 &&
466+ LauncherModel.get(dndArea.draggedIndex).pinned &&
467+ !dndArea.preDragging &&
468+ !dndArea.dragging
476469
477470 function flatten() {
478471 fakeDragItemAnimation.start();
qml/Notifications/Notification.qml+2−1
@@ -20,6 +20,7 @@ import Ubuntu.Components 1.1
2020import Unity.Notifications 1.0
2121import QMenuModel 0.1
2222import Utils 0.1
23+import "../Components/Flickables" as Flickables
2324
2425import Ubuntu.Components.ListItems 0.1 as ListItem
2526
@@ -455,7 +456,7 @@ Item {
455456 onClicked: notification.notification.invokeAction(comboRepeater.itemAt(2).actionId)
456457 expanded: false
457458 expandedHeight: (comboRepeater.count - 2) * units.gu(4) + units.gu(.5)
458− comboList: Flickable {
459+ comboList: Flickables.Flickable {
459460 // this has to be wrapped inside a flickable
460461 // to work around a feature/bug? of the
461462 // ComboButton SDK-element, making a regular
qml/Notifications/NotificationMenuItemFactory.qml+77−5
@@ -19,6 +19,7 @@
1919
2020import QtQuick 2.0
2121import Ubuntu.Components 0.1
22+import QMenuModel 0.1
2223import "../Components"
2324
2425Loader {
@@ -26,7 +27,7 @@ Loader {
2627
2728 property QtObject menuModel: null
2829 property QtObject menuData: null
29− property int menuIndex
30+ property int menuIndex : -1
3031 property int maxHeight
3132 readonly property bool fullscreen: menuData.type === "com.canonical.snapdecision.pinlock"
3233
@@ -46,6 +47,13 @@ Loader {
4647 }
4748 }
4849
50+ function getExtendedProperty(object, propertyName, defaultValue) {
51+ if (object && object.hasOwnProperty(propertyName)) {
52+ return object[propertyName];
53+ }
54+ return defaultValue;
55+ }
56+
4957 Component {
5058 id: textfield
5159
@@ -121,14 +129,14 @@ Loader {
121129 right: parent.right
122130 }
123131 height: menuFactory.maxHeight
124− infoText: i18n.tr("Enter SIM PIN")
125− errorText: i18n.tr("Sorry, incorrect PIN")
126− minPinLength: 4
127− maxPinLength: 8
132+ infoText: notification.summary
133+ errorText: errorAction.valid ? errorAction.state : ""
134+ retryText: notification.body
128135 background: shell.background
129136
130137 onEntered: {
131138 menuModel.changeState(menuIndex, passphrase);
139+ clear(false);
132140 }
133141
134142 onCancel: {
@@ -139,6 +147,70 @@ Loader {
139147 shell.activateApplication("dialer-app")
140148 menuModel.activate(menuIndex, false)
141149 }
150+
151+ property var extendedData: menuData && menuData.ext || undefined
152+
153+ property var pinMinMaxAction : UnityMenuAction {
154+ model: menuModel
155+ index: menuIndex
156+ name: getExtendedProperty(extendedData, "xCanonicalPinMinMax", "")
157+
158+ onStateChanged: {
159+ var min = pinMinMaxAction.state[0];
160+ var max = pinMinMaxAction.state[1];
161+
162+ if (min === 0) min = -1;
163+ if (max === 0) max = -1;
164+
165+ minPinLength = min
166+ maxPinLength = max
167+ }
168+ }
169+
170+ property var popupAction: UnityMenuAction {
171+ model: menuModel
172+ index: menuIndex
173+ name: getExtendedProperty(extendedData, "xCanonicalPinPopup", "")
174+ onStateChanged: {
175+ if (state !== "")
176+ showInfoPopup("", state);
177+ }
178+ }
179+ onInfoPopupConfirmed: {
180+ popupAction.activate();
181+ }
182+
183+ Timer {
184+ id: errorTimer
185+ interval: 4000;
186+ running: false;
187+ repeat: false
188+ onTriggered: {
189+ errorAction.activate();
190+ }
191+ }
192+ property var errorAction: UnityMenuAction {
193+ model: menuModel
194+ index: menuIndex
195+ name: getExtendedProperty(extendedData, "xCanonicalPinError", "")
196+ onStateChanged: {
197+ errorText = state;
198+ if (state !== "") {
199+ clear(true);
200+ errorTimer.running = true;
201+ }
202+ }
203+ }
204+
205+ function loadAttributes() {
206+ if (!menuModel || menuIndex == -1) return;
207+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-pin-min-max': 'string',
208+ 'x-canonical-pin-popup': 'string',
209+ 'x-canonical-pin-error': 'string'});
210+ }
211+ Component.onCompleted: {
212+ loadAttributes();
213+ }
142214 }
143215 }
144216}
qml/Notifications/Notifications.qml+2−1
@@ -19,8 +19,9 @@ import Ubuntu.Components 0.1
1919import Unity.Notifications 1.0 as UnityNotifications
2020import Utils 0.1
2121import "../Components"
22+import "../Components/Flickables" as Flickables
2223
23−ListView {
24+Flickables.ListView {
2425 id: notificationList
2526
2627 objectName: "notificationList"
qml/Panel/IndicatorRow.qml+2−1
@@ -18,6 +18,7 @@ import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import Unity.Indicators 0.1 as Indicators
2020import "../Components"
21+import "../Components/Flickables" as Flickables
2122
2223Item {
2324 id: indicatorRow
@@ -60,7 +61,7 @@ Item {
6061 }
6162 }
6263
63− ListView {
64+ Flickables.ListView {
6465 id: itemView
6566 objectName: "indicatorRowItems"
6667 interactive: false
qml/Panel/Indicators/DefaultIndicatorPage.qml+2−1
@@ -21,6 +21,7 @@
2121import QtQuick 2.0
2222import Ubuntu.Components 0.1 as Components
2323import Unity.Indicators 0.1 as Indicators
24+import "../../Components/Flickables" as Flickables
2425
2526IndicatorBase {
2627 id: main
@@ -65,7 +66,7 @@ IndicatorBase {
6566 }
6667 }
6768
68− ListView {
69+ Flickables.ListView {
6970 id: mainMenu
7071 objectName: "mainMenu"
7172 model: menuStack.rootMenu
qml/Panel/Indicators/MenuItemFactory.qml+18−3
@@ -283,12 +283,17 @@ Item {
283283 objectName: "checkableMenu"
284284 property QtObject menuData: null
285285 property int menuIndex: -1
286+ property bool serverChecked: menuData && menuData.isToggled || false
286287
287288 text: menuData && menuData.label || ""
288289 enabled: menuData && menuData.sensitive || false
289− checked: menuData && menuData.isToggled || false
290+ checked: serverChecked
290291 highlightWhenPressed: false
291292
293+ onServerCheckedChanged: {
294+ // value can be changed by menu, so a binding won't work.
295+ checked = serverChecked;
296+ }
292297 onTriggered: {
293298 menuModel.activate(menuIndex);
294299 }
@@ -302,13 +307,18 @@ Item {
302307 objectName: "switchMenu"
303308 property QtObject menuData: null
304309 property int menuIndex: -1
310+ property bool serverChecked: menuData && menuData.isToggled || false
305311
306312 text: menuData && menuData.label || ""
307313 iconSource: menuData && menuData.icon || ""
308314 enabled: menuData && menuData.sensitive || false
309− checked: menuData && menuData.isToggled || false
315+ checked: serverChecked
310316 highlightWhenPressed: false
311317
318+ onServerCheckedChanged: {
319+ // value can be changed by menu, so a binding won't work.
320+ checked = serverChecked;
321+ }
312322 onTriggered: {
313323 menuModel.activate(menuIndex);
314324 }
@@ -431,6 +441,7 @@ Item {
431441 property var menuModel: menuFactory.menuModel
432442 property int menuIndex: -1
433443 property var extendedData: menuData && menuData.ext || undefined
444+ property bool serverChecked: menuData && menuData.isToggled || false
434445
435446 property var strengthAction: UnityMenuAction {
436447 model: menuModel
@@ -440,12 +451,16 @@ Item {
440451
441452 text: menuData && menuData.label || ""
442453 enabled: menuData && menuData.sensitive || false
443− active: menuData && menuData.isToggled || false
454+ active: serverChecked
444455 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
445456 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
446457 signalStrength: strengthAction.valid ? strengthAction.state : 0
447458 highlightWhenPressed: false
448459
460+ onServerCheckedChanged: {
461+ // value can be changed by menu, so a binding won't work.
462+ active = serverChecked;
463+ }
449464 onMenuModelChanged: {
450465 loadAttributes();
451466 }
qml/Panel/Indicators/client/IndicatorsList.qml+2−1
@@ -22,6 +22,7 @@ import Ubuntu.Components 0.1
2222import Ubuntu.Components.ListItems 0.1 as ListItem
2323import Unity.Indicators 0.1 as Indicators
2424import "../.."
25+import "../../../Components/Flickables" as Flickables
2526
2627Page {
2728 id: page
@@ -35,7 +36,7 @@ Page {
3536 Component.onCompleted: load(profile)
3637 }
3738
38− ListView {
39+ Flickables.ListView {
3940 id: mainMenu
4041 objectName: "mainMenu"
4142 anchors.fill: parent
qml/Panel/Indicators/client/IndicatorsTree.qml+2−1
@@ -22,6 +22,7 @@ import Ubuntu.Components 0.1
2222import Unity.Indicators 0.1 as Indicators
2323import QMenuModel 0.1
2424import Ubuntu.Components.ListItems 0.1 as ListItem
25+import "../../../Components/Flickables" as Flickables
2526
2627Page {
2728 id: page
@@ -52,7 +53,7 @@ Page {
5253 model: unityModel
5354 }
5455
55− Flickable {
56+ Flickables.Flickable {
5657 anchors.fill: parent
5758 contentHeight: all_data.height
5859 clip:true
qml/Panel/MenuContent.qml+3−2
@@ -20,6 +20,7 @@ import Ubuntu.Components 1.1
2020import Unity.Indicators 0.1 as Indicators
2121import Utils 0.1
2222import "../Components"
23+import "../Components/Flickables" as Flickables
2324import "Indicators"
2425
2526Rectangle {
@@ -39,7 +40,7 @@ Rectangle {
3940 listViewHeader.currentIndex = index;
4041 }
4142
42− ListView {
43+ Flickables.ListView {
4344 id: listViewHeader
4445 objectName: "indicatorsHeaderListView"
4546 model: content.indicatorsModel
@@ -80,7 +81,7 @@ Rectangle {
8081 }
8182 }
8283
83− ListView {
84+ Flickables.ListView {
8485 id: listViewContent
8586 objectName: "indicatorsContentListView"
8687 anchors {
qml/Shell.qml+115−47
@@ -53,7 +53,9 @@ Item {
5353 property url background
5454 readonly property real panelHeight: panel.panelHeight
5555
56− readonly property bool locked: LightDM.Greeter.active && !LightDM.Greeter.authenticated
56+ readonly property bool locked: LightDM.Greeter.active && !LightDM.Greeter.authenticated && !forcedUnlock
57+ readonly property bool forcedUnlock: edgeDemo.running
58+ onForcedUnlockChanged: if (forcedUnlock) lockscreen.hide()
5759
5860 property bool sideStageEnabled: shell.width >= units.gu(100)
5961 readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
@@ -87,11 +89,13 @@ Item {
8789 }
8890 }
8991
90− function setFakeActiveForApp(app) {
91− if (shell.locked) {
92− greeter.fakeActiveForApp = app
93− lockscreen.hide()
92+ function startLockedApp(app) {
93+ if (!shell.locked) {
94+ console.warn("Called startLockedApp(%1) when not locked, ignoring".arg(app))
95+ return
9496 }
97+ greeter.lockedApp = app
98+ shell.activateApplication(app)
9599 }
96100
97101 Binding {
@@ -169,31 +173,41 @@ Item {
169173 Connections {
170174 target: ApplicationManager
171175 onFocusRequested: {
172− if (appId === "dialer-app") {
173− // Always let the dialer-app through. Either user asked
174− // for an emergency call or accepted an incoming call.
175− setFakeActiveForApp(appId)
176− } else if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== appId) {
177− lockscreen.show();
176+ if (greeter.narrowMode) {
177+ if (appId === "dialer-app" && callManager.hasCalls) {
178+ // If we are in the middle of a call, make dialer lockedApp and show it.
179+ // This can happen if user backs out of dialer back to greeter, then
180+ // launches dialer again.
181+ greeter.lockedApp = appId;
182+ }
183+ if (greeter.hasLockedApp) {
184+ if (appId === greeter.lockedApp) {
185+ lockscreen.hide() // show locked app
186+ } else {
187+ greeter.startUnlock() // show lockscreen if necessary
188+ }
189+ }
190+ greeter.hide();
191+ } else {
192+ if (LightDM.Greeter.active) {
193+ greeter.startUnlock()
194+ }
178195 }
179− greeter.hide();
180196 }
181197
182198 onFocusedApplicationIdChanged: {
183− if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== ApplicationManager.focusedApplicationId) {
184− lockscreen.show();
199+ if (greeter.hasLockedApp && greeter.lockedApp !== ApplicationManager.focusedApplicationId) {
200+ greeter.startUnlock()
185201 }
186202 panel.indicators.hide();
187203 }
188204
189205 onApplicationAdded: {
190206 if (greeter.shown && appId != "unity8-dash") {
191− greeter.hide();
207+ greeter.startUnlock()
192208 }
193− if (appId === "dialer-app") {
194− // Always let the dialer-app through. Either user asked
195− // for an emergency call or accepted an incoming call.
196− setFakeActiveForApp(appId)
209+ if (greeter.narrowMode && greeter.hasLockedApp && appId === greeter.lockedApp) {
210+ lockscreen.hide() // show locked app
197211 }
198212 launcher.hide();
199213 }
@@ -201,9 +215,19 @@ Item {
201215
202216 Loader {
203217 id: applicationsDisplayLoader
218+ objectName: "applicationsDisplayLoader"
204219 anchors.fill: parent
205220
206− source: shell.sideStageEnabled ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
221+ // When we have a locked app, we only want to show that one app.
222+ // FIXME: do this in a less traumatic way. We currently only allow
223+ // locked apps in phone mode (see FIXME in Lockscreen component in
224+ // this same file). When that changes, we need to do something
225+ // nicer here. But this code is currently just to prevent a
226+ // theoretical attack where user enters lockedApp mode, then makes
227+ // the screen larger (maybe connects to monitor) and tries to enter
228+ // tablet mode.
229+ property bool tabletMode: shell.sideStageEnabled && !greeter.hasLockedApp
230+ source: tabletMode ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
207231
208232 Binding {
209233 target: applicationsDisplayLoader.item
@@ -229,7 +253,7 @@ Item {
229253 Binding {
230254 target: applicationsDisplayLoader.item
231255 property: "spreadEnabled"
232− value: edgeDemo.stagesEnabled && greeter.fakeActiveForApp === "" // to support emergency dialer hack
256+ value: edgeDemo.stagesEnabled && !greeter.hasLockedApp
233257 }
234258 Binding {
235259 target: applicationsDisplayLoader.item
@@ -304,14 +328,20 @@ Item {
304328 // and wider screens are tablets which don't. When we do allow this
305329 // on devices with a side stage and a SIM, work should be done to
306330 // ensure that the main stage is disabled while the dialer is present
307− // in the side stage.
331+ // in the side stage. See the FIXME in the stage loader in this file.
308332 showEmergencyCallButton: !shell.sideStageEnabled
309333
310334 onEntered: LightDM.Greeter.respond(passphrase);
311335 onCancel: greeter.show()
312− onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter fake-active mode
336+ onEmergencyCall: startLockedApp("dialer-app")
313337
314− onShownChanged: if (shown) greeter.fakeActiveForApp = ""
338+ onShownChanged: if (shown) greeter.lockedApp = ""
339+
340+ function maybeShow() {
341+ if (!shell.forcedUnlock) {
342+ show()
343+ }
344+ }
315345
316346 Timer {
317347 id: forcedDelayTimer
@@ -355,16 +385,18 @@ Item {
355385 lockscreen.errorText = i18n.tr("Sorry, incorrect %1").arg(text.toLowerCase())
356386 }
357387
358− lockscreen.show();
388+ lockscreen.maybeShow();
359389 }
360390 }
361391
362392 onPromptlessChanged: {
363− if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
364− lockscreen.hide()
365− } else {
366− lockscreen.reset();
367− lockscreen.show();
393+ if (greeter.narrowMode) {
394+ if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
395+ lockscreen.hide()
396+ } else {
397+ lockscreen.reset();
398+ lockscreen.maybeShow();
399+ }
368400 }
369401 }
370402
@@ -414,7 +446,7 @@ Item {
414446 Binding {
415447 target: LightDM.Greeter
416448 property: "active"
417− value: greeter.shown || lockscreen.shown || greeter.fakeActiveForApp != ""
449+ value: greeter.shown || lockscreen.shown || greeter.hasLockedApp
418450 }
419451
420452 Rectangle {
@@ -426,7 +458,8 @@ Item {
426458 Item {
427459 // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
428460 id: greeterWrapper
429− x: launcher.progress
461+ objectName: "greeterWrapper"
462+ x: greeter.narrowMode ? launcher.progress : 0
430463 y: panel.panelHeight
431464 width: parent.width
432465 height: parent.height - panel.panelHeight
@@ -439,16 +472,16 @@ Item {
439472 property bool fullyShown: showProgress === 1.0
440473 onFullyShownChanged: {
441474 // Wait until the greeter is completely covering lockscreen before resetting it.
442− if (fullyShown && !LightDM.Greeter.authenticated) {
475+ if (greeter.narrowMode && fullyShown && !LightDM.Greeter.authenticated) {
443476 lockscreen.reset();
444− lockscreen.show();
477+ lockscreen.maybeShow();
445478 }
446479 }
447480
448481 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
449482 onShowProgressChanged: {
450483 if (showProgress === 0) {
451− if (LightDM.Greeter.authenticated) {
484+ if ((LightDM.Greeter.promptless && LightDM.Greeter.authenticated) || shell.forcedUnlock) {
452485 greeter.login()
453486 } else if (greeter.narrowMode) {
454487 lockscreen.clear(false) // to reset focus if necessary
@@ -462,13 +495,16 @@ Item {
462495
463496 signal sessionStarted() // helpful for tests
464497
465− property string fakeActiveForApp: ""
498+ property string lockedApp: ""
499+ property bool hasLockedApp: lockedApp !== ""
466500
467501 available: true
468502 hides: [launcher, panel.indicators]
469503 shown: true
470504 loadContent: required || lockscreen.required // keeps content in memory for quick show()
471505
506+ locked: shell.locked
507+
472508 defaultBackground: shell.background
473509
474510 width: parent.width
@@ -476,6 +512,18 @@ Item {
476512
477513 dragHandleWidth: shell.edgeSize
478514
515+ function startUnlock() {
516+ if (narrowMode) {
517+ if (!LightDM.Greeter.authenticated) {
518+ lockscreen.maybeShow()
519+ }
520+ hide()
521+ } else {
522+ show()
523+ tryToUnlock()
524+ }
525+ }
526+
479527 function login() {
480528 enabled = false;
481529 if (LightDM.Greeter.startSessionSync()) {
@@ -491,8 +539,10 @@ Item {
491539 if (shown) {
492540 if (greeter.narrowMode) {
493541 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
542+ } else {
543+ reset()
494544 }
495− greeter.fakeActiveForApp = "";
545+ greeter.lockedApp = "";
496546 greeter.forceActiveFocus();
497547 }
498548 }
@@ -520,6 +570,25 @@ Item {
520570 }
521571 }
522572
573+ Connections {
574+ id: callConnection
575+ target: callManager
576+
577+ onHasCallsChanged: {
578+ if (shell.locked && callManager.hasCalls) {
579+ // We just received an incoming call while locked. The
580+ // indicator will have already launched dialer-app for us, but
581+ // there is a race between "hasCalls" changing and the dialer
582+ // starting up. So in case we lose that race, we'll start/
583+ // focus the dialer ourselves here too. Even if the indicator
584+ // didn't launch the dialer for some reason (or maybe a call
585+ // started via some other means), if an active call is
586+ // happening, we want to be in the dialer.
587+ startLockedApp("dialer-app")
588+ }
589+ }
590+ }
591+
523592 Connections {
524593 id: powerConnection
525594 target: Powerd
@@ -537,10 +606,7 @@ Item {
537606 }
538607
539608 if (LightDM.Greeter.active) {
540− if (!LightDM.Greeter.authenticated) {
541− lockscreen.show()
542− }
543− greeter.hide()
609+ greeter.startUnlock()
544610 }
545611
546612 var animate = !LightDM.Greeter.active && !stages.shown
@@ -549,7 +615,8 @@ Item {
549615 }
550616
551617 function showDash() {
552− if (greeter.fakeActiveForApp !== "") { // just in case user gets here
618+ if (greeter.hasLockedApp || // just in case user gets here
619+ (!greeter.narrowMode && shell.locked)) {
553620 return
554621 }
555622
@@ -576,7 +643,7 @@ Item {
576643 anchors.fill: parent //because this draws indicator menus
577644 indicators {
578645 hides: [launcher]
579− available: edgeDemo.panelEnabled && (!shell.locked || AccountsService.enableIndicatorsWhileLocked) && greeter.fakeActiveForApp === ""
646+ available: edgeDemo.panelEnabled && (!shell.locked || AccountsService.enableIndicatorsWhileLocked) && !greeter.hasLockedApp
580647 contentEnabled: edgeDemo.panelContentEnabled
581648 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
582649 panelHeight: units.gu(3)
@@ -587,7 +654,7 @@ Item {
587654 ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).fullscreen
588655
589656 fullscreenMode: (topmostApplicationIsFullscreen && !LightDM.Greeter.active && launcher.progress == 0)
590− || greeter.fakeActiveForApp !== ""
657+ || greeter.hasLockedApp
591658 }
592659
593660 Launcher {
@@ -600,7 +667,7 @@ Item {
600667 anchors.bottom: parent.bottom
601668 width: parent.width
602669 dragAreaWidth: shell.edgeSize
603− available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && greeter.fakeActiveForApp === ""
670+ available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && !greeter.hasLockedApp
604671
605672 onShowDashHome: showHome()
606673 onDash: showDash()
@@ -610,8 +677,8 @@ Item {
610677 }
611678 }
612679 onLauncherApplicationSelected: {
613− if (greeter.fakeActiveForApp !== "") {
614− lockscreen.show()
680+ if (greeter.hasLockedApp) {
681+ greeter.startUnlock()
615682 }
616683 if (!edgeDemo.running)
617684 shell.activateApplication(appId)
@@ -691,6 +758,7 @@ Item {
691758
692759 EdgeDemo {
693760 id: edgeDemo
761+ objectName: "edgeDemo"
694762 z: alphaDisclaimerLabel.z + 10
695763 paused: Powerd.status === Powerd.Off // Saves power
696764 greeter: greeter
qml/Stages/ApplicationWindow.qml−18
@@ -61,14 +61,6 @@ Item {
6161 // Remove this when possible
6262 property bool surfaceInitialized: false
6363
64− function forceSurfaceActiveFocusIfReady() {
65− if (sessionContainer.surface !== null &&
66− sessionContainer.surface.focus &&
67− sessionContainer.surface.parent === sessionContainer.surfaceContainer &&
68− sessionContainer.surface.enabled) {
69− sessionContainer.surface.forceActiveFocus();
70− }
71− }
7264 }
7365
7466 Timer {
@@ -77,15 +69,6 @@ Item {
7769 onTriggered: { if (sessionContainer.surface) {d.surfaceInitialized = true;} }
7870 }
7971
80− Connections {
81− target: sessionContainer.surface
82− // FIXME: I would rather not need to do this, but currently it doesn't get
83− // active focus without it and I don't know why.
84− onFocusChanged: d.forceSurfaceActiveFocusIfReady();
85− onParentChanged: d.forceSurfaceActiveFocusIfReady();
86− onEnabledChanged: d.forceSurfaceActiveFocusIfReady();
87− }
88−
8972 Image {
9073 id: screenshotImage
9174 objectName: "screenshotImage"
@@ -132,7 +115,6 @@ Item {
132115 onSurfaceChanged: {
133116 if (sessionContainer.surface) {
134117 surfaceInitTimer.start();
135− d.forceSurfaceActiveFocusIfReady();
136118 } else {
137119 d.surfaceInitialized = false;
138120 }
qml/Stages/PhoneStage.qml+24−6
@@ -21,6 +21,7 @@ import Unity.Application 0.1
2121import Unity.Session 0.1
2222import Utils 0.1
2323import "../Components"
24+import "../Components/Flickables" as Flickables
2425
2526Rectangle {
2627 id: root
@@ -85,6 +86,14 @@ Rectangle {
8586 if (spreadView.closingIndex == -1) {
8687 spreadView.phase = 0;
8788 spreadView.contentX = -spreadView.shift;
89+ focusTopMostApp();
90+ }
91+ }
92+
93+ function focusTopMostApp() {
94+ if (ApplicationManager.count > 0) {
95+ var topmostApp = ApplicationManager.get(0);
96+ ApplicationManager.focusApplication(topmostApp.appId);
8897 }
8998 }
9099 }
@@ -112,7 +121,7 @@ Rectangle {
112121
113122 }
114123
115− Flickable {
124+ Flickables.Flickable {
116125 id: spreadView
117126 objectName: "spreadView"
118127 anchors.fill: parent
@@ -123,7 +132,7 @@ Rectangle {
123132
124133 // This indicates when the spreadView is active. That means, all the animations
125134 // are activated and tiles need to line up for the spread.
126− readonly property bool active: shiftedContentX > 0 || spreadDragArea.dragging
135+ readonly property bool active: shiftedContentX > 0 || spreadDragArea.status === DirectionalDragArea.Recognized
127136
128137 // The flickable needs to fill the screen in order to get touch events all over.
129138 // However, we don't want to the user to be able to scroll back all the way. For
@@ -410,6 +419,7 @@ Rectangle {
410419
411420 EdgeDragArea {
412421 id: spreadDragArea
422+ objectName: "spreadDragArea"
413423 direction: Direction.Leftwards
414424 enabled: spreadView.phase != 2 && root.spreadEnabled
415425
@@ -429,9 +439,10 @@ Rectangle {
429439 spreadView.phase = 0;
430440 spreadView.contentX = -spreadView.shift;
431441 }
432− if (dragging && attachedToView) {
442+ if (dragging && status == DirectionalDragArea.Recognized && attachedToView) {
433443 // Gesture recognized. Let's move the spreadView with the finger
434− spreadView.contentX = -touchX + spreadDragArea.width - spreadView.shift;
444+ var finalX = Math.min(touchX + width, width);
445+ spreadView.contentX = -finalX + spreadDragArea.width - spreadView.shift;
435446 }
436447 if (attachedToView && spreadView.shiftedContentX >= spreadView.width * spreadView.positionMarker3) {
437448 // We passed positionMarker3. Detach from spreadView and snap it.
@@ -441,7 +452,13 @@ Rectangle {
441452 gesturePoints.push(touchX);
442453 }
443454
455+ property int previousStatus: -1
456+ property int currentStatus: DirectionalDragArea.WaitingForTouch
457+
444458 onStatusChanged: {
459+ previousStatus = currentStatus;
460+ currentStatus = status;
461+
445462 if (status == DirectionalDragArea.Recognized) {
446463 attachedToView = true;
447464 }
@@ -449,7 +466,7 @@ Rectangle {
449466
450467 onDraggingChanged: {
451468 if (dragging) {
452− // Gesture recognized. Start recording this gesture
469+ // A potential edge-drag gesture has started. Start recording it
453470 gesturePoints = [];
454471 return;
455472 }
@@ -466,7 +483,8 @@ Rectangle {
466483 }
467484 gesturePoints = [];
468485
469− if (oneWayFlick && spreadView.shiftedContentX > units.gu(2) &&
486+ if (previousStatus == DirectionalDragArea.Recognized &&
487+ oneWayFlick && spreadView.shiftedContentX > units.gu(2) &&
470488 spreadView.shiftedContentX < spreadView.positionMarker1 * spreadView.width) {
471489 // If it was a short one-way movement, do the Alt+Tab switch
472490 // no matter if we didn't cross positionMarker1 yet.
qml/Stages/SessionContainer.qml+1−13
@@ -23,7 +23,7 @@ Item {
2323 property QtObject session
2424 readonly property var childSessions: session ? session.childSessions : null
2525 readonly property alias surface: _surfaceContainer.surface
26− property bool interactive: true
26+ property alias interactive: _surfaceContainer.interactive
2727 property int orientation
2828
2929 readonly property alias surfaceContainer: _surfaceContainer
@@ -34,18 +34,6 @@ Item {
3434 orientation: root.orientation
3535 }
3636
37− Binding {
38− target: surfaceContainer.surface
39− when: surfaceContainer.surface
40− property: "enabled"
41− value: root.interactive
42− }
43− Binding {
44− target: surfaceContainer.surface
45− when: surfaceContainer.surface
46− property: "focus"
47− value: root.interactive
48− }
4937
5038 Repeater {
5139 model: root.childSessions
qml/Stages/SurfaceContainer.qml+37−6
@@ -16,6 +16,7 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 1.1
19+import Ubuntu.Gestures 0.1 // For TouchGate
1920
2021Item {
2122 id: root
@@ -23,21 +24,51 @@ Item {
2324 property Item surface: null
2425 property bool hadSurface: false
2526 property int orientation
27+ property bool interactive
2628
2729 onSurfaceChanged: {
2830 if (surface) {
2931 surface.parent = root;
32+ d.forceSurfaceActiveFocusIfReady();
3033 } else {
3134 hadSurface = true;
3235 }
3336 }
34− Binding {
35− target: surface
36− property: "anchors.fill"; value: root
37+ Binding { target: surface; property: "anchors.fill"; value: root }
38+ Binding { target: surface; property: "orientation"; value: root.orientation }
39+ Binding { target: surface; property: "z"; value: 1 }
40+ Binding { target: surface; property: "enabled"; value: root.interactive; when: surface }
41+ Binding { target: surface; property: "focus"; value: root.interactive; when: surface }
42+
43+ TouchGate {
44+ targetItem: surface
45+ anchors.fill: root
46+ enabled: root.surface ? root.surface.enabled : false
47+ z: 2
48+ }
49+
50+ Connections {
51+ target: root.surface
52+ // FIXME: I would rather not need to do this, but currently it doesn't get
53+ // active focus without it and I don't know why.
54+ // Possibly because if an item get focus=true before it has a parent, once
55+ // it gets a parent QQuickWindow won't check its focus and update its activeFocus
56+ // accordingly. Unlike when you focus=true after the item already has a parent.
57+ onFocusChanged: d.forceSurfaceActiveFocusIfReady();
58+ onParentChanged: d.forceSurfaceActiveFocusIfReady();
59+ onEnabledChanged: d.forceSurfaceActiveFocusIfReady();
3760 }
38− Binding {
39− target: surface
40− property: "orientation"; value: root.orientation
61+
62+ QtObject {
63+ id: d
64+ function forceSurfaceActiveFocusIfReady() {
65+ if (root.surface !== null &&
66+ root.surface.focus &&
67+ root.surface.parent === root &&
68+ root.surface.enabled) {
69+ root.surface.forceActiveFocus();
70+ }
71+ }
4172 }
4273
4374 states: [
qml/Stages/TabletStage.qml+9−1
@@ -20,6 +20,7 @@ import Ubuntu.Gestures 0.1
2020import Unity.Application 0.1
2121import Utils 0.1
2222import "../Components"
23+import "../Components/Flickables" as Flickables
2324
2425Rectangle {
2526 id: root
@@ -139,14 +140,21 @@ Rectangle {
139140 if (priv.sideStageAppId == appId) {
140141 priv.sideStageAppId = "";
141142 }
143+
142144 if (ApplicationManager.count == 0) {
143145 spreadView.phase = 0;
144146 spreadView.contentX = -spreadView.shift;
147+ } else if (spreadView.closingIndex == -1) {
148+ // Unless we're closing the app ourselves in the spread,
149+ // lets make sure the spread doesn't mess up by the changing app list.
150+ spreadView.phase = 0;
151+ spreadView.contentX = -spreadView.shift;
152+ ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
145153 }
146154 }
147155 }
148156
149− Flickable {
157+ Flickables.Flickable {
150158 id: spreadView
151159 anchors.fill: parent
152160 interactive: (spreadDragArea.status == DirectionalDragArea.Recognized || phase > 1)
run_on_device.sh+4−5
@@ -130,11 +130,10 @@ if [ -z "${PASSWORD}" ]; then
130130 usage
131131fi
132132
133−PASSFILE=$( adb shell "FILE=\`mktemp\`
134− echo \"#!/bin/sh\" > \$FILE
135− echo \"echo \\\"${PASSWORD}\\\"\" >> \$FILE
136− chmod +x \$FILE
137− echo \$FILE" | tr -d '\r' )
133+PASSFILE=$(adb shell 'mktemp' | tr -d '\r')
134+adb shell "echo '#!/bin/sh' > ${PASSFILE}"
135+adb shell "echo \"echo \\\"${PASSWORD}\\\"\" >> ${PASSFILE}"
136+adb shell "chmod +x ${PASSFILE}"
138137
139138setup_adb_forwarding
140139
src/CMakeLists.txt+6
@@ -1,5 +1,6 @@
11include_directories(
22 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
3+ ${CMAKE_SOURCE_DIR}/libs/UbuntuGestures
34)
45
56file(GLOB_RECURSE QML_FILES
@@ -29,6 +30,11 @@ if (NOT "${XCB_INCLUDE_DIRS}" STREQUAL "")
2930 target_link_libraries(${SHELL_APP} ${XCB_LDFLAGS})
3031endif()
3132
33+target_link_libraries(${SHELL_APP} UbuntuGestures)
34+
35+# For it to find libUbuntuGestures.so
36+set_target_properties(${SHELL_APP} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}")
37+
3238# install binaries
3339install(TARGETS ${SHELL_APP}
3440 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
src/Dash/CMakeLists.txt+5
@@ -9,6 +9,11 @@ add_executable(unity8-dash ${DASH_SRCS})
99
1010qt5_use_modules(unity8-dash Gui Qml Quick Test)
1111
12+# For it to find libUbuntuGestures.so, needed by Ubuntu.Gestures QML module.
13+set_target_properties(unity8-dash PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}")
14+
15+target_link_libraries(unity8-dash UbuntuGestures)
16+
1217set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
1318
1419# install binaries
src/Dash/main.cpp+6
@@ -31,6 +31,9 @@
3131#include "../ApplicationArguments.h"
3232#include "../CachingNetworkManagerFactory.h"
3333
34+// Ubuntu Gestures
35+#include <TouchRegistry.h>
36+
3437int main(int argc, const char *argv[])
3538{
3639 QGuiApplication *application = new QGuiApplication(argc, (char**)argv);
@@ -88,6 +91,9 @@ int main(int argc, const char *argv[])
8891 view->setTitle("Scopes");
8992 view->rootContext()->setContextProperty("applicationArguments", &qmlArgs);
9093
94+ TouchRegistry touchRegistry;
95+ view->installEventFilter(&touchRegistry);
96+
9197 // You will need this if you want to interact with touch-only components using a mouse
9298 // Needed only when manually testing on a desktop.
9399 MouseTouchAdaptor *mouseTouchAdaptor = 0;
src/main.cpp+5
@@ -34,6 +34,9 @@
3434#include "ApplicationArguments.h"
3535#include "CachingNetworkManagerFactory.h"
3636
37+// Ubuntu Gestures
38+#include <TouchRegistry.h>
39+
3740int main(int argc, const char *argv[])
3841{
3942 bool isMirServer = false;
@@ -120,6 +123,8 @@ Load the testability driver");
120123 if (parser.isSet(framelessOption)) {
121124 view->setFlags(Qt::FramelessWindowHint);
122125 }
126+ TouchRegistry touchRegistry;
127+ view->installEventFilter(&touchRegistry);
123128
124129 // You will need this if you want to interact with touch-only components using a mouse
125130 // Needed only when manually testing on a desktop.
tests/CMakeLists.txt+1
@@ -7,6 +7,7 @@ add_custom_target(qmluitests)
77add_custom_target(qmltests)
88add_dependencies(qmltests qmlunittests qmluitests)
99
10+add_subdirectory(libs)
1011add_subdirectory(qmltests)
1112add_subdirectory(mocks)
1213add_subdirectory(whitespace)
tests/autopilot/unity8/indicators/tests/test_indicators.py+2−2
@@ -72,11 +72,11 @@ class IndicatorPageTitleMatchesWidgetTestCase(IndicatorTestCase):
7272 ('Bluetooth', dict(indicator_name='indicator-bluetooth',
7373 title='Bluetooth')),
7474 ('Datetime', dict(indicator_name='indicator-datetime',
75− title='Upcoming events')),
75+ title='Time & Date')),
7676 ('Location', dict(indicator_name='indicator-location',
7777 title='Location')),
7878 ('Messaging', dict(indicator_name='indicator-messages',
79− title='Notification center')),
79+ title='Notifications')),
8080 ('Network', dict(indicator_name='indicator-network',
8181 title='Network')),
8282 ('Power', dict(indicator_name='indicator-power',
tests/autopilot/unity8/shell/emulators/dash.py+1−1
@@ -206,7 +206,7 @@ class GenericScopeView(emulators.UnityEmulatorBase):
206206 def _get_category_element(self, category):
207207 try:
208208 return self.wait_select_single(
209− 'Base', objectName='dashCategory{}'.format(category))
209+ 'DashCategoryBase', objectName='dashCategory{}'.format(category))
210210 except dbus.StateNotFoundError:
211211 raise emulators.UnityEmulatorException(
212212 'No category found with name {}'.format(category))
tests/libs/CMakeLists.txtnew file+1
@@ -0,0 +1 @@
1+add_subdirectory(UbuntuGestures)
tests/libs/UbuntuGestures/CMakeLists.txtnew file+20
@@ -0,0 +1,20 @@
1+include_directories(
2+ ${CMAKE_SOURCE_DIR}/libs/UbuntuGestures
3+ ${CMAKE_CURRENT_BINARY_DIR}
4+ )
5+
6+macro(add_gesture_test CLASSNAME)
7+ set(testCommand
8+ ${CLASSNAME}TestExec -o ${CMAKE_BINARY_DIR}/test${CLASSNAME}.xml,xunitxml -o -,txt)
9+
10+ add_test(NAME test${CLASSNAME} COMMAND ${testCommand})
11+
12+ set_tests_properties(test${CLASSNAME} PROPERTIES
13+ ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/libs/UbuntuGestures)
14+
15+ add_executable(${CLASSNAME}TestExec tst_${CLASSNAME}.cpp)
16+ qt5_use_modules(${CLASSNAME}TestExec Test Core Gui Quick)
17+ target_link_libraries(${CLASSNAME}TestExec UbuntuGestures)
18+endmacro(add_gesture_test)
19+
20+add_gesture_test(TouchRegistry)
tests/libs/UbuntuGestures/tst_TouchRegistry.cppnew file+803
@@ -0,0 +1,803 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include <QtTest>
18+#include <QSet>
19+#include <QTouchEvent>
20+
21+#include <Timer.h>
22+#include <TouchOwnershipEvent.h>
23+#include <TouchRegistry.h>
24+#include <UnownedTouchEvent.h>
25+
26+using namespace UbuntuGestures;
27+
28+class TouchMemento {
29+public:
30+ TouchMemento(const QTouchEvent *touchEvent);
31+ Qt::TouchPointStates touchPointStates;
32+ QList<QTouchEvent::TouchPoint> touchPoints;
33+
34+ bool containsTouchWithId(int touchId) const;
35+};
36+
37+class DummyCandidate : public QQuickItem
38+{
39+ Q_OBJECT
40+public:
41+ bool event(QEvent *e) override;
42+ QSet<int> ownedTouches;
43+ QSet<int> lostTouches;
44+ QList<TouchMemento> unownedTouchEvents;
45+};
46+
47+class tst_TouchRegistry : public QObject
48+{
49+ Q_OBJECT
50+public:
51+ tst_TouchRegistry() : QObject(0) { }
52+private Q_SLOTS:
53+ void initTestCase() {} // will be called before the first test function is executed
54+ void cleanupTestCase() {} // will be called after the last test function was executed.
55+
56+ void init() {} // called right before each and every test function is executed
57+ void cleanup() {} // called right after each and every test function is executed
58+
59+ void requestWithNoCandidates();
60+ void lateCandidateRequestGetsNothing();
61+ void lateCandidateGestOwnershipOnceEarlyCandidateQuits();
62+ void dispatchesTouchEventsToCandidates();
63+ void dispatchesTouchEventsToWatchers();
64+ void keepDispatchingToWatchersAfterLastCandidateGivesUp();
65+ void candidatesAndWatchers_1();
66+ void candidatesAndWatchers_2();
67+ void rejectingTouchfterItsEnd();
68+ void removeOldUndecidedCandidates();
69+};
70+
71+void tst_TouchRegistry::requestWithNoCandidates()
72+{
73+ TouchRegistry touchRegistry;
74+ DummyCandidate candidate;
75+
76+ {
77+ QList<QTouchEvent::TouchPoint> touchPoints;
78+ touchPoints.append(QTouchEvent::TouchPoint(0));
79+ touchPoints[0].setState(Qt::TouchPointPressed);
80+ QTouchEvent touchEvent(QEvent::TouchBegin,
81+ 0 /* device */,
82+ Qt::NoModifier,
83+ Qt::TouchPointPressed,
84+ touchPoints);
85+ touchRegistry.update(&touchEvent);
86+ }
87+
88+ touchRegistry.requestTouchOwnership(0, &candidate);
89+
90+ QVERIFY(candidate.ownedTouches.contains(0));
91+}
92+
93+void tst_TouchRegistry::lateCandidateRequestGetsNothing()
94+{
95+ TouchRegistry touchRegistry;
96+ DummyCandidate earlyCandidate;
97+ earlyCandidate.setObjectName("early");
98+ DummyCandidate lateCandidate;
99+ lateCandidate.setObjectName("late");
100+
101+ {
102+ QList<QTouchEvent::TouchPoint> touchPoints;
103+ touchPoints.append(QTouchEvent::TouchPoint(0));
104+ touchPoints[0].setState(Qt::TouchPointPressed);
105+ QTouchEvent touchEvent(QEvent::TouchBegin,
106+ 0 /* device */,
107+ Qt::NoModifier,
108+ Qt::TouchPointPressed,
109+ touchPoints);
110+ touchRegistry.update(&touchEvent);
111+ }
112+
113+ touchRegistry.addCandidateOwnerForTouch(0, &earlyCandidate);
114+ touchRegistry.addCandidateOwnerForTouch(0, &lateCandidate);
115+
116+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
117+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
118+
119+ touchRegistry.requestTouchOwnership(0, &lateCandidate);
120+
121+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
122+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
123+
124+ touchRegistry.requestTouchOwnership(0, &earlyCandidate);
125+
126+ QVERIFY(earlyCandidate.ownedTouches.contains(0));
127+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
128+}
129+
130+void tst_TouchRegistry::lateCandidateGestOwnershipOnceEarlyCandidateQuits()
131+{
132+ TouchRegistry touchRegistry;
133+ DummyCandidate earlyCandidate;
134+ DummyCandidate lateCandidate;
135+
136+ {
137+ QList<QTouchEvent::TouchPoint> touchPoints;
138+ touchPoints.append(QTouchEvent::TouchPoint(0));
139+ touchPoints[0].setState(Qt::TouchPointPressed);
140+ QTouchEvent touchEvent(QEvent::TouchBegin,
141+ 0 /* device */,
142+ Qt::NoModifier,
143+ Qt::TouchPointPressed,
144+ touchPoints);
145+ touchRegistry.update(&touchEvent);
146+ }
147+
148+ touchRegistry.addCandidateOwnerForTouch(0, &earlyCandidate);
149+ touchRegistry.addCandidateOwnerForTouch(0, &lateCandidate);
150+
151+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
152+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
153+
154+ touchRegistry.requestTouchOwnership(0, &lateCandidate);
155+
156+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
157+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
158+
159+ touchRegistry.removeCandidateOwnerForTouch(0, &earlyCandidate);
160+
161+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
162+ QVERIFY(lateCandidate.ownedTouches.contains(0));
163+}
164+
165+void tst_TouchRegistry::dispatchesTouchEventsToCandidates()
166+{
167+ TouchRegistry touchRegistry;
168+ QQuickItem rootItem;
169+
170+ DummyCandidate candidate0;
171+ candidate0.setObjectName("0");
172+ candidate0.setParentItem(&rootItem);
173+ candidate0.setX(1);
174+ candidate0.setY(2);
175+
176+ DummyCandidate candidate1;
177+ candidate1.setObjectName("1");
178+ candidate0.setParentItem(&rootItem);
179+ candidate1.setX(3);
180+ candidate1.setY(4);
181+
182+ {
183+ QList<QTouchEvent::TouchPoint> touchPoints;
184+ touchPoints.append(QTouchEvent::TouchPoint(0));
185+ touchPoints[0].setState(Qt::TouchPointPressed);
186+ touchPoints[0].setRect(QRect(10, 10, 0, 0));
187+ QTouchEvent touchEvent(QEvent::TouchBegin,
188+ 0 /* device */,
189+ Qt::NoModifier,
190+ Qt::TouchPointPressed,
191+ touchPoints);
192+ touchRegistry.update(&touchEvent);
193+ }
194+
195+ touchRegistry.addCandidateOwnerForTouch(0, &candidate0);
196+
197+ {
198+ QList<QTouchEvent::TouchPoint> touchPoints;
199+ touchPoints.append(QTouchEvent::TouchPoint(0));
200+ touchPoints[0].setState(Qt::TouchPointMoved);
201+ touchPoints[0].setRect(QRect(11, 11, 0, 0));
202+ touchPoints.append(QTouchEvent::TouchPoint(1));
203+ touchPoints[1].setState(Qt::TouchPointPressed);
204+ touchPoints[1].setRect(QRect(20, 20, 0, 0));
205+ QTouchEvent touchEvent(QEvent::TouchUpdate,
206+ 0 /* device */,
207+ Qt::NoModifier,
208+ Qt::TouchPointPressed | Qt::TouchPointMoved,
209+ touchPoints);
210+ touchRegistry.update(&touchEvent);
211+ }
212+
213+ // candidate0 should have received an update on the touch he's interested on.
214+ QCOMPARE(candidate0.unownedTouchEvents.count(), 1);
215+ // make sure only touch 0 is there (i.e. no mention of touch 1)
216+ QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints.count(), 1);
217+ QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints[0].id(), 0);
218+ // Check that the points local coordinates have been mapped to candidate0's coordinate system.
219+ QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints[0].rect().x(), 11 - candidate0.x());
220+ QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints[0].rect().y(), 11 - candidate0.y());
221+
222+ touchRegistry.addCandidateOwnerForTouch(1, &candidate1);
223+
224+ {
225+ QList<QTouchEvent::TouchPoint> touchPoints;
226+ touchPoints.append(QTouchEvent::TouchPoint(0));
227+ touchPoints[0].setState(Qt::TouchPointMoved);
228+ touchPoints[0].setRect(QRect(12, 12, 0, 0));
229+ touchPoints.append(QTouchEvent::TouchPoint(1));
230+ touchPoints[1].setState(Qt::TouchPointMoved);
231+ touchPoints[1].setRect(QRect(21, 21, 0, 0));
232+ QTouchEvent touchEvent(QEvent::TouchUpdate,
233+ 0 /* device */,
234+ Qt::NoModifier,
235+ Qt::TouchPointPressed | Qt::TouchPointMoved,
236+ touchPoints);
237+ touchRegistry.update(&touchEvent);
238+ }
239+
240+ // candidate0 gets updates only for touch 0 and
241+ // candidate1 gets updates only for touch 1
242+
243+ QCOMPARE(candidate0.unownedTouchEvents.count(), 2);
244+ QCOMPARE(candidate0.unownedTouchEvents[1].touchPoints.count(), 1);
245+ QCOMPARE(candidate0.unownedTouchEvents[1].touchPoints[0].id(), 0);
246+
247+ QCOMPARE(candidate1.unownedTouchEvents.count(), 1);
248+ QCOMPARE(candidate1.unownedTouchEvents[0].touchPoints.count(), 1);
249+ QCOMPARE(candidate1.unownedTouchEvents[0].touchPoints[0].id(), 1);
250+}
251+
252+void tst_TouchRegistry::dispatchesTouchEventsToWatchers()
253+{
254+ TouchRegistry touchRegistry;
255+ QQuickItem rootItem;
256+
257+ DummyCandidate watcher;
258+ watcher.setObjectName("watcher");
259+ watcher.setParentItem(&rootItem);
260+ watcher.setX(1);
261+ watcher.setY(2);
262+
263+ {
264+ QList<QTouchEvent::TouchPoint> touchPoints;
265+ touchPoints.append(QTouchEvent::TouchPoint(0));
266+ touchPoints[0].setState(Qt::TouchPointPressed);
267+ touchPoints[0].setRect(QRect(10, 10, 0, 0));
268+ QTouchEvent touchEvent(QEvent::TouchBegin,
269+ 0 /* device */,
270+ Qt::NoModifier,
271+ Qt::TouchPointPressed,
272+ touchPoints);
273+ touchRegistry.update(&touchEvent);
274+ }
275+
276+ touchRegistry.addTouchWatcher(0, &watcher);
277+
278+ {
279+ QList<QTouchEvent::TouchPoint> touchPoints;
280+ touchPoints.append(QTouchEvent::TouchPoint(0));
281+ touchPoints[0].setState(Qt::TouchPointMoved);
282+ touchPoints[0].setRect(QRect(11, 11, 0, 0));
283+ touchPoints.append(QTouchEvent::TouchPoint(1));
284+ touchPoints[1].setState(Qt::TouchPointPressed);
285+ touchPoints[1].setRect(QRect(20, 20, 0, 0));
286+ QTouchEvent touchEvent(QEvent::TouchUpdate,
287+ 0 /* device */,
288+ Qt::NoModifier,
289+ Qt::TouchPointPressed | Qt::TouchPointMoved,
290+ touchPoints);
291+ touchRegistry.update(&touchEvent);
292+ }
293+
294+ // watcher should have received an update on the touch he's interested on.
295+ QCOMPARE(watcher.unownedTouchEvents.count(), 1);
296+ // make sure only touch 0 is there (i.e. no mention of touch 1)
297+ QCOMPARE(watcher.unownedTouchEvents[0].touchPoints.count(), 1);
298+ QCOMPARE(watcher.unownedTouchEvents[0].touchPoints[0].id(), 0);
299+ // Check that the points local coordinates have been mapped to watcher's coordinate system.
300+ QCOMPARE(watcher.unownedTouchEvents[0].touchPoints[0].rect().x(), 11 - watcher.x());
301+ QCOMPARE(watcher.unownedTouchEvents[0].touchPoints[0].rect().y(), 11 - watcher.y());
302+
303+ {
304+ QList<QTouchEvent::TouchPoint> touchPoints;
305+ touchPoints.append(QTouchEvent::TouchPoint(0));
306+ touchPoints[0].setState(Qt::TouchPointMoved);
307+ touchPoints[0].setRect(QRect(12, 12, 0, 0));
308+ touchPoints.append(QTouchEvent::TouchPoint(1));
309+ touchPoints[1].setState(Qt::TouchPointMoved);
310+ touchPoints[1].setRect(QRect(21, 21, 0, 0));
311+ QTouchEvent touchEvent(QEvent::TouchUpdate,
312+ 0 /* device */,
313+ Qt::NoModifier,
314+ Qt::TouchPointPressed | Qt::TouchPointMoved,
315+ touchPoints);
316+ touchRegistry.update(&touchEvent);
317+ }
318+
319+ // watcher gets updates only for touch 0
320+
321+ QCOMPARE(watcher.unownedTouchEvents.count(), 2);
322+ QCOMPARE(watcher.unownedTouchEvents[1].touchPoints.count(), 1);
323+ QCOMPARE(watcher.unownedTouchEvents[1].touchPoints[0].id(), 0);
324+}
325+
326+void tst_TouchRegistry::keepDispatchingToWatchersAfterLastCandidateGivesUp()
327+{
328+ TouchRegistry touchRegistry;
329+ DummyCandidate item;
330+
331+ {
332+ QList<QTouchEvent::TouchPoint> touchPoints;
333+ touchPoints.append(QTouchEvent::TouchPoint(0));
334+ touchPoints[0].setState(Qt::TouchPointPressed);
335+ QTouchEvent touchEvent(QEvent::TouchBegin,
336+ 0 /* device */,
337+ Qt::NoModifier,
338+ Qt::TouchPointPressed,
339+ touchPoints);
340+ touchRegistry.update(&touchEvent);
341+ }
342+
343+ touchRegistry.addCandidateOwnerForTouch(0, &item);
344+
345+ {
346+ QList<QTouchEvent::TouchPoint> touchPoints;
347+ touchPoints.append(QTouchEvent::TouchPoint(0));
348+ touchPoints[0].setState(Qt::TouchPointMoved);
349+ touchPoints.append(QTouchEvent::TouchPoint(1));
350+ touchPoints[1].setState(Qt::TouchPointPressed);
351+ QTouchEvent touchEvent(QEvent::TouchUpdate,
352+ 0 /* device */,
353+ Qt::NoModifier,
354+ Qt::TouchPointPressed | Qt::TouchPointMoved,
355+ touchPoints);
356+ touchRegistry.update(&touchEvent);
357+ }
358+
359+ QCOMPARE(item.unownedTouchEvents.count(), 1);
360+ QCOMPARE(item.unownedTouchEvents[0].touchPoints.count(), 1);
361+ QCOMPARE(item.unownedTouchEvents[0].touchPoints[0].id(), 0);
362+ item.unownedTouchEvents.clear();
363+
364+ touchRegistry.addTouchWatcher(1, &item);
365+
366+ {
367+ QList<QTouchEvent::TouchPoint> touchPoints;
368+ touchPoints.append(QTouchEvent::TouchPoint(0));
369+ touchPoints[0].setState(Qt::TouchPointMoved);
370+ touchPoints.append(QTouchEvent::TouchPoint(1));
371+ touchPoints[1].setState(Qt::TouchPointMoved);
372+ QTouchEvent touchEvent(QEvent::TouchUpdate,
373+ 0 /* device */,
374+ Qt::NoModifier,
375+ Qt::TouchPointMoved,
376+ touchPoints);
377+ touchRegistry.update(&touchEvent);
378+ }
379+
380+ QCOMPARE(item.unownedTouchEvents.count(), 1);
381+ QCOMPARE(item.unownedTouchEvents[0].touchPoints.count(), 2);
382+ QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(0));
383+ QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(1));
384+ item.unownedTouchEvents.clear();
385+
386+ {
387+ QList<QTouchEvent::TouchPoint> touchPoints;
388+ touchPoints.append(QTouchEvent::TouchPoint(0));
389+ touchPoints[0].setState(Qt::TouchPointReleased);
390+ touchPoints.append(QTouchEvent::TouchPoint(1));
391+ touchPoints[1].setState(Qt::TouchPointMoved);
392+ QTouchEvent touchEvent(QEvent::TouchUpdate,
393+ 0 /* device */,
394+ Qt::NoModifier,
395+ Qt::TouchPointReleased | Qt::TouchPointMoved,
396+ touchPoints);
397+ touchRegistry.update(&touchEvent);
398+ }
399+
400+ QCOMPARE(item.unownedTouchEvents.count(), 1);
401+ QCOMPARE(item.unownedTouchEvents[0].touchPoints.count(), 2);
402+ QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(0));
403+ QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(1));
404+ item.unownedTouchEvents.clear();
405+
406+ touchRegistry.removeCandidateOwnerForTouch(0, &item);
407+
408+ {
409+ QList<QTouchEvent::TouchPoint> touchPoints;
410+ touchPoints.append(QTouchEvent::TouchPoint(1));
411+ touchPoints[0].setState(Qt::TouchPointReleased);
412+ QTouchEvent touchEvent(QEvent::TouchEnd,
413+ 0 /* device */,
414+ Qt::NoModifier,
415+ Qt::TouchPointReleased,
416+ touchPoints);
417+ touchRegistry.update(&touchEvent);
418+ }
419+
420+ QCOMPARE(item.unownedTouchEvents.count(), 1);
421+ QCOMPARE(item.unownedTouchEvents[0].touchPoints.count(), 1);
422+ QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(1));
423+ item.unownedTouchEvents.clear();
424+
425+ QVERIFY(touchRegistry.m_touchInfoPool.isEmpty());
426+}
427+
428+/*
429+ Regression test that reproduces a problematic scenario that came up during manual testing.
430+ It reproduces the interaction between TouchRegistry and a DirectionalDragArea
431+ */
432+void tst_TouchRegistry::candidatesAndWatchers_1()
433+{
434+ TouchRegistry touchRegistry;
435+ DummyCandidate item;
436+
437+ {
438+ QList<QTouchEvent::TouchPoint> touchPoints;
439+ touchPoints.append(QTouchEvent::TouchPoint(0));
440+ touchPoints[0].setState(Qt::TouchPointPressed);
441+ QTouchEvent touchEvent(QEvent::TouchBegin,
442+ 0 /* device */,
443+ Qt::NoModifier,
444+ Qt::TouchPointPressed,
445+ touchPoints);
446+ touchRegistry.update(&touchEvent);
447+ }
448+
449+ touchRegistry.addCandidateOwnerForTouch(0, &item);
450+
451+ {
452+ QList<QTouchEvent::TouchPoint> touchPoints;
453+ touchPoints.append(QTouchEvent::TouchPoint(0));
454+ touchPoints[0].setState(Qt::TouchPointMoved);
455+ touchPoints.append(QTouchEvent::TouchPoint(1));
456+ touchPoints[1].setState(Qt::TouchPointPressed);
457+ QTouchEvent touchEvent(QEvent::TouchUpdate,
458+ 0 /* device */,
459+ Qt::NoModifier,
460+ Qt::TouchPointPressed | Qt::TouchPointMoved,
461+ touchPoints);
462+ touchRegistry.update(&touchEvent);
463+ }
464+
465+ touchRegistry.addTouchWatcher(1, &item);
466+
467+ touchRegistry.removeCandidateOwnerForTouch(0, &item);
468+
469+ touchRegistry.addTouchWatcher(0, &item);
470+
471+ {
472+ QList<QTouchEvent::TouchPoint> touchPoints;
473+ touchPoints.append(QTouchEvent::TouchPoint(0));
474+ touchPoints[0].setState(Qt::TouchPointReleased);
475+ touchPoints.append(QTouchEvent::TouchPoint(1));
476+ touchPoints[1].setState(Qt::TouchPointMoved);
477+ QTouchEvent touchEvent(QEvent::TouchUpdate,
478+ 0 /* device */,
479+ Qt::NoModifier,
480+ Qt::TouchPointReleased | Qt::TouchPointMoved,
481+ touchPoints);
482+ touchRegistry.update(&touchEvent);
483+ }
484+
485+ {
486+ QList<QTouchEvent::TouchPoint> touchPoints;
487+ touchPoints.append(QTouchEvent::TouchPoint(1));
488+ touchPoints[0].setState(Qt::TouchPointReleased);
489+ QTouchEvent touchEvent(QEvent::TouchEnd,
490+ 0 /* device */,
491+ Qt::NoModifier,
492+ Qt::TouchPointReleased,
493+ touchPoints);
494+ touchRegistry.update(&touchEvent);
495+ }
496+
497+ QVERIFY(touchRegistry.m_touchInfoPool.isEmpty());
498+
499+ item.unownedTouchEvents.clear();
500+
501+ {
502+ QList<QTouchEvent::TouchPoint> touchPoints;
503+ touchPoints.append(QTouchEvent::TouchPoint(0));
504+ touchPoints[0].setState(Qt::TouchPointPressed);
505+ QTouchEvent touchEvent(QEvent::TouchBegin,
506+ 0 /* device */,
507+ Qt::NoModifier,
508+ Qt::TouchPointPressed,
509+ touchPoints);
510+ touchRegistry.update(&touchEvent);
511+ }
512+
513+ // Haven't made any subscription for that new touch 0.
514+ QCOMPARE(item.unownedTouchEvents.count(), 0);
515+}
516+
517+/*
518+ Regression test that reproduces a problematic scenario that came up during manual testing.
519+ It reproduces the interaction between TouchRegistry, DirectionalDragArea and a TouchGate.
520+ */
521+void tst_TouchRegistry::candidatesAndWatchers_2()
522+{
523+ TouchRegistry touchRegistry;
524+
525+ DummyCandidate directionalDragArea;
526+ directionalDragArea.setObjectName("DirectionalDragArea");
527+
528+ DummyCandidate touchGate;
529+ touchGate.setObjectName("TouchGate");
530+
531+ // [DDA] 1298 TouchBegin (id:0, state:pressed, scenePos:(147,1023))
532+ {
533+ QList<QTouchEvent::TouchPoint> touchPoints;
534+ touchPoints.append(QTouchEvent::TouchPoint(0));
535+ touchPoints[0].setState(Qt::TouchPointPressed);
536+ QTouchEvent touchEvent(QEvent::TouchBegin,
537+ 0 /* device */,
538+ Qt::NoModifier,
539+ Qt::TouchPointPressed,
540+ touchPoints);
541+ touchRegistry.update(&touchEvent);
542+ }
543+
544+ // [TouchRegistry] addCandidateOwnerForTouch id 0 candidate DirectionalDragArea
545+ touchRegistry.addCandidateOwnerForTouch(0, &directionalDragArea);
546+
547+ // [TouchRegistry] requestTouchOwnership id 0 candidate TouchGate
548+ touchRegistry.requestTouchOwnership(0, &touchGate);
549+
550+ //[TouchRegistry] got TouchUpdate (id:0, state:moved, scenePos:(147,1023)) (id:1, state:pressed, scenePos:(327,792))
551+ {
552+ QList<QTouchEvent::TouchPoint> touchPoints;
553+ touchPoints.append(QTouchEvent::TouchPoint(0));
554+ touchPoints[0].setState(Qt::TouchPointMoved);
555+ touchPoints.append(QTouchEvent::TouchPoint(1));
556+ touchPoints[1].setState(Qt::TouchPointPressed);
557+ QTouchEvent touchEvent(QEvent::TouchUpdate,
558+ 0 /* device */,
559+ Qt::NoModifier,
560+ Qt::TouchPointPressed | Qt::TouchPointMoved,
561+ touchPoints);
562+ touchRegistry.update(&touchEvent);
563+ }
564+
565+ // [TouchRegistry] addTouchWatcher id 1 watcher DirectionalDragArea
566+ touchRegistry.addTouchWatcher(1, &directionalDragArea);
567+
568+ // [TouchRegistry] removeCandidateOwnerForTouch id 0 candidate DirectionalDragArea
569+ touchRegistry.removeCandidateOwnerForTouch(0, &directionalDragArea);
570+
571+ //[TouchRegistry] sending TouchWonershipEvent(id = 0 gained) to candidate TouchGate
572+ QCOMPARE(touchGate.ownedTouches.count(), 1);
573+ QVERIFY(touchGate.ownedTouches.contains(0));
574+
575+ // [TouchRegistry] addTouchWatcher id 0 watcher DirectionalDragArea
576+ touchRegistry.addTouchWatcher(0, &directionalDragArea);
577+
578+ // [TouchRegistry] requestTouchOwnership id 1 candidate TouchGate
579+ touchRegistry.requestTouchOwnership(1, &touchGate);
580+
581+ //[TouchRegistry] sending TouchWonershipEvent(id = 1 gained) to candidate TouchGate
582+ QCOMPARE(touchGate.ownedTouches.count(), 2);
583+ QVERIFY(touchGate.ownedTouches.contains(1));
584+
585+ directionalDragArea.unownedTouchEvents.clear();
586+ touchGate.unownedTouchEvents.clear();
587+
588+ //[TouchRegistry] got TouchUpdate (id:0, state:moved, scenePos:(148,1025)) (id:1, state:moved, scenePos:(329,795))
589+ {
590+ QList<QTouchEvent::TouchPoint> touchPoints;
591+ touchPoints.append(QTouchEvent::TouchPoint(0));
592+ touchPoints[0].setState(Qt::TouchPointMoved);
593+ touchPoints.append(QTouchEvent::TouchPoint(1));
594+ touchPoints[1].setState(Qt::TouchPointMoved);
595+ QTouchEvent touchEvent(QEvent::TouchUpdate,
596+ 0 /* device */,
597+ Qt::NoModifier,
598+ Qt::TouchPointMoved,
599+ touchPoints);
600+ touchRegistry.update(&touchEvent);
601+ }
602+
603+ //vvvvv DDA Watchers are being ignored from now on vvvvvvv
604+
605+ QCOMPARE(directionalDragArea.unownedTouchEvents.count(), 1);
606+ QCOMPARE(directionalDragArea.unownedTouchEvents.first().touchPoints.count(), 2);
607+ QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(0));
608+ QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(1));
609+
610+ QVERIFY(touchGate.unownedTouchEvents.isEmpty());
611+
612+ directionalDragArea.unownedTouchEvents.clear();
613+
614+ //[TouchRegistry] got TouchUpdate (id:0, state:moved, scenePos:(151,1029)) (id:1, state:released, scenePos:(329,795))
615+ {
616+ QList<QTouchEvent::TouchPoint> touchPoints;
617+ touchPoints.append(QTouchEvent::TouchPoint(0));
618+ touchPoints[0].setState(Qt::TouchPointMoved);
619+ touchPoints.append(QTouchEvent::TouchPoint(1));
620+ touchPoints[1].setState(Qt::TouchPointReleased);
621+ QTouchEvent touchEvent(QEvent::TouchUpdate,
622+ 0 /* device */,
623+ Qt::NoModifier,
624+ Qt::TouchPointMoved | Qt::TouchPointReleased,
625+ touchPoints);
626+ touchRegistry.update(&touchEvent);
627+ }
628+
629+ QCOMPARE(directionalDragArea.unownedTouchEvents.count(), 1);
630+ QCOMPARE(directionalDragArea.unownedTouchEvents.first().touchPoints.count(), 2);
631+ QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(0));
632+ QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(1));
633+
634+ QVERIFY(touchGate.unownedTouchEvents.isEmpty());
635+
636+ directionalDragArea.unownedTouchEvents.clear();
637+
638+ //[TouchRegistry] got TouchEnd (id:0, state:released, scenePos:(157,1034))
639+ {
640+ QList<QTouchEvent::TouchPoint> touchPoints;
641+ touchPoints.append(QTouchEvent::TouchPoint(0));
642+ touchPoints[0].setState(Qt::TouchPointReleased);
643+ QTouchEvent touchEvent(QEvent::TouchEnd,
644+ 0 /* device */,
645+ Qt::NoModifier,
646+ Qt::TouchPointReleased,
647+ touchPoints);
648+ touchRegistry.update(&touchEvent);
649+ }
650+
651+ QCOMPARE(directionalDragArea.unownedTouchEvents.count(), 1);
652+ QCOMPARE(directionalDragArea.unownedTouchEvents.first().touchPoints.count(), 1);
653+ QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(0));
654+
655+ QVERIFY(touchGate.unownedTouchEvents.isEmpty());
656+}
657+
658+void tst_TouchRegistry::rejectingTouchfterItsEnd()
659+{
660+ TouchRegistry touchRegistry;
661+ DummyCandidate earlyCandidate;
662+ DummyCandidate lateCandidate;
663+
664+ {
665+ QList<QTouchEvent::TouchPoint> touchPoints;
666+ touchPoints.append(QTouchEvent::TouchPoint(0));
667+ touchPoints[0].setState(Qt::TouchPointPressed);
668+ QTouchEvent touchEvent(QEvent::TouchBegin,
669+ 0 /* device */,
670+ Qt::NoModifier,
671+ Qt::TouchPointPressed,
672+ touchPoints);
673+ touchRegistry.update(&touchEvent);
674+ }
675+
676+ touchRegistry.addCandidateOwnerForTouch(0, &earlyCandidate);
677+ touchRegistry.addCandidateOwnerForTouch(0, &lateCandidate);
678+
679+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
680+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
681+
682+ touchRegistry.requestTouchOwnership(0, &lateCandidate);
683+
684+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
685+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
686+
687+ {
688+ QList<QTouchEvent::TouchPoint> touchPoints;
689+ touchPoints.append(QTouchEvent::TouchPoint(0));
690+ touchPoints[0].setState(Qt::TouchPointReleased);
691+ QTouchEvent touchEvent(QEvent::TouchEnd,
692+ 0 /* device */,
693+ Qt::NoModifier,
694+ Qt::TouchPointPressed,
695+ touchPoints);
696+ touchRegistry.update(&touchEvent);
697+ }
698+
699+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
700+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
701+
702+ touchRegistry.removeCandidateOwnerForTouch(0, &earlyCandidate);
703+
704+ QCOMPARE(lateCandidate.ownedTouches.count(), 1);
705+ QCOMPARE(lateCandidate.ownedTouches.contains(0), 1);
706+
707+ // Check that there's no trace left of touch 0 as we no longer need to keep tabs on it.
708+ QVERIFY(!touchRegistry.findTouchInfo(0));
709+}
710+
711+void tst_TouchRegistry::removeOldUndecidedCandidates()
712+{
713+ FakeTimerFactory *fakeTimerFactory = new FakeTimerFactory;
714+ TouchRegistry *touchRegistry = new TouchRegistry(nullptr, fakeTimerFactory);
715+
716+ DummyCandidate undecidedCandidate;
717+ undecidedCandidate.setObjectName("undecided");
718+
719+ DummyCandidate candidateThatWantsTouch;
720+ candidateThatWantsTouch.setObjectName("wantsTouch");
721+
722+ {
723+ QList<QTouchEvent::TouchPoint> touchPoints;
724+ touchPoints.append(QTouchEvent::TouchPoint(0));
725+ touchPoints[0].setState(Qt::TouchPointPressed);
726+ QTouchEvent touchEvent(QEvent::TouchBegin,
727+ 0 /* device */,
728+ Qt::NoModifier,
729+ Qt::TouchPointPressed,
730+ touchPoints);
731+ touchRegistry->update(&touchEvent);
732+ }
733+
734+ touchRegistry->addCandidateOwnerForTouch(0, &undecidedCandidate);
735+
736+ touchRegistry->requestTouchOwnership(0, &candidateThatWantsTouch);
737+
738+ QVERIFY(undecidedCandidate.ownedTouches.isEmpty());
739+ QVERIFY(undecidedCandidate.lostTouches.isEmpty());
740+ QVERIFY(candidateThatWantsTouch.ownedTouches.isEmpty());
741+ QVERIFY(candidateThatWantsTouch.lostTouches.isEmpty());
742+
743+ // Simulate that enough time has passed to cause the CandidateInactivityTimer to timeout,
744+ // making TouchRegistry consider that undecidedCantidate defaulted.
745+ fakeTimerFactory->makeRunningTimersTimeout();
746+
747+ QVERIFY(undecidedCandidate.ownedTouches.isEmpty());
748+ QVERIFY(undecidedCandidate.lostTouches.contains(0));
749+ QVERIFY(candidateThatWantsTouch.ownedTouches.contains(0));
750+ QVERIFY(candidateThatWantsTouch.lostTouches.isEmpty());
751+
752+ delete touchRegistry;
753+}
754+
755+////////////// TouchMemento //////////
756+
757+TouchMemento::TouchMemento(const QTouchEvent *touchEvent)
758+ : touchPointStates(touchEvent->touchPointStates()), touchPoints(touchEvent->touchPoints())
759+{
760+}
761+
762+bool TouchMemento::containsTouchWithId(int touchId) const
763+{
764+ for (int i = 0; i < touchPoints.count(); ++i) {
765+ if (touchPoints.at(i).id() == touchId) {
766+ return true;
767+ }
768+ }
769+ return false;
770+}
771+
772+////////////// DummyCandidate //////////
773+
774+bool DummyCandidate::event(QEvent *e)
775+{
776+ if (e->type() == TouchOwnershipEvent::touchOwnershipEventType()) {
777+ TouchOwnershipEvent *touchOwnershipEvent = static_cast<TouchOwnershipEvent *>(e);
778+
779+ // NB: Cannot use QVERIFY here because the macro doesn't return a boolean and is
780+ // meant for use only directly in the body of a test function
781+ if (ownedTouches.contains(touchOwnershipEvent->touchId()))
782+ qFatal("Sent ownership event for a touch that is already owned.");
783+ if (lostTouches.contains(touchOwnershipEvent->touchId()))
784+ qFatal("Sent ownership event for a touch that has already been lost.");
785+
786+ if (touchOwnershipEvent->gained()) {
787+ ownedTouches.insert(touchOwnershipEvent->touchId());
788+ } else {
789+ lostTouches.insert(touchOwnershipEvent->touchId());
790+ }
791+ return true;
792+ } else if (e->type() == UnownedTouchEvent::unownedTouchEventType()) {
793+ UnownedTouchEvent *unownedTouchEvent = static_cast<UnownedTouchEvent *>(e);
794+ unownedTouchEvents.append(TouchMemento(unownedTouchEvent->touchEvent()));
795+ return true;
796+ } else {
797+ return QObject::event(e);
798+ }
799+}
800+
801+QTEST_GUILESS_MAIN(tst_TouchRegistry)
802+
803+#include "tst_TouchRegistry.moc"
tests/mocks/AccountsService/AccountsService.cpp+5−3
@@ -26,7 +26,8 @@ AccountsService::AccountsService(QObject* parent)
2626 m_enableIndicatorsWhileLocked(true),
2727 m_backgroundFile(qmlDirectory() + "graphics/phone_background.jpg"),
2828 m_statsWelcomeScreen(true),
29− m_failedLogins(0)
29+ m_failedLogins(0),
30+ m_demoEdges(false)
3031{
3132}
3233
@@ -44,12 +45,13 @@ void AccountsService::setUser(const QString &user)
4445
4546bool AccountsService::demoEdges() const
4647{
47− return false;
48+ return m_demoEdges;
4849}
4950
5051void AccountsService::setDemoEdges(bool demoEdges)
5152{
52− Q_UNUSED(demoEdges)
53+ m_demoEdges = demoEdges;
54+ Q_EMIT demoEdgesChanged();
5355}
5456
5557bool AccountsService::enableLauncherWhileLocked() const
tests/mocks/AccountsService/AccountsService.h+1
@@ -101,6 +101,7 @@ private:
101101 QString m_user;
102102 bool m_statsWelcomeScreen;
103103 uint m_failedLogins;
104+ bool m_demoEdges;
104105};
105106
106107#endif
tests/mocks/Unity/Application/CMakeLists.txt+1
@@ -13,6 +13,7 @@ set(FakeUnityApplicationQml_SOURCES
1313 SessionManager.cpp
1414 SurfaceManager.cpp
1515 SessionModel.h
16+ UbuntuKeyboardInfo.cpp
1617 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
1718 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
1819)
tests/mocks/Unity/Application/MirSurfaceItem.cpp+18−22
@@ -40,6 +40,8 @@ MirSurfaceItem::MirSurfaceItem(const QString& name,
4040 , m_state(state)
4141 , m_live(true)
4242 , m_orientation(Qt::PortraitOrientation)
43+ , m_touchPressCount(0)
44+ , m_touchReleaseCount(0)
4345 , m_qmlItem(nullptr)
4446 , m_screenshotUrl(screenshot)
4547{
@@ -144,24 +146,12 @@ void MirSurfaceItem::setLive(bool live)
144146 }
145147}
146148
147−void MirSurfaceItem::onQmlWantInputMethodChanged()
148−{
149− QQmlProperty prop(m_qmlItem, "wantInputMethod");
150− bool wantInputMethod = prop.read().toBool();
151−
152− if (hasFocus() && wantInputMethod) {
153− Q_EMIT inputMethodRequested();
154− }
155−}
156−
157149void MirSurfaceItem::onFocusChanged()
158150{
159− QQmlProperty prop(m_qmlItem, "wantInputMethod");
160− bool wantInputMethod = prop.read().toBool();
161−
162− if (!hasFocus() && wantInputMethod) {
163− Q_EMIT inputMethodDismissed();
164− prop.write(QVariant::fromValue(false));
151+ if (!hasFocus()) {
152+ // Causes a crash in tst_Shell.qml, inside the mock Unity.Application itself.
153+ // Didn't have time to debug yet.
154+ //Q_EMIT inputMethodDismissed();
165155 }
166156}
167157
@@ -194,12 +184,18 @@ void MirSurfaceItem::createQmlContentItem()
194184 QQmlProperty screenshotSource(m_qmlItem, "screenshotSource");
195185 screenshotSource.write(QVariant::fromValue(m_screenshotUrl));
196186 }
187+}
197188
198− {
199− QQmlProperty prop(m_qmlItem, "wantInputMethod");
200− if (prop.type() == QQmlProperty::Property) {
201− bool ok = prop.connectNotifySignal(this, SLOT(onQmlWantInputMethodChanged()));
202− if (!ok) qCritical("MirSurfaceItem: failed to connect to wantInputMethod notify signal");
203− }
189+void MirSurfaceItem::touchEvent(QTouchEvent * event)
190+{
191+ if (event->touchPointStates() & Qt::TouchPointPressed) {
192+ ++m_touchPressCount;
193+ Q_EMIT touchPressCountChanged(m_touchPressCount);
194+ // Causes a crash in tst_Shell.qml, inside the mock Unity.Application itself.
195+ // Didn't have time to debug yet.
196+ // Q_EMIT inputMethodRequested();
197+ } else if (event->touchPointStates() & Qt::TouchPointReleased) {
198+ ++m_touchReleaseCount;
199+ Q_EMIT touchReleaseCountChanged(m_touchReleaseCount);
204200 }
205201}
tests/mocks/Unity/Application/MirSurfaceItem.h+18−1
@@ -36,6 +36,11 @@ class MirSurfaceItem : public QQuickItem
3636 Q_PROPERTY(bool live READ live NOTIFY liveChanged)
3737 Q_PROPERTY(Qt::ScreenOrientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged DESIGNABLE false)
3838
39+ Q_PROPERTY(int touchPressCount READ touchPressCount WRITE setTouchPressCount NOTIFY touchPressCountChanged
40+ DESIGNABLE false)
41+ Q_PROPERTY(int touchReleaseCount READ touchReleaseCount WRITE setTouchReleaseCount NOTIFY touchReleaseCountChanged
42+ DESIGNABLE false)
43+
3944public:
4045 enum Type {
4146 Normal,
@@ -73,6 +78,12 @@ public:
7378 void setScreenshot(const QUrl& screenshot);
7479 void setLive(bool live);
7580
81+ int touchPressCount() const { return m_touchPressCount; }
82+ void setTouchPressCount(int count) { m_touchPressCount = count; Q_EMIT touchPressCountChanged(count); }
83+
84+ int touchReleaseCount() const { return m_touchReleaseCount; }
85+ void setTouchReleaseCount(int count) { m_touchReleaseCount = count; Q_EMIT touchReleaseCountChanged(count); }
86+
7687 Q_INVOKABLE void setState(State newState);
7788 Q_INVOKABLE void release();
7889
@@ -81,6 +92,8 @@ Q_SIGNALS:
8192 void stateChanged(State);
8293 void liveChanged(bool live);
8394 void orientationChanged();
95+ void touchPressCountChanged(int count);
96+ void touchReleaseCountChanged(int count);
8497
8598 void inputMethodRequested();
8699 void inputMethodDismissed();
@@ -88,10 +101,12 @@ Q_SIGNALS:
88101 // internal mock use
89102 void deregister();
90103
104+protected:
105+ void touchEvent(QTouchEvent * event) override;
106+
91107private Q_SLOTS:
92108 void onFocusChanged();
93109 void onComponentStatusChanged(QQmlComponent::Status status);
94− void onQmlWantInputMethodChanged();
95110
96111private:
97112 explicit MirSurfaceItem(const QString& name,
@@ -110,6 +125,8 @@ private:
110125 State m_state;
111126 bool m_live;
112127 Qt::ScreenOrientation m_orientation;
128+ int m_touchPressCount;
129+ int m_touchReleaseCount;
113130
114131 QQmlComponent *m_qmlContentComponent;
115132 QQuickItem *m_qmlItem;
tests/mocks/Unity/Application/MirSurfaceItem.qml−12
@@ -17,7 +17,6 @@
1717import QtQuick 2.0
1818
1919Rectangle {
20− objectName: "fakeSurfaceQML"
2120 id: root
2221 color: "pink"
2322
@@ -38,11 +37,6 @@ Rectangle {
3837 property alias screenshotSource: screenshotImage.source
3938 property int orientation: Qt.PortraitOrientation
4039
41− property bool wantInputMethod: false
42−
43− property int touchPressCount: 0
44− property int touchReleaseCount: 0
45−
4640 Image {
4741 id: screenshotImage
4842 anchors.fill: parent
@@ -58,10 +52,4 @@ Rectangle {
5852 minimumPixelSize: 10; font.pixelSize: 200
5953 verticalAlignment: Text.AlignVCenter
6054 }
61−
62− MultiPointTouchArea {
63− anchors.fill: parent
64− onPressed: { root.wantInputMethod = true; root.touchPressCount++; }
65− onReleased: { root.touchReleaseCount++; }
66− }
6755}
tests/mocks/Unity/Application/UbuntuKeyboardInfo.cppnew file+28
@@ -0,0 +1,28 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "UbuntuKeyboardInfo.h"
18+
19+UbuntuKeyboardInfo *UbuntuKeyboardInfo::m_instance = nullptr;
20+
21+UbuntuKeyboardInfo::UbuntuKeyboardInfo(QObject *parent)
22+ : QObject(parent),
23+ m_x(0),
24+ m_y(0),
25+ m_width(200),
26+ m_height(200)
27+{
28+}
tests/mocks/Unity/Application/UbuntuKeyboardInfo.hnew file+60
@@ -0,0 +1,60 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef UBUNTU_KEYBOARD_INFO_H
18+#define UBUNTU_KEYBOARD_INFO_H
19+
20+#include <QLocalSocket>
21+#include <QTimer>
22+
23+class UbuntuKeyboardInfo : public QObject {
24+ Q_OBJECT
25+ Q_PROPERTY(qreal x READ x NOTIFY xChanged)
26+ Q_PROPERTY(qreal y READ y NOTIFY yChanged)
27+ Q_PROPERTY(qreal width READ width NOTIFY widthChanged)
28+ Q_PROPERTY(qreal height READ height NOTIFY heightChanged)
29+public:
30+ UbuntuKeyboardInfo(QObject *parent = 0);
31+ virtual ~UbuntuKeyboardInfo() {}
32+ qreal x() const { return m_x; }
33+ qreal y() const { return m_y; }
34+ qreal width() const { return m_width; }
35+ qreal height() const { return m_height; }
36+
37+ static UbuntuKeyboardInfo *singleton() {
38+ if (!m_instance) {
39+ m_instance = new UbuntuKeyboardInfo;
40+ }
41+ return m_instance;
42+ }
43+
44+Q_SIGNALS:
45+ void xChanged(qreal x);
46+ void yChanged(qreal y);
47+ void widthChanged(qreal width);
48+ void heightChanged(qreal height);
49+
50+private:
51+ QLocalSocket m_socket;
52+ qint32 m_x;
53+ qint32 m_y;
54+ qint32 m_width;
55+ qint32 m_height;
56+
57+ static UbuntuKeyboardInfo *m_instance;
58+};
59+
60+#endif // UBUNTU_KEYBOARD_INFO_H
tests/mocks/Unity/Application/plugin.cpp+7
@@ -24,6 +24,7 @@
2424#include "SurfaceManager.h"
2525#include "SessionManager.h"
2626#include "ApplicationTestInterface.h"
27+#include "UbuntuKeyboardInfo.h"
2728
2829#include <qqml.h>
2930#include <QQmlEngine>
@@ -46,6 +47,11 @@ static QObject* sessionManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEng
4647 return SessionManager::singleton();
4748}
4849
50+static QObject* ubuntuKeyboardInfoSingleton(QQmlEngine*, QJSEngine*) {
51+ return UbuntuKeyboardInfo::singleton();
52+}
53+
54+
4955ApplicationTestInterface* s_appTestInterface = nullptr;
5056
5157static QObject* applicationTestInterface(QQmlEngine* engine, QJSEngine* scriptEngine) {
@@ -76,6 +82,7 @@ void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
7682 qmlRegisterSingletonType<SurfaceManager>(uri, 0, 1, "SurfaceManager", surfaceManagerSingleton);
7783 qmlRegisterSingletonType<SessionManager>(uri, 0, 1, "SessionManager", sessionManagerSingleton);
7884 qmlRegisterSingletonType<ApplicationTestInterface>(uri, 0, 1, "ApplicationTest", applicationTestInterface);
85+ qmlRegisterSingletonType<UbuntuKeyboardInfo>(uri, 0, 1, "UbuntuKeyboardInfo", ubuntuKeyboardInfoSingleton);
7986
8087 qRegisterMetaType<MirSurfaceItem::Type>("MirSurfaceItem::Type");
8188 qRegisterMetaType<MirSurfaceItem::State>("MirSurfaceItem::State");
tests/mocks/Unity/Launcher/MockLauncherModel.cpp+1
@@ -54,6 +54,7 @@ MockLauncherModel::MockLauncherModel(QObject* parent): LauncherModelInterface(pa
5454 item = new MockLauncherItem("ubuntu-weather-app", "/usr/share/applications/ubuntu-weather-app.desktop", "Weather", "weather", this);
5555 item->setCount(1234567890);
5656 item->setCountVisible(true);
57+ item->setPinned(true);
5758 m_list.append(item);
5859 item = new MockLauncherItem("notes-app", "/usr/share/applications/notes-app.desktop", "Notepad", "notepad", this);
5960 item->setProgress(50);
tests/mocks/libusermetrics/UserMetrics.cpp+2−2
@@ -238,7 +238,7 @@ void UserMetricsPrivate::setUsername(const QString &username)
238238 m_username = username;
239239
240240 m_dataIndex = m_fakeData.constFind(m_username);
241− if (m_dataIndex == m_fakeData.end())
241+ if (m_dataIndex == m_fakeData.constEnd())
242242 {
243243 m_dataIndex = m_fakeData.constFind("");
244244 }
@@ -383,7 +383,7 @@ void UserMetricsPrivate::finishSetFakeData()
383383void UserMetricsPrivate::nextFakeData()
384384{
385385 ++m_dataIndex;
386− if (m_dataIndex == m_fakeData.end() || m_dataIndex.key() != m_username)
386+ if (m_dataIndex == m_fakeData.constEnd() || m_dataIndex.key() != m_username)
387387 {
388388 m_dataIndex = m_fakeData.constFind(m_username);
389389 }
tests/plugins/Ubuntu/Gestures/CMakeLists.txt+9−2
@@ -1,7 +1,13 @@
11include(QmlTest)
22
3+# DANGER! DANGER! Using Qt's private API!
4+include_directories(
5+ ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
6+)
7+
38include_directories(
49 ${CMAKE_SOURCE_DIR}/plugins/Ubuntu/Gestures
10+ ${CMAKE_SOURCE_DIR}/libs/UbuntuGestures
511 ${CMAKE_CURRENT_BINARY_DIR}
612 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
713 )
@@ -17,7 +23,7 @@ add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
1723macro(add_gesture_ui_test CLASSNAME)
1824 add_executable(${CLASSNAME}TestExec tst_${CLASSNAME}.cpp GestureTest.cpp)
1925 qt5_use_modules(${CLASSNAME}TestExec Test Core Qml Gui Quick)
20− target_link_libraries(${CLASSNAME}TestExec UbuntuGestureQml)
26+ target_link_libraries(${CLASSNAME}TestExec UbuntuGesturesQml UbuntuGestures)
2127
2228 add_binary_qml_test(${CLASSNAME} ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures UbuntuGesturesTestQmlFiles "")
2329 add_manual_qml_test(. ${CLASSNAME} IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
@@ -34,10 +40,11 @@ macro(add_gesture_test CLASSNAME)
3440
3541 add_executable(${CLASSNAME}TestExec tst_${CLASSNAME}.cpp)
3642 qt5_use_modules(${CLASSNAME}TestExec Test Core)
37− target_link_libraries(${CLASSNAME}TestExec UbuntuGestureQml)
43+ target_link_libraries(${CLASSNAME}TestExec UbuntuGesturesQml)
3844endmacro(add_gesture_test)
3945
4046add_gesture_ui_test(DirectionalDragArea)
4147add_gesture_ui_test(PressedOutsideNotifier)
48+add_gesture_ui_test(TouchGate)
4249add_gesture_test(Damper)
4350add_gesture_test(AxisVelocityCalculator)
tests/plugins/Ubuntu/Gestures/RightwardsLauncher.qml+3
@@ -46,6 +46,9 @@ Item {
4646 id: dragArea
4747 objectName: "hpDragArea"
4848
49+ // give some room for items to be dynamically stacked right behind him
50+ z: 10.0
51+
4952 width: units.gu(5)
5053
5154 direction: Direction.Rightwards
tests/plugins/Ubuntu/Gestures/touchGateExample.qmlnew file+27
@@ -0,0 +1,27 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Gestures 0.1
19+
20+Rectangle {
21+ width: 720; height: 720
22+
23+ TouchGate {
24+ anchors.fill: parent
25+ objectName: "touchGate"
26+ }
27+}
tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp+491−14
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -19,37 +19,63 @@
1919#include <QtQuick/QQuickView>
2020#include <QtQml/QQmlEngine>
2121#include <QPointer>
22+#include <private/qquickmousearea_p.h>
23+
24+// C++ std lib
25+#include <functional>
2226
2327#include <DirectionalDragArea.h>
28+#include <TouchRegistry.h>
2429
2530#include "GestureTest.h"
2631
2732using namespace UbuntuGestures;
2833
29−class FakeTimer : public AbstractTimer
34+class TouchMemento {
35+public:
36+ TouchMemento(const QTouchEvent *touchEvent);
37+ Qt::TouchPointStates touchPointStates;
38+ QList<QTouchEvent::TouchPoint> touchPoints;
39+
40+ bool containsTouchWithId(int touchId) const;
41+};
42+
43+class DummyItem : public QQuickItem
3044{
3145 Q_OBJECT
3246public:
33− FakeTimer(const SharedTimeSource &timeSource, QObject *parent = 0)
34− : UbuntuGestures::AbstractTimer(parent),
47+ DummyItem(QQuickItem *parent = 0);
48+
49+ QList<TouchMemento> touchEvents;
50+ std::function<void(QTouchEvent*)> touchEventHandler;
51+protected:
52+ void touchEvent(QTouchEvent *event) override;
53+private:
54+ static void defaultTouchEventHandler(QTouchEvent *event);
55+};
56+
57+class ComplexFakeTimer : public FakeTimer
58+{
59+ Q_OBJECT
60+public:
61+ ComplexFakeTimer(const SharedTimeSource &timeSource, QObject *parent = 0)
62+ : FakeTimer(parent),
3563 m_timeSource(timeSource)
3664 {}
3765
38− int interval() const override { return m_interval; }
39− void setInterval(int msecs) override { m_interval = msecs; }
4066 void start() override {
4167 AbstractTimer::start();
42− m_nextTimeoutTime = m_timeSource->msecsSinceReference() + (qint64)m_interval;
68+ m_nextTimeoutTime = m_timeSource->msecsSinceReference() + (qint64)interval();
4369 }
4470
4571 void emitTimeout() {
46− m_nextTimeoutTime += m_interval;
72+ m_nextTimeoutTime += interval();
4773 Q_EMIT timeout();
4874 }
4975
5076 qint64 nextTimeoutTime() const { return m_nextTimeoutTime; }
77+
5178private:
52− int m_interval;
5379 SharedTimeSource m_timeSource;
5480 qint64 m_nextTimeoutTime;
5581};
@@ -62,6 +88,30 @@ public:
6288 qint64 m_msecsSinceReference;
6389};
6490
91+/*
92+ QQuickMouseArea::canceled() signal is not registered in the meta object system.
93+ So using a QSignalSpy to track it won't work. Thus the only way to connect to it
94+ is using its method address directly.
95+ */
96+class MouseAreaSpy : public QObject
97+{
98+ Q_OBJECT
99+public:
100+ MouseAreaSpy(QQuickMouseArea *mouseArea)
101+ : canceledCount(0)
102+ {
103+ connect(mouseArea, &QQuickMouseArea::canceled,
104+ this, &MouseAreaSpy::onMouseAreaCanceled);
105+ }
106+
107+ int canceledCount;
108+
109+private Q_SLOTS:
110+ void onMouseAreaCanceled() {
111+ ++canceledCount;
112+ }
113+};
114+
65115class tst_DirectionalDragArea: public GestureTest
66116{
67117 Q_OBJECT
@@ -87,10 +137,20 @@ private Q_SLOTS:
87137 void sceneDistance();
88138 void sceneDistance_data();
89139 void disabledWhileDragging();
140+ void oneFingerDownFollowedByLateSecondFingerDown();
141+ void givesUpWhenLosesTouch();
142+ void threeFingerDrag();
143+ void immediateRecognitionWhenConstraintsDisabled();
144+ void withdrawTouchOwnershipCandidacyIfDisabledDuringRecognition();
145+ void withdrawTouchOwnershipCandidacyIfDisabledDuringRecognition_data();
146+ void tappedSignal();
147+ void tappedSignal_data();
148+ void gettingTouchOwnershipMakesMouseAreaBehindGetCanceled();
90149
91150private:
92− void passTime(qint64 timeSpan);
93− FakeTimer *fakeTimer;
151+ void passTime(qint64 timeSpanMs);
152+ TouchRegistry *touchRegistry;
153+ ComplexFakeTimer *fakeTimer;
94154 QSharedPointer<FakeTimeSource> fakeTimeSource;
95155};
96156
@@ -111,12 +171,19 @@ void tst_DirectionalDragArea::init()
111171 QTRY_COMPARE(m_view->width(), (int)m_view->rootObject()->width());
112172 QTRY_COMPARE(m_view->height(), (int)m_view->rootObject()->height());
113173
174+ touchRegistry = new TouchRegistry;
175+ m_view->installEventFilter(touchRegistry);
176+
114177 fakeTimeSource.reset(new FakeTimeSource);
115− fakeTimer = new FakeTimer(fakeTimeSource);
178+ fakeTimer = new ComplexFakeTimer(fakeTimeSource);
116179}
117180
118181void tst_DirectionalDragArea::cleanup()
119182{
183+ m_view->removeEventFilter(touchRegistry);
184+ delete touchRegistry;
185+ touchRegistry = nullptr;
186+
120187 delete fakeTimer;
121188 fakeTimer = 0;
122189
@@ -125,9 +192,9 @@ void tst_DirectionalDragArea::cleanup()
125192 GestureTest::cleanup();
126193}
127194
128−void tst_DirectionalDragArea::passTime(qint64 timeSpan)
195+void tst_DirectionalDragArea::passTime(qint64 timeSpanMs)
129196{
130− qint64 finalTime = fakeTimeSource->m_msecsSinceReference + timeSpan;
197+ qint64 finalTime = fakeTimeSource->m_msecsSinceReference + timeSpanMs;
131198
132199 if (fakeTimer->isRunning() && finalTime >= fakeTimer->nextTimeoutTime()) {
133200 fakeTimeSource->m_msecsSinceReference = fakeTimer->nextTimeoutTime();
@@ -849,6 +916,416 @@ void tst_DirectionalDragArea::disabledWhileDragging()
849916 QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
850917}
851918
919+void tst_DirectionalDragArea::oneFingerDownFollowedByLateSecondFingerDown()
920+{
921+ DirectionalDragArea *edgeDragArea =
922+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
923+ Q_ASSERT(edgeDragArea != 0);
924+ edgeDragArea->setRecognitionTimer(fakeTimer);
925+ edgeDragArea->setTimeSource(fakeTimeSource);
926+
927+ // Disable some constraints we're not interested in
928+ edgeDragArea->setMaxSilenceTime(60 * 1000);
929+ edgeDragArea->setMinSpeed(0);
930+
931+ // And ensure others have the values we want
932+ edgeDragArea->setCompositionTime(60);
933+
934+ // Put an item right behind edgeDragArea to receive the touches ignored by it
935+ DummyItem *dummyItem = new DummyItem;
936+ dummyItem->setParentItem(edgeDragArea->parentItem());
937+ dummyItem->setX(edgeDragArea->x());
938+ dummyItem->setY(edgeDragArea->y());
939+ dummyItem->setZ(edgeDragArea->z() - 1.0);
940+ dummyItem->setWidth(edgeDragArea->width());
941+ dummyItem->setHeight(edgeDragArea->height());
942+
943+ // Make touches evenly spaced along the edgeDragArea
944+ QPoint touch0Pos(edgeDragArea->width()/2.0f, m_view->height()*0.33f);
945+ QPoint touch1Pos(edgeDragArea->width()/2.0f, m_view->height()*0.66f);
946+
947+ QTest::touchEvent(m_view, m_device).press(0, touch0Pos);
948+
949+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Undecided);
950+
951+ // We are now going to be way beyond compositionTime
952+ passTime(edgeDragArea->compositionTime()*3);
953+
954+ QTest::touchEvent(m_view, m_device)
955+ .move(0, touch0Pos)
956+ .press(1, touch1Pos);
957+
958+ // A new touch has come, but as it can't be composed with touch 0, it should be
959+ // ignored/rejected by the DirectionalDragArea
960+ // Therefore the last event received by dummyItem must have both touch points (0 and 1)
961+ {
962+ TouchMemento &touchMemento = dummyItem->touchEvents.last();
963+ QCOMPARE(touchMemento.touchPoints.count(), 2);
964+ QVERIFY(touchMemento.containsTouchWithId(0));
965+ QVERIFY(touchMemento.containsTouchWithId(1));
966+ }
967+
968+ passTime(30);
969+
970+ QTest::touchEvent(m_view, m_device)
971+ .move(0, touch0Pos)
972+ .move(1, touch1Pos);
973+
974+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Undecided);
975+
976+ passTime(5);
977+
978+ QTest::touchEvent(m_view, m_device)
979+ .release(0, touch0Pos)
980+ .move(1, touch1Pos);
981+
982+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
983+
984+ passTime(5);
985+
986+ QTest::touchEvent(m_view, m_device)
987+ .release(1, touch1Pos);
988+
989+ // Shouldn't be keepping info about touches that no longer exist or interest us
990+ QVERIFY(edgeDragArea->m_activeTouches.isEmpty());
991+
992+ delete dummyItem;
993+}
994+
995+void tst_DirectionalDragArea::givesUpWhenLosesTouch()
996+{
997+ DirectionalDragArea *edgeDragArea =
998+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
999+ Q_ASSERT(edgeDragArea != 0);
1000+ edgeDragArea->setRecognitionTimer(fakeTimer);
1001+ edgeDragArea->setTimeSource(fakeTimeSource);
1002+
1003+ // Disable some constraints we're not interested in
1004+ edgeDragArea->setMaxSilenceTime(60 * 1000);
1005+ edgeDragArea->setMinSpeed(0);
1006+
1007+ // Put an item right in front of edgeDragArea
1008+ DummyItem *dummyItem = new DummyItem(edgeDragArea->parentItem());
1009+ dummyItem->setX(edgeDragArea->x());
1010+ dummyItem->setY(edgeDragArea->y());
1011+ dummyItem->setZ(edgeDragArea->z() + 1.0);
1012+ dummyItem->setWidth(edgeDragArea->width());
1013+ dummyItem->setHeight(edgeDragArea->height());
1014+
1015+ QPoint touchPos(edgeDragArea->width()/2.0f, m_view->height()/2.0f);
1016+
1017+ dummyItem->touchEventHandler = [&](QTouchEvent *event) {
1018+ touchRegistry->addCandidateOwnerForTouch(0, dummyItem);
1019+ event->ignore();
1020+ };
1021+
1022+ QTest::touchEvent(m_view, m_device).press(0, touchPos);
1023+
1024+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Undecided);
1025+
1026+ touchRegistry->requestTouchOwnership(0, dummyItem);
1027+
1028+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
1029+
1030+ dummyItem->grabTouchPoints({0});
1031+ dummyItem->touchEventHandler = [&](QTouchEvent *event) { event->accept(); };
1032+
1033+ passTime(5);
1034+ QTest::touchEvent(m_view, m_device).release(0, touchPos);
1035+
1036+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
1037+
1038+ QVERIFY(edgeDragArea->m_activeTouches.isEmpty());
1039+}
1040+
1041+void tst_DirectionalDragArea::threeFingerDrag()
1042+{
1043+ DirectionalDragArea *edgeDragArea =
1044+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1045+ Q_ASSERT(edgeDragArea != 0);
1046+ edgeDragArea->setRecognitionTimer(fakeTimer);
1047+ edgeDragArea->setTimeSource(fakeTimeSource);
1048+
1049+ // Disable some constraints we're not interested in
1050+ edgeDragArea->setMaxSilenceTime(60 * 1000);
1051+ edgeDragArea->setMinSpeed(0);
1052+
1053+ // And ensure others have the values we want
1054+ edgeDragArea->setCompositionTime(60);
1055+
1056+ // Make touches evenly spaced along the edgeDragArea
1057+ QPoint touch0Pos(edgeDragArea->width()/2.0f, m_view->height()*0.25f);
1058+ QPoint touch1Pos(edgeDragArea->width()/2.0f, m_view->height()*0.50f);
1059+ QPoint touch2Pos(edgeDragArea->width()/2.0f, m_view->height()*0.75f);
1060+
1061+ QTest::touchEvent(m_view, m_device)
1062+ .press(0, touch0Pos);
1063+
1064+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Undecided);
1065+
1066+ passTime(5);
1067+ QTest::touchEvent(m_view, m_device)
1068+ .move(0, touch0Pos)
1069+ .press(1, touch1Pos);
1070+
1071+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
1072+
1073+ passTime(5);
1074+ QTest::touchEvent(m_view, m_device)
1075+ .move(0, touch0Pos)
1076+ .move(1, touch1Pos)
1077+ .press(2, touch2Pos);
1078+
1079+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
1080+
1081+ passTime(10);
1082+ QTest::touchEvent(m_view, m_device)
1083+ .move(0, touch0Pos)
1084+ .move(1, touch1Pos)
1085+ .move(2, touch2Pos);
1086+
1087+ passTime(200);
1088+ QTest::touchEvent(m_view, m_device)
1089+ .move(0, touch0Pos)
1090+ .release(1, touch1Pos)
1091+ .move(2, touch2Pos);
1092+
1093+ passTime(10);
1094+ QTest::touchEvent(m_view, m_device)
1095+ .move(0, touch0Pos)
1096+ .release(2, touch2Pos);
1097+
1098+ passTime(5);
1099+ QTest::touchEvent(m_view, m_device)
1100+ .release(0, touch0Pos);
1101+
1102+ // Shouldn't be keepping info about touches that no longer exist or interest us
1103+ QVERIFY(edgeDragArea->m_activeTouches.isEmpty());
1104+}
1105+
1106+/*
1107+ If all the relevant gesture recognition constraints/parameters have been disabled,
1108+ it means that the gesture recognition itself has been disabled and DirectionalDragArea
1109+ will therefore work like a simple touch area, merely reporting touch movement.
1110+ */
1111+void tst_DirectionalDragArea::immediateRecognitionWhenConstraintsDisabled()
1112+{
1113+ DirectionalDragArea *edgeDragArea =
1114+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1115+ Q_ASSERT(edgeDragArea != 0);
1116+ edgeDragArea->setRecognitionTimer(fakeTimer);
1117+ edgeDragArea->setTimeSource(fakeTimeSource);
1118+
1119+ // Disable the minimum amount of constraints to ensure immediate recognition
1120+ edgeDragArea->setDistanceThreshold(0);
1121+ edgeDragArea->setCompositionTime(0);
1122+
1123+ // Put an item right behind edgeDragArea to receive the touches ignored by it
1124+ DummyItem *dummyItem = new DummyItem;
1125+ dummyItem->setParentItem(edgeDragArea->parentItem());
1126+ dummyItem->setX(edgeDragArea->x());
1127+ dummyItem->setY(edgeDragArea->y());
1128+ dummyItem->setZ(edgeDragArea->z() - 1.0);
1129+ dummyItem->setWidth(edgeDragArea->width());
1130+ dummyItem->setHeight(edgeDragArea->height());
1131+
1132+ QPoint touch0Pos(edgeDragArea->width()/2.0f, m_view->height()/2.0f);
1133+
1134+ QTest::touchEvent(m_view, m_device).press(0, touch0Pos);
1135+
1136+ // check for immediate recognition
1137+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Recognized);
1138+
1139+ // and therefore it should have immediately grabbed the touch point,
1140+ // not letting it leak to items behind him.
1141+ QCOMPARE(dummyItem->touchEvents.count(), 0);
1142+}
1143+
1144+void tst_DirectionalDragArea::withdrawTouchOwnershipCandidacyIfDisabledDuringRecognition()
1145+{
1146+ DirectionalDragArea *edgeDragArea =
1147+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1148+ Q_ASSERT(edgeDragArea != 0);
1149+ edgeDragArea->setRecognitionTimer(fakeTimer);
1150+ edgeDragArea->setTimeSource(fakeTimeSource);
1151+
1152+ QPointF touchPoint = calculateInitialTouchPos(edgeDragArea);
1153+
1154+ // Move less than the minimum needed for the drag gesture recognition
1155+ qreal desiredDragDistance = edgeDragArea->distanceThreshold()*0.5f;
1156+ QPointF dragDirectionVector(1., 0.); // horizontal positive
1157+
1158+ qreal movementStepDistance = edgeDragArea->distanceThreshold() * 0.1f;
1159+ QPointF touchMovement = dragDirectionVector * movementStepDistance;
1160+ int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
1161+ int movementTimeStepMs = (edgeDragArea->compositionTime() * 0.8f) / totalMovementSteps;
1162+
1163+ QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
1164+
1165+ for (int i = 0; i < totalMovementSteps; ++i) {
1166+ touchPoint += touchMovement;
1167+ passTime(movementTimeStepMs);
1168+ QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
1169+ }
1170+
1171+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Undecided);
1172+
1173+ // edgeDragArea should be an undecided candidate
1174+ {
1175+ auto touchInfo = touchRegistry->findTouchInfo(0);
1176+ QCOMPARE(touchInfo->candidates.size(), 1);
1177+ QCOMPARE(touchInfo->candidates.at(0).item.data(), edgeDragArea);
1178+ QCOMPARE(touchInfo->candidates.at(0).undecided, true);
1179+ }
1180+
1181+ // disable the dragArea while it's still recognizing a possible drag gesture.
1182+ QFETCH(bool, disable);
1183+ if (disable) {
1184+ edgeDragArea->setEnabled(false);
1185+ } else {
1186+ edgeDragArea->setVisible(false);
1187+ }
1188+
1189+ // edgeDragArea should no longer be a candidate
1190+ {
1191+ auto touchInfo = touchRegistry->findTouchInfo(0);
1192+ QCOMPARE(touchInfo->candidates.size(), 0);
1193+ }
1194+
1195+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
1196+
1197+ QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
1198+}
1199+
1200+void tst_DirectionalDragArea::withdrawTouchOwnershipCandidacyIfDisabledDuringRecognition_data()
1201+{
1202+ QTest::addColumn<bool>("disable");
1203+
1204+ QTest::newRow("disabled") << true;
1205+ QTest::newRow("invisible") << false;
1206+}
1207+
1208+void tst_DirectionalDragArea::tappedSignal()
1209+{
1210+ DirectionalDragArea *edgeDragArea =
1211+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1212+ QVERIFY(edgeDragArea != 0);
1213+ edgeDragArea->setRecognitionTimer(fakeTimer);
1214+ edgeDragArea->setTimeSource(fakeTimeSource);
1215+
1216+ QFETCH(bool, immediateGestureRecognition);
1217+ if (immediateGestureRecognition) {
1218+ // Disable the minimum amount of constraints to ensure immediate recognition
1219+ edgeDragArea->setDistanceThreshold(0);
1220+ edgeDragArea->setCompositionTime(0);
1221+ }
1222+
1223+ QPoint touch0Pos(edgeDragArea->width()/2.0f, m_view->height()/2.0f);
1224+
1225+ QSignalSpy tappedSpy(edgeDragArea, SIGNAL(tapped()));
1226+
1227+ QTest::touchEvent(m_view, m_device).press(0, touch0Pos);
1228+ passTime(edgeDragArea->maxTapDuration() / 2);
1229+ QTest::touchEvent(m_view, m_device).release(0, touch0Pos);
1230+
1231+ QCOMPARE(tappedSpy.count(), 1);
1232+}
1233+
1234+void tst_DirectionalDragArea::tappedSignal_data()
1235+{
1236+ QTest::addColumn<bool>("immediateGestureRecognition");
1237+
1238+ QTest::newRow("immediate gesture recognition") << true;
1239+ QTest::newRow("default gesture recognition") << false;
1240+}
1241+
1242+void tst_DirectionalDragArea::gettingTouchOwnershipMakesMouseAreaBehindGetCanceled()
1243+{
1244+ DirectionalDragArea *edgeDragArea =
1245+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1246+ QVERIFY(edgeDragArea != nullptr);
1247+ edgeDragArea->setRecognitionTimer(fakeTimer);
1248+ edgeDragArea->setTimeSource(fakeTimeSource);
1249+
1250+ QQuickMouseArea *mouseArea =
1251+ m_view->rootObject()->findChild<QQuickMouseArea*>("mouseArea");
1252+ QVERIFY(mouseArea != nullptr);
1253+
1254+ MouseAreaSpy mouseAreaSpy(mouseArea);
1255+
1256+ QPointF initialTouchPos = calculateInitialTouchPos(edgeDragArea);
1257+ QPointF touchPoint = initialTouchPos;
1258+
1259+ qreal desiredDragDistance = edgeDragArea->distanceThreshold()*2;
1260+ QPointF dragDirectionVector(1.0f, 0.0f); // rightwards
1261+ qreal movementStepDistance = edgeDragArea->distanceThreshold() * 0.1f;
1262+ QPointF touchMovement = dragDirectionVector * movementStepDistance;
1263+ int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
1264+ int movementTimeStepMs = (edgeDragArea->compositionTime() * 1.5f) / totalMovementSteps;
1265+
1266+ QCOMPARE(mouseArea->pressed(), false);
1267+
1268+ QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
1269+
1270+ // The TouchBegin passes through the DirectionalDragArea and reaches the MouseArea behind it,
1271+ // where it's converted to a MouseEvent by QQuickWindow and sent to the MouseArea which then
1272+ // accepts it. Making it get pressed.
1273+ QCOMPARE(mouseArea->pressed(), true);
1274+ QCOMPARE(mouseAreaSpy.canceledCount, 0);
1275+
1276+ for (int i = 0; i < totalMovementSteps; ++i) {
1277+ touchPoint += touchMovement;
1278+ passTime(movementTimeStepMs);
1279+ QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
1280+ }
1281+
1282+ // As the DirectionalDragArea recognizes the gesture, it grabs the touch from the MouseArea,
1283+ // which should make the MouseArea get a cancelation event, which will then cause it to
1284+ // reset its state (going back to "unpressed"/"released").
1285+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Recognized);
1286+ QCOMPARE(mouseArea->pressed(), false);
1287+ QCOMPARE(mouseAreaSpy.canceledCount, 1);
1288+
1289+ QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
1290+}
1291+
1292+////////////////////////// TouchMemento /////////////////////////////
1293+
1294+TouchMemento::TouchMemento(const QTouchEvent *touchEvent)
1295+ : touchPointStates(touchEvent->touchPointStates()), touchPoints(touchEvent->touchPoints())
1296+{
1297+
1298+}
1299+
1300+bool TouchMemento::containsTouchWithId(int touchId) const
1301+{
1302+ for (int i = 0; i < touchPoints.count(); ++i) {
1303+ if (touchPoints.at(i).id() == touchId) {
1304+ return true;
1305+ }
1306+ }
1307+ return false;
1308+}
1309+
1310+////////////////////////// DummyItem /////////////////////////////
1311+
1312+DummyItem::DummyItem(QQuickItem *parent)
1313+ : QQuickItem(parent)
1314+{
1315+ touchEventHandler = defaultTouchEventHandler;
1316+}
1317+
1318+void DummyItem::touchEvent(QTouchEvent *event)
1319+{
1320+ touchEvents.append(TouchMemento(event));
1321+ touchEventHandler(event);
1322+}
1323+
1324+void DummyItem::defaultTouchEventHandler(QTouchEvent *event)
1325+{
1326+ event->accept();
1327+}
1328+
8521329QTEST_MAIN(tst_DirectionalDragArea)
8531330
8541331#include "tst_DirectionalDragArea.moc"
tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.qml+1
@@ -24,6 +24,7 @@ Rectangle {
2424
2525 MouseArea {
2626 id: mouseArea
27+ objectName: "mouseArea"
2728 anchors.fill: parent
2829 onClicked: {
2930 hpLauncher.reset()
tests/plugins/Ubuntu/Gestures/tst_TouchGate.cppnew file+345
@@ -0,0 +1,345 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include <qpa/qwindowsysteminterface.h>
18+#include <QtTest>
19+#include <QQmlEngine>
20+#include <QQuickView>
21+#include <QSharedPointer>
22+
23+// C++ std lib
24+#include <functional>
25+
26+#include <TouchGate.h>
27+#include <TouchRegistry.h>
28+
29+class TestItem : public QQuickItem
30+{
31+ Q_OBJECT
32+
33+public:
34+ QList<QSharedPointer<QTouchEvent>> touchEventsReceived;
35+
36+protected:
37+ void touchEvent(QTouchEvent *event) override;
38+};
39+
40+class CandidateItem : public QQuickItem
41+{
42+ Q_OBJECT
43+
44+public:
45+ std::function<void(QTouchEvent*)> touchEventHandler;
46+
47+protected:
48+ void touchEvent(QTouchEvent *event) override;
49+};
50+
51+class tst_TouchGate : public QObject
52+{
53+ Q_OBJECT
54+public:
55+ tst_TouchGate(QObject *parent = nullptr);
56+private Q_SLOTS:
57+ void initTestCase(); // will be called before the first test function is executed
58+ void cleanupTestCase(); // will be called after the last test function was executed.
59+
60+ void init(); // called right before each and every test function is executed
61+ void cleanup(); // called right after each and every test function is executed
62+
63+ void onlyCandidate_passThrough();
64+ void holdsEventsUntilGainsOwnership();
65+ void holdsEventsUntilGainsOwnership_data();
66+ void holdsEventsUntilGainsOwnership_repeatingTouchId();
67+ void dontDispacthToDisabledOrInvisibleTarget();
68+ void dontDispacthToDisabledOrInvisibleTarget_data();
69+
70+private:
71+ QQuickView *createView();
72+ TouchRegistry *touchRegistry;
73+ QQuickView *view;
74+ QTouchDevice *device;
75+};
76+
77+tst_TouchGate::tst_TouchGate(QObject *parent)
78+ : QObject(parent)
79+ , touchRegistry(nullptr)
80+ , view(nullptr)
81+ , device(nullptr)
82+{
83+}
84+
85+void tst_TouchGate::initTestCase()
86+{
87+ if (!device) {
88+ device = new QTouchDevice;
89+ device->setType(QTouchDevice::TouchScreen);
90+ QWindowSystemInterface::registerTouchDevice(device);
91+ }
92+}
93+
94+void tst_TouchGate::cleanupTestCase()
95+{
96+}
97+
98+void tst_TouchGate::init()
99+{
100+ touchRegistry = new TouchRegistry;
101+
102+ view = createView();
103+ view->installEventFilter(touchRegistry);
104+ view->setSource(QUrl::fromLocalFile("touchGateExample.qml"));
105+ view->show();
106+ QVERIFY(QTest::qWaitForWindowExposed(view));
107+ QVERIFY(view->rootObject() != 0);
108+ qApp->processEvents();
109+}
110+
111+void tst_TouchGate::cleanup()
112+{
113+ delete view;
114+ view = 0;
115+
116+ delete touchRegistry;
117+ touchRegistry = nullptr;
118+}
119+
120+QQuickView *tst_TouchGate::createView()
121+{
122+ QQuickView *window = new QQuickView(0);
123+ window->setResizeMode(QQuickView::SizeRootObjectToView);
124+ window->resize(720, 720);
125+ window->engine()->addImportPath(QLatin1String(UBUNTU_GESTURES_PLUGIN_DIR));
126+
127+ return window;
128+}
129+
130+/*
131+ Simplest case. TouchGate is the only candidate for the touch point, thus it
132+ will instantly gain ownership causing the event to pass through it directly to
133+ its child.
134+ */
135+void tst_TouchGate::onlyCandidate_passThrough()
136+{
137+ TouchGate *touchGate = view->rootObject()->findChild<TouchGate*>("touchGate");
138+ Q_ASSERT(touchGate);
139+
140+ TestItem *testItem = new TestItem;
141+ testItem->setWidth(touchGate->width());
142+ testItem->setHeight(touchGate->height());
143+ testItem->setParentItem(view->rootObject());
144+ testItem->setZ(0.0);
145+
146+ touchGate->setZ(1.0);
147+ touchGate->setTargetItem(testItem);
148+
149+ QTest::touchEvent(view, device)
150+ .press(0, QPoint(100,100));
151+
152+ QCOMPARE(testItem->touchEventsReceived.count(), 1);
153+ QVERIFY(touchGate->m_storedEvents.isEmpty());
154+}
155+
156+void tst_TouchGate::holdsEventsUntilGainsOwnership()
157+{
158+ TouchGate *touchGate = view->rootObject()->findChild<TouchGate*>("touchGate");
159+ Q_ASSERT(touchGate);
160+ QFETCH(bool, ownershipAfterTouchEnd);
161+
162+ TestItem *testItem = new TestItem;
163+ testItem->setWidth(touchGate->width());
164+ testItem->setHeight(touchGate->height());
165+ testItem->setParentItem(view->rootObject());
166+ testItem->setZ(0.0);
167+
168+ touchGate->setZ(1.0);
169+ touchGate->setTargetItem(testItem);
170+
171+ // Put it in front of touchGate
172+ CandidateItem *candidateItem = new CandidateItem;
173+ candidateItem->setWidth(touchGate->width());
174+ candidateItem->setHeight(touchGate->height());
175+ candidateItem->setParentItem(view->rootObject());
176+ candidateItem->setZ(2.0);
177+
178+ candidateItem->touchEventHandler = [&](QTouchEvent* event) {
179+ touchRegistry->addCandidateOwnerForTouch(0, candidateItem);
180+ event->ignore();
181+ };
182+
183+ QTest::touchEvent(view, device)
184+ .press(0, QPoint(100,100));
185+
186+ QCOMPARE(testItem->touchEventsReceived.count(), 0);
187+
188+ QTest::touchEvent(view, device)
189+ .move(0, QPoint(101,101));
190+
191+ QCOMPARE(testItem->touchEventsReceived.count(), 0);
192+
193+ if (!ownershipAfterTouchEnd) {
194+ touchRegistry->removeCandidateOwnerForTouch(0, candidateItem);
195+ // TouchGate should now open its flood gates and let testItem get all
196+ // events from touch 0 produced so far
197+ QCOMPARE(testItem->touchEventsReceived.count(), 2);
198+ }
199+
200+ QTest::touchEvent(view, device)
201+ .release(0, QPoint(101,101));
202+
203+ if (ownershipAfterTouchEnd) {
204+ QCOMPARE(testItem->touchEventsReceived.count(), 0);
205+ touchRegistry->removeCandidateOwnerForTouch(0, candidateItem);
206+ // TouchGate should now open its flood gates and let testItem get all
207+ // events from touch 0 produced so far
208+ }
209+
210+ QCOMPARE(testItem->touchEventsReceived.count(), 3);
211+
212+ QVERIFY(touchGate->m_storedEvents.isEmpty());
213+ QVERIFY(touchGate->m_touchInfoMap.isEmpty());
214+}
215+
216+void tst_TouchGate::holdsEventsUntilGainsOwnership_data()
217+{
218+ QTest::addColumn<bool>("ownershipAfterTouchEnd");
219+
220+ QTest::newRow("touch end after touch ownership") << false;
221+ QTest::newRow("touch ownership after touch end") << true;
222+}
223+
224+/*
225+ A touch point of id 0 starts and ends. Then the next touch point is also given
226+ id 0. Check that TouchGate behaves correcly recognizing them as two distinct touch
227+ points.
228+
229+ Note that this won't be a problem with Mir as it assigns unique ids for the touch
230+ points it produces.
231+ */
232+void tst_TouchGate::holdsEventsUntilGainsOwnership_repeatingTouchId()
233+{
234+ TouchGate *touchGate = view->rootObject()->findChild<TouchGate*>("touchGate");
235+ Q_ASSERT(touchGate);
236+
237+ TestItem *testItem = new TestItem;
238+ testItem->setWidth(touchGate->width());
239+ testItem->setHeight(touchGate->height());
240+ testItem->setParentItem(view->rootObject());
241+ testItem->setZ(0.0);
242+
243+ touchGate->setZ(1.0);
244+ touchGate->setTargetItem(testItem);
245+
246+ QTest::touchEvent(view, device)
247+ .press(0, QPoint(100,100));
248+ QTest::touchEvent(view, device)
249+ .move(0, QPoint(101,101));
250+ QTest::touchEvent(view, device)
251+ .release(0, QPoint(101,101));
252+
253+ QCOMPARE(testItem->touchEventsReceived.count(), 3);
254+ testItem->touchEventsReceived.clear();
255+
256+ // Put it in front of touchGate
257+ CandidateItem *candidateItem = new CandidateItem;
258+ candidateItem->setWidth(touchGate->width());
259+ candidateItem->setHeight(touchGate->height());
260+ candidateItem->setParentItem(view->rootObject());
261+ candidateItem->setZ(2.0);
262+
263+ candidateItem->touchEventHandler = [&](QTouchEvent* event) {
264+ touchRegistry->addCandidateOwnerForTouch(0, candidateItem);
265+ event->ignore();
266+ };
267+
268+ // A brand new touch, but with the same id as the previous one
269+ QTest::touchEvent(view, device)
270+ .press(0, QPoint(200,200));
271+ QTest::touchEvent(view, device)
272+ .move(0, QPoint(201,201));
273+ QTest::touchEvent(view, device)
274+ .release(0, QPoint(201,201));
275+
276+ QCOMPARE(testItem->touchEventsReceived.count(), 0);
277+
278+ touchRegistry->requestTouchOwnership(0, candidateItem);
279+
280+ QCOMPARE(testItem->touchEventsReceived.count(), 0);
281+
282+ QVERIFY(touchGate->m_storedEvents.isEmpty());
283+}
284+
285+void tst_TouchGate::dontDispacthToDisabledOrInvisibleTarget()
286+{
287+ TouchGate *touchGate = view->rootObject()->findChild<TouchGate*>("touchGate");
288+ Q_ASSERT(touchGate);
289+
290+ TestItem *testItem = new TestItem;
291+ testItem->setWidth(touchGate->width());
292+ testItem->setHeight(touchGate->height());
293+ testItem->setParentItem(view->rootObject());
294+ testItem->setZ(0.0);
295+
296+ QFETCH(bool, isEnabled);
297+ testItem->setEnabled(isEnabled);
298+
299+ QFETCH(bool, isVisible);
300+ testItem->setVisible(isVisible);
301+
302+ touchGate->setZ(1.0);
303+ touchGate->setTargetItem(testItem);
304+
305+ QTest::touchEvent(view, device)
306+ .press(0, QPoint(100,100));
307+
308+ QCOMPARE(testItem->touchEventsReceived.count(), 0);
309+ QVERIFY(touchGate->m_storedEvents.isEmpty());
310+}
311+
312+void tst_TouchGate::dontDispacthToDisabledOrInvisibleTarget_data()
313+{
314+ QTest::addColumn<bool>("isEnabled");
315+ QTest::addColumn<bool>("isVisible");
316+
317+ QTest::newRow("disabled visible") << false << true;
318+ QTest::newRow("enabled invisible") << true << false;
319+ QTest::newRow("disabled invisible") << false << false;
320+}
321+
322+///////////// TestItem /////////////////////////////////////////////////////////////
323+
324+void TestItem::touchEvent(QTouchEvent *event)
325+{
326+ QTouchEvent *clonedEvent = new QTouchEvent(event->type(),
327+ event->device(),
328+ event->modifiers(),
329+ event->touchPointStates(),
330+ event->touchPoints());
331+
332+ touchEventsReceived.append(QSharedPointer<QTouchEvent>(clonedEvent));
333+}
334+
335+///////////// CandidateItem /////////////////////////////////////////////////////////////
336+
337+void CandidateItem::touchEvent(QTouchEvent *event)
338+{
339+ touchEventHandler(event);
340+}
341+
342+
343+QTEST_MAIN(tst_TouchGate)
344+
345+#include "tst_TouchGate.moc"
tests/qmltests/CMakeLists.txt+1
@@ -21,6 +21,7 @@ set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C")
2121
2222add_qml_test(. Shell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
2323add_qml_test(. ShellWithPin ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single-pin")
24+add_qml_test(. TabletShell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
2425add_qml_test(Components Background)
2526add_qml_test(Components Carousel)
2627add_qml_test(Components DraggingArea)
tests/qmltests/Components/CMakeLists.txt+2−1
@@ -2,13 +2,14 @@
22
33include_directories(
44 ${CMAKE_SOURCE_DIR}/plugins/Ubuntu/Gestures
5+ ${CMAKE_SOURCE_DIR}/libs/UbuntuGestures
56 ${CMAKE_CURRENT_BINARY_DIR}
67 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
78 )
89
910add_executable(DragHandleTestExec tst_DragHandle.cpp)
1011qt5_use_modules(DragHandleTestExec Test Core Qml Gui Quick)
11−target_link_libraries(DragHandleTestExec UbuntuGestureQml)
12+target_link_libraries(DragHandleTestExec UbuntuGesturesQml UbuntuGestures)
1213
1314add_binary_qml_test(DragHandle ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures "" "")
1415add_manual_qml_test(. DragHandle IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
tests/qmltests/Components/tst_DragHandle.cpp+12−15
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -22,22 +22,12 @@
2222#include <QtQml/QQmlEngine>
2323
2424#include <DirectionalDragArea.h>
25+#include <Timer.h>
26+#include <TouchRegistry.h>
2527
26−class FakeTimer : public UbuntuGestures::AbstractTimer
27−{
28− Q_OBJECT
29−public:
30− FakeTimer(QObject *parent = 0)
31− : UbuntuGestures::AbstractTimer(parent)
32− {}
33−
34− virtual int interval() const { return m_duration; }
35− virtual void setInterval(int msecs) { m_duration = msecs; }
36−private:
37− int m_duration;
38−};
28+using namespace UbuntuGestures;
3929
40−class FakeTimeSource : public UbuntuGestures::TimeSource
30+class FakeTimeSource : public TimeSource
4131{
4232public:
4333 FakeTimeSource() { m_msecsSinceReference = 0; }
@@ -77,6 +67,7 @@ private:
7767
7868 QQuickView *createView();
7969 QQuickView *m_view;
70+ TouchRegistry *m_touchRegistry;
8071 QTouchDevice *m_device;
8172 FakeTimer *m_fakeTimer;
8273 QSharedPointer<FakeTimeSource> m_fakeTimeSource;
@@ -100,7 +91,10 @@ void tst_DragHandle::cleanupTestCase()
10091
10192void tst_DragHandle::init()
10293{
94+ m_touchRegistry = new TouchRegistry;
95+
10396 m_view = createView();
97+ m_view->installEventFilter(m_touchRegistry);
10498 m_view->setSource(QUrl::fromLocalFile(TEST_DIR"/tst_DragHandle.qml"));
10599 m_view->show();
106100 QVERIFY(QTest::qWaitForWindowExposed(m_view));
@@ -116,6 +110,9 @@ void tst_DragHandle::cleanup()
116110 delete m_view;
117111 m_view = 0;
118112
113+ delete m_touchRegistry;
114+ m_touchRegistry = 0;
115+
119116 delete m_fakeTimer;
120117 m_fakeTimer = 0;
121118
tests/qmltests/Greeter/tst_MultiGreeter.qml+2−2
@@ -29,6 +29,7 @@ Item {
2929 Greeter {
3030 id: greeter
3131 anchors.fill: parent
32+ locked: !LightDM.Greeter.authenticated
3233 }
3334
3435 Component {
@@ -115,8 +116,7 @@ Item {
115116 var waitForSignal = data.uid != 0 && userList.currentIndex != data.uid
116117 select_index(data.uid)
117118 tryCompare(userList, "currentIndex", data.uid)
118− tryCompare(greeter, "locked", data.tag !== "no-password" &&
119− data.tag !== "auth-error")
119+ tryCompare(greeter, "locked", data.tag !== "no-password")
120120 if (waitForSignal) {
121121 selectionSpy.wait()
122122 tryCompare(selectionSpy, "count", 1)
tests/qmltests/Greeter/tst_SingleGreeter.qml+1−1
@@ -87,7 +87,7 @@ Item {
8787
8888 function test_teasingArea(data) {
8989 teaseSpy.clear()
90− mouseClick(greeter, data.posX, greeter.height - units.gu(1))
90+ tap(greeter, data.posX, greeter.height - units.gu(1))
9191 teaseSpy.wait()
9292 tryCompare(teaseSpy, "count", 1)
9393 }
tests/qmltests/Launcher/tst_Launcher.qml+117−101
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2013 Canonical Ltd.
2+ * Copyright 2013-2014 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -28,25 +28,49 @@ Item {
2828 width: units.gu(50)
2929 height: units.gu(55)
3030
31− Launcher {
32− id: launcher
33− x: 0
34− y: 0
35− width: units.gu(40)
36− height: parent.height
31+ Loader {
32+ id: launcherLoader
33+ anchors.fill: parent
34+ property bool itemDestroyed: false
35+ sourceComponent: Component {
36+ Launcher {
37+ id: launcher
38+ x: 0
39+ y: 0
40+ width: units.gu(40)
41+ height: root.height
42+
43+ property string lastSelectedApplication
44+
45+ onLauncherApplicationSelected: {
46+ lastSelectedApplication = appId
47+ }
3748
38− property string lastSelectedApplication
49+ property int showDashHome_count: 0
50+ onShowDashHome: {
51+ showDashHome_count++;
52+ }
3953
40− onLauncherApplicationSelected: {
41− lastSelectedApplication = appId
42− }
54+ property int maxPanelX: 0
4355
44− property int showDashHome_count: 0
45− onShowDashHome: {
46− showDashHome_count++;
47− }
56+ Connections {
57+ target: testCase.findChild(launcher, "launcherPanel")
58+
59+ onXChanged: {
60+ if (target.x > launcher.maxPanelX) {
61+ launcher.maxPanelX = target.x;
62+ }
63+ }
64+ }
4865
49− property int maxPanelX: 0
66+ Component.onCompleted: {
67+ launcherLoader.itemDestroyed = false;
68+ }
69+ Component.onDestruction: {
70+ launcherLoader.itemDestroyed = true;
71+ }
72+ }
73+ }
5074 }
5175
5276 SignalSpy {
@@ -54,19 +78,45 @@ Item {
5478 target: LauncherModel
5579 }
5680
57− Connections {
58− target: testCase.findChild(launcher, "launcherPanel")
81+ UT.UnityTestCase {
82+ id: testCase
83+ name: "Launcher"
84+ when: windowShown
5985
60− onXChanged: {
61− if (target.x > launcher.maxPanelX) {
62− launcher.maxPanelX = target.x;
63− }
86+ property Item launcher: launcherLoader.status === Loader.Ready ? launcherLoader.item : null
87+ function cleanup() {
88+ launcherLoader.active = false;
89+ // Loader.status might be Loader.Null and Loader.item might be null but the Loader
90+ // item might still be alive. So if we set Loader.active back to true
91+ // again right now we will get the very same Shell instance back. So no reload
92+ // actually took place. Likely because Loader waits until the next event loop
93+ // iteration to do its work. So to ensure the reload, we will wait until the
94+ // Shell instance gets destroyed.
95+ tryCompare(launcherLoader, "itemDestroyed", true);
96+ launcherLoader.active = true;
6497 }
65− }
98+ function init() {
99+ var listView = findChild(launcher, "launcherListView");
100+ // wait for it to settle before doing the flick. Otherwise the flick
101+ // might fail.
102+ // On startup that listView is already moving. maybe because of its contents
103+ // growing while populating it with icons etc.
104+ tryCompare(listView, "flicking", false);
66105
67− UT.UnityTestCase {
68− id: revealer
69− when: windowShown
106+ // Make sure noone changed the height of the window. The issue this test case
107+ // is verifying only happens on certain heights of the Launcher
108+ compare(root.height, units.gu(55));
109+
110+ compare(listView.contentY, -listView.topMargin, "Launcher did not start up with first item unfolded");
111+
112+ // Now do check that snapping is in fact enabled
113+ compare(listView.snapMode, ListView.SnapToItem, "Snapping is not enabled");
114+
115+ // Tests can be run in a reaaaaally slow environment or machine. Thus ensure
116+ // the dismissTimer doesn't time out inadvertently.
117+ var dismissTimer = findInvisibleChild(launcher, "dismissTimer");
118+ dismissTimer.interval = 60 * 60 * 1000; // one hour
119+ }
70120
71121 function dragLauncherIntoView() {
72122 var startX = launcher.dragAreaWidth/2;
@@ -87,22 +137,11 @@ Item {
87137 var panel = findChild(launcher, "launcherPanel");
88138 tryCompare(panel, "x", -panel.width, 1000);
89139 }
90− }
91−
92− UT.UnityTestCase {
93− id: testCase
94− name: "Launcher"
95− when: windowShown && initTestCase.completed
96−
97− function cleanup() {
98− mouseClick(root, root.width / 2, root.height / 2);
99− revealer.waitUntilLauncherDisappears();
100− }
101140
102141 // Drag from the left edge of the screen rightwards and check that the launcher
103142 // appears (as if being dragged by the finger/pointer)
104143 function test_dragLeftEdgeToRevealLauncherAndTapCenterToDismiss() {
105− revealer.waitUntilLauncherDisappears();
144+ waitUntilLauncherDisappears();
106145
107146 var panel = findChild(launcher, "launcherPanel")
108147 verify(panel != undefined)
@@ -110,7 +149,7 @@ Item {
110149 // it starts out hidden just left of the left launcher edge
111150 compare(panel.x, -panel.width)
112151
113− revealer.dragLauncherIntoView()
152+ dragLauncherIntoView()
114153
115154 // tapping on the center of the screen should dismiss the launcher
116155 mouseClick(launcher, launcher.width/2, launcher.height/2)
@@ -124,7 +163,7 @@ Item {
124163 corresponding desktop file. E.g. clicking on phone icon should yield
125164 launcherApplicationSelected("[...]dialer-app.desktop") */
126165 function test_clickingOnAppIconCausesSignalEmission() {
127− revealer.dragLauncherIntoView();
166+ dragLauncherIntoView();
128167 launcher.lastSelectedApplication = ""
129168
130169 var listView = findChild(launcher, "launcherListView");
@@ -140,7 +179,7 @@ Item {
140179 "dialer-app")
141180
142181 // Tapping on an application icon also dismisses the launcher
143− revealer.waitUntilLauncherDisappears()
182+ waitUntilLauncherDisappears()
144183 }
145184
146185 /* If I click on the dash icon on the launcher
@@ -148,7 +187,7 @@ Item {
148187 function test_clickingOnDashIconCausesSignalEmission() {
149188 launcher.showDashHome_count = 0
150189
151− revealer.dragLauncherIntoView()
190+ dragLauncherIntoView()
152191
153192 var dashIcon = findChild(launcher, "dashItem")
154193 verify(dashIcon != undefined)
@@ -158,7 +197,7 @@ Item {
158197 tryCompare(launcher, "showDashHome_count", 1)
159198
160199 // Tapping on the dash icon also dismisses the launcher
161− revealer.waitUntilLauncherDisappears()
200+ waitUntilLauncherDisappears()
162201 }
163202
164203 function test_teaseLauncher_data() {
@@ -185,12 +224,12 @@ Item {
185224 wait(100)
186225 compare(launcher.maxPanelX, -launcher.panelWidth, "Launcher moved even if it shouldn't")
187226 }
188− revealer.waitUntilLauncherDisappears();
227+ waitUntilLauncherDisappears();
189228 launcher.available = true;
190229 }
191230
192231 function test_countEmblems() {
193− revealer.dragLauncherIntoView();
232+ dragLauncherIntoView();
194233 var launcherListView = findChild(launcher, "launcherListView");
195234 for (var i = 0; i < launcherListView.count; ++i) {
196235 var delegate = findChild(launcherListView, "launcherDelegate" + i)
@@ -201,7 +240,7 @@ Item {
201240 }
202241
203242 function test_progressOverlays() {
204− revealer.dragLauncherIntoView();
243+ dragLauncherIntoView();
205244 var launcherListView = findChild(launcher, "launcherListView");
206245 for (var i = 0; i < launcherListView.count; ++i) {
207246 var delegate = findChild(launcherListView, "launcherDelegate" + i)
@@ -210,35 +249,49 @@ Item {
210249 }
211250
212251 function test_focusedHighlight() {
213− revealer.dragLauncherIntoView();
252+ dragLauncherIntoView();
214253 var launcherListView = findChild(launcher, "launcherListView");
215254 for (var i = 0; i < launcherListView.count; ++i) {
216255 var delegate = findChild(launcherListView, "launcherDelegate" + i)
217256 compare(findChild(delegate, "focusedHighlight").visible, LauncherModel.get(i).focused)
218257 }
219258 }
220− }
221−
222− UT.UnityTestCase {
223− id: clickFlickTestCase
224− when: windowShown && testCase.completed
225259
226260 function test_clickFlick_data() {
227261 var listView = findChild(launcher, "launcherListView");
228262 return [
229− {tag: "unfolded top", flickSpeed: units.gu(200), clickY: listView.topMargin + units.gu(2), expectFlick: false},
230− {tag: "folded top", flickSpeed: -units.gu(200), clickY: listView.topMargin + units.gu(2), expectFlick: true},
231− {tag: "unfolded bottom", flickSpeed: -units.gu(200), clickY: listView.height - listView.topMargin - units.gu(1), expectFlick: false},
232− {tag: "folded bottom", flickSpeed: units.gu(200), clickY: listView.height - listView.topMargin - units.gu(1), expectFlick: true},
263+ {tag: "unfolded top", positionViewAtBeginning: false,
264+ clickY: listView.topMargin + units.gu(2),
265+ expectFlick: false},
266+
267+ {tag: "folded top", positionViewAtBeginning: true,
268+ clickY: listView.topMargin + units.gu(2),
269+ expectFlick: true},
270+
271+ {tag: "unfolded bottom", positionViewAtBeginning: true,
272+ clickY: listView.height - listView.topMargin - units.gu(1),
273+ expectFlick: false},
274+
275+ {tag: "folded bottom", positionViewAtBeginning: false,
276+ clickY: listView.height - listView.topMargin - units.gu(1),
277+ expectFlick: true},
233278 ];
234279 }
235280
236281 function test_clickFlick(data) {
237282 launcher.lastSelectedApplication = "";
238− revealer.dragLauncherIntoView();
283+ dragLauncherIntoView();
239284 var listView = findChild(launcher, "launcherListView");
240285
241− listView.flick(0, data.flickSpeed);
286+ // flicking is unreliable. sometimes it works, sometimes the
287+ // list view moves just a tiny bit or not at all, making tests fail.
288+ // So for stability's sake we just put the listView in the position
289+ // we want to to actually start doing what this tests intends to check.
290+ if (data.positionViewAtBeginning) {
291+ listView.positionViewAtBeginning();
292+ } else {
293+ listView.positionViewAtEnd();
294+ }
242295 tryCompare(listView, "flicking", false);
243296
244297 var oldY = listView.contentY;
@@ -253,44 +306,7 @@ Item {
253306 verify(launcher.lastSelectedApplication != "");
254307 compare(listView.contentY, oldY, "Launcher was flicked even though it should only launch an app");
255308 }
256−
257− // Restore position on top
258− listView.flick(0, units.gu(200));
259− tryCompare(listView, "flicking", false)
260− // Click somewhere in the empty space to make it hide in case it isn't
261− mouseClick(launcher, launcher.width - units.gu(1), units.gu(1));
262− revealer.waitUntilLauncherDisappears();
263309 }
264− }
265−
266− UT.UnityTestCase {
267− id: initTestCase
268− name: "LauncherInit"
269− when: windowShown
270−
271− function initTestCase() {
272− var listView = findChild(launcher, "launcherListView");
273− tryCompare(listView, "flicking", false)
274− }
275−
276− function test_initFirstUnfolded() {
277−
278− // Make sure noone changed the height of the window. The issue this test case
279− // is verifying only happens on certain heights of the Launcher
280− compare(root.height, units.gu(55));
281−
282− var listView = findChild(launcher, "launcherListView");
283− compare(listView.contentY, -listView.topMargin, "Launcher did not start up with first item unfolded");
284−
285− // Now do check that snapping is in fact enabled
286− compare(listView.snapMode, ListView.SnapToItem, "Snapping is not enabled");
287− }
288− }
289−
290− UT.UnityTestCase {
291− id: dndTestCase
292− name: "Drag and Drop"
293− when: windowShown && initTestCase.completed
294310
295311 function test_dragndrop_data() {
296312 return [
@@ -301,7 +317,7 @@ Item {
301317 }
302318
303319 function test_dragndrop(data) {
304− revealer.dragLauncherIntoView();
320+ dragLauncherIntoView();
305321 var draggedItem = findChild(launcher, "launcherDelegate4")
306322 var item0 = findChild(launcher, "launcherDelegate0")
307323 var fakeDragItem = findChild(launcher, "fakeDragItem")
@@ -366,11 +382,11 @@ Item {
366382
367383 // Click somewhere in the empty space to make it hide in case it isn't
368384 mouseClick(launcher, launcher.width - units.gu(1), units.gu(1));
369− revealer.waitUntilLauncherDisappears();
385+ waitUntilLauncherDisappears();
370386 }
371387
372388 function test_quicklist_dismiss() {
373− revealer.dragLauncherIntoView();
389+ dragLauncherIntoView();
374390 var draggedItem = findChild(launcher, "launcherDelegate5")
375391 var item0 = findChild(launcher, "launcherDelegate0")
376392 var fakeDragItem = findChild(launcher, "fakeDragItem")
@@ -401,7 +417,7 @@ Item {
401417 }
402418
403419 function test_quicklist_positioning(data) {
404− revealer.dragLauncherIntoView();
420+ dragLauncherIntoView();
405421 var quickList = findChild(launcher, "quickList")
406422 var draggedItem = findChild(launcher, "launcherDelegate" + data.itemIndex)
407423 var quickListShape = findChild(launcher, "quickListShape")
@@ -428,7 +444,7 @@ Item {
428444
429445 // Click somewhere in the empty space to dismiss the launcher
430446 mouseClick(launcher, launcher.width - units.gu(1), units.gu(1));
431− revealer.waitUntilLauncherDisappears()
447+ waitUntilLauncherDisappears()
432448 }
433449
434450 function test_quicklist_click_data() {
@@ -439,7 +455,7 @@ Item {
439455 }
440456
441457 function test_quicklist_click(data) {
442− revealer.dragLauncherIntoView();
458+ dragLauncherIntoView();
443459 var clickedItem = findChild(launcher, "launcherDelegate5")
444460 var quickList = findChild(launcher, "quickList")
445461 var quickListShape = findChild(launcher, "quickListShape")
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+24
@@ -37,6 +37,11 @@ Item {
3737 property int modelIndex: 0
3838 property var data
3939
40+ anchors {
41+ left: parent.left
42+ right: parent.right
43+ }
44+
4045 onLoaded: {
4146 if (item.hasOwnProperty("menuData")) {
4247 item.menuData = data;
@@ -734,5 +739,24 @@ Item {
734739 compare(loader.item.canGoPrevious, false, "CanGoPrevious should be false");
735740 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
736741 }
742+
743+ function test_lp1336715_broken_checkbox_bindings() {
744+ menuData.type = "com.canonical.indicator.switch";
745+ menuData.sensitive = true;
746+ menuData.isToggled = false;
747+
748+ loader.data = menuData;
749+ loader.sourceComponent = factory.load(menuData);
750+
751+ compare(loader.item.checked, false, "Loader did not load check state");
752+ mouseClick(loader.item,
753+ loader.item.width / 2, loader.item.height / 2);
754+ compare(loader.item.checked, true, "Clicking switch menu should toggle check");
755+
756+ menuData.isToggled = true; // toggled will not update in mock
757+ menuData.isToggled = false;
758+
759+ compare(loader.item.checked, false, "Server updates no longer working");
760+ }
737761 }
738762}
tests/qmltests/Stages/tst_ApplicationWindow.qml+2−2
@@ -51,6 +51,7 @@ Rectangle {
5151 anchors.fill: parent
5252 application: fakeApplication
5353 orientation: Qt.PortraitOrientation
54+ interactive: true
5455 }
5556 }
5657 Loader {
@@ -375,8 +376,7 @@ Rectangle {
375376
376377 waitUntilTransitionsEnd();
377378
378− // Because doing stuff in C++ is a PITA we keep the counter in the interal qml impl.
379− var fakeSurface = findChild(fakeSession.surface, "fakeSurfaceQML");
379+ var fakeSurface = fakeSession.surface;
380380 fakeSurface.touchPressCount = 0;
381381 fakeSurface.touchReleaseCount = 0;
382382
tests/qmltests/Stages/tst_PhoneStage.qml+19−1
@@ -178,7 +178,8 @@ Item {
178178 var startX = phoneStage.width - 2;
179179 var startY = phoneStage.height / 2;
180180 var endY = startY;
181− var endX = spreadView.width - (spreadView.width * spreadView[data.positionMarker]) - data.offset;
181+ var endX = spreadView.width - (spreadView.width * spreadView[data.positionMarker]) - data.offset
182+ - phoneStage.dragAreaWidth;
182183
183184 var oldFocusedApp = ApplicationManager.get(0);
184185 var newFocusedApp = ApplicationManager.get(data.newFocusedIndex);
@@ -322,5 +323,22 @@ Item {
322323 }
323324 phoneStage.orientation = Qt.PortraitOrientation;
324325 }
326+
327+ function test_focusNewTopMostAppAfterFocusedOneClosesItself() {
328+ addApps(2);
329+
330+ var secondApp = ApplicationManager.get(0);
331+ tryCompare(secondApp, "state", ApplicationInfoInterface.Running);
332+ tryCompare(secondApp, "focused", true);
333+
334+ var firstApp = ApplicationManager.get(1);
335+ tryCompare(firstApp, "state", ApplicationInfoInterface.Suspended);
336+ tryCompare(firstApp, "focused", false);
337+
338+ ApplicationManager.stopApplication(secondApp.appId);
339+
340+ tryCompare(firstApp, "state", ApplicationInfoInterface.Running);
341+ tryCompare(firstApp, "focused", true);
342+ }
325343 }
326344}
tests/qmltests/Stages/tst_SurfaceContainer.qml+26−1
@@ -99,6 +99,9 @@ Rectangle {
9999 name: "SurfaceContainer"
100100 when: windowShown
101101
102+ property var surfaceContainer:
103+ surfaceContainerLoader.status === Loader.Ready ? surfaceContainerLoader.item : null
104+
102105 function cleanup() {
103106 // reload our test subject to get it in a fresh state once again
104107 surfaceContainerLoader.active = false;
@@ -126,7 +129,6 @@ Rectangle {
126129
127130 function test_animateRemoval() {
128131 surfaceCheckbox.checked = true;
129− var surfaceContainer = surfaceContainerLoader.item;
130132
131133 verify(surfaceContainer.surface !== null);
132134
@@ -135,5 +137,28 @@ Rectangle {
135137 compare(surfaceContainer.state, "zombie");
136138 tryCompare(surfaceContainer, "surface", null);
137139 }
140+
141+ function test_surfaceGetsNoTouchesWhenContainerNotInteractive() {
142+ surfaceCheckbox.checked = true;
143+ verify(surfaceContainer.surface !== null);
144+
145+ surfaceContainer.surface.touchPressCount = 0;
146+ surfaceContainer.surface.touchReleaseCount = 0;
147+
148+ surfaceContainer.interactive = true;
149+ tap(surfaceContainer, surfaceContainer.width / 2, surfaceContainer.height / 2);
150+
151+ // surface got touches as the surfaceContainer is interactive
152+ compare(surfaceContainer.surface.touchPressCount, 1)
153+ compare(surfaceContainer.surface.touchReleaseCount, 1);
154+
155+ surfaceContainer.interactive = false;
156+ tap(surfaceContainer, surfaceContainer.width / 2, surfaceContainer.height / 2);
157+
158+ // surface shouldn't get the touches from the second tap as the surfaceContainer
159+ // was *not* interactive when it happened.
160+ compare(surfaceContainer.surface.touchPressCount, 1)
161+ compare(surfaceContainer.surface.touchReleaseCount, 1);
162+ }
138163 }
139164}
tests/qmltests/tst_Shell.qml+119−3
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
33 *
44 * Authors:
55 * Daniel d'Andrada <daniel.dandrada@canonical.com>
@@ -98,6 +98,11 @@ Row {
9898 }
9999 }
100100
101+ SignalSpy {
102+ id: launcherShowDashHomeSpy
103+ signalName: "showDashHome"
104+ }
105+
101106 SignalSpy {
102107 id: sessionSpy
103108 signalName: "sessionStarted"
@@ -131,9 +136,14 @@ Row {
131136
132137 sessionSpy.target = findChild(shell, "greeter")
133138 dashCommunicatorSpy.target = findInvisibleChild(shell, "dashCommunicator");
139+
140+ var launcher = findChild(shell, "launcher");
141+ launcherShowDashHomeSpy.target = launcher;
134142 }
135143
136144 function cleanup() {
145+ launcherShowDashHomeSpy.target = null;
146+
137147 shellLoader.itemDestroyed = false;
138148
139149 shellLoader.active = false;
@@ -404,8 +414,7 @@ Row {
404414 touchFlick(launcherPanel, touchStartX, touchStartY, touchStartX, 0);
405415 tryCompare(launcherPanel, "moving", false);
406416
407− // NB tapping (i.e., using touch events) doesn't activate the icon... go figure...
408− mouseClick(appIcon, appIcon.width / 2, appIcon.height / 2);
417+ tap(appIcon, appIcon.width / 2, appIcon.height / 2);
409418 }
410419
411420 function showIndicators() {
@@ -484,6 +493,7 @@ Row {
484493 tryCompare(greeter, "showProgress", 0)
485494 waitForRendering(greeter);
486495 LightDM.Greeter.showGreeter()
496+ waitForRendering(greeter)
487497 tryCompare(greeter, "showProgress", 1)
488498 LightDM.Greeter.hideGreeter()
489499 tryCompare(greeter, "showProgress", 0)
@@ -571,5 +581,111 @@ Row {
571581
572582 tryCompare(greeter, "showProgress", data.unlocked ? 0 : 1);
573583 }
584+
585+ function test_tapOnRightEdgeReachesApplicationSurface() {
586+ var topmostSpreadDelegate = findChild(shell, "appDelegate0");
587+ var topmostSurface = findChild(topmostSpreadDelegate, "surfaceContainer").surface;
588+ var rightEdgeDragArea = findChild(shell, "spreadDragArea");
589+
590+ topmostSurface.touchPressCount = 0;
591+ topmostSurface.touchReleaseCount = 0;
592+
593+ var tapPoint = rightEdgeDragArea.mapToItem(shell, rightEdgeDragArea.width / 2,
594+ rightEdgeDragArea.height / 2);
595+
596+ tap(shell, tapPoint.x, tapPoint.y);
597+
598+ tryCompare(topmostSurface, "touchPressCount", 1);
599+ tryCompare(topmostSurface, "touchReleaseCount", 1);
600+ }
601+
602+ /*
603+ Perform a right edge drag over an application surface and check
604+ that no touch event was sent to it (ie, they were all consumed
605+ by the right-edge drag area)
606+ */
607+ function test_rightEdgeDragDoesNotReachApplicationSurface() {
608+ var topmostSpreadDelegate = findChild(shell, "appDelegate0");
609+ var topmostSurface = findChild(topmostSpreadDelegate, "surfaceContainer").surface;
610+ var rightEdgeDragArea = findChild(shell, "spreadDragArea");
611+
612+ topmostSurface.touchPressCount = 0;
613+ topmostSurface.touchReleaseCount = 0;
614+
615+ var gestureStartPoint = rightEdgeDragArea.mapToItem(shell, rightEdgeDragArea.width / 2,
616+ rightEdgeDragArea.height / 2);
617+
618+ touchFlick(shell,
619+ gestureStartPoint.x /* fromX */, gestureStartPoint.y /* fromY */,
620+ units.gu(1) /* toX */, gestureStartPoint.y /* toY */);
621+
622+ tryCompare(topmostSurface, "touchPressCount", 0);
623+ tryCompare(topmostSurface, "touchReleaseCount", 0);
624+ }
625+
626+ function waitUntilFocusedApplicationIsShowingItsSurface()
627+ {
628+ var spreadDelegate = findChild(shell, "appDelegate0");
629+ var appState = findInvisibleChild(spreadDelegate, "applicationWindowStateGroup");
630+ tryCompare(appState, "state", "surface");
631+ var transitions = appState.transitions;
632+ for (var i = 0; i < transitions.length; ++i) {
633+ var transition = transitions[i];
634+ tryCompare(transition, "running", false, 2000);
635+ }
636+ }
637+
638+ function swipeFromRightEdgeToShowAppSpread()
639+ {
640+ // perform a right-edge drag to show the spread
641+ var touchStartX = shell.width - (shell.edgeSize / 2)
642+ var touchStartY = shell.height / 2;
643+ touchFlick(shell, touchStartX, touchStartY, units.gu(1) /* endX */, touchStartY /* endY */);
644+
645+ // check if it's indeed showing the spread
646+ var stage = findChild(shell, "stage");
647+ var spreadView = findChild(stage, "spreadView");
648+ tryCompare(spreadView, "phase", 2);
649+ }
650+
651+ function test_tapUbuntuIconInLauncherOverAppSpread() {
652+
653+ waitUntilFocusedApplicationIsShowingItsSurface();
654+
655+ swipeFromRightEdgeToShowAppSpread();
656+
657+ var launcher = findChild(shell, "launcher");
658+
659+ // ensure the launcher dimissal timer never gets triggered during the test run
660+ var dismissTimer = findInvisibleChild(launcher, "dismissTimer");
661+ dismissTimer.interval = 60 * 60 * 1000;
662+
663+ dragLauncherIntoView();
664+
665+ // Emulate a tap with a finger, where the touch position drifts during the tap.
666+ {
667+ var buttonShowDashHome = findChild(launcher, "buttonShowDashHome");
668+ var startPos = buttonShowDashHome.mapToItem(shell,
669+ buttonShowDashHome.width * 0.2,
670+ buttonShowDashHome.height * 0.2);
671+ var endPos = buttonShowDashHome.mapToItem(shell,
672+ buttonShowDashHome.width * 0.8,
673+ buttonShowDashHome.height * 0.8);
674+ touchFlick(shell, startPos.x, startPos.y, endPos.x, endPos.y);
675+ }
676+
677+ compare(launcherShowDashHomeSpy.count, 1);
678+
679+ // check that the stage has left spread mode.
680+ {
681+ var stage = findChild(shell, "stage");
682+ var spreadView = findChild(stage, "spreadView");
683+ tryCompare(spreadView, "phase", 0);
684+ }
685+
686+ // check that the launcher got dismissed
687+ var launcherPanel = findChild(shell, "launcherPanel");
688+ tryCompare(launcherPanel, "x", -launcherPanel.width);
689+ }
574690 }
575691}
tests/qmltests/tst_ShellWithPin.qml+160−32
@@ -21,6 +21,7 @@ import AccountsService 0.1
2121import GSettings 1.0
2222import LightDM 0.1 as LightDM
2323import Ubuntu.SystemImage 0.1
24+import Ubuntu.Telephony 0.1 as Telephony
2425import Unity.Application 0.1
2526import Unity.Test 0.1 as UT
2627import Powerd 0.1
@@ -29,8 +30,8 @@ import "../../qml"
2930
3031Item {
3132 id: root
32− width: shell.width + units.gu(20)
33− height: shell.height
33+ width: contentRow.width
34+ height: contentRow.height
3435
3536 QtObject {
3637 id: applicationArguments
@@ -48,21 +49,57 @@ Item {
4849 }
4950 }
5051
51− Shell {
52− id: shell
53− maxFailedLogins: maxRetriesTextField.text
54− }
55− Column {
56− anchors { top: parent.top; right: parent.right; bottom: parent.bottom; margins:units.gu(1) }
57− width: units.gu(18)
52+ Row {
53+ id: contentRow
54+
55+ Loader {
56+ id: shellLoader
5857
59− Label {
60− text: "Max retries:"
61− color: "black"
58+ width: units.gu(40)
59+ height: units.gu(71)
60+
61+ property bool itemDestroyed: false
62+ sourceComponent: Component {
63+ Shell {
64+ Component.onDestruction: {
65+ shellLoader.itemDestroyed = true
66+ }
67+ maxFailedLogins: maxRetriesTextField.text
68+ }
69+ }
6270 }
63− TextField {
64− id: maxRetriesTextField
65− text: "-1"
71+
72+ Rectangle {
73+ color: "white"
74+ width: units.gu(30)
75+ height: shellLoader.height
76+
77+ Column {
78+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
79+ spacing: units.gu(1)
80+ Button {
81+ anchors { left: parent.left; right: parent.right }
82+ text: "Show Greeter"
83+ onClicked: {
84+ if (shellLoader.status !== Loader.Ready)
85+ return
86+
87+ var greeter = testCase.findChild(shellLoader.item, "greeter")
88+ if (!greeter.shown) {
89+ greeter.show()
90+ }
91+ }
92+ }
93+
94+ Label {
95+ text: "Max retries:"
96+ color: "black"
97+ }
98+ TextField {
99+ id: maxRetriesTextField
100+ text: "-1"
101+ }
102+ }
66103 }
67104 }
68105
@@ -77,30 +114,53 @@ Item {
77114 signalName: "resettingDevice"
78115 }
79116
117+ Telephony.CallEntry {
118+ id: phoneCall
119+ phoneNumber: "+447812221111"
120+ }
121+
80122 UT.UnityTestCase {
123+ id: testCase
81124 name: "ShellWithPin"
82125 when: windowShown
83126
84− function initTestCase() {
85−
86− sessionSpy.target = findChild(shell, "greeter")
87− }
127+ property Item shell: shellLoader.status === Loader.Ready ? shellLoader.item : null
88128
89129 function init() {
130+ sessionSpy.target = findChild(shell, "greeter")
90131 swipeAwayGreeter()
132+ waitForLockscreen()
91133 shell.failedLoginsDelayAttempts = -1
92134 maxRetriesTextField.text = "-1"
93− AccountsService.enableLauncherWhileLocked = true
94− AccountsService.enableIndicatorsWhileLocked = true
95135 }
96136
97137 function cleanup() {
98− LightDM.Greeter.showGreeter()
99− var greeter = findChild(shell, "greeter")
100− tryCompare(greeter, "showProgress", 1)
138+ shellLoader.itemDestroyed = false
139+
140+ shellLoader.active = false
141+
142+ tryCompare(shellLoader, "status", Loader.Null)
143+ tryCompare(shellLoader, "item", null)
144+ // Loader.status might be Loader.Null and Loader.item might be null but the Loader
145+ // item might still be alive. So if we set Loader.active back to true
146+ // again right now we will get the very same Shell instance back. So no reload
147+ // actually took place. Likely because Loader waits until the next event loop
148+ // iteration to do its work. So to ensure the reload, we will wait until the
149+ // Shell instance gets destroyed.
150+ tryCompare(shellLoader, "itemDestroyed", true)
101151
102152 // kill all (fake) running apps
103153 killApps()
154+
155+ AccountsService.enableLauncherWhileLocked = true
156+ AccountsService.enableIndicatorsWhileLocked = true
157+ AccountsService.demoEdges = false
158+
159+ // reload our test subject to get it in a fresh state once again
160+ shellLoader.active = true
161+
162+ tryCompare(shellLoader, "status", Loader.Ready)
163+ removeTimeConstraintsFromDirectionalDragAreas(shellLoader.item)
104164 }
105165
106166 function killApps() {
@@ -113,6 +173,7 @@ Item {
113173
114174 function swipeAwayGreeter() {
115175 var greeter = findChild(shell, "greeter");
176+ waitForRendering(greeter)
116177 tryCompare(greeter, "showProgress", 1);
117178
118179 var touchX = shell.width - (shell.edgeSize / 2);
@@ -121,8 +182,9 @@ Item {
121182
122183 // wait until the animation has finished
123184 tryCompare(greeter, "showProgress", 0);
185+ }
124186
125− // and for pin to be ready
187+ function waitForLockscreen() {
126188 var lockscreen = findChild(shell, "lockscreen");
127189 var pinPadLoader = findChild(lockscreen, "pinPadLoader");
128190 tryCompare(pinPadLoader, "status", Loader.Ready)
@@ -134,10 +196,20 @@ Item {
134196 for (var i = 0; i < pin.length; ++i) {
135197 var character = pin.charAt(i)
136198 var button = findChild(shell, "pinPadButton" + character)
137− mouseClick(button, units.gu(1), units.gu(1))
199+ tap(button)
138200 }
139201 }
140202
203+ function confirmLockedApp(app) {
204+ var greeter = findChild(shell, "greeter")
205+ var lockscreen = findChild(shell, "lockscreen")
206+ tryCompare(greeter, "shown", false)
207+ tryCompare(lockscreen, "shown", false)
208+ tryCompare(greeter, "hasLockedApp", true)
209+ tryCompare(greeter, "lockedApp", app)
210+ tryCompare(ApplicationManager, "focusedApplicationId", app)
211+ }
212+
141213 function test_login() {
142214 sessionSpy.clear()
143215 tryCompare(sessionSpy, "count", 0)
@@ -145,6 +217,25 @@ Item {
145217 tryCompare(sessionSpy, "count", 1)
146218 }
147219
220+ function test_edgeDemoHidesLockscreen() {
221+ LightDM.Greeter.showGreeter()
222+ sessionSpy.clear()
223+ var lockscreen = findChild(shell, "lockscreen")
224+
225+ tryCompare(lockscreen, "shown", true)
226+ AccountsService.demoEdges = true
227+ tryCompare(lockscreen, "shown", false)
228+
229+ swipeAwayGreeter()
230+ tryCompare(sessionSpy, "count", 1)
231+
232+ // Lockscreen is only hidden by the edge demo, so if we turn that
233+ // off and show greeter again, lockscreen should appear
234+ AccountsService.demoEdges = false
235+ LightDM.Greeter.showGreeter()
236+ tryCompare(lockscreen, "shown", true)
237+ }
238+
148239 function test_disabledEdges() {
149240 var launcher = findChild(shell, "launcher")
150241 tryCompare(launcher, "available", true)
@@ -166,9 +257,10 @@ Item {
166257 var launcher = findChild(shell, "launcher")
167258 var stage = findChild(shell, "stage")
168259
169− mouseClick(emergencyButton, units.gu(1), units.gu(1))
260+ tap(emergencyButton)
170261
171− tryCompare(greeter, "fakeActiveForApp", "dialer-app")
262+ tryCompare(greeter, "lockedApp", "dialer-app")
263+ tryCompare(greeter, "hasLockedApp", true)
172264 tryCompare(lockscreen, "shown", false)
173265 tryCompare(panel, "fullscreenMode", true)
174266 tryCompare(indicators, "available", false)
@@ -180,7 +272,8 @@ Item {
180272 LightDM.Greeter.showGreeter()
181273
182274 tryCompare(greeter, "shown", true)
183− tryCompare(greeter, "fakeActiveForApp", "")
275+ tryCompare(greeter, "lockedApp", "")
276+ tryCompare(greeter, "hasLockedApp", false)
184277 tryCompare(lockscreen, "shown", true)
185278 tryCompare(panel, "fullscreenMode", false)
186279 tryCompare(indicators, "available", true)
@@ -191,7 +284,7 @@ Item {
191284 function test_emergencyCallCrash() {
192285 var lockscreen = findChild(shell, "lockscreen")
193286 var emergencyButton = findChild(lockscreen, "emergencyCallLabel")
194− mouseClick(emergencyButton, units.gu(1), units.gu(1))
287+ tap(emergencyButton)
195288
196289 tryCompare(lockscreen, "shown", false)
197290 killApps() // kill dialer-app, as if it crashed
@@ -201,7 +294,7 @@ Item {
201294 function test_emergencyCallAppLaunch() {
202295 var lockscreen = findChild(shell, "lockscreen")
203296 var emergencyButton = findChild(lockscreen, "emergencyCallLabel")
204− mouseClick(emergencyButton, units.gu(1), units.gu(1))
297+ tap(emergencyButton)
205298
206299 tryCompare(lockscreen, "shown", false)
207300 ApplicationManager.startApplication("gallery-app", ApplicationManager.NoFlag)
@@ -246,12 +339,47 @@ Item {
246339
247340 var dialog = findChild(root, "infoPopup")
248341 var button = findChild(dialog, "infoPopupOkButton")
249− mouseClick(button, units.gu(1), units.gu(1))
342+ tap(button)
250343 tryCompareFunction(function() {return findChild(root, "infoPopup")}, null)
251344
252345 tryCompare(resetSpy, "count", 0)
253346 enterPin("1111")
254347 tryCompare(resetSpy, "count", 1)
255348 }
349+
350+ function test_emergencyDialerLockOut() {
351+ // This is a theoretical attack on the lockscreen: Enter emergency
352+ // dialer mode on a phone, then plug into a larger screen,
353+ // switching to a tablet interface. This would in theory move the
354+ // dialer to a side stage and give access to other apps. So just
355+ // confirm that such an attack doesn't work.
356+
357+ var applicationsDisplayLoader = findChild(shell, "applicationsDisplayLoader")
358+
359+ // We start in phone mode
360+ tryCompare(shell, "sideStageEnabled", false)
361+ tryCompare(applicationsDisplayLoader, "tabletMode", false)
362+
363+ var lockscreen = findChild(shell, "lockscreen")
364+ lockscreen.emergencyCall()
365+ confirmLockedApp("dialer-app")
366+
367+ // OK, we're in. Now try (but fail) to switch to tablet mode
368+ shell.tablet = true
369+ tryCompare(shell, "sideStageEnabled", true)
370+ tryCompare(applicationsDisplayLoader, "tabletMode", false)
371+
372+ // And when we kill the app, we go back to locked tablet mode
373+ killApps()
374+ var greeter = findChild(shell, "greeter")
375+ tryCompare(greeter, "showProgress", 1)
376+ tryCompare(shell, "sideStageEnabled", true)
377+ tryCompare(applicationsDisplayLoader, "tabletMode", true)
378+ }
379+
380+ function test_emergencyDialerIncoming() {
381+ callManager.foregroundCall = phoneCall
382+ confirmLockedApp("dialer-app")
383+ }
256384 }
257385}
tests/qmltests/tst_TabletShell.qmlnew file+297
@@ -0,0 +1,297 @@
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 QtTest 1.0
19+import AccountsService 0.1
20+import GSettings 1.0
21+import LightDM 0.1 as LightDM
22+import Ubuntu.Components 1.1
23+import Ubuntu.Telephony 0.1 as Telephony
24+import Unity.Application 0.1
25+import Unity.Connectivity 0.1
26+import Unity.Test 0.1 as UT
27+import Powerd 0.1
28+
29+import "../../qml"
30+
31+Row {
32+ id: root
33+ spacing: 0
34+
35+ QtObject {
36+ id: applicationArguments
37+
38+ function hasGeometry() {
39+ return false
40+ }
41+
42+ function width() {
43+ return 0
44+ }
45+
46+ function height() {
47+ return 0
48+ }
49+ }
50+
51+ Loader {
52+ id: shellLoader
53+
54+ width: units.gu(100)
55+ height: units.gu(80)
56+
57+ property bool itemDestroyed: false
58+ sourceComponent: Component {
59+ Shell {
60+ Component.onDestruction: {
61+ shellLoader.itemDestroyed = true
62+ }
63+ }
64+ }
65+ }
66+
67+ Rectangle {
68+ color: "white"
69+ width: units.gu(20)
70+ height: shellLoader.height
71+
72+ Column {
73+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
74+ spacing: units.gu(1)
75+ Row {
76+ anchors { left: parent.left; right: parent.right }
77+ Button {
78+ text: "Show Greeter"
79+ onClicked: {
80+ if (shellLoader.status !== Loader.Ready)
81+ return
82+
83+ var greeter = testCase.findChild(shellLoader.item, "greeter")
84+ if (!greeter.shown) {
85+ greeter.show()
86+ }
87+ }
88+ }
89+ }
90+ }
91+ }
92+
93+ SignalSpy {
94+ id: sessionSpy
95+ signalName: "sessionStarted"
96+ }
97+
98+ SignalSpy {
99+ id: dashCommunicatorSpy
100+ signalName: "setCurrentScopeCalled"
101+ }
102+
103+ SignalSpy {
104+ id: unlockAllModemsSpy
105+ target: Connectivity
106+ signalName: "unlockingAllModems"
107+ }
108+
109+ Telephony.CallEntry {
110+ id: phoneCall
111+ phoneNumber: "+447812221111"
112+ }
113+
114+ UT.UnityTestCase {
115+ id: testCase
116+ name: "TabletShell"
117+ when: windowShown
118+
119+ property Item shell: shellLoader.status === Loader.Ready ? shellLoader.item : null
120+
121+ function init() {
122+ sessionSpy.clear()
123+ sessionSpy.target = findChild(shell, "greeter")
124+ dashCommunicatorSpy.target = findInvisibleChild(shell, "dashCommunicator")
125+ }
126+
127+ function cleanup() {
128+ shellLoader.itemDestroyed = false
129+
130+ shellLoader.active = false
131+
132+ tryCompare(shellLoader, "status", Loader.Null)
133+ tryCompare(shellLoader, "item", null)
134+ // Loader.status might be Loader.Null and Loader.item might be null but the Loader
135+ // item might still be alive. So if we set Loader.active back to true
136+ // again right now we will get the very same Shell instance back. So no reload
137+ // actually took place. Likely because Loader waits until the next event loop
138+ // iteration to do its work. So to ensure the reload, we will wait until the
139+ // Shell instance gets destroyed.
140+ tryCompare(shellLoader, "itemDestroyed", true)
141+
142+ // kill all (fake) running apps
143+ killApps()
144+
145+ unlockAllModemsSpy.clear()
146+ AccountsService.demoEdges = false
147+
148+ // reload our test subject to get it in a fresh state once again
149+ shellLoader.active = true
150+
151+ tryCompare(shellLoader, "status", Loader.Ready)
152+ removeTimeConstraintsFromDirectionalDragAreas(shellLoader.item)
153+ }
154+
155+ function killApps() {
156+ while (ApplicationManager.count > 1) {
157+ var appIndex = ApplicationManager.get(0).appId == "unity8-dash" ? 1 : 0
158+ ApplicationManager.stopApplication(ApplicationManager.get(appIndex).appId)
159+ }
160+ compare(ApplicationManager.count, 1)
161+ }
162+
163+ function selectIndex(i) {
164+ // We could be anywhere in list; find target index to know which direction
165+ var greeter = findChild(shell, "greeter")
166+ var userlist = findChild(greeter, "userList")
167+ if (userlist.currentIndex == i)
168+ keyClick(Qt.Key_Escape) // Reset state if we're not moving
169+ while (userlist.currentIndex != i) {
170+ var next = userlist.currentIndex + 1
171+ if (userlist.currentIndex > i) {
172+ next = userlist.currentIndex - 1
173+ }
174+ var account = findChild(greeter, "username"+next)
175+ mouseClick(account, 1, 1)
176+ tryCompare(userlist, "currentIndex", next)
177+ tryCompare(userlist, "movingInternally", false)
178+ }
179+ }
180+
181+ function selectUser(name) {
182+ // Find index of user with the right name
183+ var greeter = findChild(shell, "greeter")
184+ for (var i = 0; i < greeter.model.count; i++) {
185+ if (greeter.model.data(i, LightDM.UserRoles.NameRole) == name) {
186+ break
187+ }
188+ }
189+ if (i == greeter.model.count) {
190+ fail("Didn't find name")
191+ return -1
192+ }
193+ selectIndex(i)
194+ return i
195+ }
196+
197+ function clickPasswordInput(isButton) {
198+ var greeter = findChild(shell, "greeter")
199+ tryCompare(greeter, "showProgress", 1)
200+
201+ var passwordMouseArea = findChild(shell, "passwordMouseArea")
202+ tryCompare(passwordMouseArea, "enabled", isButton)
203+
204+ var passwordInput = findChild(shell, "passwordInput")
205+ mouseClick(passwordInput, passwordInput.width / 2, passwordInput.height / 2)
206+ }
207+
208+ function confirmLoggedIn(loggedIn) {
209+ var greeterWrapper = findChild(shell, "greeterWrapper")
210+ tryCompare(greeterWrapper, "showProgress", loggedIn ? 0 : 1)
211+ tryCompare(sessionSpy, "count", loggedIn ? 1 : 0)
212+ }
213+
214+ function swipeFromLeftEdge(swipeLength) {
215+ var touchStartX = 2
216+ var touchStartY = shell.height / 2
217+ touchFlick(shell, touchStartX, touchStartY, swipeLength, touchStartY)
218+ }
219+
220+ function test_noLockscreen() {
221+ selectUser("has-password")
222+ var lockscreen = findChild(shell, "lockscreen")
223+ tryCompare(lockscreen, "shown", false)
224+ }
225+
226+ function test_showAndHideGreeterDBusCalls() {
227+ var greeter = findChild(shell, "greeter")
228+ LightDM.Greeter.hideGreeter()
229+ tryCompare(greeter, "showProgress", 0)
230+ LightDM.Greeter.showGreeter()
231+ tryCompare(greeter, "showProgress", 1)
232+ }
233+
234+ function test_login_data() {
235+ return [
236+ {tag: "auth error", user: "auth-error", loggedIn: false, password: ""},
237+ {tag: "with password", user: "has-password", loggedIn: true, password: "password"},
238+ {tag: "without password", user: "no-password", loggedIn: true, password: ""},
239+ ]
240+ }
241+
242+ function test_login(data) {
243+ selectUser(data.user)
244+
245+ clickPasswordInput(data.password === "")
246+
247+ if (data.password !== "") {
248+ typeString(data.password)
249+ keyClick(Qt.Key_Enter)
250+ }
251+
252+ confirmLoggedIn(data.loggedIn)
253+ }
254+
255+ function test_appLaunchDuringGreeter_data() {
256+ return [
257+ {tag: "auth error", user: "auth-error", loggedIn: false, passwordFocus: false},
258+ {tag: "without password", user: "no-password", loggedIn: true, passwordFocus: false},
259+ {tag: "with password", user: "has-password", loggedIn: false, passwordFocus: true},
260+ ]
261+ }
262+
263+ function test_appLaunchDuringGreeter(data) {
264+ selectUser(data.user)
265+
266+ var greeter = findChild(shell, "greeter")
267+ var app = ApplicationManager.startApplication("dialer-app")
268+
269+ confirmLoggedIn(data.loggedIn)
270+
271+ if (data.passwordFocus) {
272+ var passwordInput = findChild(greeter, "passwordInput")
273+ tryCompare(passwordInput, "focus", true)
274+ }
275+ }
276+
277+ function test_leftEdgeDrag_data() {
278+ return [
279+ {tag: "without password", user: "no-password", loggedIn: true, demo: false},
280+ {tag: "with password", user: "has-password", loggedIn: false, demo: false},
281+ {tag: "with demo", user: "has-password", loggedIn: true, demo: true},
282+ ]
283+ }
284+
285+ function test_leftEdgeDrag(data) {
286+ selectUser(data.user)
287+
288+ AccountsService.demoEdges = data.demo
289+ var edgeDemo = findChild(shell, "edgeDemo")
290+ tryCompare(edgeDemo, "running", data.demo)
291+
292+ swipeFromLeftEdge(shell.width * 0.75)
293+ wait(500) // to give time to handle dash() signal from Launcher
294+ confirmLoggedIn(data.loggedIn)
295+ }
296+ }
297+}
tests/uqmlscene/CMakeLists.txt+2
@@ -10,6 +10,7 @@ pkg_check_modules(XCB REQUIRED xcb)
1010include_directories(
1111 ${CMAKE_SOURCE_DIR}/src
1212 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
13+ ${CMAKE_SOURCE_DIR}/libs/UbuntuGestures
1314)
1415
1516if (NOT "${XCB_INCLUDE_DIRS}" STREQUAL "")
@@ -20,4 +21,5 @@ target_link_libraries(uqmlscene
2021 ${Qt5Qml_LIBRARIES}
2122 ${Qt5Quick_LIBRARIES}
2223 ${XCB_LDFLAGS}
24+ UbuntuGestures
2325 )
tests/uqmlscene/README+3−1
@@ -1 +1,3 @@
1−Qt's qmlscene tool modified to use MouseTouchAdaptor. That way we can interact with touch-only components
1+Qt's qmlscene tool with the following modifications:
2+ - Added MouseTouchAdaptor. That way we can interact with touch-only components
3+ - Added TouchRegistry. So that DirectionalDragArea, TouchGate and others can negotiate touch ownership etc.
tests/uqmlscene/main.cpp+9
@@ -65,6 +65,9 @@
6565
6666#include <MouseTouchAdaptor.h>
6767
68+// UbuntuGestures lib
69+#include <TouchRegistry.h>
70+
6871#ifdef QML_RUNTIME_TESTING
6972class RenderStatistics
7073{
@@ -496,6 +499,12 @@ int main(int argc, char ** argv)
496499 QQuickItem *contentItem = qobject_cast<QQuickItem *>(topLevel);
497500 if (contentItem) {
498501 qxView = new QQuickView(&engine, nullptr);
502+ if (TouchRegistry::instance() == nullptr) {
503+ new TouchRegistry(qxView);
504+ } else {
505+ TouchRegistry::instance()->setParent(qxView);
506+ }
507+ qxView->installEventFilter(TouchRegistry::instance());
499508 window = qxView;
500509 // Set window default properties; the qml can still override them
501510 QString oname = contentItem->objectName();
tests/utils/modules/Unity/Test/CMakeLists.txt+2
@@ -4,6 +4,7 @@ add_definitions(-DQT_NO_KEYWORDS)
44
55include_directories(
66 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
7+ ${CMAKE_SOURCE_DIR}/libs/UbuntuGestures
78)
89
910set(UnityTestQML_SOURCES
@@ -13,6 +14,7 @@ set(UnityTestQML_SOURCES
1314)
1415
1516add_library(UnityTestQml MODULE ${UnityTestQML_SOURCES})
17+target_link_libraries(UnityTestQml UbuntuGestures)
1618
1719qt5_use_modules(UnityTestQml Core Quick Test)
1820
tests/utils/modules/Unity/Test/UnityTestCase.qml+20
@@ -20,8 +20,17 @@ import Ubuntu.Components 0.1
2020import Unity.Test 0.1 as UT
2121
2222TestCase {
23+ id: testCase
2324 TestUtil {id:util}
2425
26+ ActivityIndicator {
27+ visible: testCase.running
28+ anchors.centerIn: parent
29+ Component.onCompleted: parent = testCase.parent
30+ z: 100
31+ running: visible
32+ }
33+
2534 // Fake implementation to be provided to items under test
2635 property var fakeDateTime: new function() {
2736 this.currentTimeMs = 0
@@ -312,7 +321,16 @@ TestCase {
312321 event.commit()
313322 }
314323
324+ /*! \brief Tap the item with a touch event.
325+
326+ \param item The item to be tapped
327+ \param x The x coordinate of the tap, defaults to horizontal center
328+ \param y The y coordinate of the tap, defaults to vertical center
329+ */
315330 function tap(item, x, y) {
331+ if (typeof x !== "number") x = item.width / 2;
332+ if (typeof y !== "number") y = item.height / 2;
333+
316334 var root = fetchRootItem(item)
317335 var rootPoint = item.mapToItem(root, x, y)
318336
@@ -326,6 +344,8 @@ TestCase {
326344 }
327345
328346 Component.onCompleted: {
347+ UT.Util.ensureTouchRegistryInstalled();
348+
329349 var rootItem = parent;
330350 while (rootItem.parent != undefined) {
331351 rootItem = rootItem.parent;
tests/utils/modules/Unity/Test/testutil.cpp+41−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2012, 2013 Canonical, Ltd.
2+ * Copyright (C) 2012, 2013, 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -19,11 +19,19 @@
1919
2020#include <qpa/qwindowsysteminterface.h>
2121#include <QtGui/QGuiApplication>
22+#include <QQuickView>
23+
24+// UbuntuGestures lib
25+#include <TouchRegistry.h>
26+#include <Timer.h>
27+
28+using namespace UbuntuGestures;
2229
2330TestUtil::TestUtil(QObject *parent)
2431 : QObject(parent)
2532 , m_targetWindow(0)
2633 , m_touchDevice(0)
34+ , m_installedTouchRegistry(false)
2735{
2836}
2937
@@ -52,6 +60,7 @@ TouchEventSequenceWrapper *TestUtil::touchEvent()
5260{
5361 ensureTargetWindow();
5462 ensureTouchDevice();
63+ ensureTouchRegistryInstalled();
5564
5665 return new TouchEventSequenceWrapper(
5766 QTest::touchEvent(m_targetWindow, m_touchDevice, /* autoCommit */ false));
@@ -59,7 +68,7 @@ TouchEventSequenceWrapper *TestUtil::touchEvent()
5968
6069void TestUtil::ensureTargetWindow()
6170{
62− if (!m_targetWindow)
71+ if (!m_targetWindow && !QGuiApplication::topLevelWindows().isEmpty())
6372 m_targetWindow = QGuiApplication::topLevelWindows()[0];
6473}
6574
@@ -71,3 +80,33 @@ void TestUtil::ensureTouchDevice()
7180 QWindowSystemInterface::registerTouchDevice(m_touchDevice);
7281 }
7382}
83+
84+void TestUtil::ensureTouchRegistryInstalled()
85+{
86+ if (m_installedTouchRegistry)
87+ return;
88+
89+ TouchRegistry *touchRegistry;
90+ if (TouchRegistry::instance() == nullptr) {
91+ // Tests can be *very* slow to run and we don't want things timing out because
92+ // of that. So give it fake timers to use (they will never time out)
93+ touchRegistry = new TouchRegistry(this, new FakeTimerFactory);
94+ } else {
95+ touchRegistry = TouchRegistry::instance();
96+ if (touchRegistry->parent() != this) {
97+ // someone else created it. leave it alone
98+ m_installedTouchRegistry = true;
99+ }
100+ }
101+
102+ ensureTargetWindow();
103+
104+ if (m_targetWindow) {
105+ QQuickView *view = qobject_cast<QQuickView*>(m_targetWindow);
106+ if (view) {
107+ view->installEventFilter(touchRegistry);
108+ touchRegistry->setParent(view);
109+ m_installedTouchRegistry = true;
110+ }
111+ }
112+}
tests/utils/modules/Unity/Test/testutil.h+3−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2012, 2013 Canonical, Ltd.
2+ * Copyright (C) 2012, 2013, 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -34,6 +34,7 @@ public:
3434
3535 Q_INVOKABLE bool isInstanceOf(QObject*, QString);
3636 Q_INVOKABLE TouchEventSequenceWrapper *touchEvent();
37+ Q_INVOKABLE void ensureTouchRegistryInstalled();
3738
3839private:
3940 void ensureTargetWindow();
@@ -41,6 +42,7 @@ private:
4142
4243 QWindow *m_targetWindow;
4344 QTouchDevice *m_touchDevice;
45+ bool m_installedTouchRegistry;
4446};
4547
4648QML_DECLARE_TYPE(TestUtil)