on xenial help sign in
Ensure the greeter password field is not covered by the keyboard
commit36638469fec53c9bbb728a7039e547a020c7e8d7 authorDaniel d'Andrada <daniel.dandrada@canonical.com> dateFri 23 Jan 2015, 17:47 (12 years ago) parent66850b5
3 files changed+96−4
qml/Greeter/Greeter.qml+8 qml/Greeter/GreeterContent.qml+6−2 tests/qmltests/Greeter/tst_MultiGreeter.qml+82−2
qml/Greeter/Greeter.qml+8
@@ -30,6 +30,9 @@ Showable {
3030
3131 property url background
3232
33+ // so that it can be replaced in tests with a mock object
34+ property var inputMethod: Qt.inputMethod
35+
3336 prepareToHide: function () {
3437 hideTranslation.to = greeter.x > 0 || d.forceRightOnNextHideAnimation ? greeter.width : -greeter.width;
3538 d.forceRightOnNextHideAnimation = false;
@@ -102,6 +105,11 @@ Showable {
102105 }
103106 onUnlocked: greeter.unlocked(uid);
104107 }
108+ Binding {
109+ target: greeterContentLoader.item
110+ property: "inputMethod"
111+ value: greeter.inputMethod
112+ }
105113 }
106114
107115 DragHandle {
qml/Greeter/GreeterContent.qml+6−2
@@ -24,6 +24,8 @@ Item {
2424 id: root
2525 anchors.fill: parent
2626
27+ property var inputMethod
28+
2729 property bool ready: background.source == "" || background.status == Image.Ready || background.status == Image.Error
2830
2931 signal selected(int uid)
@@ -74,10 +76,12 @@ Item {
7476 anchors {
7577 left: parent.left
7678 leftMargin: Math.min(parent.width * 0.16, units.gu(20))
77− verticalCenter: parent.verticalCenter
79+ top: parent.top
7880 }
7981 width: units.gu(29)
80− height: parent.height
82+ height: inputMethod && inputMethod.visible ? parent.height - inputMethod.keyboardRectangle.height
83+ : parent.height
84+ Behavior on height { UbuntuNumberAnimation {} }
8185
8286 // TODO: Once we have a system API for determining which mode we are
8387 // in, tablet/phone/desktop, that should be used instead of narrowMode.
tests/qmltests/Greeter/tst_MultiGreeter.qml+82−2
@@ -15,6 +15,7 @@
1515 */
1616
1717import QtQuick 2.0
18+import QtQuick.Layouts 1.1
1819import QtTest 1.0
1920import ".."
2021import "../../../qml/Greeter"
@@ -23,12 +24,26 @@ import LightDM 0.1 as LightDM
2324import Unity.Test 0.1 as UT
2425
2526Item {
26− width: units.gu(120)
27+ id: root
28+ width: units.gu(140)
2729 height: units.gu(80)
2830
31+ QtObject {
32+ id: fakeInputMethod
33+ property bool visible: fakeKeyboard.visible
34+ property var keyboardRectangle: QtObject {
35+ property real x: fakeKeyboard.x
36+ property real y: fakeKeyboard.y
37+ property real width: fakeKeyboard.width
38+ property real height: fakeKeyboard.height
39+ }
40+ }
41+
2942 Greeter {
3043 id: greeter
31− anchors.fill: parent
44+ width: units.gu(120)
45+ height: root.height
46+ inputMethod: fakeInputMethod
3247 locked: !LightDM.Greeter.authenticated
3348 }
3449
@@ -43,6 +58,44 @@ Item {
4358 }
4459 }
4560
61+ Rectangle {
62+ id: fakeKeyboard
63+ color: "green"
64+ opacity: 0.7
65+ anchors.bottom: root.bottom
66+ width: greeter.width
67+ height: greeter.height * 0.6
68+ visible: keyboardVisibleCheckbox.checked
69+ Text {
70+ text: "Keyboard Rectangle"
71+ color: "yellow"
72+ font.bold: true
73+ fontSizeMode: Text.Fit
74+ minimumPixelSize: 10; font.pixelSize: 200
75+ verticalAlignment: Text.AlignVCenter
76+ x: (parent.width - width) / 2
77+ y: (parent.height - height) / 2
78+ width: parent.width
79+ height: parent.height
80+ }
81+ }
82+
83+ Item {
84+ anchors {
85+ top: root.top
86+ bottom: root.bottom
87+ left: greeter.right
88+ right: root.right
89+ }
90+ RowLayout {
91+ Layout.fillWidth: true
92+ CheckBox {
93+ id: keyboardVisibleCheckbox
94+ }
95+ Label { text: "Keyboard Visible"; anchors.verticalCenter: parent.verticalCenter }
96+ }
97+ }
98+
4699 SignalSpy {
47100 id: unlockSpy
48101 target: greeter
@@ -65,6 +118,10 @@ Item {
65118 name: "MultiGreeter"
66119 when: windowShown
67120
121+ function cleanup() {
122+ keyboardVisibleCheckbox.checked = false;
123+ }
124+
68125 function select_index(i) {
69126 // We could be anywhere in list; find target index to know which direction
70127 var userlist = findChild(greeter, "userList")
@@ -382,5 +439,28 @@ Item {
382439 tryCompare(spy, "count", 1)
383440 greeterObj.destroy()
384441 }
442+
443+ function test_login_list_not_covered_by_keyboard() {
444+ var loginList = findChild(greeter, "loginLoader").item;
445+ compare(loginList.height, greeter.height);
446+
447+ // when the vkb shows up, loginList is moved up to remain fully uncovered
448+
449+ keyboardVisibleCheckbox.checked = true;
450+
451+ tryCompare(loginList, "height", greeter.height - fakeInputMethod.keyboardRectangle.height);
452+ tryCompareFunction( function() {
453+ var loginListRect = loginList.mapToItem(greeter, 0, 0, loginList.width, loginList.height);
454+ console.log("loginListRect.y " + loginListRect.y);
455+ console.log("loginListRect.height " + loginListRect.height);
456+ return loginListRect.y + loginListRect.height <= fakeInputMethod.keyboardRectangle.y;
457+ }, true);
458+
459+ // once the vkb goes away, loginList goes back to its full height
460+
461+ keyboardVisibleCheckbox.checked = false;
462+
463+ tryCompare(loginList, "height", greeter.height);
464+ }
385465 }
386466}