Wire up timeline pins

This commit is contained in:
2026-05-02 19:35:34 -04:00
parent d99c248c49
commit dc1788c9d0
3 changed files with 54 additions and 21 deletions

View File

@@ -25,7 +25,9 @@
"CLAY_USER", "CLAY_USER",
"PKJS_READY", "PKJS_READY",
"PKJS_SLEEP_TIMESTAMP", "PKJS_SLEEP_TIMESTAMP",
"PKJS_LAST_WATCHED" "PKJS_LAST_WATCHED",
"PKJS_PIN_TIMESTAMP",
"PKJS_PIN_TITLE"
], ],
"projectType": "native", "projectType": "native",
"resources": { "resources": {

View File

@@ -169,15 +169,47 @@ static void send_sleep_time_to_pkjs() {
} }
} }
static void soft_reload() { static void send_pin_to_pkjs() {
window_stack_remove(s_main_window, false); DictionaryIterator *out;
window_destroy(s_main_window); AppMessageResult result = app_message_outbox_begin(&out);
if (result != APP_MSG_OK) {
text_layer_set_text(s_last_watched_layer, "outbox_begin failure");
return;
}
if (s_sleep_session_found) {
dict_write_uint32(out, MESSAGE_KEY_PKJS_PIN_TIMESTAMP, s_sleep_timestamp);
} else {
dict_write_uint32(out, MESSAGE_KEY_PKJS_PIN_TIMESTAMP, time(NULL));
}
dict_write_cstring(out, MESSAGE_KEY_PKJS_PIN_TITLE, text_layer_get_text(s_last_watched_layer));
result = app_message_outbox_send();
if (result != APP_MSG_OK) {
text_layer_set_text(s_last_watched_layer, "outbox_send failure");
return;
}
}
static void select_single_click_handler(ClickRecognizerRef recognizer, void *context) {
Window *window = (Window *)context;
send_pin_to_pkjs();
}
static void click_config_provider(Window *window) {
window_single_click_subscribe(BUTTON_ID_SELECT, select_single_click_handler);
}
static void soft_reload(bool first_load) {
if (!first_load) {
window_stack_remove(s_main_window, false);
window_destroy(s_main_window);
}
s_main_window = window_create(); s_main_window = window_create();
window_set_background_color(s_main_window, GColorBlack); window_set_background_color(s_main_window, GColorBlack);
window_set_window_handlers( window_set_window_handlers(
s_main_window, s_main_window,
(WindowHandlers){.load = main_window_load, .unload = main_window_unload}); (WindowHandlers){.load = main_window_load, .unload = main_window_unload});
window_stack_push(s_main_window, false); window_stack_push(s_main_window, false);
window_set_click_config_provider(s_main_window, (ClickConfigProvider)click_config_provider);
send_sleep_time_to_pkjs(); send_sleep_time_to_pkjs();
} }
@@ -219,19 +251,13 @@ static void inbox_received_handler(DictionaryIterator *iter, void *context) {
#else #else
layer_mark_dirty(s_button_bar_layer); layer_mark_dirty(s_button_bar_layer);
#endif #endif
soft_reload(); // app needs "restarted" when settings are changed soft_reload(false); // app needs "restarted" when settings are changed
return; return;
} }
Tuple *watched_tuple = dict_find(iter, MESSAGE_KEY_PKJS_LAST_WATCHED); Tuple *watched_tuple = dict_find(iter, MESSAGE_KEY_PKJS_LAST_WATCHED);
if (watched_tuple) { if (watched_tuple) {
if (s_sleep_session_found) { text_layer_set_text(s_last_watched_layer, watched_tuple->value->cstring);
text_layer_set_text(s_last_watched_layer, watched_tuple->value->cstring);
} else {
static char last_watched_buffer[1024];
snprintf(last_watched_buffer, sizeof(last_watched_buffer), "Last item played:\n%s", watched_tuple->value->cstring);
text_layer_set_text(s_last_watched_layer, last_watched_buffer);
}
#if PBL_DISPLAY_WIDTH >= 200 #if PBL_DISPLAY_WIDTH >= 200
PropertyAnimation *sleep_bar_prop = property_animation_create_layer_frame(s_sleep_bar_layer, &s_sleep_bar_start, &GRect(0, -PBL_DISPLAY_HEIGHT + PBL_IF_ROUND_ELSE(53, 31), PBL_DISPLAY_WIDTH, PBL_DISPLAY_HEIGHT)); PropertyAnimation *sleep_bar_prop = property_animation_create_layer_frame(s_sleep_bar_layer, &s_sleep_bar_start, &GRect(0, -PBL_DISPLAY_HEIGHT + PBL_IF_ROUND_ELSE(53, 31), PBL_DISPLAY_WIDTH, PBL_DISPLAY_HEIGHT));
#else #else
@@ -250,13 +276,6 @@ static void inbox_received_handler(DictionaryIterator *iter, void *context) {
} }
static void init() { static void init() {
// initialize window
s_main_window = window_create();
window_set_background_color(s_main_window, GColorBlack);
window_set_window_handlers(
s_main_window,
(WindowHandlers){.load = main_window_load, .unload = main_window_unload});
// set colors if is_jellyfin is locally set; // set colors if is_jellyfin is locally set;
// if it has not yet been set, it will be once // if it has not yet been set, it will be once
// the user saves their settings // the user saves their settings
@@ -284,7 +303,7 @@ static void init() {
// initialize pkjs // initialize pkjs
app_message_register_inbox_received(inbox_received_handler); app_message_register_inbox_received(inbox_received_handler);
app_message_open(1024, 64); app_message_open(1024, 1536);
// get sleep time (UNIX timestamp) // get sleep time (UNIX timestamp)
time_t end = time(NULL); time_t end = time(NULL);
@@ -299,7 +318,7 @@ static void init() {
s_sleep_data_accessible = false; s_sleep_data_accessible = false;
} }
window_stack_push(s_main_window, true); soft_reload(true);
} }
static void deinit() { window_destroy(s_main_window); } static void deinit() { window_destroy(s_main_window); }

View File

@@ -27,6 +27,18 @@ Pebble.addEventListener("appmessage", function (dict) {
callAPI(cfg.CLAY_API_HOST + "/api/v2?apikey=" + cfg.CLAY_API_KEY + "&cmd=get_history&length=100", null, false, cfg.CLAY_USER, sleepTimestamp); callAPI(cfg.CLAY_API_HOST + "/api/v2?apikey=" + cfg.CLAY_API_KEY + "&cmd=get_history&length=100", null, false, cfg.CLAY_USER, sleepTimestamp);
} }
} }
if (dict.payload["PKJS_PIN_TIMESTAMP"] && dict.payload["PKJS_PIN_TITLE"]) {
var pin = {
id: dict.payload["PKJS_PIN_TIMESTAMP"],
time: new Date(dict.payload["PKJS_PIN_TIMESTAMP"] * 1000).toISOString(),
layout: {
type: "genericPin",
title: dict.payload["PKJS_PIN_TITLE"]
}
};
Pebble.insertTimelinePin(JSON.stringify(pin));
}
}); });
function callAPI(fullURL, apiKey, isJellyfin, trackedUser, sleepTimestamp) { function callAPI(fullURL, apiKey, isJellyfin, trackedUser, sleepTimestamp) {