-
-
Notifications
You must be signed in to change notification settings - Fork 984
/
Copy pathAppleNotificationCenterClient.h
134 lines (115 loc) · 5.05 KB
/
AppleNotificationCenterClient.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#pragma once
#include <cstdint>
#include <functional>
#define min // workaround: nimble's min/max macros conflict with libstdc++
#define max
#include <host/ble_gap.h>
#undef max
#undef min
#include "components/ble/BleClient.h"
#include <unordered_map>
#include <string>
namespace Pinetime {
namespace System {
class SystemTask;
}
namespace Controllers {
class NotificationManager;
class AppleNotificationCenterClient : public BleClient {
public:
explicit AppleNotificationCenterClient(Pinetime::System::SystemTask& systemTask,
Pinetime::Controllers::NotificationManager& notificationManager);
bool OnDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_svc* service);
int OnCharacteristicsDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_chr* characteristic);
int OnNewAlertSubcribe(uint16_t connectionHandle, const ble_gatt_error* error, ble_gatt_attr* attribute);
int OnDescriptorDiscoveryEventCallback(uint16_t connectionHandle,
const ble_gatt_error* error,
uint16_t characteristicValueHandle,
const ble_gatt_dsc* descriptor);
int OnControlPointWrite(uint16_t connectionHandle, const ble_gatt_error* error, ble_gatt_attr* attribute);
void OnNotification(ble_gap_event* event);
void Reset();
void Discover(uint16_t connectionHandle, std::function<void(uint16_t)> lambda) override;
void DebugNotification(const char* msg) const;
void AcceptIncomingCall(uint32_t notificationUid);
void RejectIncomingCall(uint32_t notificationUid);
static constexpr uint8_t maxTitleSize {20};
static constexpr uint8_t maxSubtitleSize {15};
static constexpr uint8_t maxMessageSize {120};
// 7905F431-B5CE-4E99-A40F-4B1E122D00D0
static constexpr ble_uuid128_t ancsUuid {
.u {.type = BLE_UUID_TYPE_128},
.value = {0xd0, 0x00, 0x2D, 0x12, 0x1E, 0x4B, 0x0F, 0xA4, 0x99, 0x4E, 0xCE, 0xB5, 0x31, 0xF4, 0x05, 0x79}};
private:
// 9FBF120D-6301-42D9-8C58-25E699A21DBD
const ble_uuid128_t notificationSourceChar {
.u {.type = BLE_UUID_TYPE_128},
.value = {0xBD, 0x1D, 0xA2, 0x99, 0xE6, 0x25, 0x58, 0x8C, 0xD9, 0x42, 0x01, 0x63, 0x0D, 0x12, 0xBF, 0x9F}};
// 69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9
const ble_uuid128_t controlPointChar {
.u {.type = BLE_UUID_TYPE_128},
.value = {0xD9, 0xD9, 0xAA, 0xFD, 0xBD, 0x9B, 0x21, 0x98, 0xA8, 0x49, 0xE1, 0x45, 0xF3, 0xD8, 0xD1, 0x69}};
// 22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB
const ble_uuid128_t dataSourceChar {
.u {.type = BLE_UUID_TYPE_128},
.value = {0xFB, 0x7B, 0x7C, 0xCE, 0x6A, 0xB3, 0x44, 0xBE, 0xB5, 0x4B, 0xD6, 0x24, 0xE9, 0xC6, 0xEA, 0x22}};
const ble_uuid16_t gattServiceUuid = {BLE_UUID_TYPE_16, 0x1801};
const ble_uuid16_t serviceChangedCharUuid = {BLE_UUID_TYPE_16, 0x2A05};
enum class Categories : uint8_t {
Other = 0,
IncomingCall = 1,
MissedCall = 2,
Voicemail = 3,
Social = 4,
Schedule = 5,
Email = 6,
News = 7,
HealthAndFitness = 8,
BuissnessAndFinance = 9,
Location = 10,
Entertainment = 11
};
enum class EventIds : uint8_t { Added = 0, Modified = 1, Removed = 2 };
enum class EventFlags : uint8_t {
Silent = (1 << 0),
Important = (1 << 1),
PreExisting = (1 << 2),
PositiveAction = (1 << 3),
NegativeAction = (1 << 4)
};
struct AncsNotitfication {
uint8_t eventId {0};
uint8_t eventFlags {0};
uint8_t category {0};
uint32_t uuid {0};
};
std::unordered_map<uint32_t, AncsNotitfication> notifications;
std::string DecodeUtf8String(os_mbuf* om, uint16_t size, uint16_t offset);
uint16_t ancsStartHandle {0};
uint16_t ancsEndHandle {0};
uint16_t notificationSourceHandle {0};
uint16_t controlPointHandle {0};
uint16_t dataSourceHandle {0};
uint16_t notificationSourceDescriptorHandle {0};
uint16_t controlPointDescriptorHandle {0};
uint16_t dataSourceDescriptorHandle {0};
uint16_t gattStartHandle {0};
uint16_t gattEndHandle {0};
uint16_t serviceChangedHandle {0};
uint16_t serviceChangedDescriptorHandle {0};
bool isGattDiscovered {false};
bool isGattCharacteristicDiscovered {false};
bool isGattDescriptorFound {false};
bool isDiscovered {false};
bool isCharacteristicDiscovered {false};
bool isDescriptorFound {false};
bool isControlCharacteristicDiscovered {false};
bool isControlDescriptorFound {false};
bool isDataCharacteristicDiscovered {false};
bool isDataDescriptorFound {false};
Pinetime::System::SystemTask& systemTask;
Pinetime::Controllers::NotificationManager& notificationManager;
std::function<void(uint16_t)> onServiceDiscovered;
};
}
}