on xenial help sign in
Refactor to use signal for power and full events
7888692Michał Sawicz
qml/Components/PhysicalKeysMapper.qml+12−18
@@ -40,7 +40,6 @@ Item {
40 property bool screenshotPressed: d.volumeUpKeyPressed && d.volumeDownKeyPressed
40 property bool screenshotPressed: d.volumeUpKeyPressed && d.volumeDownKeyPressed
41 property bool volumeDownPressed: d.volumeDownKeyPressed && !d.volumeUpKeyPressed
41 property bool volumeDownPressed: d.volumeDownKeyPressed && !d.volumeUpKeyPressed
42 property bool volumeUpPressed: d.volumeUpKeyPressed && !d.volumeDownKeyPressed
42 property bool volumeUpPressed: d.volumeUpKeyPressed && !d.volumeDownKeyPressed
43− property int powerKeyLongPressTimeMs: 2000 // Is writable for testing purposes
44
43
45 QtObject {
44 QtObject {
46 id: d
45 id: d
@@ -49,24 +48,19 @@ Item {
49 property bool volumeUpKeyPressed: false
48 property bool volumeUpKeyPressed: false
50 }
49 }
51
50
52− // FIXME: event.isAutoRepeat is always false on Nexus 4.
53− // So we use powerKeyTimer.running to avoid the PowerOff key repeat
54− // https://launchpad.net/bugs/1349416
55 Timer {
51 Timer {
56 id: powerKeyLongPressTimer
52 id: powerKeyLongPressTimer
57
53
58− interval: powerKeyLongPressTimeMs
54+ interval: 2000
59− repeat: false
60− triggeredOnStart: false
61− onTriggered: powerKeyLongPress();
55+ onTriggered: root.powerKeyLongPress();
62 }
56 }
63
57
64
58
65− function onKeyPressed(key) {
59+ function onKeyPressed(event) {
66 var eventAccepted = false;
60 var eventAccepted = false;
67
61
68 /* Determine what key was pressed */
62 /* Determine what key was pressed */
69− if (key == Qt.Key_PowerDown || key == Qt.Key_PowerOff) {
63+ if (event.key == Qt.Key_PowerDown || event.key == Qt.Key_PowerOff) {
70
64
71 // FIXME: We only consider power key presses if the screen is
65 // FIXME: We only consider power key presses if the screen is
72 // on because of bugs 1410830/1409003. The theory is that when
66 // on because of bugs 1410830/1409003. The theory is that when
@@ -77,31 +71,31 @@ Item {
77 // initiate any dialogs when the screen is off.
71 // initiate any dialogs when the screen is off.
78 // This also prevents taking screenshots when the screen is off.
72 // This also prevents taking screenshots when the screen is off.
79 if (Powerd.status === Powerd.On) {
73 if (Powerd.status === Powerd.On) {
80− if (!powerKeyLongPressTimer.running) {
74+ if (!event.isAutoRepeat) {
81 powerKeyLongPressTimer.restart();
75 powerKeyLongPressTimer.restart();
82 }
76 }
83 eventAccepted = true;
77 eventAccepted = true;
84 }
78 }
85− } else if (key == Qt.Key_MediaTogglePlayPause || key == Qt.Key_MediaPlay) {
79+ } else if (event.key == Qt.Key_MediaTogglePlayPause || event.key == Qt.Key_MediaPlay) {
86 eventAccepted = callManager.handleMediaKey(false);
80 eventAccepted = callManager.handleMediaKey(false);
87− } else if (key == Qt.Key_VolumeDown) {
81+ } else if (event.key == Qt.Key_VolumeDown) {
88 d.volumeDownKeyPressed = true;
82 d.volumeDownKeyPressed = true;
89− } else if (key == Qt.Key_VolumeUp) {
83+ } else if (event.key == Qt.Key_VolumeUp) {
90 d.volumeUpKeyPressed = true;
84 d.volumeUpKeyPressed = true;
91 }
85 }
92
86
93 return eventAccepted;
87 return eventAccepted;
94 }
88 }
95
89
96− function onKeyReleased(key) {
90+ function onKeyReleased(event) {
97 var eventAccepted = false;
91 var eventAccepted = false;
98
92
99− if (key == Qt.Key_PowerDown || key == Qt.Key_PowerOff) {
93+ if (event.key == Qt.Key_PowerDown || event.key == Qt.Key_PowerOff) {
100 powerKeyLongPressTimer.stop();
94 powerKeyLongPressTimer.stop();
101 eventAccepted = true;
95 eventAccepted = true;
102− } else if (key == Qt.Key_VolumeDown) {
96+ } else if (event.key == Qt.Key_VolumeDown) {
103 d.volumeDownKeyPressed = false;
97 d.volumeDownKeyPressed = false;
104− } else if (key == Qt.Key_VolumeUp) {
98+ } else if (event.key == Qt.Key_VolumeUp) {
105 d.volumeUpKeyPressed = false;
99 d.volumeUpKeyPressed = false;
106 }
100 }
107
101
qml/Shell.qml+2−2
@@ -184,11 +184,11 @@ Item {
184
184
185 WindowKeysFilter {
185 WindowKeysFilter {
186 Keys.onPressed: {
186 Keys.onPressed: {
187− event.accepted = physicalKeysMapper.onKeyPressed(event.key);
187+ event.accepted = physicalKeysMapper.onKeyPressed(event);
188 }
188 }
189
189
190 Keys.onReleased: {
190 Keys.onReleased: {
191− event.accepted = physicalKeysMapper.onKeyReleased(event.key);
191+ event.accepted = physicalKeysMapper.onKeyReleased(event);
192 }
192 }
193 }
193 }
194
194
tests/qmltests/Components/tst_PhysicalKeysMapper.qml+23−27
@@ -21,65 +21,61 @@ import "../../../qml/Components"
21TestCase {
21TestCase {
22 name: "PhysicalKeysMapper"
22 name: "PhysicalKeysMapper"
23
23
24− property int onPowerKeyLongPressCount: 0
25− property int initialLongPressTimerValue
26−
27 PhysicalKeysMapper {
24 PhysicalKeysMapper {
28 id: physicalKeysMapper
25 id: physicalKeysMapper
29−
30− onPowerKeyLongPress: onPowerKeyLongPressCount += 1
31 }
26 }
32
27
33− function initTestCase() {
28+ SignalSpy {
34− initialLongPressTimerValue = physicalKeysMapper.powerKeyLongPressTimeMs
29+ id: powerSpy
30+ target: physicalKeysMapper
31+ signalName: "powerKeyLongPress"
35 }
32 }
36
33
37 function cleanup() {
34 function cleanup() {
38− physicalKeysMapper.onKeyReleased(Qt.Key_PowerDown);
35+ physicalKeysMapper.onKeyReleased({ key: Qt.Key_PowerDown });
39− physicalKeysMapper.onKeyReleased(Qt.Key_PowerOff);
36+ physicalKeysMapper.onKeyReleased({ key: Qt.Key_VolumeDown });
40− physicalKeysMapper.onKeyReleased(Qt.Key_VolumeDown);
41− physicalKeysMapper.onKeyReleased(Qt.Key_VolumeUp);
37+ physicalKeysMapper.onKeyReleased({ key: Qt.Key_VolumeUp });
42
38
43− onPowerKeyLongPressCount = 0;
39+ powerSpy.clear();
44−
45− physicalKeysMapper.powerKeyLongPressTimeMs = initialLongPressTimerValue
46 }
40 }
47
41
48 function test_LongPressPowerButton() {
42 function test_LongPressPowerButton() {
49− // Delays chosen are lowest reliable values
50− physicalKeysMapper.powerKeyLongPressTimeMs = 2
51− physicalKeysMapper.onKeyPressed(Qt.Key_PowerDown);
43+ physicalKeysMapper.onKeyPressed({ key: Qt.Key_PowerDown });
52− wait(15);
44+
45+ expectFailContinue("", "Power signal should not be emitted within a second");
46+ powerSpy.wait(1000);
47+ powerSpy.clear();
53
48
54− compare(onPowerKeyLongPressCount, 1);
49+ physicalKeysMapper.onKeyPressed({ key: Qt.Key_PowerDown, isAutoRepeat: true });
50+ powerSpy.wait(1500);
55 }
51 }
56
52
57 function test_ScreenshotButtons() {
53 function test_ScreenshotButtons() {
58 /* Behavior when VolumeUp is pressed 1st */
54 /* Behavior when VolumeUp is pressed 1st */
59− physicalKeysMapper.onKeyPressed(Qt.Key_VolumeUp);
55+ physicalKeysMapper.onKeyPressed({ key: Qt.Key_VolumeUp });
60− physicalKeysMapper.onKeyPressed(Qt.Key_VolumeDown);
56+ physicalKeysMapper.onKeyPressed({ key: Qt.Key_VolumeDown });
61 compare(physicalKeysMapper.screenshotPressed, true);
57 compare(physicalKeysMapper.screenshotPressed, true);
62 compare(physicalKeysMapper.volumeDownPressed, false);
58 compare(physicalKeysMapper.volumeDownPressed, false);
63
59
64− physicalKeysMapper.onKeyReleased(Qt.Key_VolumeUp);
60+ physicalKeysMapper.onKeyReleased({ key: Qt.Key_VolumeUp });
65− physicalKeysMapper.onKeyReleased(Qt.Key_VolumeDown);
61+ physicalKeysMapper.onKeyReleased({ key: Qt.Key_VolumeDown });
66
62
67 /* Behavior when VolumeDown is pressed 1st */
63 /* Behavior when VolumeDown is pressed 1st */
68− physicalKeysMapper.onKeyPressed(Qt.Key_VolumeDown);
64+ physicalKeysMapper.onKeyPressed({ key: Qt.Key_VolumeDown });
69 compare(physicalKeysMapper.volumeDownPressed, true);
65 compare(physicalKeysMapper.volumeDownPressed, true);
70− physicalKeysMapper.onKeyPressed(Qt.Key_VolumeUp);
66+ physicalKeysMapper.onKeyPressed({ key: Qt.Key_VolumeUp });
71 compare(physicalKeysMapper.screenshotPressed, true);
67 compare(physicalKeysMapper.screenshotPressed, true);
72 }
68 }
73
69
74 function test_VolumeDownButton() {
70 function test_VolumeDownButton() {
75 compare(physicalKeysMapper.volumeDownPressed, false);
71 compare(physicalKeysMapper.volumeDownPressed, false);
76− physicalKeysMapper.onKeyPressed(Qt.Key_VolumeDown);
72+ physicalKeysMapper.onKeyPressed({ key: Qt.Key_VolumeDown });
77 compare(physicalKeysMapper.volumeDownPressed, true);
73 compare(physicalKeysMapper.volumeDownPressed, true);
78 }
74 }
79
75
80 function test_VolumeUpButton() {
76 function test_VolumeUpButton() {
81 compare(physicalKeysMapper.volumeUpPressed, false);
77 compare(physicalKeysMapper.volumeUpPressed, false);
82− physicalKeysMapper.onKeyPressed(Qt.Key_VolumeUp);
78+ physicalKeysMapper.onKeyPressed({ key: Qt.Key_VolumeUp });
83 compare(physicalKeysMapper.volumeUpPressed, true);
79 compare(physicalKeysMapper.volumeUpPressed, true);
84 }
80 }
85}
81}