Mir

Merge lp:~andreas-pokorny/mir/fix-1321077 into lp:mir

Proposed by Andreas Pokorny
Status: Merged
Approved by: Daniel van Vugt
Approved revision: no longer in the source branch.
Merged at revision: 1645
Proposed branch: lp:~andreas-pokorny/mir/fix-1321077
Merge into: lp:mir
Diff against target: 206 lines (+166/-1)
2 files modified
src/server/input/android/android_input_dispatcher.cpp (+3/-1)
tests/unit-tests/input/android/test_android_input_dispatcher.cpp (+163/-0)
To merge this branch: bzr merge lp:~andreas-pokorny/mir/fix-1321077
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve
Alexandros Frantzis (community) Approve
Alan Griffiths Approve
Daniel van Vugt Approve
Review via email: mp+220200@code.launchpad.net

Commit message

Fix blank fields: vscroll, hscroll, tool_type (LP: #1321077)

Description of the change

Inside mir::input::android::AndroidInputDispatcher three entries of the pointer coordinates and pointer properties of motion events were not copied to the NotifyMotionArgs structure. This code was not used until yesterday when lp:~andreas-pokorny/mir/drop-dynamic-ptr-cast-in-input-configuration landed.

This change adds two missing unit tests and fixes the issue.

To post a comment you must log in.
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Works for me :)

I think you need a more descriptive commit message though. Also mention "(LP: #1321077)".

review: Approve
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

The tests are horribly verbose (but not otherwise hard to grok).

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Alexandros Frantzis (afrantzis) wrote :

Looks good (CI failure looks unrelated).

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/server/input/android/android_input_dispatcher.cpp'
--- src/server/input/android/android_input_dispatcher.cpp 2014-05-19 02:55:29 +0000
+++ src/server/input/android/android_input_dispatcher.cpp 2014-05-20 12:42:08 +0000
@@ -82,7 +82,7 @@
82 for(auto i = 0U; i != event.motion.pointer_count; ++i)82 for(auto i = 0U; i != event.motion.pointer_count; ++i)
83 {83 {
84 pointer_properties[i].id = event.motion.pointer_coordinates[i].id;84 pointer_properties[i].id = event.motion.pointer_coordinates[i].id;
85 pointer_properties[i].toolType = 0;85 pointer_properties[i].toolType = event.motion.pointer_coordinates[i].tool_type;
8686
87 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_X, event.motion.pointer_coordinates[i].x);87 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_X, event.motion.pointer_coordinates[i].x);
88 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_Y, event.motion.pointer_coordinates[i].y);88 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_Y, event.motion.pointer_coordinates[i].y);
@@ -90,6 +90,8 @@
90 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_SIZE, event.motion.pointer_coordinates[i].size);90 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_SIZE, event.motion.pointer_coordinates[i].size);
91 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, event.motion.pointer_coordinates[i].touch_major);91 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, event.motion.pointer_coordinates[i].touch_major);
92 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, event.motion.pointer_coordinates[i].touch_minor);92 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, event.motion.pointer_coordinates[i].touch_minor);
93 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_VSCROLL, event.motion.pointer_coordinates[i].vscroll);
94 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_HSCROLL, event.motion.pointer_coordinates[i].hscroll);
93 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, event.motion.pointer_coordinates[i].orientation);95 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, event.motion.pointer_coordinates[i].orientation);
94 }96 }
9597
9698
=== modified file 'tests/unit-tests/input/android/test_android_input_dispatcher.cpp'
--- tests/unit-tests/input/android/test_android_input_dispatcher.cpp 2014-05-19 02:55:29 +0000
+++ tests/unit-tests/input/android/test_android_input_dispatcher.cpp 2014-05-20 12:42:08 +0000
@@ -29,6 +29,7 @@
29#include <gmock/gmock.h>29#include <gmock/gmock.h>
3030
31#include <initializer_list>31#include <initializer_list>
32#include <cstring>
3233
33namespace droidinput = android;34namespace droidinput = android;
3435
@@ -59,6 +60,7 @@
59 std::shared_ptr<mtd::MockAndroidInputDispatcher> dispatcher = std::make_shared<mtd::MockAndroidInputDispatcher>();60 std::shared_ptr<mtd::MockAndroidInputDispatcher> dispatcher = std::make_shared<mtd::MockAndroidInputDispatcher>();
60 std::shared_ptr<MockInputThread> dispatcher_thread = std::make_shared<MockInputThread>();61 std::shared_ptr<MockInputThread> dispatcher_thread = std::make_shared<MockInputThread>();
61 mia::AndroidInputDispatcher input_dispatcher{dispatcher,dispatcher_thread};62 mia::AndroidInputDispatcher input_dispatcher{dispatcher,dispatcher_thread};
63 const uint32_t default_policy_flags = 0;
62};64};
6365
64}66}
@@ -92,3 +94,164 @@
9294
93 input_dispatcher.stop();95 input_dispatcher.stop();
94}96}
97
98MATCHER_P(MotionArgsMatches, expected, "")
99{
100 bool scalar_members_identical =
101 arg->eventTime == expected.eventTime &&
102 arg->deviceId == expected.deviceId &&
103 arg->action == expected.action &&
104 arg->flags == expected.flags &&
105 arg->metaState == expected.metaState &&
106 arg->buttonState == expected.buttonState &&
107 arg->edgeFlags == expected.edgeFlags &&
108 arg->pointerCount == expected.pointerCount &&
109 arg->xPrecision == expected.xPrecision &&
110 arg->yPrecision == expected.yPrecision &&
111 arg->downTime == expected.downTime;
112
113 if (!scalar_members_identical)
114 return false;
115
116 int relevant_axis[] = {AMOTION_EVENT_AXIS_ORIENTATION, AMOTION_EVENT_AXIS_TOUCH_MAJOR, AMOTION_EVENT_AXIS_PRESSURE,
117 AMOTION_EVENT_AXIS_X, AMOTION_EVENT_AXIS_Y, AMOTION_EVENT_AXIS_SIZE,
118 AMOTION_EVENT_AXIS_HSCROLL, AMOTION_EVENT_AXIS_VSCROLL};
119 for (uint32_t i = 0; i != arg->pointerCount; ++i)
120 {
121 for (int j = 0; j != sizeof(relevant_axis)/sizeof(relevant_axis[0]); ++j)
122 {
123 float expected_axis = expected.pointerCoords[i].getAxisValue(relevant_axis[j]);
124 float received_axis = arg->pointerCoords[i].getAxisValue(relevant_axis[j]);
125 if (expected_axis != received_axis)
126 return false;
127 }
128 if (expected.pointerProperties[i].id != arg->pointerProperties[i].id ||
129 expected.pointerProperties[i].toolType!= arg->pointerProperties[i].toolType)
130 {
131 return false;
132 }
133 }
134
135 return true;
136}
137
138MATCHER_P(KeyArgsMatches, expected, "")
139{
140 return
141 arg->eventTime == expected.eventTime &&
142 arg->deviceId == expected.deviceId &&
143 arg->source == expected.source &&
144 arg->action == expected.action &&
145 arg->flags == expected.flags &&
146 arg->keyCode == expected.keyCode &&
147 arg->scanCode == expected.scanCode &&
148 arg->metaState == expected.metaState &&
149 arg->downTime == expected.downTime;
150}
151
152TEST_F(AndroidInputDispatcherTest, axis_values_are_properly_converted)
153{
154 using namespace ::testing;
155 droidinput::PointerCoords expected_coords[MIR_INPUT_EVENT_MAX_POINTER_COUNT];
156 droidinput::PointerProperties expected_properties[MIR_INPUT_EVENT_MAX_POINTER_COUNT];
157
158 std::memset(expected_coords, 0, sizeof(expected_coords));
159 std::memset(expected_properties, 0, sizeof(expected_properties));
160 MirEvent event;
161 event.type = mir_event_type_motion;
162 event.motion.pointer_count = 1;
163 event.motion.event_time = 2;
164 event.motion.device_id = 3;
165 event.motion.source_id = 4;
166 event.motion.action = mir_motion_action_scroll;
167 event.motion.flags = mir_motion_flag_window_is_obscured;
168 event.motion.modifiers = 6;
169 event.motion.edge_flags = 7;
170 event.motion.button_state =
171 static_cast<MirMotionButton>(mir_motion_button_forward | mir_motion_button_secondary);
172 event.motion.x_offset = 0.0f;
173 event.motion.y_offset = 0.0f;
174 event.motion.x_precision = 9.0f;
175 event.motion.y_precision = 10.0f;
176 event.motion.down_time = 11;
177
178 auto & pointer = event.motion.pointer_coordinates[0];
179 pointer.id = 1;
180 pointer.x = 12.0f;
181 pointer.raw_x = 12.0f;
182 pointer.y = 13.0f;
183 pointer.raw_y = 13.0f;
184 pointer.touch_major = 14.0f;
185 pointer.touch_minor = 15.0f;
186 pointer.size = 16.0f;
187 pointer.pressure = 17.0f;
188 pointer.orientation = 18.0f;
189 pointer.vscroll = 19.0f;
190 pointer.hscroll = 20.0f;
191 pointer.tool_type = mir_motion_tool_type_finger;
192
193 expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_X, pointer.x);
194 expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, pointer.y);
195 expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointer.touch_major);
196 expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, pointer.touch_minor);
197 expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_SIZE, pointer.size);
198 expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, pointer.pressure);
199 expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, pointer.orientation);
200 expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_VSCROLL, pointer.vscroll);
201 expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_HSCROLL, pointer.hscroll);
202 expected_properties[0].id = pointer.id;
203 expected_properties[0].toolType = pointer.tool_type;
204
205 droidinput::NotifyMotionArgs expected(event.motion.event_time,
206 event.motion.device_id,
207 event.motion.source_id,
208 default_policy_flags,
209 event.motion.action,
210 event.motion.flags,
211 event.motion.modifiers,
212 event.motion.button_state,
213 event.motion.edge_flags,
214 event.motion.pointer_count,
215 expected_properties,
216 expected_coords,
217 event.motion.x_precision,
218 event.motion.y_precision,
219 event.motion.down_time);
220
221 EXPECT_CALL(*dispatcher, notifyMotion(MotionArgsMatches(expected)));
222
223 input_dispatcher.dispatch(event);
224}
225
226TEST_F(AndroidInputDispatcherTest, forwards_all_key_event_paramters_correctly)
227{
228 using namespace ::testing;
229 MirEvent event;
230 event.type = mir_event_type_key;
231 event.key.event_time = 1;
232 event.key.device_id = 2;
233 event.key.source_id = 3;
234 event.key.action = mir_key_action_down;
235 event.key.flags = mir_key_flag_long_press;
236 event.key.scan_code = 4;
237 event.key.key_code = 5;
238 event.key.repeat_count = 0;
239 event.key.down_time = 6;
240 event.key.modifiers = 7;
241 event.key.is_system_key = false;
242
243 droidinput::NotifyKeyArgs expected(event.key.event_time,
244 event.key.device_id,
245 event.key.source_id,
246 default_policy_flags,
247 event.key.action,
248 event.key.flags,
249 event.key.key_code,
250 event.key.scan_code,
251 event.key.modifiers,
252 event.key.down_time);
253
254 EXPECT_CALL(*dispatcher, notifyKey(KeyArgsMatches(expected)));
255
256 input_dispatcher.dispatch(event);
257}

Subscribers

People subscribed via source and target branches