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.
23 #include "feedback-ids-internal.h"
28 #ifndef VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL
29 #define VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL "db/setting/sound/vibrate_when_notification"
31 #ifndef VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL
32 #define VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL "db/setting/sound/haptic_feedback_on"
36 static const char *mobile_str_type[] = {
38 "FEEDBACK_TYPE_SOUND",
39 "FEEDBACK_TYPE_VIBRATION",
42 static const char *mobile_str_pattern[] = {
43 "FEEDBACK_PATTERN_TAP",
44 "FEEDBACK_PATTERN_SIP",
49 "FEEDBACK_PATTERN_KEY0",
50 "FEEDBACK_PATTERN_KEY1",
51 "FEEDBACK_PATTERN_KEY2",
52 "FEEDBACK_PATTERN_KEY3",
53 "FEEDBACK_PATTERN_KEY4",
54 "FEEDBACK_PATTERN_KEY5",
55 "FEEDBACK_PATTERN_KEY6",
56 "FEEDBACK_PATTERN_KEY7",
57 "FEEDBACK_PATTERN_KEY8",
58 "FEEDBACK_PATTERN_KEY9",
59 "FEEDBACK_PATTERN_KEY_STAR",
60 "FEEDBACK_PATTERN_KEY_SHARP",
61 "FEEDBACK_PATTERN_KEY_BACK",
62 "FEEDBACK_PATTERN_HOLD",
64 "FEEDBACK_PATTERN_HW_TAP",
65 "FEEDBACK_PATTERN_HW_HOLD",
67 "FEEDBACK_PATTERN_MESSAGE",
68 "FEEDBACK_PATTERN_MESSAGE_ON_CALL",
69 "FEEDBACK_PATTERN_EMAIL",
70 "FEEDBACK_PATTERN_EMAIL_ON_CALL",
71 "FEEDBACK_PATTERN_WAKEUP",
72 "FEEDBACK_PATTERN_WAKEUP_ON_CALL",
73 "FEEDBACK_PATTERN_SCHEDULE",
74 "FEEDBACK_PATTERN_SCHEDULE_ON_CALL",
75 "FEEDBACK_PATTERN_TIMER",
76 "FEEDBACK_PATTERN_TIMER_ON_CALL",
77 "FEEDBACK_PATTERN_GENERAL",
78 "FEEDBACK_PATTERN_GENERAL_ON_CALL",
81 "FEEDBACK_PATTERN_POWERON",
82 "FEEDBACK_PATTERN_POWEROFF",
83 "FEEDBACK_PATTERN_CHARGERCONN",
84 "FEEDBACK_PATTERN_CHARGERCONN_ON_CALL",
85 "FEEDBACK_PATTERN_CHARGING_ERROR",
86 "FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL",
87 "FEEDBACK_PATTERN_FULLCHARGED",
88 "FEEDBACK_PATTERN_FULLCHARGED_ON_CALL",
89 "FEEDBACK_PATTERN_LOWBATT",
90 "FEEDBACK_PATTERN_LOWBATT_ON_CALL",
91 "FEEDBACK_PATTERN_LOCK",
92 "FEEDBACK_PATTERN_UNLOCK",
98 "FEEDBACK_PATTERN_OUTGOING_CALL",
100 "FEEDBACK_PATTERN_VIBRATION_ON",
101 "FEEDBACK_PATTERN_SILENT_OFF",
102 "FEEDBACK_PATTERN_BT_CONNECTED",
103 "FEEDBACK_PATTERN_BT_DISCONNECTED",
106 "FEEDBACK_PATTERN_SCREEN_CAPTURE",
107 "FEEDBACK_PATTERN_LIST_REORDER",
108 "FEEDBACK_PATTERN_LIST_SLIDER",
109 "FEEDBACK_PATTERN_VOLUME_KEY",
120 "FEEDBACK_PATTERN_SEND_SOS_MESSAGE",
121 "FEEDBACK_PATTERN_RINGER",
122 "FEEDBACK_PATTERN_NOTIFICATION",
123 "FEEDBACK_PATTERN_INFO",
124 "FEEDBACK_PATTERN_WARNING",
125 "FEEDBACK_PATTERN_ERROR",
126 "FEEDBACK_PATTERN_EMERGENCY",
129 static int callstatus;
130 static int lock_sndstatus;
131 static int camerastatus;
132 static int shutter_sndstatus;
133 static int noti_vibstatus;
134 static int vib_level;
135 static int noti_level;
136 static int feedbackstatus;
138 //LCOV_EXCL_START Not called Callback
139 static void feedback_callstatus_cb(keynode_t *key, void* data)
141 callstatus = vconf_keynode_get_int(key);
144 static void feedback_lock_sndstatus_cb(keynode_t *key, void* data)
146 lock_sndstatus = vconf_keynode_get_bool(key);
149 static void feedback_camerastatus_cb(keynode_t *key, void* data)
151 camerastatus = vconf_keynode_get_int(key);
154 static void feedback_noti_vibstatus_cb(keynode_t *key, void* data)
156 noti_vibstatus = vconf_keynode_get_bool(key);
159 static void feedback_vib_cb(keynode_t *key, void* data)
161 vib_level = vconf_keynode_get_int(key);
164 static void feedback_noti_cb(keynode_t *key, void* data)
166 noti_level = vconf_keynode_get_int(key);
169 static void feedback_feedbackstatus_cb(keynode_t *key, void* data)
171 feedbackstatus = vconf_keynode_get_bool(key);
175 static void mobile_init(void)
177 /* check call status */
178 if (vconf_get_int(VCONFKEY_CALL_STATE, &callstatus) < 0)
179 _W("VCONFKEY_CALL_STATE ==> FAIL!!"); //LCOV_EXCL_LINE
181 if (vconf_get_bool(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, &lock_sndstatus) < 0)
182 _W("VCONFKEY_SETAPPL_SOUND_LOCK_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
184 /* check camera status */
185 if (vconf_get_int(VCONFKEY_CAMERA_STATE, &camerastatus) < 0)
186 _W("VCONFKEY_CAMERA_STATE ==> FAIL!!"); //LCOV_EXCL_LINE
188 /* shutter sound policy */
189 /* This vconf is read just once, because this value is not changed in running time. */
190 if (vconf_get_int(VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY, &shutter_sndstatus) < 0)
191 _W("VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY ==> FAIL!!"); //LCOV_EXCL_LINE
193 /* check vibration status */
194 if (vconf_get_bool(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, ¬i_vibstatus) < 0)
195 _W("VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
197 /* check vib_level */
198 if (vconf_get_int(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, &vib_level) < 0)
199 _W("VCONFKEY_FEEDBACK_VIBRATION_LEVEL_INT ==> FAIL!!"); //LCOV_EXCL_LINE
201 /* check noti_level */
202 if (vconf_get_int(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, ¬i_level) < 0)
203 _W("VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT ==> FAIL!!"); //LCOV_EXCL_LINE
206 if (vconf_get_bool(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, &feedbackstatus) < 0)
207 _W("VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE
209 /* add watch for status value */
210 vconf_notify_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb, NULL);
211 vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, feedback_lock_sndstatus_cb, NULL);
212 vconf_notify_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb, NULL);
213 vconf_notify_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb, NULL);
214 vconf_notify_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb, NULL);
215 vconf_notify_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb, NULL);
216 vconf_notify_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb, NULL);
219 static void mobile_exit(void)
222 vconf_ignore_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb);
223 vconf_ignore_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, feedback_lock_sndstatus_cb);
224 vconf_ignore_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb);
225 vconf_ignore_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb);
226 vconf_ignore_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb);
227 vconf_ignore_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb);
228 vconf_ignore_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb);
231 static bool mobile_get_switched_pattern(int pattern, int *switched)
236 if (callstatus == VCONFKEY_CALL_OFF)
239 /* in case of call connected or connecting */
240 _D("Call status is connected or connecting."); //LCOV_EXCL_LINE
241 if (pattern == FEEDBACK_PATTERN_MESSAGE)
242 *switched = FEEDBACK_PATTERN_MESSAGE_ON_CALL;
243 else if (pattern == FEEDBACK_PATTERN_EMAIL)
244 *switched = FEEDBACK_PATTERN_EMAIL_ON_CALL;
245 else if (pattern == FEEDBACK_PATTERN_WAKEUP)
246 *switched = FEEDBACK_PATTERN_WAKEUP_ON_CALL;
247 else if (pattern == FEEDBACK_PATTERN_SCHEDULE)
248 *switched = FEEDBACK_PATTERN_SCHEDULE_ON_CALL;
249 else if (pattern == FEEDBACK_PATTERN_TIMER)
250 *switched = FEEDBACK_PATTERN_TIMER_ON_CALL;
251 else if (pattern == FEEDBACK_PATTERN_GENERAL)
252 *switched = FEEDBACK_PATTERN_GENERAL_ON_CALL;
253 else if (pattern == FEEDBACK_PATTERN_CHARGERCONN)
254 *switched = FEEDBACK_PATTERN_CHARGERCONN_ON_CALL;
255 else if (pattern == FEEDBACK_PATTERN_CHARGING_ERROR)
256 *switched = FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL;
257 else if (pattern == FEEDBACK_PATTERN_FULLCHARGED)
258 *switched = FEEDBACK_PATTERN_FULLCHARGED_ON_CALL;
259 else if (pattern == FEEDBACK_PATTERN_LOWBATT)
260 *switched = FEEDBACK_PATTERN_LOWBATT_ON_CALL;
267 static bool mobile_is_notification_type(int pattern)
270 case FEEDBACK_PATTERN_WAKEUP:
271 case FEEDBACK_PATTERN_WAKEUP_ON_CALL:
272 case FEEDBACK_PATTERN_TIMER:
273 case FEEDBACK_PATTERN_TIMER_ON_CALL:
274 case FEEDBACK_PATTERN_MESSAGE ... FEEDBACK_PATTERN_EMAIL_ON_CALL:
275 case FEEDBACK_PATTERN_SCHEDULE:
276 case FEEDBACK_PATTERN_SCHEDULE_ON_CALL:
277 case FEEDBACK_PATTERN_GENERAL ... FEEDBACK_PATTERN_LOWBATT_ON_CALL:
283 static bool mobile_get_always_alert_case(int type, int pattern)
286 case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
287 case FEEDBACK_PATTERN_HOLD:
288 if (CHECK_VIBRATION(type) && feedbackstatus)
291 case FEEDBACK_PATTERN_SIP:
292 if (CHECK_VIBRATION(type))
295 case FEEDBACK_PATTERN_MESSAGE:
296 case FEEDBACK_PATTERN_EMAIL:
297 if (CHECK_VIBRATION(type) && noti_vibstatus)
300 case FEEDBACK_PATTERN_TIMER:
301 case FEEDBACK_PATTERN_TIMER_ON_CALL:
302 if (CHECK_VIBRATION(type))
305 case FEEDBACK_PATTERN_WAKEUP:
306 case FEEDBACK_PATTERN_WAKEUP_ON_CALL:
308 case FEEDBACK_PATTERN_MESSAGE_ON_CALL:
309 case FEEDBACK_PATTERN_EMAIL_ON_CALL:
310 case FEEDBACK_PATTERN_GENERAL_ON_CALL:
312 case FEEDBACK_PATTERN_CHARGERCONN_ON_CALL:
313 case FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL:
314 case FEEDBACK_PATTERN_LOWBATT_ON_CALL:
315 /* no matter sound profile */
316 if (CHECK_VIBRATION(type))
319 case FEEDBACK_PATTERN_SEND_SOS_MESSAGE:
320 case FEEDBACK_PATTERN_OUTGOING_CALL:
322 case FEEDBACK_PATTERN_SCREEN_CAPTURE:
323 if (CHECK_SOUND(type) && camerastatus && shutter_sndstatus)
326 case FEEDBACK_PATTERN_RINGER:
334 static bool mobile_get_always_off_case(int type, int pattern)
338 /* check if the state of voice recorder is recording */
339 if (vconf_get_int(VCONFKEY_RECORDER_STATE, &ret) < 0) {
340 _W("fail to get media sound status, status will be zero"); //LCOV_EXCL_LINE
344 if (CHECK_SOUND(type) && ret == VCONFKEY_RECORDER_STATE_RECORDING) {
345 _D("voice recording status is RECORDING"); //LCOV_EXCL_LINE
350 case FEEDBACK_PATTERN_TAP:
351 case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD:
352 if (CHECK_SOUND(type) && !is_touch_sndstatus())
355 case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK:
356 if (CHECK_SOUND(type) && !is_keytone_sndstatus())
358 else if (CHECK_VIBRATION(type) && !feedbackstatus)
361 case FEEDBACK_PATTERN_LOCK:
362 case FEEDBACK_PATTERN_UNLOCK:
363 if (CHECK_SOUND(type) && !lock_sndstatus)
372 static int mobile_get_strength_type(int type, int pattern)
374 if (CHECK_SOUND(type)) {
375 if (pattern == FEEDBACK_PATTERN_TAP)
376 return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH;
377 else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK)
378 return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER;
379 else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY)
380 return VOLUME_TYPE_RINGTONE;
381 else if (camerastatus && shutter_sndstatus && pattern == FEEDBACK_PATTERN_SCREEN_CAPTURE)
382 return VOLUME_TYPE_FIXED;
384 return VOLUME_TYPE_SYSTEM;
385 } else if (CHECK_VIBRATION(type)) {
386 if (pattern >= FEEDBACK_PATTERN_MESSAGE &&
387 pattern <= FEEDBACK_PATTERN_GENERAL)
388 return noti_level * HAPTIC_FEEDBACK_STEP;
390 return vib_level * HAPTIC_FEEDBACK_STEP;
396 static const struct profile_ops mobile_profile_ops = {
400 .get_switched_pattern = mobile_get_switched_pattern,
401 .get_always_alert_case = mobile_get_always_alert_case,
402 .get_always_off_case = mobile_get_always_off_case,
403 .get_strength_type = mobile_get_strength_type,
404 .is_notification_type = mobile_is_notification_type,
405 .max_type = FEEDBACK_TYPE_END,
406 .max_pattern = FEEDBACK_PATTERN_INTERNAL_END,
407 .str_type = mobile_str_type,
408 .str_pattern = mobile_str_pattern,
411 PROFILE_OPS_REGISTER(&mobile_profile_ops);