feedback: Add lcov exception code
[platform/core/system/libsvi.git] / 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 <stdlib.h>
21 #include <limits.h>
22 #include <vconf.h>
23 #include <system_info.h>
24 #include <sys/stat.h>
25
26 #include "feedback.h"
27 #include "feedback-internal.h"
28 #include "profiles.h"
29 #include "log.h"
30
31 #define BUZZ_CONVERTED 2
32 #define MAX_VIB_LEVEL  2
33
34 /* Temporary keys */
35 #ifndef VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL
36 #define VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL "db/setting/sound/vibrate_when_notification"
37 #endif
38 #ifndef VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL
39 #define VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL "db/setting/sound/haptic_feedback_on"
40 #endif
41
42 /* noti type */
43 #ifndef VCONFKEY_SETAPPL_NOTI_VIBRATION_PATTERN_INT
44 #define VCONFKEY_SETAPPL_NOTI_VIBRATION_PATTERN_INT "db/setting/sound/noti/vibration_type"
45 #endif
46
47 #ifndef VCONFKEY_SETAPPL_DISCONNECT_ALERT_TYPE_INT
48 #define VCONFKEY_SETAPPL_DISCONNECT_ALERT_TYPE_INT "db/setting/disconnect_alert/type"
49 #endif
50
51
52 static const char *profile_str_type[] = {
53         "FEEDBACK_TYPE_NONE",
54         "FEEDBACK_TYPE_SOUND",
55         "FEEDBACK_TYPE_VIBRATION",
56 };
57
58 static const struct pattern_field mobile_str_pattern[] = {
59         {"FEEDBACK_PATTERN_TAP", FEEDBACK_PATTERN_TAP},
60         {"FEEDBACK_PATTERN_SIP", FEEDBACK_PATTERN_SIP},
61
62         {"FEEDBACK_PATTERN_KEY0", FEEDBACK_PATTERN_KEY0},
63         {"FEEDBACK_PATTERN_KEY1", FEEDBACK_PATTERN_KEY1},
64         {"FEEDBACK_PATTERN_KEY2", FEEDBACK_PATTERN_KEY2},
65         {"FEEDBACK_PATTERN_KEY3", FEEDBACK_PATTERN_KEY3},
66         {"FEEDBACK_PATTERN_KEY4", FEEDBACK_PATTERN_KEY4},
67         {"FEEDBACK_PATTERN_KEY5", FEEDBACK_PATTERN_KEY5},
68         {"FEEDBACK_PATTERN_KEY6", FEEDBACK_PATTERN_KEY6},
69         {"FEEDBACK_PATTERN_KEY7", FEEDBACK_PATTERN_KEY7},
70         {"FEEDBACK_PATTERN_KEY8", FEEDBACK_PATTERN_KEY8},
71         {"FEEDBACK_PATTERN_KEY9", FEEDBACK_PATTERN_KEY9},
72         {"FEEDBACK_PATTERN_KEY_STAR", FEEDBACK_PATTERN_KEY_STAR},
73         {"FEEDBACK_PATTERN_KEY_SHARP", FEEDBACK_PATTERN_KEY_SHARP},
74         {"FEEDBACK_PATTERN_KEY_BACK", FEEDBACK_PATTERN_KEY_BACK},
75         {"FEEDBACK_PATTERN_HOLD", FEEDBACK_PATTERN_HOLD},
76
77         {"FEEDBACK_PATTERN_HW_TAP", FEEDBACK_PATTERN_HW_TAP},
78         {"FEEDBACK_PATTERN_HW_HOLD", FEEDBACK_PATTERN_HW_HOLD},
79
80         {"FEEDBACK_PATTERN_MESSAGE", FEEDBACK_PATTERN_MESSAGE},
81         {"FEEDBACK_PATTERN_MESSAGE_ON_CALL", FEEDBACK_PATTERN_MESSAGE_ON_CALL},
82         {"FEEDBACK_PATTERN_EMAIL", FEEDBACK_PATTERN_EMAIL},
83         {"FEEDBACK_PATTERN_EMAIL_ON_CALL", FEEDBACK_PATTERN_EMAIL_ON_CALL},
84         {"FEEDBACK_PATTERN_WAKEUP", FEEDBACK_PATTERN_WAKEUP},
85         {"FEEDBACK_PATTERN_WAKEUP_ON_CALL", FEEDBACK_PATTERN_WAKEUP_ON_CALL},
86         {"FEEDBACK_PATTERN_SCHEDULE", FEEDBACK_PATTERN_SCHEDULE},
87         {"FEEDBACK_PATTERN_SCHEDULE_ON_CALL", FEEDBACK_PATTERN_SCHEDULE_ON_CALL},
88         {"FEEDBACK_PATTERN_TIMER", FEEDBACK_PATTERN_TIMER},
89         {"FEEDBACK_PATTERN_TIMER_ON_CALL", FEEDBACK_PATTERN_TIMER_ON_CALL},
90         {"FEEDBACK_PATTERN_GENERAL", FEEDBACK_PATTERN_GENERAL},
91         {"FEEDBACK_PATTERN_GENERAL_ON_CALL", FEEDBACK_PATTERN_GENERAL_ON_CALL},
92
93         {"FEEDBACK_PATTERN_POWERON", FEEDBACK_PATTERN_POWERON},
94         {"FEEDBACK_PATTERN_POWEROFF", FEEDBACK_PATTERN_POWEROFF},
95         {"FEEDBACK_PATTERN_CHARGERCONN", FEEDBACK_PATTERN_CHARGERCONN},
96         {"FEEDBACK_PATTERN_CHARGERCONN_ON_CALL", FEEDBACK_PATTERN_CHARGERCONN_ON_CALL},
97         {"FEEDBACK_PATTERN_CHARGING_ERROR", FEEDBACK_PATTERN_CHARGING_ERROR},
98         {"FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL", FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL},
99         {"FEEDBACK_PATTERN_FULLCHARGED", FEEDBACK_PATTERN_FULLCHARGED},
100         {"FEEDBACK_PATTERN_FULLCHARGED_ON_CALL", FEEDBACK_PATTERN_FULLCHARGED_ON_CALL},
101         {"FEEDBACK_PATTERN_LOWBATT", FEEDBACK_PATTERN_LOWBATT},
102         {"FEEDBACK_PATTERN_LOWBATT_ON_CALL", FEEDBACK_PATTERN_LOWBATT_ON_CALL},
103         {"FEEDBACK_PATTERN_LOCK", FEEDBACK_PATTERN_LOCK},
104         {"FEEDBACK_PATTERN_UNLOCK", FEEDBACK_PATTERN_UNLOCK},
105
106         {"FEEDBACK_PATTERN_OUTGOING_CALL", FEEDBACK_PATTERN_OUTGOING_CALL},
107
108         {"FEEDBACK_PATTERN_VIBRATION_ON", FEEDBACK_PATTERN_VIBRATION_ON},
109         {"FEEDBACK_PATTERN_SILENT_OFF", FEEDBACK_PATTERN_SILENT_OFF},
110         {"FEEDBACK_PATTERN_BT_CONNECTED", FEEDBACK_PATTERN_BT_CONNECTED},
111         {"FEEDBACK_PATTERN_BT_DISCONNECTED", FEEDBACK_PATTERN_BT_DISCONNECTED},
112
113         {"FEEDBACK_PATTERN_SCREEN_CAPTURE", FEEDBACK_PATTERN_SCREEN_CAPTURE},
114         {"FEEDBACK_PATTERN_LIST_REORDER", FEEDBACK_PATTERN_LIST_REORDER},
115         {"FEEDBACK_PATTERN_LIST_SLIDER", FEEDBACK_PATTERN_LIST_SLIDER},
116         {"FEEDBACK_PATTERN_VOLUME_KEY", FEEDBACK_PATTERN_VOLUME_KEY},
117
118         {"FEEDBACK_PATTERN_SEND_SOS_MESSAGE", FEEDBACK_PATTERN_SEND_SOS_MESSAGE},
119         {"FEEDBACK_PATTERN_SYSTEM_SHORT", FEEDBACK_PATTERN_SYSTEM_SHORT},
120         {"FEEDBACK_PATTERN_SYSTEM_ERROR", FEEDBACK_PATTERN_SYSTEM_ERROR},
121         {"FEEDBACK_PATTERN_SYSTEM_LONG", FEEDBACK_PATTERN_SYSTEM_LONG},
122         {"FEEDBACK_PATTERN_SYSTEM_MID", FEEDBACK_PATTERN_SYSTEM_MID},
123         {"FEEDBACK_PATTERN_RINGER", FEEDBACK_PATTERN_RINGER},
124         {"FEEDBACK_PATTERN_NOTIFICATION", FEEDBACK_PATTERN_NOTIFICATION},
125
126         {"FEEDBACK_PATTERN_SIP_BACKSPACE", FEEDBACK_PATTERN_SIP_BACKSPACE},
127         {"FEEDBACK_PATTERN_SIP_FUNCTION", FEEDBACK_PATTERN_SIP_FUNCTION},
128         {"FEEDBACK_PATTERN_SIP_FJKEY", FEEDBACK_PATTERN_SIP_FJKEY},
129         {"FEEDBACK_PATTERN_MAX_CHARACTER", FEEDBACK_PATTERN_MAX_CHARACTER},
130         {"FEEDBACK_PATTERN_MULTI_TAP", FEEDBACK_PATTERN_MULTI_TAP},
131         {"FEEDBACK_PATTERN_HW_TAP", FEEDBACK_PATTERN_HW_TAP},
132         {"FEEDBACK_PATTERN_HW_HOLD", FEEDBACK_PATTERN_HW_HOLD},
133         {"FEEDBACK_PATTERN_SMART_ALERT", FEEDBACK_PATTERN_SMART_ALERT},
134         {"FEEDBACK_PATTERN_GEOMETRIC_LOCK", FEEDBACK_PATTERN_GEOMETRIC_LOCK},
135         {"FEEDBACK_PATTERN_CALLCONNECT", FEEDBACK_PATTERN_CALLCONNECT},
136         {"FEEDBACK_PATTERN_DISCALLCONNECT", FEEDBACK_PATTERN_DISCALLCONNECT},
137         {"FEEDBACK_PATTERN_MINUTEMINDER", FEEDBACK_PATTERN_MINUTEMINDER},
138         {"FEEDBACK_PATTERN_BT_PAIRING", FEEDBACK_PATTERN_BT_PAIRING},
139         {"FEEDBACK_PATTERN_BT_WAITING", FEEDBACK_PATTERN_BT_WAITING},
140         {"FEEDBACK_PATTERN_MMS", FEEDBACK_PATTERN_MMS},
141         {"FEEDBACK_PATTERN_HOURLY_ALERT", FEEDBACK_PATTERN_HOURLY_ALERT},
142         {"FEEDBACK_PATTERN_SAFETY_ALERT", FEEDBACK_PATTERN_SAFETY_ALERT},
143         {"FEEDBACK_PATTERN_ACCIDENT_DETECT", FEEDBACK_PATTERN_ACCIDENT_DETECT},
144         {"FEEDBACK_PATTERN_END_SOS_MESSAGE", FEEDBACK_PATTERN_END_SOS_MESSAGE},
145         {"FEEDBACK_PATTERN_EMERGENCY_BUZZER", FEEDBACK_PATTERN_EMERGENCY_BUZZER},
146         {"FEEDBACK_PATTERN_SAFETY_LOW_POWER", FEEDBACK_PATTERN_SAFETY_LOW_POWER},
147         {"FEEDBACK_PATTERN_CMAS", FEEDBACK_PATTERN_CMAS},
148         {"FEEDBACK_PATTERN_CMAS_CA", FEEDBACK_PATTERN_CMAS_CA},
149         {"FEEDBACK_PATTERN_INFO", FEEDBACK_PATTERN_INFO},
150         {"FEEDBACK_PATTERN_WARNING", FEEDBACK_PATTERN_WARNING},
151         {"FEEDBACK_PATTERN_ERROR", FEEDBACK_PATTERN_ERROR},
152         {"FEEDBACK_PATTERN_EMERGENCY", FEEDBACK_PATTERN_EMERGENCY},
153         {"FEEDBACK_PATTERN_INTERNAL_WAKEUP", FEEDBACK_PATTERN_INTERNAL_WAKEUP},
154         {"FEEDBACK_PATTERN_INTERNAL_TIMER", FEEDBACK_PATTERN_INTERNAL_TIMER},
155         {"FEEDBACK_PATTERN_TEMPERATURE_WARNING", FEEDBACK_PATTERN_TEMPERATURE_WARNING},
156         {"FEEDBACK_PATTERN_COOLDOWN_WARNING_1", FEEDBACK_PATTERN_COOLDOWN_WARNING_1},
157         {"FEEDBACK_PATTERN_COOLDOWN_WARNING_2", FEEDBACK_PATTERN_COOLDOWN_WARNING_2},
158 };
159
160 static const struct pattern_field wearable_str_pattern[] = {
161         {"FEEDBACK_PATTERN_TAP", FEEDBACK_PATTERN_TAP},
162         {"FEEDBACK_PATTERN_SIP", FEEDBACK_PATTERN_SIP},
163
164         {"FEEDBACK_PATTERN_KEY0", FEEDBACK_PATTERN_KEY0},
165         {"FEEDBACK_PATTERN_KEY1", FEEDBACK_PATTERN_KEY1},
166         {"FEEDBACK_PATTERN_KEY2", FEEDBACK_PATTERN_KEY2},
167         {"FEEDBACK_PATTERN_KEY3", FEEDBACK_PATTERN_KEY3},
168         {"FEEDBACK_PATTERN_KEY4", FEEDBACK_PATTERN_KEY4},
169         {"FEEDBACK_PATTERN_KEY5", FEEDBACK_PATTERN_KEY5},
170         {"FEEDBACK_PATTERN_KEY6", FEEDBACK_PATTERN_KEY6},
171         {"FEEDBACK_PATTERN_KEY7", FEEDBACK_PATTERN_KEY7},
172         {"FEEDBACK_PATTERN_KEY8", FEEDBACK_PATTERN_KEY8},
173         {"FEEDBACK_PATTERN_KEY9", FEEDBACK_PATTERN_KEY9},
174         {"FEEDBACK_PATTERN_KEY_STAR", FEEDBACK_PATTERN_KEY_STAR},
175         {"FEEDBACK_PATTERN_KEY_SHARP", FEEDBACK_PATTERN_KEY_SHARP},
176         {"FEEDBACK_PATTERN_KEY_BACK", FEEDBACK_PATTERN_KEY_BACK},
177         {"FEEDBACK_PATTERN_HOLD", FEEDBACK_PATTERN_HOLD},
178
179         {"FEEDBACK_PATTERN_HW_TAP", FEEDBACK_PATTERN_HW_TAP},
180         {"FEEDBACK_PATTERN_HW_HOLD", FEEDBACK_PATTERN_HW_HOLD},
181
182         {"FEEDBACK_PATTERN_MESSAGE", FEEDBACK_PATTERN_MESSAGE},
183         {"FEEDBACK_PATTERN_MESSAGE_ON_CALL", FEEDBACK_PATTERN_MESSAGE_ON_CALL},
184         {"FEEDBACK_PATTERN_EMAIL", FEEDBACK_PATTERN_EMAIL},
185         {"FEEDBACK_PATTERN_EMAIL_ON_CALL", FEEDBACK_PATTERN_EMAIL_ON_CALL},
186         {"FEEDBACK_PATTERN_WAKEUP", FEEDBACK_PATTERN_WAKEUP},
187         {"FEEDBACK_PATTERN_WAKEUP_ON_CALL", FEEDBACK_PATTERN_WAKEUP_ON_CALL},
188         {"FEEDBACK_PATTERN_SCHEDULE", FEEDBACK_PATTERN_SCHEDULE},
189         {"FEEDBACK_PATTERN_SCHEDULE_ON_CALL", FEEDBACK_PATTERN_SCHEDULE_ON_CALL},
190         {"FEEDBACK_PATTERN_TIMER", FEEDBACK_PATTERN_TIMER},
191         {"FEEDBACK_PATTERN_TIMER_ON_CALL", FEEDBACK_PATTERN_TIMER_ON_CALL},
192         {"FEEDBACK_PATTERN_GENERAL", FEEDBACK_PATTERN_GENERAL},
193         {"FEEDBACK_PATTERN_GENERAL_ON_CALL", FEEDBACK_PATTERN_GENERAL_ON_CALL},
194
195         {"FEEDBACK_PATTERN_POWERON", FEEDBACK_PATTERN_POWERON},
196         {"FEEDBACK_PATTERN_POWEROFF", FEEDBACK_PATTERN_POWEROFF},
197         {"FEEDBACK_PATTERN_CHARGERCONN", FEEDBACK_PATTERN_CHARGERCONN},
198         {"FEEDBACK_PATTERN_CHARGERCONN_ON_CALL", FEEDBACK_PATTERN_CHARGERCONN_ON_CALL},
199         {"FEEDBACK_PATTERN_CHARGING_ERROR", FEEDBACK_PATTERN_CHARGING_ERROR},
200         {"FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL", FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL},
201         {"FEEDBACK_PATTERN_FULLCHARGED", FEEDBACK_PATTERN_FULLCHARGED},
202         {"FEEDBACK_PATTERN_FULLCHARGED_ON_CALL", FEEDBACK_PATTERN_FULLCHARGED_ON_CALL},
203         {"FEEDBACK_PATTERN_LOWBATT", FEEDBACK_PATTERN_LOWBATT},
204         {"FEEDBACK_PATTERN_LOWBATT_ON_CALL", FEEDBACK_PATTERN_LOWBATT_ON_CALL},
205         {"FEEDBACK_PATTERN_LOCK", FEEDBACK_PATTERN_LOCK},
206         {"FEEDBACK_PATTERN_UNLOCK", FEEDBACK_PATTERN_UNLOCK},
207
208         {"FEEDBACK_PATTERN_VIBRATION_ON", FEEDBACK_PATTERN_VIBRATION_ON},
209         {"FEEDBACK_PATTERN_SILENT_OFF", FEEDBACK_PATTERN_SILENT_OFF},
210         {"FEEDBACK_PATTERN_BT_CONNECTED", FEEDBACK_PATTERN_BT_CONNECTED},
211         {"FEEDBACK_PATTERN_BT_DISCONNECTED", FEEDBACK_PATTERN_BT_DISCONNECTED},
212
213         {"FEEDBACK_PATTERN_SCREEN_CAPTURE", FEEDBACK_PATTERN_SCREEN_CAPTURE},
214         {"FEEDBACK_PATTERN_LIST_REORDER", FEEDBACK_PATTERN_LIST_REORDER},
215         {"FEEDBACK_PATTERN_LIST_SLIDER", FEEDBACK_PATTERN_LIST_SLIDER},
216         {"FEEDBACK_PATTERN_VOLUME_KEY", FEEDBACK_PATTERN_VOLUME_KEY},
217
218         {"FEEDBACK_PATTERN_SEND_SOS_MESSAGE", FEEDBACK_PATTERN_SEND_SOS_MESSAGE},
219         {"FEEDBACK_PATTERN_SYSTEM_SHORT", FEEDBACK_PATTERN_SYSTEM_SHORT},
220         {"FEEDBACK_PATTERN_SYSTEM_ERROR", FEEDBACK_PATTERN_SYSTEM_ERROR},
221         {"FEEDBACK_PATTERN_SYSTEM_LONG", FEEDBACK_PATTERN_SYSTEM_LONG},
222         {"FEEDBACK_PATTERN_SYSTEM_MID", FEEDBACK_PATTERN_SYSTEM_MID},
223         {"FEEDBACK_PATTERN_RINGER", FEEDBACK_PATTERN_RINGER},
224         {"FEEDBACK_PATTERN_NOTIFICATION", FEEDBACK_PATTERN_NOTIFICATION},
225
226         {"FEEDBACK_PATTERN_SIP_BACKSPACE", FEEDBACK_PATTERN_SIP_BACKSPACE},
227         {"FEEDBACK_PATTERN_SIP_FUNCTION", FEEDBACK_PATTERN_SIP_FUNCTION},
228         {"FEEDBACK_PATTERN_SIP_FJKEY", FEEDBACK_PATTERN_SIP_FJKEY},
229         {"FEEDBACK_PATTERN_MAX_CHARACTER", FEEDBACK_PATTERN_MAX_CHARACTER},
230         {"FEEDBACK_PATTERN_MULTI_TAP", FEEDBACK_PATTERN_MULTI_TAP},
231         {"FEEDBACK_PATTERN_HW_TAP", FEEDBACK_PATTERN_HW_TAP},
232         {"FEEDBACK_PATTERN_HW_HOLD", FEEDBACK_PATTERN_HW_HOLD},
233         {"FEEDBACK_PATTERN_SMART_ALERT", FEEDBACK_PATTERN_SMART_ALERT},
234         {"FEEDBACK_PATTERN_GEOMETRIC_LOCK", FEEDBACK_PATTERN_GEOMETRIC_LOCK},
235         {"FEEDBACK_PATTERN_CALLCONNECT", FEEDBACK_PATTERN_CALLCONNECT},
236         {"FEEDBACK_PATTERN_DISCALLCONNECT", FEEDBACK_PATTERN_DISCALLCONNECT},
237         {"FEEDBACK_PATTERN_MINUTEMINDER", FEEDBACK_PATTERN_MINUTEMINDER},
238         {"FEEDBACK_PATTERN_BT_PAIRING", FEEDBACK_PATTERN_BT_PAIRING},
239         {"FEEDBACK_PATTERN_BT_WAITING", FEEDBACK_PATTERN_BT_WAITING},
240
241         {"FEEDBACK_PATTERN_UV_PROCESSING", FEEDBACK_PATTERN_UV_PROCESSING},
242         {"FEEDBACK_PATTERN_SHEALTH_START", FEEDBACK_PATTERN_SHEALTH_START},
243         {"FEEDBACK_PATTERN_SHEALTH_PAUSE", FEEDBACK_PATTERN_SHEALTH_PAUSE},
244         {"FEEDBACK_PATTERN_SHEALTH_STOP", FEEDBACK_PATTERN_SHEALTH_STOP},
245         {"FEEDBACK_PATTERN_BREATHING_EXHALE", FEEDBACK_PATTERN_BREATHING_EXHALE},
246         {"FEEDBACK_PATTERN_3RD_APPLICATION", FEEDBACK_PATTERN_3RD_APPLICATION},
247         {"FEEDBACK_PATTERN_TICK", FEEDBACK_PATTERN_TICK},
248         {"FEEDBACK_PATTERN_TRANSITION_CIRCULAR", FEEDBACK_PATTERN_TRANSITION_CIRCULAR},
249         {"FEEDBACK_PATTERN_TRANSITION_POP", FEEDBACK_PATTERN_TRANSITION_POP},
250         {"FEEDBACK_PATTERN_PROCESS", FEEDBACK_PATTERN_PROCESS},
251         {"FEEDBACK_PATTERN_MOVE_LIST", FEEDBACK_PATTERN_MOVE_LIST},
252         {"FEEDBACK_PATTERN_DISMISS", FEEDBACK_PATTERN_DISMISS},
253         {"FEEDBACK_PATTERN_CLOCK_SECOND_HAND", FEEDBACK_PATTERN_CLOCK_SECOND_HAND},
254
255         {"FEEDBACK_PATTERN_SPIRAL_DOWN",FEEDBACK_PATTERN_SPIRAL_DOWN},
256         {"FEEDBACK_PATTERN_MOVE_LIST_2",FEEDBACK_PATTERN_MOVE_LIST_2},
257         {"FEEDBACK_PATTERN_SPIRAL_UP",FEEDBACK_PATTERN_SPIRAL_UP},
258
259         {"FEEDBACK_PATTERN_SILENCE",FEEDBACK_PATTERN_SILENCE},
260         {"FEEDBACK_PATTERN_INACTIVE_TENSION",FEEDBACK_PATTERN_INACTIVE_TENSION},
261         {"FEEDBACK_PATTERN_INACTIVE_FINE", FEEDBACK_PATTERN_INACTIVE_FINE},
262
263         {"FEEDBACK_PATTERN_END_EFFECT", FEEDBACK_PATTERN_END_EFFECT},
264         {"FEEDBACK_PATTERN_SHEALTH_NOTICE", FEEDBACK_PATTERN_SHEALTH_NOTICE},
265         {"FEEDBACK_PATTERN_SHEALTH_GENTLE_ALERT", FEEDBACK_PATTERN_SHEALTH_GENTLE_ALERT},
266         {"FEEDBACK_PATTERN_END_EFFECT_FINE", FEEDBACK_PATTERN_END_EFFECT_FINE},
267         {"FEEDBACK_PATTERN_CLICK_VALUE", FEEDBACK_PATTERN_CLICK_VALUE},
268         {"FEEDBACK_PATTERN_CLICK_FINE_TRAIN_1", FEEDBACK_PATTERN_CLICK_FINE_TRAIN_1},
269         {"FEEDBACK_PATTERN_CLICK_FINE", FEEDBACK_PATTERN_CLICK_FINE},
270         {"FEEDBACK_PATTERN_CLICK_SLIDER", FEEDBACK_PATTERN_CLICK_SLIDER},
271         {"FEEDBACK_PATTERN_CLICK_MEDIUM", FEEDBACK_PATTERN_CLICK_MEDIUM},
272         {"FEEDBACK_PATTERN_CLICK_STRONG", FEEDBACK_PATTERN_CLICK_STRONG},
273         {"FEEDBACK_PATTERN_TURN_RIGHT", FEEDBACK_PATTERN_TURN_RIGHT},
274         {"FEEDBACK_PATTERN_TURN_LEFT", FEEDBACK_PATTERN_TURN_LEFT},
275         {"FEEDBACK_PATTERN_FUNCTION", FEEDBACK_PATTERN_FUNCTION},
276         {"FEEDBACK_PATTERN_VOICE_START", FEEDBACK_PATTERN_VOICE_START},
277         {"FEEDBACK_PATTERN_VOICE_STOP", FEEDBACK_PATTERN_VOICE_STOP},
278         {"FEEDBACK_PATTERN_COMMUNICATION", FEEDBACK_PATTERN_COMMUNICATION},
279         {"FEEDBACK_PATTERN_MESSAGE_STRONG_BUZZ", FEEDBACK_PATTERN_MESSAGE_STRONG_BUZZ},
280         {"FEEDBACK_PATTERN_EMAIL_STRONG_BUZZ", FEEDBACK_PATTERN_EMAIL_STRONG_BUZZ},
281
282         {"FEEDBACK_PATTERN_GENERAL_STRONG_BUZZ", FEEDBACK_PATTERN_GENERAL_STRONG_BUZZ},
283         {"FEEDBACK_PATTERN_COMMUNICATION_STRONG_BUZZ", FEEDBACK_PATTERN_COMMUNICATION_STRONG_BUZZ},
284         {"FEEDBACK_PATTERN_SCHEDULE_STRONG_BUZZ", FEEDBACK_PATTERN_SCHEDULE_STRONG_BUZZ},
285         {"FEEDBACK_PATTERN_WAKEUP_STRONG_BUZZ", FEEDBACK_PATTERN_WAKEUP_STRONG_BUZZ},
286         {"FEEDBACK_PATTERN_TIMER_STRONG_BUZZ", FEEDBACK_PATTERN_TIMER_STRONG_BUZZ},
287         {"FEEDBACK_PATTERN_RINGER_STRONG_BUZZ", FEEDBACK_PATTERN_RINGER_STRONG_BUZZ},
288         {"FEEDBACK_PATTERN_HEARTBEAT", FEEDBACK_PATTERN_HEARTBEAT},
289         {"FEEDBACK_PATTERN_HEARTBEAT_FAST", FEEDBACK_PATTERN_HEARTBEAT_FAST},
290         {"FEEDBACK_PATTERN_SETTING_ON", FEEDBACK_PATTERN_SETTING_ON},
291         {"FEEDBACK_PATTERN_SETTING_OFF", FEEDBACK_PATTERN_SETTING_OFF},
292         {"FEEDBACK_PATTERN_CONNECT", FEEDBACK_PATTERN_CONNECT},
293         {"FEEDBACK_PATTERN_DISCONNECT", FEEDBACK_PATTERN_DISCONNECT},
294         {"FEEDBACK_PATTERN_FIND_MY_GEAR", FEEDBACK_PATTERN_FIND_MY_GEAR},
295         {"FEEDBACK_PATTERN_NOTIFICATION_1", FEEDBACK_PATTERN_NOTIFICATION_1},
296         {"FEEDBACK_PATTERN_NOTIFICATION_1_STRONG_BUZZ", FEEDBACK_PATTERN_NOTIFICATION_1_STRONG_BUZZ},
297         {"FEEDBACK_PATTERN_NOTIFICATION_2", FEEDBACK_PATTERN_NOTIFICATION_2},
298         {"FEEDBACK_PATTERN_NOTIFICATION_2_STRONG_BUZZ", FEEDBACK_PATTERN_NOTIFICATION_2_STRONG_BUZZ},
299         {"FEEDBACK_PATTERN_NOTIFICATION_3", FEEDBACK_PATTERN_NOTIFICATION_3},
300         {"FEEDBACK_PATTERN_NOTIFICATION_3_STRONG_BUZZ", FEEDBACK_PATTERN_NOTIFICATION_3_STRONG_BUZZ},
301         {"FEEDBACK_PATTERN_NOTIFICATION_4", FEEDBACK_PATTERN_NOTIFICATION_4},
302         {"FEEDBACK_PATTERN_NOTIFICATION_4_STRONG_BUZZ", FEEDBACK_PATTERN_NOTIFICATION_4_STRONG_BUZZ},
303         {"FEEDBACK_PATTERN_NOTIFICATION_5", FEEDBACK_PATTERN_NOTIFICATION_5},
304         {"FEEDBACK_PATTERN_NOTIFICATION_5_STRONG_BUZZ", FEEDBACK_PATTERN_NOTIFICATION_5_STRONG_BUZZ},
305         {"FEEDBACK_PATTERN_NOTIFICATION_6", FEEDBACK_PATTERN_NOTIFICATION_6},
306         {"FEEDBACK_PATTERN_NOTIFICATION_6_STRONG_BUZZ", FEEDBACK_PATTERN_NOTIFICATION_6_STRONG_BUZZ},
307         {"FEEDBACK_PATTERN_NOTIFICATION_7", FEEDBACK_PATTERN_NOTIFICATION_7},
308         {"FEEDBACK_PATTERN_NOTIFICATION_7_STRONG_BUZZ", FEEDBACK_PATTERN_NOTIFICATION_7_STRONG_BUZZ},
309         {"FEEDBACK_PATTERN_NOTIFICATION_8", FEEDBACK_PATTERN_NOTIFICATION_8}, /* Added pattern for notification */
310         {"FEEDBACK_PATTERN_NOTIFICATION_8_STRONG_BUZZ", FEEDBACK_PATTERN_NOTIFICATION_8_STRONG_BUZZ}, /* Added pattern for notification */
311         {"FEEDBACK_PATTERN_NOTIFICATION_9", FEEDBACK_PATTERN_NOTIFICATION_9}, /* Added pattern for notification */
312         {"FEEDBACK_PATTERN_NOTIFICATION_9_STRONG_BUZZ", FEEDBACK_PATTERN_NOTIFICATION_9_STRONG_BUZZ}, /* Added pattern for notification */
313         {"FEEDBACK_PATTERN_NOTIFICATION_10", FEEDBACK_PATTERN_NOTIFICATION_10}, /* Added pattern for notification */
314         {"FEEDBACK_PATTERN_NOTIFICATION_10_STRONG_BUZZ", FEEDBACK_PATTERN_NOTIFICATION_10_STRONG_BUZZ}, /* Added pattern for notification */
315
316         {"FEEDBACK_PATTERN_RING_1", FEEDBACK_PATTERN_RING_1},
317         {"FEEDBACK_PATTERN_RING_1_STRONG_BUZZ", FEEDBACK_PATTERN_RING_1_STRONG_BUZZ},
318         {"FEEDBACK_PATTERN_RING_2", FEEDBACK_PATTERN_RING_2},
319         {"FEEDBACK_PATTERN_RING_2_STRONG_BUZZ", FEEDBACK_PATTERN_RING_2_STRONG_BUZZ},
320         {"FEEDBACK_PATTERN_RING_3", FEEDBACK_PATTERN_RING_3},
321         {"FEEDBACK_PATTERN_RING_3_STRONG_BUZZ", FEEDBACK_PATTERN_RING_3_STRONG_BUZZ},
322         {"FEEDBACK_PATTERN_RING_4", FEEDBACK_PATTERN_RING_4},
323         {"FEEDBACK_PATTERN_RING_4_STRONG_BUZZ", FEEDBACK_PATTERN_RING_4_STRONG_BUZZ},
324         {"FEEDBACK_PATTERN_RING_5", FEEDBACK_PATTERN_RING_5},
325         {"FEEDBACK_PATTERN_RING_5_STRONG_BUZZ", FEEDBACK_PATTERN_RING_5_STRONG_BUZZ},
326         {"FEEDBACK_PATTERN_RING_6", FEEDBACK_PATTERN_RING_6},
327         {"FEEDBACK_PATTERN_RING_6_STRONG_BUZZ", FEEDBACK_PATTERN_RING_6_STRONG_BUZZ},
328         {"FEEDBACK_PATTERN_RING_7", FEEDBACK_PATTERN_RING_7},
329         {"FEEDBACK_PATTERN_RING_7_STRONG_BUZZ", FEEDBACK_PATTERN_RING_7_STRONG_BUZZ},
330         {"FEEDBACK_PATTERN_RING_8", FEEDBACK_PATTERN_RING_8}, /* Added pattern for ring */
331         {"FEEDBACK_PATTERN_RING_8_STRONG_BUZZ", FEEDBACK_PATTERN_RING_8_STRONG_BUZZ}, /* Added pattern for ring */
332         {"FEEDBACK_PATTERN_RING_9", FEEDBACK_PATTERN_RING_9}, /* Added pattern for ring */
333         {"FEEDBACK_PATTERN_RING_9_STRONG_BUZZ", FEEDBACK_PATTERN_RING_9_STRONG_BUZZ}, /* Added pattern for ring */
334         {"FEEDBACK_PATTERN_RING_10", FEEDBACK_PATTERN_RING_10}, /* Added pattern for ring */
335         {"FEEDBACK_PATTERN_RING_10_STRONG_BUZZ", FEEDBACK_PATTERN_RING_10_STRONG_BUZZ}, /* Added pattern for ring */
336         {"FEEDBACK_PATTERN_ALARM_1", FEEDBACK_PATTERN_ALARM_1},
337         {"FEEDBACK_PATTERN_ALARM_1_STRONG_BUZZ", FEEDBACK_PATTERN_ALARM_1_STRONG_BUZZ},
338         {"FEEDBACK_PATTERN_ALARM_2", FEEDBACK_PATTERN_ALARM_2},
339         {"FEEDBACK_PATTERN_ALARM_2_STRONG_BUZZ", FEEDBACK_PATTERN_ALARM_2_STRONG_BUZZ},
340         {"FEEDBACK_PATTERN_ALARM_3", FEEDBACK_PATTERN_ALARM_3},
341         {"FEEDBACK_PATTERN_ALARM_3_STRONG_BUZZ", FEEDBACK_PATTERN_ALARM_3_STRONG_BUZZ},
342         {"FEEDBACK_PATTERN_ALARM_4", FEEDBACK_PATTERN_ALARM_4},
343         {"FEEDBACK_PATTERN_ALARM_4_STRONG_BUZZ", FEEDBACK_PATTERN_ALARM_4_STRONG_BUZZ},
344         {"FEEDBACK_PATTERN_ALARM_5", FEEDBACK_PATTERN_ALARM_5},
345         {"FEEDBACK_PATTERN_ALARM_5_STRONG_BUZZ", FEEDBACK_PATTERN_ALARM_5_STRONG_BUZZ},
346         {"FEEDBACK_PATTERN_ALARM_6", FEEDBACK_PATTERN_ALARM_6},
347         {"FEEDBACK_PATTERN_ALARM_6_STRONG_BUZZ", FEEDBACK_PATTERN_ALARM_6_STRONG_BUZZ},
348         {"FEEDBACK_PATTERN_ALARM_7", FEEDBACK_PATTERN_ALARM_7},
349         {"FEEDBACK_PATTERN_ALARM_7_STRONG_BUZZ", FEEDBACK_PATTERN_ALARM_7_STRONG_BUZZ},
350         {"FEEDBACK_PATTERN_ALARM_8", FEEDBACK_PATTERN_ALARM_8}, /* Added pattern for alarm */
351         {"FEEDBACK_PATTERN_ALARM_8_STRONG_BUZZ", FEEDBACK_PATTERN_ALARM_8_STRONG_BUZZ}, /* Added pattern for alarm */
352         {"FEEDBACK_PATTERN_ALARM_9", FEEDBACK_PATTERN_ALARM_9}, /* Added pattern for alarm */
353         {"FEEDBACK_PATTERN_ALARM_9_STRONG_BUZZ", FEEDBACK_PATTERN_ALARM_9_STRONG_BUZZ}, /* Added pattern for alarm */
354         {"FEEDBACK_PATTERN_ALARM_10", FEEDBACK_PATTERN_ALARM_10}, /* Added pattern for alarm */
355         {"FEEDBACK_PATTERN_ALARM_10_STRONG_BUZZ", FEEDBACK_PATTERN_ALARM_10_STRONG_BUZZ}, /* Added pattern for alarm */
356         {"FEEDBACK_PATTERN_PICKER", FEEDBACK_PATTERN_PICKER},
357         {"FEEDBACK_PATTERN_PICKER_FINISH", FEEDBACK_PATTERN_PICKER_FINISH},
358         {"FEEDBACK_PATTERN_ON_OFF_SWITCH", FEEDBACK_PATTERN_ON_OFF_SWITCH},
359         {"FEEDBACK_PATTERN_REORDER", FEEDBACK_PATTERN_REORDER},
360         {"FEEDBACK_PATTERN_CURSOR_MOVE", FEEDBACK_PATTERN_CURSOR_MOVE},
361         {"FEEDBACK_PATTERN_MMS", FEEDBACK_PATTERN_MMS},
362         {"FEEDBACK_PATTERN_HOURLY_ALERT", FEEDBACK_PATTERN_HOURLY_ALERT},
363         {"FEEDBACK_PATTERN_SAFETY_ALERT", FEEDBACK_PATTERN_SAFETY_ALERT},
364         {"FEEDBACK_PATTERN_ACCIDENT_DETECT", FEEDBACK_PATTERN_ACCIDENT_DETECT},
365         {"FEEDBACK_PATTERN_END_SOS_MESSAGE", FEEDBACK_PATTERN_END_SOS_MESSAGE},
366         {"FEEDBACK_PATTERN_EMERGENCY_BUZZER", FEEDBACK_PATTERN_EMERGENCY_BUZZER},
367         {"FEEDBACK_PATTERN_SAFETY_LOW_POWER", FEEDBACK_PATTERN_SAFETY_LOW_POWER},
368         {"FEEDBACK_PATTERN_CMAS", FEEDBACK_PATTERN_CMAS},
369         {"FEEDBACK_PATTERN_CMAS_CA", FEEDBACK_PATTERN_CMAS_CA},
370         {"FEEDBACK_PATTERN_NOTIFICATION", FEEDBACK_PATTERN_NOTIFICATION},
371         {"FEEDBACK_PATTERN_INFO", FEEDBACK_PATTERN_INFO},
372         {"FEEDBACK_PATTERN_WARNING", FEEDBACK_PATTERN_WARNING},
373         {"FEEDBACK_PATTERN_ERROR", FEEDBACK_PATTERN_ERROR},
374         {"FEEDBACK_PATTERN_EMERGENCY", FEEDBACK_PATTERN_EMERGENCY},
375         {"FEEDBACK_PATTERN_INTERNAL_WAKEUP", FEEDBACK_PATTERN_INTERNAL_WAKEUP},
376         {"FEEDBACK_PATTERN_INTERNAL_TIMER", FEEDBACK_PATTERN_INTERNAL_TIMER},
377         {"FEEDBACK_PATTERN_TEMPERATURE_WARNING", FEEDBACK_PATTERN_TEMPERATURE_WARNING},
378         {"FEEDBACK_PATTERN_COOLDOWN_WARNING_1", FEEDBACK_PATTERN_COOLDOWN_WARNING_1},
379         {"FEEDBACK_PATTERN_COOLDOWN_WARNING_2", FEEDBACK_PATTERN_COOLDOWN_WARNING_2},
380         {"FEEDBACK_PATTERN_SPEED_UP", FEEDBACK_PATTERN_SPEED_UP},
381         {"FEEDBACK_PATTERN_SLOW_DOWN", FEEDBACK_PATTERN_SLOW_DOWN},
382         {"FEEDBACK_PATTERN_KEEP_THIS_PACE", FEEDBACK_PATTERN_KEEP_THIS_PACE},
383         {"FEEDBACK_PATTERN_GOAL_ACHIEVED", FEEDBACK_PATTERN_GOAL_ACHIEVED},
384         {"FEEDBACK_PATTERN_EXERCISE_COUNT", FEEDBACK_PATTERN_EXERCISE_COUNT},
385         {"FEEDBACK_PATTERN_START_CUE", FEEDBACK_PATTERN_START_CUE},
386         {"FEEDBACK_PATTERN_HEALTH_PACE", FEEDBACK_PATTERN_HEALTH_PACE},
387         {"FEEDBACK_PATTERN_INACTIVE_TIME", FEEDBACK_PATTERN_INACTIVE_TIME},
388         {"FEEDBACK_PATTERN_MEASURING_SUCCESS", FEEDBACK_PATTERN_MEASURING_SUCCESS},
389         {"FEEDBACK_PATTERN_MEASURING_FAILURE", FEEDBACK_PATTERN_MEASURING_FAILURE},
390         {"FEEDBACK_PATTERN_BOS", FEEDBACK_PATTERN_BOS},
391         {"FEEDBACK_PATTERN_EOS", FEEDBACK_PATTERN_EOS},
392         {"FEEDBACK_PATTERN_UDS", FEEDBACK_PATTERN_UDS},
393         {"FEEDBACK_PATTERN_NFC_SUCCESS", FEEDBACK_PATTERN_NFC_SUCCESS},
394         {"FEEDBACK_PATTERN_MEDITATION", FEEDBACK_PATTERN_MEDITATION},
395         {"FEEDBACK_PATTERN_MEDITATION_INTERVAL", FEEDBACK_PATTERN_MEDITATION_INTERVAL},
396         {"FEEDBACK_PATTERN_FALL_DETECTION_1", FEEDBACK_PATTERN_FALL_DETECTION_1},
397         {"FEEDBACK_PATTERN_FALL_DETECTION_2", FEEDBACK_PATTERN_FALL_DETECTION_2},
398         {"FEEDBACK_PATTERN_SMART_GESTURE",FEEDBACK_PATTERN_SMART_GESTURE},
399 };
400
401 static const struct pattern_field common_str_pattern[] = {
402         {"FEEDBACK_PATTERN_TAP", FEEDBACK_PATTERN_TAP},
403         {"FEEDBACK_PATTERN_SIP", FEEDBACK_PATTERN_SIP},
404
405         {"FEEDBACK_PATTERN_KEY0", FEEDBACK_PATTERN_KEY0},
406         {"FEEDBACK_PATTERN_KEY1", FEEDBACK_PATTERN_KEY1},
407         {"FEEDBACK_PATTERN_KEY2", FEEDBACK_PATTERN_KEY2},
408         {"FEEDBACK_PATTERN_KEY3", FEEDBACK_PATTERN_KEY3},
409         {"FEEDBACK_PATTERN_KEY4", FEEDBACK_PATTERN_KEY4},
410         {"FEEDBACK_PATTERN_KEY5", FEEDBACK_PATTERN_KEY5},
411         {"FEEDBACK_PATTERN_KEY6", FEEDBACK_PATTERN_KEY6},
412         {"FEEDBACK_PATTERN_KEY7", FEEDBACK_PATTERN_KEY7},
413         {"FEEDBACK_PATTERN_KEY8", FEEDBACK_PATTERN_KEY8},
414         {"FEEDBACK_PATTERN_KEY9", FEEDBACK_PATTERN_KEY9},
415         {"FEEDBACK_PATTERN_KEY_STAR", FEEDBACK_PATTERN_KEY_STAR},
416         {"FEEDBACK_PATTERN_KEY_SHARP", FEEDBACK_PATTERN_KEY_SHARP},
417         {"FEEDBACK_PATTERN_KEY_BACK", FEEDBACK_PATTERN_KEY_BACK},
418         {"FEEDBACK_PATTERN_HOLD", FEEDBACK_PATTERN_HOLD},
419
420         {"FEEDBACK_PATTERN_HW_TAP", FEEDBACK_PATTERN_HW_TAP},
421         {"FEEDBACK_PATTERN_HW_HOLD", FEEDBACK_PATTERN_HW_HOLD},
422
423         {"FEEDBACK_PATTERN_MESSAGE", FEEDBACK_PATTERN_MESSAGE},
424
425         {"FEEDBACK_PATTERN_EMAIL", FEEDBACK_PATTERN_EMAIL},
426
427         {"FEEDBACK_PATTERN_WAKEUP", FEEDBACK_PATTERN_WAKEUP},
428
429         {"FEEDBACK_PATTERN_SCHEDULE", FEEDBACK_PATTERN_SCHEDULE},
430
431         {"FEEDBACK_PATTERN_TIMER", FEEDBACK_PATTERN_TIMER},
432
433         {"FEEDBACK_PATTERN_GENERAL", FEEDBACK_PATTERN_GENERAL},
434
435         {"FEEDBACK_PATTERN_POWERON", FEEDBACK_PATTERN_POWERON},
436         {"FEEDBACK_PATTERN_POWEROFF", FEEDBACK_PATTERN_POWEROFF},
437         {"FEEDBACK_PATTERN_CHARGERCONN", FEEDBACK_PATTERN_CHARGERCONN},
438
439         {"FEEDBACK_PATTERN_CHARGING_ERROR", FEEDBACK_PATTERN_CHARGING_ERROR},
440
441         {"FEEDBACK_PATTERN_FULLCHARGED", FEEDBACK_PATTERN_FULLCHARGED},
442
443         {"FEEDBACK_PATTERN_LOWBATT", FEEDBACK_PATTERN_LOWBATT},
444
445         {"FEEDBACK_PATTERN_LOCK", FEEDBACK_PATTERN_LOCK},
446         {"FEEDBACK_PATTERN_UNLOCK", FEEDBACK_PATTERN_UNLOCK},
447
448         {"FEEDBACK_PATTERN_VIBRATION_ON", FEEDBACK_PATTERN_VIBRATION_ON},
449         {"FEEDBACK_PATTERN_SILENT_OFF", FEEDBACK_PATTERN_SILENT_OFF},
450         {"FEEDBACK_PATTERN_BT_CONNECTED", FEEDBACK_PATTERN_BT_CONNECTED},
451         {"FEEDBACK_PATTERN_BT_DISCONNECTED", FEEDBACK_PATTERN_BT_DISCONNECTED},
452
453         {"FEEDBACK_PATTERN_LIST_REORDER", FEEDBACK_PATTERN_LIST_REORDER},
454         {"FEEDBACK_PATTERN_LIST_SLIDER", FEEDBACK_PATTERN_LIST_SLIDER},
455         {"FEEDBACK_PATTERN_VOLUME_KEY", FEEDBACK_PATTERN_VOLUME_KEY},
456 };
457
458 typedef enum {
459         FEEDBACK_STANDARD_START = 2000,
460         A,
461         A_W = A,
462         A_W2,
463         B,
464         B_W = B,
465         C,
466         D,
467         E_W1 = D,
468         E,
469         E_W2 = E,
470         F,
471         F_W = F,
472         G,
473         G_W = G,
474         H,
475         H_LIGHT,
476         I,
477         J_W = I,
478         J,
479         J_WB = J,
480         K,
481         K_W = K,
482         L,
483         K_WB = L,
484         CMAS,
485         M,
486         J_W_2 = M,
487         J_WB_2,
488         J_W_3,
489         J_WB_3,
490         J_W_4,
491         J_WB_4,
492         J_W_5,
493         J_WB_5,
494         J_W_6,
495         J_WB_6,
496         J_W_7,
497         J_WB_7,
498         J_W_8,
499         J_WB_8,
500         J_W_9,
501         J_WB_9,
502         J_W_10,
503         J_WB_10,
504         K_W_2,
505         K_WB_2,
506         K_W_3,
507         K_WB_3,
508         K_W_4,
509         K_WB_4,
510         K_W_5,
511         K_WB_5,
512         K_W_6,
513         K_WB_6,
514         K_W_7,
515         K_WB_7,
516         K_W_8,
517         K_WB_8,
518         K_W_9,
519         K_WB_9,
520         K_W_10,
521         K_WB_10,
522         J_WW,
523         K_WW,
524         G_WB,
525         J_WH,
526         J_WHB,
527         K_W_N,
528         M1,
529         M2,
530         N,
531         O,
532         P,
533         Q,
534         R,
535         S,
536         S_B,
537         S2,
538         T,
539         T_LIGHT,
540         CMAS_CA,
541         FEEDBACK_STANDARD_END,
542 } feedback_standard_pattern_e;
543
544 static const struct pattern_field wearable_str_standard[] = {
545         {"A_W", A_W},
546         {"A_W2", A_W2},
547         {"B_W", B_W},
548         {"C", C},
549         {"E_W1", E_W1},
550         {"E_W2", E_W2},
551         {"F_W", F_W},
552         {"G_W", G_W},
553         {"H", H},
554         {"H_LIGHT", H_LIGHT},
555         {"J_W", J_W},
556         {"J_WB", J_WB},
557         {"K_W", K_W},
558         {"K_WB", K_WB},
559         {"CMAS", CMAS},
560         {"CMAS_CA", CMAS_CA},
561         {"J_W_2", J_W_2},
562         {"J_WB_2", J_WB_2},
563         {"J_W_3", J_W_3},
564         {"J_WB_3", J_WB_3},
565         {"J_W_4", J_W_4},
566         {"J_WB_4", J_WB_4},
567         {"J_W_5", J_W_5},
568         {"J_WB_5", J_WB_5},
569         {"J_W_6", J_W_6},
570         {"J_WB_6", J_WB_6},
571         {"J_W_7", J_W_7},
572         {"J_WB_7", J_WB_7},
573         {"J_W_8", J_W_8},
574         {"J_WB_8", J_WB_8},
575         {"J_W_9", J_W_9},
576         {"J_WB_9", J_WB_9},
577         {"J_W_10", J_W_10},
578         {"J_WB_10", J_WB_10},
579         {"K_W_2", K_W_2},
580         {"K_WB_2", K_WB_2},
581         {"K_W_3", K_W_3},
582         {"K_WB_3", K_WB_3},
583         {"K_W_4", K_W_4},
584         {"K_WB_4", K_WB_4},
585         {"K_W_5", K_W_5},
586         {"K_WB_5", K_WB_5},
587         {"K_W_6", K_W_6},
588         {"K_WB_6", K_WB_6},
589         {"K_W_7", K_W_7},
590         {"K_WB_7", K_WB_7},
591         {"K_W_8", K_W_8},
592         {"K_WB_8", K_WB_8},
593         {"K_W_9", K_W_9},
594         {"K_WB_9", K_WB_9},
595         {"K_W_10", K_W_10},
596         {"K_WB_10", K_WB_10},
597         {"J_WW", J_WW},
598         {"K_WW", K_WW},
599         {"G_WB", G_WB},
600         {"J_WH", J_WH},
601         {"J_WHB", J_WHB},
602         {"K_W_N", K_W_N},
603         {"T", T},
604         {"T_LIGHT", T_LIGHT},
605         {"M1", M1},
606         {"M2", M2},
607         {"N", N},
608         {"O", O},
609         {"P", P},
610         {"Q", Q},
611         {"R", R},
612         {"S", S},
613         {"S2", S2},
614         {"S_B", S_B},
615 };
616
617 static const struct pattern_field mobile_str_standard[] = {
618         {"A", A},
619         {"B", B},
620         {"C", C},
621         {"D", D},
622         {"E", E},
623         {"F", F},
624         {"G", G},
625         {"H", H},
626         {"I", I},
627         {"J", J},
628         {"K", K},
629         {"L", L},
630         {"M", M},
631         {"CMAS", CMAS},
632         {"CMAS_CA", CMAS_CA},
633 };
634
635 typedef enum {
636         PROFILE_NONE = -1,
637         PROFILE_MOBILE = 1,
638         PROFILE_WEARABLE = 2,
639         PROFILE_COMMON = 3,
640 } profile_e;
641
642 static int callstatus;
643 static int lock_sndstatus;
644 static int camerastatus;
645 static int shutter_sndstatus;
646 static int noti_vibstatus;
647 static int vib_level;
648 static int noti_level;
649 static int feedbackstatus;
650 static int vib_when_ring;
651 static int vib_noti_index;
652 static int vib_call_index;
653 static char snd_noti_path[PATH_MAX];
654 static char snd_call_path[PATH_MAX];
655 static char *profile_name = NULL;
656
657 static int dnd_mode;
658 static int theater_mode;
659 static int goodnight_mode;
660 static int disconnect_alert_mode;
661
662 #define PROFILE                 "tizen.org/feature/profile"
663 #define PROFILE_MOBILE_STRING   "mobile"
664 #define PROFILE_WEARABLE_STRING "wearable"
665 #define PROFILE_COMMON_STRING   "common"
666
667 static profile_e get_profile(void)
668 {
669         int ret_val;
670         int len;
671         char *profile = NULL;
672         static int set = 0;
673
674         if (set != 0)
675                 return set;
676
677         ret_val = system_info_get_platform_string(PROFILE, &profile);
678         if (ret_val < 0) {
679                 _E("Cannot get profile(%d)", ret_val); //LCOV_EXCL_LINE system error
680                 return PROFILE_NONE; //LCOV_EXCL_LINE
681         }
682
683         len = strlen(profile) + 1;
684         if (!strncmp(PROFILE_MOBILE_STRING, profile, len))
685                 set = PROFILE_MOBILE;
686 //LCOV_EXCL_START
687         else if (!strncmp(PROFILE_WEARABLE_STRING, profile, len))
688                 set = PROFILE_WEARABLE;
689         else
690                 set = PROFILE_COMMON;
691 //LCOV_EXCL_STOP
692
693         free(profile);
694         return set;
695 }
696
697 //LCOV_EXCL_START unused function
698 static char *profile_get_name()
699 {
700         int prof;
701
702         if (profile_name)
703                 return profile_name;
704
705         prof = get_profile();
706
707         if (prof == PROFILE_MOBILE)
708                 profile_name = PROFILE_MOBILE_STRING;
709         else if (prof == PROFILE_WEARABLE)
710                 profile_name = PROFILE_WEARABLE_STRING;
711         else
712                 profile_name = PROFILE_COMMON_STRING;
713
714         return profile_name;
715 }
716 //LCOV_EXCL_STOP
717
718 /* Return how many patterns profile supports */
719 static int profile_get_num_of_pattern()
720 {
721         int prof;
722
723         prof = get_profile();
724
725         if (prof == PROFILE_MOBILE)
726                 return ARR_SIZE(mobile_str_pattern);
727 //LCOV_EXCL_START
728         else if (prof == PROFILE_WEARABLE)
729                 return ARR_SIZE(wearable_str_pattern);
730         else
731                 return ARR_SIZE(common_str_pattern);
732 //LCOV_EXCL_STOP
733 }
734
735 static int profile_get_num_of_standard(void)
736 {
737         static int size = -1;
738         int prof;
739
740         if (size >= 0)
741                 return size;
742
743         prof = get_profile();
744
745 //LCOV_EXCL_START
746         if (prof == PROFILE_MOBILE)
747                 size = ARR_SIZE(mobile_str_standard);
748         else if (prof == PROFILE_WEARABLE)
749                 size = ARR_SIZE(wearable_str_standard);
750         else
751                 size = 0;
752 //LCOV_EXCL_STOP
753         return size;
754 }
755
756 static const char *profile_str_pattern(int pattern)
757 {
758         int prof;
759         int i;
760
761         prof = get_profile();
762
763 //LCOV_EXCL_START
764         if (prof == PROFILE_MOBILE) {
765                 for (i = 0; i < profile_get_num_of_pattern(); i++) {
766                         if (pattern == mobile_str_pattern[i].id)
767                                 return mobile_str_pattern[i].string;
768                 }
769                 for (i = 0; i < profile_get_num_of_standard(); i++) {
770                         if (pattern == mobile_str_standard[i].id)
771                                 return mobile_str_standard[i].string;
772                 }
773         } else if (prof == PROFILE_WEARABLE) {
774                 for (i = 0; i < profile_get_num_of_pattern(); i++) {
775                         if (pattern == wearable_str_pattern[i].id)
776                                 return wearable_str_pattern[i].string;
777                 }
778                 for (i = 0; i < profile_get_num_of_standard(); i++) {
779                         if (pattern == wearable_str_standard[i].id)
780                                 return wearable_str_standard[i].string;
781                 }
782         } else {
783 //LCOV_EXCL_STOP
784                 for (i = 0; i < profile_get_num_of_pattern(); i++) {
785                         if (pattern == common_str_pattern[i].id)
786                                 return common_str_pattern[i].string;
787                 }
788         }
789         return "";
790
791 }
792
793 static int profile_get_pattern_enum(char *pattern)
794 {
795         int prof;
796         int i;
797         int len;
798
799         prof = get_profile();
800
801         len = strlen(pattern);
802 //LCOV_EXCL_START
803         if (prof == PROFILE_MOBILE) {
804                 for (i = 0; i < profile_get_num_of_pattern(); i++) {
805                         if (!strncmp(pattern, mobile_str_pattern[i].string, len))
806                                 return mobile_str_pattern[i].id;
807                 }
808                 for (i = 0; i < profile_get_num_of_standard(); i++) {
809                         if (!strncmp(pattern, mobile_str_standard[i].string, len))
810                                 return mobile_str_standard[i].id;
811                 }
812         } else if (prof == PROFILE_WEARABLE) {
813                 for (i = 0; i < profile_get_num_of_pattern(); i++) {
814                         if (!strncmp(pattern, wearable_str_pattern[i].string, len))
815                                 return wearable_str_pattern[i].id;
816                 }
817                 for (i = 0; i < profile_get_num_of_standard(); i++) {
818                         if (!strncmp(pattern, wearable_str_standard[i].string, len))
819                                 return wearable_str_standard[i].id;
820                 }
821         } else {
822                 for (i = 0; i < profile_get_num_of_pattern(); i++) {
823                         if (!strncmp(pattern, common_str_pattern[i].string, len))
824                                 return common_str_pattern[i].id;
825                 }
826         }
827 //LCOV_EXCL_STOP
828
829         return -1;
830 }
831
832 //LCOV_EXCL_START Not called Callback
833 static void feedback_callstatus_cb(keynode_t *key, void* data)
834 {
835         callstatus = vconf_keynode_get_int(key);
836 }
837
838 static void feedback_lock_sndstatus_cb(keynode_t *key, void* data)
839 {
840         lock_sndstatus = vconf_keynode_get_bool(key);
841 }
842
843 static void feedback_camerastatus_cb(keynode_t *key, void* data)
844 {
845         camerastatus = vconf_keynode_get_int(key);
846 }
847
848 static void feedback_noti_vibstatus_cb(keynode_t *key, void* data)
849 {
850         noti_vibstatus = vconf_keynode_get_bool(key);
851 }
852
853 static void feedback_vib_cb(keynode_t *key, void* data)
854 {
855         vib_level = vconf_keynode_get_int(key);
856 }
857
858 static void feedback_noti_cb(keynode_t *key, void* data)
859 {
860         noti_level = vconf_keynode_get_int(key);
861 }
862
863 static void feedback_feedbackstatus_cb(keynode_t *key, void* data)
864 {
865         feedbackstatus = vconf_keynode_get_bool(key);
866 }
867
868 static void feedback_vib_when_ring_cb(keynode_t *key, void* data)
869 {
870         vib_when_ring = vconf_keynode_get_bool(key);
871 }
872
873 static void snd_noti_path_cb(keynode_t *key, void* data)
874 {
875         char* path = vconf_keynode_get_str(key);
876         struct stat st;
877
878         if (!path)
879                 return;
880
881         if (stat(path, &st) < 0)
882                 return;
883         snprintf(snd_noti_path, PATH_MAX, "%s", path);
884 }
885
886 static void snd_call_path_cb(keynode_t *key, void* data)
887 {
888         char* path = vconf_keynode_get_str(key);
889         struct stat st;
890
891         if (!path)
892                 return;
893
894         if (stat(path, &st) < 0)
895                 return;
896         snprintf(snd_call_path, PATH_MAX, "%s", path);
897 }
898
899 static void vib_noti_type_cb(keynode_t *key, void* data)
900 {
901         vib_noti_index = vconf_keynode_get_int(key);
902 }
903
904 static void vib_call_type_cb(keynode_t *key, void* data)
905 {
906         vib_call_index = vconf_keynode_get_int(key);
907 }
908
909 static void feedback_dnd_mode_cb(keynode_t *key, void* data)
910 {
911         dnd_mode = vconf_keynode_get_bool(key);
912 }
913
914 static void feedback_theater_mode_cb(keynode_t *key, void* data)
915 {
916         theater_mode = vconf_keynode_get_bool(key);
917 }
918
919 static void feedback_goodnight_mode_cb(keynode_t *key, void* data)
920 {
921         goodnight_mode = vconf_keynode_get_bool(key);
922 }
923
924 static void feedback_disconnect_alert_mode_cb(keynode_t *key, void* data)
925 {
926         disconnect_alert_mode = vconf_keynode_get_int(key);
927 }
928 //LCOV_EXCL_STOP
929
930 static void profile_init(void)
931 {
932         char *path;
933         struct stat st;
934         int prof;
935         int ret_val;
936
937         prof = get_profile();
938
939         if (prof == PROFILE_COMMON)
940                 return; //LCOV_EXCL_LINE
941         //LCOV_EXCL_START
942         else if (prof == PROFILE_MOBILE) {
943                 if (vconf_get_bool(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, &lock_sndstatus) < 0)
944                         _W("VCONFKEY_SETAPPL_SOUND_LOCK_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
945                 ret_val = vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, feedback_lock_sndstatus_cb, NULL);
946                 if (ret_val != 0)
947                         _W("VCONFKEY_SETAPPL_SOUND_LOCK_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
948         }
949
950         /* check call status */
951         if (vconf_get_int(VCONFKEY_CALL_STATE, &callstatus) < 0)
952                 _W("VCONFKEY_CALL_STATE ==> FAIL!!"); //LCOV_EXCL_LINE
953
954         /* check camera status */
955         if (vconf_get_int(VCONFKEY_CAMERA_STATE, &camerastatus) < 0)
956                 _W("VCONFKEY_CAMERA_STATE ==> FAIL!!"); //LCOV_EXCL_LINE
957
958         /* shutter sound policy */
959         /* This vconf is read just once, because this value is not changed in running time. */
960         if (vconf_get_int(VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY, &shutter_sndstatus) < 0)
961                 _W("VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY ==> FAIL!!"); //LCOV_EXCL_LINE
962
963         /* check vibration status */
964         if (vconf_get_bool(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, &noti_vibstatus) < 0)
965                 _W("VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
966
967         /* check vib_level */
968         if (vconf_get_int(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, &vib_level) < 0)
969                 _W("VCONFKEY_FEEDBACK_VIBRATION_LEVEL_INT ==> FAIL!!"); //LCOV_EXCL_LINE
970
971         /* check noti_level */
972         if (vconf_get_int(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, &noti_level) < 0)
973                 _W("VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT ==> FAIL!!"); //LCOV_EXCL_LINE
974
975         /* feedback Init */
976         if (vconf_get_bool(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, &feedbackstatus) < 0)
977                 _W("VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
978
979         if (vconf_get_bool(VCONFKEY_SETAPPL_VIBRATE_WHEN_RINGING_BOOL, &vib_when_ring) < 0)
980                 _W("VCONFKEY_SETAPPL_VIBRATE_WHEN_RINGING_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
981
982         path = vconf_get_str(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR);
983         if (path) {
984                 if (stat(path, &st) < 0) {
985                         free(path); //LCOV_EXCL_LINE
986                         path = vconf_get_str(VCONFKEY_SETAPPL_NOTI_RINGTONE_DEFAULT_PATH_STR); //LCOV_EXCL_LINE
987                 }
988                 if (path) {
989                         snprintf(snd_noti_path, PATH_MAX, "%s", path);
990                         free(path);
991                 }
992         } else
993                 snprintf(snd_noti_path, PATH_MAX, "NULL"); //LCOV_EXCL_LINE
994
995         path = vconf_get_str(VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR);
996         if (path) {
997                 if (stat(path, &st) < 0) {
998                         free(path); //LCOV_EXCL_LINE
999                         path = vconf_get_str(VCONFKEY_SETAPPL_CALL_RINGTONE_DEFAULT_PATH_STR); //LCOV_EXCL_LINE
1000                 }
1001                 if (path) {
1002                         snprintf(snd_call_path, PATH_MAX, "%s", path);
1003                         free(path);
1004                 }
1005         } else
1006                 snprintf(snd_call_path, PATH_MAX, "NULL"); //LCOV_EXCL_LINE
1007
1008         if (vconf_get_int(VCONFKEY_SETAPPL_CALL_VIBRATION_PATTERN_INT, &vib_call_index) < 0)
1009                 _W("VCONFKEY_SETAPPL_SETAPPL_CALL_VIBRATION_PATTERN_INT ==> FAIL!!"); //LCOV_EXCL_LINE
1010
1011         if (vconf_get_int(VCONFKEY_SETAPPL_NOTI_VIBRATION_PATTERN_INT, &vib_noti_index) < 0)
1012                 _W("VCONFKEY_SETAPPL_SETAPPL_NOTI_VIBRATION_PATTERN_INT ==> FAIL!!"); //LCOV_EXCL_LINE
1013
1014         if (vconf_get_bool(VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL, &dnd_mode) < 0)
1015                 _W("VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
1016
1017         if (vconf_get_bool(VCONFKEY_SETAPPL_THEATER_MODE_ENABLE, &theater_mode) < 0)
1018                 _W("VCONFKEY_SETAPPL_THEATER_MODE_ENABLE ==> FAIL!!"); //LCOV_EXCL_LINE
1019
1020         if (vconf_get_bool(VCONFKEY_SETAPPL_GOODNIGHT_MODE_ENABLE, &goodnight_mode) < 0)
1021                 _W("VCONFKEY_SETAPPL_GOODNIGHT_MODE_ENABLE ==> FAIL!!"); //LCOV_EXCL_LINE
1022
1023         if (vconf_get_int(VCONFKEY_SETAPPL_DISCONNECT_ALERT_TYPE_INT, &disconnect_alert_mode) < 0)
1024                 _W("VCONFKEY_SETAPPL_DISCONNECT_ALERT_TYPE_INT ==> FAIL!!"); //LCOV_EXCL_LINE
1025
1026         /* add watch for status value */
1027         ret_val = vconf_notify_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb, NULL);
1028         if (ret_val != 0)
1029                 _W("Add watch for VCONFKEY_CALL_STATE failed"); //LCOV_EXCL_LINE
1030         ret_val = vconf_notify_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb, NULL);
1031         if (ret_val != 0)
1032                 _W("Add watch for VCONFKEY_CAMERA_STATE failed"); //LCOV_EXCL_LINE
1033         ret_val = vconf_notify_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb, NULL);
1034         if (ret_val != 0)
1035                 _W("Add watch for VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL failed"); //LCOV_EXCL_LINE
1036         ret_val = vconf_notify_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb, NULL);
1037         if (ret_val != 0)
1038                 _W("Add watch for VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT failed"); //LCOV_EXCL_LINE
1039         ret_val = vconf_notify_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb, NULL);
1040         if (ret_val != 0)
1041                 _W("Add watch for VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT failed"); //LCOV_EXCL_LINE
1042         ret_val = vconf_notify_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb, NULL);
1043         if (ret_val != 0)
1044                 _W("Add watch for VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL failed"); //LCOV_EXCL_LINE
1045         ret_val = vconf_notify_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_RINGING_BOOL, feedback_vib_when_ring_cb, NULL);
1046         if (ret_val != 0)
1047                 _W("Add watch for VCONFKEY_SETAPPL_VIBRATE_WHEN_RINGING_BOOL failed"); //LCOV_EXCL_LINE
1048         ret_val = vconf_notify_key_changed(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR, snd_noti_path_cb, NULL);
1049         if (ret_val != 0)
1050                 _W("Add watch for VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR failed"); //LCOV_EXCL_LINE
1051         ret_val = vconf_notify_key_changed(VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR, snd_call_path_cb, NULL);
1052         if (ret_val != 0)
1053                 _W("Add watch for VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR failed"); //LCOV_EXCL_LINE
1054         ret_val = vconf_notify_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_PATTERN_INT, vib_noti_type_cb, NULL);
1055         if (ret_val != 0)
1056                 _W("Add watch for VCONFKEY_SETAPPL_NOTI_VIBRATION_PATTERN_INT failed"); //LCOV_EXCL_LINE
1057         ret_val = vconf_notify_key_changed(VCONFKEY_SETAPPL_CALL_VIBRATION_PATTERN_INT, vib_call_type_cb, NULL);
1058         if (ret_val != 0)
1059                 _W("Add watch for VCONFKEY_SETAPPL_CALL_VIBRATION_PATTERN_INT failed"); //LCOV_EXCL_LINE
1060         ret_val = vconf_notify_key_changed(VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL, feedback_dnd_mode_cb, NULL);
1061         if (ret_val != 0)
1062                 _W("Add watch for VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL failed"); //LCOV_EXCL_LINE
1063         ret_val = vconf_notify_key_changed(VCONFKEY_SETAPPL_THEATER_MODE_ENABLE, feedback_theater_mode_cb, NULL);
1064         if (ret_val != 0)
1065                 _W("Add watch for VCONFKEY_SETAPPL_THEATER_MODE_ENABLE failed"); //LCOV_EXCL_LINE
1066         ret_val = vconf_notify_key_changed(VCONFKEY_SETAPPL_GOODNIGHT_MODE_ENABLE, feedback_goodnight_mode_cb, NULL);
1067         if (ret_val != 0)
1068                 _W("Add watch for VCONFKEY_SETAPPL_GOODNIGHT_MODE_ENABLE failed"); //LCOV_EXCL_LINE
1069         ret_val = vconf_notify_key_changed(VCONFKEY_SETAPPL_DISCONNECT_ALERT_TYPE_INT, feedback_disconnect_alert_mode_cb, NULL);
1070         if (ret_val != 0)
1071                 _W("Add watch for VCONFKEY_SETAPPL_DISCONNECT_ALERT_TYPE_INT failed"); //LCOV_EXCL_LINE
1072         //LCOV_EXCL_STOP
1073 }
1074
1075 static void profile_exit(void)
1076 {
1077         int prof;
1078         int ret_val;
1079
1080         prof = get_profile();
1081
1082         if (prof == PROFILE_COMMON)
1083                 return;
1084         //LCOV_EXCL_START
1085         else if (prof == PROFILE_MOBILE) {
1086                 ret_val = vconf_ignore_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, feedback_lock_sndstatus_cb);
1087                 if (ret_val != 0)
1088                         _W("Remove watch for VCONFKEY_SETAPPL_SOUND_LOCK_BOOL failed"); //LCOV_EXCL_LINE
1089         }
1090
1091         /* remove watch */
1092         ret_val = vconf_ignore_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb);
1093         if (ret_val != 0)
1094                 _W("Remove watch for VCONFKEY_CALL_STATE failed"); //LCOV_EXCL_LINE
1095         ret_val = vconf_ignore_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb);
1096         if (ret_val != 0)
1097                 _W("Remove watch for VCONFKEY_CAMERA_STATE failed"); //LCOV_EXCL_LINE
1098         ret_val = vconf_ignore_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb);
1099         if (ret_val != 0)
1100                 _W("Remove watch for VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL failed"); //LCOV_EXCL_LINE
1101         ret_val = vconf_ignore_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb);
1102         if (ret_val != 0)
1103                 _W("Remove watch for VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT failed"); //LCOV_EXCL_LINE
1104         ret_val = vconf_ignore_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb);
1105         if (ret_val != 0)
1106                 _W("Remove watch for VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT failed"); //LCOV_EXCL_LINE
1107         ret_val = vconf_ignore_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb);
1108         if (ret_val != 0)
1109                 _W("Remove watch for VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL failed"); //LCOV_EXCL_LINE
1110         ret_val = vconf_ignore_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_RINGING_BOOL, feedback_vib_when_ring_cb);
1111         if (ret_val != 0)
1112                 _W("Remove watch for VCONFKEY_SETAPPL_VIBRATE_WHEN_RINGING_BOOL failed"); //LCOV_EXCL_LINE
1113         ret_val = vconf_ignore_key_changed(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR, snd_noti_path_cb);
1114         if (ret_val != 0)
1115                 _W("Remove watch for VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR failed"); //LCOV_EXCL_LINE
1116         ret_val = vconf_ignore_key_changed(VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR, snd_call_path_cb);
1117         if (ret_val != 0)
1118                 _W("Remove watch for VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR failed"); //LCOV_EXCL_LINE
1119         ret_val = vconf_ignore_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_PATTERN_INT, vib_noti_type_cb);
1120         if (ret_val != 0)
1121                 _W("Remove watch for VCONFKEY_SETAPPL_NOTI_VIBRATION_PATTERN_INT failed"); //LCOV_EXCL_LINE
1122         ret_val = vconf_ignore_key_changed(VCONFKEY_SETAPPL_CALL_VIBRATION_PATTERN_INT, vib_call_type_cb);
1123         if (ret_val != 0)
1124                 _W("Remove watch for VCONFKEY_SETAPPL_CALL_VIBRATION_PATTERN_INT failed"); //LCOV_EXCL_LINE
1125         ret_val = vconf_ignore_key_changed(VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL, feedback_dnd_mode_cb);
1126         if (ret_val != 0)
1127                 _W("Remove watch for VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL failed"); //LCOV_EXCL_LINE
1128         ret_val = vconf_ignore_key_changed(VCONFKEY_SETAPPL_THEATER_MODE_ENABLE, feedback_theater_mode_cb);
1129         if (ret_val != 0)
1130                 _W("Remove watch for VCONFKEY_SETAPPL_THEATER_MODE_ENABLE failed"); //LCOV_EXCL_LINE
1131         ret_val = vconf_ignore_key_changed(VCONFKEY_SETAPPL_GOODNIGHT_MODE_ENABLE, feedback_goodnight_mode_cb);
1132         if (ret_val != 0)
1133                 _W("Remove watch for VCONFKEY_SETAPPL_GOODNIGHT_MODE_ENABLE failed"); //LCOV_EXCL_LINE
1134         ret_val = vconf_ignore_key_changed(VCONFKEY_SETAPPL_DISCONNECT_ALERT_TYPE_INT, feedback_disconnect_alert_mode_cb);
1135         if (ret_val != 0)
1136                 _W("Remove watch for VCONFKEY_SETAPPL_DISCONNECT_ALERT_TYPE_INT failed"); //LCOV_EXCL_LINE
1137         //LCOV_EXCL_STOP
1138 }
1139
1140 //LCOV_EXCL_START
1141 static int wearable_get_switched_pattern(int pattern)
1142 {
1143         int changed_pattern = pattern;
1144
1145         switch (changed_pattern) {
1146                 case FEEDBACK_PATTERN_RINGER:
1147                 case FEEDBACK_PATTERN_RINGER_STRONG_BUZZ:
1148                         changed_pattern = FEEDBACK_PATTERN_RING_1 + vib_call_index;
1149                         break;
1150                 case FEEDBACK_PATTERN_MESSAGE:
1151                 case FEEDBACK_PATTERN_MESSAGE_STRONG_BUZZ:
1152                 case FEEDBACK_PATTERN_EMAIL:
1153                 case FEEDBACK_PATTERN_EMAIL_STRONG_BUZZ:
1154                 case FEEDBACK_PATTERN_GENERAL:
1155                 case FEEDBACK_PATTERN_GENERAL_STRONG_BUZZ:
1156                 case FEEDBACK_PATTERN_3RD_APPLICATION:
1157                 case FEEDBACK_PATTERN_COMMUNICATION:
1158                 case FEEDBACK_PATTERN_COMMUNICATION_STRONG_BUZZ:
1159                         changed_pattern = FEEDBACK_PATTERN_NOTIFICATION_1 + vib_noti_index;
1160                         break;
1161                 case FEEDBACK_PATTERN_WAKEUP:
1162                 case FEEDBACK_PATTERN_INTERNAL_WAKEUP:
1163                         if (callstatus)
1164                                 changed_pattern = FEEDBACK_PATTERN_WAKEUP_ON_CALL;
1165                         break;
1166                 case FEEDBACK_PATTERN_TIMER:
1167                 case FEEDBACK_PATTERN_INTERNAL_TIMER:
1168                         if (callstatus)
1169                                 changed_pattern = FEEDBACK_PATTERN_TIMER_ON_CALL;
1170                         break;
1171                 default:
1172                         break;
1173         }
1174
1175         return changed_pattern;
1176 }
1177 //LCOV_EXCL_STOP
1178
1179 //LCOV_EXCL_START
1180 static int mobile_get_switched_pattern(int pattern)
1181 {
1182         int changed_pattern = pattern;
1183
1184         if (callstatus == VCONFKEY_CALL_OFF)
1185                 return changed_pattern;
1186
1187         if (is_sound_mode() &&
1188                 pattern != FEEDBACK_PATTERN_WAKEUP && pattern != FEEDBACK_PATTERN_INTERNAL_WAKEUP &&
1189                 pattern != FEEDBACK_PATTERN_TIMER && pattern != FEEDBACK_PATTERN_INTERNAL_TIMER)
1190                 return changed_pattern;
1191
1192         /* in case of call connected or connecting */
1193         _D("Call status is connected or connecting."); //LCOV_EXCL_LINE
1194         if (changed_pattern == FEEDBACK_PATTERN_MESSAGE)
1195                 changed_pattern = FEEDBACK_PATTERN_MESSAGE_ON_CALL;
1196         else if(changed_pattern == FEEDBACK_PATTERN_EMAIL)
1197                 changed_pattern = FEEDBACK_PATTERN_EMAIL_ON_CALL;
1198         else if ((changed_pattern == FEEDBACK_PATTERN_WAKEUP) || (pattern == FEEDBACK_PATTERN_INTERNAL_WAKEUP))
1199                 changed_pattern = FEEDBACK_PATTERN_WAKEUP_ON_CALL;
1200         else if (changed_pattern == FEEDBACK_PATTERN_SCHEDULE)
1201                 changed_pattern = FEEDBACK_PATTERN_SCHEDULE_ON_CALL;
1202         else if ((changed_pattern == FEEDBACK_PATTERN_TIMER) || (pattern == FEEDBACK_PATTERN_INTERNAL_TIMER))
1203                 changed_pattern = FEEDBACK_PATTERN_TIMER_ON_CALL;
1204         else if (changed_pattern == FEEDBACK_PATTERN_GENERAL)
1205                 changed_pattern = FEEDBACK_PATTERN_GENERAL_ON_CALL;
1206         else if (changed_pattern == FEEDBACK_PATTERN_CHARGERCONN)
1207                 changed_pattern = FEEDBACK_PATTERN_CHARGERCONN_ON_CALL;
1208         else if (changed_pattern == FEEDBACK_PATTERN_CHARGING_ERROR)
1209                 changed_pattern = FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL;
1210         else if (changed_pattern == FEEDBACK_PATTERN_FULLCHARGED)
1211                 changed_pattern = FEEDBACK_PATTERN_FULLCHARGED_ON_CALL;
1212         else if (changed_pattern == FEEDBACK_PATTERN_LOWBATT)
1213                 changed_pattern = FEEDBACK_PATTERN_LOWBATT_ON_CALL;
1214
1215         return changed_pattern;
1216 }
1217 //LCOV_EXCL_STOP
1218
1219 static bool profile_get_switched_pattern(int pattern, int *switched)
1220 {
1221         int changed_pattern = pattern;
1222         int prof = get_profile();
1223
1224         if (!switched || prof == PROFILE_COMMON)
1225                 return false;
1226
1227         //LCOV_EXCL_START
1228         if (prof == PROFILE_WEARABLE)
1229                 changed_pattern = wearable_get_switched_pattern(changed_pattern);
1230         else
1231                 changed_pattern = mobile_get_switched_pattern(changed_pattern);
1232
1233         if (changed_pattern != pattern) {
1234                 *switched = changed_pattern;
1235                 return true;
1236         }
1237         //LCOV_EXCL_STOP
1238         return false;
1239 }
1240
1241 //LCOV_EXCL_START
1242 static bool mobile_is_notification_type(int pattern)
1243 {
1244         switch (pattern) {
1245         case FEEDBACK_PATTERN_WAKEUP:
1246         case FEEDBACK_PATTERN_INTERNAL_WAKEUP:
1247         case FEEDBACK_PATTERN_WAKEUP_ON_CALL:
1248         case FEEDBACK_PATTERN_TIMER:
1249         case FEEDBACK_PATTERN_INTERNAL_TIMER:
1250         case FEEDBACK_PATTERN_TIMER_ON_CALL:
1251         case FEEDBACK_PATTERN_MESSAGE ... FEEDBACK_PATTERN_EMAIL_ON_CALL:
1252         case FEEDBACK_PATTERN_SCHEDULE:
1253         case FEEDBACK_PATTERN_SCHEDULE_ON_CALL:
1254         case FEEDBACK_PATTERN_GENERAL ... FEEDBACK_PATTERN_LOWBATT_ON_CALL:
1255         case FEEDBACK_PATTERN_SAFETY_ALERT:
1256         case FEEDBACK_PATTERN_CMAS:
1257         case FEEDBACK_PATTERN_CMAS_CA:
1258                 return true;
1259         }
1260         return false;
1261 }
1262 //LCOV_EXCL_STOP
1263
1264 //LCOV_EXCL_START
1265 static bool wearable_is_notification_type(int pattern)
1266 {
1267         switch (pattern) {
1268         case FEEDBACK_PATTERN_WAKEUP:
1269         case FEEDBACK_PATTERN_INTERNAL_WAKEUP:
1270         case FEEDBACK_PATTERN_WAKEUP_ON_CALL:
1271         case FEEDBACK_PATTERN_TIMER:
1272         case FEEDBACK_PATTERN_INTERNAL_TIMER:
1273         case FEEDBACK_PATTERN_TIMER_ON_CALL:
1274                 return false;
1275         case FEEDBACK_PATTERN_MESSAGE ... FEEDBACK_PATTERN_EMAIL_ON_CALL:
1276         case FEEDBACK_PATTERN_SCHEDULE:
1277         case FEEDBACK_PATTERN_SCHEDULE_ON_CALL:
1278         case FEEDBACK_PATTERN_GENERAL:
1279         case FEEDBACK_PATTERN_GENERAL_ON_CALL:
1280         case FEEDBACK_PATTERN_SMART_ALERT:
1281         case FEEDBACK_PATTERN_SAFETY_ALERT:
1282         case FEEDBACK_PATTERN_CMAS:
1283         case FEEDBACK_PATTERN_CMAS_CA:
1284         case FEEDBACK_PATTERN_3RD_APPLICATION:
1285         case FEEDBACK_PATTERN_TEMPERATURE_WARNING:
1286         case FEEDBACK_PATTERN_COOLDOWN_WARNING_1:
1287         case FEEDBACK_PATTERN_COOLDOWN_WARNING_2:
1288         case FEEDBACK_PATTERN_COMMUNICATION:
1289         case FEEDBACK_PATTERN_MESSAGE_STRONG_BUZZ:
1290         case FEEDBACK_PATTERN_EMAIL_STRONG_BUZZ:
1291         case FEEDBACK_PATTERN_GENERAL_STRONG_BUZZ:
1292         case FEEDBACK_PATTERN_COMMUNICATION_STRONG_BUZZ:
1293         case FEEDBACK_PATTERN_SCHEDULE_STRONG_BUZZ:
1294         case FEEDBACK_PATTERN_NOTIFICATION_1 ... FEEDBACK_PATTERN_NOTIFICATION_8_STRONG_BUZZ:
1295         case FEEDBACK_PATTERN_ALARM_1 ... FEEDBACK_PATTERN_ALARM_8_STRONG_BUZZ:
1296                 return true;
1297         }
1298         return false;
1299 }
1300 //LCOV_EXCL_STOP
1301
1302 static bool profile_is_notification_type(int pattern)
1303 {
1304         int prof;
1305
1306         prof = get_profile();
1307
1308 //LCOV_EXCL_START
1309         if (prof == PROFILE_MOBILE)
1310                 return mobile_is_notification_type(pattern);
1311         else if (prof == PROFILE_WEARABLE)
1312                 return wearable_is_notification_type(pattern);
1313         else
1314                 return false;
1315 //LCOV_EXCL_STOP
1316 }
1317
1318 //LCOV_EXCL_START
1319 static int mobile_get_priority(int pattern)
1320 {
1321         switch (pattern) {
1322         case FEEDBACK_PATTERN_TAP ... FEEDBACK_PATTERN_HW_HOLD:
1323                 return PRIORITY_MIN;
1324         case FEEDBACK_PATTERN_WAKEUP:
1325         case FEEDBACK_PATTERN_INTERNAL_WAKEUP:
1326         case FEEDBACK_PATTERN_SCHEDULE:
1327         case FEEDBACK_PATTERN_TIMER:
1328         case FEEDBACK_PATTERN_INTERNAL_TIMER:
1329         case FEEDBACK_PATTERN_CMAS:
1330         case FEEDBACK_PATTERN_CMAS_CA:
1331                 return PRIORITY_HIGH;
1332         case FEEDBACK_PATTERN_SEND_SOS_MESSAGE:
1333         case FEEDBACK_PATTERN_RINGER:
1334                 return PRIORITY_TOP;
1335         }
1336
1337         return PRIORITY_MIDDLE;
1338 }
1339 //LCOV_EXCL_STOP
1340
1341 //LCOV_EXCL_START
1342 static int wearable_get_priority(int pattern)
1343 {
1344         if (pattern == FEEDBACK_PATTERN_CMAS ||
1345         pattern == FEEDBACK_PATTERN_CMAS_CA ||
1346         pattern == FEEDBACK_PATTERN_RINGER ||
1347         pattern == FEEDBACK_PATTERN_RINGER_STRONG_BUZZ ||
1348         (pattern >= FEEDBACK_PATTERN_RING_1 && pattern <= FEEDBACK_PATTERN_RING_10_STRONG_BUZZ) ||
1349         pattern == FEEDBACK_PATTERN_FIND_MY_GEAR)
1350                 return PRIORITY_TOP;
1351         else if (pattern == FEEDBACK_PATTERN_WAKEUP || pattern == FEEDBACK_PATTERN_INTERNAL_WAKEUP ||
1352         pattern == FEEDBACK_PATTERN_WAKEUP_ON_CALL ||
1353         pattern == FEEDBACK_PATTERN_SCHEDULE || pattern == FEEDBACK_PATTERN_SCHEDULE_ON_CALL ||
1354         pattern == FEEDBACK_PATTERN_TIMER || pattern == FEEDBACK_PATTERN_INTERNAL_TIMER ||
1355         pattern == FEEDBACK_PATTERN_TIMER_ON_CALL ||
1356         (pattern >= FEEDBACK_PATTERN_ALARM_1 && pattern <= FEEDBACK_PATTERN_ALARM_10_STRONG_BUZZ))
1357                 return PRIORITY_HIGH;
1358         else if (pattern >= FEEDBACK_PATTERN_TAP && pattern <= FEEDBACK_PATTERN_HW_HOLD)
1359                 return PRIORITY_MIN;
1360         else if (pattern == FEEDBACK_PATTERN_END_EFFECT)
1361                 return PRIORITY_MIN;
1362         else if (pattern >= FEEDBACK_PATTERN_END_EFFECT_FINE && pattern <= FEEDBACK_PATTERN_FUNCTION)
1363                 return PRIORITY_MIN;
1364         else if (pattern == FEEDBACK_PATTERN_VOICE_START || pattern == FEEDBACK_PATTERN_VOICE_STOP)
1365                 return PRIORITY_MIN;
1366         else if (pattern >= FEEDBACK_PATTERN_BOS && pattern <= FEEDBACK_PATTERN_UDS)
1367                 return PRIORITY_MIN;
1368         return PRIORITY_MIDDLE;
1369 }
1370 //LCOV_EXCL_STOP
1371
1372 static int profile_get_priority(int pattern)
1373 {
1374         int prof;
1375
1376         prof = get_profile();
1377
1378 //LCOV_EXCL_START
1379         if (prof == PROFILE_MOBILE)
1380                 return mobile_get_priority(pattern);
1381         else if (prof == PROFILE_WEARABLE)
1382                 return wearable_get_priority(pattern);
1383         else
1384                 return PRIORITY_MIDDLE;
1385 //LCOV_EXCL_STOP
1386 }
1387
1388 //LCOV_EXCL_START
1389 static bool mobile_get_always_alert_case(int type, int pattern)
1390 {
1391         int ret_val;
1392
1393         switch (pattern) {
1394         case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
1395         case FEEDBACK_PATTERN_HOLD:
1396                 if (CHECK_VIBRATION(type) && feedbackstatus)
1397                         return true;
1398                 break;
1399         case FEEDBACK_PATTERN_SIP:
1400         case FEEDBACK_PATTERN_SIP_BACKSPACE:
1401         case FEEDBACK_PATTERN_SIP_FUNCTION:
1402         case FEEDBACK_PATTERN_SIP_FJKEY:
1403                 if (CHECK_VIBRATION(type))
1404                         return true;
1405                 break;
1406         case FEEDBACK_PATTERN_MESSAGE:
1407         case FEEDBACK_PATTERN_EMAIL:
1408                 if (CHECK_VIBRATION(type) && noti_vibstatus)
1409                         return true;
1410                 break;
1411         case FEEDBACK_PATTERN_TIMER:
1412         case FEEDBACK_PATTERN_INTERNAL_TIMER:
1413         case FEEDBACK_PATTERN_TIMER_ON_CALL:
1414                 if (CHECK_VIBRATION(type))
1415                         return true;
1416                 break;
1417         case FEEDBACK_PATTERN_WAKEUP:
1418         case FEEDBACK_PATTERN_INTERNAL_WAKEUP:
1419         case FEEDBACK_PATTERN_WAKEUP_ON_CALL:
1420                 return true;
1421         case FEEDBACK_PATTERN_MESSAGE_ON_CALL:
1422         case FEEDBACK_PATTERN_EMAIL_ON_CALL:
1423         case FEEDBACK_PATTERN_GENERAL_ON_CALL:
1424                 break;
1425         case FEEDBACK_PATTERN_CHARGERCONN_ON_CALL:
1426         case FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL:
1427         case FEEDBACK_PATTERN_LOWBATT_ON_CALL:
1428         case FEEDBACK_PATTERN_MMS:
1429         case FEEDBACK_PATTERN_HOURLY_ALERT:
1430                 /* no matter sound profile */
1431                 if (CHECK_VIBRATION(type))
1432                         return true;
1433                 break;
1434         case FEEDBACK_PATTERN_SEND_SOS_MESSAGE:
1435         case FEEDBACK_PATTERN_SMART_ALERT:
1436         case FEEDBACK_PATTERN_END_SOS_MESSAGE:
1437         case FEEDBACK_PATTERN_CMAS:
1438         case FEEDBACK_PATTERN_CMAS_CA:
1439         case FEEDBACK_PATTERN_OUTGOING_CALL:
1440                 return true;
1441         case FEEDBACK_PATTERN_SCREEN_CAPTURE:
1442                 if (CHECK_SOUND(type) && camerastatus && shutter_sndstatus)
1443                         return true;
1444                 break;
1445         case FEEDBACK_PATTERN_RINGER:
1446                 if (CHECK_VIBRATION(type) && (is_vibration_mode() || is_sound_mode()) &&
1447             vconf_get_int(VCONFKEY_RECORDER_STATE, &ret_val) == 0 &&
1448             ret_val == VCONFKEY_RECORDER_STATE_RECORDING)
1449                         return true;
1450                 break;
1451         case FEEDBACK_PATTERN_TEMPERATURE_WARNING:
1452         case FEEDBACK_PATTERN_COOLDOWN_WARNING_1:
1453         case FEEDBACK_PATTERN_COOLDOWN_WARNING_2:
1454                 if (CHECK_VIBRATION(type))
1455                         return true;
1456                 break;
1457         case FEEDBACK_PATTERN_CALLCONNECT:
1458         case FEEDBACK_PATTERN_DISCALLCONNECT:
1459                 return true;
1460         default:
1461                 break;
1462         }
1463         return false;
1464 }
1465 //LCOV_EXCL_STOP
1466
1467 //LCOV_EXCL_START
1468 static bool wearable_is_system_type(int pattern)
1469 {
1470         switch(pattern) {
1471         case FEEDBACK_PATTERN_POWERON ... FEEDBACK_PATTERN_HOURLY_ALERT:
1472         case FEEDBACK_PATTERN_TEMPERATURE_WARNING ... FEEDBACK_PATTERN_COOLDOWN_WARNING_2:
1473                 return true;
1474         }
1475         return false;
1476 }
1477
1478 static bool wearable_get_always_alert_case(int type, int pattern)
1479 {
1480         int ret_val;
1481
1482         if (CHECK_SOUND(type)) {
1483                 if ((wearable_is_notification_type(pattern) || wearable_is_system_type(pattern)) &&
1484             callstatus) {
1485                         _W("skip %s sound during call", profile_str_pattern(pattern));
1486                         return false;
1487                 }
1488                 switch (pattern) {
1489                 case FEEDBACK_PATTERN_WAKEUP:
1490                 case FEEDBACK_PATTERN_INTERNAL_WAKEUP:
1491                 case FEEDBACK_PATTERN_WAKEUP_ON_CALL:
1492                         return true;
1493                 case FEEDBACK_PATTERN_MESSAGE_ON_CALL:
1494                 case FEEDBACK_PATTERN_EMAIL_ON_CALL:
1495                 case FEEDBACK_PATTERN_GENERAL_ON_CALL:
1496                         break;
1497                 case FEEDBACK_PATTERN_SMART_ALERT:
1498                 case FEEDBACK_PATTERN_SEND_SOS_MESSAGE:
1499                 case FEEDBACK_PATTERN_END_SOS_MESSAGE:
1500                 case FEEDBACK_PATTERN_CMAS:
1501                 case FEEDBACK_PATTERN_CMAS_CA:
1502                 case FEEDBACK_PATTERN_NFC_SUCCESS:
1503                         return true;
1504                 case FEEDBACK_PATTERN_SCREEN_CAPTURE:
1505                         if (camerastatus && shutter_sndstatus)
1506                                 return true;
1507                         break;
1508                 case FEEDBACK_PATTERN_OUTGOING_CALL:
1509                         return true;
1510                 default:
1511                         break;
1512                 }
1513         } else if (CHECK_VIBRATION(type)) {
1514                 if ((wearable_is_notification_type(pattern) || wearable_is_system_type(pattern)) &&
1515             (is_sound_mode() || is_vibration_mode()) &&
1516             callstatus) {
1517                         _W("alert %s vibration during call", profile_str_pattern(pattern));
1518                         return true;
1519                 }
1520                 switch (pattern) {
1521                 case FEEDBACK_PATTERN_TAP:
1522                 case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
1523                 case FEEDBACK_PATTERN_HOLD:
1524                 case FEEDBACK_PATTERN_END_EFFECT:
1525                 case FEEDBACK_PATTERN_END_EFFECT_FINE ... FEEDBACK_PATTERN_FUNCTION:
1526                 case FEEDBACK_PATTERN_VOICE_START:
1527                 case FEEDBACK_PATTERN_VOICE_STOP:
1528                 case FEEDBACK_PATTERN_PICKER:
1529                 case FEEDBACK_PATTERN_PICKER_FINISH:
1530                 case FEEDBACK_PATTERN_ON_OFF_SWITCH:
1531                 case FEEDBACK_PATTERN_REORDER:
1532                 case FEEDBACK_PATTERN_CURSOR_MOVE:
1533                         if (feedbackstatus)
1534                                 return true;
1535                         break;
1536                 case FEEDBACK_PATTERN_MESSAGE:
1537                 case FEEDBACK_PATTERN_EMAIL:
1538                 case FEEDBACK_PATTERN_GENERAL:
1539                 case FEEDBACK_PATTERN_SCHEDULE:
1540                 case FEEDBACK_PATTERN_COMMUNICATION:
1541                 case FEEDBACK_PATTERN_MESSAGE_STRONG_BUZZ:
1542                 case FEEDBACK_PATTERN_EMAIL_STRONG_BUZZ:
1543                 case FEEDBACK_PATTERN_GENERAL_STRONG_BUZZ:
1544                 case FEEDBACK_PATTERN_COMMUNICATION_STRONG_BUZZ:
1545                 case FEEDBACK_PATTERN_SCHEDULE_STRONG_BUZZ:
1546                 case FEEDBACK_PATTERN_3RD_APPLICATION:
1547                 case FEEDBACK_PATTERN_NOTIFICATION_1 ... FEEDBACK_PATTERN_NOTIFICATION_10_STRONG_BUZZ:
1548                         if (noti_vibstatus)
1549                                 return true;
1550                         break;
1551                 case FEEDBACK_PATTERN_SIP:
1552                 case FEEDBACK_PATTERN_SIP_BACKSPACE:
1553                 case FEEDBACK_PATTERN_SIP_FUNCTION:
1554                 case FEEDBACK_PATTERN_SIP_FJKEY:
1555                 case FEEDBACK_PATTERN_TIMER:
1556                 case FEEDBACK_PATTERN_INTERNAL_TIMER:
1557                 case FEEDBACK_PATTERN_TIMER_ON_CALL:
1558                 case FEEDBACK_PATTERN_WAKEUP:
1559                 case FEEDBACK_PATTERN_INTERNAL_WAKEUP:
1560                 case FEEDBACK_PATTERN_WAKEUP_ON_CALL:
1561                 case FEEDBACK_PATTERN_MESSAGE_ON_CALL:
1562                 case FEEDBACK_PATTERN_EMAIL_ON_CALL:
1563                 case FEEDBACK_PATTERN_GENERAL_ON_CALL:
1564                 case FEEDBACK_PATTERN_WAKEUP_STRONG_BUZZ:
1565                 case FEEDBACK_PATTERN_TIMER_STRONG_BUZZ:
1566                 case FEEDBACK_PATTERN_ALARM_1 ... FEEDBACK_PATTERN_ALARM_10_STRONG_BUZZ:
1567                 case FEEDBACK_PATTERN_MMS:
1568                 case FEEDBACK_PATTERN_HOURLY_ALERT:
1569                 case FEEDBACK_PATTERN_CHARGERCONN_ON_CALL:
1570                 case FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL:
1571                 case FEEDBACK_PATTERN_LOWBATT_ON_CALL:
1572                 case FEEDBACK_PATTERN_TEMPERATURE_WARNING:
1573                 case FEEDBACK_PATTERN_COOLDOWN_WARNING_1:
1574                 case FEEDBACK_PATTERN_COOLDOWN_WARNING_2:
1575                 case FEEDBACK_PATTERN_BT_DISCONNECTED:
1576                 case FEEDBACK_PATTERN_SEND_SOS_MESSAGE:
1577                 case FEEDBACK_PATTERN_END_SOS_MESSAGE:
1578                 case FEEDBACK_PATTERN_SMART_ALERT:
1579                 case FEEDBACK_PATTERN_CMAS:
1580                 case FEEDBACK_PATTERN_CMAS_CA:
1581                 case FEEDBACK_PATTERN_OUTGOING_CALL:
1582                 case FEEDBACK_PATTERN_FALL_DETECTION_1:
1583                 case FEEDBACK_PATTERN_FALL_DETECTION_2:
1584                         return true;
1585                 case FEEDBACK_PATTERN_SPEED_UP:
1586                 case FEEDBACK_PATTERN_SLOW_DOWN:
1587                 case FEEDBACK_PATTERN_KEEP_THIS_PACE:
1588                 case FEEDBACK_PATTERN_GOAL_ACHIEVED:
1589                 case FEEDBACK_PATTERN_EXERCISE_COUNT:
1590                 case FEEDBACK_PATTERN_BREATHING_EXHALE:
1591                 case FEEDBACK_PATTERN_START_CUE:
1592                 case FEEDBACK_PATTERN_INACTIVE_TIME:
1593                 case FEEDBACK_PATTERN_SHEALTH_NOTICE:
1594                 case FEEDBACK_PATTERN_SHEALTH_GENTLE_ALERT:
1595                 case FEEDBACK_PATTERN_HEALTH_PACE:
1596                 case FEEDBACK_PATTERN_SHEALTH_START:
1597                 case FEEDBACK_PATTERN_SHEALTH_PAUSE:
1598                 case FEEDBACK_PATTERN_SHEALTH_STOP:
1599                 case FEEDBACK_PATTERN_INACTIVE_FINE:
1600                 case FEEDBACK_PATTERN_MEDITATION:
1601                 case FEEDBACK_PATTERN_MEDITATION_INTERVAL:
1602                         /* except mute case */
1603                         if (is_sound_mode() || is_vibration_mode())
1604                                 return true;
1605                         break;
1606                 case FEEDBACK_PATTERN_RINGER:
1607                 case FEEDBACK_PATTERN_RINGER_STRONG_BUZZ:
1608                 case FEEDBACK_PATTERN_RING_1 ... FEEDBACK_PATTERN_RING_10_STRONG_BUZZ:
1609                         if (vib_when_ring)
1610                 return true;
1611             /* check if the state of voice recorder is recording */
1612             if ((is_sound_mode() || is_vibration_mode()) &&
1613                 vconf_get_int(VCONFKEY_RECORDER_STATE, &ret_val) == 0 &&
1614                 ret_val == VCONFKEY_RECORDER_STATE_RECORDING) {
1615                 _D("voice recording status is RECORDING");
1616                 return true;
1617             }
1618             break;
1619                 case FEEDBACK_PATTERN_FIND_MY_GEAR:
1620                         return true;
1621                 default:
1622                         break;
1623                 }
1624
1625                 if (pattern > FEEDBACK_STANDARD_START && pattern < FEEDBACK_STANDARD_END)
1626                         return true;
1627         }
1628         return false;
1629 }
1630 //LCOV_EXCL_STOP
1631
1632 //LCOV_EXCL_START
1633 static bool common_get_always_alert_case(int type, int pattern)
1634 {
1635         switch (pattern) {
1636         case FEEDBACK_PATTERN_SIP:
1637         case FEEDBACK_PATTERN_TIMER:
1638                 if (CHECK_VIBRATION(type))
1639                         return true;
1640                 break;
1641         case FEEDBACK_PATTERN_WAKEUP:
1642                 return true;
1643         default:
1644                 break;
1645         }
1646         return false;
1647 }
1648 //LCOV_EXCL_STOP
1649
1650 static bool profile_get_always_alert_case(int type, int pattern)
1651 {
1652         int prof;
1653
1654         prof = get_profile();
1655
1656 //LCOV_EXCL_START
1657         if (prof == PROFILE_MOBILE)
1658                 return mobile_get_always_alert_case(type, pattern);
1659         else if (prof == PROFILE_WEARABLE)
1660                 return wearable_get_always_alert_case(type, pattern);
1661         else
1662                 return common_get_always_alert_case(type, pattern);
1663 //LCOV_EXCL_STOP
1664 }
1665
1666 //LCOV_EXCL_START
1667 static bool mobile_get_always_off_case(int type, int pattern)
1668 {
1669         int ret_val;
1670
1671         /* check if the state of voice recorder is recording */
1672         if (vconf_get_int(VCONFKEY_RECORDER_STATE, &ret_val) < 0) {
1673                 _W("fail to get media sound status, status will be zero"); //LCOV_EXCL_LINE
1674                 ret_val = 0; //LCOV_EXCL_LINE
1675         }
1676
1677         if (CHECK_SOUND(type) && ret_val == VCONFKEY_RECORDER_STATE_RECORDING) {
1678                 _D("voice recording status is RECORDING"); //LCOV_EXCL_LINE
1679                 return true; //LCOV_EXCL_LINE
1680         }
1681
1682         switch (pattern) {
1683         case FEEDBACK_PATTERN_TAP:
1684         case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD:
1685                 if (CHECK_SOUND(type) && !is_touch_sndstatus())
1686                         return true;
1687                 break;
1688         case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
1689                 if (CHECK_SOUND(type) && !is_keytone_sndstatus())
1690                         return true;
1691                 else if (CHECK_VIBRATION(type) && !feedbackstatus)
1692                         return true;
1693                 break;
1694         case FEEDBACK_PATTERN_LOCK:
1695         case FEEDBACK_PATTERN_UNLOCK:
1696         case FEEDBACK_PATTERN_LOCK_SWIPE:
1697         case FEEDBACK_PATTERN_UNLOCK_SWIPE:
1698                 if (CHECK_SOUND(type) && !lock_sndstatus)
1699                         return true;
1700                 break;
1701         default:
1702                 break;
1703         }
1704         return false;
1705 }
1706 //LCOV_EXCL_STOP
1707
1708 //LCOV_EXCL_START
1709 static bool wearable_get_always_off_case(int type, int pattern)
1710 {
1711         int ret_val;
1712
1713         if (CHECK_SOUND(type)) {
1714                 if ((wearable_is_notification_type(pattern) || wearable_is_system_type(pattern)) &&
1715                     callstatus) {
1716                         _W("skip %d sound during call", pattern);
1717                         return true;
1718                 }
1719
1720                 if (goodnight_mode && wearable_is_system_type(pattern)) {
1721                         _W("Skip %d sound in good night mode", pattern);
1722                         return true;
1723                 }
1724
1725                 /* check if the state of voice recorder is recording */
1726                 if (vconf_get_int(VCONFKEY_RECORDER_STATE, &ret_val) == 0 &&
1727                     ret_val == VCONFKEY_RECORDER_STATE_RECORDING) {
1728                         _D("voice recording status is RECORDING");
1729                         return true;
1730                 }
1731
1732                 switch (pattern) {
1733                 case FEEDBACK_PATTERN_TAP:
1734                 case FEEDBACK_PATTERN_MAX_CHARACTER:
1735                 case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD:
1736                         if (!is_touch_sndstatus() || theater_mode || goodnight_mode)
1737                                 return true;
1738                         break;
1739                 case FEEDBACK_PATTERN_SIP ... FEEDBACK_PATTERN_SIP_FJKEY:
1740                         if (theater_mode || goodnight_mode)
1741                                 return true;
1742                         break;
1743                 case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
1744                         if (!is_keytone_sndstatus() || theater_mode || goodnight_mode)
1745                                 return true;
1746                         break;
1747                 case FEEDBACK_PATTERN_LOCK:
1748                 case FEEDBACK_PATTERN_UNLOCK:
1749                         if (!lock_sndstatus)
1750                                 return true;
1751                         break;
1752                 case FEEDBACK_PATTERN_BT_DISCONNECTED:
1753                 case FEEDBACK_PATTERN_LOWBATT:
1754                 case FEEDBACK_PATTERN_LOWBATT_ON_CALL:
1755                 case FEEDBACK_PATTERN_CHARGERCONN:
1756                 case FEEDBACK_PATTERN_CHARGERCONN_ON_CALL:
1757                         if (dnd_mode || theater_mode || goodnight_mode)
1758                                 return true;
1759                         break;
1760                 default:
1761                         break;
1762                 }
1763         } else if (CHECK_VIBRATION(type)) {
1764                 switch (pattern) {
1765                 case FEEDBACK_PATTERN_TAP:
1766                 case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
1767                 case FEEDBACK_PATTERN_HOLD:
1768                 case FEEDBACK_PATTERN_END_EFFECT:
1769                 case FEEDBACK_PATTERN_END_EFFECT_FINE ... FEEDBACK_PATTERN_FUNCTION:
1770                 case FEEDBACK_PATTERN_VOICE_START:
1771                 case FEEDBACK_PATTERN_VOICE_STOP:
1772                 case FEEDBACK_PATTERN_PICKER:
1773                 case FEEDBACK_PATTERN_PICKER_FINISH:
1774                 case FEEDBACK_PATTERN_ON_OFF_SWITCH:
1775                 case FEEDBACK_PATTERN_REORDER:
1776                 case FEEDBACK_PATTERN_CURSOR_MOVE:
1777                         if (!feedbackstatus)
1778                                 return true;
1779                         break;
1780                 case FEEDBACK_PATTERN_LOWBATT:
1781                 case FEEDBACK_PATTERN_LOWBATT_ON_CALL:
1782                 case FEEDBACK_PATTERN_CHARGERCONN:
1783                 case FEEDBACK_PATTERN_CHARGERCONN_ON_CALL:
1784                         if (dnd_mode || theater_mode || goodnight_mode)
1785                                 return true;
1786                         break;
1787                 case FEEDBACK_PATTERN_BT_DISCONNECTED:
1788                         if (goodnight_mode)
1789                                 return true;
1790                 default:
1791                         break;
1792                 }
1793         }
1794         return false;
1795 }
1796 //LCOV_EXCL_STOP
1797
1798 //LCOV_EXCL_START
1799 static bool common_get_always_off_case(int type, int pattern)
1800 {
1801         switch (pattern) {
1802         case FEEDBACK_PATTERN_TAP ... FEEDBACK_PATTERN_SIP:
1803         case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD:
1804                 if (CHECK_SOUND(type) && !is_touch_sndstatus())
1805                         return true;
1806                 break;
1807         case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
1808                 if (CHECK_SOUND(type) && !is_keytone_sndstatus())
1809                         return true;
1810                 break;
1811         default:
1812                 break;
1813         }
1814         return false;
1815 }
1816 //LCOV_EXCL_STOP
1817
1818 static bool profile_get_always_off_case(int type, int pattern)
1819 {
1820         int prof;
1821
1822         prof = get_profile();
1823
1824         if (prof == PROFILE_MOBILE)
1825                 return mobile_get_always_off_case(type, pattern);
1826 //LCOV_EXCL_START
1827         else if (prof == PROFILE_WEARABLE)
1828                 return wearable_get_always_off_case(type, pattern);
1829         else
1830                 return common_get_always_off_case(type, pattern);
1831 //LCOV_EXCL_STOP
1832 }
1833
1834 //LCOV_EXCL_START
1835 static int wearable_get_strong_buzz(int pattern)
1836 {
1837         int changed_pattern = pattern;
1838
1839         switch (pattern) {
1840         case FEEDBACK_PATTERN_BT_DISCONNECTED:
1841                 if (disconnect_alert_mode % BUZZ_CONVERTED)
1842                         changed_pattern = S2;
1843                 break;
1844         case FEEDBACK_PATTERN_SEND_SOS_MESSAGE:
1845         case FEEDBACK_PATTERN_KEEP_THIS_PACE:
1846         case FEEDBACK_PATTERN_SHEALTH_GENTLE_ALERT:
1847         case FEEDBACK_PATTERN_HEALTH_PACE:
1848         case FEEDBACK_PATTERN_GOAL_ACHIEVED:
1849         case FEEDBACK_PATTERN_INACTIVE_TIME:
1850         case FEEDBACK_PATTERN_INACTIVE_FINE:
1851                 if (vib_call_index % BUZZ_CONVERTED)
1852                         changed_pattern = J_WHB;
1853                 break;
1854         case FEEDBACK_PATTERN_SHEALTH_NOTICE:
1855                 if (vib_call_index % BUZZ_CONVERTED)
1856                         changed_pattern = J_WB;
1857                 break;
1858         default:
1859                 break;
1860         }
1861         return changed_pattern;
1862 }
1863 //LCOV_EXCL_STOP
1864
1865 static int profile_get_strong_buzz(int pattern)
1866 {
1867         int prof = get_profile();
1868
1869 //LCOV_EXCL_START
1870         if (prof == PROFILE_WEARABLE)
1871                 return wearable_get_strong_buzz(pattern);
1872 //LCOV_EXCL_STOP
1873         return pattern;
1874 }
1875
1876 //LCOV_EXCL_START
1877 static int mobile_get_strength_type(int type, int pattern)
1878 {
1879         if (CHECK_SOUND(type)) {
1880                 if (pattern == FEEDBACK_PATTERN_TAP)
1881                         return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH;
1882                 else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK)
1883                         return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER;
1884                 else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY)
1885                         return VOLUME_TYPE_RINGTONE;
1886                 else if (camerastatus && shutter_sndstatus && pattern == FEEDBACK_PATTERN_SCREEN_CAPTURE)
1887                         return VOLUME_TYPE_FIXED;
1888                 else
1889                         return VOLUME_TYPE_SYSTEM;
1890         } else if (CHECK_VIBRATION(type)) {
1891                 if (pattern >= FEEDBACK_PATTERN_MESSAGE &&
1892                     pattern <= FEEDBACK_PATTERN_GENERAL)
1893                         return FEEDBACK_LEVEL(noti_level);
1894                 else
1895                         return FEEDBACK_LEVEL(vib_level);
1896         }
1897
1898         return -EINVAL;
1899 }
1900 //LCOV_EXCL_STOP
1901
1902 //LCOV_EXCL_START
1903 static int wearable_get_strength_type(int type, int pattern)
1904 {
1905         if (CHECK_SOUND(type)) {
1906                 if (pattern == FEEDBACK_PATTERN_TAP)
1907                         return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH;
1908                 else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK)
1909                         return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER;
1910                 else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY || pattern == FEEDBACK_PATTERN_SILENT_OFF ||
1911             (pattern >= FEEDBACK_PATTERN_RING_1 && pattern <= FEEDBACK_PATTERN_RING_8_STRONG_BUZZ))
1912                         return VOLUME_TYPE_RINGTONE;
1913                 else if (camerastatus && shutter_sndstatus && pattern == FEEDBACK_PATTERN_SCREEN_CAPTURE)
1914                         return VOLUME_TYPE_FIXED;
1915                 else if (pattern == FEEDBACK_PATTERN_INACTIVE_FINE ||
1916             pattern == FEEDBACK_PATTERN_INACTIVE_TIME ||
1917             pattern == FEEDBACK_PATTERN_HEALTH_PACE)
1918                         return VOLUME_TYPE_NOTIFICATION;
1919                 else if (pattern == FEEDBACK_PATTERN_GOAL_ACHIEVED ||
1920             pattern == FEEDBACK_PATTERN_KEEP_THIS_PACE ||
1921             pattern == FEEDBACK_PATTERN_EXERCISE_COUNT ||
1922             pattern == FEEDBACK_PATTERN_START_CUE)
1923                         return VOLUME_TYPE_MEDIA;
1924                 return VOLUME_TYPE_SYSTEM;
1925         } else if (CHECK_VIBRATION(type)) {
1926                 if ((pattern >= FEEDBACK_PATTERN_TAP && pattern <= FEEDBACK_PATTERN_HW_HOLD) ||
1927             pattern == FEEDBACK_PATTERN_END_EFFECT ||
1928             (pattern == FEEDBACK_PATTERN_VOICE_START || pattern == FEEDBACK_PATTERN_VOICE_STOP) ||
1929             (pattern >= FEEDBACK_PATTERN_END_EFFECT_FINE && pattern <= FEEDBACK_PATTERN_FUNCTION) ||
1930             (pattern == FEEDBACK_PATTERN_ON_OFF_SWITCH) ||
1931             (pattern == FEEDBACK_PATTERN_CURSOR_MOVE || pattern == FEEDBACK_PATTERN_PICKER)) {
1932                         _D("use default level");
1933                         return FEEDBACK_LEVEL(DEFAULT_VIB_LEVEL);
1934                 }
1935                 if (pattern == FEEDBACK_PATTERN_FIND_MY_GEAR)
1936             return MAX_VIB_LEVEL;
1937
1938                 return FEEDBACK_LEVEL(noti_level);
1939         }
1940         return -EINVAL;
1941 }
1942 //LCOV_EXCL_STOP
1943
1944 //LCOV_EXCL_START
1945 static int common_get_strength_type(int type, int pattern)
1946 {
1947         if (CHECK_SOUND(type)) {
1948                 if (pattern == FEEDBACK_PATTERN_TAP)
1949                         return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH;
1950                 else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK)
1951                         return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER;
1952                 else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY)
1953                         return VOLUME_TYPE_RINGTONE;
1954                 else
1955                         return VOLUME_TYPE_SYSTEM;
1956         } else if (CHECK_VIBRATION(type)) {
1957                 return FEEDBACK_LEVEL(DEFAULT_VIB_LEVEL);
1958         }
1959
1960         return -EINVAL;
1961 }
1962 //LCOV_EXCL_STOP
1963
1964 static int profile_get_strength_type(int type, int pattern)
1965 {
1966         int prof;
1967
1968         prof = get_profile();
1969
1970         if (prof == PROFILE_MOBILE)
1971                 return mobile_get_strength_type(type, pattern);
1972 //LCOV_EXCL_START
1973         else if (prof == PROFILE_WEARABLE)
1974                 return wearable_get_strength_type(type, pattern);
1975         else
1976                 return common_get_strength_type(type, pattern);
1977 //LCOV_EXCL_STOP
1978 }
1979
1980 //LCOV_EXCL_START
1981 static char *wearable_get_path(int pattern)
1982 {
1983         char *data = NULL;
1984
1985         if (pattern >= FEEDBACK_PATTERN_RING_1 && pattern <= FEEDBACK_PATTERN_RING_8_STRONG_BUZZ)
1986                 data = snd_call_path;
1987         else if (pattern >= FEEDBACK_PATTERN_NOTIFICATION_1 && pattern <= FEEDBACK_PATTERN_NOTIFICATION_8_STRONG_BUZZ)
1988                 data = snd_noti_path;
1989         return data;
1990 }
1991 //LCOV_EXCL_STOP
1992
1993 static char *profile_get_path(int pattern)
1994 {
1995         int prof = get_profile();
1996
1997 //LCOV_EXCL_START
1998         if (prof == PROFILE_WEARABLE)
1999                 return wearable_get_path(pattern);
2000 //LCOV_EXCL_STOP
2001         return NULL;
2002 }
2003
2004 static const struct profile_ops feedback_profile_ops = {
2005         .profile               = profile_get_name,
2006         .init                  = profile_init,
2007         .exit                  = profile_exit,
2008         .get_switched_pattern  = profile_get_switched_pattern,
2009         .get_always_alert_case = profile_get_always_alert_case,
2010         .get_always_off_case   = profile_get_always_off_case,
2011         .get_strength_type     = profile_get_strength_type,
2012         .get_priority          = profile_get_priority,
2013         .get_strong_buzz       = profile_get_strong_buzz,
2014         .is_notification_type  = profile_is_notification_type,
2015         .max_type              = FEEDBACK_TYPE_END,
2016         .max_pattern           = FEEDBACK_PATTERN_INTERNAL_END,
2017         .str_type              = profile_str_type,
2018         .get_num_of_pattern    = profile_get_num_of_pattern,
2019         .str_pattern           = profile_str_pattern,
2020         .get_pattern_enum      = profile_get_pattern_enum,
2021         .get_path              = profile_get_path,
2022 };
2023
2024 PROFILE_OPS_REGISTER(&feedback_profile_ops);