Add support for notification title. The notification buffer must contain the title and the message separated by a '\0' character.

If the buffer does not contain any \0, the whole buffer is considered to be the message of the notification. A default title will be displayed in the notification app.
This commit is contained in:
Jean-François Milants 2021-04-04 12:10:47 +02:00
parent 58a2d000c4
commit 03de1c6739
7 changed files with 30 additions and 9 deletions

View file

@ -165,6 +165,7 @@ void AlertNotificationClient::OnNotification(ble_gap_event *event) {
NotificationManager::Notification notif; NotificationManager::Notification notif;
os_mbuf_copydata(event->notify_rx.om, headerSize, messageSize - 1, notif.message.data()); os_mbuf_copydata(event->notify_rx.om, headerSize, messageSize - 1, notif.message.data());
notif.message[messageSize - 1] = '\0'; notif.message[messageSize - 1] = '\0';
notif.size = messageSize;
notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert;
notificationManager.Push(std::move(notif)); notificationManager.Push(std::move(notif));

View file

@ -75,6 +75,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, headerSize, messageSize-1, notif.message.data());
os_mbuf_copydata(ctxt->om, 0, 1, &category); os_mbuf_copydata(ctxt->om, 0, 1, &category);
notif.message[messageSize-1] = '\0'; notif.message[messageSize-1] = '\0';
notif.size = messageSize;
// TODO convert all ANS categories to NotificationController categories // TODO convert all ANS categories to NotificationController categories
switch(category) { switch(category) {

View file

@ -191,7 +191,6 @@ int Pinetime::Controllers::MusicService::OnCommand(uint16_t conn_handle, uint16_
data[notifSize] = '\0'; data[notifSize] = '\0';
os_mbuf_copydata(ctxt->om, 0, notifSize, data); os_mbuf_copydata(ctxt->om, 0, notifSize, data);
char *s = (char *) &data[0]; char *s = (char *) &data[0];
NRF_LOG_INFO("DATA : %s", s);
if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msArtistCharUuid) == 0) { if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msArtistCharUuid) == 0) {
artistName = s; artistName = s;
} else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msTrackCharUuid) == 0) { } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msTrackCharUuid) == 0) {

View file

@ -101,7 +101,6 @@ int Pinetime::Controllers::NavigationService::OnCommand(uint16_t conn_handle, ui
data[notifSize] = '\0'; data[notifSize] = '\0';
os_mbuf_copydata(ctxt->om, 0, notifSize, data); os_mbuf_copydata(ctxt->om, 0, notifSize, data);
char *s = (char *) &data[0]; char *s = (char *) &data[0];
NRF_LOG_INFO("DATA : %s", s);
if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &navFlagCharUuid) == 0) { if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &navFlagCharUuid) == 0) {
m_flag = s; m_flag = s;
} else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &navNarrativeCharUuid) == 0) { } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &navNarrativeCharUuid) == 0) {

View file

@ -87,3 +87,19 @@ size_t NotificationManager::NbNotifications() const {
return std::count_if(notifications.begin(), notifications.end(), [](const Notification& n){ return n.valid;}); 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 {};
}

View file

@ -17,8 +17,12 @@ namespace Pinetime {
Id id; Id id;
bool valid = false; bool valid = false;
uint8_t index; uint8_t index;
uint8_t size;
std::array<char, MessageSize+1> message; std::array<char, MessageSize+1> message;
Categories category = Categories::Unknown; Categories category = Categories::Unknown;
const char* Message() const;
const char* Title() const;
}; };
Notification::Id nextId {0}; Notification::Id nextId {0};

View file

@ -17,8 +17,8 @@ Notifications::Notifications(DisplayApp *app,
auto notification = notificationManager.GetLastNotification(); auto notification = notificationManager.GetLastNotification();
if(notification.valid) { if(notification.valid) {
currentId = notification.id; currentId = notification.id;
currentItem = std::make_unique<NotificationItem>("\nNotification", currentItem = std::make_unique<NotificationItem>(notification.Title(),
notification.message.data(), notification.Message(),
notification.index, notification.index,
notification.category, notification.category,
notificationManager.NbNotifications(), notificationManager.NbNotifications(),
@ -87,8 +87,8 @@ bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
currentId = previousNotification.id; currentId = previousNotification.id;
currentItem.reset(nullptr); currentItem.reset(nullptr);
app->SetFullRefresh(DisplayApp::FullRefreshDirections::Up); app->SetFullRefresh(DisplayApp::FullRefreshDirections::Up);
currentItem = std::make_unique<NotificationItem>("\nNotification", currentItem = std::make_unique<NotificationItem>(previousNotification.Title(),
previousNotification.message.data(), previousNotification.Message(),
previousNotification.index, previousNotification.index,
previousNotification.category, previousNotification.category,
notificationManager.NbNotifications(), notificationManager.NbNotifications(),
@ -109,8 +109,8 @@ bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
currentId = nextNotification.id; currentId = nextNotification.id;
currentItem.reset(nullptr); currentItem.reset(nullptr);
app->SetFullRefresh(DisplayApp::FullRefreshDirections::Down); app->SetFullRefresh(DisplayApp::FullRefreshDirections::Down);
currentItem = std::make_unique<NotificationItem>("\nNotification", currentItem = std::make_unique<NotificationItem>(nextNotification.Title(),
nextNotification.message.data(), nextNotification.Message(),
nextNotification.index, nextNotification.index,
nextNotification.category, nextNotification.category,
notificationManager.NbNotifications(), notificationManager.NbNotifications(),
@ -178,8 +178,9 @@ namespace {
lv_obj_t* alert_type = lv_label_create(lv_scr_act(), nullptr); 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)); 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_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) { switch(category) {