Extends do not disturb changed callback function 61/90761/4 accepted/tizen/3.0/ivi/20161011.043732 accepted/tizen/3.0/mobile/20161015.032801 accepted/tizen/3.0/tv/20161016.003837 accepted/tizen/3.0/wearable/20161015.081804 accepted/tizen/common/20161005.165610 accepted/tizen/ivi/20161006.075658 accepted/tizen/mobile/20161006.075618 accepted/tizen/tv/20161006.075632 accepted/tizen/wearable/20161006.075649 submit/tizen/20161005.072822 submit/tizen_3.0_ivi/20161010.000001 submit/tizen_3.0_mobile/20161015.000001 submit/tizen_3.0_tv/20161015.000001 submit/tizen_3.0_wearable/20161015.000001
authorseungha.son <seungha.son@samsung.com>
Tue, 4 Oct 2016 07:19:16 +0000 (16:19 +0900)
committerseungha.son <seungha.son@samsung.com>
Wed, 5 Oct 2016 08:55:51 +0000 (17:55 +0900)
Signed-off-by: seungha.son <seungha.son@samsung.com>
Change-Id: I144131b064f4d7fbbf372bcdf47e99615ddc9a0f

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);