on xenial help sign in
PhysicalKeysMapper: handle first power button long press correctly

When a power button pressing is the very first input to Lomiri/Unity8, the PhysicalKeysMapper won't recognize the long pressing correctly. Turns out, the timestamp Qt gives us can start at 0, so using 0 as an invalid value breaks this case. So, use -1 instead. The test is updated to also test this case.

commitbdbbb2011efb4479fe26bcd266b1cfbf8a554a55 authorRatchanan Srirattanamet <ratchanan@ubports.com> dateTue 1 Jun 2021, 01:02 (5 years ago) parent5d5c433
2 files changed+10−9
qml/Components/PhysicalKeysMapper.qml+4−4 tests/qmltests/Components/tst_PhysicalKeysMapper.qml+6−5
qml/Components/PhysicalKeysMapper.qml+4−4
@@ -65,7 +65,7 @@ Item {
6565 property bool superPressed: false
6666 property bool superTabPressed: false
6767
68− property var powerButtonPressStart: 0
68+ property var powerButtonPressStart: -1
6969 }
7070
7171 InputEventGenerator {
@@ -75,9 +75,9 @@ Item {
7575 function onKeyPressed(event, currentEventTimestamp) {
7676 if (event.key == Qt.Key_PowerDown || event.key == Qt.Key_PowerOff) {
7777 if (event.isAutoRepeat) {
78− if (d.powerButtonPressStart > 0
78+ if (d.powerButtonPressStart != -1
7979 && currentEventTimestamp - d.powerButtonPressStart >= powerKeyLongPressTime) {
80− d.powerButtonPressStart = 0;
80+ d.powerButtonPressStart = -1;
8181 root.powerKeyLongPressed();
8282 }
8383 } else {
@@ -132,7 +132,7 @@ Item {
132132
133133 function onKeyReleased(event, currentEventTimestamp) {
134134 if (event.key == Qt.Key_PowerDown || event.key == Qt.Key_PowerOff) {
135− d.powerButtonPressStart = 0;
135+ d.powerButtonPressStart = -1;
136136 event.accepted = true;
137137 } else if (event.key == Qt.Key_VolumeDown) {
138138 if (!d.ignoreVolumeEvents) root.volumeDownTriggered();
tests/qmltests/Components/tst_PhysicalKeysMapper.qml+6−5
@@ -95,26 +95,27 @@ Item {
9595 Powerd.setStatus(data.status, Powerd.Unknown);
9696 physicalKeysMapper.powerKeyLongPressTime = 500;
9797
98− physicalKeysMapper.onKeyPressed({ key: Qt.Key_PowerDown, isAutoRepeat: false }, 100);
98+ // The event's timestamp can start at 0, so make sure we handle this correctly.
99+ physicalKeysMapper.onKeyPressed({ key: Qt.Key_PowerDown, isAutoRepeat: false }, 0);
99100
100101 // After the first key press the screen is always on
101102 // and the rest of keypresses are auto repeat
102103 Powerd.setStatus(Powerd.On, Powerd.Unknown);
103104
105+ physicalKeysMapper.onKeyPressed({ key: Qt.Key_PowerDown, isAutoRepeat: true}, 200);
104106 physicalKeysMapper.onKeyPressed({ key: Qt.Key_PowerDown, isAutoRepeat: true}, 300);
105107 physicalKeysMapper.onKeyPressed({ key: Qt.Key_PowerDown, isAutoRepeat: true}, 400);
106− physicalKeysMapper.onKeyPressed({ key: Qt.Key_PowerDown, isAutoRepeat: true}, 500);
107− physicalKeysMapper.onKeyPressed({ key: Qt.Key_PowerDown, isAutoRepeat: true}, 599);
108+ physicalKeysMapper.onKeyPressed({ key: Qt.Key_PowerDown, isAutoRepeat: true}, 499);
108109
109110 // powerKeyLongPressed should not have been emitted yet.
110111 compare(powerSpy.count, 0);
111112
112− physicalKeysMapper.onKeyPressed({ key: Qt.Key_PowerDown, isAutoRepeat: true}, 600);
113+ physicalKeysMapper.onKeyPressed({ key: Qt.Key_PowerDown, isAutoRepeat: true}, 500);
113114
114115 compare(powerSpy.count, 1);
115116
116117 // Confirm we only emit once
117− physicalKeysMapper.onKeyPressed({ key: Qt.Key_PowerDown, isAutoRepeat: true}, 601);
118+ physicalKeysMapper.onKeyPressed({ key: Qt.Key_PowerDown, isAutoRepeat: true}, 501);
118119 compare(powerSpy.count, 1);
119120 }
120121