Skip to content
This repository was archived by the owner on Sep 7, 2022. It is now read-only.

Commit 793bfc6

Browse files
committed
fix android part
1 parent 69d0684 commit 793bfc6

File tree

2 files changed

+68
-158
lines changed

2 files changed

+68
-158
lines changed

engine/src/shell/platform/unity/android/uiwidgets_panel.cc

Lines changed: 54 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -311,103 +311,57 @@ namespace uiwidgets
311311
vsync_batons_.push_back(baton);
312312
}
313313

314-
void UIWidgetsPanel::SetEventPhaseFromCursorButtonState(
315-
UIWidgetsPointerEvent *event_data)
316-
{
317-
MouseState state = GetMouseState();
318-
event_data->phase = state.buttons == 0
319-
? state.state_is_down ? UIWidgetsPointerPhase::kUp
320-
: UIWidgetsPointerPhase::kHover
321-
: state.state_is_down ? UIWidgetsPointerPhase::kMove
322-
: UIWidgetsPointerPhase::kDown;
323-
}
324-
325-
void UIWidgetsPanel::SendMouseMove(float x, float y)
326-
{
327-
UIWidgetsPointerEvent event = {};
328-
event.x = x;
329-
event.y = y;
330-
SetEventPhaseFromCursorButtonState(&event);
331-
SendPointerEventWithData(event);
332-
}
333-
334-
void UIWidgetsPanel::SendMouseDown(float x, float y)
335-
{
336-
UIWidgetsPointerEvent event = {};
337-
SetEventPhaseFromCursorButtonState(&event);
338-
event.x = x;
339-
event.y = y;
340-
SendPointerEventWithData(event);
341-
SetMouseStateDown(true);
342-
}
343-
344-
void UIWidgetsPanel::SendMouseUp(float x, float y)
345-
{
346-
UIWidgetsPointerEvent event = {};
347-
SetEventPhaseFromCursorButtonState(&event);
348-
event.x = x;
349-
event.y = y;
350-
SendPointerEventWithData(event);
351-
if (event.phase == UIWidgetsPointerPhase::kUp)
352-
{
353-
SetMouseStateDown(false);
354-
}
355-
}
356-
357-
void UIWidgetsPanel::SendMouseLeave()
358-
{
359-
UIWidgetsPointerEvent event = {};
360-
event.phase = UIWidgetsPointerPhase::kRemove;
361-
SendPointerEventWithData(event);
362-
}
363-
364-
void UIWidgetsPanel::SendPointerEventWithData(
365-
const UIWidgetsPointerEvent &event_data)
366-
{
367-
MouseState mouse_state = GetMouseState();
368-
// If sending anything other than an add, and the pointer isn't already added,
369-
// synthesize an add to satisfy Flutter's expectations about events.
370-
if (!mouse_state.state_is_added &&
371-
event_data.phase != UIWidgetsPointerPhase::kAdd)
372-
{
373-
UIWidgetsPointerEvent event = {};
374-
event.phase = UIWidgetsPointerPhase::kAdd;
375-
event.x = event_data.x;
376-
event.y = event_data.y;
377-
event.buttons = 0;
378-
SendPointerEventWithData(event);
379-
}
380-
// Don't double-add (e.g., if events are delivered out of order, so an add has
381-
// already been synthesized).
382-
if (mouse_state.state_is_added &&
383-
event_data.phase == UIWidgetsPointerPhase::kAdd)
384-
{
385-
return;
386-
}
314+
void UIWidgetsPanel::dispatchTouches(float x, float y, int button, UIWidgetsTouchPhase phase)
315+
{
316+
PointerData pointer_data;
317+
pointer_data.Clear();
387318

388-
UIWidgetsPointerEvent event = event_data;
389-
event.device_kind = kUIWidgetsPointerDeviceKindMouse;
390-
event.buttons = mouse_state.buttons;
319+
auto packet = std::make_unique<PointerDataPacket>(1);
391320

392-
// Set metadata that's always the same regardless of the event.
393-
event.struct_size = sizeof(event);
394-
event.timestamp =
395-
std::chrono::duration_cast<std::chrono::microseconds>(
321+
pointer_data.time_stamp = std::chrono::duration_cast<std::chrono::microseconds>(
396322
std::chrono::high_resolution_clock::now().time_since_epoch())
397323
.count();
398-
399-
UIWidgetsEngineSendPointerEvent(engine_, &event, 1);
400-
401-
if (event_data.phase == UIWidgetsPointerPhase::kAdd)
402-
{
403-
SetMouseStateAdded(true);
404-
}
405-
else if (event_data.phase == UIWidgetsPointerPhase::kRemove)
406-
{
407-
SetMouseStateAdded(false);
408-
ResetMouseState();
409-
}
410-
}
324+
325+
pointer_data.change = UIWidgetsPanel::PointerDataChangeFromUITouchPhase(phase);
326+
pointer_data.kind = UIWidgetsPanel::DeviceKindFromTouchType();
327+
pointer_data.device = -button;
328+
pointer_data.pointer_identifier = 0;
329+
pointer_data.physical_x = x;
330+
pointer_data.physical_y = y;
331+
pointer_data.physical_delta_x = 0.0;
332+
pointer_data.physical_delta_y = 0.0;
333+
pointer_data.pressure = 1.0;
334+
pointer_data.pressure_max = 1.0;
335+
pointer_data.signal_kind = PointerData::SignalKind::kNone;
336+
packet->SetPointerData(0, pointer_data);
337+
338+
reinterpret_cast<EmbedderEngine*>(engine_)->DispatchPointerDataPacket(
339+
std::move(packet));
340+
}
341+
342+
PointerData::Change UIWidgetsPanel::PointerDataChangeFromUITouchPhase(UIWidgetsTouchPhase phase)
343+
{
344+
switch(phase) {
345+
case TouchBegan:
346+
return PointerData::Change::kDown;
347+
case TouchMoved:
348+
return PointerData::Change::kMove;
349+
case TouchEnded:
350+
return PointerData::Change::kUp;
351+
case TouchCancelled:
352+
return PointerData::Change::kCancel;
353+
default:
354+
std::cerr << "Unhandled touch phase: " << phase << std::endl;
355+
break;
356+
}
357+
358+
return PointerData::Change::kCancel;
359+
}
360+
361+
PointerData::DeviceKind UIWidgetsPanel::DeviceKindFromTouchType()
362+
{
363+
return PointerData::DeviceKind::kTouch;
364+
}
411365

412366
void UIWidgetsPanel::OnKeyDown(int keyCode, bool isKeyDown)
413367
{
@@ -428,63 +382,34 @@ namespace uiwidgets
428382
}
429383
}
430384

431-
void UIWidgetsPanel::OnMouseMove(float x, float y)
385+
void UIWidgetsPanel::OnMouseMove(float x, float y, int button)
432386
{
433387
if (process_events_)
434388
{
435-
SendMouseMove(x, y);
436-
}
437-
}
438-
439-
static uint64_t ConvertToUIWidgetsButton(int button)
440-
{
441-
switch (button)
442-
{
443-
case -1:
444-
return kUIWidgetsPointerButtonMousePrimary;
445-
case -2:
446-
return kUIWidgetsPointerButtonMouseSecondary;
447-
case -3:
448-
return kUIWidgetsPointerButtonMouseMiddle;
389+
dispatchTouches(x, y, button, TouchMoved);
449390
}
450-
std::cerr << "Mouse button not recognized: " << button << std::endl;
451-
return 0;
452391
}
453392

454393
void UIWidgetsPanel::OnMouseDown(float x, float y, int button)
455394
{
456395
if (process_events_)
457396
{
458-
uint64_t uiwidgets_button = ConvertToUIWidgetsButton(button);
459-
if (uiwidgets_button != 0)
460-
{
461-
uint64_t mouse_buttons = GetMouseState().buttons | uiwidgets_button;
462-
SetMouseButtons(mouse_buttons);
463-
SendMouseDown(x, y);
464-
}
397+
dispatchTouches(x, y, button, TouchBegan);
465398
}
466399
}
467400

468401
void UIWidgetsPanel::OnMouseUp(float x, float y, int button)
469402
{
470403
if (process_events_)
471404
{
472-
uint64_t uiwidgets_button = ConvertToUIWidgetsButton(button);
473-
if (uiwidgets_button != 0)
474-
{
475-
uint64_t mouse_buttons = GetMouseState().buttons & ~uiwidgets_button;
476-
SetMouseButtons(mouse_buttons);
477-
SendMouseUp(x, y);
478-
}
405+
dispatchTouches(x, y, button, TouchEnded);
479406
}
480407
}
481408

482409
void UIWidgetsPanel::OnMouseLeave()
483410
{
484-
if (process_events_)
485-
{
486-
SendMouseLeave();
487-
}
411+
//there should not be mouse leave events on iPhone!
412+
std::cerr << "Invalid input on iPhone: mouse leave" << std::endl;
488413
}
489414

490415
UIWIDGETS_API(UIWidgetsPanel *)
@@ -563,7 +488,7 @@ namespace uiwidgets
563488
UIWIDGETS_API(void)
564489
UIWidgetsPanel_onMouseMove(UIWidgetsPanel *panel, float x, float y, int button)
565490
{
566-
panel->OnMouseMove(x, y);
491+
panel->OnMouseMove(x, y, button);
567492
}
568493

569494
UIWIDGETS_API(void)

engine/src/shell/platform/unity/android/uiwidgets_panel.h

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <flutter/fml/memory/ref_counted.h>
44

55
#include "shell/platform/unity/gfx_worker_task_runner.h"
6+
#include "lib/ui/window/pointer_data.h"
67
#include "runtime/mono_api.h"
78
#include "unity_surface_manager.h"
89
#include "android_task_runner.h"
@@ -14,10 +15,13 @@ enum UIWidgetsWindowType {
1415
GameObjectPanel = 1,
1516
EditorWindowPanel = 2
1617
};
17-
struct MouseState {
18-
bool state_is_down = false;
19-
bool state_is_added = false;
20-
uint64_t buttons = 0;
18+
19+
enum UIWidgetsTouchPhase
20+
{
21+
TouchBegan,
22+
TouchEnded,
23+
TouchMoved,
24+
TouchCancelled
2125
};
2226

2327
class UIWidgetsPanel : public fml::RefCountedThreadSafe<UIWidgetsPanel> {
@@ -54,7 +58,7 @@ class UIWidgetsPanel : public fml::RefCountedThreadSafe<UIWidgetsPanel> {
5458

5559
void OnKeyDown(int keyCode, bool isKeyDown);
5660

57-
void OnMouseMove(float x, float y);
61+
void OnMouseMove(float x, float y, int button);
5862

5963
void OnMouseDown(float x, float y, int button);
6064

@@ -69,30 +73,12 @@ class UIWidgetsPanel : public fml::RefCountedThreadSafe<UIWidgetsPanel> {
6973
private:
7074
UIWidgetsPanel(Mono_Handle handle, UIWidgetsWindowType window_type, EntrypointCallback entrypoint_callback);
7175

72-
MouseState GetMouseState() { return mouse_state_; }
73-
74-
void ResetMouseState() { mouse_state_ = MouseState(); }
75-
76-
void SetMouseStateDown(bool is_down) { mouse_state_.state_is_down = is_down; }
77-
78-
void SetMouseStateAdded(bool is_added) {
79-
mouse_state_.state_is_added = is_added;
80-
}
81-
82-
void SetMouseButtons(uint64_t buttons) { mouse_state_.buttons = buttons; }
83-
84-
void SendMouseMove(float x, float y);
85-
86-
void SendMouseDown(float x, float y);
87-
88-
void SendMouseUp(float x, float y);
89-
90-
void SendMouseLeave();
91-
92-
void SetEventPhaseFromCursorButtonState(UIWidgetsPointerEvent* event_data);
93-
94-
void SendPointerEventWithData(const UIWidgetsPointerEvent& event_data);
76+
void dispatchTouches(float x, float y, int button, UIWidgetsTouchPhase evtType);
9577

78+
static PointerData::Change PointerDataChangeFromUITouchPhase(UIWidgetsTouchPhase phase);
79+
80+
static PointerData::DeviceKind DeviceKindFromTouchType();
81+
9682
Mono_Handle handle_;
9783
UIWidgetsWindowType window_type_;
9884
EntrypointCallback entrypoint_callback_;
@@ -106,7 +92,6 @@ class UIWidgetsPanel : public fml::RefCountedThreadSafe<UIWidgetsPanel> {
10692

10793
std::vector<intptr_t> vsync_batons_;
10894

109-
MouseState mouse_state_;
11095
bool process_events_ = false;
11196
};
11297

0 commit comments

Comments
 (0)