summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJean-François Milants <jf@codingfield.com>2021-04-09 20:47:39 +0200
committerJean-François Milants <jf@codingfield.com>2021-04-09 20:47:39 +0200
commit4560e9ed60aeacbd7d1c7c1221fe8fdc4d1bb130 (patch)
treeb8ee17d8bfdc57c3b80b7c918f3431d198939856 /src
parent9096d1db4c6be9f4a2cc8af99a994c219f25108c (diff)
parent63584b6561cbc31095354b06e356f700dcf0e32b (diff)
Merge branch 'notification-title' into develop
Diffstat (limited to 'src')
-rw-r--r--src/components/ble/AlertNotificationClient.cpp8
-rw-r--r--src/components/ble/AlertNotificationService.cpp8
-rw-r--r--src/components/ble/MusicService.cpp1
-rw-r--r--src/components/ble/NavigationService.cpp1
-rw-r--r--src/components/ble/NotificationManager.cpp16
-rw-r--r--src/components/ble/NotificationManager.h4
-rw-r--r--src/displayapp/screens/Notifications.cpp27
7 files changed, 47 insertions, 18 deletions
diff --git a/src/components/ble/AlertNotificationClient.cpp b/src/components/ble/AlertNotificationClient.cpp
index e7a18626..9efede39 100644
--- a/src/components/ble/AlertNotificationClient.cpp
+++ b/src/components/ble/AlertNotificationClient.cpp
@@ -158,13 +158,17 @@ void AlertNotificationClient::OnNotification(ble_gap_event *event) {
const auto maxMessageSize{NotificationManager::MaximumMessageSize()};
const auto maxBufferSize{maxMessageSize + headerSize};
- const auto dbgPacketLen = OS_MBUF_PKTLEN(event->notify_rx.om);
- size_t bufferSize = std::min(dbgPacketLen + stringTerminatorSize, maxBufferSize);
+ // Ignore notifications with empty message
+ const auto packetLen = OS_MBUF_PKTLEN(event->notify_rx.om);
+ if(packetLen <= headerSize) return;
+
+ size_t bufferSize = std::min(packetLen + stringTerminatorSize, maxBufferSize);
auto messageSize = std::min(maxMessageSize, (bufferSize - headerSize));
NotificationManager::Notification notif;
os_mbuf_copydata(event->notify_rx.om, headerSize, messageSize - 1, notif.message.data());
notif.message[messageSize - 1] = '\0';
+ notif.size = messageSize;
notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert;
notificationManager.Push(std::move(notif));
diff --git a/src/components/ble/AlertNotificationService.cpp b/src/components/ble/AlertNotificationService.cpp
index 0639119c..d91e2090 100644
--- a/src/components/ble/AlertNotificationService.cpp
+++ b/src/components/ble/AlertNotificationService.cpp
@@ -66,8 +66,11 @@ int AlertNotificationService::OnAlert(uint16_t conn_handle, uint16_t attr_handle
const auto maxMessageSize {NotificationManager::MaximumMessageSize()};
const auto maxBufferSize{maxMessageSize + headerSize};
- const auto dbgPacketLen = OS_MBUF_PKTLEN(ctxt->om);
- size_t bufferSize = std::min(dbgPacketLen + stringTerminatorSize, maxBufferSize);
+ // Ignore notifications with empty message
+ const auto packetLen = OS_MBUF_PKTLEN(ctxt->om);
+ if(packetLen <= headerSize) return 0;
+
+ size_t bufferSize = std::min(packetLen + stringTerminatorSize, maxBufferSize);
auto messageSize = std::min(maxMessageSize, (bufferSize-headerSize));
Categories category;
@@ -75,6 +78,7 @@ int AlertNotificationService::OnAlert(uint16_t conn_handle, uint16_t attr_handle
os_mbuf_copydata(ctxt->om, headerSize, messageSize-1, notif.message.data());
os_mbuf_copydata(ctxt->om, 0, 1, &category);
notif.message[messageSize-1] = '\0';
+ notif.size = messageSize;
// TODO convert all ANS categories to NotificationController categories
switch(category) {
diff --git a/src/components/ble/MusicService.cpp b/src/components/ble/MusicService.cpp
index b02e743a..1230ad57 100644
--- a/src/components/ble/MusicService.cpp
+++ b/src/components/ble/MusicService.cpp
@@ -191,7 +191,6 @@ int Pinetime::Controllers::MusicService::OnCommand(uint16_t conn_handle, uint16_
data[notifSize] = '\0';
os_mbuf_copydata(ctxt->om, 0, notifSize, data);
char *s = (char *) &data[0];
- NRF_LOG_INFO("DATA : %s", s);
if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msArtistCharUuid) == 0) {
artistName = s;
} else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msTrackCharUuid) == 0) {
diff --git a/src/components/ble/NavigationService.cpp b/src/components/ble/NavigationService.cpp
index 3c1fd162..545c44da 100644
--- a/src/components/ble/NavigationService.cpp
+++ b/src/components/ble/NavigationService.cpp
@@ -101,7 +101,6 @@ int Pinetime::Controllers::NavigationService::OnCommand(uint16_t conn_handle, ui
data[notifSize] = '\0';
os_mbuf_copydata(ctxt->om, 0, notifSize, data);
char *s = (char *) &data[0];
- NRF_LOG_INFO("DATA : %s", s);
if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &navFlagCharUuid) == 0) {
m_flag = s;
} else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &navNarrativeCharUuid) == 0) {
diff --git a/src/components/ble/NotificationManager.cpp b/src/components/ble/NotificationManager.cpp
index 36abf026..88e83b92 100644
--- a/src/components/ble/NotificationManager.cpp
+++ b/src/components/ble/NotificationManager.cpp
@@ -87,3 +87,19 @@ size_t NotificationManager::NbNotifications() const {
return std::count_if(notifications.begin(), notifications.end(), [](const Notification& n){ return n.valid;});
}
+const char* NotificationManager::Notification::Message() const {
+ const char* itField = std::find(message.begin(), message.begin()+size-1, '\0');
+ if(itField != message.begin()+size-1) {
+ const char* ptr = (itField)+1;
+ return ptr;
+ }
+ return const_cast<char*>(message.data());
+}
+
+const char* NotificationManager::Notification::Title() const {
+ const char * itField = std::find(message.begin(), message.begin()+size-1, '\0');
+ if(itField != message.begin()+size-1) {
+ return message.data();
+ }
+ return {};
+}
diff --git a/src/components/ble/NotificationManager.h b/src/components/ble/NotificationManager.h
index 075a9a45..486bba15 100644
--- a/src/components/ble/NotificationManager.h
+++ b/src/components/ble/NotificationManager.h
@@ -17,8 +17,12 @@ namespace Pinetime {
Id id;
bool valid = false;
uint8_t index;
+ uint8_t size;
std::array<char, MessageSize+1> message;
Categories category = Categories::Unknown;
+
+ const char* Message() const;
+ const char* Title() const;
};
Notification::Id nextId {0};
diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp
index 1a8fca9c..2fac6acb 100644
--- a/src/displayapp/screens/Notifications.cpp
+++ b/src/displayapp/screens/Notifications.cpp
@@ -17,13 +17,13 @@ Notifications::Notifications(DisplayApp *app,
auto notification = notificationManager.GetLastNotification();
if(notification.valid) {
currentId = notification.id;
- currentItem = std::make_unique<NotificationItem>("\nNotification",
- notification.message.data(),
- notification.index,
- notification.category,
- notificationManager.NbNotifications(),
- mode,
- alertNotificationService);
+ currentItem = std::make_unique<NotificationItem>(notification.Title(),
+ notification.Message(),
+ notification.index,
+ notification.category,
+ notificationManager.NbNotifications(),
+ mode,
+ alertNotificationService);
validDisplay = true;
} else {
currentItem = std::make_unique<NotificationItem>("\nNotification",
@@ -68,6 +68,8 @@ bool Notifications::Refresh() {
}
bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
+ if(mode != Modes::Normal) return true;
+
switch (event) {
case Pinetime::Applications::TouchEvents::SwipeDown: {
Controllers::NotificationManager::Notification previousNotification;
@@ -82,8 +84,8 @@ bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
currentId = previousNotification.id;
currentItem.reset(nullptr);
app->SetFullRefresh(DisplayApp::FullRefreshDirections::Down);
- currentItem = std::make_unique<NotificationItem>("\nNotification",
- previousNotification.message.data(),
+ currentItem = std::make_unique<NotificationItem>(previousNotification.Title(),
+ previousNotification.Message(),
previousNotification.index,
previousNotification.category,
notificationManager.NbNotifications(),
@@ -107,8 +109,8 @@ bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
currentId = nextNotification.id;
currentItem.reset(nullptr);
app->SetFullRefresh(DisplayApp::FullRefreshDirections::Up);
- currentItem = std::make_unique<NotificationItem>("\nNotification",
- nextNotification.message.data(),
+ currentItem = std::make_unique<NotificationItem>(nextNotification.Title(),
+ nextNotification.Message(),
nextNotification.index,
nextNotification.category,
notificationManager.NbNotifications(),
@@ -170,8 +172,9 @@ namespace {
lv_obj_t* alert_type = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_color(alert_type, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x888888));
+ if(title == nullptr) title = "Notification";
lv_label_set_text(alert_type, title);
- lv_obj_align(alert_type, NULL, LV_ALIGN_IN_TOP_LEFT, 0, -4);
+ lv_obj_align(alert_type, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 16);
/////////
switch(category) {