Extends do not disturb changed callback function
[platform/core/appfw/data-provider-master.git] / src / notification_service.c
index f8afff6..d1533ba 100755 (executable)
@@ -1188,15 +1188,21 @@ static int _dnd_schedule_alarm_cb(alarm_id_t alarm_id, void *data)
 
        for (; dnd_found_list != NULL; dnd_found_list = dnd_found_list->next) {
                dnd_id_data = dnd_found_list->data;
-               if (alarm_id == dnd_id_data->dnd_start_id) {
+               uid = dnd_id_data->uid;
+
+               ret = noti_system_setting_get_do_not_disturb(&do_not_disturb, uid);
+               if (ret != NOTIFICATION_ERROR_NONE) {
+                       ErrPrint("get do not disturb failed");
+                       return ret;
+               }
+
+               if (alarm_id == dnd_id_data->dnd_start_id && !do_not_disturb) {
                        do_not_disturb = 1;
                        dnd_id_found = true;
-                       uid = dnd_id_data->uid;
                        break;
-               } else if (alarm_id == dnd_id_data->dnd_end_id) {
+               } else if (alarm_id == dnd_id_data->dnd_end_id && do_not_disturb) {
                        do_not_disturb = 0;
                        dnd_id_found = true;
-                       uid = dnd_id_data->uid;
                        break;
                }
        }
@@ -1214,7 +1220,6 @@ static int _dnd_schedule_alarm_cb(alarm_id_t alarm_id, void *data)
        monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(uid));
        ret = send_notify(body, "change_dnd_notify", monitoring_list, PROVIDER_NOTI_INTERFACE_NAME);
        g_variant_unref(body);
-
        if (ret != NOTIFICATION_ERROR_NONE) {
                ErrPrint("failed to send notify:%d\n", ret);
                return ret;
@@ -1368,7 +1373,7 @@ static int _add_alarm(int dnd_schedule_day, int dnd_start_hour, int dnd_start_mi
                _dnd_alarm_id_list = g_list_append(_dnd_alarm_id_list, dnd_id_data);
        } else {
                found_list = g_list_find_custom(_dnd_alarm_id_list, GUINT_TO_POINTER(uid),
-                                          _dnd_data_compare);
+                                               (GCompareFunc)_dnd_data_compare);
                if (found_list) {
                        dnd_id_data = g_list_nth_data(found_list, 0);
                        if (dnd_id_data->dnd_start_id) {
@@ -1387,10 +1392,37 @@ static int _add_alarm(int dnd_schedule_day, int dnd_start_hour, int dnd_start_mi
        return ret;
 }
 
+static void _delete_alarm(uid_t uid)
+{
+       GList *found_list = NULL;
+       dnd_alarm_id_s *dnd_id_data = NULL;
+
+       if (_dnd_alarm_id_list == NULL)
+               return;
+
+       _dnd_alarm_id_list = g_list_first(_dnd_alarm_id_list);
+       found_list = g_list_find_custom(_dnd_alarm_id_list, GUINT_TO_POINTER(uid),
+                                       (GCompareFunc)_dnd_data_compare);
+
+       if (found_list == NULL)
+               return;
+
+       dnd_id_data = g_list_nth_data(found_list, 0);
+
+       if (dnd_id_data->dnd_start_id)
+               alarmmgr_remove_alarm(dnd_id_data->dnd_start_id);
+       if (dnd_id_data->dnd_end_id)
+               alarmmgr_remove_alarm(dnd_id_data->dnd_end_id);
+
+       _dnd_alarm_id_list = g_list_remove(g_list_first(_dnd_alarm_id_list), dnd_id_data);
+       free(dnd_id_data);
+}
+
 /* update_noti_sys_setting */
 int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_body, uid_t uid)
 {
        int ret;
+       int pre_do_not_disturb = 0;
        int do_not_disturb = 0;
        int visivility_class = 0;
        int dnd_schedule_enabled = 0;
@@ -1401,6 +1433,8 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_
        int dnd_end_min = 0;
        int lock_screen_level = 0;
        uid_t param_uid;
+       GVariant *body = NULL;
+       GList *monitoring_list = NULL;
 
        g_variant_get(parameters, "(iiiiiiiiii)",
                                &do_not_disturb,
@@ -1417,9 +1451,16 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_
        ret = _validate_and_set_param_uid_with_uid(uid, &param_uid);
        if (ret != NOTIFICATION_ERROR_NONE)
                return ret;
+
        DbgPrint("do_not_disturb [%d] visivility_class [%d] set_schedule [%d] lock_screen_level [%d]\n",
                        do_not_disturb, visivility_class, dnd_schedule_enabled, lock_screen_level);
 
+       ret = noti_system_setting_get_do_not_disturb(&pre_do_not_disturb, param_uid);
+       if (ret != NOTIFICATION_ERROR_NONE) {
+               ErrPrint("failed to get do not disturb");
+               return ret;
+       }
+
        ret = notification_setting_db_update_system_setting(do_not_disturb,
                                visivility_class,
                                dnd_schedule_enabled,
@@ -1435,6 +1476,13 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_
                return ret;
        }
 
+       if (pre_do_not_disturb != do_not_disturb) {
+               body = g_variant_new("(ii)", do_not_disturb, param_uid);
+               monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(uid));
+               ret = send_notify(body, "change_dnd_notify", monitoring_list, PROVIDER_NOTI_INTERFACE_NAME);
+               g_variant_unref(body);
+       }
+
        *reply_body = g_variant_new("()");
        if (*reply_body == NULL) {
                ErrPrint("cannot make reply_body");
@@ -1446,6 +1494,8 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_
                                dnd_end_hour, dnd_end_min, param_uid);
                if (ret != NOTIFICATION_ERROR_NONE)
                        ErrPrint("failed to add alarm for dnd_schedule");
+       } else {
+               _delete_alarm(param_uid);
        }
 
        DbgPrint("_update_noti_sys_setting_service done !! %d", ret);