Merge lp:~renatofilho/address-book-app/update-bottom-edge into lp:address-book-app

Proposed by Renato Araujo Oliveira Filho
Status: Merged
Approved by: Bill Filler
Approved revision: 627
Merged at revision: 622
Proposed branch: lp:~renatofilho/address-book-app/update-bottom-edge
Merge into: lp:address-book-app
Diff against target: 804 lines (+200/-171)
13 files modified
src/imports/ABContactEditorPage.qml (+1/-1)
src/imports/ABContactListPage.qml (+71/-84)
src/imports/ABContactViewPage.qml (+5/-5)
src/imports/ABMultiColumnEmptyState.qml (+14/-6)
src/imports/ABNewContactBottomEdge.qml (+37/-32)
src/imports/MainWindow.qml (+15/-8)
src/imports/Ubuntu/AddressBook/Base/ContactDetailBase.qml (+0/-1)
src/imports/Ubuntu/AddressBook/Base/ContactDetailItem.qml (+5/-17)
src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailNameEditor.qml (+7/-3)
src/imports/Ubuntu/AddressBook/ContactEditor/ContactEditorPage.qml (+22/-14)
src/imports/Ubuntu/Contacts/ContactListView.qml (+4/-0)
src/imports/Ubuntu/Contacts/ContactSimpleListView.qml (+18/-0)
tests/qml/tst_ContactEditor.qml (+1/-0)
To merge this branch: bzr merge lp:~renatofilho/address-book-app/update-bottom-edge
Reviewer Review Type Date Requested Status
system-apps-ci-bot continuous-integration Approve
Ubuntu Phablet Team Pending
Review via email: mp+303174@code.launchpad.net

Commit message

Keep bottom edge page live while changing app: munticolumn <-> single column

To post a comment you must log in.
Revision history for this message
system-apps-ci-bot (system-apps-ci-bot) wrote :

FAILED: Continuous integration, rev:621
https://jenkins.canonical.com/system-apps/job/lp-address-book-app-ci/13/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/system-apps/job/build/1229/console
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-0-fetch/1229
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=vivid+overlay/1103
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=xenial+overlay/1103
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=yakkety/1103
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1090
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1090/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1090
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1090/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1090
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1090/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1090
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1090/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1090
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1090/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1090/console
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1090
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1090/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1090
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1090/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1090
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1090/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/system-apps/job/lp-address-book-app-ci/13/rebuild

review: Needs Fixing (continuous-integration)
622. By Renato Araujo Oliveira Filho

Fix input hint for name field.

Revision history for this message
system-apps-ci-bot (system-apps-ci-bot) wrote :

PASSED: Continuous integration, rev:622
https://jenkins.canonical.com/system-apps/job/lp-address-book-app-ci/14/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build/1233
    SUCCESS: https://jenkins.canonical.com/system-apps/job/test-0-autopkgtest/label=phone-armhf,release=vivid+overlay,testname=default/262
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-0-fetch/1233
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=vivid+overlay/1105
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=xenial+overlay/1105
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=yakkety/1105
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1092
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1092/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1092
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1092/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1092
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1092/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1092
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1092/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1092
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1092/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1092
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1092/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1092
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1092/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1092
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1092/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1092
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1092/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/system-apps/job/lp-address-book-app-ci/14/rebuild

review: Approve (continuous-integration)
623. By Renato Araujo Oliveira Filho

Make sure that the recent created contact is visible after close edit page.

Revision history for this message
system-apps-ci-bot (system-apps-ci-bot) wrote :

PASSED: Continuous integration, rev:623
https://jenkins.canonical.com/system-apps/job/lp-address-book-app-ci/15/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build/1234
    SUCCESS: https://jenkins.canonical.com/system-apps/job/test-0-autopkgtest/label=phone-armhf,release=vivid+overlay,testname=default/263
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-0-fetch/1234
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=vivid+overlay/1106
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=xenial+overlay/1106
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=yakkety/1106
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1093
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1093/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1093
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1093/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1093
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1093/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1093
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1093/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1093
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1093/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1093
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1093/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1093
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1093/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1093
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1093/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1093
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1093/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/system-apps/job/lp-address-book-app-ci/15/rebuild

review: Approve (continuous-integration)
624. By Renato Araujo Oliveira Filho

Make sure that the Firs name get focus.

Revision history for this message
system-apps-ci-bot (system-apps-ci-bot) wrote :

FAILED: Continuous integration, rev:624
https://jenkins.canonical.com/system-apps/job/lp-address-book-app-ci/16/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/system-apps/job/build/1237/console
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-0-fetch/1237
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=vivid+overlay/1109
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=xenial+overlay/1109
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=yakkety/1109
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1096/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1096/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1096/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1096/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1096/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1096/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1096/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1096/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1096/console

Click here to trigger a rebuild:
https://jenkins.canonical.com/system-apps/job/lp-address-book-app-ci/16/rebuild

review: Needs Fixing (continuous-integration)
625. By Renato Araujo Oliveira Filho

Fixed contact editor enable state.

626. By Renato Araujo Oliveira Filho

Make sure that the edit page is enabled during the unit test.

Revision history for this message
system-apps-ci-bot (system-apps-ci-bot) wrote :

PASSED: Continuous integration, rev:625
https://jenkins.canonical.com/system-apps/job/lp-address-book-app-ci/17/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build/1239
    SUCCESS: https://jenkins.canonical.com/system-apps/job/test-0-autopkgtest/label=phone-armhf,release=vivid+overlay,testname=default/266
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-0-fetch/1239
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=vivid+overlay/1111
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=xenial+overlay/1111
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=yakkety/1111
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1098
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1098/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1098
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1098/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1098
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1098/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1098
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1098/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1098
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1098/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1098
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1098/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1098
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1098/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1098
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1098/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1098
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1098/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/system-apps/job/lp-address-book-app-ci/17/rebuild

review: Approve (continuous-integration)
Revision history for this message
system-apps-ci-bot (system-apps-ci-bot) wrote :

PASSED: Continuous integration, rev:626
https://jenkins.canonical.com/system-apps/job/lp-address-book-app-ci/18/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build/1243
    SUCCESS: https://jenkins.canonical.com/system-apps/job/test-0-autopkgtest/label=phone-armhf,release=vivid+overlay,testname=default/268
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-0-fetch/1243
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=vivid+overlay/1115
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=xenial+overlay/1115
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=yakkety/1115
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1102
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1102/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1102
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1102/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1102
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1102/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1102
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1102/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1102
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1102/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1102
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1102/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1102
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1102/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1102
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1102/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1102
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1102/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/system-apps/job/lp-address-book-app-ci/18/rebuild

review: Approve (continuous-integration)
627. By Renato Araujo Oliveira Filho

Make sure that bootom edge works if settings page is opened.

Revision history for this message
system-apps-ci-bot (system-apps-ci-bot) wrote :

PASSED: Continuous integration, rev:627
https://jenkins.canonical.com/system-apps/job/lp-address-book-app-ci/19/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build/1256
    SUCCESS: https://jenkins.canonical.com/system-apps/job/test-0-autopkgtest/label=phone-armhf,release=vivid+overlay,testname=default/273
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-0-fetch/1256
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=vivid+overlay/1126
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=xenial+overlay/1126
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=yakkety/1126
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1113
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1113/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1113
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1113/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1113
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1113/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1113
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1113/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1113
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1113/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1113
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1113/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1113
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1113/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1113
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1113/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1113
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1113/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/system-apps/job/lp-address-book-app-ci/19/rebuild

review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/imports/ABContactEditorPage.qml'
--- src/imports/ABContactEditorPage.qml 2016-01-04 20:03:58 +0000
+++ src/imports/ABContactEditorPage.qml 2016-08-19 12:45:42 +0000
@@ -63,7 +63,7 @@
6363
64 onContactSaved: {64 onContactSaved: {
65 if (pageStack.contactListPage) {65 if (pageStack.contactListPage) {
66 pageStack.contactListPage.moveListToContact(contact)66 pageStack.contactListPage.onNewContactSaved(contact)
67 pageStack.contactListPage.forceActiveFocus()67 pageStack.contactListPage.forceActiveFocus()
68 }68 }
69 }69 }
7070
=== modified file 'src/imports/ABContactListPage.qml'
--- src/imports/ABContactListPage.qml 2016-07-13 18:40:39 +0000
+++ src/imports/ABContactListPage.qml 2016-08-19 12:45:42 +0000
@@ -37,12 +37,12 @@
37 property bool pickMode: false37 property bool pickMode: false
38 property alias contentHubTransfer: contactExporter.activeTransfer38 property alias contentHubTransfer: contactExporter.activeTransfer
39 property bool pickMultipleContacts: false39 property bool pickMultipleContacts: false
40 property QtObject contactIndex: null
41 property alias contactManager: contactList.manager40 property alias contactManager: contactList.manager
4241
43 property var _busyDialog: null42 property var _busyDialog: null
44 property bool _importingTestData: false43 property bool _importingTestData: false
45 property bool _creatingContact: false44 property bool _creatingContact: false
45 property string _newContactId: ""
4646
47 readonly property string currentViewContactId: viewPage && viewPage.contact ? viewPage.contact.contactId : ""47 readonly property string currentViewContactId: viewPage && viewPage.contact ? viewPage.contact.contactId : ""
48 readonly property bool isEmpty: (contactList.count === 0)48 readonly property bool isEmpty: (contactList.count === 0)
@@ -110,7 +110,7 @@
110110
111 function showContact(contact)111 function showContact(contact)
112 {112 {
113 var currentContact = contactList.listModel.contacts[contactList.currentIndex]113 var currentContact = contactList.currentIndex != -1 ? contactList.listModel.contacts[contactList.currentIndex] : null
114 if (currentContact && (mainPage.currentViewContactId === currentContact.contactId)) {114 if (currentContact && (mainPage.currentViewContactId === currentContact.contactId)) {
115 // contact view already opened with this contact115 // contact view already opened with this contact
116 return116 return
@@ -130,39 +130,45 @@
130 if (pageStack.columns === 1)130 if (pageStack.columns === 1)
131 return131 return
132132
133 if (!emptyPage) {133 var newEmptyPage = null
134 if (!mainPage.emptyPage) {
134 contactList.currentIndex = -1135 contactList.currentIndex = -1
135 pageStack.removePages(mainPage)136 pageStack.removePages(mainPage)
136137
137 if ((pageStack.columns > 1) && !hasChildPage()) {138 if (pageStack.columns) {
138 emptyPage = pageStack.addFileToNextColumnSync(pageStack.primaryPage,139 newEmptyPage = pageStack.addFileToNextColumnSync(pageStack.primaryPage,
139 Qt.resolvedUrl("ABMultiColumnEmptyState.qml"),140 Qt.resolvedUrl("ABMultiColumnEmptyState.qml"),
140 { 'headerTitle': "",141 { 'headerTitle': "",
141 'pageStack': mainPage.pageStack,142 'pageStack': mainPage.pageStack,
142 'model': mainPage.contactModel })143 'model': mainPage.contactModel })
143 emptyPage.Component.onDestruction.connect(function() {144 newEmptyPage.Component.onDestruction.connect(function() {
144 mainPage.emptyPage = null145 mainPage.emptyPage = null
145 })146 })
146147
147 }148 }
149 } else {
150 newEmptyPage = mainPage.emptyPage
148 }151 }
152
149 if (openBottomEdge) {153 if (openBottomEdge) {
150 mainPage.emptyPage.commitBottomEdge()154 newEmptyPage.commitBottomEdge()
151 }155 }
152156
157 mainPage.emptyPage = newEmptyPage
158
153 }159 }
154160
155 function showSettingsPage()161 function showSettingsPage()
156 {162 {
157 pageStack.removePages(mainPage)
158
159
160 if (settingsPage) {163 if (settingsPage) {
161 settingsPage.Component.onDestruction.disconnect(clearSettingsPage)164 settingsPage.Component.onDestruction.disconnect(clearSettingsPage)
162 }165 }
163166
164 pageStack.removePages(mainPage)167 pageStack.removePages(mainPage)
165 viewPage = null168 viewPage = null
169 settingsPage = null
170 emptyPage = null
171
166172
167 settingsPage = pageStack.addFileToNextColumnSync(mainPage,173 settingsPage = pageStack.addFileToNextColumnSync(mainPage,
168 Qt.resolvedUrl("./Settings/SettingsPage.qml"),174 Qt.resolvedUrl("./Settings/SettingsPage.qml"),
@@ -203,27 +209,8 @@
203 contactList.startSelection()209 contactList.startSelection()
204 }210 }
205211
206 function moveListToContact(contact)
207 {
208 if ((state !== "searching") &&
209 (state !== "vcardImported")) {
210 mainPage.state = "default"
211 }
212
213 contactIndex = contact
214 // this means a new contact was created
215 if (mainPage.allowToQuit) {
216 application.goBackToSourceApp()
217 }
218 }
219
220
221 function onNewContactSaved(contact) {212 function onNewContactSaved(contact) {
222 _creatingContact = true213 _newContactId = contact.contactId
223 moveListToContact(contact)
224 if (pageStack.columns > 1) {
225 showContact(contact);
226 }
227 }214 }
228215
229 // Delay contact fetch for some msecs (check 'fetchNewContactTimer')216 // Delay contact fetch for some msecs (check 'fetchNewContactTimer')
@@ -234,7 +221,7 @@
234221
235 function fetchContact()222 function fetchContact()
236 {223 {
237 if (pageStack.columns > 1 && !contactList.showNewContact) {224 if (pageStack.columns > 1 && !contactList.showNewContact && !pageStack.bottomEdgeOpened) {
238 var currentContact = null225 var currentContact = null
239 if (contactList.currentIndex >= 0)226 if (contactList.currentIndex >= 0)
240 currentContact = contactList.listModel.contacts[contactList.currentIndex]227 currentContact = contactList.listModel.contacts[contactList.currentIndex]
@@ -306,8 +293,7 @@
306293
307 focus: true294 focus: true
308 showImportOptions: !mainPage.pickMode &&295 showImportOptions: !mainPage.pickMode &&
309 pageStack.bottomEdge &&296 !pageStack.bottomEdgeOpened
310 (pageStack.bottomEdge.status !== BottomEdge.Committed)
311 anchors {297 anchors {
312 top: parent.top298 top: parent.top
313 topMargin: pageHeader.height299 topMargin: pageHeader.height
@@ -319,8 +305,8 @@
319 filterTerm: searchField.text305 filterTerm: searchField.text
320 multiSelectionEnabled: true306 multiSelectionEnabled: true
321 multipleSelection: (mainPage.pickMode && mainPage.pickMultipleContacts) || !mainPage.pickMode307 multipleSelection: (mainPage.pickMode && mainPage.pickMultipleContacts) || !mainPage.pickMode
322 showNewContact: (pageStack.columns > 1) && pageStack.bottomEdge && (pageStack.bottomEdge.status === BottomEdge.Committed)308 showNewContact: (pageStack.columns > 1) && pageStack.bottomEdgeOpened
323 highlightSelected: !showNewContact && pageStack.hasKeyboard && !mainPage._creatingContact309 highlightSelected: !showNewContact && pageStack.hasKeyboard && (mainPage._newContactId === "")
324 onAddContactClicked: mainPage.createContactWithPhoneNumber(label)310 onAddContactClicked: mainPage.createContactWithPhoneNumber(label)
325 onContactClicked: mainPage.showContact(contact)311 onContactClicked: mainPage.showContact(contact)
326 onIsInSelectionModeChanged: mainPage.state = isInSelectionMode ? "selection" : "default"312 onIsInSelectionModeChanged: mainPage.state = isInSelectionMode ? "selection" : "default"
@@ -345,8 +331,7 @@
345 }331 }
346332
347 onCurrentIndexChanged: {333 onCurrentIndexChanged: {
348 if (!mainPage.contactIndex)334 mainPage.delayFetchContact()
349 mainPage.delayFetchContact()
350 }335 }
351336
352 onOnlineAccountFinished: {337 onOnlineAccountFinished: {
@@ -367,7 +352,7 @@
367 //because of that we need this352 //because of that we need this
368 Keys.onRightPressed: {353 Keys.onRightPressed: {
369 // only move focus away when in edit mode354 // only move focus away when in edit mode
370 if (pageStack.bottomEdge.status === BottomEdge.Committed) {355 if (pageStack.bottomEdgeOpened) {
371 var next = pageStack._nextItemInFocusChain(view, true)356 var next = pageStack._nextItemInFocusChain(view, true)
372 if (next === searchField) {357 if (next === searchField) {
373 pageStack._nextItemInFocusChain(next, true)358 pageStack._nextItemInFocusChain(next, true)
@@ -444,24 +429,25 @@
444 viewPage.cancelEdit()429 viewPage.cancelEdit()
445 }430 }
446431
432
433 if (pageStack.bottomEdgeOpened) {
434 pageStack.closeBottomEdge()
435 } else {
436 showEmptyPage(false)
437 }
447 mainPage.state = "searching"438 mainPage.state = "searching"
448 contactList.showAllContacts()439 contactList.showAllContacts()
449 if (pageStack.bottomEdge) {
450 pageStack.bottomEdge.collapse()
451 } else {
452 showEmptyPage(false)
453 }
454 searchField.forceActiveFocus()440 searchField.forceActiveFocus()
455 }441 }
456 },442 },
457 Action {443 Action {
458 iconName: "contact-new"444 iconName: "contact-new"
459 enabled: visible && (!pageStack.bottomEdge || (pageStack.bottomEdge.enabled && (pageStack.bottomEdge.status === BottomEdge.Hidden)))445 enabled: visible && !pageStack.bottomEdgeOpened
460 visible: (pageStack.columns > 1)446 visible: (pageStack.columns > 1)
461 shortcut: "Ctrl+N"447 shortcut: "Ctrl+N"
462 onTriggered: {448 onTriggered: {
463 if (pageStack.bottomEdge) {449 if (!pageStack.bottomEdgeOpened && (viewPage || emptyPage)) {
464 pageStack.bottomEdge.commit()450 pageStack._bottomEdge.commit()
465 } else {451 } else {
466 showEmptyPage(true)452 showEmptyPage(true)
467 }453 }
@@ -689,7 +675,7 @@
689 KeyboardRectangle {675 KeyboardRectangle {
690 id: keyboard676 id: keyboard
691 active: mainPage.active &&677 active: mainPage.active &&
692 (pageStack.bottomEdge && (pageStack.bottomEdge.status === BottomEdge.Hidden))678 !pageStack.bottomEdgeOpened
693 }679 }
694680
695 ABEmptyState {681 ABEmptyState {
@@ -809,7 +795,7 @@
809 id: bottomEdgeLoader795 id: bottomEdgeLoader
810796
811 enabled: false797 enabled: false
812 active: (pageStack.columns === 1) && bottomEdgeLoader.enabled798 active: true
813 asynchronous: true799 asynchronous: true
814 sourceComponent: ABNewContactBottomEdge {800 sourceComponent: ABNewContactBottomEdge {
815 id: bottomEdge801 id: bottomEdge
@@ -818,40 +804,40 @@
818 hint.flickable: contactList.view804 hint.flickable: contactList.view
819 pageStack: mainPage.pageStack805 pageStack: mainPage.pageStack
820 enabled: mainPage.active806 enabled: mainPage.active
807 hintVisible: (pageStack.columns === 1) && bottomEdgeLoader.enabled
808 visible: hintVisible
821 }809 }
822 }810 }
823811
812 Binding {
813 target: pageStack
814 property: '_bottomEdge'
815 value: bottomEdgeLoader.item
816 when: (bottomEdgeLoader.status === Loader.Ready) &&
817 (pageStack.columns === 1) &&
818 bottomEdgeLoader.enabled
819 }
820
824 Action {821 Action {
825 iconName: "contact-new"822 iconName: "contact-new"
826 enabled: mainPage.active &&823 enabled: mainPage.active && !mainPage.bottomEdgeOpened
827 (bottomEdgeLoader.status === Loader.Ready) &&
828 (bottomEdgeLoader.item.status === BottomEdge.Hidden)
829 shortcut: "Ctrl+N"824 shortcut: "Ctrl+N"
830 onTriggered: {825 onTriggered: {
831 bottomEdgeLoader.item.commit()826 bottomEdgeLoader.item.commit()
832 }827 }
833 }828 }
834829
835
836 Binding {
837 target: pageStack
838 property: 'bottomEdge'
839 value: bottomEdgeLoader.item
840 when: bottomEdgeLoader.status == Loader.Ready
841 }
842
843 Connections {830 Connections {
844 target: mainPage.contactModel831 target: mainPage.contactModel
845832
846 onContactsChanged: {833 onContactsChanged: {
847 if (contactIndex) {834 // if is a new contact show it
848 contactList.positionViewAtContact(mainPage.contactIndex)835 if (mainPage._newContactId != "") {
849 mainPage.contactIndex = null836 contactList.positionViewAtContactId(mainPage._newContactId)
850 // at this point the operation has finished already837 mainPage._newContactId = ""
851 mainPage._creatingContact = false
852 mainPage.delayFetchContact()
853 }838 }
854 }839 }
840
855 onImportCompleted: {841 onImportCompleted: {
856 if (mainPage._importingTestData) {842 if (mainPage._importingTestData) {
857 mainPage._importingTestData = false843 mainPage._importingTestData = false
@@ -879,22 +865,23 @@
879 }865 }
880866
881 Connections {867 Connections {
882 target: pageStack.bottomEdge868 target: pageStack
883 onCommitCompleted: {869 onBottomEdgeOpenedChanged: {
884 if (mainPage.state !== "default") {870 if (pageStack.bottomEdgeOpened) {
885 mainPage.head.sections.selectedIndex = 0871 if (mainPage.state !== "default") {
886 mainPage.state = "default"872 mainPage.head.sections.selectedIndex = 0
887 }873 mainPage.state = "default"
888 }874 }
889 onCollapseCompleted: {875 } else {
890 if (!mainPage._creatingContact) {876 if (mainPage._creatingContact === "") {
891 if (contactList.currentIndex === -1)877 if (contactList.currentIndex === -1)
892 contactList.currentIndex = 0878 contactList.currentIndex = 0
893 mainPage.delayFetchContact()879 mainPage.delayFetchContact()
894 }880 }
895881
896 if (mainPage.status === "default") {882 if (mainPage.status === "default") {
897 contactList.forceActiveFocus()883 contactList.forceActiveFocus()
884 }
898 }885 }
899 }886 }
900 }887 }
901888
=== modified file 'src/imports/ABContactViewPage.qml'
--- src/imports/ABContactViewPage.qml 2016-02-13 02:35:02 +0000
+++ src/imports/ABContactViewPage.qml 2016-08-19 12:45:42 +0000
@@ -41,7 +41,7 @@
41 _editPage = null41 _editPage = null
42 }42 }
43 if (pageStack.bottomEdge) {43 if (pageStack.bottomEdge) {
44 pageStack.bottomEdge.collapse()44 pageStack.bottomEdge.close()
45 }45 }
46 }46 }
4747
@@ -55,7 +55,7 @@
55 }55 }
5656
57 // Shortcut in case of single column57 // Shortcut in case of single column
58 Action {58 Action {
59 id: backAction59 id: backAction
6060
61 name: "cancel"61 name: "cancel"
@@ -123,7 +123,6 @@
123 Loader {123 Loader {
124 id: bottomEdgeLoader124 id: bottomEdgeLoader
125125
126 active: (pageStack.columns > 1)
127 asynchronous: true126 asynchronous: true
128 sourceComponent: ABNewContactBottomEdge {127 sourceComponent: ABNewContactBottomEdge {
129 id: bottomEdge128 id: bottomEdge
@@ -135,13 +134,14 @@
135 pageStack: root.pageStack134 pageStack: root.pageStack
136 hintVisible: false135 hintVisible: false
137 enabled: !root.editing136 enabled: !root.editing
137 visible: (pageStack.columns > 1)
138 }138 }
139 }139 }
140140
141 Binding {141 Binding {
142 target: pageStack142 target: pageStack
143 property: 'bottomEdge'143 property: '_bottomEdge'
144 value: bottomEdgeLoader.item144 value: bottomEdgeLoader.item
145 when: bottomEdgeLoader.status === Loader.Ready145 when: (bottomEdgeLoader.status === Loader.Ready) && (pageStack.columns > 1)
146 }146 }
147}147}
148148
=== modified file 'src/imports/ABMultiColumnEmptyState.qml'
--- src/imports/ABMultiColumnEmptyState.qml 2016-05-10 15:51:21 +0000
+++ src/imports/ABMultiColumnEmptyState.qml 2016-08-19 12:45:42 +0000
@@ -42,7 +42,7 @@
42 function close()42 function close()
43 {43 {
44 if (bottomEdge.item) {44 if (bottomEdge.item) {
45 bottomEdge.item.collapse()45 bottomEdge.item.close()
46 }46 }
47 }47 }
4848
@@ -64,12 +64,12 @@
64 Loader {64 Loader {
65 id: bottomEdgeLoader65 id: bottomEdgeLoader
6666
67 active: (pageStack.columns > 1)
68 asynchronous: true67 asynchronous: true
69 sourceComponent: ABNewContactBottomEdge {68 sourceComponent: ABNewContactBottomEdge {
70 id: bottomEdge69 id: bottomEdge
7170
72 hintVisible: false71 hintVisible: false
72 visible: (pageStack.columns > 1)
73 parent: root73 parent: root
74 height: root.height74 height: root.height
75 modelToEdit: root.model75 modelToEdit: root.model
@@ -88,17 +88,25 @@
8888
89 Binding {89 Binding {
90 target: pageStack90 target: pageStack
91 property: 'bottomEdge'91 property: '_bottomEdge'
92 value: bottomEdgeLoader.item92 value: bottomEdgeLoader.item
93 when: bottomEdgeLoader.status === Loader.Ready93 when: (bottomEdgeLoader.status === Loader.Ready) && (pageStack.columns > 1)
94 }94 }
9595
96
97 // Remove empty page when app changes to 1 column mode
96 Connections {98 Connections {
97 target: pageStack99 target: pageStack
98 onColumnsChanged: {100 onBottomEdgeOpenedChanged: {
99 if (pageStack.columns === 1) {101 if (!pageStack.bottomEdgeOpened && (pageStack.columns === 1)) {
100 pageStack.removePages(root)102 pageStack.removePages(root)
101 }103 }
102 }104 }
103 }105 }
106 onActiveChanged: {
107 if (active && (pageStack.columns === 1)) {
108 pageStack.removePages(root)
109 }
110
111 }
104}112}
105113
=== modified file 'src/imports/ABNewContactBottomEdge.qml'
--- src/imports/ABNewContactBottomEdge.qml 2016-02-12 23:03:19 +0000
+++ src/imports/ABNewContactBottomEdge.qml 2016-08-19 12:45:42 +0000
@@ -26,11 +26,6 @@
26 property var pageStack: null26 property var pageStack: null
27 property alias hintVisible: bottomEdgeHint.visible27 property alias hintVisible: bottomEdgeHint.visible
28 property var _contactToEdit: null28 property var _contactToEdit: null
29 // WORKAROUND: BottomEdge component loads the page async while draging it
30 // this cause a very bad visual.
31 // To avoid that we create it as soon as the component is ready and keep
32 // it invisible until the user start to drag it.
33 property var _realPage: null
3429
35 function editContact(contact)30 function editContact(contact)
36 {31 {
@@ -38,6 +33,31 @@
38 commit()33 commit()
39 }34 }
4035
36 function close()
37 {
38 if (pageStack.bottomEdgeFloatingPage) {
39 pageStack.removePages(pageStack.bottomEdgeFloatingPage)
40 }
41 }
42
43 function pushPage()
44 {
45 var properties = {enabled: true,
46 visible: true,
47 parent: bottomEdge.parent}
48 if (bottomEdge._contactToEdit)
49 properties[contact] = bottomEdge._contactToEdit
50
51
52 var incubator = pageStack.addPageToNextColumn(bottomEdge.parent, editorPageBottomEdge, properties)
53 incubator.forceCompletion()
54 pageStack.bottomEdgeFloatingPage = incubator.object
55 incubator.object.Component.onDestruction.connect(function() {
56 pageStack.bottomEdgeFloatingPage = null
57 })
58 bottomEdge._contactToEdit = null
59 }
60
41 hint {61 hint {
42 id: bottomEdgeHint62 id: bottomEdgeHint
43 action: Action {63 action: Action {
@@ -48,42 +68,27 @@
48 }68 }
49 }69 }
5070
51 contentComponent: Item {71 contentComponent: editorPageBottomEdge
52 id: pageContent72 preloadContent: visible
53
54 implicitWidth: bottomEdge.width
55 implicitHeight: bottomEdge.height
56 children: bottomEdge._realPage
57 }
58
5973
60 onCommitCompleted: {74 onCommitCompleted: {
61 if (bottomEdge._contactToEdit)75 pushPage()
62 editorPage.contact = bottomEdge._contactToEdit76 collapse()
63 bottomEdge._contactToEdit = null
64 }
65
66 onCollapseCompleted: {
67 _realPage = editorPageBottomEdge.createObject(null)
68 }
69
70 Component.onCompleted: {
71 _realPage = editorPageBottomEdge.createObject(null)
72 }77 }
7378
74 Component {79 Component {
75 id: editorPageBottomEdge80 id: editorPageBottomEdge
7681
77 ABContactEditorPage {82 ABContactEditorPage {
78 implicitWidth: bottomEdge.width83 id: editorPageItem
79 implicitHeight: bottomEdge.height84
80 contact: ContactsUI.ContactsJS.createEmptyContact("", bottomEdge)85 implicitHeight: mainWindow.height
86 implicitWidth: parent ? parent.width : bottomEdge.width
87 enabled: false
81 model: bottomEdge.modelToEdit88 model: bottomEdge.modelToEdit
82 enabled: bottomEdge.status === BottomEdge.Committed89 contact: ContactsUI.ContactsJS.createEmptyContact("", editorPageItem)
83 active: bottomEdge.status === BottomEdge.Committed90 onCanceled: pageStack.removePages(editorPageItem)
84 visible: bottomEdge.status !== BottomEdge.Hidden91 onContactSaved: pageStack.removePages(editorPageItem)
85 onCanceled: bottomEdge.collapse()
86 onContactSaved: bottomEdge.collapse()
87 pageStack: bottomEdge.pageStack92 pageStack: bottomEdge.pageStack
88 }93 }
89 }94 }
9095
=== modified file 'src/imports/MainWindow.qml'
--- src/imports/MainWindow.qml 2016-07-14 18:22:28 +0000
+++ src/imports/MainWindow.qml 2016-08-19 12:45:42 +0000
@@ -114,17 +114,21 @@
114 objectName: "mainStack"114 objectName: "mainStack"
115115
116 property var contactListPage: null116 property var contactListPage: null
117 property var bottomEdge: null117 property var bottomEdgeFloatingPage: null
118 readonly property bool bottomEdgeOpened: (bottomEdge && bottomEdge.status === BottomEdge.Committed)118 readonly property bool bottomEdgeOpened: bottomEdgeFloatingPage != null
119 readonly property bool hasMouse: ((miceModel.count > 0) || (touchPadModel.count > 0))119 readonly property bool hasMouse: ((miceModel.count > 0) || (touchPadModel.count > 0))
120 readonly property bool hasKeyboard: (keyboardsModel.count > 0)120 readonly property bool hasKeyboard: (keyboardsModel.count > 0)
121 property var _bottomEdge: null
122
123 function closeBottomEdge()
124 {
125 if (bottomEdgeFloatingPage)
126 mainStack.removePages(bottomEdgeFloatingPage);
127 }
121128
122 function resetStack()129 function resetStack()
123 {130 {
124 if (bottomEdge)
125 bottomEdge.collapse()
126 mainStack.removePages(primaryPage);131 mainStack.removePages(primaryPage);
127
128 }132 }
129133
130 function _nextItemInFocusChain(item, foward)134 function _nextItemInFocusChain(item, foward)
@@ -182,13 +186,16 @@
182 if (mainStack.columns > 1) {186 if (mainStack.columns > 1) {
183 if (mainStack.contactListPage)187 if (mainStack.contactListPage)
184 {188 {
185 if (!mainStack.contactListPage.hasChildPage())189 if (!mainStack.contactListPage.hasChildPage() && !mainStack.bottomEdgeOpened)
190 console.debug("Fech contact:" + mainStack.bottomEdgeOpened)
186 mainStack.contactListPage.delayFetchContact()191 mainStack.contactListPage.delayFetchContact()
187 }192 }
188 else193 else
189 {194 {
190 if (!contactPage.hasChildPage())195 if (!contactPage.hasChildPage() && !mainStack.bottomEdgeOpened) {
196 console.debug("Push empty page:" + mainStack.bottomEdgeOpened)
191 mainStack.addPageToNextColumn(contactPage, Qt.resolvedUrl("./ABMultiColumnEmptyState.qml"))197 mainStack.addPageToNextColumn(contactPage, Qt.resolvedUrl("./ABMultiColumnEmptyState.qml"))
198 }
192 }199 }
193 }200 }
194 }201 }
@@ -208,7 +215,7 @@
208215
209 // WORKAROUND: Due the missing feature on SDK, they can not detect if216 // WORKAROUND: Due the missing feature on SDK, they can not detect if
210 // there is a mouse attached to device or not. And this will cause the217 // there is a mouse attached to device or not. And this will cause the
211 // bootom edge component to not work correct on desktop.218 // bottom edge component to not work correct on desktop.
212 // We will consider that a mouse is always attached until it get implement on SDK.219 // We will consider that a mouse is always attached until it get implement on SDK.
213 Binding {220 Binding {
214 target: QuickUtils221 target: QuickUtils
215222
=== modified file 'src/imports/Ubuntu/AddressBook/Base/ContactDetailBase.qml'
--- src/imports/Ubuntu/AddressBook/Base/ContactDetailBase.qml 2015-12-10 19:15:15 +0000
+++ src/imports/Ubuntu/AddressBook/Base/ContactDetailBase.qml 2016-08-19 12:45:42 +0000
@@ -97,7 +97,6 @@
97 } else if ((detail in detailNameMap) && (field == -1)){97 } else if ((detail in detailNameMap) && (field == -1)){
98 return detailNameMap[detail]98 return detailNameMap[detail]
99 } else {99 } else {
100 console.debug("Unknown : [" + detail + "] [" + field + "]")
101 return "unknown"100 return "unknown"
102 }101 }
103 }102 }
104103
=== modified file 'src/imports/Ubuntu/AddressBook/Base/ContactDetailItem.qml'
--- src/imports/Ubuntu/AddressBook/Base/ContactDetailItem.qml 2015-10-26 13:18:11 +0000
+++ src/imports/Ubuntu/AddressBook/Base/ContactDetailItem.qml 2016-08-19 12:45:42 +0000
@@ -23,7 +23,7 @@
23 id: root23 id: root
2424
25 readonly property alias fieldDelegates: fieldsColumn.children25 readonly property alias fieldDelegates: fieldsColumn.children
26 property Component fieldDelegate: null26 property alias fieldDelegate: fieldRepeater.delegate
27 property alias spacing: fieldsColumn.spacing27 property alias spacing: fieldsColumn.spacing
2828
29 implicitHeight: fieldsColumn.height29 implicitHeight: fieldsColumn.height
@@ -36,26 +36,14 @@
36 }36 }
37 spacing: units.gu(2)37 spacing: units.gu(2)
3838
39 height: childrenRect.height39 //height: childrenRect.height
40 Repeater {40 Repeater {
41 id: fieldRepeater41 id: fieldRepeater
4242
43 model: root.fields43 model: root.fields
44 Loader {44 onItemAdded: {
45 id: field45 item.field = Qt.binding(function() { return model[index] })
4646 item.detail = Qt.binding(function() { return root.detail })
47 sourceComponent: fieldDelegate
48 Binding {
49 target: item
50 property: "field"
51 value: modelData
52 }
53
54 Binding {
55 target: item
56 property: "detail"
57 value: root.detail
58 }
59 }47 }
60 }48 }
61 }49 }
6250
=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailNameEditor.qml'
--- src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailNameEditor.qml 2016-05-06 17:03:26 +0000
+++ src/imports/Ubuntu/AddressBook/ContactEditor/ContactDetailNameEditor.qml 2016-08-19 12:45:42 +0000
@@ -96,11 +96,15 @@
96 }96 }
9797
98 focus: true98 focus: true
99 width: root.width - units.gu(4)99 anchors {
100 x: units.gu(2)100 left: parent.left
101 right: parent.right
102 margins: units.gu(2)
103 }
104 height: units.gu(4)
101 detail: root.detail105 detail: root.detail
102 visible: field === Name.MiddleName ? root.showMiddleName : true106 visible: field === Name.MiddleName ? root.showMiddleName : true
103 height: visible ? units.gu(4) : 0107
104 placeholderText: placeholderTextFromField(field)108 placeholderText: placeholderTextFromField(field)
105 inputMethodHints: Qt.ImhNoPredictiveText109 inputMethodHints: Qt.ImhNoPredictiveText
106 onTextChanged: checkIsEmpty()110 onTextChanged: checkIsEmpty()
107111
=== modified file 'src/imports/Ubuntu/AddressBook/ContactEditor/ContactEditorPage.qml'
--- src/imports/Ubuntu/AddressBook/ContactEditor/ContactEditorPage.qml 2016-05-04 19:42:04 +0000
+++ src/imports/Ubuntu/AddressBook/ContactEditor/ContactEditorPage.qml 2016-08-19 12:45:42 +0000
@@ -43,6 +43,15 @@
43 signal contactSaved(var contact);43 signal contactSaved(var contact);
44 signal canceled()44 signal canceled()
4545
46 function close() {
47 if (pageStack.removePages) {
48 pageStack.removePages(contactEditor)
49 } else {
50 pageStack.pop()
51 }
52 }
53
54
46 function cancel() {55 function cancel() {
47 for (var i = 0; i < contactEditor.newDetails.length; ++i) {56 for (var i = 0; i < contactEditor.newDetails.length; ++i) {
48 contactEditor.contact.removeDetail(contactEditor.newDetails[i])57 contactEditor.contact.removeDetail(contactEditor.newDetails[i])
@@ -93,15 +102,11 @@
93 if (changed) {102 if (changed) {
94 // backend error will be handled by the root page (contact list)103 // backend error will be handled by the root page (contact list)
95 var newContact = (contact.model == null)104 var newContact = (contact.model == null)
105 contactEditor.enabled = false
106 contact.onContactChanged.connect(contactEditor._onContactSaved)
96 contactEditor.model.saveContact(contact)107 contactEditor.model.saveContact(contact)
97 if (newContact) {
98 contactEditor.contactSaved(contact)
99 }
100 }
101 if (pageStack.removePages) {
102 pageStack.removePages(contactEditor)
103 } else {108 } else {
104 pageStack.pop()109 close()
105 }110 }
106 }111 }
107112
@@ -174,6 +179,13 @@
174 }179 }
175 }180 }
176181
182 function _onContactSaved()
183 {
184 contact.onContactChanged.disconnect(contactEditor._onContactSaved)
185 contactEditor.contactSaved(contact)
186 close()
187 }
188
177 Timer {189 Timer {
178 id: timerMakemakeMeVisible190 id: timerMakemakeMeVisible
179191
@@ -196,7 +208,7 @@
196 }208 }
197 }209 }
198210
199 enabled: false211 enabled: active
200 flickable: null212 flickable: null
201 Timer {213 Timer {
202 id: focusTimer214 id: focusTimer
@@ -482,15 +494,11 @@
482 }494 }
483495
484 onActiveChanged: {496 onActiveChanged: {
485 if (!active) {497 if (!active || !enabled) {
486 return498 return
487 }499 }
488500
489 if (contactEditor.initialFocusSection != "") {501 focusTimer.restart()
490 focusTimer.restart()
491 } else {
492 contactEditor.ready()
493 }
494 }502 }
495503
496 Component {504 Component {
497505
=== modified file 'src/imports/Ubuntu/Contacts/ContactListView.qml'
--- src/imports/Ubuntu/Contacts/ContactListView.qml 2016-06-21 00:57:29 +0000
+++ src/imports/Ubuntu/Contacts/ContactListView.qml 2016-08-19 12:45:42 +0000
@@ -332,6 +332,10 @@
332 {332 {
333 view.positionViewAtContact(contact)333 view.positionViewAtContact(contact)
334 }334 }
335 function positionViewAtContactId(contactId)
336 {
337 view.positionViewAtContactId(contactId)
338 }
335 function positionViewAtBeginning()339 function positionViewAtBeginning()
336 {340 {
337 moveToBegining.restart()341 moveToBegining.restart()
338342
=== modified file 'src/imports/Ubuntu/Contacts/ContactSimpleListView.qml'
--- src/imports/Ubuntu/Contacts/ContactSimpleListView.qml 2016-02-05 16:07:45 +0000
+++ src/imports/Ubuntu/Contacts/ContactSimpleListView.qml 2016-08-19 12:45:42 +0000
@@ -208,6 +208,24 @@
208 positionViewAtIndex(currentIndex, ListView.Center)208 positionViewAtIndex(currentIndex, ListView.Center)
209 }209 }
210210
211
212 /*!
213 Scroll the list to requested contact if the contact exists in the list
214 */
215 function positionViewAtContactId(contactId)
216 {
217 var contacts = listModel.contacts
218
219 for (var i = 0, count = contacts.length; i < count; i++) {
220 var c = contacts[i]
221 if (c.contactId === contactId) {
222 currentIndex = i
223 positionViewAtIndex(i, ListView.Center)
224 return
225 }
226 }
227 }
228
211 /*!229 /*!
212 private230 private
213 Fetch contact and emit contact clicked signal231 Fetch contact and emit contact clicked signal
214232
=== modified file 'tests/qml/tst_ContactEditor.qml'
--- tests/qml/tst_ContactEditor.qml 2015-12-16 18:35:33 +0000
+++ tests/qml/tst_ContactEditor.qml 2016-08-19 12:45:42 +0000
@@ -46,6 +46,7 @@
46 anchors.fill: parent46 anchors.fill: parent
47 model: dummyDataModel47 model: dummyDataModel
48 contact: createEmptyContact('')48 contact: createEmptyContact('')
49 enabled: true
49 }50 }
50 }51 }
5152

Subscribers

People subscribed via source and target branches