on xenial help sign in
implement saving the selected layout and add a test
a3eda88Lukáš Tinkl
plugins/AccountsService/AccountsService.cpp+17
@@ -274,6 +274,23 @@ QStringList AccountsService::keymaps() const
274 return {QStringLiteral("us")};
274 return {QStringLiteral("us")};
275}
275}
276
276
277+void AccountsService::setKeymaps(const QStringList &keymaps)
278+{
279+ if (keymaps.isEmpty()) {
280+ return;
281+ }
282+
283+ StringMap map;
284+ StringMapList result;
285+ Q_FOREACH(const QString &keymap, keymaps) {
286+ map.insert(QStringLiteral("xkb"), keymap);
287+ }
288+
289+ result.append(map);
290+ setProperty(IFACE_ACCOUNTS_USER, PROP_INPUT_SOURCES, QVariant::fromValue(result));
291+ Q_EMIT keymapsChanged();
292+}
293+
277uint AccountsService::failedLogins() const
294uint AccountsService::failedLogins() const
278{
295{
279 return getProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS).toUInt();
296 return getProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS).toUInt();
plugins/AccountsService/AccountsService.h+2−3
@@ -72,9 +72,7 @@ class AccountsService: public QObject
72 NOTIFY hereLicensePathChanged)
72 NOTIFY hereLicensePathChanged)
73 Q_PROPERTY(QString realName READ realName WRITE setRealName NOTIFY realNameChanged)
73 Q_PROPERTY(QString realName READ realName WRITE setRealName NOTIFY realNameChanged)
74 Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged)
74 Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged)
75− Q_PROPERTY(QStringList keymaps
75+ Q_PROPERTY(QStringList keymaps READ keymaps WRITE setKeymaps NOTIFY keymapsChanged)
76− READ keymaps
77− NOTIFY keymapsChanged)
78
76
79public:
77public:
80 enum PasswordDisplayHint {
78 enum PasswordDisplayHint {
@@ -107,6 +105,7 @@ public:
107 QString email() const;
105 QString email() const;
108 void setEmail(const QString &email);
106 void setEmail(const QString &email);
109 QStringList keymaps() const;
107 QStringList keymaps() const;
108+ void setKeymaps(const QStringList &keymaps);
110
109
111Q_SIGNALS:
110Q_SIGNALS:
112 void userChanged();
111 void userChanged();
qml/Wizard/Pages/20-keyboard.qml+13−2
@@ -20,6 +20,7 @@ import Ubuntu.Components 1.3
20import Ubuntu.Components.ListItems 1.3
20import Ubuntu.Components.ListItems 1.3
21import Ubuntu.SystemSettings.LanguagePlugin 1.0
21import Ubuntu.SystemSettings.LanguagePlugin 1.0
22import Wizard 0.1
22import Wizard 0.1
23+import AccountsService 0.1
23import Unity.InputInfo 0.1
24import Unity.InputInfo 0.1
24import ".." as LocalComponents
25import ".." as LocalComponents
25
26
@@ -55,6 +56,8 @@ LocalComponents.Page {
55 print("Selected language:", selectedLanguage)
56 print("Selected language:", selectedLanguage)
56 }
57 }
57
58
59+ property string selectedKeymap: ""
60+
58 ColumnLayout {
61 ColumnLayout {
59 id: column
62 id: column
60 spacing: units.gu(2)
63 spacing: units.gu(2)
@@ -69,13 +72,14 @@ LocalComponents.Page {
69
72
70 ItemSelector {
73 ItemSelector {
71 id: langSelector
74 id: langSelector
75+ objectName: "langSelector"
72 anchors.left: parent.left
76 anchors.left: parent.left
73 anchors.right: parent.right
77 anchors.right: parent.right
74− //text: i18n.tr("Keyboard Language")
75 model: langPlugin.languageNames
78 model: langPlugin.languageNames
76 selectedIndex: langPlugin.languageCodes.indexOf(i18n.language)
79 selectedIndex: langPlugin.languageCodes.indexOf(i18n.language)
77 onSelectedIndexChanged: {
80 onSelectedIndexChanged: {
78 keyboardListView.currentIndex = -1;
81 keyboardListView.currentIndex = -1;
82+ selectedKeymap = "";
79 tester.text = "";
83 tester.text = "";
80 }
84 }
81 }
85 }
@@ -117,6 +121,7 @@ LocalComponents.Page {
117
121
118 onClicked: {
122 onClicked: {
119 keyboardListView.currentIndex = index;
123 keyboardListView.currentIndex = index;
124+ selectedKeymap = layoutId;
120 }
125 }
121 }
126 }
122 }
127 }
@@ -136,7 +141,13 @@ LocalComponents.Page {
136 id: forwardButton
141 id: forwardButton
137 LocalComponents.StackButton {
142 LocalComponents.StackButton {
138 text: keyboardListView.currentIndex != -1 ? i18n.tr("Next") : i18n.tr("Skip")
143 text: keyboardListView.currentIndex != -1 ? i18n.tr("Next") : i18n.tr("Skip")
144+ onClicked: {
145+ if (keyboardListView.currentIndex != -1) {
146+ print("Saving keymap:", selectedKeymap);
147+ AccountsService.keymaps = selectedKeymap;
148+ }
139− onClicked: pageStack.next();
149+ pageStack.next();
150+ }
140 }
151 }
141 }
152 }
142}
153}
tests/mocks/AccountsService/AccountsService.h+1−1
@@ -76,7 +76,7 @@ class AccountsService: public QObject
76 Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged)
76 Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged)
77 Q_PROPERTY(QStringList keymaps
77 Q_PROPERTY(QStringList keymaps
78 READ keymaps
78 READ keymaps
79− WRITE setKeymaps // only in mock
79+ WRITE setKeymaps
80 NOTIFY keymapsChanged)
80 NOTIFY keymapsChanged)
81
81
82public:
82public:
tests/qmltests/Wizard/tst_Wizard.qml+33
@@ -80,6 +80,12 @@ Item {
80 signalName: "timeZoneChangedCalled"
80 signalName: "timeZoneChangedCalled"
81 }
81 }
82
82
83+ SignalSpy {
84+ id: kbdLayoutSpy
85+ target: AccountsService
86+ signalName: "keymapsChanged"
87+ }
88+
83 function setup() {
89 function setup() {
84 AccountsService.hereEnabled = false;
90 AccountsService.hereEnabled = false;
85 AccountsService.hereLicensePath = Qt.resolvedUrl("licenses");
91 AccountsService.hereLicensePath = Qt.resolvedUrl("licenses");
@@ -94,6 +100,7 @@ Item {
94 activateLocationSpy.clear();
100 activateLocationSpy.clear();
95 activateGPSSpy.clear();
101 activateGPSSpy.clear();
96 timezoneSpy.clear();
102 timezoneSpy.clear();
103+ kbdLayoutSpy.clear();
97
104
98 ActionData.data = {
105 ActionData.data = {
99 "location-detection-enabled": {
106 "location-detection-enabled": {
@@ -191,6 +198,10 @@ Item {
191 tap(findChild(page, "forwardButton"));
198 tap(findChild(page, "forwardButton"));
192 }
199 }
193
200
201+ page = waitForPage("keyboardPage");
202+ if (name === page.objectName) return page;
203+ tap(findChild(page, "forwardButton"));
204+
194 page = waitForPage("wifiPage");
205 page = waitForPage("wifiPage");
195 if (name === page.objectName) return page;
206 if (name === page.objectName) return page;
196 tap(findChild(page, "forwardButton"));
207 tap(findChild(page, "forwardButton"));
@@ -494,5 +505,27 @@ Item {
494 tap(findChild(page, "nameInput"));
505 tap(findChild(page, "nameInput"));
495 typeString("foobar");
506 typeString("foobar");
496 }
507 }
508+
509+ function test_keyboardPage() {
510+ var page = goToPage("keyboardPage");
511+ var forwardButton = findChild(page, "forwardButton");
512+
513+ // change language
514+ var langSelector = findChild(page, "langSelector");
515+ verify(langSelector);
516+ langSelector.selectedIndex = 1; // should be fr_FR
517+ print("Selected language:", page.selectedLanguage);
518+
519+ // pick some layout
520+ var kbdDelegate = findChild(page, "kbdDelegate1");
521+ verify(kbdDelegate);
522+ mouseClick(kbdDelegate);
523+ verify(kbdDelegate.isCurrent);
524+ print("Selected keymap:", page.selectedKeymap);
525+
526+ // verify the keymapsChanged signal got fired
527+ tap(findChild(page, "forwardButton"));
528+ tryCompare(kbdLayoutSpy, "count", 1);
529+ }
497 }
530 }
498}
531}