2 * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
24 #include "quickpanel-ui.h"
29 #define REMINDER_MIN_INTERVAL 2
37 static void _feedback_sound_play(void)
40 noti_node_item *node = NULL;
43 const char *nsound_path = NULL;
44 notification_sound_type_e nsound_type = NOTIFICATION_SOUND_TYPE_NONE;
45 int is_play_default = 0;
47 // check first noti sound
48 node = quickpanel_noti_node_get_first_noti();
54 notification_get_id(noti, NULL, &priv_id);
55 notification_get_sound(noti, &nsound_type, &nsound_path);
56 SDBG("reminded notification sound type[%d] path[%s]", nsound_type, nsound_path);
60 case NOTIFICATION_SOUND_TYPE_USER_DATA:
62 * if user data file isn't playable, play the default ringtone
64 if (nsound_path != NULL)
66 if (quickpanel_media_playable_check(nsound_path) == EINA_TRUE)
68 ret = quickpanel_player_play(SOUND_TYPE_NOTIFICATION, nsound_path);
69 if (ret == PLAYER_ERROR_NONE)
71 quickpanel_player_id_set(priv_id);
75 ERR("failed to play notification sound[%d]", ret);
81 case NOTIFICATION_SOUND_TYPE_DEFAULT:
84 case NOTIFICATION_SOUND_TYPE_MAX:
85 case NOTIFICATION_SOUND_TYPE_NONE:
93 #ifdef VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR
94 char *default_msg_tone = NULL;
95 default_msg_tone = vconf_get_str(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR);
96 SDBG("Reminded setting sound[%s]", default_msg_tone);
98 if (default_msg_tone != NULL)
100 ret = quickpanel_player_play(SOUND_TYPE_NOTIFICATION, default_msg_tone);
101 free(default_msg_tone);
102 quickpanel_player_id_set(0);
103 if (ret != PLAYER_ERROR_NONE)
105 ERR("failed to play feedback sound");
109 if (quickpanel_is_vib_enabled() == 1)
111 feedback_play_type(FEEDBACK_TYPE_VIBRATION, FEEDBACK_PATTERN_MESSAGE);
114 feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_UNLOCK);
119 static int _reminder_interval_get(void) {
124 ret = vconf_get_int(VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT, &key);
125 retif(ret != 0, 0, "failed to get vconf VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT");
139 DBG("interval:%d", min);
144 static int _alarm_delete_cb(alarm_id_t id, void * user_param)
146 int ret = ALARMMGR_RESULT_SUCCESS;
148 ret = alarmmgr_remove_alarm(id);
149 if(ret != ALARMMGR_RESULT_SUCCESS) {
150 ERR("alarmmgr_enum_alarm_ids() failed");
156 static void _alarm_unset(void)
158 int ret = ALARMMGR_RESULT_SUCCESS;
160 if(s_info.alarm_id != -1){
161 ERR("try to delete alarm_id(%d)", s_info.alarm_id);
162 ret = alarmmgr_remove_alarm(s_info.alarm_id);
163 if(ret != ALARMMGR_RESULT_SUCCESS) {
164 ERR("alarmmgr_remove_alarm(%d) failed", s_info.alarm_id);
165 ret = alarmmgr_enum_alarm_ids(_alarm_delete_cb, NULL);
166 if(ret != ALARMMGR_RESULT_SUCCESS) {
167 ERR("alarmmgr_enum_alarm_ids() failed");
170 s_info.alarm_id = -1;
174 static Eina_Bool _alarm_set_from_now(int min, void *data)
176 int ret = ALARMMGR_RESULT_SUCCESS;
178 struct tm current_tm;
179 alarm_entry_t *alarm_info = NULL;
181 alarm_date_t alarm_time;
183 /* delete before registering alarm ids */
186 /* set alarm after sec */
189 DBG(" %s, after %d MIN alarm set", ctime(¤t_time), min);
190 localtime_r(¤t_time, ¤t_tm);
192 alarm_info = alarmmgr_create_alarm();
193 if(alarm_info == NULL) {
194 ERR("alarmmgr_create_alarm() is failed\n");
199 alarm_time.month = 0;
201 alarm_time.hour = current_tm.tm_hour;
202 alarm_time.min = current_tm.tm_min + min;
203 alarm_time.sec = current_tm.tm_sec;
205 alarmmgr_set_repeat_mode(alarm_info, ALARM_REPEAT_MODE_ONCE, 0);
206 alarmmgr_set_time(alarm_info, alarm_time);
207 alarmmgr_set_type(alarm_info, ALARM_TYPE_VOLATILE);
209 ret = alarmmgr_add_alarm_with_localtime(alarm_info, NULL, &alarm_id);
210 if(ret != ALARMMGR_RESULT_SUCCESS) {
211 ERR("alarmmgr_add_alarm_with_localtime() failed:%d", ret);
212 alarmmgr_free_alarm(alarm_info) ;
216 DBG("alarm id(%d) is set", alarm_id);
217 s_info.alarm_id = alarm_id;
218 alarmmgr_free_alarm(alarm_info) ;
223 static int _alarm_cb(alarm_id_t alarm_id, void *data)
227 int min = _reminder_interval_get();
229 if (min >= REMINDER_MIN_INTERVAL) {
230 _alarm_set_from_now(min, data);
235 if (!quickpanel_is_opened()) {
236 _feedback_sound_play();
238 ERR("quickpanel is opened, skip remind sound");
244 static void _alarm_setting_changed_cb(keynode_t *key, void* data) {
245 int min = _reminder_interval_get();
247 if (quickpanel_noti_get_count() <= 0) {
250 if (min >= REMINDER_MIN_INTERVAL) {
251 _alarm_set_from_now(min, data);
258 void quickpanel_reminder_init(void *data) {
263 ret = alarmmgr_init("org.tizen.quickpanel");
264 retif(ret < 0, , "alarmmgr_init() failed (%d)", ret);
266 ret = alarmmgr_set_cb(_alarm_cb, NULL);
267 retif(ret < 0, , "alarmmgr_init() failed (%d)", ret);
269 ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT,
270 _alarm_setting_changed_cb, data);
272 ERR("failed to register a cb key:%s err:%d",
273 "VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT", ret);
276 s_info.alarm_id = -1;
279 void quickpanel_reminder_fini(void *data) {
288 ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT, _alarm_setting_changed_cb);
290 ERR("failed to unregister a cb key:%s err:%d", "VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT", ret);
294 void quickpanel_reminder_start(void *data) {
297 int min = _reminder_interval_get();
299 if (min >= REMINDER_MIN_INTERVAL) {
300 _alarm_set_from_now(min, data);
304 void quickpanel_reminder_stop(void *data) {