summaryrefslogtreecommitdiff
path: root/alarm-manager.c
diff options
context:
space:
mode:
authorJiwoong Im <jiwoong.im@samsung.com>2016-10-31 17:58:15 +0900
committerjongmyeong ko <jongmyeong.ko@samsung.com>2016-11-14 23:29:52 -0800
commita30b1552fca95e1aeb07c818018ec2ef6917fee7 (patch)
tree9060e0f083f4fe2aaef253c3f36049b99a431b38 /alarm-manager.c
parent1294e15c8bffcb852c6489e302996f9f48d6c248 (diff)
downloadalarm-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.c86
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,\