pebble/src/fw/shell/normal/app_idle_timeout.c
2025-01-27 11:38:16 -08:00

92 lines
2.4 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 "app_idle_timeout.h"
#include "kernel/event_loop.h"
#include "os/tick.h"
#include "services/common/new_timer/new_timer.h"
#include "shell/normal/watchface.h"
#include "shell/shell.h"
#include "system/logging.h"
#include "system/passert.h"
static const int WATCHFACE_TIMEOUT_MS = 30000;
TimerID s_timer;
bool s_app_paused = false;
bool s_app_started = false;
#ifndef NO_WATCH_TIMEOUT
static void prv_kernel_callback_watchface_launch(void* data) {
watchface_launch_default(shell_get_watchface_compositor_animation(true /* watchface_is_dest */));
}
static void prv_timeout_expired(void *cb_data) {
PBL_LOG(LOG_LEVEL_DEBUG, "App idle timeout hit! launching watchface");
launcher_task_add_callback(prv_kernel_callback_watchface_launch, NULL);
}
static void prv_start_timer(bool create) {
if (create) {
s_timer = new_timer_create();
}
if (s_timer != TIMER_INVALID_ID && !s_app_paused && s_app_started) {
bool success = new_timer_start(s_timer, WATCHFACE_TIMEOUT_MS, prv_timeout_expired,
NULL, 0 /* flags */);
PBL_ASSERTN(success);
}
}
#endif
void app_idle_timeout_start(void) {
PBL_ASSERTN(s_timer == TIMER_INVALID_ID);
s_app_started = true;
#ifndef NO_WATCH_TIMEOUT
prv_start_timer(true /* create a timer */);
#endif
}
void app_idle_timeout_stop(void) {
if (s_timer != TIMER_INVALID_ID) {
new_timer_delete(s_timer);
s_timer = TIMER_INVALID_ID;
s_app_started = false;
}
}
void app_idle_timeout_pause(void) {
if (s_timer != TIMER_INVALID_ID) {
new_timer_stop(s_timer);
}
s_app_paused = true;
}
void app_idle_timeout_resume(void) {
s_app_paused = false;
#ifndef NO_WATCH_TIMEOUT
prv_start_timer(false /* do not create a timer */);
#endif
}
void app_idle_timeout_refresh(void) {
#ifndef NO_WATCH_TIMEOUT
prv_start_timer(false /* do not create a timer */);
#endif
}