blob: 2d903282f7b7525cb9a2e8e49f5750aecd0e6914 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/ui/a11y/lib/gesture_manager/gesture_manager.h"
#include <fuchsia/ui/input/accessibility/cpp/fidl.h>
#include <cstdint>
#include <memory>
#include <vector>
#include "src/lib/testing/loop_fixture/test_loop_fixture.h"
#include "src/ui/a11y/lib/gesture_manager/recognizers/m_finger_n_tap_drag_recognizer.h"
#include "src/ui/a11y/lib/gesture_manager/recognizers/one_finger_n_tap_recognizer.h"
#include "src/ui/a11y/lib/gesture_manager/recognizers/timing_constants.h"
#include "src/ui/a11y/lib/gesture_manager/recognizers/two_finger_drag_recognizer.h"
#include "src/ui/a11y/lib/testing/input.h"
namespace accessibility_test {
namespace {
constexpr uint32_t kDefaultKoid = 100;
constexpr fuchsia::math::PointF kLocalPoint = {2, 2};
constexpr uint32_t kDefaultEventTime = 10;
constexpr uint32_t kDefaultDeviceId = 1;
constexpr uint32_t kDefaultPointerId = 1;
using AccessibilityPointerEvent = fuchsia::ui::input::accessibility::PointerEvent;
using Phase = fuchsia::ui::input::PointerEventPhase;
class GestureManagerTest : public gtest::TestLoopFixture {
public:
GestureManagerTest() { SetUp(); }
void SetUp() override;
~GestureManagerTest() override = default;
a11y::GestureManager gesture_manager_;
a11y::GestureHandler* gesture_handler_;
fuchsia::ui::input::accessibility::PointerEventListenerPtr listener_;
bool one_finger_up_swipe_detected_ = false;
bool one_finger_down_swipe_detected_ = false;
bool one_finger_left_swipe_detected_ = false;
bool one_finger_right_swipe_detected_ = false;
bool three_finger_up_swipe_detected_ = false;
bool three_finger_down_swipe_detected_ = false;
bool three_finger_left_swipe_detected_ = false;
bool three_finger_right_swipe_detected_ = false;
bool single_tap_detected_ = false;
bool double_tap_detected_ = false;
bool one_finger_drag_detected_ = false;
bool two_finger_drag_detected_ = false;
bool one_finger_triple_tap_detected_ = false;
bool one_finger_triple_tap_drag_detected_ = false;
bool three_finger_double_tap_detected_ = false;
bool three_finger_double_tap_drag_detected_ = false;
zx_koid_t actual_viewref_koid_ = 0;
fuchsia::math::PointF actual_point_ = {.x = 0, .y = 0};
uint32_t actual_device_id_ = 0;
uint32_t actual_pointer_id_ = 1000;
};
void GestureManagerTest::SetUp() {
listener_.Bind(gesture_manager_.binding().NewBinding());
gesture_handler_ = gesture_manager_.gesture_handler();
auto one_finger_up_swipe_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
one_finger_up_swipe_detected_ = true;
};
auto one_finger_down_swipe_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
one_finger_down_swipe_detected_ = true;
};
auto one_finger_left_swipe_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
one_finger_left_swipe_detected_ = true;
};
auto one_finger_right_swipe_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
one_finger_right_swipe_detected_ = true;
};
auto three_finger_up_swipe_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
three_finger_up_swipe_detected_ = true;
};
auto three_finger_down_swipe_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
three_finger_down_swipe_detected_ = true;
};
auto three_finger_left_swipe_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
three_finger_left_swipe_detected_ = true;
};
auto three_finger_right_swipe_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
three_finger_right_swipe_detected_ = true;
};
auto single_tap_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
single_tap_detected_ = true;
};
auto double_tap_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
double_tap_detected_ = true;
};
auto one_finger_triple_tap_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
one_finger_triple_tap_detected_ = true;
};
auto one_finger_triple_tap_drag_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
one_finger_triple_tap_drag_detected_ = true;
};
auto three_finger_double_tap_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
three_finger_double_tap_detected_ = true;
};
auto three_finger_double_tap_drag_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
three_finger_double_tap_drag_detected_ = true;
};
auto one_finger_drag_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
one_finger_drag_detected_ = true;
};
auto two_finger_drag_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
two_finger_drag_detected_ = true;
};
// Bind Gestures - Gesture with higher priority should be added first.
gesture_handler_->BindMFingerNTapAction(1, 3, std::move(one_finger_triple_tap_callback));
gesture_handler_->BindMFingerNTapAction(3, 2, std::move(three_finger_double_tap_callback));
gesture_handler_->BindMFingerNTapDragAction(
std::move(one_finger_triple_tap_drag_callback), [](a11y::GestureContext context) {},
[](a11y::GestureContext context) {}, 1, 3);
gesture_handler_->BindMFingerNTapDragAction(
std::move(three_finger_double_tap_drag_callback), [](a11y::GestureContext context) {},
[](a11y::GestureContext context) {}, 3, 2);
gesture_handler_->BindTwoFingerDragAction(
std::move(two_finger_drag_callback), [](a11y::GestureContext context) {},
[](a11y::GestureContext context) {});
gesture_handler_->BindSwipeAction(std::move(one_finger_up_swipe_callback),
a11y::GestureHandler::kOneFingerUpSwipe);
gesture_handler_->BindSwipeAction(std::move(one_finger_down_swipe_callback),
a11y::GestureHandler::kOneFingerDownSwipe);
gesture_handler_->BindSwipeAction(std::move(one_finger_left_swipe_callback),
a11y::GestureHandler::kOneFingerLeftSwipe);
gesture_handler_->BindSwipeAction(std::move(one_finger_right_swipe_callback),
a11y::GestureHandler::kOneFingerRightSwipe);
gesture_handler_->BindSwipeAction(std::move(three_finger_up_swipe_callback),
a11y::GestureHandler::kThreeFingerUpSwipe);
gesture_handler_->BindSwipeAction(std::move(three_finger_down_swipe_callback),
a11y::GestureHandler::kThreeFingerDownSwipe);
gesture_handler_->BindSwipeAction(std::move(three_finger_left_swipe_callback),
a11y::GestureHandler::kThreeFingerLeftSwipe);
gesture_handler_->BindSwipeAction(std::move(three_finger_right_swipe_callback),
a11y::GestureHandler::kThreeFingerRightSwipe);
gesture_handler_->BindOneFingerDoubleTapAction(std::move(double_tap_callback));
gesture_handler_->BindOneFingerSingleTapAction(std::move(single_tap_callback));
gesture_handler_->BindOneFingerDragAction(
std::move(one_finger_drag_callback), [](a11y::GestureContext context) {},
[](a11y::GestureContext context) {});
}
// Returns a default Accessibility Pointer Event.
AccessibilityPointerEvent GetDefaultPointerEvent() {
AccessibilityPointerEvent event;
event.set_event_time(kDefaultEventTime);
event.set_device_id(kDefaultDeviceId);
event.set_pointer_id(kDefaultPointerId);
event.set_type(fuchsia::ui::input::PointerEventType::TOUCH);
event.set_phase(Phase::ADD);
event.set_ndc_point({4, 4});
event.set_viewref_koid(kDefaultKoid);
event.set_local_point(kLocalPoint);
return event;
}
void ExecuteOneFingerTapAction(
fuchsia::ui::input::accessibility::PointerEventListenerPtr* listener) {
{
// Send an ADD event.
auto event = GetDefaultPointerEvent();
(*listener)->OnEvent(std::move(event));
}
{
// Send a Down event.
auto event = GetDefaultPointerEvent();
event.set_phase(Phase::DOWN);
(*listener)->OnEvent(std::move(event));
}
{
// Send an UP event.
auto event = GetDefaultPointerEvent();
event.set_phase(Phase::UP);
(*listener)->OnEvent(std::move(event));
}
{
// Send a REMOVE event.
auto event = GetDefaultPointerEvent();
event.set_phase(Phase::REMOVE);
(*listener)->OnEvent(std::move(event));
}
}
void SendPointerEvents(fuchsia::ui::input::accessibility::PointerEventListenerPtr* listener,
const std::vector<PointerParams>& events) {
for (const auto& event : events) {
auto pointer_event = ToPointerEvent(event, 0 /* event time (unused) */);
pointer_event.set_device_id(kDefaultDeviceId);
// pointer_event.set_pointer_id(kDefaultPointerId);
pointer_event.set_viewref_koid(kDefaultKoid);
pointer_event.set_local_point(kLocalPoint);
(*listener)->OnEvent(std::move(pointer_event));
}
}
TEST_F(GestureManagerTest, CallsActionOnSingleTap) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
ExecuteOneFingerTapAction(&listener_);
RunLoopFor(a11y::kMaxTapDuration);
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_pointer_id_, kDefaultPointerId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_TRUE(single_tap_detected_);
EXPECT_FALSE(double_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, CallsActionOnDoubleTap) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
ExecuteOneFingerTapAction(&listener_);
ExecuteOneFingerTapAction(&listener_);
RunLoopFor(a11y::kMaxTapDuration);
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_pointer_id_, kDefaultPointerId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_TRUE(double_tap_detected_);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, CallsActionOnOneFingerUpSwipe) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
// Perform Up Swipe.
glm::vec2 first_update_ndc_position = {0, -.7f};
SendPointerEvents(
&listener_, DownEvents(kDefaultPointerId, {}) + MoveEvents(1, {}, first_update_ndc_position));
SendPointerEvents(&listener_, MoveEvents(kDefaultPointerId, first_update_ndc_position,
first_update_ndc_position, 1) +
UpEvents(kDefaultPointerId, first_update_ndc_position));
RunLoopUntilIdle();
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_pointer_id_, kDefaultPointerId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(double_tap_detected_);
EXPECT_TRUE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, CallsActionOnThreeFingerUpSwipe) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
// Perform Three finger Up Swipe.
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, DownEvents(finger, {}));
}
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, MoveEvents(finger, {}, {0, -.7f}));
}
// UP event must be between .375 and .75 NDC from DOWN event for gesture to be considered
// a swipe.
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, UpEvents(finger, {0, -.7f}));
}
RunLoopUntilIdle();
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(double_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_TRUE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, CallsActionOnOneFingerDownSwipe) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
glm::vec2 first_update_ndc_position = {0, .7f};
// Perform Down Swipe.
SendPointerEvents(
&listener_, DownEvents(kDefaultPointerId, {}) + MoveEvents(1, {}, first_update_ndc_position));
SendPointerEvents(&listener_, MoveEvents(kDefaultPointerId, first_update_ndc_position,
first_update_ndc_position, 1) +
UpEvents(kDefaultPointerId, first_update_ndc_position));
RunLoopUntilIdle();
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_pointer_id_, kDefaultPointerId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(double_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_TRUE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, CallsActionOnThreeFingerDownSwipe) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
// Perform Three Finger Down Swipe.
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, DownEvents(finger, {}));
}
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, MoveEvents(finger, {}, {0, .7f}));
}
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, UpEvents(finger, {0, .7f}));
}
RunLoopUntilIdle();
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(double_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_TRUE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, CallsActionOnOneFingerLeftSwipe) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
glm::vec2 first_update_ndc_position = {-.7f, 0};
// Perform Left Swipe.
SendPointerEvents(
&listener_, DownEvents(kDefaultPointerId, {}) + MoveEvents(1, {}, first_update_ndc_position));
SendPointerEvents(&listener_, MoveEvents(kDefaultPointerId, first_update_ndc_position,
first_update_ndc_position, 1) +
UpEvents(kDefaultPointerId, first_update_ndc_position));
RunLoopUntilIdle();
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_pointer_id_, kDefaultPointerId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(double_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_TRUE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, CallsActionOnThreeFingerLeftSwipe) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
// Perform Three Finger Left Swipe.
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, DownEvents(finger, {}));
}
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, MoveEvents(finger, {}, {-.7f, 0}));
}
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, UpEvents(finger, {-.7f, 0}));
}
RunLoopUntilIdle();
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(double_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_TRUE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, CallsActionOnOneFingerRightSwipe) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
glm::vec2 first_update_ndc_position = {.7f, 0};
// Perform Right Swipe.
SendPointerEvents(
&listener_, DownEvents(kDefaultPointerId, {}) + MoveEvents(1, {}, first_update_ndc_position));
SendPointerEvents(&listener_, MoveEvents(kDefaultPointerId, first_update_ndc_position,
first_update_ndc_position, 1) +
UpEvents(kDefaultPointerId, first_update_ndc_position));
RunLoopUntilIdle();
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_pointer_id_, kDefaultPointerId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(double_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_TRUE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, CallsActionOnThreeFingerRightSwipe) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
// Perform Three Finger Right Swipe.
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, DownEvents(finger, {}));
}
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, MoveEvents(finger, {}, {.7f, 0}));
}
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, UpEvents(finger, {.7f, 0}));
}
RunLoopUntilIdle();
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(double_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_TRUE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, CallsActionOnOneFingerTripleTap) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
ExecuteOneFingerTapAction(&listener_);
ExecuteOneFingerTapAction(&listener_);
ExecuteOneFingerTapAction(&listener_);
RunLoopUntilIdle();
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(double_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_TRUE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, CallsActionOnOneFingerTripleTapDrag) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
ExecuteOneFingerTapAction(&listener_);
ExecuteOneFingerTapAction(&listener_);
auto event = GetDefaultPointerEvent();
event.set_pointer_id(kDefaultPointerId);
event.set_phase(Phase::DOWN);
listener_->OnEvent(std::move(event));
RunLoopFor(a11y::kMinDragDuration);
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(double_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_TRUE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, NoGestureDetected) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
// Send an ADD event.
auto event = GetDefaultPointerEvent();
listener_->OnEvent(std::move(event));
RunLoopFor(a11y::kMaxTapDuration);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::REJECTED);
EXPECT_FALSE(double_tap_detected_);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, CallsActionOnThreeFingerDoubleTap) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, DownEvents(finger, {}));
}
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, UpEvents(finger, {.7f, 0}));
}
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, DownEvents(finger, {}));
}
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, UpEvents(finger, {.7f, 0}));
}
RunLoopUntilIdle();
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(double_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_TRUE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, CallsActionOnThreeFingerDoubleTapDrag) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, DownEvents(finger, {}));
}
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, UpEvents(finger, {.7f, 0}));
}
for (uint32_t finger = 0; finger < 3; finger++) {
SendPointerEvents(&listener_, DownEvents(finger, {}));
}
RunLoopFor(a11y::kMinDragDuration);
RunLoopUntilIdle();
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(double_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_FALSE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_TRUE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, CallsActionOnTwoFingerDrag) {
fuchsia::ui::input::accessibility::EventHandling actual_handled =
fuchsia::ui::input::accessibility::EventHandling::REJECTED;
auto listener_callback = [this, &actual_handled](
uint32_t device_id, uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled) {
actual_device_id_ = device_id;
actual_pointer_id_ = pointer_id;
actual_handled = handled;
};
listener_.events().OnStreamHandled = std::move(listener_callback);
for (uint32_t finger = 0; finger < 2; finger++) {
SendPointerEvents(&listener_, DownEvents(finger, {}));
}
RunLoopFor(a11y::kMinDragDuration);
RunLoopUntilIdle();
EXPECT_EQ(actual_viewref_koid_, kDefaultKoid);
EXPECT_EQ(actual_point_.x, kLocalPoint.x);
EXPECT_EQ(actual_point_.y, kLocalPoint.y);
EXPECT_EQ(actual_device_id_, kDefaultDeviceId);
EXPECT_EQ(actual_handled, fuchsia::ui::input::accessibility::EventHandling::CONSUMED);
EXPECT_FALSE(single_tap_detected_);
EXPECT_FALSE(double_tap_detected_);
EXPECT_FALSE(one_finger_up_swipe_detected_);
EXPECT_FALSE(one_finger_down_swipe_detected_);
EXPECT_FALSE(one_finger_left_swipe_detected_);
EXPECT_FALSE(one_finger_right_swipe_detected_);
EXPECT_FALSE(three_finger_up_swipe_detected_);
EXPECT_FALSE(three_finger_down_swipe_detected_);
EXPECT_FALSE(three_finger_left_swipe_detected_);
EXPECT_FALSE(three_finger_right_swipe_detected_);
EXPECT_FALSE(one_finger_drag_detected_);
EXPECT_TRUE(two_finger_drag_detected_);
EXPECT_FALSE(one_finger_triple_tap_detected_);
EXPECT_FALSE(one_finger_triple_tap_drag_detected_);
EXPECT_FALSE(three_finger_double_tap_detected_);
EXPECT_FALSE(three_finger_double_tap_drag_detected_);
}
TEST_F(GestureManagerTest, BindGestureMultipleTimes) {
auto double_tap_callback = [this](a11y::GestureContext context) {
actual_viewref_koid_ = context.view_ref_koid;
actual_point_ = context.CurrentCentroid(true);
double_tap_detected_ = true;
};
// Calling Bind again should fail since the gesture is already binded.
EXPECT_FALSE(gesture_handler_->BindOneFingerDoubleTapAction(std::move(double_tap_callback)));
}
} // namespace
} // namespace accessibility_test