Add comments for line/function coverage analysis
[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-mobile.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         "FEEDBACK_TYPE_MOBILE_LED",
41 };
42
43 static const char *mobile_str_pattern[] = {
44         "FEEDBACK_PATTERN_TAP",
45         "FEEDBACK_PATTERN_SIP",
46         "FEEDBACK_PATTERN_MOBILE_SIP_BACKSPACE",
47         "FEEDBACK_PATTERN_MOBILE_SIP_FUNCTION",
48         "FEEDBACK_PATTERN_MOBILE_SIP_FJKEY",
49         "FEEDBACK_PATTERN_MOBILE_MAX_CHARACTER",
50         "FEEDBACK_PATTERN_KEY0",
51         "FEEDBACK_PATTERN_KEY1",
52         "FEEDBACK_PATTERN_KEY2",
53         "FEEDBACK_PATTERN_KEY3",
54         "FEEDBACK_PATTERN_KEY4",
55         "FEEDBACK_PATTERN_KEY5",
56         "FEEDBACK_PATTERN_KEY6",
57         "FEEDBACK_PATTERN_KEY7",
58         "FEEDBACK_PATTERN_KEY8",
59         "FEEDBACK_PATTERN_KEY9",
60         "FEEDBACK_PATTERN_KEY_STAR",
61         "FEEDBACK_PATTERN_KEY_SHARP",
62         "FEEDBACK_PATTERN_KEY_BACK",
63         "FEEDBACK_PATTERN_HOLD",
64         "FEEDBACK_PATTERN_MOBILE_MULTI_TAP",
65         "FEEDBACK_PATTERN_HW_TAP",
66         "FEEDBACK_PATTERN_HW_HOLD",
67
68         "FEEDBACK_PATTERN_MESSAGE",
69         "FEEDBACK_PATTERN_MOBILE_MESSAGE_ON_CALL",
70         "FEEDBACK_PATTERN_EMAIL",
71         "FEEDBACK_PATTERN_MOBILE_EMAIL_ON_CALL",
72         "FEEDBACK_PATTERN_WAKEUP",
73         "FEEDBACK_PATTERN_MOBILE_WAKEUP_ON_CALL",
74         "FEEDBACK_PATTERN_SCHEDULE",
75         "FEEDBACK_PATTERN_MOBILE_SCHEDULE_ON_CALL",
76         "FEEDBACK_PATTERN_TIMER",
77         "FEEDBACK_PATTERN_MOBILE_TIMER_ON_CALL",
78         "FEEDBACK_PATTERN_GENERAL",
79         "FEEDBACK_PATTERN_MOBILE_GENERAL_ON_CALL",
80         "FEEDBACK_PATTERN_MOBILE_SMART_ALERT",
81
82         "FEEDBACK_PATTERN_POWERON",
83         "FEEDBACK_PATTERN_POWEROFF",
84         "FEEDBACK_PATTERN_CHARGERCONN",
85         "FEEDBACK_PATTERN_MOBILE_CHARGERCONN_ON_CALL",
86         "FEEDBACK_PATTERN_CHARGING_ERROR",
87         "FEEDBACK_PATTERN_MOBILE_CHARGING_ERROR_ON_CALL",
88         "FEEDBACK_PATTERN_FULLCHARGED",
89         "FEEDBACK_PATTERN_MOBILE_FULLCHARGED_ON_CALL",
90         "FEEDBACK_PATTERN_LOWBATT",
91         "FEEDBACK_PATTERN_MOBILE_LOWBATT_ON_CALL",
92         "FEEDBACK_PATTERN_LOCK",
93         "FEEDBACK_PATTERN_UNLOCK",
94         "FEEDBACK_PATTERN_MOBILE_LOCK_SWIPE",
95         "FEEDBACK_PATTERN_MOBILE_UNLOCK_SWIPE",
96         "FEEDBACK_PATTERN_MOBILE_GEOMETRIC_LOCK",
97         "FEEDBACK_PATTERN_MOBILE_CALLCONNECT",
98         "FEEDBACK_PATTERN_MOBILE_DISCALLCONNECT",
99         "FEEDBACK_PATTERN_MOBILE_OUTGOING_CALL",
100         "FEEDBACK_PATTERN_MOBILE_MINUTEMINDER",
101         "FEEDBACK_PATTERN_VIBRATION_ON",
102         "FEEDBACK_PATTERN_SILENT_OFF",
103         "FEEDBACK_PATTERN_BT_CONNECTED",
104         "FEEDBACK_PATTERN_BT_DISCONNECTED",
105         "FEEDBACK_PATTERN_MOBILE_BT_PAIRING",
106         "FEEDBACK_PATTERN_MOBILE_BT_WAITING",
107         "FEEDBACK_PATTERN_MOBILE_SCREEN_CAPTURE",
108         "FEEDBACK_PATTERN_LIST_REORDER",
109         "FEEDBACK_PATTERN_LIST_SLIDER",
110         "FEEDBACK_PATTERN_VOLUME_KEY",
111         "FEEDBACK_PATTERN_MOBILE_MMS",
112         "FEEDBACK_PATTERN_MOBILE_HOURLY_ALERT",
113
114         "FEEDBACK_PATTERN_MOBILE_SAFETY_ALERT",
115         "FEEDBACK_PATTERN_MOBILE_ACCIDENT_DETECT",
116         "FEEDBACK_PATTERN_MOBILE_SEND_SOS_MESSAGE",
117         "FEEDBACK_PATTERN_MOBILE_END_SOS_MESSAGE",
118         "FEEDBACK_PATTERN_MOBILE_EMERGENCY_BUZZER",
119         "FEEDBACK_PATTERN_MOBILE_SAFETY_LOW_POWER",
120         "FEEDBACK_PATTERN_MOBILE_CMAS",
121 };
122
123 static int callstatus;
124 static int lock_sndstatus;
125 static int camerastatus;
126 static int shutter_sndstatus;
127 static int noti_vibstatus;
128 static int vib_level;
129 static int noti_level;
130 static int feedbackstatus;
131
132 //LCOV_EXCL_START Not called Callback
133 static void feedback_callstatus_cb(keynode_t *key, void* data)
134 {
135         callstatus = vconf_keynode_get_int(key);
136 }
137
138 static void feedback_lock_sndstatus_cb(keynode_t *key, void* data)
139 {
140         lock_sndstatus = vconf_keynode_get_bool(key);
141 }
142
143 static void feedback_camerastatus_cb(keynode_t *key, void* data)
144 {
145         camerastatus = vconf_keynode_get_int(key);
146 }
147
148 static void feedback_noti_vibstatus_cb(keynode_t *key, void* data)
149 {
150         noti_vibstatus = vconf_keynode_get_bool(key);
151 }
152
153 static void feedback_vib_cb(keynode_t *key, void* data)
154 {
155         vib_level = vconf_keynode_get_int(key);
156 }
157
158 static void feedback_noti_cb(keynode_t *key, void* data)
159 {
160         noti_level = vconf_keynode_get_int(key);
161 }
162
163 static void feedback_feedbackstatus_cb(keynode_t *key, void* data)
164 {
165         feedbackstatus = vconf_keynode_get_bool(key);
166 }
167 //LCOV_EXCL_STOP
168
169 static void mobile_init(void)
170 {
171         /* check call status */
172         if (vconf_get_int(VCONFKEY_CALL_STATE, &callstatus) < 0)
173                 _W("VCONFKEY_CALL_STATE ==> FAIL!!"); //LCOV_EXCL_LINE
174
175         if (vconf_get_bool(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, &lock_sndstatus) < 0)
176                 _W("VCONFKEY_SETAPPL_SOUND_LOCK_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
177
178         /* check camera status */
179         if (vconf_get_int(VCONFKEY_CAMERA_STATE, &camerastatus) < 0)
180                 _W("VCONFKEY_CAMERA_STATE ==> FAIL!!"); //LCOV_EXCL_LINE
181
182         /* shutter sound policy */
183         /* This vconf is read just once, because this value is not changed in running time. */
184         if (vconf_get_int(VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY, &shutter_sndstatus) < 0)
185                 _W("VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY ==> FAIL!!"); //LCOV_EXCL_LINE
186
187         /* check vibration status */
188         if (vconf_get_bool(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, &noti_vibstatus) < 0)
189                 _W("VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
190
191         /* check vib_level */
192         if (vconf_get_int(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, &vib_level) < 0)
193                 _W("VCONFKEY_FEEDBACK_VIBRATION_LEVEL_INT ==> FAIL!!"); //LCOV_EXCL_LINE
194
195         /* check noti_level */
196         if (vconf_get_int(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, &noti_level) < 0)
197                 _W("VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT ==> FAIL!!"); //LCOV_EXCL_LINE
198
199         /* feedback Init */
200         if (vconf_get_bool(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, &feedbackstatus) < 0)
201                 _W("VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
202
203         /* add watch for status value */
204         vconf_notify_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb, NULL);
205         vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, feedback_lock_sndstatus_cb, NULL);
206         vconf_notify_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb, NULL);
207         vconf_notify_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb, NULL);
208         vconf_notify_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb, NULL);
209         vconf_notify_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb, NULL);
210         vconf_notify_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb, NULL);
211 }
212
213 static void mobile_exit(void)
214 {
215         /* remove watch */
216         vconf_ignore_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb);
217         vconf_ignore_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, feedback_lock_sndstatus_cb);
218         vconf_ignore_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb);
219         vconf_ignore_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb);
220         vconf_ignore_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb);
221         vconf_ignore_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb);
222         vconf_ignore_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb);
223 }
224
225 static bool mobile_get_switched_pattern(int pattern, int *switched)
226 {
227         if (!switched)
228                 return false;
229
230         if (callstatus == VCONFKEY_CALL_OFF)
231                 return false;
232
233         /* in case of call connected or connecting */
234         _D("Call status is connected or connecting."); //LCOV_EXCL_LINE
235         if (pattern == FEEDBACK_PATTERN_MESSAGE)
236                 *switched = FEEDBACK_PATTERN_MOBILE_MESSAGE_ON_CALL;
237         else if (pattern == FEEDBACK_PATTERN_EMAIL)
238                 *switched = FEEDBACK_PATTERN_MOBILE_EMAIL_ON_CALL;
239         else if (pattern == FEEDBACK_PATTERN_WAKEUP)
240                 *switched = FEEDBACK_PATTERN_MOBILE_WAKEUP_ON_CALL;
241         else if (pattern == FEEDBACK_PATTERN_SCHEDULE)
242                 *switched = FEEDBACK_PATTERN_MOBILE_SCHEDULE_ON_CALL;
243         else if (pattern == FEEDBACK_PATTERN_TIMER)
244                 *switched = FEEDBACK_PATTERN_MOBILE_TIMER_ON_CALL;
245         else if (pattern == FEEDBACK_PATTERN_GENERAL)
246                 *switched = FEEDBACK_PATTERN_MOBILE_GENERAL_ON_CALL;
247         else if (pattern == FEEDBACK_PATTERN_CHARGERCONN)
248                 *switched = FEEDBACK_PATTERN_MOBILE_CHARGERCONN_ON_CALL;
249         else if (pattern == FEEDBACK_PATTERN_CHARGING_ERROR)
250                 *switched = FEEDBACK_PATTERN_MOBILE_CHARGING_ERROR_ON_CALL;
251         else if (pattern == FEEDBACK_PATTERN_FULLCHARGED)
252                 *switched = FEEDBACK_PATTERN_MOBILE_FULLCHARGED_ON_CALL;
253         else if (pattern == FEEDBACK_PATTERN_LOWBATT)
254                 *switched = FEEDBACK_PATTERN_MOBILE_LOWBATT_ON_CALL;
255         else
256                 return false;
257
258         return true;
259 }
260
261 static bool mobile_get_always_alert_case(int type, int pattern)
262 {
263         switch (pattern) {
264         case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
265         case FEEDBACK_PATTERN_HOLD:
266                 if (CHECK_VIBRATION(type) && feedbackstatus)
267                         return true;
268                 break;
269         case FEEDBACK_PATTERN_SIP:
270         case FEEDBACK_PATTERN_MOBILE_SIP_BACKSPACE:
271         case FEEDBACK_PATTERN_MOBILE_SIP_FUNCTION:
272         case FEEDBACK_PATTERN_MOBILE_SIP_FJKEY:
273                 if (CHECK_VIBRATION(type))
274                         return true;
275                 break;
276         case FEEDBACK_PATTERN_MESSAGE:
277         case FEEDBACK_PATTERN_EMAIL:
278                 if (CHECK_VIBRATION(type) && noti_vibstatus)
279                         return true;
280                 break;
281         case FEEDBACK_PATTERN_TIMER:
282         case FEEDBACK_PATTERN_MOBILE_TIMER_ON_CALL:
283                 if (CHECK_VIBRATION(type))
284                         return true;
285                 break;
286         case FEEDBACK_PATTERN_WAKEUP:
287         case FEEDBACK_PATTERN_MOBILE_WAKEUP_ON_CALL:
288                 return true;
289         case FEEDBACK_PATTERN_MOBILE_MESSAGE_ON_CALL:
290         case FEEDBACK_PATTERN_MOBILE_EMAIL_ON_CALL:
291         case FEEDBACK_PATTERN_MOBILE_GENERAL_ON_CALL:
292                 break;
293         case FEEDBACK_PATTERN_MOBILE_CHARGERCONN_ON_CALL:
294         case FEEDBACK_PATTERN_MOBILE_CHARGING_ERROR_ON_CALL:
295         case FEEDBACK_PATTERN_MOBILE_LOWBATT_ON_CALL:
296         case FEEDBACK_PATTERN_MOBILE_MMS:
297         case FEEDBACK_PATTERN_MOBILE_HOURLY_ALERT:
298                 /* no matter sound profile */
299                 if (CHECK_VIBRATION(type))
300                         return true;
301                 break;
302         case FEEDBACK_PATTERN_MOBILE_SMART_ALERT:
303         case FEEDBACK_PATTERN_MOBILE_SEND_SOS_MESSAGE:
304         case FEEDBACK_PATTERN_MOBILE_END_SOS_MESSAGE:
305         case FEEDBACK_PATTERN_MOBILE_CMAS:
306         case FEEDBACK_PATTERN_MOBILE_OUTGOING_CALL:
307                 return true;
308         case FEEDBACK_PATTERN_MOBILE_SCREEN_CAPTURE:
309                 if (CHECK_SOUND(type) && camerastatus && shutter_sndstatus)
310                         return true;
311                 break;
312         default:
313                 break;
314         }
315         return false;
316 }
317
318 static bool mobile_get_always_off_case(int type, int pattern)
319 {
320         int ret;
321
322         /* check if the state of voice recorder is recording */
323         if (vconf_get_int(VCONFKEY_RECORDER_STATE, &ret) < 0) {
324                 _W("fail to get media sound status, status will be zero"); //LCOV_EXCL_LINE
325                 ret = 0;
326         }
327
328         if (CHECK_SOUND(type) && ret == VCONFKEY_RECORDER_STATE_RECORDING) {
329                 _D("voice recording status is RECORDING"); //LCOV_EXCL_LINE
330                 return true;
331         }
332
333         switch (pattern) {
334         case FEEDBACK_PATTERN_TAP:
335         case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD:
336                 if (CHECK_SOUND(type) && !is_touch_sndstatus())
337                         return true;
338                 break;
339         case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
340                 if (CHECK_SOUND(type) && !is_keytone_sndstatus())
341                         return true;
342                 else if (CHECK_VIBRATION(type) && !feedbackstatus)
343                         return true;
344                 break;
345         case FEEDBACK_PATTERN_LOCK:
346         case FEEDBACK_PATTERN_UNLOCK:
347         case FEEDBACK_PATTERN_MOBILE_LOCK_SWIPE:
348         case FEEDBACK_PATTERN_MOBILE_UNLOCK_SWIPE:
349                 if (CHECK_SOUND(type) && !lock_sndstatus)
350                         return true;
351                 break;
352         default:
353                 break;
354         }
355         return false;
356 }
357
358 static int mobile_get_strength_type(int type, int pattern)
359 {
360         if (CHECK_SOUND(type)) {
361                 if (pattern == FEEDBACK_PATTERN_TAP)
362                         return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH;
363                 else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK)
364                         return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER;
365                 else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY)
366                         return VOLUME_TYPE_RINGTONE;
367                 else if (camerastatus && shutter_sndstatus && pattern == FEEDBACK_PATTERN_MOBILE_SCREEN_CAPTURE)
368                         return VOLUME_TYPE_FIXED;
369                 else
370                         return VOLUME_TYPE_SYSTEM;
371         } else if (CHECK_VIBRATION(type)) {
372                 if (pattern >= FEEDBACK_PATTERN_MESSAGE &&
373                     pattern <= FEEDBACK_PATTERN_GENERAL)
374                         return noti_level * HAPTIC_FEEDBACK_STEP;
375                 else
376                         return vib_level * HAPTIC_FEEDBACK_STEP;
377         }
378
379         return -EINVAL;
380 }
381
382 static const struct profile_ops mobile_profile_ops = {
383         .profile               = "mobile",
384         .init                  = mobile_init,
385         .exit                  = mobile_exit,
386         .get_switched_pattern  = mobile_get_switched_pattern,
387         .get_always_alert_case = mobile_get_always_alert_case,
388         .get_always_off_case   = mobile_get_always_off_case,
389         .get_strength_type     = mobile_get_strength_type,
390         .max_type              = FEEDBACK_TYPE_MOBILE_END,
391         .max_pattern           = FEEDBACK_PATTERN_MOBILE_END,
392         .str_type              = mobile_str_type,
393         .str_pattern           = mobile_str_pattern,
394 };
395
396 PROFILE_OPS_REGISTER(&mobile_profile_ops);