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
1=== modified file 'src/server/input/android/android_input_dispatcher.cpp'
2--- src/server/input/android/android_input_dispatcher.cpp 2014-05-19 02:55:29 +0000
3+++ src/server/input/android/android_input_dispatcher.cpp 2014-05-20 12:42:08 +0000
4@@ -82,7 +82,7 @@
5 for(auto i = 0U; i != event.motion.pointer_count; ++i)
6 {
7 pointer_properties[i].id = event.motion.pointer_coordinates[i].id;
8- pointer_properties[i].toolType = 0;
9+ pointer_properties[i].toolType = event.motion.pointer_coordinates[i].tool_type;
10
11 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_X, event.motion.pointer_coordinates[i].x);
12 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_Y, event.motion.pointer_coordinates[i].y);
13@@ -90,6 +90,8 @@
14 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_SIZE, event.motion.pointer_coordinates[i].size);
15 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, event.motion.pointer_coordinates[i].touch_major);
16 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, event.motion.pointer_coordinates[i].touch_minor);
17+ pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_VSCROLL, event.motion.pointer_coordinates[i].vscroll);
18+ pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_HSCROLL, event.motion.pointer_coordinates[i].hscroll);
19 pointer_coords[i].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, event.motion.pointer_coordinates[i].orientation);
20 }
21
22
23=== modified file 'tests/unit-tests/input/android/test_android_input_dispatcher.cpp'
24--- tests/unit-tests/input/android/test_android_input_dispatcher.cpp 2014-05-19 02:55:29 +0000
25+++ tests/unit-tests/input/android/test_android_input_dispatcher.cpp 2014-05-20 12:42:08 +0000
26@@ -29,6 +29,7 @@
27 #include <gmock/gmock.h>
28
29 #include <initializer_list>
30+#include <cstring>
31
32 namespace droidinput = android;
33
34@@ -59,6 +60,7 @@
35 std::shared_ptr<mtd::MockAndroidInputDispatcher> dispatcher = std::make_shared<mtd::MockAndroidInputDispatcher>();
36 std::shared_ptr<MockInputThread> dispatcher_thread = std::make_shared<MockInputThread>();
37 mia::AndroidInputDispatcher input_dispatcher{dispatcher,dispatcher_thread};
38+ const uint32_t default_policy_flags = 0;
39 };
40
41 }
42@@ -92,3 +94,164 @@
43
44 input_dispatcher.stop();
45 }
46+
47+MATCHER_P(MotionArgsMatches, expected, "")
48+{
49+ bool scalar_members_identical =
50+ arg->eventTime == expected.eventTime &&
51+ arg->deviceId == expected.deviceId &&
52+ arg->action == expected.action &&
53+ arg->flags == expected.flags &&
54+ arg->metaState == expected.metaState &&
55+ arg->buttonState == expected.buttonState &&
56+ arg->edgeFlags == expected.edgeFlags &&
57+ arg->pointerCount == expected.pointerCount &&
58+ arg->xPrecision == expected.xPrecision &&
59+ arg->yPrecision == expected.yPrecision &&
60+ arg->downTime == expected.downTime;
61+
62+ if (!scalar_members_identical)
63+ return false;
64+
65+ int relevant_axis[] = {AMOTION_EVENT_AXIS_ORIENTATION, AMOTION_EVENT_AXIS_TOUCH_MAJOR, AMOTION_EVENT_AXIS_PRESSURE,
66+ AMOTION_EVENT_AXIS_X, AMOTION_EVENT_AXIS_Y, AMOTION_EVENT_AXIS_SIZE,
67+ AMOTION_EVENT_AXIS_HSCROLL, AMOTION_EVENT_AXIS_VSCROLL};
68+ for (uint32_t i = 0; i != arg->pointerCount; ++i)
69+ {
70+ for (int j = 0; j != sizeof(relevant_axis)/sizeof(relevant_axis[0]); ++j)
71+ {
72+ float expected_axis = expected.pointerCoords[i].getAxisValue(relevant_axis[j]);
73+ float received_axis = arg->pointerCoords[i].getAxisValue(relevant_axis[j]);
74+ if (expected_axis != received_axis)
75+ return false;
76+ }
77+ if (expected.pointerProperties[i].id != arg->pointerProperties[i].id ||
78+ expected.pointerProperties[i].toolType!= arg->pointerProperties[i].toolType)
79+ {
80+ return false;
81+ }
82+ }
83+
84+ return true;
85+}
86+
87+MATCHER_P(KeyArgsMatches, expected, "")
88+{
89+ return
90+ arg->eventTime == expected.eventTime &&
91+ arg->deviceId == expected.deviceId &&
92+ arg->source == expected.source &&
93+ arg->action == expected.action &&
94+ arg->flags == expected.flags &&
95+ arg->keyCode == expected.keyCode &&
96+ arg->scanCode == expected.scanCode &&
97+ arg->metaState == expected.metaState &&
98+ arg->downTime == expected.downTime;
99+}
100+
101+TEST_F(AndroidInputDispatcherTest, axis_values_are_properly_converted)
102+{
103+ using namespace ::testing;
104+ droidinput::PointerCoords expected_coords[MIR_INPUT_EVENT_MAX_POINTER_COUNT];
105+ droidinput::PointerProperties expected_properties[MIR_INPUT_EVENT_MAX_POINTER_COUNT];
106+
107+ std::memset(expected_coords, 0, sizeof(expected_coords));
108+ std::memset(expected_properties, 0, sizeof(expected_properties));
109+ MirEvent event;
110+ event.type = mir_event_type_motion;
111+ event.motion.pointer_count = 1;
112+ event.motion.event_time = 2;
113+ event.motion.device_id = 3;
114+ event.motion.source_id = 4;
115+ event.motion.action = mir_motion_action_scroll;
116+ event.motion.flags = mir_motion_flag_window_is_obscured;
117+ event.motion.modifiers = 6;
118+ event.motion.edge_flags = 7;
119+ event.motion.button_state =
120+ static_cast<MirMotionButton>(mir_motion_button_forward | mir_motion_button_secondary);
121+ event.motion.x_offset = 0.0f;
122+ event.motion.y_offset = 0.0f;
123+ event.motion.x_precision = 9.0f;
124+ event.motion.y_precision = 10.0f;
125+ event.motion.down_time = 11;
126+
127+ auto & pointer = event.motion.pointer_coordinates[0];
128+ pointer.id = 1;
129+ pointer.x = 12.0f;
130+ pointer.raw_x = 12.0f;
131+ pointer.y = 13.0f;
132+ pointer.raw_y = 13.0f;
133+ pointer.touch_major = 14.0f;
134+ pointer.touch_minor = 15.0f;
135+ pointer.size = 16.0f;
136+ pointer.pressure = 17.0f;
137+ pointer.orientation = 18.0f;
138+ pointer.vscroll = 19.0f;
139+ pointer.hscroll = 20.0f;
140+ pointer.tool_type = mir_motion_tool_type_finger;
141+
142+ expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_X, pointer.x);
143+ expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, pointer.y);
144+ expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointer.touch_major);
145+ expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, pointer.touch_minor);
146+ expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_SIZE, pointer.size);
147+ expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, pointer.pressure);
148+ expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, pointer.orientation);
149+ expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_VSCROLL, pointer.vscroll);
150+ expected_coords[0].setAxisValue(AMOTION_EVENT_AXIS_HSCROLL, pointer.hscroll);
151+ expected_properties[0].id = pointer.id;
152+ expected_properties[0].toolType = pointer.tool_type;
153+
154+ droidinput::NotifyMotionArgs expected(event.motion.event_time,
155+ event.motion.device_id,
156+ event.motion.source_id,
157+ default_policy_flags,
158+ event.motion.action,
159+ event.motion.flags,
160+ event.motion.modifiers,
161+ event.motion.button_state,
162+ event.motion.edge_flags,
163+ event.motion.pointer_count,
164+ expected_properties,
165+ expected_coords,
166+ event.motion.x_precision,
167+ event.motion.y_precision,
168+ event.motion.down_time);
169+
170+ EXPECT_CALL(*dispatcher, notifyMotion(MotionArgsMatches(expected)));
171+
172+ input_dispatcher.dispatch(event);
173+}
174+
175+TEST_F(AndroidInputDispatcherTest, forwards_all_key_event_paramters_correctly)
176+{
177+ using namespace ::testing;
178+ MirEvent event;
179+ event.type = mir_event_type_key;
180+ event.key.event_time = 1;
181+ event.key.device_id = 2;
182+ event.key.source_id = 3;
183+ event.key.action = mir_key_action_down;
184+ event.key.flags = mir_key_flag_long_press;
185+ event.key.scan_code = 4;
186+ event.key.key_code = 5;
187+ event.key.repeat_count = 0;
188+ event.key.down_time = 6;
189+ event.key.modifiers = 7;
190+ event.key.is_system_key = false;
191+
192+ droidinput::NotifyKeyArgs expected(event.key.event_time,
193+ event.key.device_id,
194+ event.key.source_id,
195+ default_policy_flags,
196+ event.key.action,
197+ event.key.flags,
198+ event.key.key_code,
199+ event.key.scan_code,
200+ event.key.modifiers,
201+ event.key.down_time);
202+
203+ EXPECT_CALL(*dispatcher, notifyKey(KeyArgsMatches(expected)));
204+
205+ input_dispatcher.dispatch(event);
206+}

Subscribers

People subscribed via source and target branches