pebble/src/fw/services/normal/alarms/alarm_pin.c

90 lines
3.7 KiB
C

/*
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "alarm_pin.h"
#include "apps/system_app_ids.h"
#include "kernel/pbl_malloc.h"
#include "services/common/i18n/i18n.h"
#include "services/normal/blob_db/pin_db.h"
#include "services/normal/timeline/attribute.h"
#include "services/normal/timeline/timeline.h"
#include "services/normal/timeline/timeline_resources.h"
// ----------------------------------------------------------------------------------------------
//! Sets attributes for an alarm pin
static void prv_set_pin_attributes(AttributeList *list, AlarmType type, AlarmKind kind) {
const bool is_smart = (type == AlarmType_Smart);
attribute_list_add_cstring(list, AttributeIdTitle,
is_smart ? i18n_get("Smart Alarm", list) : i18n_get("Alarm", list));
attribute_list_add_resource_id(list, AttributeIdIconPin,
is_smart ? TIMELINE_RESOURCE_SMART_ALARM :
TIMELINE_RESOURCE_ALARM_CLOCK);
attribute_list_add_resource_id(list, AttributeIdIconTiny, TIMELINE_RESOURCE_ALARM_CLOCK);
const bool all_caps = false;
const char *alarm_string = i18n_get(alarm_get_string_for_kind(kind, all_caps), list);
attribute_list_add_cstring(list, AttributeIdSubtitle, alarm_string);
attribute_list_add_uint8(list, AttributeIdAlarmKind, kind);
}
// ----------------------------------------------------------------------------------------------
static void prv_set_edit_action_attributes(AttributeList *list) {
attribute_list_add_cstring(list, AttributeIdTitle, i18n_get("Edit", list));
}
// ----------------------------------------------------------------------------------------------
void alarm_pin_add(time_t alarm_time, AlarmId id, AlarmType type, AlarmKind kind, Uuid *uuid_out) {
const unsigned num_actions = 1; // We are just supporting "edit" for now
TimelineItemActionGroup action_group = {
.num_actions = num_actions,
.actions = task_zalloc_check(sizeof(TimelineItemAction) * num_actions),
};
AttributeList edit_attr_list = {0};
prv_set_edit_action_attributes(&edit_attr_list);
action_group.actions[0] = (TimelineItemAction) {
.id = (uint8_t) id, // id is guaranteed to be valid here, and we only support 10 alarms
.type = TimelineItemActionTypeOpenWatchApp,
.attr_list = edit_attr_list,
};
AttributeList pin_attr_list = {0};
prv_set_pin_attributes(&pin_attr_list, type, kind);
TimelineItem *item = timeline_item_create_with_attributes(alarm_time, 0, TimelineItemTypePin,
LayoutIdAlarm, &pin_attr_list, &action_group);
item->header.from_watch = true;
item->header.parent_id = (Uuid)UUID_ALARMS_DATA_SOURCE;
pin_db_insert_item_without_event(item);
i18n_free_all(&pin_attr_list);
i18n_free_all(&edit_attr_list);
attribute_list_destroy_list(&pin_attr_list);
attribute_list_destroy_list(&edit_attr_list);
task_free(action_group.actions);
if (uuid_out) {
*uuid_out = item->header.id;
}
timeline_item_destroy(item);
}
// ----------------------------------------------------------------------------------------------
void alarm_pin_remove(Uuid *alarm_id) {
pin_db_delete((uint8_t *)alarm_id, sizeof(Uuid));
}