1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef UI_EVENTS_GESTURE_DETECTION_GESTURE_EVENT_DATA_PACKET_H_
6#define UI_EVENTS_GESTURE_DETECTION_GESTURE_EVENT_DATA_PACKET_H_
7
8#include "base/containers/stack_container.h"
9#include "ui/events/gesture_detection/gesture_detection_export.h"
10#include "ui/events/gesture_detection/gesture_event_data.h"
11
12namespace ui {
13
14class MotionEvent;
15
16// Acts as a transport container for gestures created (directly or indirectly)
17// by a touch event.
18class GESTURE_DETECTION_EXPORT GestureEventDataPacket {
19 public:
20  enum GestureSource {
21    UNDEFINED = -1,        // Used only for a default-constructed packet.
22    INVALID,               // The source of the gesture was invalid.
23    TOUCH_SEQUENCE_START,  // The start of a new gesture sequence.
24    TOUCH_SEQUENCE_END,    // The end of a gesture sequence.
25    TOUCH_SEQUENCE_CANCEL, // The gesture sequence was cancelled.
26    TOUCH_START,           // A touch down occured during a gesture sequence.
27    TOUCH_MOVE,            // A touch move occured during a gesture sequence.
28    TOUCH_END,             // A touch up occured during a gesture sequence.
29    TOUCH_TIMEOUT,         // Timeout from an existing gesture sequence.
30  };
31
32  GestureEventDataPacket();
33  GestureEventDataPacket(const GestureEventDataPacket& other);
34  ~GestureEventDataPacket();
35  GestureEventDataPacket& operator=(const GestureEventDataPacket& other);
36
37  // Factory methods for creating a packet from a particular event.
38  static GestureEventDataPacket FromTouch(const ui::MotionEvent& touch);
39  static GestureEventDataPacket FromTouchTimeout(
40      const GestureEventData& gesture);
41
42  void Push(const GestureEventData& gesture);
43
44  const base::TimeTicks& timestamp() const { return timestamp_; }
45  const GestureEventData& gesture(size_t i) const { return gestures_[i]; }
46  size_t gesture_count() const { return gestures_->size(); }
47  GestureSource gesture_source() const { return gesture_source_; }
48  const gfx::PointF& touch_location() const { return touch_location_; }
49  const gfx::PointF& raw_touch_location() const { return raw_touch_location_; }
50
51 private:
52  GestureEventDataPacket(base::TimeTicks timestamp,
53                         GestureSource source,
54                         const gfx::PointF& touch_location,
55                         const gfx::PointF& raw_touch_location);
56
57  enum { kTypicalMaxGesturesPerTouch = 5 };
58  base::TimeTicks timestamp_;
59  base::StackVector<GestureEventData, kTypicalMaxGesturesPerTouch> gestures_;
60  gfx::PointF touch_location_;
61  gfx::PointF raw_touch_location_;
62  GestureSource gesture_source_;
63};
64
65}  // namespace ui
66
67#endif  // UI_EVENTS_GESTURE_DETECTION_GESTURE_EVENT_DATA_PACKET_H_
68