Merge lp:~fboucault/address-book-app/converged_bottom_edge into lp:address-book-app

Proposed by Florian Boucault on 2015-09-10
Status: Merged
Approved by: Bill Filler on 2015-10-27
Approved revision: 512
Merged at revision: 490
Proposed branch: lp:~fboucault/address-book-app/converged_bottom_edge
Merge into: lp:address-book-app
Prerequisite: lp:~fboucault/address-book-app/multicolumns
Diff against target: 2687 lines (+865/-241)
97 files modified
examples/contenthub.qml (+1/-1)
src/imports/ABContactEditorPage.qml (+7/-2)
src/imports/ABContactListPage.qml (+191/-64)
src/imports/ABContactViewPage.qml (+12/-10)
src/imports/BottomEdge.qml (+321/-0)
src/imports/BottomEdgeShadow.qml (+31/-0)
src/imports/CMakeLists.txt (+2/-0)
src/imports/ContentHubProxy.qml (+1/-1)
src/imports/MainWindow.qml (+22/-2)
src/imports/Settings/MyselfPhoneNumbersModel.qml (+1/-1)
src/imports/Settings/SettingsPage.qml (+1/-1)
src/imports/Ubuntu/AddressBook/Base/ContactDetailBase.qml (+1/-1)
src/imports/Ubuntu/AddressBook/Base/ContactDetailGroupBase.qml (+1/-1)
src/imports/Ubuntu/AddressBook/Base/ContactDetailGroupWithTypeBase.qml (+1/-1)
src/imports/Ubuntu/AddressBook/Base/ContactDetailItem.qml (+1/-1)
src/imports/Ubuntu/AddressBook/Base/ContactExporter.qml (+1/-1)
src/imports/Ubuntu/AddressBook/Base/KeyboardRectangle.qml (+1/-1)
src/imports/Ubuntu/AddressBook/Base/RemoveContactsDialog.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactEditor/AvatarImport.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactEditor/ComboButtonAddField.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailAddressesEditor.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailAvatarEditor.qml (+2/-2)
src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailEmailsEditor.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailGroupWithTypeEditor.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailNameEditor.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailOnlineAccountsEditor.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailOrganizationsEditor.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailPhoneNumbersEditor.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailSyncTargetEditor.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailWithTypeEditor.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactEditor/ContactEditorPage.qml (+17/-5)
src/imports/Ubuntu/AddressBook/ContactEditor/TextInputDetail.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactEditor/ValueSelector.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactShare/ContactSharePage.qml (+3/-1)
src/imports/Ubuntu/AddressBook/ContactView/ActionButton.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/BasicFieldView.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/ContactDetailAddressesView.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/ContactDetailAvatarView.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/ContactDetailEmailsView.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/ContactDetailGroupWithTypeView.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/ContactDetailNameView.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/ContactDetailOnlineAccountsView.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/ContactDetailOrganizationsView.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/ContactDetailPhoneNumberView.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/ContactDetailPhoneNumbersView.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/ContactDetailSyncTargetView.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/ContactDetailWithTypeView.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/ContactFetchError.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/ContactHeaderView.qml (+1/-1)
src/imports/Ubuntu/AddressBook/ContactView/ContactViewPage.qml (+1/-1)
src/imports/Ubuntu/Contacts/ActionButton.qml (+1/-1)
src/imports/Ubuntu/Contacts/ContactAvatar.qml (+3/-3)
src/imports/Ubuntu/Contacts/ContactDelegate.qml (+1/-1)
src/imports/Ubuntu/Contacts/ContactDetailOnlineAccountTypeModel.qml (+1/-1)
src/imports/Ubuntu/Contacts/ContactDetailPhoneNumberTypeModel.qml (+1/-1)
src/imports/Ubuntu/Contacts/ContactDetailPickerPhoneNumberDelegate.qml (+1/-1)
src/imports/Ubuntu/Contacts/ContactFetch.qml (+1/-1)
src/imports/Ubuntu/Contacts/ContactListButtonDelegate.qml (+1/-1)
src/imports/Ubuntu/Contacts/ContactListModel.qml (+1/-1)
src/imports/Ubuntu/Contacts/ContactListView.qml (+61/-4)
src/imports/Ubuntu/Contacts/ContactSimpleListView.qml (+10/-2)
src/imports/Ubuntu/Contacts/FastScroll.qml (+1/-1)
src/imports/Ubuntu/Contacts/ListItemWithActions.qml (+1/-1)
src/imports/Ubuntu/Contacts/ListItemWithActionsCheckBox.qml (+1/-1)
src/imports/Ubuntu/Contacts/MostCalledList.qml (+1/-1)
src/imports/Ubuntu/Contacts/MostCalledModel.qml (+1/-1)
src/imports/Ubuntu/Contacts/MultipleSelectionListView.qml (+1/-1)
src/imports/Ubuntu/Contacts/MultipleSelectionVisualModel.qml (+1/-1)
src/imports/Ubuntu/Contacts/Ofono.qml (+1/-1)
src/imports/Ubuntu/Contacts/OnlineAccountsDummy.qml (+1/-1)
src/imports/Ubuntu/Contacts/OnlineAccountsHelper.qml (+1/-1)
src/imports/Ubuntu/Contacts/PageWithBottomEdge.qml (+2/-2)
src/imports/Ubuntu/Contacts/SIMCardImportPage.qml (+1/-1)
src/imports/Ubuntu/Contacts/SIMList.qml (+1/-1)
src/imports/Ubuntu/Contacts/SectionDelegate.qml (+1/-2)
src/imports/Ubuntu/Contacts/SubtitledWithColors.qml (+1/-1)
src/imports/Ubuntu/Contacts/VCardParser.qml (+1/-1)
src/imports/Ubuntu/Contacts/qmldir (+1/-1)
src/imports/VCardImportDialog.qml (+1/-1)
tests/autopilot/address_book_app/__init__.py (+50/-30)
tests/autopilot/address_book_app/address_book/_contact_view_page.py (+1/-7)
tests/autopilot/address_book_app/address_book/_sim_card_import_page.py (+2/-2)
tests/autopilot/address_book_app/pages/_ab_contact_list_page.py (+26/-7)
tests/autopilot/address_book_app/tests/__init__.py (+2/-2)
tests/autopilot/address_book_app/tests/test_add_contact.py (+8/-5)
tests/autopilot/address_book_app/tests/test_create_new_from_uri.py (+7/-5)
tests/autopilot/address_book_app/tests/test_delete_contact.py (+1/-1)
tests/autopilot/address_book_app/tests/test_edit_contact.py (+10/-10)
tests/qml/tst_ContactAvatar.qml (+1/-1)
tests/qml/tst_ContactEditor.qml (+1/-1)
tests/qml/tst_ContactList.qml (+1/-1)
tests/qml/tst_ContactListModel.qml (+1/-1)
tests/qml/tst_ContactListView.qml (+1/-1)
tests/qml/tst_ContactPreviewPage.qml (+1/-1)
tests/qml/tst_ListWithActions.qml (+1/-1)
tests/qml/tst_UbuntuContacts.qml (+1/-1)
tests/qml/tst_VCardParser.qml (+1/-1)
To merge this branch: bzr merge lp:~fboucault/address-book-app/converged_bottom_edge
Reviewer Review Type Date Requested Status
Renato Araujo Oliveira Filho (community) 2015-09-10 Approve on 2015-10-27
PS Jenkins bot continuous-integration Needs Fixing on 2015-10-26
Robert Bruce Park (community) Needs Fixing on 2015-09-24
Review via email: mp+270693@code.launchpad.net

Commit Message

Make bottom edge usable with a mouse.
Make it smarter when more than one column is available.

To post a comment you must log in.
475. By Florian Boucault on 2015-09-10

Better avatar for new contact.

476. By Florian Boucault on 2015-09-10

Better selected contact handling.

477. By Florian Boucault on 2015-09-10

Avoid crashes upon deletion.

478. By Florian Boucault on 2015-09-14

Added constraints on AdaptivePageLayout so that right column is not squeezed too small.

479. By Florian Boucault on 2015-09-14

Do not show other import options when adding a new contact.

480. By Florian Boucault on 2015-09-14

Correctly set the pageStack property to the contact list page.

-Application starts with the keyboard visible.
-Create new contact page appears empty.

review: Needs Fixing
481. By Florian Boucault on 2015-09-18

Fix 1 column layout.

482. By Florian Boucault on 2015-09-18

Fixed doc

483. By Florian Boucault on 2015-09-18

Always highlight the opened contact.

484. By Florian Boucault on 2015-09-21

Fixed sizing of ABContactEditorPage

485. By Florian Boucault on 2015-09-21

Always reset state

486. By Florian Boucault on 2015-09-21

Fixed bottom edge stacking.

487. By Florian Boucault on 2015-09-21

2 columns width fix

488. By Florian Boucault on 2015-09-21

Prevent forced focus at startup

489. By Florian Boucault on 2015-09-21

Fix split second visible anime at startup

490. By Florian Boucault on 2015-09-21

Missing code for previous fix.

491. By Florian Boucault on 2015-09-21

Show newly created contact only in multicolumn mode.

492. By Florian Boucault on 2015-09-21

Better new contact placeholder handling

493. By Florian Boucault on 2015-09-22

Added confirmation dialog when cancelling contact edit

494. By Florian Boucault on 2015-09-22

Cleaner opening of view and edit contact pages.

495. By Florian Boucault on 2015-09-22

Cancel edition before trying to show a contact.

496. By Florian Boucault on 2015-09-23

Fixed wrong aspect ratio when using UbuntuShape.

497. By Florian Boucault on 2015-09-23

Fixed freeze upon cancelling new contact.

498. By Florian Boucault on 2015-09-23

When going back from editing an existing contact, do not go directly back to the contact list.

499. By Florian Boucault on 2015-09-23

Removed dead code.

500. By Florian Boucault on 2015-09-23

Support case when pageStack is still a PageStack.

501. By Florian Boucault on 2015-09-24

use content-hub 1.3 imports

Robert Bruce Park (robru) wrote :

Comment inline.

review: Needs Fixing
502. By Florian Boucault on 2015-09-24

debian: fixed versioning vs arch ordering.

503. By Florian Boucault on 2015-09-24

Removed edit cancellation dialog.

504. By Florian Boucault on 2015-09-25

Reverted content hub 13

505. By Florian Boucault on 2015-10-16

Merged from multicolumns branch

506. By Florian Boucault on 2015-10-23

Merged lp:~renatofilho/address-book-app/fix-bottom-edge

507. By Florian Boucault on 2015-10-23

Moved ContactDelegate.qml up in qmldir together with the other public APIs

508. By Florian Boucault on 2015-10-23

Moved public APIs of elements to their beginning.

509. By Florian Boucault on 2015-10-23

Merged lp:~renatofilho/address-book-app/code-style-fix

510. By Florian Boucault on 2015-10-23

Merged from trunk

511. By Florian Boucault on 2015-10-23

Merged lp:~renatofilho/address-book-app/fix-close-animation

512. By Florian Boucault on 2015-10-26

Switched all imports of QtQuick to version 2.4

looks good

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'examples/contenthub.qml'
2--- examples/contenthub.qml 2013-12-12 23:21:33 +0000
3+++ examples/contenthub.qml 2015-10-26 13:18:18 +0000
4@@ -1,4 +1,4 @@
5-import QtQuick 2.0
6+import QtQuick 2.4
7 import Ubuntu.Components 0.1
8 import Ubuntu.Content 0.1
9 import QtContacts 5.0
10
11=== modified file 'src/imports/ABContactEditorPage.qml'
12--- src/imports/ABContactEditorPage.qml 2015-10-26 13:18:17 +0000
13+++ src/imports/ABContactEditorPage.qml 2015-10-26 13:18:18 +0000
14@@ -14,7 +14,7 @@
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18-import QtQuick 2.2
19+import QtQuick 2.4
20 import QtContacts 5.0
21
22 import Ubuntu.Components 1.3
23@@ -25,20 +25,25 @@
24 id: root
25 objectName: "contactEditorPage"
26
27+ property alias backIconName: backAction.iconName
28+
29 head.backAction: Action {
30+ id: backAction
31+
32 objectName: "cancel"
33+ name: "cancel"
34
35 text: i18n.tr("Cancel")
36 iconName: "back"
37 onTriggered: {
38 root.cancel()
39- root.active = false
40 }
41 }
42
43 head.actions: [
44 Action {
45 objectName: "save"
46+ name: "save"
47
48 text: i18n.tr("Save")
49 iconName: "ok"
50
51=== modified file 'src/imports/ABContactListPage.qml'
52--- src/imports/ABContactListPage.qml 2015-10-26 13:18:17 +0000
53+++ src/imports/ABContactListPage.qml 2015-10-26 13:18:18 +0000
54@@ -1,4 +1,4 @@
55-/*
56+/*
57 * Copyright (C) 2012-2015 Canonical, Ltd.
58 *
59 * This program is free software; you can redistribute it and/or modify
60@@ -14,7 +14,7 @@
61 * along with this program. If not, see <http://www.gnu.org/licenses/>.
62 */
63
64-import QtQuick 2.2
65+import QtQuick 2.4
66 import QtContacts 5.0
67
68 import Ubuntu.Components 1.3
69@@ -26,7 +26,7 @@
70 import Ubuntu.AddressBook.Base 0.1
71 import Ubuntu.AddressBook.ContactShare 0.1
72
73-ContactsUI.PageWithBottomEdge {
74+Page {
75 id: mainPage
76 objectName: "contactListPage"
77
78@@ -36,7 +36,10 @@
79 property QtObject contactIndex: null
80 property string newPhoneToAdd: ""
81 property alias contactManager: contactList.manager
82+ property Page contactViewPage: null
83+ property Page contactEditorPage: null
84
85+ readonly property bool bottomEdgePageOpened: bottomEdge.opened && bottomEdge.fullLoaded
86 readonly property bool isEmpty: (contactList.count === 0)
87 readonly property bool allowToQuit: (application.callbackApplication.length > 0)
88 readonly property var contactModel: contactList.listModel ? contactList.listModel : null
89@@ -55,40 +58,53 @@
90
91 function createContactWithPhoneNumber(phoneNumber)
92 {
93- var newContact = ContactsJS.createEmptyContact(phoneNumber, mainPage)
94- //WORKAROUND: SKD changes the page header as soon as the page get created
95- // setting active false will avoid that
96- if (bottomEdgeEnabled) {
97- mainPage.showBottomEdgePage(Qt.resolvedUrl("ABContactEditorPage.qml"),
98- {model: contactList.listModel,
99- contact: newContact,
100- active: false,
101- enabled: false,
102- initialFocusSection: "name"})
103- } else {
104- pageStack.addPageToNextColumn(mainPage,
105+ var newContact = ContactsJS.createEmptyContact(phoneNumber, mainPage);
106+ openEditPage({model: contactList.listModel,
107+ contact: newContact,
108+ initialFocusSection: "name"},
109+ mainPage);
110+ }
111+
112+ function openEditPage(editPageProperties, sourcePage) {
113+ var incubator = pageStack.addPageToNextColumn(sourcePage,
114 Qt.resolvedUrl("ABContactEditorPage.qml"),
115- {model: contactList.listModel,
116- contact: newContact,
117- initialFocusSection: "name"})
118+ editPageProperties);
119+ incubator.onStatusChanged = function(status) {
120+ if (status == Component.Ready) {
121+ mainPage.contactEditorPage = incubator.object;
122+ }
123 }
124 }
125
126- function showContact(contactId)
127- {
128- pageStack.addPageToNextColumn(mainPage,
129+ function openViewPage(viewPageProperties) {
130+ var incubator = pageStack.addPageToNextColumn(mainPage,
131 Qt.resolvedUrl("ABContactViewPage.qml"),
132- {model: contactList.listModel,
133- contactId: contactId})
134+ viewPageProperties);
135+ incubator.onStatusChanged = function(status) {
136+ if (status == Component.Ready) {
137+ contactViewPage = incubator.object;
138+ }
139+ }
140+ }
141+
142+ function showContact(contact)
143+ {
144+ mainPage.state = "default";
145+ openViewPage({model: contactList.listModel,
146+ contact: contact});
147+ }
148+
149+ function showContactWithId(contactId)
150+ {
151+ openViewPage({model: contactList.listModel,
152+ contactId: contactId});
153 }
154
155 function addPhoneToContact(contactId, phoneNumber)
156 {
157- pageStack.addPageToNextColumn(mainPage,
158- Qt.resolvedUrl("ABContactViewPage.qml"),
159- {model: contactList.listModel,
160- contactId: contactId,
161- addPhoneToContact: phoneNumber})
162+ openViewPage({model: contactList.listModel,
163+ contactId: contactId,
164+ addPhoneToContact: phoneNumber});
165 }
166
167 function importContact(urls)
168@@ -128,16 +144,29 @@
169 contactList.reset()
170 }
171
172+ function showContactEditorPage(editorPage) {
173+ contactList.currentIndex = -1;
174+ mainPage.contactEditorPage = editorPage;
175+ pageStack.addPageToNextColumn(mainPage, editorPage);
176+ editorPage.ready();
177+ editorPage.contactSaved.connect(onNewContactSaved);
178+ }
179+
180+ function onNewContactSaved(contact) {
181+ if (pageStack.columns > 1) {
182+ showContact(contact);
183+ }
184+ }
185+
186 title: i18n.tr("Contacts")
187- bottomEdgeTitle: "+"
188- bottomEdgeEnabled: !contactList.isInSelectionMode
189
190 flickable: null
191 ContactsUI.ContactListView {
192 id: contactList
193 objectName: "contactListView"
194 showImportOptions: !mainPage.pickMode &&
195- mainPage.newPhoneToAdd === ""
196+ mainPage.newPhoneToAdd === "" &&
197+ (!mainPage.contactEditorPage || !mainPage.contactEditorPage.active)
198 anchors {
199 top: parent.top
200 left: parent.left
201@@ -147,16 +176,14 @@
202 filterTerm: searchField.text
203 multiSelectionEnabled: true
204 multipleSelection: (mainPage.pickMode && mainPage.pickMultipleContacts) || !mainPage.pickMode
205+ highlightedContact: contactViewPage ? contactViewPage.contact :
206+ contactEditorPage ? contactEditorPage.contact : null
207
208 onAddContactClicked: mainPage.createContactWithPhoneNumber(label)
209 onAddNewContactClicked: mainPage.createContactWithPhoneNumber(mainPage.newPhoneToAdd)
210
211 onContactClicked: {
212- mainPage.state = "default"
213- pageStack.addPageToNextColumn(mainPage,
214- Qt.resolvedUrl("ABContactViewPage.qml"),
215- {model: contactList.listModel,
216- contact: contact})
217+ showContact(contact);
218 }
219 onIsInSelectionModeChanged: mainPage.state = isInSelectionMode ? "selection" : "default"
220 onSelectionCanceled: {
221@@ -353,9 +380,8 @@
222 actions: selectionState.actions
223 }
224 PropertyChanges {
225- target: mainPage
226- bottomEdgeEnabled: false
227- title: " "
228+ target: bottomEdge
229+ enabled: false
230 }
231 },
232 PageHeadState {
233@@ -368,10 +394,13 @@
234 }
235 PropertyChanges {
236 target: mainPage
237- bottomEdgeEnabled: false
238 title: i18n.tr("Add contact")
239 }
240 PropertyChanges {
241+ target: bottomEdge
242+ enabled: false
243+ }
244+ PropertyChanges {
245 target: contactList
246 detailToPick: -1
247 }
248@@ -386,8 +415,8 @@
249 showAddNewButton: true
250 }
251 PropertyChanges {
252- target: mainPage
253- bottomEdgeEnabled: false
254+ target: bottomEdge
255+ enabled: false
256 }
257 }
258 ]
259@@ -397,20 +426,6 @@
260 }
261 }
262
263- // We need to reset the page proprerties in case of the page was created pre-populated,
264- // with phonenumber or contact.
265- onBottomEdgeDismissed: {
266- //WORKAROUND: SKD changes the page header as soon as the page get created
267- // setting active false will avoid that
268- var newContact = ContactsUI.ContactsJS.createEmptyContact("", mainPage)
269- mainPage.setBottomEdgePage(Qt.resolvedUrl("ABContactEditorPage.qml"),
270- {model: contactList.listModel,
271- contact: newContact,
272- active: false,
273- enabled: false,
274- initialFocusSection: "name"})
275- }
276-
277 KeyboardRectangle {
278 id: keyboard
279 }
280@@ -426,7 +441,8 @@
281 !contactList.favouritesIsSelected &&
282 mainPage.isEmpty &&
283 (mainPage.newPhoneToAdd === "") &&
284- !(contactList.filterTerm && contactList.filterTerm !== ""))
285+ !(contactList.filterTerm && contactList.filterTerm !== "")) &&
286+ bottomEdge.visible
287
288 Behavior on visible {
289 SequentialAnimation {
290@@ -526,15 +542,126 @@
291 contactList.listModel.importContacts("file://" + TEST_DATA)
292 }
293
294- mainPage.setBottomEdgePage(Qt.resolvedUrl("ABContactEditorPage.qml"),
295- {model: contactList.listModel,
296- contact: ContactsUI.ContactsJS.createEmptyContact("", mainPage),
297- active: false,
298- enabled: false,
299- initialFocusSection: "name"})
300-
301 if (pageStack) {
302 pageStack.contactListPage = mainPage
303 }
304 }
305+
306+ Component {
307+ id: editorPageBottomEdge
308+ ABContactEditorPage {
309+ backIconName: "down"
310+ implicitWidth: mainPage.width
311+ implicitHeight: mainPage.height
312+ model: contactList.listModel
313+ contact: ContactsJS.createEmptyContact("", mainPage)
314+ initialFocusSection: "name"
315+ enabled: false
316+ }
317+ }
318+
319+ Component {
320+ id: emptyContact
321+ ContactsUI.ContactDelegate {
322+ property Contact contact: Contact {
323+ Name {
324+ firstName: i18n.tr("New contact")
325+ }
326+ Avatar {
327+ imageUrl: "image://theme/contact"
328+ }
329+ }
330+ width: mainPage.width
331+ }
332+ }
333+
334+ BottomEdge {
335+ id: bottomEdge
336+ objectName: "bottomEdge"
337+
338+ property var incubator
339+
340+ // FIXME: this is a workaround for the lack of fully asynchronous loading
341+ // of Pages in AdaptativePageLayout
342+ function createObjectAsynchronously(url, properties, callback) {
343+ var component = Qt.createComponent(url, Component.Asynchronous);
344+ if (component.status == Component.Ready) {
345+ incubateObject(component, properties, callback);
346+ } else {
347+ component.onStatusChanged.connect(function(status) {
348+ if (status == Component.Ready) {
349+ incubateObject(component, properties, callback);
350+ }
351+ });
352+ }
353+ }
354+
355+ function incubateObject(component, properties, callback) {
356+ if (component.status == Component.Ready) {
357+ incubator = component.incubateObject(null,
358+ properties,
359+ Qt.Asynchronous);
360+ incubator.onStatusChanged = function(status) {
361+ if (status == Component.Ready) {
362+ callback(incubator.object);
363+ incubator = null;
364+ }
365+ }
366+ }
367+ }
368+
369+ function loadEditorPage() {
370+ var newContact = ContactsJS.createEmptyContact("", mainPage);
371+ createObjectAsynchronously(Qt.resolvedUrl("ABContactEditorPage.qml"),
372+ {model: contactList.listModel,
373+ contact: newContact,
374+ initialFocusSection: "name"},
375+ showContactEditorPage);
376+ }
377+
378+ anchors.fill: parent
379+ contentComponent: pageStack.columns == 1 ? editorPageBottomEdge : emptyContact
380+ flickable: contactList
381+ iconName: "contact-new"
382+ enabled: !contactList.isInSelectionMode
383+ backGroundEffectEnabled: pageStack.columns === 1
384+
385+ onOpenBegin: {
386+ contactList.prepareNewContact = true;
387+ contactList.positionViewAtBeginning();
388+ if (pageStack.columns > 1) {
389+ loadEditorPage();
390+ }
391+ }
392+ onOpenEnd: {
393+ bottomEdge.visible = false;
394+ contactList.showNewContact = true;
395+ if (pageStack.columns <= 1) {
396+ showContactEditorPage(bottomEdge.content);
397+ }
398+ }
399+
400+ onClicked: {
401+ bottomEdge.open();
402+ }
403+ }
404+
405+ Connections {
406+ target: mainPage.contactViewPage
407+ onEditContact: {
408+ openEditPage(editPageProperties, mainPage.contactViewPage);
409+ }
410+ }
411+
412+ Connections {
413+ target: mainPage.contactEditorPage
414+ onActiveChanged: {
415+ if (!mainPage.contactEditorPage.active) {
416+ contactList.prepareNewContact = false;
417+ contactList.showNewContact = false;
418+ bottomEdge.visible = true;
419+ bottomEdge.close();
420+ }
421+ }
422+ }
423 }
424
425=== modified file 'src/imports/ABContactViewPage.qml'
426--- src/imports/ABContactViewPage.qml 2015-10-26 13:18:17 +0000
427+++ src/imports/ABContactViewPage.qml 2015-10-26 13:18:18 +0000
428@@ -14,7 +14,7 @@
429 * along with this program. If not, see <http://www.gnu.org/licenses/>.
430 */
431
432-import QtQuick 2.2
433+import QtQuick 2.4
434 import Ubuntu.Components 1.3
435 import Ubuntu.Components.Popups 1.3 as Popups
436 import Ubuntu.Contacts 0.1
437@@ -28,10 +28,13 @@
438 objectName: "contactViewPage"
439
440 property string addPhoneToContact: ""
441+ signal editContact(var editPageProperties)
442
443 head.actions: [
444 Action {
445 objectName: "share"
446+ name: "share"
447+
448 text: i18n.tr("Share")
449 iconName: "share"
450 onTriggered: {
451@@ -43,13 +46,13 @@
452 },
453 Action {
454 objectName: "edit"
455+ name: "edit"
456+
457 text: i18n.tr("Edit")
458 iconName: "edit"
459 onTriggered: {
460- pageStack.addPageToCurrentColumn(root,
461- Qt.resolvedUrl("ABContactEditorPage.qml"),
462- {model: root.model,
463- contact: root.contact})
464+ editContact({model: root.model,
465+ contact: root.contact});
466 }
467 }
468 ]
469@@ -73,11 +76,10 @@
470 var newDetail = Qt.createQmlObject(detailSourceTemplate, contact)
471 if (newDetail) {
472 contact.addDetail(newDetail)
473- pageStack.addPageToCurrentColumn(root, Qt.resolvedUrl("ABContactEditorPage.qml"),
474- { model: root.model,
475- contact: contact,
476- initialFocusSection: "phones",
477- newDetails: [newDetail]})
478+ editContact({ model: root.model,
479+ contact: contact,
480+ initialFocusSection: "phones",
481+ newDetails: [newDetail] })
482 root.addPhoneToContact = ""
483 }
484 }
485
486=== added file 'src/imports/BottomEdge.qml'
487--- src/imports/BottomEdge.qml 1970-01-01 00:00:00 +0000
488+++ src/imports/BottomEdge.qml 2015-10-26 13:18:18 +0000
489@@ -0,0 +1,321 @@
490+/*
491+ * Copyright (C) 2015 Canonical, Ltd.
492+ *
493+ * This program is free software; you can redistribute it and/or modify
494+ * it under the terms of the GNU General Public License as published by
495+ * the Free Software Foundation; version 3.
496+ *
497+ * This program is distributed in the hope that it will be useful,
498+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
499+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
500+ * GNU General Public License for more details.
501+ *
502+ * You should have received a copy of the GNU General Public License
503+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
504+ */
505+
506+import QtQuick 2.4
507+import Ubuntu.Components 1.3
508+
509+Item {
510+ id: bottomEdge
511+
512+ readonly property alias content: bottomEdgeLoader.item
513+ readonly property bool fullLoaded: bottomEdgeLoader.status == Loader.Ready
514+
515+ property bool opened: false
516+ property Component contentComponent
517+ property string iconName
518+ property Item flickable
519+ property alias backGroundEffectEnabled: darkBg.visible
520+
521+ signal openBegin
522+ signal openEnd
523+ signal clicked
524+ visible: enabled
525+
526+ function open() {
527+ bottomEdge.state = "expanded";
528+ }
529+
530+ function close() {
531+ bottomEdge.state = "collapsed";
532+ }
533+
534+ Rectangle {
535+ id: darkBg
536+
537+ anchors.fill: parent
538+ color: "black"
539+ opacity: 0.0
540+ }
541+
542+ Item {
543+ id: bottomEdgeBody
544+ anchors {
545+ left: parent.left
546+ right: parent.right
547+ }
548+ height: bottomEdgeContent.height
549+
550+ Item {
551+ id: bottomEdgeContent
552+ anchors {
553+ left: parent.left
554+ right: parent.right
555+ }
556+ height: bottomEdgeLoader.height
557+
558+ Item {
559+ id: bottomEdgeShadows
560+ anchors.fill: bottomEdgeContent
561+
562+ BottomEdgeShadow {
563+ anchors.bottom: parent.top
564+ }
565+
566+ BottomEdgeShadow {
567+ anchors.top: parent.bottom
568+ rotation: 180
569+ }
570+ }
571+
572+ Rectangle {
573+ anchors.fill: parent
574+ color: Theme.palette.normal.background
575+ }
576+
577+ Loader {
578+ id: bottomEdgeLoader
579+ sourceComponent: bottomEdge.contentComponent
580+ asynchronous: true
581+ }
582+ }
583+
584+
585+ BottomEdgeHint {
586+ id: bottomEdgeHint
587+
588+ anchors.bottom: bottomEdgeBody.top
589+ iconName: bottomEdge.iconName
590+ onClicked: bottomEdge.clicked()
591+
592+ Connections {
593+ target: bottomEdgeDragArea
594+ onClosedChanged: {
595+ if (!bottomEdgeDragArea.closed) {
596+ bottomEdgeHint.state = "Visible";
597+ }
598+ }
599+ }
600+
601+ Connections {
602+ target: flickable
603+ onVerticalVelocityChanged: {
604+ if (!bottomEdgeDragArea.closed) {
605+ return;
606+ }
607+
608+ if (flickable.verticalVelocity > 0) {
609+ bottomEdgeHint.state = "Hidden";
610+ } else if (flickable.verticalVelocity < 0) {
611+ bottomEdgeHint.state = "Visible";
612+ }
613+ }
614+ }
615+ }
616+ }
617+
618+
619+ state: "collapsed"
620+ states: [
621+ State {
622+ name: "collapsed"
623+ ParentChange {
624+ target: bottomEdgeContent
625+ parent: bottomEdgeBody
626+ x: 0
627+ y: 0
628+ }
629+ PropertyChanges {
630+ target: bottomEdgeBody
631+ y: bottomEdgeDragArea.drag.maximumY
632+ }
633+ PropertyChanges {
634+ target: bottomEdgeContent
635+ opacity: 0.0
636+ }
637+ PropertyChanges {
638+ target: darkBg
639+ opacity: 0.0
640+ }
641+ },
642+ State {
643+ name: "expanded"
644+ ParentChange {
645+ target: bottomEdgeContent
646+ parent: bottomEdge
647+ x: 0
648+ y: 0
649+ }
650+ PropertyChanges {
651+ target: bottomEdgeContent
652+ opacity: 1.0
653+ }
654+ PropertyChanges {
655+ target: bottomEdgeBody
656+ y: 0
657+ }
658+ PropertyChanges {
659+ target: bottomEdgeShadows
660+ opacity: 0.0
661+ visible: true
662+ }
663+ PropertyChanges {
664+ target: darkBg
665+ opacity: 0.8
666+ }
667+ },
668+ State {
669+ name: "floating"
670+ when: bottomEdgeDragArea.drag.active
671+ PropertyChanges {
672+ target: bottomEdgeContent
673+ opacity: 1.0
674+ }
675+ PropertyChanges {
676+ target: darkBg
677+ opacity: bottomEdgeBody.y > 0 ? 0.8 - (bottomEdgeBody.y / bottomEdgeDragArea.drag.maximumY) : 0.8
678+ }
679+ }
680+ ]
681+
682+ transitions: [
683+ Transition {
684+ to: "collapsed"
685+ SequentialAnimation {
686+ alwaysRunToEnd: true
687+ ParallelAnimation {
688+ ParentAnimation {
689+ UbuntuNumberAnimation {
690+ properties: "x,y"
691+ duration: UbuntuAnimation.SlowDuration
692+ target: bottomEdgeContent
693+ }
694+ }
695+ UbuntuNumberAnimation {
696+ target: bottomEdgeBody
697+ property: "y"
698+ duration: UbuntuAnimation.SlowDuration
699+ }
700+ UbuntuNumberAnimation {
701+ target: darkBg
702+ property: "opacity"
703+ duration: UbuntuAnimation.SlowDuration
704+ }
705+ }
706+ PropertyAction {
707+ target: bottomEdgeContent
708+ property: "opacity"
709+ }
710+ ScriptAction {
711+ script: {
712+ bottomEdgeLoader.active = false
713+ bottomEdgeLoader.active = true
714+ bottomEdge.opened = false
715+ }
716+ }
717+ }
718+ },
719+ Transition {
720+ to: "expanded"
721+ SequentialAnimation {
722+ alwaysRunToEnd: true
723+ ParallelAnimation {
724+ ScriptAction {
725+ script: bottomEdge.openBegin()
726+ }
727+ ParentAnimation {
728+ UbuntuNumberAnimation {
729+ properties: "x,y"
730+ duration: UbuntuAnimation.SlowDuration
731+ target: bottomEdgeContent
732+ }
733+ }
734+ UbuntuNumberAnimation {
735+ target: bottomEdgeShadows
736+ property: "opacity"
737+ duration: UbuntuAnimation.SlowDuration
738+ }
739+ UbuntuNumberAnimation {
740+ target: darkBg
741+ property: "opacity"
742+ duration: UbuntuAnimation.SlowDuration
743+ }
744+ }
745+ UbuntuNumberAnimation {
746+ target: bottomEdgeContent
747+ property: "opacity"
748+ duration: UbuntuAnimation.FastDuration
749+ }
750+ ScriptAction {
751+ script: {
752+ bottomEdge.opened = true
753+ bottomEdge.openEnd()
754+ }
755+
756+ }
757+ }
758+ }
759+ ]
760+
761+ MouseArea {
762+ id: bottomEdgeDragArea
763+ objectName: "bottomEdgeDragArea"
764+
765+ property real previousY: -1
766+ property string dragDirection: "None"
767+ property bool closed: drag.target.y == bottomEdgeDragArea.drag.maximumY
768+ && !bottomEdgeDragArea.pressed
769+
770+ preventStealing: true
771+ propagateComposedEvents: true
772+ drag {
773+ axis: Drag.YAxis
774+ target: bottomEdgeBody
775+ minimumY: 0
776+ maximumY: bottomEdge.height
777+ }
778+
779+ anchors {
780+ left: parent.left
781+ right: parent.right
782+ bottom: parent.bottom
783+ }
784+ height: bottomEdgeHint.height
785+
786+ onPressed: {
787+ previousY = mouse.y;
788+ }
789+
790+ onReleased: {
791+ if (dragDirection === "BottomToTop") {
792+ bottomEdge.state = "expanded";
793+ } else {
794+ bottomEdge.state = "collapsed";
795+ }
796+ previousY = -1;
797+ dragDirection = "None";
798+ }
799+
800+ onMouseYChanged: {
801+ var yOffset = previousY - mouseY;
802+ // skip if was a small move
803+ if (Math.abs(yOffset) <= units.gu(2)) {
804+ return;
805+ }
806+ previousY = mouseY;
807+ dragDirection = yOffset > 0 ? "BottomToTop" : "TopToBottom";
808+ }
809+ }
810+}
811
812=== added file 'src/imports/BottomEdgeShadow.qml'
813--- src/imports/BottomEdgeShadow.qml 1970-01-01 00:00:00 +0000
814+++ src/imports/BottomEdgeShadow.qml 2015-10-26 13:18:18 +0000
815@@ -0,0 +1,31 @@
816+/*
817+ * Copyright (C) 2015 Canonical, Ltd.
818+ *
819+ * This program is free software; you can redistribute it and/or modify
820+ * it under the terms of the GNU General Public License as published by
821+ * the Free Software Foundation; version 3.
822+ *
823+ * This program is distributed in the hope that it will be useful,
824+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
825+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
826+ * GNU General Public License for more details.
827+ *
828+ * You should have received a copy of the GNU General Public License
829+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
830+ */
831+
832+import QtQuick 2.4
833+import Ubuntu.Components 1.3
834+
835+Rectangle {
836+ id: bottomEdgeShadow
837+ anchors {
838+ left: parent.left
839+ right: parent.right
840+ }
841+ height: units.gu(1)
842+ gradient: Gradient {
843+ GradientStop { position: 0.0; color: Qt.rgba(0.0, 0.0, 0.0, 0.0) }
844+ GradientStop { position: 1.0; color: Qt.rgba(0.0, 0.0, 0.0, 0.3) }
845+ }
846+}
847
848=== modified file 'src/imports/CMakeLists.txt'
849--- src/imports/CMakeLists.txt 2015-09-03 17:15:32 +0000
850+++ src/imports/CMakeLists.txt 2015-10-26 13:18:18 +0000
851@@ -7,6 +7,8 @@
852 ContentHubProxy.qml
853 MainWindow.qml
854 VCardImportDialog.qml
855+ BottomEdgeShadow.qml
856+ BottomEdge.qml
857 )
858
859 install(FILES ${ADDRESS_BOOK_APP_QMLS}
860
861=== modified file 'src/imports/ContentHubProxy.qml'
862--- src/imports/ContentHubProxy.qml 2015-05-07 17:27:16 +0000
863+++ src/imports/ContentHubProxy.qml 2015-10-26 13:18:18 +0000
864@@ -14,7 +14,7 @@
865 * along with this program. If not, see <http://www.gnu.org/licenses/>.
866 */
867
868-import QtQuick 2.2
869+import QtQuick 2.4
870 import Ubuntu.Content 0.1 as ContentHub
871
872 QtObject {
873
874=== modified file 'src/imports/MainWindow.qml'
875--- src/imports/MainWindow.qml 2015-10-26 13:18:17 +0000
876+++ src/imports/MainWindow.qml 2015-10-26 13:18:18 +0000
877@@ -14,7 +14,7 @@
878 * along with this program. If not, see <http://www.gnu.org/licenses/>.
879 */
880
881-import QtQuick 2.2
882+import QtQuick 2.4
883 import Ubuntu.Components 1.3
884 import Ubuntu.Components.Popups 1.3 as Popups
885
886@@ -31,7 +31,7 @@
887 {
888 mainStack.resetStack()
889 if (mainStack.contactListPage) {
890- mainStack.contactListPage.showContact(contactId)
891+ mainStack.contactListPage.showContactWithId(contactId)
892 } else {
893 console.error("Contact preview requested but ContactListPage not loaded")
894 }
895@@ -122,10 +122,30 @@
896 }
897
898 anchors.fill: parent
899+ layouts: [
900+ PageColumnsLayout {
901+ when: mainStack.width >= units.gu(80)
902+ PageColumn {
903+ maximumWidth: units.gu(50)
904+ minimumWidth: units.gu(40)
905+ preferredWidth: units.gu(40)
906+ }
907+ PageColumn {
908+ fillWidth: true
909+ }
910+ },
911+ PageColumnsLayout {
912+ when: true
913+ PageColumn {
914+ fillWidth: true
915+ }
916+ }
917+ ]
918 }
919
920 ABContactListPage {
921 id: contactPage
922+ pageStack: mainStack
923 }
924
925 Component.onCompleted: {
926
927=== modified file 'src/imports/Settings/MyselfPhoneNumbersModel.qml'
928--- src/imports/Settings/MyselfPhoneNumbersModel.qml 2015-03-16 12:57:43 +0000
929+++ src/imports/Settings/MyselfPhoneNumbersModel.qml 2015-10-26 13:18:18 +0000
930@@ -14,7 +14,7 @@
931 * along with this program. If not, see <http://www.gnu.org/licenses/>.
932 */
933
934-import QtQuick 2.2
935+import QtQuick 2.4
936 import MeeGo.QOfono 0.2
937 import Ubuntu.Telephony.PhoneNumber 0.1
938
939
940=== modified file 'src/imports/Settings/SettingsPage.qml'
941--- src/imports/Settings/SettingsPage.qml 2015-10-26 13:18:17 +0000
942+++ src/imports/Settings/SettingsPage.qml 2015-10-26 13:18:18 +0000
943@@ -14,7 +14,7 @@
944 * along with this program. If not, see <http://www.gnu.org/licenses/>.
945 */
946
947-import QtQuick 2.2
948+import QtQuick 2.4
949 import QtContacts 5.0
950
951 import Ubuntu.Components 1.3
952
953=== modified file 'src/imports/Ubuntu/AddressBook/Base/ContactDetailBase.qml'
954--- src/imports/Ubuntu/AddressBook/Base/ContactDetailBase.qml 2015-10-26 13:18:17 +0000
955+++ src/imports/Ubuntu/AddressBook/Base/ContactDetailBase.qml 2015-10-26 13:18:18 +0000
956@@ -14,7 +14,7 @@
957 * along with this program. If not, see <http://www.gnu.org/licenses/>.
958 */
959
960-import QtQuick 2.2
961+import QtQuick 2.4
962 import QtContacts 5.0 as QtContacts
963 import Ubuntu.Components.ListItems 1.3 as ListItem
964
965
966=== modified file 'src/imports/Ubuntu/AddressBook/Base/ContactDetailGroupBase.qml'
967--- src/imports/Ubuntu/AddressBook/Base/ContactDetailGroupBase.qml 2015-05-07 17:27:16 +0000
968+++ src/imports/Ubuntu/AddressBook/Base/ContactDetailGroupBase.qml 2015-10-26 13:18:18 +0000
969@@ -14,7 +14,7 @@
970 * along with this program. If not, see <http://www.gnu.org/licenses/>.
971 */
972
973-import QtQuick 2.2
974+import QtQuick 2.4
975
976 FocusScope {
977 id: root
978
979=== modified file 'src/imports/Ubuntu/AddressBook/Base/ContactDetailGroupWithTypeBase.qml'
980--- src/imports/Ubuntu/AddressBook/Base/ContactDetailGroupWithTypeBase.qml 2015-05-07 17:27:16 +0000
981+++ src/imports/Ubuntu/AddressBook/Base/ContactDetailGroupWithTypeBase.qml 2015-10-26 13:18:18 +0000
982@@ -14,7 +14,7 @@
983 * along with this program. If not, see <http://www.gnu.org/licenses/>.
984 */
985
986-import QtQuick 2.2
987+import QtQuick 2.4
988 import QtContacts 5.0 as QtContacts
989
990 ContactDetailGroupBase {
991
992=== modified file 'src/imports/Ubuntu/AddressBook/Base/ContactDetailItem.qml'
993--- src/imports/Ubuntu/AddressBook/Base/ContactDetailItem.qml 2015-10-26 13:18:17 +0000
994+++ src/imports/Ubuntu/AddressBook/Base/ContactDetailItem.qml 2015-10-26 13:18:18 +0000
995@@ -14,7 +14,7 @@
996 * along with this program. If not, see <http://www.gnu.org/licenses/>.
997 */
998
999-import QtQuick 2.2
1000+import QtQuick 2.4
1001
1002 import Ubuntu.Components 1.3
1003 import Ubuntu.Contacts 0.1
1004
1005=== modified file 'src/imports/Ubuntu/AddressBook/Base/ContactExporter.qml'
1006--- src/imports/Ubuntu/AddressBook/Base/ContactExporter.qml 2015-10-26 13:18:17 +0000
1007+++ src/imports/Ubuntu/AddressBook/Base/ContactExporter.qml 2015-10-26 13:18:18 +0000
1008@@ -14,7 +14,7 @@
1009 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1010 */
1011
1012-import QtQuick 2.2
1013+import QtQuick 2.4
1014 import QtContacts 5.0
1015
1016 import Ubuntu.Components 1.3
1017
1018=== modified file 'src/imports/Ubuntu/AddressBook/Base/KeyboardRectangle.qml'
1019--- src/imports/Ubuntu/AddressBook/Base/KeyboardRectangle.qml 2015-05-07 17:27:16 +0000
1020+++ src/imports/Ubuntu/AddressBook/Base/KeyboardRectangle.qml 2015-10-26 13:18:18 +0000
1021@@ -14,7 +14,7 @@
1022 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1023 */
1024
1025-import QtQuick 2.2
1026+import QtQuick 2.4
1027
1028 Item {
1029 id: keyboardRect
1030
1031=== modified file 'src/imports/Ubuntu/AddressBook/Base/RemoveContactsDialog.qml'
1032--- src/imports/Ubuntu/AddressBook/Base/RemoveContactsDialog.qml 2015-10-26 13:18:17 +0000
1033+++ src/imports/Ubuntu/AddressBook/Base/RemoveContactsDialog.qml 2015-10-26 13:18:18 +0000
1034@@ -14,7 +14,7 @@
1035 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1036 */
1037
1038-import QtQuick 2.2
1039+import QtQuick 2.4
1040 import Ubuntu.Components 1.3
1041 import Ubuntu.Components.Popups 1.3
1042
1043
1044=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/AvatarImport.qml'
1045--- src/imports/Ubuntu/AddressBook/ContactEditor/AvatarImport.qml 2015-10-26 13:18:17 +0000
1046+++ src/imports/Ubuntu/AddressBook/ContactEditor/AvatarImport.qml 2015-10-26 13:18:18 +0000
1047@@ -14,7 +14,7 @@
1048 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1049 */
1050
1051-import QtQuick 2.2
1052+import QtQuick 2.4
1053
1054 import Ubuntu.Components 1.3
1055 import Ubuntu.Components.Popups 1.3
1056
1057=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ComboButtonAddField.qml'
1058--- src/imports/Ubuntu/AddressBook/ContactEditor/ComboButtonAddField.qml 2015-10-26 13:18:17 +0000
1059+++ src/imports/Ubuntu/AddressBook/ContactEditor/ComboButtonAddField.qml 2015-10-26 13:18:18 +0000
1060@@ -14,7 +14,7 @@
1061 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1062 */
1063
1064-import QtQuick 2.2
1065+import QtQuick 2.4
1066 import QtContacts 5.0
1067
1068 import Ubuntu.Components 1.3
1069
1070=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailAddressesEditor.qml'
1071--- src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailAddressesEditor.qml 2015-05-07 17:27:16 +0000
1072+++ src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailAddressesEditor.qml 2015-10-26 13:18:18 +0000
1073@@ -14,7 +14,7 @@
1074 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1075 */
1076
1077-import QtQuick 2.2
1078+import QtQuick 2.4
1079 import QtContacts 5.0
1080
1081 import Ubuntu.Contacts 0.1
1082
1083=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailAvatarEditor.qml'
1084--- src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailAvatarEditor.qml 2015-10-26 13:18:17 +0000
1085+++ src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailAvatarEditor.qml 2015-10-26 13:18:18 +0000
1086@@ -14,7 +14,7 @@
1087 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1088 */
1089
1090-import QtQuick 2.2
1091+import QtQuick 2.4
1092 import QtContacts 5.0
1093
1094 import Ubuntu.Components 1.3
1095@@ -73,12 +73,12 @@
1096 radius: "medium"
1097 anchors.fill: parent
1098 source: avatarImage.source != defaultAvatar ? avatarImage : null
1099+ sourceFillMode: UbuntuShape.PreserveAspectCrop
1100
1101 Image {
1102 id: avatarImage
1103 objectName: "avatarImage"
1104
1105- fillMode: Image.PreserveAspectCrop
1106 asynchronous: true
1107 source: root.getAvatar(root.detail)
1108 anchors.centerIn: visible ? avatar : undefined
1109
1110=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailEmailsEditor.qml'
1111--- src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailEmailsEditor.qml 2015-05-07 17:27:16 +0000
1112+++ src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailEmailsEditor.qml 2015-10-26 13:18:18 +0000
1113@@ -14,7 +14,7 @@
1114 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1115 */
1116
1117-import QtQuick 2.2
1118+import QtQuick 2.4
1119 import QtContacts 5.0
1120
1121 import Ubuntu.Contacts 0.1
1122
1123=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailGroupWithTypeEditor.qml'
1124--- src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailGroupWithTypeEditor.qml 2015-10-26 13:18:17 +0000
1125+++ src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailGroupWithTypeEditor.qml 2015-10-26 13:18:18 +0000
1126@@ -14,7 +14,7 @@
1127 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1128 */
1129
1130-import QtQuick 2.2
1131+import QtQuick 2.4
1132 import QtContacts 5.0
1133
1134 import Ubuntu.Components 1.3
1135
1136=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailNameEditor.qml'
1137--- src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailNameEditor.qml 2015-10-26 13:18:17 +0000
1138+++ src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailNameEditor.qml 2015-10-26 13:18:18 +0000
1139@@ -14,7 +14,7 @@
1140 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1141 */
1142
1143-import QtQuick 2.2
1144+import QtQuick 2.4
1145 import QtContacts 5.0
1146
1147 import Ubuntu.Components 1.3
1148
1149=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailOnlineAccountsEditor.qml'
1150--- src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailOnlineAccountsEditor.qml 2015-05-07 17:27:16 +0000
1151+++ src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailOnlineAccountsEditor.qml 2015-10-26 13:18:18 +0000
1152@@ -14,7 +14,7 @@
1153 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1154 */
1155
1156-import QtQuick 2.2
1157+import QtQuick 2.4
1158 import QtContacts 5.0
1159
1160 import Ubuntu.Contacts 0.1
1161
1162=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailOrganizationsEditor.qml'
1163--- src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailOrganizationsEditor.qml 2015-05-07 17:27:16 +0000
1164+++ src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailOrganizationsEditor.qml 2015-10-26 13:18:18 +0000
1165@@ -14,7 +14,7 @@
1166 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1167 */
1168
1169-import QtQuick 2.2
1170+import QtQuick 2.4
1171 import QtContacts 5.0
1172
1173 ContactDetailGroupWithTypeEditor {
1174
1175=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailPhoneNumbersEditor.qml'
1176--- src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailPhoneNumbersEditor.qml 2015-05-07 17:27:16 +0000
1177+++ src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailPhoneNumbersEditor.qml 2015-10-26 13:18:18 +0000
1178@@ -14,7 +14,7 @@
1179 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1180 */
1181
1182-import QtQuick 2.2
1183+import QtQuick 2.4
1184 import QtContacts 5.0
1185
1186 import Ubuntu.Contacts 0.1
1187
1188=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailSyncTargetEditor.qml'
1189--- src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailSyncTargetEditor.qml 2015-10-26 13:18:17 +0000
1190+++ src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailSyncTargetEditor.qml 2015-10-26 13:18:18 +0000
1191@@ -14,7 +14,7 @@
1192 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1193 */
1194
1195-import QtQuick 2.2
1196+import QtQuick 2.4
1197 import QtContacts 5.0
1198
1199 import Ubuntu.Components 1.3
1200
1201=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailWithTypeEditor.qml'
1202--- src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailWithTypeEditor.qml 2015-10-26 13:18:17 +0000
1203+++ src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailWithTypeEditor.qml 2015-10-26 13:18:18 +0000
1204@@ -14,7 +14,7 @@
1205 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1206 */
1207
1208-import QtQuick 2.2
1209+import QtQuick 2.4
1210 import QtContacts 5.0
1211
1212 import Ubuntu.Components 1.3
1213
1214=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ContactEditorPage.qml'
1215--- src/imports/Ubuntu/AddressBook/ContactEditor/ContactEditorPage.qml 2015-10-26 13:18:17 +0000
1216+++ src/imports/Ubuntu/AddressBook/ContactEditor/ContactEditorPage.qml 2015-10-26 13:18:18 +0000
1217@@ -14,7 +14,7 @@
1218 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1219 */
1220
1221-import QtQuick 2.2
1222+import QtQuick 2.4
1223 import QtContacts 5.0
1224
1225 import Ubuntu.Components 1.3
1226@@ -55,7 +55,11 @@
1227 field.cancel()
1228 }
1229 }
1230- pageStack.removePages(contactEditor)
1231+ if (pageStack.removePages) {
1232+ pageStack.removePages(contactEditor)
1233+ } else {
1234+ pageStack.pop()
1235+ }
1236 }
1237
1238 function save() {
1239@@ -93,7 +97,11 @@
1240 contactEditor.contactSaved(contact)
1241 }
1242 }
1243- pageStack.removePages(contactEditor)
1244+ if (pageStack.removePages) {
1245+ pageStack.removePages(contactEditor)
1246+ } else {
1247+ pageStack.pop()
1248+ }
1249 }
1250
1251 function makeMeVisible(item) {
1252@@ -136,7 +144,6 @@
1253 nameEditor.fieldDelegates[0].forceActiveFocus()
1254 break;
1255 }
1256- contactEditor.initialFocusSection = ""
1257 }
1258
1259 function focusToLastPhoneField()
1260@@ -473,7 +480,12 @@
1261 // WORKAROUND: SDK element crash if pop the page where the dialog was created
1262 Component.onDestruction: {
1263 if (popPages) {
1264- contactEditor.pageStack.removePages(contactEditor)
1265+ if (contactEditor.pageStack.removePages) {
1266+ contactEditor.pageStack.removePages(contactEditor)
1267+ } else {
1268+ contactEditor.pageStack.pop() // editor page
1269+ contactEditor.pageStack.pop() // view page
1270+ }
1271 }
1272 }
1273 }
1274
1275=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/TextInputDetail.qml'
1276--- src/imports/Ubuntu/AddressBook/ContactEditor/TextInputDetail.qml 2015-10-26 13:18:17 +0000
1277+++ src/imports/Ubuntu/AddressBook/ContactEditor/TextInputDetail.qml 2015-10-26 13:18:18 +0000
1278@@ -14,7 +14,7 @@
1279 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1280 */
1281
1282-import QtQuick 2.2
1283+import QtQuick 2.4
1284 import Ubuntu.Components 1.3
1285 import Ubuntu.Keyboard 0.1
1286 import Ubuntu.Telephony.PhoneNumber 0.1
1287
1288=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ValueSelector.qml'
1289--- src/imports/Ubuntu/AddressBook/ContactEditor/ValueSelector.qml 2015-10-26 13:18:17 +0000
1290+++ src/imports/Ubuntu/AddressBook/ContactEditor/ValueSelector.qml 2015-10-26 13:18:18 +0000
1291@@ -14,7 +14,7 @@
1292 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1293 */
1294
1295-import QtQuick 2.2
1296+import QtQuick 2.4
1297 import Ubuntu.Components 1.3
1298
1299 Item {
1300
1301=== modified file 'src/imports/Ubuntu/AddressBook/ContactShare/ContactSharePage.qml'
1302--- src/imports/Ubuntu/AddressBook/ContactShare/ContactSharePage.qml 2015-10-26 13:18:17 +0000
1303+++ src/imports/Ubuntu/AddressBook/ContactShare/ContactSharePage.qml 2015-10-26 13:18:18 +0000
1304@@ -14,7 +14,7 @@
1305 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1306 */
1307
1308-import QtQuick 2.2
1309+import QtQuick 2.4
1310 import QtContacts 5.0
1311
1312 import Ubuntu.Components 1.3
1313@@ -31,6 +31,8 @@
1314 signal canceled()
1315 signal completed()
1316
1317+ // invisible header
1318+ header: Item { height: 0 }
1319 ContentHub.ContentPeerPicker {
1320 visible: true
1321 anchors.fill: parent
1322
1323=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ActionButton.qml'
1324--- src/imports/Ubuntu/AddressBook/ContactView/ActionButton.qml 2015-10-26 13:18:17 +0000
1325+++ src/imports/Ubuntu/AddressBook/ContactView/ActionButton.qml 2015-10-26 13:18:18 +0000
1326@@ -14,7 +14,7 @@
1327 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1328 */
1329
1330-import QtQuick 2.2
1331+import QtQuick 2.4
1332 import Ubuntu.Components 1.3
1333
1334 AbstractButton {
1335
1336=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/BasicFieldView.qml'
1337--- src/imports/Ubuntu/AddressBook/ContactView/BasicFieldView.qml 2015-10-26 13:18:17 +0000
1338+++ src/imports/Ubuntu/AddressBook/ContactView/BasicFieldView.qml 2015-10-26 13:18:18 +0000
1339@@ -14,7 +14,7 @@
1340 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1341 */
1342
1343-import QtQuick 2.2
1344+import QtQuick 2.4
1345 import Ubuntu.Components 1.3
1346
1347 Item {
1348
1349=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ContactDetailAddressesView.qml'
1350--- src/imports/Ubuntu/AddressBook/ContactView/ContactDetailAddressesView.qml 2015-10-26 13:18:17 +0000
1351+++ src/imports/Ubuntu/AddressBook/ContactView/ContactDetailAddressesView.qml 2015-10-26 13:18:18 +0000
1352@@ -14,7 +14,7 @@
1353 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1354 */
1355
1356-import QtQuick 2.2
1357+import QtQuick 2.4
1358 import QtContacts 5.0 as QtContacts
1359 import Ubuntu.Components 1.3
1360
1361
1362=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ContactDetailAvatarView.qml'
1363--- src/imports/Ubuntu/AddressBook/ContactView/ContactDetailAvatarView.qml 2015-10-26 13:18:17 +0000
1364+++ src/imports/Ubuntu/AddressBook/ContactView/ContactDetailAvatarView.qml 2015-10-26 13:18:18 +0000
1365@@ -14,7 +14,7 @@
1366 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1367 */
1368
1369-import QtQuick 2.2
1370+import QtQuick 2.4
1371 import QtGraphicalEffects 1.0
1372 import QtContacts 5.0
1373 import Ubuntu.Components 1.3
1374
1375=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ContactDetailEmailsView.qml'
1376--- src/imports/Ubuntu/AddressBook/ContactView/ContactDetailEmailsView.qml 2015-10-26 13:18:17 +0000
1377+++ src/imports/Ubuntu/AddressBook/ContactView/ContactDetailEmailsView.qml 2015-10-26 13:18:18 +0000
1378@@ -14,7 +14,7 @@
1379 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1380 */
1381
1382-import QtQuick 2.2
1383+import QtQuick 2.4
1384 import QtContacts 5.0 as QtContacts
1385 import Ubuntu.Components 1.3
1386
1387
1388=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ContactDetailGroupWithTypeView.qml'
1389--- src/imports/Ubuntu/AddressBook/ContactView/ContactDetailGroupWithTypeView.qml 2015-10-26 13:18:17 +0000
1390+++ src/imports/Ubuntu/AddressBook/ContactView/ContactDetailGroupWithTypeView.qml 2015-10-26 13:18:18 +0000
1391@@ -14,7 +14,7 @@
1392 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1393 */
1394
1395-import QtQuick 2.2
1396+import QtQuick 2.4
1397 import QtContacts 5.0 as QtContacts
1398
1399 import Ubuntu.Components 1.3
1400
1401=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ContactDetailNameView.qml'
1402--- src/imports/Ubuntu/AddressBook/ContactView/ContactDetailNameView.qml 2015-10-26 13:18:17 +0000
1403+++ src/imports/Ubuntu/AddressBook/ContactView/ContactDetailNameView.qml 2015-10-26 13:18:18 +0000
1404@@ -14,7 +14,7 @@
1405 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1406 */
1407
1408-import QtQuick 2.2
1409+import QtQuick 2.4
1410 import Ubuntu.Components 1.3
1411 import QtContacts 5.0
1412
1413
1414=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ContactDetailOnlineAccountsView.qml'
1415--- src/imports/Ubuntu/AddressBook/ContactView/ContactDetailOnlineAccountsView.qml 2015-10-26 13:18:17 +0000
1416+++ src/imports/Ubuntu/AddressBook/ContactView/ContactDetailOnlineAccountsView.qml 2015-10-26 13:18:18 +0000
1417@@ -14,7 +14,7 @@
1418 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1419 */
1420
1421-import QtQuick 2.2
1422+import QtQuick 2.4
1423 import QtContacts 5.0 as QtContacts
1424
1425 import Ubuntu.Components 1.3
1426
1427=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ContactDetailOrganizationsView.qml'
1428--- src/imports/Ubuntu/AddressBook/ContactView/ContactDetailOrganizationsView.qml 2015-05-07 17:27:16 +0000
1429+++ src/imports/Ubuntu/AddressBook/ContactView/ContactDetailOrganizationsView.qml 2015-10-26 13:18:18 +0000
1430@@ -14,7 +14,7 @@
1431 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1432 */
1433
1434-import QtQuick 2.2
1435+import QtQuick 2.4
1436 import QtContacts 5.0 as QtContacts
1437
1438
1439
1440=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ContactDetailPhoneNumberView.qml'
1441--- src/imports/Ubuntu/AddressBook/ContactView/ContactDetailPhoneNumberView.qml 2015-05-14 18:12:33 +0000
1442+++ src/imports/Ubuntu/AddressBook/ContactView/ContactDetailPhoneNumberView.qml 2015-10-26 13:18:18 +0000
1443@@ -14,7 +14,7 @@
1444 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1445 */
1446
1447-import QtQuick 2.2
1448+import QtQuick 2.4
1449
1450 import Ubuntu.AddressBook.Base 0.1
1451
1452
1453=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ContactDetailPhoneNumbersView.qml'
1454--- src/imports/Ubuntu/AddressBook/ContactView/ContactDetailPhoneNumbersView.qml 2015-10-26 13:18:17 +0000
1455+++ src/imports/Ubuntu/AddressBook/ContactView/ContactDetailPhoneNumbersView.qml 2015-10-26 13:18:18 +0000
1456@@ -14,7 +14,7 @@
1457 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1458 */
1459
1460-import QtQuick 2.2
1461+import QtQuick 2.4
1462 import QtContacts 5.0 as QtContacts
1463
1464 import Ubuntu.Contacts 0.1
1465
1466=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ContactDetailSyncTargetView.qml'
1467--- src/imports/Ubuntu/AddressBook/ContactView/ContactDetailSyncTargetView.qml 2015-10-26 13:18:17 +0000
1468+++ src/imports/Ubuntu/AddressBook/ContactView/ContactDetailSyncTargetView.qml 2015-10-26 13:18:18 +0000
1469@@ -14,7 +14,7 @@
1470 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1471 */
1472
1473-import QtQuick 2.2
1474+import QtQuick 2.4
1475 import Ubuntu.Components 1.3
1476 import QtContacts 5.0
1477 import Ubuntu.Contacts 0.1
1478
1479=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ContactDetailWithTypeView.qml'
1480--- src/imports/Ubuntu/AddressBook/ContactView/ContactDetailWithTypeView.qml 2015-10-26 13:18:17 +0000
1481+++ src/imports/Ubuntu/AddressBook/ContactView/ContactDetailWithTypeView.qml 2015-10-26 13:18:18 +0000
1482@@ -14,7 +14,7 @@
1483 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1484 */
1485
1486-import QtQuick 2.2
1487+import QtQuick 2.4
1488 import QtContacts 5.0
1489
1490 import Ubuntu.Components 1.3
1491
1492=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ContactFetchError.qml'
1493--- src/imports/Ubuntu/AddressBook/ContactView/ContactFetchError.qml 2015-10-26 13:18:17 +0000
1494+++ src/imports/Ubuntu/AddressBook/ContactView/ContactFetchError.qml 2015-10-26 13:18:18 +0000
1495@@ -14,7 +14,7 @@
1496 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1497 */
1498
1499-import QtQuick 2.2
1500+import QtQuick 2.4
1501 import Ubuntu.Components 1.3
1502 import Ubuntu.Components.Popups 1.3
1503
1504
1505=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ContactHeaderView.qml'
1506--- src/imports/Ubuntu/AddressBook/ContactView/ContactHeaderView.qml 2015-10-26 13:18:17 +0000
1507+++ src/imports/Ubuntu/AddressBook/ContactView/ContactHeaderView.qml 2015-10-26 13:18:18 +0000
1508@@ -14,7 +14,7 @@
1509 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1510 */
1511
1512-import QtQuick 2.2
1513+import QtQuick 2.4
1514 import Ubuntu.Components 1.3
1515 import Ubuntu.Components.ListItems 1.3 as ListItem
1516
1517
1518=== modified file 'src/imports/Ubuntu/AddressBook/ContactView/ContactViewPage.qml'
1519--- src/imports/Ubuntu/AddressBook/ContactView/ContactViewPage.qml 2015-10-26 13:18:17 +0000
1520+++ src/imports/Ubuntu/AddressBook/ContactView/ContactViewPage.qml 2015-10-26 13:18:18 +0000
1521@@ -14,7 +14,7 @@
1522 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1523 */
1524
1525-import QtQuick 2.2
1526+import QtQuick 2.4
1527 import QtContacts 5.0
1528
1529 import Ubuntu.Components 1.3
1530
1531=== modified file 'src/imports/Ubuntu/Contacts/ActionButton.qml'
1532--- src/imports/Ubuntu/Contacts/ActionButton.qml 2015-10-26 13:18:17 +0000
1533+++ src/imports/Ubuntu/Contacts/ActionButton.qml 2015-10-26 13:18:18 +0000
1534@@ -14,7 +14,7 @@
1535 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1536 */
1537
1538-import QtQuick 2.2
1539+import QtQuick 2.4
1540 import Ubuntu.Components 1.3
1541
1542 AbstractButton {
1543
1544=== modified file 'src/imports/Ubuntu/Contacts/ContactAvatar.qml'
1545--- src/imports/Ubuntu/Contacts/ContactAvatar.qml 2015-10-26 13:18:17 +0000
1546+++ src/imports/Ubuntu/Contacts/ContactAvatar.qml 2015-10-26 13:18:18 +0000
1547@@ -14,7 +14,7 @@
1548 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1549 */
1550
1551-import QtQuick 2.2
1552+import QtQuick 2.4
1553 import QtContacts 5.0
1554 import Ubuntu.Components 1.3
1555 import Ubuntu.Contacts 0.1
1556@@ -51,12 +51,13 @@
1557
1558 anchors.centerIn: parent
1559 text: Contacts.contactInitialsFromString(contactDisplayName)
1560- font.pointSize: 88
1561 color: UbuntuColors.lightAubergine
1562 visible: (img.status != Image.Ready)
1563+ fontSize: "large"
1564 }
1565
1566 source: !img.visible ? img : null
1567+ sourceFillMode: UbuntuShape.PreserveAspectCrop
1568
1569 Image {
1570 id: img
1571@@ -65,7 +66,6 @@
1572 property string avatarUrl: ContactsJS.getAvatar(contactElement, fallbackAvatarUrl)
1573
1574 anchors.centerIn: visible ? avatar : undefined
1575- fillMode: Image.PreserveAspectCrop
1576 asynchronous: true
1577 source: avatar.showAvatarPicture ? avatar.avatarUrl : ""
1578 height: visible ? units.gu(3) : avatar.height
1579
1580=== modified file 'src/imports/Ubuntu/Contacts/ContactDelegate.qml'
1581--- src/imports/Ubuntu/Contacts/ContactDelegate.qml 2015-10-26 13:18:17 +0000
1582+++ src/imports/Ubuntu/Contacts/ContactDelegate.qml 2015-10-26 13:18:18 +0000
1583@@ -14,7 +14,7 @@
1584 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1585 */
1586
1587-import QtQuick 2.2
1588+import QtQuick 2.4
1589 import QtContacts 5.0
1590 import Ubuntu.Components 1.3
1591 import Ubuntu.Components.ListItems 1.3 as ListItem
1592
1593=== modified file 'src/imports/Ubuntu/Contacts/ContactDetailOnlineAccountTypeModel.qml'
1594--- src/imports/Ubuntu/Contacts/ContactDetailOnlineAccountTypeModel.qml 2015-05-07 17:27:16 +0000
1595+++ src/imports/Ubuntu/Contacts/ContactDetailOnlineAccountTypeModel.qml 2015-10-26 13:18:18 +0000
1596@@ -14,7 +14,7 @@
1597 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1598 */
1599
1600-import QtQuick 2.2
1601+import QtQuick 2.4
1602 import QtContacts 5.0 as QtContacts
1603
1604 ListModel {
1605
1606=== modified file 'src/imports/Ubuntu/Contacts/ContactDetailPhoneNumberTypeModel.qml'
1607--- src/imports/Ubuntu/Contacts/ContactDetailPhoneNumberTypeModel.qml 2015-05-07 17:27:16 +0000
1608+++ src/imports/Ubuntu/Contacts/ContactDetailPhoneNumberTypeModel.qml 2015-10-26 13:18:18 +0000
1609@@ -14,7 +14,7 @@
1610 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1611 */
1612
1613-import QtQuick 2.2
1614+import QtQuick 2.4
1615 import QtContacts 5.0 as QtContacts
1616
1617 ListModel {
1618
1619=== modified file 'src/imports/Ubuntu/Contacts/ContactDetailPickerPhoneNumberDelegate.qml'
1620--- src/imports/Ubuntu/Contacts/ContactDetailPickerPhoneNumberDelegate.qml 2015-10-26 13:18:17 +0000
1621+++ src/imports/Ubuntu/Contacts/ContactDetailPickerPhoneNumberDelegate.qml 2015-10-26 13:18:18 +0000
1622@@ -14,7 +14,7 @@
1623 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1624 */
1625
1626-import QtQuick 2.2
1627+import QtQuick 2.4
1628 import Ubuntu.Components 1.3
1629 import QtContacts 5.0 as QtContacts
1630
1631
1632=== modified file 'src/imports/Ubuntu/Contacts/ContactFetch.qml'
1633--- src/imports/Ubuntu/Contacts/ContactFetch.qml 2015-06-01 22:13:47 +0000
1634+++ src/imports/Ubuntu/Contacts/ContactFetch.qml 2015-10-26 13:18:18 +0000
1635@@ -14,7 +14,7 @@
1636 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1637 */
1638
1639-import QtQuick 2.2
1640+import QtQuick 2.4
1641
1642 Item {
1643 id: root
1644
1645=== modified file 'src/imports/Ubuntu/Contacts/ContactListButtonDelegate.qml'
1646--- src/imports/Ubuntu/Contacts/ContactListButtonDelegate.qml 2015-10-26 13:18:17 +0000
1647+++ src/imports/Ubuntu/Contacts/ContactListButtonDelegate.qml 2015-10-26 13:18:18 +0000
1648@@ -14,7 +14,7 @@
1649 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1650 */
1651
1652-import QtQuick 2.0
1653+import QtQuick 2.4
1654 import Ubuntu.Components 1.3
1655
1656 Item {
1657
1658=== modified file 'src/imports/Ubuntu/Contacts/ContactListModel.qml'
1659--- src/imports/Ubuntu/Contacts/ContactListModel.qml 2015-06-29 15:35:07 +0000
1660+++ src/imports/Ubuntu/Contacts/ContactListModel.qml 2015-10-26 13:18:18 +0000
1661@@ -14,7 +14,7 @@
1662 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1663 */
1664
1665-import QtQuick 2.2
1666+import QtQuick 2.4
1667 import QtContacts 5.0
1668 import Ubuntu.Contacts 0.1
1669
1670
1671=== modified file 'src/imports/Ubuntu/Contacts/ContactListView.qml'
1672--- src/imports/Ubuntu/Contacts/ContactListView.qml 2015-10-26 13:18:17 +0000
1673+++ src/imports/Ubuntu/Contacts/ContactListView.qml 2015-10-26 13:18:18 +0000
1674@@ -14,7 +14,7 @@
1675 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1676 */
1677
1678-import QtQuick 2.2
1679+import QtQuick 2.4
1680 import QtContacts 5.0
1681
1682 import Ubuntu.Components 1.3
1683@@ -202,6 +202,18 @@
1684 */
1685 property bool showAddNewButton: false
1686 /*!
1687+ \qmlproperty bool prepareNewContact
1688+
1689+ This property holds if space for a draft new contact should be made available or not
1690+ */
1691+ property bool prepareNewContact: false
1692+ /*!
1693+ \qmlproperty bool showNewContact
1694+
1695+ This property holds if a draft new contact should be visible or not
1696+ */
1697+ property bool showNewContact: false
1698+ /*!
1699 \qmlproperty bool syncing
1700
1701 This property holds if the list is running a sync with online accounts or not
1702@@ -230,6 +242,18 @@
1703 This property holds if the busy indicator should became visible
1704 */
1705 property bool showBusyIndicator: true
1706+ /*!
1707+ \qmlproperty real verticalVelocity
1708+
1709+ This property holds the vertical velocity of the list
1710+ */
1711+ readonly property real verticalVelocity: view.verticalVelocity
1712+ /*!
1713+ \qmlproperty Contact highlightedContact
1714+
1715+ This property holds a reference to the Contact that should be highlighted
1716+ */
1717+ property Contact highlightedContact: null
1718
1719 property var _busyDialog: null
1720
1721@@ -358,6 +382,7 @@
1722 property bool showFavourites: true
1723 property alias favouritesIsSelected: contactsModel.onlyFavorites
1724 property bool contactsLoaded: false
1725+ highlightedContact: root.highlightedContact
1726
1727 function getSectionText(index) {
1728 var tag = listModel.contacts[index].tag.tag
1729@@ -396,12 +421,26 @@
1730 anchors {
1731 left: parent.left
1732 right: parent.right
1733- margins: units.gu(1)
1734- }
1735- height: childrenRect.height
1736+ }
1737+
1738+ Connections {
1739+ target: root
1740+ onPrepareNewContactChanged: {
1741+ if (root.prepareNewContact) {
1742+ view.contentY = Qt.binding(function() {return -view.headerItem.height});
1743+ } else {
1744+ view.contentY = view.contentY;
1745+ }
1746+ }
1747+ }
1748
1749 // AddNewButton
1750 ContactListButtonDelegate {
1751+ anchors {
1752+ left: parent.left
1753+ right: parent.right
1754+ margins: units.gu(1)
1755+ }
1756 objectName: "addNewButton"
1757
1758 iconSource: "image://theme/add"
1759@@ -411,6 +450,22 @@
1760 visible: root.showAddNewButton
1761 }
1762
1763+ ContactDelegate {
1764+ property var contact: Contact {
1765+ Name {
1766+ firstName: i18n.tr("New contact")
1767+ }
1768+ Avatar {
1769+ imageUrl: "image://theme/contact"
1770+ }
1771+ }
1772+ selected: true
1773+ visible: root.prepareNewContact
1774+ height: root.prepareNewContact ? defaultHeight : 0
1775+ Behavior on height {UbuntuNumberAnimation {}}
1776+ opacity: root.showNewContact ? 1.0 : 0.0
1777+ }
1778+
1779 Column {
1780 id: importFromButtons
1781 objectName: "importFromButtons"
1782@@ -420,6 +475,7 @@
1783 anchors {
1784 left: parent.left
1785 right: parent.right
1786+ margins: units.gu(1)
1787 }
1788 height: visible ? childrenRect.height : 0
1789
1790@@ -480,6 +536,7 @@
1791 anchors {
1792 left: parent.left
1793 right: parent.right
1794+ margins: units.gu(1)
1795 }
1796 parentView: view
1797 visible: view.favouritesIsSelected
1798
1799=== modified file 'src/imports/Ubuntu/Contacts/ContactSimpleListView.qml'
1800--- src/imports/Ubuntu/Contacts/ContactSimpleListView.qml 2015-10-26 13:18:17 +0000
1801+++ src/imports/Ubuntu/Contacts/ContactSimpleListView.qml 2015-10-26 13:18:18 +0000
1802@@ -14,7 +14,7 @@
1803 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1804 */
1805
1806-import QtQuick 2.2
1807+import QtQuick 2.4
1808 import QtContacts 5.0
1809 import Ubuntu.Components 1.3
1810 import Ubuntu.Components.ListItems 1.3 as ListItem
1811@@ -144,6 +144,13 @@
1812 */
1813 property list<Action> rightSideActions
1814
1815+ /*!
1816+ \qmlproperty Contact highlightedContact
1817+
1818+ This property holds a reference to the Contact that should be highlighted
1819+ */
1820+ property Contact highlightedContact: null
1821+
1822 /* internal */
1823 property var _currentSwipedItem: null
1824
1825@@ -227,6 +234,7 @@
1826 }
1827 }
1828
1829+ highlightFollowsCurrentItem: true
1830 currentIndex: -1
1831 section {
1832 property: showSections ? "contact.tag.tag" : ""
1833@@ -261,7 +269,7 @@
1834 flicking: contactListView.flicking
1835 width: parent.width
1836 selected: (contactListView.multiSelectionEnabled && contactListView.isSelected(contactDelegate))
1837- || index === contactListView.currentIndex
1838+ || (contactListView.highlightedContact && contactListView.highlightedContact.contactId == contact.contactId)
1839 selectionMode: contactListView.isInSelectionMode
1840 defaultAvatarUrl: contactListView.defaultAvatarImageUrl
1841 isCurrentItem: ListView.isCurrentItem
1842
1843=== modified file 'src/imports/Ubuntu/Contacts/FastScroll.qml'
1844--- src/imports/Ubuntu/Contacts/FastScroll.qml 2015-10-26 13:18:17 +0000
1845+++ src/imports/Ubuntu/Contacts/FastScroll.qml 2015-10-26 13:18:18 +0000
1846@@ -40,7 +40,7 @@
1847 ****************************************************************************/
1848
1849 // FastScroll.qml
1850-import QtQuick 2.2
1851+import QtQuick 2.4
1852 import Ubuntu.Components 1.3
1853 import "FastScroll.js" as Sections
1854
1855
1856=== modified file 'src/imports/Ubuntu/Contacts/ListItemWithActions.qml'
1857--- src/imports/Ubuntu/Contacts/ListItemWithActions.qml 2015-10-26 13:18:17 +0000
1858+++ src/imports/Ubuntu/Contacts/ListItemWithActions.qml 2015-10-26 13:18:18 +0000
1859@@ -14,7 +14,7 @@
1860 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1861 */
1862
1863-import QtQuick 2.2
1864+import QtQuick 2.4
1865 import Ubuntu.Components 1.3
1866
1867 Item {
1868
1869=== modified file 'src/imports/Ubuntu/Contacts/ListItemWithActionsCheckBox.qml'
1870--- src/imports/Ubuntu/Contacts/ListItemWithActionsCheckBox.qml 2015-10-26 13:18:17 +0000
1871+++ src/imports/Ubuntu/Contacts/ListItemWithActionsCheckBox.qml 2015-10-26 13:18:18 +0000
1872@@ -14,7 +14,7 @@
1873 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1874 */
1875
1876-import QtQuick 2.2
1877+import QtQuick 2.4
1878 import Ubuntu.Components 1.3
1879
1880 CheckBox {
1881
1882=== modified file 'src/imports/Ubuntu/Contacts/MostCalledList.qml'
1883--- src/imports/Ubuntu/Contacts/MostCalledList.qml 2015-05-13 22:26:05 +0000
1884+++ src/imports/Ubuntu/Contacts/MostCalledList.qml 2015-10-26 13:18:18 +0000
1885@@ -14,7 +14,7 @@
1886 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1887 */
1888
1889-import QtQuick 2.2
1890+import QtQuick 2.4
1891
1892 Column {
1893 id: root
1894
1895=== modified file 'src/imports/Ubuntu/Contacts/MostCalledModel.qml'
1896--- src/imports/Ubuntu/Contacts/MostCalledModel.qml 2015-05-14 02:37:01 +0000
1897+++ src/imports/Ubuntu/Contacts/MostCalledModel.qml 2015-10-26 13:18:18 +0000
1898@@ -15,7 +15,7 @@
1899 */
1900
1901
1902-import QtQuick 2.2
1903+import QtQuick 2.4
1904 import QtContacts 5.0
1905
1906 import Ubuntu.History 0.1
1907
1908=== modified file 'src/imports/Ubuntu/Contacts/MultipleSelectionListView.qml'
1909--- src/imports/Ubuntu/Contacts/MultipleSelectionListView.qml 2015-10-26 13:18:17 +0000
1910+++ src/imports/Ubuntu/Contacts/MultipleSelectionListView.qml 2015-10-26 13:18:18 +0000
1911@@ -14,7 +14,7 @@
1912 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1913 */
1914
1915-import QtQuick 2.2
1916+import QtQuick 2.4
1917 import Ubuntu.Components 1.3
1918 import Ubuntu.Components.Popups 1.3 as Popups
1919
1920
1921=== modified file 'src/imports/Ubuntu/Contacts/MultipleSelectionVisualModel.qml'
1922--- src/imports/Ubuntu/Contacts/MultipleSelectionVisualModel.qml 2015-05-07 17:27:16 +0000
1923+++ src/imports/Ubuntu/Contacts/MultipleSelectionVisualModel.qml 2015-10-26 13:18:18 +0000
1924@@ -14,7 +14,7 @@
1925 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1926 */
1927
1928-import QtQuick 2.2
1929+import QtQuick 2.4
1930
1931 VisualDataModel {
1932 id: contactVisualModel
1933
1934=== modified file 'src/imports/Ubuntu/Contacts/Ofono.qml'
1935--- src/imports/Ubuntu/Contacts/Ofono.qml 2015-03-17 17:14:09 +0000
1936+++ src/imports/Ubuntu/Contacts/Ofono.qml 2015-10-26 13:18:18 +0000
1937@@ -14,7 +14,7 @@
1938 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1939 */
1940
1941-import QtQuick 2.0
1942+import QtQuick 2.4
1943 import MeeGo.QOfono 0.2
1944
1945 Item {
1946
1947=== modified file 'src/imports/Ubuntu/Contacts/OnlineAccountsDummy.qml'
1948--- src/imports/Ubuntu/Contacts/OnlineAccountsDummy.qml 2015-02-06 16:37:12 +0000
1949+++ src/imports/Ubuntu/Contacts/OnlineAccountsDummy.qml 2015-10-26 13:18:18 +0000
1950@@ -14,7 +14,7 @@
1951 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1952 */
1953
1954-import QtQuick 2.2
1955+import QtQuick 2.4
1956
1957 Item {
1958 id: root
1959
1960=== modified file 'src/imports/Ubuntu/Contacts/OnlineAccountsHelper.qml'
1961--- src/imports/Ubuntu/Contacts/OnlineAccountsHelper.qml 2015-10-26 13:18:17 +0000
1962+++ src/imports/Ubuntu/Contacts/OnlineAccountsHelper.qml 2015-10-26 13:18:18 +0000
1963@@ -14,7 +14,7 @@
1964 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1965 */
1966
1967-import QtQuick 2.2
1968+import QtQuick 2.4
1969 import Ubuntu.Components 1.3
1970 import Ubuntu.OnlineAccounts 0.1
1971 import Ubuntu.OnlineAccounts.Client 0.1
1972
1973=== modified file 'src/imports/Ubuntu/Contacts/PageWithBottomEdge.qml'
1974--- src/imports/Ubuntu/Contacts/PageWithBottomEdge.qml 2015-10-26 13:18:17 +0000
1975+++ src/imports/Ubuntu/Contacts/PageWithBottomEdge.qml 2015-10-26 13:18:18 +0000
1976@@ -62,7 +62,7 @@
1977
1978 */
1979
1980-import QtQuick 2.2
1981+import QtQuick 2.4
1982 import Ubuntu.Components 1.3
1983
1984 Page {
1985@@ -103,7 +103,7 @@
1986 {
1987 if (edgeLoader.status === Loader.Ready) {
1988 edgeLoader.item.active = true
1989- page.pageStack.addPageToCurrentColumn(page, edgeLoader.item)
1990+ page.pageStack.push(edgeLoader.item)
1991 if (edgeLoader.item.flickable) {
1992 edgeLoader.item.flickable.contentY = -page.header.height
1993 edgeLoader.item.flickable.returnToBounds()
1994
1995=== modified file 'src/imports/Ubuntu/Contacts/SIMCardImportPage.qml'
1996--- src/imports/Ubuntu/Contacts/SIMCardImportPage.qml 2015-10-26 13:18:17 +0000
1997+++ src/imports/Ubuntu/Contacts/SIMCardImportPage.qml 2015-10-26 13:18:18 +0000
1998@@ -14,7 +14,7 @@
1999 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2000 */
2001
2002-import QtQuick 2.2
2003+import QtQuick 2.4
2004 import QtContacts 5.0
2005
2006 import Ubuntu.Components 1.3
2007
2008=== modified file 'src/imports/Ubuntu/Contacts/SIMList.qml'
2009--- src/imports/Ubuntu/Contacts/SIMList.qml 2015-03-17 17:14:09 +0000
2010+++ src/imports/Ubuntu/Contacts/SIMList.qml 2015-10-26 13:18:18 +0000
2011@@ -14,7 +14,7 @@
2012 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2013 */
2014
2015-import QtQuick 2.2
2016+import QtQuick 2.4
2017
2018 import MeeGo.QOfono 0.2
2019
2020
2021=== modified file 'src/imports/Ubuntu/Contacts/SectionDelegate.qml'
2022--- src/imports/Ubuntu/Contacts/SectionDelegate.qml 2015-10-26 13:18:17 +0000
2023+++ src/imports/Ubuntu/Contacts/SectionDelegate.qml 2015-10-26 13:18:18 +0000
2024@@ -14,7 +14,7 @@
2025 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2026 */
2027
2028-import QtQuick 2.2
2029+import QtQuick 2.4
2030 import Ubuntu.Components 1.3
2031 import Ubuntu.Components.ListItems 1.3
2032
2033@@ -28,7 +28,6 @@
2034
2035 anchors.fill: parent
2036 verticalAlignment: Text.AlignVCenter
2037- font.pointSize: 76
2038 height: units.gu(3)
2039 }
2040 ThinDivider {
2041
2042=== modified file 'src/imports/Ubuntu/Contacts/SubtitledWithColors.qml'
2043--- src/imports/Ubuntu/Contacts/SubtitledWithColors.qml 2015-10-26 13:18:17 +0000
2044+++ src/imports/Ubuntu/Contacts/SubtitledWithColors.qml 2015-10-26 13:18:18 +0000
2045@@ -14,7 +14,7 @@
2046 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2047 */
2048
2049-import QtQuick 2.0
2050+import QtQuick 2.4
2051 import Ubuntu.Components 1.3
2052
2053 MouseArea {
2054
2055=== modified file 'src/imports/Ubuntu/Contacts/VCardParser.qml'
2056--- src/imports/Ubuntu/Contacts/VCardParser.qml 2014-08-13 20:52:57 +0000
2057+++ src/imports/Ubuntu/Contacts/VCardParser.qml 2015-10-26 13:18:18 +0000
2058@@ -14,7 +14,7 @@
2059 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2060 */
2061
2062-import QtQuick 2.2
2063+import QtQuick 2.4
2064 import QtContacts 5.0
2065
2066 QtObject {
2067
2068=== modified file 'src/imports/Ubuntu/Contacts/qmldir'
2069--- src/imports/Ubuntu/Contacts/qmldir 2015-04-29 14:22:40 +0000
2070+++ src/imports/Ubuntu/Contacts/qmldir 2015-10-26 13:18:18 +0000
2071@@ -3,6 +3,7 @@
2072 plugin ubuntu-contacts-qml
2073
2074 ContactAvatar 0.1 ContactAvatar.qml
2075+ContactDelegate 0.1 ContactDelegate.qml
2076 ContactDetailOnlineAccountTypeModel 0.1 ContactDetailOnlineAccountTypeModel.qml
2077 ContactDetailPhoneNumberTypeModel 0.1 ContactDetailPhoneNumberTypeModel.qml
2078 ContactFetch 0.1 ContactFetch.qml
2079@@ -20,7 +21,6 @@
2080 SIMList 0.1 SIMList.qml
2081
2082 internal ContactAvatar ContactAvatar.qml
2083-internal ContactDelegate ContactDelegate.qml
2084 internal ContactDetailPickerPhoneNumberDelegate ContactDetailPickerPhoneNumberDelegate.qml
2085 internal ContactImportButton ContactImportButton.qml
2086 internal ContactList ContactList.js
2087
2088=== modified file 'src/imports/VCardImportDialog.qml'
2089--- src/imports/VCardImportDialog.qml 2015-10-26 13:18:17 +0000
2090+++ src/imports/VCardImportDialog.qml 2015-10-26 13:18:18 +0000
2091@@ -14,7 +14,7 @@
2092 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2093 */
2094
2095-import QtQuick 2.2
2096+import QtQuick 2.4
2097 import QtContacts 5.0
2098 import Ubuntu.Components 1.3
2099 import Ubuntu.Components.Popups 1.3 as Popups
2100
2101=== modified file 'tests/autopilot/address_book_app/__init__.py'
2102--- tests/autopilot/address_book_app/__init__.py 2015-10-26 13:18:17 +0000
2103+++ tests/autopilot/address_book_app/__init__.py 2015-10-26 13:18:18 +0000
2104@@ -32,7 +32,6 @@
2105 from address_book_app import pages
2106 from address_book_app import address_book
2107
2108-
2109 logger = logging.getLogger(__name__)
2110
2111
2112@@ -65,30 +64,18 @@
2113 # ContactListPage is the only page that can appears multiple times
2114 # Ex.: During the pick mode we alway push a new contactListPage, to
2115 # preserve the current application status.
2116- contact_list_pages = self.select_many(
2117- pages.ABContactListPage, objectName='contactListPage')
2118-
2119- # alway return the page without pickMode
2120- for p in contact_list_pages:
2121- if not p.pickMode:
2122- return p
2123- return None
2124+ return self.wait_select_single(pages.ABContactListPage,
2125+ objectName='contactListPage', pickMode=False)
2126
2127 def get_contact_edit_page(self):
2128 # We can have two contact editor page because of bottom edge page
2129 # but we will return only the active one
2130- list_page = self.get_contact_list_page()
2131- list_page.bottomEdgePageLoaded.wait_for(True)
2132- contact_editor_pages = self.select_many(
2133- pages.ABContactEditorPage, objectName="contactEditorPage")
2134- for p in contact_editor_pages:
2135- if p.active:
2136- return p
2137- raise exceptions.StateNotFoundError('contactEditorPage not found')
2138+ return self.wait_select_single(objectName="contactEditorPage", active=True)
2139
2140 def get_contact_view_page(self):
2141 return self.wait_select_single(pages.ABContactViewPage,
2142- objectName="contactViewPage")
2143+ objectName="contactViewPage",
2144+ active=True)
2145
2146 def get_contact_list_pick_page(self):
2147 contact_list_pages = self.select_many(
2148@@ -100,10 +87,10 @@
2149
2150 def get_share_page(self):
2151 return self.wait_select_single("ContactSharePage",
2152- objectName="contactSharePage")
2153+ objectName="contactSharePage",
2154+ active=True)
2155
2156 def start_import_contacts(self):
2157- self.open_header()
2158 view = self.get_contact_list_view()
2159 if view.count > 0:
2160 self.click_action_button("importFromSimHeaderButton")
2161@@ -114,19 +101,37 @@
2162 self.pointing_device.click_object(import_buttom)
2163
2164 return self.wait_select_single(address_book.SIMCardImportPage,
2165- objectName="simCardImportPage")
2166+ objectName="simCardImportPage",
2167+ active=True)
2168
2169 def get_contact_list_view(self):
2170 """
2171- Returns a ContactListView iobject for the current window
2172+ Returns a ContactListView object for the current window
2173 """
2174 return self.wait_select_single("ContactListView",
2175 objectName="contactListView")
2176
2177- def get_button(self, buttonName):
2178- actionbar = self.select_single('ActionBar', objectName='headerActionBar')
2179- return actionbar._get_action_button(buttonName)
2180+ def get_action(self, action_name):
2181+ actionbars = self.select_many('ActionBar', objectName='headerActionBar')
2182+ for actionbar in actionbars:
2183+ object_name = action_name + "_action_button"
2184+ try:
2185+ button = actionbar.select_single(objectName=object_name)
2186+ if button:
2187+ return button
2188+ except introspection.dbus.StateNotFoundError:
2189+ continue
2190+ return None
2191
2192+ def click_action_button(self, action_name):
2193+ actionbars = self.select_many('ActionBar', objectName='headerActionBar')
2194+ for actionbar in actionbars:
2195+ try:
2196+ actionbar.click_action_button(action_name)
2197+ return
2198+ except ubuntuuitoolkit.ToolkitException:
2199+ continue
2200+ raise exceptions.StateNotFoundError('Action %s not found.' % action_name)
2201
2202 def open_header(self):
2203 header = self.get_header()
2204@@ -153,22 +158,36 @@
2205 """
2206 Press the 'Cancel' button
2207 """
2208- header = self.open_header()
2209- header.click_custom_back_button()
2210+ buttons = self.select_many(objectName='customBackButton')
2211+ for button in buttons:
2212+ if button.enabled and button.visible:
2213+ self.pointing_device.click_object(button)
2214+ return
2215+
2216+ #self.click_action_button("customBackButton")
2217
2218 def save(self):
2219 """
2220 Press the 'Save' button
2221 """
2222- bottom_swipe_page = self.get_contact_list_page()
2223 self.click_action_button("save")
2224- bottom_swipe_page.isCollapsed.wait_for(True)
2225+
2226+ def edit(self):
2227+ """
2228+ Press the 'Save' button
2229+ """
2230+ self.click_action_button("edit")
2231+
2232+ def delete(self):
2233+ """
2234+ Press the 'Delete' button
2235+ """
2236+ self.click_action_button("delete")
2237
2238 def confirm_import(self):
2239 """
2240 Press the 'confirm' button
2241 """
2242- self.open_header()
2243 self.click_action_button("confirmImport")
2244
2245 def get_toolbar(self):
2246@@ -182,4 +201,5 @@
2247 """
2248 bottom_swipe_page = self.get_contact_list_page()
2249 bottom_swipe_page.reveal_bottom_edge_page()
2250+
2251 return self.get_contact_edit_page()
2252
2253=== modified file 'tests/autopilot/address_book_app/address_book/_contact_view_page.py'
2254--- tests/autopilot/address_book_app/address_book/_contact_view_page.py 2015-05-11 14:21:03 +0000
2255+++ tests/autopilot/address_book_app/address_book/_contact_view_page.py 2015-10-26 13:18:18 +0000
2256@@ -19,10 +19,4 @@
2257
2258 class ContactViewPage(_common.PageWithHeader):
2259 """Autopilot helper for the ContactView page."""
2260-
2261- def go_to_edit_contact(self):
2262- self.get_header().click_action_button('edit')
2263- return self.get_root_instance().select_single(
2264- _contact_editor_page.ContactEditorPage,
2265- objectName='contactEditorPage',
2266- active=True)
2267+ pass
2268
2269=== modified file 'tests/autopilot/address_book_app/address_book/_sim_card_import_page.py'
2270--- tests/autopilot/address_book_app/address_book/_sim_card_import_page.py 2015-05-12 15:43:25 +0000
2271+++ tests/autopilot/address_book_app/address_book/_sim_card_import_page.py 2015-10-26 13:18:18 +0000
2272@@ -72,7 +72,7 @@
2273 """Return a list with the names of the contacts."""
2274 contact_delegates = self._get_sorted_contact_delegates()
2275 name_labels = [
2276- delegate.select_single('Label', objectName='nameLabel') for
2277+ delegate.select_single('UCLabel', objectName='nameLabel') for
2278 delegate in contact_delegates
2279 ]
2280 return [label.text for label in name_labels]
2281@@ -96,6 +96,6 @@
2282 contact = self._get_contact_delegate(index)
2283 self.pointing_device.click_object(contact)
2284 contacts.append(contact.select_single(
2285- 'Label', objectName='nameLabel').text)
2286+ 'UCLabel', objectName='nameLabel').text)
2287
2288 return contacts
2289
2290=== modified file 'tests/autopilot/address_book_app/pages/_ab_contact_list_page.py'
2291--- tests/autopilot/address_book_app/pages/_ab_contact_list_page.py 2015-05-13 13:25:18 +0000
2292+++ tests/autopilot/address_book_app/pages/_ab_contact_list_page.py 2015-10-26 13:18:18 +0000
2293@@ -21,9 +21,9 @@
2294
2295 import autopilot.logging
2296 import ubuntuuitoolkit
2297-
2298 import address_book_app.address_book as address_book
2299
2300+from autopilot.introspection import dbus
2301 from address_book_app.pages import ABContactViewPage
2302
2303
2304@@ -32,7 +32,7 @@
2305 log_action_debug = autopilot.logging.log_action(logging.debug)
2306
2307
2308-class ABContactListPage(address_book.PageWithHeader, address_book.PageWithBottomEdge):
2309+class ABContactListPage(address_book.PageWithHeader):
2310
2311 """Autopilot helper for the Contact List page."""
2312
2313@@ -46,8 +46,10 @@
2314 """
2315 contact_delegate = self._get_contact_delegate(index)
2316 self.pointing_device.click_object(contact_delegate)
2317+ # WORKAROUND: give some time to the view became available
2318+ time.sleep(5.0)
2319 return self.get_root_instance().select_single(
2320- ABContactViewPage, objectName='contactViewPage')
2321+ ABContactViewPage, objectName='contactViewPage', active=True)
2322
2323 def _get_contact_delegate(self, index):
2324 contact_delegates = self._get_sorted_contact_delegates()
2325@@ -108,9 +110,9 @@
2326 'ContactListView', objectName='contactListView')
2327
2328 @log_action_info
2329- def delete_selected_contacts(self):
2330- self.get_header().click_action_button('delete')
2331- self.isCollapsed.wait_for(True)
2332+ def delete_selected_contacts(self, main_window):
2333+ main_window.delete()
2334+ self.bottomEdgePageOpened.wait_for(False)
2335 dialog = self.get_root_instance().wait_select_single(
2336 address_book.RemoveContactsDialog, objectName='removeContactsDialog')
2337 dialog.confirm_removal()
2338@@ -119,7 +121,7 @@
2339 """Return a list with the names of the contacts."""
2340 contact_delegates = self._get_sorted_contact_delegates()
2341 name_labels = [
2342- delegate.select_single('Label', objectName='nameLabel') for
2343+ delegate.select_single('UCLabel', objectName='nameLabel') for
2344 delegate in contact_delegates
2345 ]
2346 return [label.text for label in name_labels]
2347@@ -136,3 +138,20 @@
2348 objectName='contactListView.importFromSimCardButton')
2349 return import_from_sim_button.visible
2350
2351+ def reveal_bottom_edge_page(self):
2352+ """Bring the bottom edge page to the screen"""
2353+ self.bottomEdgePageOpened.wait_for(False)
2354+ try:
2355+ action_item = self.wait_select_single(objectName='bottomEdgeDragArea')
2356+ action_item.enabled.wait_for(True)
2357+ start_x = (action_item.globalRect.x +
2358+ (action_item.globalRect.width * 0.5))
2359+ start_y = action_item.globalRect.y + (action_item.height * 0.2)
2360+ stop_y = start_y - (self.height * 0.7)
2361+ self.pointing_device.drag(
2362+ start_x, start_y, start_x, stop_y, rate=2)
2363+ #self pointer became invalid at this point
2364+ #self.bottomEdgePageOpened.wait_for(True)
2365+ except dbus.StateNotFoundError:
2366+ logger.error('ButtomEdge element not found.')
2367+ raise
2368
2369=== modified file 'tests/autopilot/address_book_app/tests/__init__.py'
2370--- tests/autopilot/address_book_app/tests/__init__.py 2015-04-14 22:19:01 +0000
2371+++ tests/autopilot/address_book_app/tests/__init__.py 2015-10-26 13:18:18 +0000
2372@@ -169,12 +169,12 @@
2373 list_page = self.main_window.get_contact_list_page()
2374 list_page.open_contact(index)
2375
2376- self.assertThat(list_page.visible, Eventually(Equals(False)))
2377 view_page = self.main_window.get_contact_view_page()
2378 self.assertThat(view_page.visible, Eventually(Equals(True)))
2379
2380 # Edit contact
2381- edit_page = view_page.go_to_edit_contact()
2382+ self.main_window.edit()
2383+ edit_page = self.main_window.get_contact_edit_page()
2384 self.assertThat(edit_page.visible, Eventually(Equals(True)))
2385
2386 return edit_page
2387
2388=== modified file 'tests/autopilot/address_book_app/tests/test_add_contact.py'
2389--- tests/autopilot/address_book_app/tests/test_add_contact.py 2015-05-12 15:43:25 +0000
2390+++ tests/autopilot/address_book_app/tests/test_add_contact.py 2015-10-26 13:18:18 +0000
2391@@ -36,14 +36,17 @@
2392 contact_editor = self.app.main_window.go_to_add_contact()
2393
2394 # Check if the contact list disapear and contact editor appears
2395- self.assertThat(list_page.visible, Eventually(Equals(False)))
2396+ #FIXME: list_page became an invalid pointer after push a new page
2397+ #self.assertThat(list_page.bottomEdgePageOpened, Eventually(Equals(True)))
2398 self.assertThat(contact_editor.visible, Eventually(Equals(True)))
2399+ self.assertThat(contact_editor.active, Eventually(Equals(True)))
2400
2401 # cancel new contact without save
2402 self.app.main_window.cancel()
2403
2404 # Check if the contact list is visible again
2405 self.assertThat(list_page.visible, Eventually(Equals(True)))
2406+ self.assertThat(list_page.bottomEdgePageOpened, Eventually(Equals(False)))
2407
2408 # Check if the contact list still empty
2409 list_view = self.app.main_window.get_contact_list_view()
2410@@ -115,11 +118,11 @@
2411 # Check if they have the correct label
2412 for idx in range(3):
2413 email_type = view_page.select_single(
2414- "Label",
2415+ "UCLabel",
2416 objectName="type_email_" + str(idx))
2417
2418 email_label = view_page.select_single(
2419- "Label",
2420+ "UCLabel",
2421 objectName="label_emailAddress_" + str(idx) + ".0")
2422
2423 self.assertThat(emails[email_label.text], Equals(email_type.text))
2424@@ -166,11 +169,11 @@
2425 # Check if they have the correct label
2426 for idx in range(5):
2427 phone_type = view_page.select_single(
2428- "Label",
2429+ "UCLabel",
2430 objectName="type_phoneNumber_" + str(idx))
2431
2432 phone_label = view_page.select_single(
2433- "Label",
2434+ "UCLabel",
2435 objectName="label_phoneNumber_" + str(idx) + ".0")
2436
2437 self.assertThat(phones[phone_label.text], Equals(phone_type.text))
2438
2439=== modified file 'tests/autopilot/address_book_app/tests/test_create_new_from_uri.py'
2440--- tests/autopilot/address_book_app/tests/test_create_new_from_uri.py 2014-09-02 19:23:05 +0000
2441+++ tests/autopilot/address_book_app/tests/test_create_new_from_uri.py 2015-10-26 13:18:18 +0000
2442@@ -23,16 +23,17 @@
2443
2444 def test_save_new_contact(self):
2445 list_page = self.app.main_window.get_contact_list_page()
2446- list_page.isReady.wait_for(True)
2447+ #FIXME: contacts list object became invalid after push a new page
2448+ #list_page.bottomEdgePageOpened.wait_for(True)
2449
2450 edit_page = self.app.main_window.get_contact_edit_page()
2451 self.assertThat(edit_page.visible, Eventually(Equals(True)))
2452
2453 # add name to the contact
2454- firstNameField = self.app.main_window.wait_select_single(
2455+ firstNameField = edit_page.wait_select_single(
2456 "TextInputDetail",
2457 objectName="firstName")
2458- lastNameField = self.app.main_window.wait_select_single(
2459+ lastNameField = edit_page.wait_select_single(
2460 "TextInputDetail",
2461 objectName="lastName")
2462
2463@@ -43,6 +44,7 @@
2464 self.app.main_window.save()
2465
2466 # open contact view
2467+ list_page = self.app.main_window.get_contact_list_page()
2468 list_page.open_contact(0)
2469 view_page = self.app.main_window.get_contact_view_page()
2470 self.assertThat(view_page.visible, Eventually(Equals(True)))
2471@@ -53,10 +55,10 @@
2472 objectName="phones")
2473 self.assertThat(phone_group.detailsCount, Eventually(Equals(1)))
2474 phone_type = view_page.select_single(
2475- "Label",
2476+ "UCLabel",
2477 objectName="type_phoneNumber_0")
2478 phone_label = view_page.select_single(
2479- "Label",
2480+ "UCLabel",
2481 objectName="label_phoneNumber_0.0")
2482 self.assertThat(phone_label.text, Eventually(Equals("1234567890")))
2483 self.assertThat(phone_type.text, Eventually(Equals("Mobile")))
2484
2485=== modified file 'tests/autopilot/address_book_app/tests/test_delete_contact.py'
2486--- tests/autopilot/address_book_app/tests/test_delete_contact.py 2014-09-02 19:23:05 +0000
2487+++ tests/autopilot/address_book_app/tests/test_delete_contact.py 2015-10-26 13:18:18 +0000
2488@@ -69,6 +69,6 @@
2489 if self.action == "cancel":
2490 self.app.main_window.cancel()
2491 elif self.action == "delete":
2492- list_page.delete_selected_contacts()
2493+ list_page.delete_selected_contacts(self.app.main_window)
2494
2495 self.assertEqual(list_page.get_contacts(), self.expected_result)
2496
2497=== modified file 'tests/autopilot/address_book_app/tests/test_edit_contact.py'
2498--- tests/autopilot/address_book_app/tests/test_edit_contact.py 2015-05-12 15:43:25 +0000
2499+++ tests/autopilot/address_book_app/tests/test_edit_contact.py 2015-10-26 13:18:18 +0000
2500@@ -59,7 +59,7 @@
2501
2502 # check if the new value is correct
2503 phone_label_1 = view_page.select_single(
2504- "Label",
2505+ "UCLabel",
2506 objectName="label_phoneNumber_1.0")
2507 self.assertThat(phone_label_1.text,
2508 Eventually(Equals(self.PHONE_NUMBERS[1])))
2509@@ -89,14 +89,14 @@
2510
2511 # check if we have onlye one phone
2512 view_page = list_page.open_contact(0)
2513- phone_group = view_page.select_single(
2514+ phone_group = self.main_window.wait_select_single(
2515 "ContactDetailGroupWithTypeView",
2516 objectName="phones")
2517 self.assertThat(phone_group.detailsCount, Eventually(Equals(1)))
2518
2519 # check if the new value is correct
2520- phone_label_1 = view_page.select_single(
2521- "Label",
2522+ phone_label_1 = phone_group.wait_select_single(
2523+ "UCLabel",
2524 objectName="label_phoneNumber_0.0")
2525 self.assertThat(phone_label_1.text,
2526 Eventually(Equals(self.PHONE_NUMBERS[1])))
2527@@ -119,14 +119,14 @@
2528 self.assertThat(view_page.visible, Eventually(Equals(True)))
2529
2530 # check if we have a new email
2531- email_group = view_page.select_single(
2532+ email_group = self.main_window.select_single(
2533 "ContactDetailGroupWithTypeView",
2534 objectName="emails")
2535 self.assertThat(email_group.detailsCount, Eventually(Equals(1)))
2536
2537 # check if the new value is correct
2538- email_label_1 = view_page.select_single(
2539- "Label",
2540+ email_label_1 = email_group.select_single(
2541+ "UCLabel",
2542 objectName="label_emailAddress_0.0")
2543 self.assertThat(email_label_1.text,
2544 Eventually(Equals("fulano@internet.com.br")))
2545@@ -146,7 +146,7 @@
2546
2547 # check if the email list is empty
2548 view_page = self.app.main_window.get_contact_view_page()
2549- emails_group = view_page.select_single(
2550+ emails_group = self.main_window.select_single(
2551 "ContactDetailGroupWithTypeView",
2552 objectName="emails")
2553 self.assertThat(emails_group.detailsCount, Eventually(Equals(0)))
2554@@ -168,7 +168,7 @@
2555
2556 # check if is possible to save a contact without name
2557 self.app.main_window.save()
2558- accept_button = self.app.main_window.get_button("save")
2559+ accept_button = self.app.main_window.get_action("save")
2560 self.assertThat(accept_button.enabled, Eventually(Equals(False)))
2561
2562 # Cancel edit
2563@@ -213,6 +213,6 @@
2564
2565 # check if the type was saved correct
2566 im_type = view_page.select_single(
2567- "Label",
2568+ "UCLabel",
2569 objectName="type_onlineAccount_0")
2570 self.assertThat(im_type.text, Eventually(Equals("Aim")))
2571
2572=== modified file 'tests/qml/tst_ContactAvatar.qml'
2573--- tests/qml/tst_ContactAvatar.qml 2014-07-08 14:20:01 +0000
2574+++ tests/qml/tst_ContactAvatar.qml 2015-10-26 13:18:18 +0000
2575@@ -14,7 +14,7 @@
2576 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2577 */
2578
2579-import QtQuick 2.2
2580+import QtQuick 2.4
2581 import QtContacts 5.0
2582 import QtTest 1.0
2583 import Ubuntu.Test 0.1
2584
2585=== modified file 'tests/qml/tst_ContactEditor.qml'
2586--- tests/qml/tst_ContactEditor.qml 2015-10-26 13:18:17 +0000
2587+++ tests/qml/tst_ContactEditor.qml 2015-10-26 13:18:18 +0000
2588@@ -14,7 +14,7 @@
2589 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2590 */
2591
2592-import QtQuick 2.2
2593+import QtQuick 2.4
2594 import QtTest 1.0
2595 import Ubuntu.Components 1.3
2596 import Ubuntu.Test 0.1
2597
2598=== modified file 'tests/qml/tst_ContactList.qml'
2599--- tests/qml/tst_ContactList.qml 2015-10-26 13:18:17 +0000
2600+++ tests/qml/tst_ContactList.qml 2015-10-26 13:18:18 +0000
2601@@ -14,7 +14,7 @@
2602 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2603 */
2604
2605-import QtQuick 2.2
2606+import QtQuick 2.4
2607 import QtTest 1.0
2608 import Ubuntu.Components 1.3
2609 import Ubuntu.Test 0.1
2610
2611=== modified file 'tests/qml/tst_ContactListModel.qml'
2612--- tests/qml/tst_ContactListModel.qml 2015-10-26 13:18:17 +0000
2613+++ tests/qml/tst_ContactListModel.qml 2015-10-26 13:18:18 +0000
2614@@ -14,7 +14,7 @@
2615 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2616 */
2617
2618-import QtQuick 2.2
2619+import QtQuick 2.4
2620 import QtTest 1.0
2621 import Ubuntu.Components 1.3
2622 import Ubuntu.Test 0.1
2623
2624=== modified file 'tests/qml/tst_ContactListView.qml'
2625--- tests/qml/tst_ContactListView.qml 2015-10-26 13:18:17 +0000
2626+++ tests/qml/tst_ContactListView.qml 2015-10-26 13:18:18 +0000
2627@@ -14,7 +14,7 @@
2628 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2629 */
2630
2631-import QtQuick 2.2
2632+import QtQuick 2.4
2633 import QtTest 1.0
2634 import Ubuntu.Components 1.3
2635 import Ubuntu.Test 0.1
2636
2637=== modified file 'tests/qml/tst_ContactPreviewPage.qml'
2638--- tests/qml/tst_ContactPreviewPage.qml 2015-10-26 13:18:17 +0000
2639+++ tests/qml/tst_ContactPreviewPage.qml 2015-10-26 13:18:18 +0000
2640@@ -14,7 +14,7 @@
2641 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2642 */
2643
2644-import QtQuick 2.2
2645+import QtQuick 2.4
2646 import QtTest 1.0
2647 import Ubuntu.Test 0.1
2648 import QtContacts 5.0
2649
2650=== modified file 'tests/qml/tst_ListWithActions.qml'
2651--- tests/qml/tst_ListWithActions.qml 2015-10-26 13:18:17 +0000
2652+++ tests/qml/tst_ListWithActions.qml 2015-10-26 13:18:18 +0000
2653@@ -14,7 +14,7 @@
2654 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2655 */
2656
2657-import QtQuick 2.2
2658+import QtQuick 2.4
2659 import Ubuntu.Components 1.3
2660 import QtTest 1.0
2661 import Ubuntu.Test 0.1
2662
2663=== modified file 'tests/qml/tst_UbuntuContacts.qml'
2664--- tests/qml/tst_UbuntuContacts.qml 2015-06-29 15:02:45 +0000
2665+++ tests/qml/tst_UbuntuContacts.qml 2015-10-26 13:18:18 +0000
2666@@ -14,7 +14,7 @@
2667 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2668 */
2669
2670-import QtQuick 2.2
2671+import QtQuick 2.4
2672 import QtTest 1.0
2673 import Ubuntu.Contacts 0.1
2674
2675
2676=== modified file 'tests/qml/tst_VCardParser.qml'
2677--- tests/qml/tst_VCardParser.qml 2014-08-13 20:52:57 +0000
2678+++ tests/qml/tst_VCardParser.qml 2015-10-26 13:18:18 +0000
2679@@ -14,7 +14,7 @@
2680 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2681 */
2682
2683-import QtQuick 2.2
2684+import QtQuick 2.4
2685 import QtTest 1.0
2686 import Ubuntu.Test 0.1
2687 import QtContacts 5.0

Subscribers

People subscribed via source and target branches