blob: 19cb287e3027709d90e343a9d275f6d27fc4f777 [file] [log] [blame]
// Copyright 2018 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 "garnet/bin/a11y/a11y_manager/manager_impl.h"
#include "garnet/lib/ui/gfx/util/unwrap.h"
#include "lib/escher/util/type_utils.h"
namespace a11y_manager {
using ::fuchsia::math::Point3F;
using ::fuchsia::math::PointF;
// Taken with minor modifications from the function in input_dispatcher.cc
// Returns a pair of points, {ray_origin, ray_direction}, in that order.
// The ray is constructed to point directly into the scene at the
// provided device coordinate.
std::pair<Point3F, Point3F> DefaultRayForHitTestingScreenPoint(
const PointF& point) {
Point3F origin;
origin.x = point.x;
origin.y = point.y;
origin.z = -1.f;
Point3F direction;
direction.z = 1.f;
return {origin, direction};
}
// Taken with minor modifications from the function in input_dispatcher.cc
// Transforms the raw input ray to the hit point in local coordinates of the
// view represented by a gfx::hit object.
//
// This transformation makes several assumptions:
// * The ray must be the same as the one passed to |a11y_view_inspector_|'s
// hit test, which determined the originally hit view.
// * For MOVE and UP, which don't go through hit testing, the distance
// is pinned to whatever distance the original hit occurred at. The origin
// of the ray is the only thing that is shifted relative to the DOWN event.
//
// |ray_origin| is relative to the display's coordinate space.
// |ray_direction| is the direction of the ray in the device coordinate space.
// |hit| is the view hit representation returned by Scenic hit-testing.
// TODO(SCN-1124): This logic should move inside Scenic.
fuchsia::math::PointF TransformPointerEvent(const Point3F& ray_origin,
const Point3F& ray_direction,
fuchsia::ui::gfx::Hit hit) {
escher::mat4 hit_node_to_device_transform =
scenic_impl::gfx::Unwrap(hit.inverse_transform);
escher::ray4 ray{{ray_origin.x, ray_origin.y, ray_origin.z, 1.f},
{ray_direction.x, ray_direction.y, ray_direction.z, 0.f}};
escher::ray4 transformed_ray =
glm::inverse(hit_node_to_device_transform) * ray;
escher::vec4 hit_point = escher::homogenize(
transformed_ray.origin + hit.distance * transformed_ray.direction);
PointF point;
point.x = hit_point[0];
point.y = hit_point[1];
return point;
}
void ManagerImpl::AddBinding(
fidl::InterfaceRequest<fuchsia::accessibility::Manager> request) {
bindings_.AddBinding(this, std::move(request));
}
void ManagerImpl::GetHitAccessibilityNode(
fuchsia::ui::viewsv1::ViewTreeToken token,
fuchsia::ui::input::PointerEvent input,
GetHitAccessibilityNodeCallback callback) {
// TODO(SCN-1124): wire hit tests through scenic a11y component
}
void ManagerImpl::SetAccessibilityFocus(int32_t view_id, int32_t node_id) {
// TODO(MI4-1736): implement focus change with KOID-based semantic tree
}
void ManagerImpl::PerformAccessibilityAction(
fuchsia::accessibility::Action action) {
// TODO(MI4-1736): implement action with KOID-based semantic tree
}
void ManagerImpl::BroadcastOnNodeAccessibilityAction(
int32_t id, fuchsia::accessibility::Node node,
fuchsia::accessibility::Action action) {
for (auto& bind : bindings_.bindings()) {
fuchsia::accessibility::Node node_copy;
node.Clone(&node_copy);
bind.get()->events().OnNodeAction(id, std::move(node_copy), action);
}
}
} // namespace a11y_manager