diff options
author | Jiwoong Im <jiwoong.im@samsung.com> | 2016-10-31 17:58:15 +0900 |
---|---|---|
committer | jongmyeong ko <jongmyeong.ko@samsung.com> | 2016-11-14 23:29:52 -0800 |
commit | a30b1552fca95e1aeb07c818018ec2ef6917fee7 (patch) | |
tree | 9060e0f083f4fe2aaef253c3f36049b99a431b38 /alarm-manager.c | |
parent | 1294e15c8bffcb852c6489e302996f9f48d6c248 (diff) | |
download | alarm-manager-a30b1552fca95e1aeb07c818018ec2ef6917fee7.tar.gz alarm-manager-a30b1552fca95e1aeb07c818018ec2ef6917fee7.tar.bz2 alarm-manager-a30b1552fca95e1aeb07c818018ec2ef6917fee7.zip |
handle app enable/disable signal
- backup/restore alarm to handle app enable/disable signal
Change-Id: Id90b0004f7452ce1d93759e417eb79808865e5cf
Signed-off-by: Jiwoong Im <jiwoong.im@samsung.com>
Diffstat (limited to 'alarm-manager.c')
-rw-r--r-- | alarm-manager.c | 86 |
1 files changed, 84 insertions, 2 deletions
diff --git a/alarm-manager.c b/alarm-manager.c index fcf0929..0a375ce 100644 --- a/alarm-manager.c +++ b/alarm-manager.c @@ -67,6 +67,7 @@ bool g_dummy_timer_is_set = FALSE; GSList *g_scheduled_alarm_list = NULL; GSList *g_expired_alarm_list = NULL; +GSList *g_disabled_alarm_list; #ifndef RTC_WKALM_BOOT_SET #define RTC_WKALM_BOOT_SET _IOW('p', 0x80, struct rtc_wkalrm) @@ -1880,6 +1881,82 @@ static void __on_system_time_external_changed(keynode_t *node, void *data) return; } +static int __on_app_enable_cb(uid_t target_uid, int req_id, + const char *pkg_type, const char *pkgid, const char *appid, + const char *key, const char *val, const void *pmsg, void *data) +{ + SECURE_LOGD("appid:%s, key:%s, val:%s, req_id: %d", appid, key, val, req_id); + + GSList *gs_iter = NULL; + __alarm_info_t *entry = NULL; + int duetime = 0; + bool is_restored = false; + + if (key && strncmp(key, "end", 3) == 0 && val && strncmp(val, "ok", 2) == 0) { + SECURE_LOGD("Enable appid(%s)", appid); + for (gs_iter = g_disabled_alarm_list; gs_iter != NULL; ) { + entry = gs_iter->data; + + gs_iter = g_slist_next(gs_iter); + if (strncmp(appid, g_quark_to_string(entry->quark_app_unique_name), strlen(appid)) == 0) { + duetime = _alarm_next_duetime(entry); + SECURE_LOGD("Restore alarm_id(%d) duetime(%d) appid(%s)", entry->alarm_id, duetime, appid); + alarm_context.alarms = g_slist_append(alarm_context.alarms, entry); + g_disabled_alarm_list = g_slist_remove(g_disabled_alarm_list, entry); + + if (!(entry->alarm_info.alarm_type & ALARM_TYPE_VOLATILE)) + _update_db_for_disabled_alarm(entry->alarm_id, false); + is_restored = true; + } + } + + if (is_restored) { + _alarm_disable_timer(alarm_context); + _clear_scheduled_alarm_list(); + _alarm_schedule(); + __rtc_set(); + } + } + + return 0; +} + +static int __on_app_disable_cb(uid_t target_uid, int req_id, + const char *pkg_type, const char *pkgid, const char *appid, + const char *key, const char *val, const void *pmsg, void *data) +{ + SECURE_LOGD("appid:%s, key:%s, val:%s, req_id: %d", appid, key, val, req_id); + + GSList *gs_iter = NULL; + __alarm_info_t *entry = NULL; + bool is_disabled = false; + + if (key && strncmp(key, "end", 3) == 0 && val && strncmp(val, "ok", 2) == 0) { + SECURE_LOGD("Disable appid(%s)", appid); + for (gs_iter = alarm_context.alarms; gs_iter != NULL; ) { + entry = gs_iter->data; + + gs_iter = g_slist_next(gs_iter); + if (strncmp(appid, g_quark_to_string(entry->quark_app_unique_name), strlen(appid)) == 0) { + if (!(entry->alarm_info.alarm_type & ALARM_TYPE_VOLATILE)) + _update_db_for_disabled_alarm(entry->alarm_id, true); + g_disabled_alarm_list = g_slist_append(g_disabled_alarm_list, entry); + alarm_context.alarms = g_slist_remove(alarm_context.alarms, entry); + is_disabled = true; + } + } + + if (is_disabled) { + _alarm_disable_timer(alarm_context); + _clear_scheduled_alarm_list(); + _alarm_schedule(); + __rtc_set(); + } + } + + return 0; +} + static int __on_app_uninstalled(uid_t target_uid, int req_id, const char *pkg_type, const char *pkgid, const char *key, const char *val, const void *pmsg, void *user_data) @@ -3576,11 +3653,15 @@ static bool __initialize_noti() } /* If the caller or callee app is uninstalled, all registered alarms will be canceled. */ - int event_type = PKGMGR_CLIENT_STATUS_UNINSTALL; pkgmgr_client *pc = pkgmgr_client_new(PC_LISTENING); - pkgmgr_client_set_status_type(pc, event_type); + pkgmgr_client_set_status_type(pc, PKGMGR_CLIENT_STATUS_UNINSTALL); pkgmgr_client_listen_status(pc, __on_app_uninstalled, NULL); + pkgmgr_client_set_status_type(pc, PKGMGR_CLIENT_STATUS_ENABLE_APP); + pkgmgr_client_listen_app_status(pc, __on_app_enable_cb, NULL); + + pkgmgr_client_set_status_type(pc, PKGMGR_CLIENT_STATUS_DISABLE_APP); + pkgmgr_client_listen_app_status(pc, __on_app_disable_cb, NULL); return true; } @@ -3708,6 +3789,7 @@ static bool __initialize_dbus() uid integer,\ pid integer,\ global integer,\ + is_disabled integer,\ caller_pkgid text,\ callee_pkgid text,\ app_unique_name text,\ |