Add notification type check for mobile
[platform/core/system/libsvi.git] / mobile / src / check.c
1 /*
2  * libfeedback
3  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
4  *
5  * Licensed under the Apache License, Version 2.0 (the License);
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18
19 #include <stdio.h>
20 #include <vconf.h>
21
22 #include "feedback.h"
23 #include "feedback-ids-internal.h"
24 #include "profiles.h"
25 #include "log.h"
26
27 /* Temporary keys */
28 #ifndef VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL
29 #define VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL "db/setting/sound/vibrate_when_notification"
30 #endif
31 #ifndef VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL
32 #define VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL "db/setting/sound/haptic_feedback_on"
33 #endif
34
35
36 static const char *mobile_str_type[] = {
37         "FEEDBACK_TYPE_NONE",
38         "FEEDBACK_TYPE_SOUND",
39         "FEEDBACK_TYPE_VIBRATION",
40 };
41
42 static const char *mobile_str_pattern[] = {
43         "FEEDBACK_PATTERN_TAP",
44         "FEEDBACK_PATTERN_SIP",
45         "",
46         "",
47         "",
48         "",
49         "FEEDBACK_PATTERN_KEY0",
50         "FEEDBACK_PATTERN_KEY1",
51         "FEEDBACK_PATTERN_KEY2",
52         "FEEDBACK_PATTERN_KEY3",
53         "FEEDBACK_PATTERN_KEY4",
54         "FEEDBACK_PATTERN_KEY5",
55         "FEEDBACK_PATTERN_KEY6",
56         "FEEDBACK_PATTERN_KEY7",
57         "FEEDBACK_PATTERN_KEY8",
58         "FEEDBACK_PATTERN_KEY9",
59         "FEEDBACK_PATTERN_KEY_STAR",
60         "FEEDBACK_PATTERN_KEY_SHARP",
61         "FEEDBACK_PATTERN_KEY_BACK",
62         "FEEDBACK_PATTERN_HOLD",
63         "",
64         "FEEDBACK_PATTERN_HW_TAP",
65         "FEEDBACK_PATTERN_HW_HOLD",
66
67         "FEEDBACK_PATTERN_MESSAGE",
68         "FEEDBACK_PATTERN_MESSAGE_ON_CALL",
69         "FEEDBACK_PATTERN_EMAIL",
70         "FEEDBACK_PATTERN_EMAIL_ON_CALL",
71         "FEEDBACK_PATTERN_WAKEUP",
72         "FEEDBACK_PATTERN_WAKEUP_ON_CALL",
73         "FEEDBACK_PATTERN_SCHEDULE",
74         "FEEDBACK_PATTERN_SCHEDULE_ON_CALL",
75         "FEEDBACK_PATTERN_TIMER",
76         "FEEDBACK_PATTERN_TIMER_ON_CALL",
77         "FEEDBACK_PATTERN_GENERAL",
78         "FEEDBACK_PATTERN_GENERAL_ON_CALL",
79         "",
80
81         "FEEDBACK_PATTERN_POWERON",
82         "FEEDBACK_PATTERN_POWEROFF",
83         "FEEDBACK_PATTERN_CHARGERCONN",
84         "FEEDBACK_PATTERN_CHARGERCONN_ON_CALL",
85         "FEEDBACK_PATTERN_CHARGING_ERROR",
86         "FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL",
87         "FEEDBACK_PATTERN_FULLCHARGED",
88         "FEEDBACK_PATTERN_FULLCHARGED_ON_CALL",
89         "FEEDBACK_PATTERN_LOWBATT",
90         "FEEDBACK_PATTERN_LOWBATT_ON_CALL",
91         "FEEDBACK_PATTERN_LOCK",
92         "FEEDBACK_PATTERN_UNLOCK",
93         "",
94         "",
95         "",
96         "",
97         "",
98         "FEEDBACK_PATTERN_OUTGOING_CALL",
99         "",
100         "FEEDBACK_PATTERN_VIBRATION_ON",
101         "FEEDBACK_PATTERN_SILENT_OFF",
102         "FEEDBACK_PATTERN_BT_CONNECTED",
103         "FEEDBACK_PATTERN_BT_DISCONNECTED",
104         "",
105         "",
106         "FEEDBACK_PATTERN_SCREEN_CAPTURE",
107         "FEEDBACK_PATTERN_LIST_REORDER",
108         "FEEDBACK_PATTERN_LIST_SLIDER",
109         "FEEDBACK_PATTERN_VOLUME_KEY",
110         "",
111         "",
112
113         "",
114         "",
115         "",
116         "",
117         "",
118         "",
119         "",
120         "FEEDBACK_PATTERN_SEND_SOS_MESSAGE",
121         "FEEDBACK_PATTERN_RINGER",
122         "FEEDBACK_PATTERN_NOTIFICATION",
123         "FEEDBACK_PATTERN_INFO",
124         "FEEDBACK_PATTERN_WARNING",
125         "FEEDBACK_PATTERN_ERROR",
126         "FEEDBACK_PATTERN_EMERGENCY",
127 };
128
129 static int callstatus;
130 static int lock_sndstatus;
131 static int camerastatus;
132 static int shutter_sndstatus;
133 static int noti_vibstatus;
134 static int vib_level;
135 static int noti_level;
136 static int feedbackstatus;
137
138 //LCOV_EXCL_START Not called Callback
139 static void feedback_callstatus_cb(keynode_t *key, void* data)
140 {
141         callstatus = vconf_keynode_get_int(key);
142 }
143
144 static void feedback_lock_sndstatus_cb(keynode_t *key, void* data)
145 {
146         lock_sndstatus = vconf_keynode_get_bool(key);
147 }
148
149 static void feedback_camerastatus_cb(keynode_t *key, void* data)
150 {
151         camerastatus = vconf_keynode_get_int(key);
152 }
153
154 static void feedback_noti_vibstatus_cb(keynode_t *key, void* data)
155 {
156         noti_vibstatus = vconf_keynode_get_bool(key);
157 }
158
159 static void feedback_vib_cb(keynode_t *key, void* data)
160 {
161         vib_level = vconf_keynode_get_int(key);
162 }
163
164 static void feedback_noti_cb(keynode_t *key, void* data)
165 {
166         noti_level = vconf_keynode_get_int(key);
167 }
168
169 static void feedback_feedbackstatus_cb(keynode_t *key, void* data)
170 {
171         feedbackstatus = vconf_keynode_get_bool(key);
172 }
173 //LCOV_EXCL_STOP
174
175 static void mobile_init(void)
176 {
177         /* check call status */
178         if (vconf_get_int(VCONFKEY_CALL_STATE, &callstatus) < 0)
179                 _W("VCONFKEY_CALL_STATE ==> FAIL!!"); //LCOV_EXCL_LINE
180
181         if (vconf_get_bool(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, &lock_sndstatus) < 0)
182                 _W("VCONFKEY_SETAPPL_SOUND_LOCK_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
183
184         /* check camera status */
185         if (vconf_get_int(VCONFKEY_CAMERA_STATE, &camerastatus) < 0)
186                 _W("VCONFKEY_CAMERA_STATE ==> FAIL!!"); //LCOV_EXCL_LINE
187
188         /* shutter sound policy */
189         /* This vconf is read just once, because this value is not changed in running time. */
190         if (vconf_get_int(VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY, &shutter_sndstatus) < 0)
191                 _W("VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY ==> FAIL!!"); //LCOV_EXCL_LINE
192
193         /* check vibration status */
194         if (vconf_get_bool(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, &noti_vibstatus) < 0)
195                 _W("VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
196
197         /* check vib_level */
198         if (vconf_get_int(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, &vib_level) < 0)
199                 _W("VCONFKEY_FEEDBACK_VIBRATION_LEVEL_INT ==> FAIL!!"); //LCOV_EXCL_LINE
200
201         /* check noti_level */
202         if (vconf_get_int(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, &noti_level) < 0)
203                 _W("VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT ==> FAIL!!"); //LCOV_EXCL_LINE
204
205         /* feedback Init */
206         if (vconf_get_bool(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, &feedbackstatus) < 0)
207                 _W("VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
208
209         /* add watch for status value */
210         vconf_notify_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb, NULL);
211         vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, feedback_lock_sndstatus_cb, NULL);
212         vconf_notify_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb, NULL);
213         vconf_notify_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb, NULL);
214         vconf_notify_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb, NULL);
215         vconf_notify_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb, NULL);
216         vconf_notify_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb, NULL);
217 }
218
219 static void mobile_exit(void)
220 {
221         /* remove watch */
222         vconf_ignore_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb);
223         vconf_ignore_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, feedback_lock_sndstatus_cb);
224         vconf_ignore_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb);
225         vconf_ignore_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb);
226         vconf_ignore_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb);
227         vconf_ignore_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb);
228         vconf_ignore_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb);
229 }
230
231 static bool mobile_get_switched_pattern(int pattern, int *switched)
232 {
233         if (!switched)
234                 return false;
235
236         if (callstatus == VCONFKEY_CALL_OFF)
237                 return false;
238
239         /* in case of call connected or connecting */
240         _D("Call status is connected or connecting."); //LCOV_EXCL_LINE
241         if (pattern == FEEDBACK_PATTERN_MESSAGE)
242                 *switched = FEEDBACK_PATTERN_MESSAGE_ON_CALL;
243         else if (pattern == FEEDBACK_PATTERN_EMAIL)
244                 *switched = FEEDBACK_PATTERN_EMAIL_ON_CALL;
245         else if (pattern == FEEDBACK_PATTERN_WAKEUP)
246                 *switched = FEEDBACK_PATTERN_WAKEUP_ON_CALL;
247         else if (pattern == FEEDBACK_PATTERN_SCHEDULE)
248                 *switched = FEEDBACK_PATTERN_SCHEDULE_ON_CALL;
249         else if (pattern == FEEDBACK_PATTERN_TIMER)
250                 *switched = FEEDBACK_PATTERN_TIMER_ON_CALL;
251         else if (pattern == FEEDBACK_PATTERN_GENERAL)
252                 *switched = FEEDBACK_PATTERN_GENERAL_ON_CALL;
253         else if (pattern == FEEDBACK_PATTERN_CHARGERCONN)
254                 *switched = FEEDBACK_PATTERN_CHARGERCONN_ON_CALL;
255         else if (pattern == FEEDBACK_PATTERN_CHARGING_ERROR)
256                 *switched = FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL;
257         else if (pattern == FEEDBACK_PATTERN_FULLCHARGED)
258                 *switched = FEEDBACK_PATTERN_FULLCHARGED_ON_CALL;
259         else if (pattern == FEEDBACK_PATTERN_LOWBATT)
260                 *switched = FEEDBACK_PATTERN_LOWBATT_ON_CALL;
261         else
262                 return false;
263
264         return true;
265 }
266
267 static bool mobile_is_notification_type(int pattern)
268 {
269         switch (pattern) {
270         case FEEDBACK_PATTERN_WAKEUP:
271         case FEEDBACK_PATTERN_WAKEUP_ON_CALL:
272         case FEEDBACK_PATTERN_TIMER:
273         case FEEDBACK_PATTERN_TIMER_ON_CALL:
274         case FEEDBACK_PATTERN_MESSAGE ... FEEDBACK_PATTERN_EMAIL_ON_CALL:
275         case FEEDBACK_PATTERN_SCHEDULE:
276         case FEEDBACK_PATTERN_SCHEDULE_ON_CALL:
277         case FEEDBACK_PATTERN_GENERAL ... FEEDBACK_PATTERN_LOWBATT_ON_CALL:
278                 return true;
279         }
280         return false;
281 }
282
283 static bool mobile_get_always_alert_case(int type, int pattern)
284 {
285         switch (pattern) {
286         case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
287         case FEEDBACK_PATTERN_HOLD:
288                 if (CHECK_VIBRATION(type) && feedbackstatus)
289                         return true;
290                 break;
291         case FEEDBACK_PATTERN_SIP:
292                 if (CHECK_VIBRATION(type))
293                         return true;
294                 break;
295         case FEEDBACK_PATTERN_MESSAGE:
296         case FEEDBACK_PATTERN_EMAIL:
297                 if (CHECK_VIBRATION(type) && noti_vibstatus)
298                         return true;
299                 break;
300         case FEEDBACK_PATTERN_TIMER:
301         case FEEDBACK_PATTERN_TIMER_ON_CALL:
302                 if (CHECK_VIBRATION(type))
303                         return true;
304                 break;
305         case FEEDBACK_PATTERN_WAKEUP:
306         case FEEDBACK_PATTERN_WAKEUP_ON_CALL:
307                 return true;
308         case FEEDBACK_PATTERN_MESSAGE_ON_CALL:
309         case FEEDBACK_PATTERN_EMAIL_ON_CALL:
310         case FEEDBACK_PATTERN_GENERAL_ON_CALL:
311                 break;
312         case FEEDBACK_PATTERN_CHARGERCONN_ON_CALL:
313         case FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL:
314         case FEEDBACK_PATTERN_LOWBATT_ON_CALL:
315                 /* no matter sound profile */
316                 if (CHECK_VIBRATION(type))
317                         return true;
318                 break;
319         case FEEDBACK_PATTERN_SEND_SOS_MESSAGE:
320         case FEEDBACK_PATTERN_OUTGOING_CALL:
321                 return true;
322         case FEEDBACK_PATTERN_SCREEN_CAPTURE:
323                 if (CHECK_SOUND(type) && camerastatus && shutter_sndstatus)
324                         return true;
325                 break;
326         case FEEDBACK_PATTERN_RINGER:
327                 return true;
328         default:
329                 break;
330         }
331         return false;
332 }
333
334 static bool mobile_get_always_off_case(int type, int pattern)
335 {
336         int ret;
337
338         /* check if the state of voice recorder is recording */
339         if (vconf_get_int(VCONFKEY_RECORDER_STATE, &ret) < 0) {
340                 _W("fail to get media sound status, status will be zero"); //LCOV_EXCL_LINE
341                 ret = 0;
342         }
343
344         if (CHECK_SOUND(type) && ret == VCONFKEY_RECORDER_STATE_RECORDING) {
345                 _D("voice recording status is RECORDING"); //LCOV_EXCL_LINE
346                 return true;
347         }
348
349         switch (pattern) {
350         case FEEDBACK_PATTERN_TAP:
351         case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD:
352                 if (CHECK_SOUND(type) && !is_touch_sndstatus())
353                         return true;
354                 break;
355         case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
356                 if (CHECK_SOUND(type) && !is_keytone_sndstatus())
357                         return true;
358                 else if (CHECK_VIBRATION(type) && !feedbackstatus)
359                         return true;
360                 break;
361         case FEEDBACK_PATTERN_LOCK:
362         case FEEDBACK_PATTERN_UNLOCK:
363                 if (CHECK_SOUND(type) && !lock_sndstatus)
364                         return true;
365                 break;
366         default:
367                 break;
368         }
369         return false;
370 }
371
372 static int mobile_get_strength_type(int type, int pattern)
373 {
374         if (CHECK_SOUND(type)) {
375                 if (pattern == FEEDBACK_PATTERN_TAP)
376                         return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH;
377                 else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK)
378                         return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER;
379                 else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY)
380                         return VOLUME_TYPE_RINGTONE;
381                 else if (camerastatus && shutter_sndstatus && pattern == FEEDBACK_PATTERN_SCREEN_CAPTURE)
382                         return VOLUME_TYPE_FIXED;
383                 else
384                         return VOLUME_TYPE_SYSTEM;
385         } else if (CHECK_VIBRATION(type)) {
386                 if (pattern >= FEEDBACK_PATTERN_MESSAGE &&
387                     pattern <= FEEDBACK_PATTERN_GENERAL)
388                         return noti_level * HAPTIC_FEEDBACK_STEP;
389                 else
390                         return vib_level * HAPTIC_FEEDBACK_STEP;
391         }
392
393         return -EINVAL;
394 }
395
396 static const struct profile_ops mobile_profile_ops = {
397         .profile               = "mobile",
398         .init                  = mobile_init,
399         .exit                  = mobile_exit,
400         .get_switched_pattern  = mobile_get_switched_pattern,
401         .get_always_alert_case = mobile_get_always_alert_case,
402         .get_always_off_case   = mobile_get_always_off_case,
403         .get_strength_type     = mobile_get_strength_type,
404         .is_notification_type  = mobile_is_notification_type,
405         .max_type              = FEEDBACK_TYPE_END,
406         .max_pattern           = FEEDBACK_PATTERN_INTERNAL_END,
407         .str_type              = mobile_str_type,
408         .str_pattern           = mobile_str_pattern,
409 };
410
411 PROFILE_OPS_REGISTER(&mobile_profile_ops);