blob: 6cce305811dbfcc0258f4a4759150b8069131c40 [file] [log] [blame]
// Copyright 2015 The Chromium 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 <stddef.h>
#include <bitset>
#include <memory>
#include <vector>
#include "base/macros.h"
#include "base/time/time.h"
#include "ui/events/event_utils.h"
#include "ui/events/ozone/evdev/events_ozone_evdev_export.h"
#include "ui/events/ozone/evdev/touch_evdev_types.h"
namespace ui {
class TouchFilter;
// Finds touches which are should be filtered.
class EVENTS_OZONE_EVDEV_EXPORT FalseTouchFinder {
static std::unique_ptr<FalseTouchFinder> Create(gfx::Size touchscreen_size);
// Updates which ABS_MT_SLOTs should be filtered. |touches| should contain
// all of the in-progress touches at |time| (including filtered touches).
// |touches| should have at most one entry per ABS_MT_SLOT.
void HandleTouches(const std::vector<InProgressTouchEvdev>& touches,
base::TimeTicks time);
// Returns whether the in-progress touch at ABS_MT_SLOT |slot| has noise.
// These slots should be cancelled
bool SlotHasNoise(size_t slot) const;
// Returns whether the in-progress touch at ABS_MT_SLOT |slot| should delay
// reporting. They may be later reported.
bool SlotShouldDelay(size_t slot) const;
FalseTouchFinder(bool touch_noise_filtering,
bool edge_filtering,
bool low_pressure_filtering,
gfx::Size touchscreen_size);
// Records how frequently noisy touches occur to UMA.
void RecordUMA(bool had_noise, base::TimeTicks time);
friend class TouchEventConverterEvdevTouchNoiseTest;
// The slots which are noise.
std::bitset<kNumTouchEvdevSlots> slots_with_noise_;
// The slots which should delay.
std::bitset<kNumTouchEvdevSlots> slots_should_delay_;
// The time of the previous noise occurrence in any of the slots.
base::TimeTicks last_noise_time_;
// Noise filters detect noise. Any slot with detected noise should be
// cancelled by the touch converter.
std::vector<std::unique_ptr<TouchFilter>> noise_filters_;
// Delay filters may filter questionable new touches for an indefinite time,
// but should not start filtering a touch that it had previously allowed.
std::vector<std::unique_ptr<TouchFilter>> delay_filters_;
} // namespace ui