3 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
22 #include <system_info.h>
25 #include "feedback-ids-internal.h"
30 #ifndef VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL
31 #define VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL "db/setting/sound/vibrate_when_notification"
33 #ifndef VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL
34 #define VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL "db/setting/sound/haptic_feedback_on"
38 static const char *profile_str_type[] = {
40 "FEEDBACK_TYPE_SOUND",
41 "FEEDBACK_TYPE_VIBRATION",
44 static const struct pattern_field mobile_str_pattern[] = {
45 {"FEEDBACK_PATTERN_TAP", FEEDBACK_PATTERN_TAP},
46 {"FEEDBACK_PATTERN_SIP", FEEDBACK_PATTERN_SIP},
48 {"FEEDBACK_PATTERN_KEY0", FEEDBACK_PATTERN_KEY0},
49 {"FEEDBACK_PATTERN_KEY1", FEEDBACK_PATTERN_KEY1},
50 {"FEEDBACK_PATTERN_KEY2", FEEDBACK_PATTERN_KEY2},
51 {"FEEDBACK_PATTERN_KEY3", FEEDBACK_PATTERN_KEY3},
52 {"FEEDBACK_PATTERN_KEY4", FEEDBACK_PATTERN_KEY4},
53 {"FEEDBACK_PATTERN_KEY5", FEEDBACK_PATTERN_KEY5},
54 {"FEEDBACK_PATTERN_KEY6", FEEDBACK_PATTERN_KEY6},
55 {"FEEDBACK_PATTERN_KEY7", FEEDBACK_PATTERN_KEY7},
56 {"FEEDBACK_PATTERN_KEY8", FEEDBACK_PATTERN_KEY8},
57 {"FEEDBACK_PATTERN_KEY9", FEEDBACK_PATTERN_KEY9},
58 {"FEEDBACK_PATTERN_KEY_STAR", FEEDBACK_PATTERN_KEY_STAR},
59 {"FEEDBACK_PATTERN_KEY_SHARP", FEEDBACK_PATTERN_KEY_SHARP},
60 {"FEEDBACK_PATTERN_KEY_BACK", FEEDBACK_PATTERN_KEY_BACK},
61 {"FEEDBACK_PATTERN_HOLD", FEEDBACK_PATTERN_HOLD},
63 {"FEEDBACK_PATTERN_HW_TAP", FEEDBACK_PATTERN_HW_TAP},
64 {"FEEDBACK_PATTERN_HW_HOLD", FEEDBACK_PATTERN_HW_HOLD},
66 {"FEEDBACK_PATTERN_MESSAGE", FEEDBACK_PATTERN_MESSAGE},
67 {"FEEDBACK_PATTERN_MESSAGE_ON_CALL", FEEDBACK_PATTERN_MESSAGE_ON_CALL},
68 {"FEEDBACK_PATTERN_EMAIL", FEEDBACK_PATTERN_EMAIL},
69 {"FEEDBACK_PATTERN_EMAIL_ON_CALL", FEEDBACK_PATTERN_EMAIL_ON_CALL},
70 {"FEEDBACK_PATTERN_WAKEUP", FEEDBACK_PATTERN_WAKEUP},
71 {"FEEDBACK_PATTERN_WAKEUP_ON_CALL", FEEDBACK_PATTERN_WAKEUP_ON_CALL},
72 {"FEEDBACK_PATTERN_SCHEDULE", FEEDBACK_PATTERN_SCHEDULE},
73 {"FEEDBACK_PATTERN_SCHEDULE_ON_CALL", FEEDBACK_PATTERN_SCHEDULE_ON_CALL},
74 {"FEEDBACK_PATTERN_TIMER", FEEDBACK_PATTERN_TIMER},
75 {"FEEDBACK_PATTERN_TIMER_ON_CALL", FEEDBACK_PATTERN_TIMER_ON_CALL},
76 {"FEEDBACK_PATTERN_GENERAL", FEEDBACK_PATTERN_GENERAL},
77 {"FEEDBACK_PATTERN_GENERAL_ON_CALL", FEEDBACK_PATTERN_GENERAL_ON_CALL},
79 {"FEEDBACK_PATTERN_POWERON", FEEDBACK_PATTERN_POWERON},
80 {"FEEDBACK_PATTERN_POWEROFF", FEEDBACK_PATTERN_POWEROFF},
81 {"FEEDBACK_PATTERN_CHARGERCONN", FEEDBACK_PATTERN_CHARGERCONN},
82 {"FEEDBACK_PATTERN_CHARGERCONN_ON_CALL", FEEDBACK_PATTERN_CHARGERCONN_ON_CALL},
83 {"FEEDBACK_PATTERN_CHARGING_ERROR", FEEDBACK_PATTERN_CHARGING_ERROR},
84 {"FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL", FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL},
85 {"FEEDBACK_PATTERN_FULLCHARGED", FEEDBACK_PATTERN_FULLCHARGED},
86 {"FEEDBACK_PATTERN_FULLCHARGED_ON_CALL", FEEDBACK_PATTERN_FULLCHARGED_ON_CALL},
87 {"FEEDBACK_PATTERN_LOWBATT", FEEDBACK_PATTERN_LOWBATT},
88 {"FEEDBACK_PATTERN_LOWBATT_ON_CALL", FEEDBACK_PATTERN_LOWBATT_ON_CALL},
89 {"FEEDBACK_PATTERN_LOCK", FEEDBACK_PATTERN_LOCK},
90 {"FEEDBACK_PATTERN_UNLOCK", FEEDBACK_PATTERN_UNLOCK},
92 {"FEEDBACK_PATTERN_OUTGOING_CALL", FEEDBACK_PATTERN_OUTGOING_CALL},
94 {"FEEDBACK_PATTERN_VIBRATION_ON", FEEDBACK_PATTERN_VIBRATION_ON},
95 {"FEEDBACK_PATTERN_SILENT_OFF", FEEDBACK_PATTERN_SILENT_OFF},
96 {"FEEDBACK_PATTERN_BT_CONNECTED", FEEDBACK_PATTERN_BT_CONNECTED},
97 {"FEEDBACK_PATTERN_BT_DISCONNECTED", FEEDBACK_PATTERN_BT_DISCONNECTED},
99 {"FEEDBACK_PATTERN_SCREEN_CAPTURE", FEEDBACK_PATTERN_SCREEN_CAPTURE},
100 {"FEEDBACK_PATTERN_LIST_REORDER", FEEDBACK_PATTERN_LIST_REORDER},
101 {"FEEDBACK_PATTERN_LIST_SLIDER", FEEDBACK_PATTERN_LIST_SLIDER},
102 {"FEEDBACK_PATTERN_VOLUME_KEY", FEEDBACK_PATTERN_VOLUME_KEY},
104 {"FEEDBACK_PATTERN_SEND_SOS_MESSAGE", FEEDBACK_PATTERN_SEND_SOS_MESSAGE},
105 {"FEEDBACK_PATTERN_SYSTEM_SHORT", FEEDBACK_PATTERN_SYSTEM_SHORT},
106 {"FEEDBACK_PATTERN_SYSTEM_ERROR", FEEDBACK_PATTERN_SYSTEM_ERROR},
107 {"FEEDBACK_PATTERN_SYSTEM_LONG", FEEDBACK_PATTERN_SYSTEM_LONG},
108 {"FEEDBACK_PATTERN_SYSTEM_MID", FEEDBACK_PATTERN_SYSTEM_MID},
109 {"FEEDBACK_PATTERN_RINGER", FEEDBACK_PATTERN_RINGER},
110 {"FEEDBACK_PATTERN_NOTIFICATION", FEEDBACK_PATTERN_NOTIFICATION},
113 static const struct pattern_field wearable_str_pattern[] = {
114 {"FEEDBACK_PATTERN_TAP", FEEDBACK_PATTERN_TAP},
115 {"FEEDBACK_PATTERN_SIP", FEEDBACK_PATTERN_SIP},
117 {"FEEDBACK_PATTERN_KEY0", FEEDBACK_PATTERN_KEY0},
118 {"FEEDBACK_PATTERN_KEY1", FEEDBACK_PATTERN_KEY1},
119 {"FEEDBACK_PATTERN_KEY2", FEEDBACK_PATTERN_KEY2},
120 {"FEEDBACK_PATTERN_KEY3", FEEDBACK_PATTERN_KEY3},
121 {"FEEDBACK_PATTERN_KEY4", FEEDBACK_PATTERN_KEY4},
122 {"FEEDBACK_PATTERN_KEY5", FEEDBACK_PATTERN_KEY5},
123 {"FEEDBACK_PATTERN_KEY6", FEEDBACK_PATTERN_KEY6},
124 {"FEEDBACK_PATTERN_KEY7", FEEDBACK_PATTERN_KEY7},
125 {"FEEDBACK_PATTERN_KEY8", FEEDBACK_PATTERN_KEY8},
126 {"FEEDBACK_PATTERN_KEY9", FEEDBACK_PATTERN_KEY9},
127 {"FEEDBACK_PATTERN_KEY_STAR", FEEDBACK_PATTERN_KEY_STAR},
128 {"FEEDBACK_PATTERN_KEY_SHARP", FEEDBACK_PATTERN_KEY_SHARP},
129 {"FEEDBACK_PATTERN_KEY_BACK", FEEDBACK_PATTERN_KEY_BACK},
130 {"FEEDBACK_PATTERN_HOLD", FEEDBACK_PATTERN_HOLD},
132 {"FEEDBACK_PATTERN_HW_TAP", FEEDBACK_PATTERN_HW_TAP},
133 {"FEEDBACK_PATTERN_HW_HOLD", FEEDBACK_PATTERN_HW_HOLD},
135 {"FEEDBACK_PATTERN_MESSAGE", FEEDBACK_PATTERN_MESSAGE},
136 {"FEEDBACK_PATTERN_MESSAGE_ON_CALL", FEEDBACK_PATTERN_MESSAGE_ON_CALL},
137 {"FEEDBACK_PATTERN_EMAIL", FEEDBACK_PATTERN_EMAIL},
138 {"FEEDBACK_PATTERN_EMAIL_ON_CALL", FEEDBACK_PATTERN_EMAIL_ON_CALL},
139 {"FEEDBACK_PATTERN_WAKEUP", FEEDBACK_PATTERN_WAKEUP},
140 {"FEEDBACK_PATTERN_WAKEUP_ON_CALL", FEEDBACK_PATTERN_WAKEUP_ON_CALL},
141 {"FEEDBACK_PATTERN_SCHEDULE", FEEDBACK_PATTERN_SCHEDULE},
142 {"FEEDBACK_PATTERN_SCHEDULE_ON_CALL", FEEDBACK_PATTERN_SCHEDULE_ON_CALL},
143 {"FEEDBACK_PATTERN_TIMER", FEEDBACK_PATTERN_TIMER},
144 {"FEEDBACK_PATTERN_TIMER_ON_CALL", FEEDBACK_PATTERN_TIMER_ON_CALL},
145 {"FEEDBACK_PATTERN_GENERAL", FEEDBACK_PATTERN_GENERAL},
146 {"FEEDBACK_PATTERN_GENERAL_ON_CALL", FEEDBACK_PATTERN_GENERAL_ON_CALL},
148 {"FEEDBACK_PATTERN_POWERON", FEEDBACK_PATTERN_POWERON},
149 {"FEEDBACK_PATTERN_POWEROFF", FEEDBACK_PATTERN_POWEROFF},
150 {"FEEDBACK_PATTERN_CHARGERCONN", FEEDBACK_PATTERN_CHARGERCONN},
151 {"FEEDBACK_PATTERN_CHARGERCONN_ON_CALL", FEEDBACK_PATTERN_CHARGERCONN_ON_CALL},
152 {"FEEDBACK_PATTERN_CHARGING_ERROR", FEEDBACK_PATTERN_CHARGING_ERROR},
153 {"FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL", FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL},
154 {"FEEDBACK_PATTERN_FULLCHARGED", FEEDBACK_PATTERN_FULLCHARGED},
155 {"FEEDBACK_PATTERN_FULLCHARGED_ON_CALL", FEEDBACK_PATTERN_FULLCHARGED_ON_CALL},
156 {"FEEDBACK_PATTERN_LOWBATT", FEEDBACK_PATTERN_LOWBATT},
157 {"FEEDBACK_PATTERN_LOWBATT_ON_CALL", FEEDBACK_PATTERN_LOWBATT_ON_CALL},
158 {"FEEDBACK_PATTERN_LOCK", FEEDBACK_PATTERN_LOCK},
159 {"FEEDBACK_PATTERN_UNLOCK", FEEDBACK_PATTERN_UNLOCK},
161 {"FEEDBACK_PATTERN_VIBRATION_ON", FEEDBACK_PATTERN_VIBRATION_ON},
162 {"FEEDBACK_PATTERN_SILENT_OFF", FEEDBACK_PATTERN_SILENT_OFF},
163 {"FEEDBACK_PATTERN_BT_CONNECTED", FEEDBACK_PATTERN_BT_CONNECTED},
164 {"FEEDBACK_PATTERN_BT_DISCONNECTED", FEEDBACK_PATTERN_BT_DISCONNECTED},
166 {"FEEDBACK_PATTERN_SCREEN_CAPTURE", FEEDBACK_PATTERN_SCREEN_CAPTURE},
167 {"FEEDBACK_PATTERN_LIST_REORDER", FEEDBACK_PATTERN_LIST_REORDER},
168 {"FEEDBACK_PATTERN_LIST_SLIDER", FEEDBACK_PATTERN_LIST_SLIDER},
169 {"FEEDBACK_PATTERN_VOLUME_KEY", FEEDBACK_PATTERN_VOLUME_KEY},
171 {"FEEDBACK_PATTERN_SEND_SOS_MESSAGE", FEEDBACK_PATTERN_SEND_SOS_MESSAGE},
172 {"FEEDBACK_PATTERN_SYSTEM_SHORT", FEEDBACK_PATTERN_SYSTEM_SHORT},
173 {"FEEDBACK_PATTERN_SYSTEM_ERROR", FEEDBACK_PATTERN_SYSTEM_ERROR},
174 {"FEEDBACK_PATTERN_SYSTEM_LONG", FEEDBACK_PATTERN_SYSTEM_LONG},
175 {"FEEDBACK_PATTERN_SYSTEM_MID", FEEDBACK_PATTERN_SYSTEM_MID},
176 {"FEEDBACK_PATTERN_RINGER", FEEDBACK_PATTERN_RINGER},
177 {"FEEDBACK_PATTERN_NOTIFICATION", FEEDBACK_PATTERN_NOTIFICATION},
180 static const struct pattern_field common_str_pattern[] = {
181 {"FEEDBACK_PATTERN_TAP", FEEDBACK_PATTERN_TAP},
182 {"FEEDBACK_PATTERN_SIP", FEEDBACK_PATTERN_SIP},
184 {"FEEDBACK_PATTERN_KEY0", FEEDBACK_PATTERN_KEY0},
185 {"FEEDBACK_PATTERN_KEY1", FEEDBACK_PATTERN_KEY1},
186 {"FEEDBACK_PATTERN_KEY2", FEEDBACK_PATTERN_KEY2},
187 {"FEEDBACK_PATTERN_KEY3", FEEDBACK_PATTERN_KEY3},
188 {"FEEDBACK_PATTERN_KEY4", FEEDBACK_PATTERN_KEY4},
189 {"FEEDBACK_PATTERN_KEY5", FEEDBACK_PATTERN_KEY5},
190 {"FEEDBACK_PATTERN_KEY6", FEEDBACK_PATTERN_KEY6},
191 {"FEEDBACK_PATTERN_KEY7", FEEDBACK_PATTERN_KEY7},
192 {"FEEDBACK_PATTERN_KEY8", FEEDBACK_PATTERN_KEY8},
193 {"FEEDBACK_PATTERN_KEY9", FEEDBACK_PATTERN_KEY9},
194 {"FEEDBACK_PATTERN_KEY_STAR", FEEDBACK_PATTERN_KEY_STAR},
195 {"FEEDBACK_PATTERN_KEY_SHARP", FEEDBACK_PATTERN_KEY_SHARP},
196 {"FEEDBACK_PATTERN_KEY_BACK", FEEDBACK_PATTERN_KEY_BACK},
197 {"FEEDBACK_PATTERN_HOLD", FEEDBACK_PATTERN_HOLD},
199 {"FEEDBACK_PATTERN_HW_TAP", FEEDBACK_PATTERN_HW_TAP},
200 {"FEEDBACK_PATTERN_HW_HOLD", FEEDBACK_PATTERN_HW_HOLD},
202 {"FEEDBACK_PATTERN_MESSAGE", FEEDBACK_PATTERN_MESSAGE},
204 {"FEEDBACK_PATTERN_EMAIL", FEEDBACK_PATTERN_EMAIL},
206 {"FEEDBACK_PATTERN_WAKEUP", FEEDBACK_PATTERN_WAKEUP},
208 {"FEEDBACK_PATTERN_SCHEDULE", FEEDBACK_PATTERN_SCHEDULE},
210 {"FEEDBACK_PATTERN_TIMER", FEEDBACK_PATTERN_TIMER},
212 {"FEEDBACK_PATTERN_GENERAL", FEEDBACK_PATTERN_GENERAL},
214 {"FEEDBACK_PATTERN_POWERON", FEEDBACK_PATTERN_POWERON},
215 {"FEEDBACK_PATTERN_POWEROFF", FEEDBACK_PATTERN_POWEROFF},
216 {"FEEDBACK_PATTERN_CHARGERCONN", FEEDBACK_PATTERN_CHARGERCONN},
218 {"FEEDBACK_PATTERN_CHARGING_ERROR", FEEDBACK_PATTERN_CHARGING_ERROR},
220 {"FEEDBACK_PATTERN_FULLCHARGED", FEEDBACK_PATTERN_FULLCHARGED},
222 {"FEEDBACK_PATTERN_LOWBATT", FEEDBACK_PATTERN_LOWBATT},
224 {"FEEDBACK_PATTERN_LOCK", FEEDBACK_PATTERN_LOCK},
225 {"FEEDBACK_PATTERN_UNLOCK", FEEDBACK_PATTERN_UNLOCK},
227 {"FEEDBACK_PATTERN_VIBRATION_ON", FEEDBACK_PATTERN_VIBRATION_ON},
228 {"FEEDBACK_PATTERN_SILENT_OFF", FEEDBACK_PATTERN_SILENT_OFF},
229 {"FEEDBACK_PATTERN_BT_CONNECTED", FEEDBACK_PATTERN_BT_CONNECTED},
230 {"FEEDBACK_PATTERN_BT_DISCONNECTED", FEEDBACK_PATTERN_BT_DISCONNECTED},
232 {"FEEDBACK_PATTERN_LIST_REORDER", FEEDBACK_PATTERN_LIST_REORDER},
233 {"FEEDBACK_PATTERN_LIST_SLIDER", FEEDBACK_PATTERN_LIST_SLIDER},
234 {"FEEDBACK_PATTERN_VOLUME_KEY", FEEDBACK_PATTERN_VOLUME_KEY},
240 PROFILE_WEARABLE = 2,
244 static int callstatus;
245 static int lock_sndstatus;
246 static int camerastatus;
247 static int shutter_sndstatus;
248 static int noti_vibstatus;
249 static int vib_level;
250 static int noti_level;
251 static int feedbackstatus;
253 static char *profile_name = NULL;
255 #define PROFILE "tizen.org/feature/profile"
256 #define PROFILE_MOBILE_STRING "mobile"
257 #define PROFILE_WEARABLE_STRING "wearable"
258 #define PROFILE_COMMON_STRING "common"
260 static profile_e get_profile(void)
264 char *profile = NULL;
270 ret = system_info_get_platform_string(PROFILE, &profile);
272 _E("Cannot get profile(%d)", ret);
276 len = strlen(profile) + 1;
277 if (!strncmp(PROFILE_MOBILE_STRING, profile, len))
278 set = PROFILE_MOBILE;
279 else if (!strncmp(PROFILE_WEARABLE_STRING, profile, len))
280 set = PROFILE_WEARABLE;
282 set = PROFILE_COMMON;
288 static char *profile_get_name()
295 prof = get_profile();
297 if (prof == PROFILE_MOBILE)
298 profile_name = PROFILE_MOBILE_STRING;
299 else if (prof == PROFILE_WEARABLE)
300 profile_name = PROFILE_WEARABLE_STRING;
302 profile_name = PROFILE_COMMON_STRING;
307 /* Return how many patterns profile supports */
308 static int profile_get_num_of_pattern()
312 prof = get_profile();
314 if (prof == PROFILE_MOBILE)
315 return ARR_SIZE(mobile_str_pattern);
316 else if (prof == PROFILE_WEARABLE)
317 return ARR_SIZE(wearable_str_pattern);
319 return ARR_SIZE(common_str_pattern);
322 static const char *profile_str_pattern(int pattern)
327 prof = get_profile();
329 if (prof == PROFILE_MOBILE) {
330 for (i = 0; i < profile_get_num_of_pattern(); i++) {
331 if (pattern == mobile_str_pattern[i].id) {
332 return mobile_str_pattern[i].string;
335 } else if (prof == PROFILE_WEARABLE) {
336 for (i = 0; i < profile_get_num_of_pattern(); i++) {
337 if (pattern == wearable_str_pattern[i].id)
338 return wearable_str_pattern[i].string;
341 for (i = 0; i < profile_get_num_of_pattern(); i++) {
342 if (pattern == common_str_pattern[i].id)
343 return common_str_pattern[i].string;
350 static int profile_get_pattern_enum(char *pattern)
356 prof = get_profile();
358 len = strlen(pattern);
359 if (prof == PROFILE_MOBILE) {
360 for (i = 0; i < profile_get_num_of_pattern(); i++) {
361 if (!strncmp(pattern, mobile_str_pattern[i].string, len))
362 return mobile_str_pattern[i].id;
364 } else if (prof == PROFILE_WEARABLE) {
365 for (i = 0; i < profile_get_num_of_pattern(); i++) {
366 if (!strncmp(pattern, wearable_str_pattern[i].string, len))
367 return wearable_str_pattern[i].id;
370 for (i = 0; i < profile_get_num_of_pattern(); i++) {
371 if (!strncmp(pattern, common_str_pattern[i].string, len))
372 return common_str_pattern[i].id;
379 //LCOV_EXCL_START Not called Callback
380 static void feedback_callstatus_cb(keynode_t *key, void* data)
382 callstatus = vconf_keynode_get_int(key);
385 static void feedback_lock_sndstatus_cb(keynode_t *key, void* data)
387 lock_sndstatus = vconf_keynode_get_bool(key);
390 static void feedback_camerastatus_cb(keynode_t *key, void* data)
392 camerastatus = vconf_keynode_get_int(key);
395 static void feedback_noti_vibstatus_cb(keynode_t *key, void* data)
397 noti_vibstatus = vconf_keynode_get_bool(key);
400 static void feedback_vib_cb(keynode_t *key, void* data)
402 vib_level = vconf_keynode_get_int(key);
405 static void feedback_noti_cb(keynode_t *key, void* data)
407 noti_level = vconf_keynode_get_int(key);
410 static void feedback_feedbackstatus_cb(keynode_t *key, void* data)
412 feedbackstatus = vconf_keynode_get_bool(key);
416 static void profile_init(void)
420 prof = get_profile();
422 if (prof == PROFILE_COMMON)
424 else if (prof == PROFILE_MOBILE) {
425 if (vconf_get_bool(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, &lock_sndstatus) < 0)
426 _W("VCONFKEY_SETAPPL_SOUND_LOCK_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
427 vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, feedback_lock_sndstatus_cb, NULL);
430 /* check call status */
431 if (vconf_get_int(VCONFKEY_CALL_STATE, &callstatus) < 0)
432 _W("VCONFKEY_CALL_STATE ==> FAIL!!"); //LCOV_EXCL_LINE
434 /* check camera status */
435 if (vconf_get_int(VCONFKEY_CAMERA_STATE, &camerastatus) < 0)
436 _W("VCONFKEY_CAMERA_STATE ==> FAIL!!"); //LCOV_EXCL_LINE
438 /* shutter sound policy */
439 /* This vconf is read just once, because this value is not changed in running time. */
440 if (vconf_get_int(VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY, &shutter_sndstatus) < 0)
441 _W("VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY ==> FAIL!!"); //LCOV_EXCL_LINE
443 /* check vibration status */
444 if (vconf_get_bool(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, ¬i_vibstatus) < 0)
445 _W("VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
447 /* check vib_level */
448 if (vconf_get_int(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, &vib_level) < 0)
449 _W("VCONFKEY_FEEDBACK_VIBRATION_LEVEL_INT ==> FAIL!!"); //LCOV_EXCL_LINE
451 /* check noti_level */
452 if (vconf_get_int(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, ¬i_level) < 0)
453 _W("VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT ==> FAIL!!"); //LCOV_EXCL_LINE
456 if (vconf_get_bool(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, &feedbackstatus) < 0)
457 _W("VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
459 /* add watch for status value */
460 vconf_notify_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb, NULL);
461 vconf_notify_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb, NULL);
462 vconf_notify_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb, NULL);
463 vconf_notify_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb, NULL);
464 vconf_notify_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb, NULL);
465 vconf_notify_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb, NULL);
468 static void profile_exit(void)
472 prof = get_profile();
474 if (prof == PROFILE_COMMON)
476 else if (prof == PROFILE_MOBILE)
477 vconf_ignore_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, feedback_lock_sndstatus_cb);
480 vconf_ignore_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb);
481 vconf_ignore_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb);
482 vconf_ignore_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb);
483 vconf_ignore_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb);
484 vconf_ignore_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb);
485 vconf_ignore_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb);
488 static bool profile_get_switched_pattern(int pattern, int *switched)
492 prof = get_profile();
494 if (prof == PROFILE_COMMON)
500 if (callstatus == VCONFKEY_CALL_OFF)
503 /* in case of call connected or connecting */
504 _D("Call status is connected or connecting."); //LCOV_EXCL_LINE
505 if (pattern == FEEDBACK_PATTERN_MESSAGE)
506 *switched = FEEDBACK_PATTERN_MESSAGE_ON_CALL;
507 else if (pattern == FEEDBACK_PATTERN_EMAIL)
508 *switched = FEEDBACK_PATTERN_EMAIL_ON_CALL;
509 else if (pattern == FEEDBACK_PATTERN_WAKEUP)
510 *switched = FEEDBACK_PATTERN_WAKEUP_ON_CALL;
511 else if (pattern == FEEDBACK_PATTERN_SCHEDULE)
512 *switched = FEEDBACK_PATTERN_SCHEDULE_ON_CALL;
513 else if (pattern == FEEDBACK_PATTERN_TIMER)
514 *switched = FEEDBACK_PATTERN_TIMER_ON_CALL;
515 else if (pattern == FEEDBACK_PATTERN_GENERAL)
516 *switched = FEEDBACK_PATTERN_GENERAL_ON_CALL;
517 else if (pattern == FEEDBACK_PATTERN_CHARGERCONN)
518 *switched = FEEDBACK_PATTERN_CHARGERCONN_ON_CALL;
519 else if (pattern == FEEDBACK_PATTERN_CHARGING_ERROR)
520 *switched = FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL;
521 else if (pattern == FEEDBACK_PATTERN_FULLCHARGED)
522 *switched = FEEDBACK_PATTERN_FULLCHARGED_ON_CALL;
523 else if (pattern == FEEDBACK_PATTERN_LOWBATT)
524 *switched = FEEDBACK_PATTERN_LOWBATT_ON_CALL;
531 static bool mobile_is_notification_type(int pattern)
534 case FEEDBACK_PATTERN_WAKEUP:
535 case FEEDBACK_PATTERN_WAKEUP_ON_CALL:
536 case FEEDBACK_PATTERN_TIMER:
537 case FEEDBACK_PATTERN_TIMER_ON_CALL:
538 case FEEDBACK_PATTERN_MESSAGE ... FEEDBACK_PATTERN_EMAIL_ON_CALL:
539 case FEEDBACK_PATTERN_SCHEDULE:
540 case FEEDBACK_PATTERN_SCHEDULE_ON_CALL:
541 case FEEDBACK_PATTERN_GENERAL ... FEEDBACK_PATTERN_LOWBATT_ON_CALL:
547 static bool wearable_is_notification_type(int pattern)
550 case FEEDBACK_PATTERN_WAKEUP:
551 case FEEDBACK_PATTERN_WAKEUP_ON_CALL:
552 case FEEDBACK_PATTERN_TIMER:
553 case FEEDBACK_PATTERN_TIMER_ON_CALL:
555 case FEEDBACK_PATTERN_MESSAGE ... FEEDBACK_PATTERN_EMAIL_ON_CALL:
556 case FEEDBACK_PATTERN_SCHEDULE:
557 case FEEDBACK_PATTERN_SCHEDULE_ON_CALL:
558 case FEEDBACK_PATTERN_GENERAL ... FEEDBACK_PATTERN_LOWBATT_ON_CALL:
564 static bool profile_is_notification_type(int pattern)
568 prof = get_profile();
570 if (prof == PROFILE_MOBILE)
571 return mobile_is_notification_type(pattern);
572 else if (prof == PROFILE_WEARABLE)
573 return wearable_is_notification_type(pattern);
578 static int mobile_get_priority(int pattern)
581 case FEEDBACK_PATTERN_TAP ... FEEDBACK_PATTERN_KEY_BACK:
583 case FEEDBACK_PATTERN_WAKEUP:
584 case FEEDBACK_PATTERN_SCHEDULE:
585 case FEEDBACK_PATTERN_TIMER:
586 return PRIORITY_HIGH;
587 case FEEDBACK_PATTERN_SEND_SOS_MESSAGE:
588 case FEEDBACK_PATTERN_RINGER:
592 return PRIORITY_MIDDLE;
595 static int profile_get_priority(int pattern)
599 prof = get_profile();
601 if (prof == PROFILE_MOBILE)
602 return mobile_get_priority(pattern);
604 return PRIORITY_MIDDLE;
607 static bool mobile_get_always_alert_case(int type, int pattern)
610 case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
611 case FEEDBACK_PATTERN_HOLD:
612 if (CHECK_VIBRATION(type) && feedbackstatus)
615 case FEEDBACK_PATTERN_SIP:
616 if (CHECK_VIBRATION(type))
619 case FEEDBACK_PATTERN_MESSAGE:
620 case FEEDBACK_PATTERN_EMAIL:
621 if (CHECK_VIBRATION(type) && noti_vibstatus)
624 case FEEDBACK_PATTERN_TIMER:
625 case FEEDBACK_PATTERN_TIMER_ON_CALL:
626 if (CHECK_VIBRATION(type))
629 case FEEDBACK_PATTERN_WAKEUP:
630 case FEEDBACK_PATTERN_WAKEUP_ON_CALL:
632 case FEEDBACK_PATTERN_MESSAGE_ON_CALL:
633 case FEEDBACK_PATTERN_EMAIL_ON_CALL:
634 case FEEDBACK_PATTERN_GENERAL_ON_CALL:
636 case FEEDBACK_PATTERN_CHARGERCONN_ON_CALL:
637 case FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL:
638 case FEEDBACK_PATTERN_LOWBATT_ON_CALL:
639 /* no matter sound profile */
640 if (CHECK_VIBRATION(type))
643 case FEEDBACK_PATTERN_SEND_SOS_MESSAGE:
644 case FEEDBACK_PATTERN_OUTGOING_CALL:
646 case FEEDBACK_PATTERN_SCREEN_CAPTURE:
647 if (CHECK_SOUND(type) && camerastatus && shutter_sndstatus)
650 case FEEDBACK_PATTERN_RINGER:
658 static bool wearable_get_always_alert_case(int type, int pattern)
660 if (CHECK_SOUND(type)) {
662 case FEEDBACK_PATTERN_WAKEUP:
663 case FEEDBACK_PATTERN_WAKEUP_ON_CALL:
665 case FEEDBACK_PATTERN_MESSAGE_ON_CALL:
666 case FEEDBACK_PATTERN_EMAIL_ON_CALL:
667 case FEEDBACK_PATTERN_GENERAL_ON_CALL:
669 case FEEDBACK_PATTERN_SEND_SOS_MESSAGE:
671 case FEEDBACK_PATTERN_SCREEN_CAPTURE:
672 if (camerastatus && shutter_sndstatus)
675 case FEEDBACK_PATTERN_OUTGOING_CALL:
680 } else if (CHECK_VIBRATION(type)) {
682 case FEEDBACK_PATTERN_TAP:
683 case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
684 case FEEDBACK_PATTERN_HOLD:
688 case FEEDBACK_PATTERN_MESSAGE:
689 case FEEDBACK_PATTERN_EMAIL:
690 case FEEDBACK_PATTERN_GENERAL:
691 case FEEDBACK_PATTERN_SCHEDULE:
695 case FEEDBACK_PATTERN_SIP:
696 case FEEDBACK_PATTERN_TIMER:
697 case FEEDBACK_PATTERN_TIMER_ON_CALL:
698 case FEEDBACK_PATTERN_WAKEUP:
699 case FEEDBACK_PATTERN_WAKEUP_ON_CALL:
700 case FEEDBACK_PATTERN_MESSAGE_ON_CALL:
701 case FEEDBACK_PATTERN_EMAIL_ON_CALL:
702 case FEEDBACK_PATTERN_GENERAL_ON_CALL:
703 case FEEDBACK_PATTERN_CHARGERCONN_ON_CALL:
704 case FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL:
705 case FEEDBACK_PATTERN_LOWBATT_ON_CALL:
706 case FEEDBACK_PATTERN_BT_DISCONNECTED:
707 case FEEDBACK_PATTERN_SEND_SOS_MESSAGE:
708 case FEEDBACK_PATTERN_OUTGOING_CALL:
717 static bool common_get_always_alert_case(int type, int pattern)
720 case FEEDBACK_PATTERN_SIP:
721 case FEEDBACK_PATTERN_TIMER:
722 if (CHECK_VIBRATION(type))
725 case FEEDBACK_PATTERN_WAKEUP:
733 static bool profile_get_always_alert_case(int type, int pattern)
737 prof = get_profile();
739 if (prof == PROFILE_MOBILE)
740 return mobile_get_always_alert_case(type, pattern);
741 else if (prof == PROFILE_WEARABLE)
742 return wearable_get_always_alert_case(type, pattern);
744 return common_get_always_alert_case(type, pattern);
747 static bool mobile_get_always_off_case(int type, int pattern)
751 /* check if the state of voice recorder is recording */
752 if (vconf_get_int(VCONFKEY_RECORDER_STATE, &ret) < 0) {
753 _W("fail to get media sound status, status will be zero"); //LCOV_EXCL_LINE
757 if (CHECK_SOUND(type) && ret == VCONFKEY_RECORDER_STATE_RECORDING) {
758 _D("voice recording status is RECORDING"); //LCOV_EXCL_LINE
763 case FEEDBACK_PATTERN_TAP:
764 case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD:
765 if (CHECK_SOUND(type) && !is_touch_sndstatus())
768 case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
769 if (CHECK_SOUND(type) && !is_keytone_sndstatus())
771 else if (CHECK_VIBRATION(type) && !feedbackstatus)
774 case FEEDBACK_PATTERN_LOCK:
775 case FEEDBACK_PATTERN_UNLOCK:
776 if (CHECK_SOUND(type) && !lock_sndstatus)
785 static bool wearable_is_system_type(int pattern)
788 case FEEDBACK_PATTERN_POWERON ... FEEDBACK_PATTERN_VOLUME_KEY:
794 static bool wearable_get_always_off_case(int type, int pattern)
798 if (CHECK_SOUND(type)) {
799 if ((wearable_is_notification_type(pattern) || wearable_is_system_type(pattern)) &&
801 _W("skip %d sound during call", pattern);
804 /* check if the state of voice recorder is recording */
805 if (vconf_get_int(VCONFKEY_RECORDER_STATE, &ret) == 0 &&
806 ret == VCONFKEY_RECORDER_STATE_RECORDING) {
807 _D("voice recording status is RECORDING");
812 case FEEDBACK_PATTERN_TAP:
813 case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD:
814 if (!is_touch_sndstatus())
817 case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
818 if (!is_keytone_sndstatus())
824 } else if (CHECK_VIBRATION(type)) {
826 case FEEDBACK_PATTERN_TAP:
827 case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
828 case FEEDBACK_PATTERN_HOLD:
839 static bool common_get_always_off_case(int type, int pattern)
842 case FEEDBACK_PATTERN_TAP ... FEEDBACK_PATTERN_SIP:
843 case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD:
844 if (CHECK_SOUND(type) && !is_touch_sndstatus())
847 case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
848 if (CHECK_SOUND(type) && !is_keytone_sndstatus())
857 static bool profile_get_always_off_case(int type, int pattern)
861 prof = get_profile();
863 if (prof == PROFILE_MOBILE)
864 return mobile_get_always_off_case(type, pattern);
865 else if (prof == PROFILE_WEARABLE)
866 return wearable_get_always_off_case(type, pattern);
868 return common_get_always_off_case(type, pattern);
871 static int mobile_get_strength_type(int type, int pattern)
873 if (CHECK_SOUND(type)) {
874 if (pattern == FEEDBACK_PATTERN_TAP)
875 return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH;
876 else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK)
877 return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER;
878 else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY)
879 return VOLUME_TYPE_RINGTONE;
880 else if (camerastatus && shutter_sndstatus && pattern == FEEDBACK_PATTERN_SCREEN_CAPTURE)
881 return VOLUME_TYPE_FIXED;
883 return VOLUME_TYPE_SYSTEM;
884 } else if (CHECK_VIBRATION(type)) {
885 if (pattern >= FEEDBACK_PATTERN_MESSAGE &&
886 pattern <= FEEDBACK_PATTERN_GENERAL)
887 return noti_level * HAPTIC_FEEDBACK_STEP;
889 return vib_level * HAPTIC_FEEDBACK_STEP;
895 static int wearable_get_strength_type(int type, int pattern)
897 if (CHECK_SOUND(type)) {
898 if (pattern == FEEDBACK_PATTERN_TAP)
899 return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH;
900 else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK)
901 return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER;
902 else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY || pattern == FEEDBACK_PATTERN_SILENT_OFF)
903 return VOLUME_TYPE_RINGTONE;
904 else if (camerastatus && shutter_sndstatus && pattern == FEEDBACK_PATTERN_SCREEN_CAPTURE)
905 return VOLUME_TYPE_FIXED;
906 return VOLUME_TYPE_SYSTEM;
907 } else if (CHECK_VIBRATION(type)) {
908 if (pattern >= FEEDBACK_PATTERN_TAP && pattern <= FEEDBACK_PATTERN_HW_HOLD) {
909 _D("use default level");
910 return DEFAULT_VIB_LEVEL * HAPTIC_FEEDBACK_STEP;
912 /* if call status is ON, vibration magnitude is 20% */
913 if (pattern != FEEDBACK_PATTERN_RINGER &&
914 (callstatus == VCONFKEY_CALL_VOICE_ACTIVE || callstatus == VCONFKEY_CALL_VIDEO_ACTIVE)) {
915 _W("force change weak level");
916 return HAPTIC_FEEDBACK_STEP;
918 return noti_level * HAPTIC_FEEDBACK_STEP;
923 static int common_get_strength_type(int type, int pattern)
925 if (CHECK_SOUND(type)) {
926 if (pattern == FEEDBACK_PATTERN_TAP)
927 return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH;
928 else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK)
929 return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER;
930 else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY)
931 return VOLUME_TYPE_RINGTONE;
933 return VOLUME_TYPE_SYSTEM;
934 } else if (CHECK_VIBRATION(type)) {
935 return DEFAULT_VIB_LEVEL * HAPTIC_FEEDBACK_STEP;
941 static int profile_get_strength_type(int type, int pattern)
945 prof = get_profile();
947 if (prof == PROFILE_MOBILE)
948 return mobile_get_strength_type(type, pattern);
949 else if (prof == PROFILE_WEARABLE)
950 return wearable_get_strength_type(type, pattern);
952 return common_get_strength_type(type, pattern);
955 static const struct profile_ops feedback_profile_ops = {
956 .profile = profile_get_name,
957 .init = profile_init,
958 .exit = profile_exit,
959 .get_switched_pattern = profile_get_switched_pattern,
960 .get_always_alert_case = profile_get_always_alert_case,
961 .get_always_off_case = profile_get_always_off_case,
962 .get_strength_type = profile_get_strength_type,
963 .get_priority = profile_get_priority,
964 .is_notification_type = profile_is_notification_type,
965 .max_type = FEEDBACK_TYPE_END,
966 .max_pattern = FEEDBACK_PATTERN_INTERNAL_END,
967 .str_type = profile_str_type,
968 .get_num_of_pattern = profile_get_num_of_pattern,
969 .str_pattern = profile_str_pattern,
970 .get_pattern_enum = profile_get_pattern_enum,
973 PROFILE_OPS_REGISTER(&feedback_profile_ops);