blob: a30baa79bd36a4fd2865ddaabb524b53abf5cb4b [file] [log] [blame]
// Copyright 2020 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.
#ifndef SRC_UI_SCENIC_LIB_INPUT_A11Y_LEGACY_CONTENDER_H_
#define SRC_UI_SCENIC_LIB_INPUT_A11Y_LEGACY_CONTENDER_H_
#include <fuchsia/ui/input/accessibility/cpp/fidl.h>
#include <lib/fit/function.h>
#include <deque>
#include <unordered_map>
#include <unordered_set>
#include "src/ui/scenic/lib/input/gesture_contender.h"
#include "src/ui/scenic/lib/input/gesture_contender_inspector.h"
#include "src/ui/scenic/lib/input/internal_pointer_event.h"
namespace scenic_impl::input {
// Class for incorporating a11y legacy clients with the gesture disambiguation protocol.
class A11yLegacyContender final : public GestureContender {
public:
A11yLegacyContender(fit::function<void(StreamId, GestureResponse)> respond,
fit::function<void(const InternalTouchEvent& event)> deliver_to_client,
GestureContenderInspector& inspector);
~A11yLegacyContender() override = default;
void UpdateStream(StreamId stream_id, const InternalTouchEvent& event, bool is_end_of_stream,
view_tree::BoundingBox unused) override;
void EndContest(StreamId stream_id, bool awarded_win) override;
// Implementation of |fuchsia::ui::input::accessibility::PointerEventListener::OnStreamHandled|.
void OnStreamHandled(uint32_t pointer_id,
fuchsia::ui::input::accessibility::EventHandling handled);
private:
struct Stream {
bool consumed = false;
bool has_ended = false;
bool awarded_win = false;
uint32_t pointer_id = 0;
uint64_t num_received_events = 0;
};
void AddStream(StreamId stream_id, uint32_t pointer_id);
void RemoveStream(StreamId stream_id);
// Multiple streams with the same pointer id can start before A11y has time to respond to the
// previous one. Handle them in order, since A11y responses should arrive in order.
std::unordered_map</*pointer_id*/ uint32_t, std::deque<StreamId>> pointer_id_to_stream_id_map_;
// Tracks all streams that have had at least one event passed into UpdateStream(), and that
// haven't either "been won and has ended", or "haven't been lost".
std::unordered_map<StreamId, Stream> ongoing_streams_;
// Streams can be declared as won before the first UpdateStream() call concerning the stream,
// this set tracks those streams. This set should never contain a stream that also exists in
// |ongoing_streams_|.
std::unordered_set<StreamId> won_streams_awaiting_first_message_;
const fit::function<void(StreamId, GestureResponse)> respond_;
const fit::function<void(const InternalTouchEvent& event)> deliver_to_client_;
// Saved by reference since |inspector_| is guaranteed to outlive the contender.
GestureContenderInspector& inspector_;
};
} // namespace scenic_impl::input
#endif // SRC_UI_SCENIC_LIB_INPUT_A11Y_LEGACY_CONTENDER_H_