Dismiss notifications by swiping right
Add a new interface `NotificationManager::Dismiss(id)` to delete a notification with the specified `id`. The animate the notification dismiss the `RightAnim` transition to a black screen is used. After the dismiss the new message is swiped in from below or above. If we dismiss the oldest message (when we are at 5/5, or 3/3), then the new message after a dismiss should appear to come from below. Otherwise (when we are at 2/3) the new message after a dismiss should appear to come from above. Rework the index code to show the index of the currently viewed notification. Instead of calculating the index relative to the oldest `id` introduce a new interface `NotificationManager::IndexOf(id)`. This is done because the `id` of the notifications in the buffer aren't continuous anymore (as some messages could have been dismissed). Rework notification ring buffer to have a beginIdx and a size internally to make the dismissal of notifications easier. Fixes: https://github.com/InfiniTimeOrg/InfiniTime/issues/176 Co-authored-by: Simon Willshire <me@simonwillshire.com> Co-authored-by: Reinhold Gschweicher <pyro4hell@gmail.com>
This commit is contained in:
@@ -33,14 +33,17 @@ namespace Pinetime {
|
||||
|
||||
class NotificationItem {
|
||||
public:
|
||||
NotificationItem(Pinetime::Controllers::AlertNotificationService& alertNotificationService,
|
||||
Pinetime::Controllers::MotorController& motorController,
|
||||
bool isTransition = false);
|
||||
NotificationItem(const char* title,
|
||||
const char* msg,
|
||||
uint8_t notifNr,
|
||||
Controllers::NotificationManager::Categories,
|
||||
uint8_t notifNb,
|
||||
Modes mode,
|
||||
Pinetime::Controllers::AlertNotificationService& alertNotificationService,
|
||||
Pinetime::Controllers::MotorController& motorController);
|
||||
Pinetime::Controllers::MotorController& motorController,
|
||||
bool isTransition = false);
|
||||
~NotificationItem();
|
||||
bool IsRunning() const {
|
||||
return running;
|
||||
@@ -48,16 +51,17 @@ namespace Pinetime {
|
||||
void OnCallButtonEvent(lv_obj_t*, lv_event_t event);
|
||||
|
||||
private:
|
||||
lv_obj_t* container1;
|
||||
lv_obj_t* container;
|
||||
lv_obj_t* subject_container;
|
||||
lv_obj_t* bt_accept;
|
||||
lv_obj_t* bt_mute;
|
||||
lv_obj_t* bt_reject;
|
||||
lv_obj_t* label_accept;
|
||||
lv_obj_t* label_mute;
|
||||
lv_obj_t* label_reject;
|
||||
Modes mode;
|
||||
Pinetime::Controllers::AlertNotificationService& alertNotificationService;
|
||||
Pinetime::Controllers::MotorController& motorController;
|
||||
|
||||
bool running = true;
|
||||
};
|
||||
|
||||
@@ -68,15 +72,19 @@ namespace Pinetime {
|
||||
System::SystemTask& systemTask;
|
||||
Modes mode = Modes::Normal;
|
||||
std::unique_ptr<NotificationItem> currentItem;
|
||||
Controllers::NotificationManager::Notification::Id currentId;
|
||||
Pinetime::Controllers::NotificationManager::Notification::Id currentId;
|
||||
bool validDisplay = false;
|
||||
bool afterDismissNextMessageFromAbove = false;
|
||||
|
||||
lv_point_t timeoutLinePoints[2] {{0, 1}, {239, 1}};
|
||||
lv_obj_t* timeoutLine = nullptr;
|
||||
TickType_t timeoutTickCountStart;
|
||||
|
||||
static const TickType_t timeoutLength = pdMS_TO_TICKS(7000);
|
||||
bool interacted = true;
|
||||
|
||||
bool dismissingNotification = false;
|
||||
|
||||
lv_task_t* taskRefresh;
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user