diff options
author | pr.jung <pr.jung@samsung.com> | 2017-02-24 18:07:14 +0900 |
---|---|---|
committer | pr.jung <pr.jung@samsung.com> | 2017-02-24 20:02:48 +0900 |
commit | 65ff796c7477d405fbc97e3a3cc4605d8da5f7e6 (patch) | |
tree | 9a26536d0ea32a594b0a60d8ee551010107143d7 | |
parent | 01d9d29620f741fcb81637d5b94710d26554d894 (diff) | |
download | libsvi-accepted/tizen_tv.tar.gz libsvi-accepted/tizen_tv.tar.bz2 libsvi-accepted/tizen_tv.zip |
Remove build dependencies on profilesubmit/tizen_unified/20170308.100409submit/tizen/20170302.070636accepted/tizen/wearable/20170302.121736accepted/tizen/unified/20170309.033642accepted/tizen/tv/20170302.121646accepted/tizen/mobile/20170302.121538accepted/tizen/ivi/20170302.121745accepted/tizen/common/20170302.151618accepted/tizen_wearableaccepted/tizen_tvaccepted/tizen_mobileaccepted/tizen_iviaccepted/tizen_common
- Remove build dependencies of check.c
- Check the profile on runtime
Change-Id: I256fffa813091a49877d18e936e77c62854e0fef
Signed-off-by: pr.jung <pr.jung@samsung.com>
-rw-r--r-- | common/src/check.c | 175 | ||||
-rw-r--r-- | mobile/src/check.c | 417 | ||||
-rw-r--r-- | src/check.c | 951 | ||||
-rw-r--r-- | src/feedback.c | 10 | ||||
-rw-r--r-- | src/parser.c | 6 | ||||
-rw-r--r-- | src/profiles.h | 4 | ||||
-rw-r--r-- | src/sound.c | 6 | ||||
-rw-r--r-- | src/vibrator.c | 4 | ||||
-rw-r--r-- | wearable/src/check.c | 425 |
9 files changed, 966 insertions, 1032 deletions
diff --git a/common/src/check.c b/common/src/check.c deleted file mode 100644 index f17e825..0000000 --- a/common/src/check.c +++ /dev/null @@ -1,175 +0,0 @@ -/* - * libfeedback - * Copyright (c) 2015 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include <stdio.h> - -#include "feedback.h" -#include "profiles.h" -#include "log.h" - - -static const char *common_str_type[] = { - "FEEDBACK_TYPE_NONE", - "FEEDBACK_TYPE_SOUND", - "FEEDBACK_TYPE_VIBRATION", -}; - -static const char *common_str_pattern[] = { - "FEEDBACK_PATTERN_TAP", - "FEEDBACK_PATTERN_SIP", - "", - "", - "", - "", - "FEEDBACK_PATTERN_KEY0", - "FEEDBACK_PATTERN_KEY1", - "FEEDBACK_PATTERN_KEY2", - "FEEDBACK_PATTERN_KEY3", - "FEEDBACK_PATTERN_KEY4", - "FEEDBACK_PATTERN_KEY5", - "FEEDBACK_PATTERN_KEY6", - "FEEDBACK_PATTERN_KEY7", - "FEEDBACK_PATTERN_KEY8", - "FEEDBACK_PATTERN_KEY9", - "FEEDBACK_PATTERN_KEY_STAR", - "FEEDBACK_PATTERN_KEY_SHARP", - "FEEDBACK_PATTERN_KEY_BACK", - "FEEDBACK_PATTERN_HOLD", - "", - "FEEDBACK_PATTERN_HW_TAP", - "FEEDBACK_PATTERN_HW_HOLD", - - "FEEDBACK_PATTERN_MESSAGE", - "", - "FEEDBACK_PATTERN_EMAIL", - "", - "FEEDBACK_PATTERN_WAKEUP", - "", - "FEEDBACK_PATTERN_SCHEDULE", - "", - "FEEDBACK_PATTERN_TIMER", - "", - "FEEDBACK_PATTERN_GENERAL", - "", - "", - - "FEEDBACK_PATTERN_POWERON", - "FEEDBACK_PATTERN_POWEROFF", - "FEEDBACK_PATTERN_CHARGERCONN", - "", - "FEEDBACK_PATTERN_CHARGING_ERROR", - "", - "FEEDBACK_PATTERN_FULLCHARGED", - "", - "FEEDBACK_PATTERN_LOWBATT", - "", - "FEEDBACK_PATTERN_LOCK", - "FEEDBACK_PATTERN_UNLOCK", - "", - "", - "", - "", - "", - "", - "", - "FEEDBACK_PATTERN_VIBRATION_ON", - "FEEDBACK_PATTERN_SILENT_OFF", - "FEEDBACK_PATTERN_BT_CONNECTED", - "FEEDBACK_PATTERN_BT_DISCONNECTED", - "", - "", - "", - "FEEDBACK_PATTERN_LIST_REORDER", - "FEEDBACK_PATTERN_LIST_SLIDER", - "FEEDBACK_PATTERN_VOLUME_KEY", - - "", - "", - "", - "", - "", - "", - "", - "", - "", -}; - -static bool common_get_always_alert_case(int type, int pattern) -{ - switch (pattern) { - case FEEDBACK_PATTERN_SIP: - case FEEDBACK_PATTERN_TIMER: - if (CHECK_VIBRATION(type)) - return true; - break; - case FEEDBACK_PATTERN_WAKEUP: - return true; - default: - break; - } - return false; -} - -static bool common_get_always_off_case(int type, int pattern) -{ - switch (pattern) { - case FEEDBACK_PATTERN_TAP ... FEEDBACK_PATTERN_SIP: - case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD: - if (CHECK_SOUND(type) && !is_touch_sndstatus()) - return true; - break; - case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK: - if (CHECK_SOUND(type) && !is_keytone_sndstatus()) - return true; - break; - default: - break; - } - return false; -} - -static int common_get_strength_type(int type, int pattern) -{ - if (CHECK_SOUND(type)) { - if (pattern == FEEDBACK_PATTERN_TAP) - return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH; - else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK) - return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER; - else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY) - return VOLUME_TYPE_RINGTONE; - else - return VOLUME_TYPE_SYSTEM; - } else if (CHECK_VIBRATION(type)) { - return DEFAULT_VIB_LEVEL * HAPTIC_FEEDBACK_STEP; - } - - return -EINVAL; -} - -static const struct profile_ops common_profile_ops = { - .profile = "common", - .get_always_alert_case = common_get_always_alert_case, - .get_always_off_case = common_get_always_off_case, - .get_strength_type = common_get_strength_type, - .max_type = FEEDBACK_TYPE_END, - .max_pattern = FEEDBACK_PATTERN_END, - .str_type = common_str_type, - .str_pattern = common_str_pattern, -}; - -PROFILE_OPS_REGISTER(&common_profile_ops); diff --git a/mobile/src/check.c b/mobile/src/check.c deleted file mode 100644 index 36f6a42..0000000 --- a/mobile/src/check.c +++ /dev/null @@ -1,417 +0,0 @@ -/* - * libfeedback - * Copyright (c) 2015 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include <stdio.h> -#include <vconf.h> - -#include "feedback.h" -#include "feedback-ids-internal.h" -#include "profiles.h" -#include "log.h" - -/* Temporary keys */ -#ifndef VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL -#define VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL "db/setting/sound/vibrate_when_notification" -#endif -#ifndef VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL -#define VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL "db/setting/sound/haptic_feedback_on" -#endif - - -static const char *mobile_str_type[] = { - "FEEDBACK_TYPE_NONE", - "FEEDBACK_TYPE_SOUND", - "FEEDBACK_TYPE_VIBRATION", -}; - -static const char *mobile_str_pattern[] = { - "FEEDBACK_PATTERN_TAP", - "FEEDBACK_PATTERN_SIP", - "", - "", - "", - "", - "FEEDBACK_PATTERN_KEY0", - "FEEDBACK_PATTERN_KEY1", - "FEEDBACK_PATTERN_KEY2", - "FEEDBACK_PATTERN_KEY3", - "FEEDBACK_PATTERN_KEY4", - "FEEDBACK_PATTERN_KEY5", - "FEEDBACK_PATTERN_KEY6", - "FEEDBACK_PATTERN_KEY7", - "FEEDBACK_PATTERN_KEY8", - "FEEDBACK_PATTERN_KEY9", - "FEEDBACK_PATTERN_KEY_STAR", - "FEEDBACK_PATTERN_KEY_SHARP", - "FEEDBACK_PATTERN_KEY_BACK", - "FEEDBACK_PATTERN_HOLD", - "", - "FEEDBACK_PATTERN_HW_TAP", - "FEEDBACK_PATTERN_HW_HOLD", - - "FEEDBACK_PATTERN_MESSAGE", - "FEEDBACK_PATTERN_MESSAGE_ON_CALL", - "FEEDBACK_PATTERN_EMAIL", - "FEEDBACK_PATTERN_EMAIL_ON_CALL", - "FEEDBACK_PATTERN_WAKEUP", - "FEEDBACK_PATTERN_WAKEUP_ON_CALL", - "FEEDBACK_PATTERN_SCHEDULE", - "FEEDBACK_PATTERN_SCHEDULE_ON_CALL", - "FEEDBACK_PATTERN_TIMER", - "FEEDBACK_PATTERN_TIMER_ON_CALL", - "FEEDBACK_PATTERN_GENERAL", - "FEEDBACK_PATTERN_GENERAL_ON_CALL", - "", - - "FEEDBACK_PATTERN_POWERON", - "FEEDBACK_PATTERN_POWEROFF", - "FEEDBACK_PATTERN_CHARGERCONN", - "FEEDBACK_PATTERN_CHARGERCONN_ON_CALL", - "FEEDBACK_PATTERN_CHARGING_ERROR", - "FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL", - "FEEDBACK_PATTERN_FULLCHARGED", - "FEEDBACK_PATTERN_FULLCHARGED_ON_CALL", - "FEEDBACK_PATTERN_LOWBATT", - "FEEDBACK_PATTERN_LOWBATT_ON_CALL", - "FEEDBACK_PATTERN_LOCK", - "FEEDBACK_PATTERN_UNLOCK", - "", - "", - "", - "", - "", - "FEEDBACK_PATTERN_OUTGOING_CALL", - "", - "FEEDBACK_PATTERN_VIBRATION_ON", - "FEEDBACK_PATTERN_SILENT_OFF", - "FEEDBACK_PATTERN_BT_CONNECTED", - "FEEDBACK_PATTERN_BT_DISCONNECTED", - "", - "", - "FEEDBACK_PATTERN_SCREEN_CAPTURE", - "FEEDBACK_PATTERN_LIST_REORDER", - "FEEDBACK_PATTERN_LIST_SLIDER", - "FEEDBACK_PATTERN_VOLUME_KEY", - "", - "", - - "", - "", - "", - "", - "", - "", - "", - "FEEDBACK_PATTERN_SEND_SOS_MESSAGE", - "FEEDBACK_PATTERN_RINGER", - "FEEDBACK_PATTERN_NOTIFICATION", - "FEEDBACK_PATTERN_INFO", - "FEEDBACK_PATTERN_WARNING", - "FEEDBACK_PATTERN_ERROR", - "FEEDBACK_PATTERN_EMERGENCY", -}; - -static int callstatus; -static int lock_sndstatus; -static int camerastatus; -static int shutter_sndstatus; -static int noti_vibstatus; -static int vib_level; -static int noti_level; -static int feedbackstatus; - -//LCOV_EXCL_START Not called Callback -static void feedback_callstatus_cb(keynode_t *key, void* data) -{ - callstatus = vconf_keynode_get_int(key); -} - -static void feedback_lock_sndstatus_cb(keynode_t *key, void* data) -{ - lock_sndstatus = vconf_keynode_get_bool(key); -} - -static void feedback_camerastatus_cb(keynode_t *key, void* data) -{ - camerastatus = vconf_keynode_get_int(key); -} - -static void feedback_noti_vibstatus_cb(keynode_t *key, void* data) -{ - noti_vibstatus = vconf_keynode_get_bool(key); -} - -static void feedback_vib_cb(keynode_t *key, void* data) -{ - vib_level = vconf_keynode_get_int(key); -} - -static void feedback_noti_cb(keynode_t *key, void* data) -{ - noti_level = vconf_keynode_get_int(key); -} - -static void feedback_feedbackstatus_cb(keynode_t *key, void* data) -{ - feedbackstatus = vconf_keynode_get_bool(key); -} -//LCOV_EXCL_STOP - -static void mobile_init(void) -{ - /* check call status */ - if (vconf_get_int(VCONFKEY_CALL_STATE, &callstatus) < 0) - _W("VCONFKEY_CALL_STATE ==> FAIL!!"); //LCOV_EXCL_LINE - - if (vconf_get_bool(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, &lock_sndstatus) < 0) - _W("VCONFKEY_SETAPPL_SOUND_LOCK_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE - - /* check camera status */ - if (vconf_get_int(VCONFKEY_CAMERA_STATE, &camerastatus) < 0) - _W("VCONFKEY_CAMERA_STATE ==> FAIL!!"); //LCOV_EXCL_LINE - - /* shutter sound policy */ - /* This vconf is read just once, because this value is not changed in running time. */ - if (vconf_get_int(VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY, &shutter_sndstatus) < 0) - _W("VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY ==> FAIL!!"); //LCOV_EXCL_LINE - - /* check vibration status */ - if (vconf_get_bool(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, ¬i_vibstatus) < 0) - _W("VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE - - /* check vib_level */ - if (vconf_get_int(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, &vib_level) < 0) - _W("VCONFKEY_FEEDBACK_VIBRATION_LEVEL_INT ==> FAIL!!"); //LCOV_EXCL_LINE - - /* check noti_level */ - if (vconf_get_int(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, ¬i_level) < 0) - _W("VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT ==> FAIL!!"); //LCOV_EXCL_LINE - - /* feedback Init */ - if (vconf_get_bool(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, &feedbackstatus) < 0) - _W("VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE - - /* add watch for status value */ - vconf_notify_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb, NULL); - vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, feedback_lock_sndstatus_cb, NULL); - vconf_notify_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb, NULL); - vconf_notify_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb, NULL); - vconf_notify_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb, NULL); - vconf_notify_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb, NULL); - vconf_notify_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb, NULL); -} - -static void mobile_exit(void) -{ - /* remove watch */ - vconf_ignore_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb); - vconf_ignore_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, feedback_lock_sndstatus_cb); - vconf_ignore_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb); - vconf_ignore_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb); - vconf_ignore_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb); - vconf_ignore_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb); - vconf_ignore_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb); -} - -static bool mobile_get_switched_pattern(int pattern, int *switched) -{ - if (!switched) - return false; - - if (callstatus == VCONFKEY_CALL_OFF) - return false; - - /* in case of call connected or connecting */ - _D("Call status is connected or connecting."); //LCOV_EXCL_LINE - if (pattern == FEEDBACK_PATTERN_MESSAGE) - *switched = FEEDBACK_PATTERN_MESSAGE_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_EMAIL) - *switched = FEEDBACK_PATTERN_EMAIL_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_WAKEUP) - *switched = FEEDBACK_PATTERN_WAKEUP_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_SCHEDULE) - *switched = FEEDBACK_PATTERN_SCHEDULE_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_TIMER) - *switched = FEEDBACK_PATTERN_TIMER_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_GENERAL) - *switched = FEEDBACK_PATTERN_GENERAL_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_CHARGERCONN) - *switched = FEEDBACK_PATTERN_CHARGERCONN_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_CHARGING_ERROR) - *switched = FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_FULLCHARGED) - *switched = FEEDBACK_PATTERN_FULLCHARGED_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_LOWBATT) - *switched = FEEDBACK_PATTERN_LOWBATT_ON_CALL; - else - return false; - - return true; -} - -static bool mobile_is_notification_type(int pattern) -{ - switch (pattern) { - case FEEDBACK_PATTERN_WAKEUP: - case FEEDBACK_PATTERN_WAKEUP_ON_CALL: - case FEEDBACK_PATTERN_TIMER: - case FEEDBACK_PATTERN_TIMER_ON_CALL: - case FEEDBACK_PATTERN_MESSAGE ... FEEDBACK_PATTERN_EMAIL_ON_CALL: - case FEEDBACK_PATTERN_SCHEDULE: - case FEEDBACK_PATTERN_SCHEDULE_ON_CALL: - case FEEDBACK_PATTERN_GENERAL ... FEEDBACK_PATTERN_LOWBATT_ON_CALL: - return true; - } - return false; -} - -static int mobile_get_priority(int pattern) -{ - return PRIORITY_MIDDLE; -} - -static bool mobile_get_always_alert_case(int type, int pattern) -{ - switch (pattern) { - case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK: - case FEEDBACK_PATTERN_HOLD: - if (CHECK_VIBRATION(type) && feedbackstatus) - return true; - break; - case FEEDBACK_PATTERN_SIP: - if (CHECK_VIBRATION(type)) - return true; - break; - case FEEDBACK_PATTERN_MESSAGE: - case FEEDBACK_PATTERN_EMAIL: - if (CHECK_VIBRATION(type) && noti_vibstatus) - return true; - break; - case FEEDBACK_PATTERN_TIMER: - case FEEDBACK_PATTERN_TIMER_ON_CALL: - if (CHECK_VIBRATION(type)) - return true; - break; - case FEEDBACK_PATTERN_WAKEUP: - case FEEDBACK_PATTERN_WAKEUP_ON_CALL: - return true; - case FEEDBACK_PATTERN_MESSAGE_ON_CALL: - case FEEDBACK_PATTERN_EMAIL_ON_CALL: - case FEEDBACK_PATTERN_GENERAL_ON_CALL: - break; - case FEEDBACK_PATTERN_CHARGERCONN_ON_CALL: - case FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL: - case FEEDBACK_PATTERN_LOWBATT_ON_CALL: - /* no matter sound profile */ - if (CHECK_VIBRATION(type)) - return true; - break; - case FEEDBACK_PATTERN_SEND_SOS_MESSAGE: - case FEEDBACK_PATTERN_OUTGOING_CALL: - return true; - case FEEDBACK_PATTERN_SCREEN_CAPTURE: - if (CHECK_SOUND(type) && camerastatus && shutter_sndstatus) - return true; - break; - case FEEDBACK_PATTERN_RINGER: - return true; - default: - break; - } - return false; -} - -static bool mobile_get_always_off_case(int type, int pattern) -{ - int ret; - - /* check if the state of voice recorder is recording */ - if (vconf_get_int(VCONFKEY_RECORDER_STATE, &ret) < 0) { - _W("fail to get media sound status, status will be zero"); //LCOV_EXCL_LINE - ret = 0; - } - - if (CHECK_SOUND(type) && ret == VCONFKEY_RECORDER_STATE_RECORDING) { - _D("voice recording status is RECORDING"); //LCOV_EXCL_LINE - return true; - } - - switch (pattern) { - case FEEDBACK_PATTERN_TAP: - case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD: - if (CHECK_SOUND(type) && !is_touch_sndstatus()) - return true; - break; - case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK: - if (CHECK_SOUND(type) && !is_keytone_sndstatus()) - return true; - else if (CHECK_VIBRATION(type) && !feedbackstatus) - return true; - break; - case FEEDBACK_PATTERN_LOCK: - case FEEDBACK_PATTERN_UNLOCK: - if (CHECK_SOUND(type) && !lock_sndstatus) - return true; - break; - default: - break; - } - return false; -} - -static int mobile_get_strength_type(int type, int pattern) -{ - if (CHECK_SOUND(type)) { - if (pattern == FEEDBACK_PATTERN_TAP) - return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH; - else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK) - return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER; - else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY) - return VOLUME_TYPE_RINGTONE; - else if (camerastatus && shutter_sndstatus && pattern == FEEDBACK_PATTERN_SCREEN_CAPTURE) - return VOLUME_TYPE_FIXED; - else - return VOLUME_TYPE_SYSTEM; - } else if (CHECK_VIBRATION(type)) { - if (pattern >= FEEDBACK_PATTERN_MESSAGE && - pattern <= FEEDBACK_PATTERN_GENERAL) - return noti_level * HAPTIC_FEEDBACK_STEP; - else - return vib_level * HAPTIC_FEEDBACK_STEP; - } - - return -EINVAL; -} - -static const struct profile_ops mobile_profile_ops = { - .profile = "mobile", - .init = mobile_init, - .exit = mobile_exit, - .get_switched_pattern = mobile_get_switched_pattern, - .get_always_alert_case = mobile_get_always_alert_case, - .get_always_off_case = mobile_get_always_off_case, - .get_strength_type = mobile_get_strength_type, - .get_priority = mobile_get_priority, - .is_notification_type = mobile_is_notification_type, - .max_type = FEEDBACK_TYPE_END, - .max_pattern = FEEDBACK_PATTERN_INTERNAL_END, - .str_type = mobile_str_type, - .str_pattern = mobile_str_pattern, -}; - -PROFILE_OPS_REGISTER(&mobile_profile_ops); diff --git a/src/check.c b/src/check.c new file mode 100644 index 0000000..bd813f4 --- /dev/null +++ b/src/check.c @@ -0,0 +1,951 @@ +/* + * libfeedback + * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include <stdio.h> +#include <stdlib.h> +#include <vconf.h> +#include <system_info.h> + +#include "feedback.h" +#include "feedback-ids-internal.h" +#include "profiles.h" +#include "log.h" + +/* Temporary keys */ +#ifndef VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL +#define VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL "db/setting/sound/vibrate_when_notification" +#endif +#ifndef VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL +#define VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL "db/setting/sound/haptic_feedback_on" +#endif + + +static const char *profile_str_type[] = { + "FEEDBACK_TYPE_NONE", + "FEEDBACK_TYPE_SOUND", + "FEEDBACK_TYPE_VIBRATION", +}; + +static const char *mobile_str_pattern[] = { + "FEEDBACK_PATTERN_TAP", + "FEEDBACK_PATTERN_SIP", + "", + "", + "", + "", + "FEEDBACK_PATTERN_KEY0", + "FEEDBACK_PATTERN_KEY1", + "FEEDBACK_PATTERN_KEY2", + "FEEDBACK_PATTERN_KEY3", + "FEEDBACK_PATTERN_KEY4", + "FEEDBACK_PATTERN_KEY5", + "FEEDBACK_PATTERN_KEY6", + "FEEDBACK_PATTERN_KEY7", + "FEEDBACK_PATTERN_KEY8", + "FEEDBACK_PATTERN_KEY9", + "FEEDBACK_PATTERN_KEY_STAR", + "FEEDBACK_PATTERN_KEY_SHARP", + "FEEDBACK_PATTERN_KEY_BACK", + "FEEDBACK_PATTERN_HOLD", + "", + "FEEDBACK_PATTERN_HW_TAP", + "FEEDBACK_PATTERN_HW_HOLD", + + "FEEDBACK_PATTERN_MESSAGE", + "FEEDBACK_PATTERN_MESSAGE_ON_CALL", + "FEEDBACK_PATTERN_EMAIL", + "FEEDBACK_PATTERN_EMAIL_ON_CALL", + "FEEDBACK_PATTERN_WAKEUP", + "FEEDBACK_PATTERN_WAKEUP_ON_CALL", + "FEEDBACK_PATTERN_SCHEDULE", + "FEEDBACK_PATTERN_SCHEDULE_ON_CALL", + "FEEDBACK_PATTERN_TIMER", + "FEEDBACK_PATTERN_TIMER_ON_CALL", + "FEEDBACK_PATTERN_GENERAL", + "FEEDBACK_PATTERN_GENERAL_ON_CALL", + "", + + "FEEDBACK_PATTERN_POWERON", + "FEEDBACK_PATTERN_POWEROFF", + "FEEDBACK_PATTERN_CHARGERCONN", + "FEEDBACK_PATTERN_CHARGERCONN_ON_CALL", + "FEEDBACK_PATTERN_CHARGING_ERROR", + "FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL", + "FEEDBACK_PATTERN_FULLCHARGED", + "FEEDBACK_PATTERN_FULLCHARGED_ON_CALL", + "FEEDBACK_PATTERN_LOWBATT", + "FEEDBACK_PATTERN_LOWBATT_ON_CALL", + "FEEDBACK_PATTERN_LOCK", + "FEEDBACK_PATTERN_UNLOCK", + "", + "", + "", + "", + "", + "FEEDBACK_PATTERN_OUTGOING_CALL", + "", + "FEEDBACK_PATTERN_VIBRATION_ON", + "FEEDBACK_PATTERN_SILENT_OFF", + "FEEDBACK_PATTERN_BT_CONNECTED", + "FEEDBACK_PATTERN_BT_DISCONNECTED", + "", + "", + "FEEDBACK_PATTERN_SCREEN_CAPTURE", + "FEEDBACK_PATTERN_LIST_REORDER", + "FEEDBACK_PATTERN_LIST_SLIDER", + "FEEDBACK_PATTERN_VOLUME_KEY", + "", + "", + + "", + "", + "", + "", + "", + "", + "", + "FEEDBACK_PATTERN_SEND_SOS_MESSAGE", + "FEEDBACK_PATTERN_RINGER", + "FEEDBACK_PATTERN_NOTIFICATION", + "FEEDBACK_PATTERN_INFO", + "FEEDBACK_PATTERN_WARNING", + "FEEDBACK_PATTERN_ERROR", + "FEEDBACK_PATTERN_EMERGENCY", +}; + +static const char *wearable_str_pattern[] = { + "FEEDBACK_PATTERN_TAP", + "FEEDBACK_PATTERN_SIP", + "", + "", + "", + "", + "FEEDBACK_PATTERN_KEY0", + "FEEDBACK_PATTERN_KEY1", + "FEEDBACK_PATTERN_KEY2", + "FEEDBACK_PATTERN_KEY3", + "FEEDBACK_PATTERN_KEY4", + "FEEDBACK_PATTERN_KEY5", + "FEEDBACK_PATTERN_KEY6", + "FEEDBACK_PATTERN_KEY7", + "FEEDBACK_PATTERN_KEY8", + "FEEDBACK_PATTERN_KEY9", + "FEEDBACK_PATTERN_KEY_STAR", + "FEEDBACK_PATTERN_KEY_SHARP", + "FEEDBACK_PATTERN_KEY_BACK", + "FEEDBACK_PATTERN_HOLD", + "", + "FEEDBACK_PATTERN_HW_TAP", + "FEEDBACK_PATTERN_HW_HOLD", + + "FEEDBACK_PATTERN_MESSAGE", + "FEEDBACK_PATTERN_MESSAGE_ON_CALL", + "FEEDBACK_PATTERN_EMAIL", + "FEEDBACK_PATTERN_EMAIL_ON_CALL", + "FEEDBACK_PATTERN_WAKEUP", + "FEEDBACK_PATTERN_WAKEUP_ON_CALL", + "FEEDBACK_PATTERN_SCHEDULE", + "FEEDBACK_PATTERN_SCHEDULE_ON_CALL", + "FEEDBACK_PATTERN_TIMER", + "FEEDBACK_PATTERN_TIMER_ON_CALL", + "FEEDBACK_PATTERN_GENERAL", + "FEEDBACK_PATTERN_GENERAL_ON_CALL", + "", + + "FEEDBACK_PATTERN_POWERON", + "FEEDBACK_PATTERN_POWEROFF", + "FEEDBACK_PATTERN_CHARGERCONN", + "FEEDBACK_PATTERN_CHARGERCONN_ON_CALL", + "FEEDBACK_PATTERN_CHARGING_ERROR", + "FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL", + "FEEDBACK_PATTERN_FULLCHARGED", + "FEEDBACK_PATTERN_FULLCHARGED_ON_CALL", + "FEEDBACK_PATTERN_LOWBATT", + "FEEDBACK_PATTERN_LOWBATT_ON_CALL", + "FEEDBACK_PATTERN_LOCK", + "FEEDBACK_PATTERN_UNLOCK", + "", + "", + "", + "", + "", + "", + "", + "FEEDBACK_PATTERN_VIBRATION_ON", + "FEEDBACK_PATTERN_SILENT_OFF", + "FEEDBACK_PATTERN_BT_CONNECTED", + "FEEDBACK_PATTERN_BT_DISCONNECTED", + "", + "", + "FEEDBACK_PATTERN_SCREEN_CAPTURE", + "FEEDBACK_PATTERN_LIST_REORDER", + "FEEDBACK_PATTERN_LIST_SLIDER", + "FEEDBACK_PATTERN_VOLUME_KEY", + + "", + "", + "", + "", + "", + "", + "", + "", + "", + "FEEDBACK_PATTERN_SEND_SOS_MESSAGE", + "FEEDBACK_PATTERN_RINGER", + "FEEDBACK_PATTERN_NOTIFICATION", + "FEEDBACK_PATTERN_INFO", + "FEEDBACK_PATTERN_WARNING", + "FEEDBACK_PATTERN_ERROR", + "FEEDBACK_PATTERN_EMERGENCY", +}; + +static const char *common_str_pattern[] = { + "FEEDBACK_PATTERN_TAP", + "FEEDBACK_PATTERN_SIP", + "", + "", + "", + "", + "FEEDBACK_PATTERN_KEY0", + "FEEDBACK_PATTERN_KEY1", + "FEEDBACK_PATTERN_KEY2", + "FEEDBACK_PATTERN_KEY3", + "FEEDBACK_PATTERN_KEY4", + "FEEDBACK_PATTERN_KEY5", + "FEEDBACK_PATTERN_KEY6", + "FEEDBACK_PATTERN_KEY7", + "FEEDBACK_PATTERN_KEY8", + "FEEDBACK_PATTERN_KEY9", + "FEEDBACK_PATTERN_KEY_STAR", + "FEEDBACK_PATTERN_KEY_SHARP", + "FEEDBACK_PATTERN_KEY_BACK", + "FEEDBACK_PATTERN_HOLD", + "", + "FEEDBACK_PATTERN_HW_TAP", + "FEEDBACK_PATTERN_HW_HOLD", + + "FEEDBACK_PATTERN_MESSAGE", + "", + "FEEDBACK_PATTERN_EMAIL", + "", + "FEEDBACK_PATTERN_WAKEUP", + "", + "FEEDBACK_PATTERN_SCHEDULE", + "", + "FEEDBACK_PATTERN_TIMER", + "", + "FEEDBACK_PATTERN_GENERAL", + "", + "", + + "FEEDBACK_PATTERN_POWERON", + "FEEDBACK_PATTERN_POWEROFF", + "FEEDBACK_PATTERN_CHARGERCONN", + "", + "FEEDBACK_PATTERN_CHARGING_ERROR", + "", + "FEEDBACK_PATTERN_FULLCHARGED", + "", + "FEEDBACK_PATTERN_LOWBATT", + "", + "FEEDBACK_PATTERN_LOCK", + "FEEDBACK_PATTERN_UNLOCK", + "", + "", + "", + "", + "", + "", + "", + "FEEDBACK_PATTERN_VIBRATION_ON", + "FEEDBACK_PATTERN_SILENT_OFF", + "FEEDBACK_PATTERN_BT_CONNECTED", + "FEEDBACK_PATTERN_BT_DISCONNECTED", + "", + "", + "", + "FEEDBACK_PATTERN_LIST_REORDER", + "FEEDBACK_PATTERN_LIST_SLIDER", + "FEEDBACK_PATTERN_VOLUME_KEY", + + "", + "", + "", + "", + "", + "", + "", + "", + "", +}; + +typedef enum { + PROFILE_NONE = -1, + PROFILE_MOBILE = 1, + PROFILE_WEARABLE = 2, + PROFILE_COMMON = 3, +} profile_e; + +static int callstatus; +static int lock_sndstatus; +static int camerastatus; +static int shutter_sndstatus; +static int noti_vibstatus; +static int vib_level; +static int noti_level; +static int feedbackstatus; + +static char *profile_name = NULL; + +#define PROFILE "tizen.org/feature/profile" +#define PROFILE_MOBILE_STRING "mobile" +#define PROFILE_WEARABLE_STRING "wearable" +#define PROFILE_COMMON_STRING "common" + +static profile_e get_profile(void) +{ + int ret; + int len; + char *profile = NULL; + static int set = 0; + + if (set != 0) + return set; + + ret = system_info_get_platform_string(PROFILE, &profile); + if (ret < 0) { + _E("Cannot get profile(%d)", ret); + return PROFILE_NONE; + } + + len = strlen(profile) + 1; + if (!strncmp(PROFILE_MOBILE_STRING, profile, len)) + set = PROFILE_MOBILE; + else if (!strncmp(PROFILE_WEARABLE_STRING, profile, len)) + set = PROFILE_WEARABLE; + else + set = PROFILE_COMMON; + + free(profile); + return set; +} + +static char *profile_get_name() +{ + int prof; + + if (profile_name) + return profile_name; + + prof = get_profile(); + + if (prof == PROFILE_MOBILE) + profile_name = PROFILE_MOBILE_STRING; + else if (prof == PROFILE_WEARABLE) + profile_name = PROFILE_WEARABLE_STRING; + else + profile_name = PROFILE_COMMON_STRING; + + return profile_name; +} + +static const char *profile_str_pattern(int pattern) +{ + int prof; + + prof = get_profile(); + + if (prof == PROFILE_MOBILE) + return mobile_str_pattern[pattern]; + else if (prof == PROFILE_WEARABLE) + return wearable_str_pattern[pattern]; + else + return common_str_pattern[pattern]; + +} + +//LCOV_EXCL_START Not called Callback +static void feedback_callstatus_cb(keynode_t *key, void* data) +{ + callstatus = vconf_keynode_get_int(key); +} + +static void feedback_lock_sndstatus_cb(keynode_t *key, void* data) +{ + lock_sndstatus = vconf_keynode_get_bool(key); +} + +static void feedback_camerastatus_cb(keynode_t *key, void* data) +{ + camerastatus = vconf_keynode_get_int(key); +} + +static void feedback_noti_vibstatus_cb(keynode_t *key, void* data) +{ + noti_vibstatus = vconf_keynode_get_bool(key); +} + +static void feedback_vib_cb(keynode_t *key, void* data) +{ + vib_level = vconf_keynode_get_int(key); +} + +static void feedback_noti_cb(keynode_t *key, void* data) +{ + noti_level = vconf_keynode_get_int(key); +} + +static void feedback_feedbackstatus_cb(keynode_t *key, void* data) +{ + feedbackstatus = vconf_keynode_get_bool(key); +} +//LCOV_EXCL_STOP + +static void profile_init(void) +{ + int prof; + + prof = get_profile(); + + if (prof == PROFILE_COMMON) + return; + else if (prof == PROFILE_MOBILE) { + if (vconf_get_bool(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, &lock_sndstatus) < 0) + _W("VCONFKEY_SETAPPL_SOUND_LOCK_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE + vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, feedback_lock_sndstatus_cb, NULL); + } + + /* check call status */ + if (vconf_get_int(VCONFKEY_CALL_STATE, &callstatus) < 0) + _W("VCONFKEY_CALL_STATE ==> FAIL!!"); //LCOV_EXCL_LINE + + /* check camera status */ + if (vconf_get_int(VCONFKEY_CAMERA_STATE, &camerastatus) < 0) + _W("VCONFKEY_CAMERA_STATE ==> FAIL!!"); //LCOV_EXCL_LINE + + /* shutter sound policy */ + /* This vconf is read just once, because this value is not changed in running time. */ + if (vconf_get_int(VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY, &shutter_sndstatus) < 0) + _W("VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY ==> FAIL!!"); //LCOV_EXCL_LINE + + /* check vibration status */ + if (vconf_get_bool(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, ¬i_vibstatus) < 0) + _W("VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE + + /* check vib_level */ + if (vconf_get_int(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, &vib_level) < 0) + _W("VCONFKEY_FEEDBACK_VIBRATION_LEVEL_INT ==> FAIL!!"); //LCOV_EXCL_LINE + + /* check noti_level */ + if (vconf_get_int(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, ¬i_level) < 0) + _W("VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT ==> FAIL!!"); //LCOV_EXCL_LINE + + /* feedback Init */ + if (vconf_get_bool(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, &feedbackstatus) < 0) + _W("VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL ==> FAIL!!"); //LCOV_EXCL_LINE + + /* add watch for status value */ + vconf_notify_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb, NULL); + vconf_notify_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb, NULL); + vconf_notify_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb, NULL); + vconf_notify_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb, NULL); + vconf_notify_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb, NULL); + vconf_notify_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb, NULL); +} + +static void profile_exit(void) +{ + int prof; + + prof = get_profile(); + + if (prof == PROFILE_COMMON) + return; + else if (prof == PROFILE_MOBILE) + vconf_ignore_key_changed(VCONFKEY_SETAPPL_SOUND_LOCK_BOOL, feedback_lock_sndstatus_cb); + + /* remove watch */ + vconf_ignore_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb); + vconf_ignore_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb); + vconf_ignore_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb); + vconf_ignore_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb); + vconf_ignore_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb); + vconf_ignore_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb); +} + +static bool profile_get_switched_pattern(int pattern, int *switched) +{ + int prof; + + prof = get_profile(); + + if (prof == PROFILE_COMMON) + return false; + + if (!switched) + return false; + + if (callstatus == VCONFKEY_CALL_OFF) + return false; + + /* in case of call connected or connecting */ + _D("Call status is connected or connecting."); //LCOV_EXCL_LINE + if (pattern == FEEDBACK_PATTERN_MESSAGE) + *switched = FEEDBACK_PATTERN_MESSAGE_ON_CALL; + else if (pattern == FEEDBACK_PATTERN_EMAIL) + *switched = FEEDBACK_PATTERN_EMAIL_ON_CALL; + else if (pattern == FEEDBACK_PATTERN_WAKEUP) + *switched = FEEDBACK_PATTERN_WAKEUP_ON_CALL; + else if (pattern == FEEDBACK_PATTERN_SCHEDULE) + *switched = FEEDBACK_PATTERN_SCHEDULE_ON_CALL; + else if (pattern == FEEDBACK_PATTERN_TIMER) + *switched = FEEDBACK_PATTERN_TIMER_ON_CALL; + else if (pattern == FEEDBACK_PATTERN_GENERAL) + *switched = FEEDBACK_PATTERN_GENERAL_ON_CALL; + else if (pattern == FEEDBACK_PATTERN_CHARGERCONN) + *switched = FEEDBACK_PATTERN_CHARGERCONN_ON_CALL; + else if (pattern == FEEDBACK_PATTERN_CHARGING_ERROR) + *switched = FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL; + else if (pattern == FEEDBACK_PATTERN_FULLCHARGED) + *switched = FEEDBACK_PATTERN_FULLCHARGED_ON_CALL; + else if (pattern == FEEDBACK_PATTERN_LOWBATT) + *switched = FEEDBACK_PATTERN_LOWBATT_ON_CALL; + else + return false; + + return true; +} + +static bool mobile_is_notification_type(int pattern) +{ + switch (pattern) { + case FEEDBACK_PATTERN_WAKEUP: + case FEEDBACK_PATTERN_WAKEUP_ON_CALL: + case FEEDBACK_PATTERN_TIMER: + case FEEDBACK_PATTERN_TIMER_ON_CALL: + case FEEDBACK_PATTERN_MESSAGE ... FEEDBACK_PATTERN_EMAIL_ON_CALL: + case FEEDBACK_PATTERN_SCHEDULE: + case FEEDBACK_PATTERN_SCHEDULE_ON_CALL: + case FEEDBACK_PATTERN_GENERAL ... FEEDBACK_PATTERN_LOWBATT_ON_CALL: + return true; + } + return false; +} + +static bool wearable_is_notification_type(int pattern) +{ + switch (pattern) { + case FEEDBACK_PATTERN_WAKEUP: + case FEEDBACK_PATTERN_WAKEUP_ON_CALL: + case FEEDBACK_PATTERN_TIMER: + case FEEDBACK_PATTERN_TIMER_ON_CALL: + return false; + case FEEDBACK_PATTERN_MESSAGE ... FEEDBACK_PATTERN_EMAIL_ON_CALL: + case FEEDBACK_PATTERN_SCHEDULE: + case FEEDBACK_PATTERN_SCHEDULE_ON_CALL: + case FEEDBACK_PATTERN_GENERAL ... FEEDBACK_PATTERN_LOWBATT_ON_CALL: + return true; + } + return false; +} + +static bool profile_is_notification_type(int pattern) +{ + int prof; + + prof = get_profile(); + + if (prof == PROFILE_MOBILE) + return mobile_is_notification_type(pattern); + else if (prof == PROFILE_WEARABLE) + return wearable_is_notification_type(pattern); + else + return false; +} + +static int profile_get_priority(int pattern) +{ + return PRIORITY_MIDDLE; +} + +static bool mobile_get_always_alert_case(int type, int pattern) +{ + switch (pattern) { + case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK: + case FEEDBACK_PATTERN_HOLD: + if (CHECK_VIBRATION(type) && feedbackstatus) + return true; + break; + case FEEDBACK_PATTERN_SIP: + if (CHECK_VIBRATION(type)) + return true; + break; + case FEEDBACK_PATTERN_MESSAGE: + case FEEDBACK_PATTERN_EMAIL: + if (CHECK_VIBRATION(type) && noti_vibstatus) + return true; + break; + case FEEDBACK_PATTERN_TIMER: + case FEEDBACK_PATTERN_TIMER_ON_CALL: + if (CHECK_VIBRATION(type)) + return true; + break; + case FEEDBACK_PATTERN_WAKEUP: + case FEEDBACK_PATTERN_WAKEUP_ON_CALL: + return true; + case FEEDBACK_PATTERN_MESSAGE_ON_CALL: + case FEEDBACK_PATTERN_EMAIL_ON_CALL: + case FEEDBACK_PATTERN_GENERAL_ON_CALL: + break; + case FEEDBACK_PATTERN_CHARGERCONN_ON_CALL: + case FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL: + case FEEDBACK_PATTERN_LOWBATT_ON_CALL: + /* no matter sound profile */ + if (CHECK_VIBRATION(type)) + return true; + break; + case FEEDBACK_PATTERN_SEND_SOS_MESSAGE: + case FEEDBACK_PATTERN_OUTGOING_CALL: + return true; + case FEEDBACK_PATTERN_SCREEN_CAPTURE: + if (CHECK_SOUND(type) && camerastatus && shutter_sndstatus) + return true; + break; + case FEEDBACK_PATTERN_RINGER: + return true; + default: + break; + } + return false; +} + +static bool wearable_get_always_alert_case(int type, int pattern) +{ + if (CHECK_SOUND(type)) { + switch (pattern) { + case FEEDBACK_PATTERN_WAKEUP: + case FEEDBACK_PATTERN_WAKEUP_ON_CALL: + return true; + case FEEDBACK_PATTERN_MESSAGE_ON_CALL: + case FEEDBACK_PATTERN_EMAIL_ON_CALL: + case FEEDBACK_PATTERN_GENERAL_ON_CALL: + break; + case FEEDBACK_PATTERN_SEND_SOS_MESSAGE: + return true; + case FEEDBACK_PATTERN_SCREEN_CAPTURE: + if (camerastatus && shutter_sndstatus) + return true; + break; + case FEEDBACK_PATTERN_OUTGOING_CALL: + return true; + default: + break; + } + } else if (CHECK_VIBRATION(type)) { + switch (pattern) { + case FEEDBACK_PATTERN_TAP: + case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK: + case FEEDBACK_PATTERN_HOLD: + if (feedbackstatus) + return true; + break; + case FEEDBACK_PATTERN_MESSAGE: + case FEEDBACK_PATTERN_EMAIL: + case FEEDBACK_PATTERN_GENERAL: + case FEEDBACK_PATTERN_SCHEDULE: + if (noti_vibstatus) + return true; + break; + case FEEDBACK_PATTERN_SIP: + case FEEDBACK_PATTERN_TIMER: + case FEEDBACK_PATTERN_TIMER_ON_CALL: + case FEEDBACK_PATTERN_WAKEUP: + case FEEDBACK_PATTERN_WAKEUP_ON_CALL: + case FEEDBACK_PATTERN_MESSAGE_ON_CALL: + case FEEDBACK_PATTERN_EMAIL_ON_CALL: + case FEEDBACK_PATTERN_GENERAL_ON_CALL: + case FEEDBACK_PATTERN_CHARGERCONN_ON_CALL: + case FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL: + case FEEDBACK_PATTERN_LOWBATT_ON_CALL: + case FEEDBACK_PATTERN_BT_DISCONNECTED: + case FEEDBACK_PATTERN_SEND_SOS_MESSAGE: + case FEEDBACK_PATTERN_OUTGOING_CALL: + return true; + default: + break; + } + } + return false; +} + +static bool common_get_always_alert_case(int type, int pattern) +{ + switch (pattern) { + case FEEDBACK_PATTERN_SIP: + case FEEDBACK_PATTERN_TIMER: + if (CHECK_VIBRATION(type)) + return true; + break; + case FEEDBACK_PATTERN_WAKEUP: + return true; + default: + break; + } + return false; +} + +static bool profile_get_always_alert_case(int type, int pattern) +{ + int prof; + + prof = get_profile(); + + if (prof == PROFILE_MOBILE) + return mobile_get_always_alert_case(type, pattern); + else if (prof == PROFILE_WEARABLE) + return wearable_get_always_alert_case(type, pattern); + else + return common_get_always_alert_case(type, pattern); +} + +static bool mobile_get_always_off_case(int type, int pattern) +{ + int ret; + + /* check if the state of voice recorder is recording */ + if (vconf_get_int(VCONFKEY_RECORDER_STATE, &ret) < 0) { + _W("fail to get media sound status, status will be zero"); //LCOV_EXCL_LINE + ret = 0; + } + + if (CHECK_SOUND(type) && ret == VCONFKEY_RECORDER_STATE_RECORDING) { + _D("voice recording status is RECORDING"); //LCOV_EXCL_LINE + return true; + } + + switch (pattern) { + case FEEDBACK_PATTERN_TAP: + case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD: + if (CHECK_SOUND(type) && !is_touch_sndstatus()) + return true; + break; + case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK: + if (CHECK_SOUND(type) && !is_keytone_sndstatus()) + return true; + else if (CHECK_VIBRATION(type) && !feedbackstatus) + return true; + break; + case FEEDBACK_PATTERN_LOCK: + case FEEDBACK_PATTERN_UNLOCK: + if (CHECK_SOUND(type) && !lock_sndstatus) + return true; + break; + default: + break; + } + return false; +} + +static bool wearable_is_system_type(int pattern) +{ + switch (pattern) { + case FEEDBACK_PATTERN_POWERON ... FEEDBACK_PATTERN_VOLUME_KEY: + return true; + } + return false; +} + +static bool wearable_get_always_off_case(int type, int pattern) +{ + int ret; + + if (CHECK_SOUND(type)) { + if ((wearable_is_notification_type(pattern) || wearable_is_system_type(pattern)) && + callstatus) { + _W("skip %s sound during call", profile_str_pattern(pattern)); + return true; + } + /* check if the state of voice recorder is recording */ + if (vconf_get_int(VCONFKEY_RECORDER_STATE, &ret) == 0 && + ret == VCONFKEY_RECORDER_STATE_RECORDING) { + _D("voice recording status is RECORDING"); + return true; + } + + switch (pattern) { + case FEEDBACK_PATTERN_TAP: + case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD: + if (!is_touch_sndstatus()) + return true; + break; + case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK: + if (!is_keytone_sndstatus()) + return true; + break; + default: + break; + } + } else if (CHECK_VIBRATION(type)) { + switch (pattern) { + case FEEDBACK_PATTERN_TAP: + case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK: + case FEEDBACK_PATTERN_HOLD: + if (!feedbackstatus) + return true; + break; + default: + break; + } + } + return false; +} + +static bool common_get_always_off_case(int type, int pattern) +{ + switch (pattern) { + case FEEDBACK_PATTERN_TAP ... FEEDBACK_PATTERN_SIP: + case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD: + if (CHECK_SOUND(type) && !is_touch_sndstatus()) + return true; + break; + case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK: + if (CHECK_SOUND(type) && !is_keytone_sndstatus()) + return true; + break; + default: + break; + } + return false; +} + +static bool profile_get_always_off_case(int type, int pattern) +{ + int prof; + + prof = get_profile(); + + if (prof == PROFILE_MOBILE) + return mobile_get_always_off_case(type, pattern); + else if (prof == PROFILE_WEARABLE) + return wearable_get_always_off_case(type, pattern); + else + return common_get_always_off_case(type, pattern); +} + +static int mobile_get_strength_type(int type, int pattern) +{ + if (CHECK_SOUND(type)) { + if (pattern == FEEDBACK_PATTERN_TAP) + return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH; + else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK) + return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER; + else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY) + return VOLUME_TYPE_RINGTONE; + else if (camerastatus && shutter_sndstatus && pattern == FEEDBACK_PATTERN_SCREEN_CAPTURE) + return VOLUME_TYPE_FIXED; + else + return VOLUME_TYPE_SYSTEM; + } else if (CHECK_VIBRATION(type)) { + if (pattern >= FEEDBACK_PATTERN_MESSAGE && + pattern <= FEEDBACK_PATTERN_GENERAL) + return noti_level * HAPTIC_FEEDBACK_STEP; + else + return vib_level * HAPTIC_FEEDBACK_STEP; + } + + return -EINVAL; +} + +static int wearable_get_strength_type(int type, int pattern) +{ + if (CHECK_SOUND(type)) { + if (pattern == FEEDBACK_PATTERN_TAP) + return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH; + else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK) + return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER; + else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY || pattern == FEEDBACK_PATTERN_SILENT_OFF) + return VOLUME_TYPE_RINGTONE; + else if (camerastatus && shutter_sndstatus && pattern == FEEDBACK_PATTERN_SCREEN_CAPTURE) + return VOLUME_TYPE_FIXED; + return VOLUME_TYPE_SYSTEM; + } else if (CHECK_VIBRATION(type)) { + if (pattern >= FEEDBACK_PATTERN_TAP && pattern <= FEEDBACK_PATTERN_HW_HOLD) { + _D("use default level"); + return DEFAULT_VIB_LEVEL * HAPTIC_FEEDBACK_STEP; + } + /* if call status is ON, vibration magnitude is 20% */ + if (pattern != FEEDBACK_PATTERN_RINGER && + (callstatus == VCONFKEY_CALL_VOICE_ACTIVE || callstatus == VCONFKEY_CALL_VIDEO_ACTIVE)) { + _W("force change weak level"); + return HAPTIC_FEEDBACK_STEP; + } + return noti_level * HAPTIC_FEEDBACK_STEP; + } + return -EINVAL; +} + +static int common_get_strength_type(int type, int pattern) +{ + if (CHECK_SOUND(type)) { + if (pattern == FEEDBACK_PATTERN_TAP) + return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH; + else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK) + return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER; + else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY) + return VOLUME_TYPE_RINGTONE; + else + return VOLUME_TYPE_SYSTEM; + } else if (CHECK_VIBRATION(type)) { + return DEFAULT_VIB_LEVEL * HAPTIC_FEEDBACK_STEP; + } + + return -EINVAL; +} + +static int profile_get_strength_type(int type, int pattern) +{ + int prof; + + prof = get_profile(); + + if (prof == PROFILE_MOBILE) + return mobile_get_strength_type(type, pattern); + else if (prof == PROFILE_WEARABLE) + return wearable_get_strength_type(type, pattern); + else + return common_get_strength_type(type, pattern); +} + +static const struct profile_ops feedback_profile_ops = { + .profile = profile_get_name, + .init = profile_init, + .exit = profile_exit, + .get_switched_pattern = profile_get_switched_pattern, + .get_always_alert_case = profile_get_always_alert_case, + .get_always_off_case = profile_get_always_off_case, + .get_strength_type = profile_get_strength_type, + .get_priority = profile_get_priority, + .is_notification_type = profile_is_notification_type, + .max_type = FEEDBACK_TYPE_END, + .max_pattern = FEEDBACK_PATTERN_INTERNAL_END, + .str_type = profile_str_type, + .str_pattern = profile_str_pattern, +}; + +PROFILE_OPS_REGISTER(&feedback_profile_ops); diff --git a/src/feedback.c b/src/feedback.c index f0ebded..52b9b7f 100644 --- a/src/feedback.c +++ b/src/feedback.c @@ -131,7 +131,7 @@ API int feedback_play(feedback_pattern_e pattern) result = profile->get_switched_pattern(pattern, &switched); if (result) { _W("pattern is changed : (%s) -> (%s)", //LCOV_EXCL_LINE - profile->str_pattern[pattern], profile->str_pattern[switched]); + profile->str_pattern(pattern), profile->str_pattern(switched)); pattern = switched; } } @@ -184,7 +184,7 @@ API int feedback_play_type(feedback_type_e type, feedback_pattern_e pattern) result = profile->get_switched_pattern(pattern, &switched); if (result) { _W("pattern is changed : (%s) -> (%s)", //LCOV_EXCL_LINE - profile->str_pattern[pattern], profile->str_pattern[switched]); + profile->str_pattern(pattern), profile->str_pattern(switched)); pattern = switched; } } @@ -271,7 +271,7 @@ API int feedback_is_supported_pattern(feedback_type_e type, feedback_pattern_e p result = profile->get_switched_pattern(pattern, &switched); if (result) { _W("pattern is changed : (%s) -> (%s)", //LCOV_EXCL_LINE - profile->str_pattern[pattern], profile->str_pattern[switched]); + profile->str_pattern(pattern), profile->str_pattern(switched)); pattern = switched; } } @@ -289,7 +289,7 @@ API int feedback_is_supported_pattern(feedback_type_e type, feedback_pattern_e p else if (err == -ECOMM || err == -EACCES) return FEEDBACK_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE System Error else if (err < 0) { - _E("fail to invoke is_supported() : pattern(%s)", profile->str_pattern[pattern]); //LCOV_EXCL_LINE + _E("fail to invoke is_supported() : pattern(%s)", profile->str_pattern(pattern)); //LCOV_EXCL_LINE return FEEDBACK_ERROR_OPERATION_FAILED; } @@ -324,7 +324,7 @@ API int feedback_play_type_by_name(char *type, char *pattern) pattern_max = profile->max_pattern; for (epattern = 0; epattern < pattern_max; ++epattern) { - if (!strncmp(pattern, profile->str_pattern[epattern], strlen(pattern))) + if (!strncmp(pattern, profile->str_pattern(epattern), strlen(pattern))) break; } diff --git a/src/parser.c b/src/parser.c index 3bde6a6..26b0cb9 100644 --- a/src/parser.c +++ b/src/parser.c @@ -157,15 +157,15 @@ static int load_config(struct parse_result *result, void *user_data) value = result->value; for (i = 0; i < profile->max_pattern; i++) { - if (!profile->str_pattern[i]) + if (!profile->str_pattern(i)) continue; - if (!MATCH(name, (char *)profile->str_pattern[i])) + if (!MATCH(name, (char *)profile->str_pattern(i))) continue; info->data[i].origin = strdup(value); if (!info->data[i].origin) _E("fail to copy %s sound data", //LCOV_EXCL_LINE - profile->str_pattern[i]); + profile->str_pattern(i)); break; } diff --git a/src/profiles.h b/src/profiles.h index 398b78d..508205b 100644 --- a/src/profiles.h +++ b/src/profiles.h @@ -31,7 +31,7 @@ enum priority_level { }; struct profile_ops { - const char *profile; + char *(*profile)(void); void (*init) (void); void (*exit) (void); bool (*get_switched_pattern)(int pattern, int *switched); @@ -43,7 +43,7 @@ struct profile_ops { const int max_type; const int max_pattern; const char **str_type; - const char **str_pattern; + const char *(*str_pattern)(int pattern); }; #define PROFILE_OPS_REGISTER(ops) \ diff --git a/src/sound.c b/src/sound.c index f2e107c..1a5bc35 100644 --- a/src/sound.c +++ b/src/sound.c @@ -143,7 +143,7 @@ static int sound_play(feedback_pattern_e pattern) if (sndstatus && profile->get_always_off_case && profile->get_always_off_case(FEEDBACK_TYPE_SOUND, pattern)) { - _D("Sound always off condition(pattern %s)", profile->str_pattern[pattern]); //LCOV_EXCL_LINE + _D("Sound always off condition(pattern %s)", profile->str_pattern(pattern)); //LCOV_EXCL_LINE return 0; } @@ -206,7 +206,7 @@ static int sound_get_path(feedback_pattern_e pattern, char *buf, unsigned int bu cur_path = get_data(pattern); if (!cur_path) { _E("This pattern(%s) in sound type is not supported to play", - profile->str_pattern[pattern]); + profile->str_pattern(pattern)); cur_path = "NULL"; ret = -ENOENT; } @@ -238,7 +238,7 @@ static int sound_set_path(feedback_pattern_e pattern, char *path) sound_info.data[pattern].changed = strdup(path); _D("The file of pattern(%s) is changed to [%s]", - profile->str_pattern[pattern], path); + profile->str_pattern(pattern), path); return 0; } diff --git a/src/vibrator.c b/src/vibrator.c index aa0eeaf..94242ed 100644 --- a/src/vibrator.c +++ b/src/vibrator.c @@ -232,7 +232,7 @@ static int vibrator_play(feedback_pattern_e pattern) else level = DEFAULT_VIB_LEVEL * HAPTIC_FEEDBACK_STEP; - temp = strdup(profile->str_pattern[pattern]); + temp = strdup(profile->str_pattern(pattern)); data = trim_str(temp); if (!data) { free(temp); @@ -311,7 +311,7 @@ static int vibrator_is_supported(int pattern, bool *supported) } /* get vibration data */ - temp = strdup(profile->str_pattern[pattern]); + temp = strdup(profile->str_pattern(pattern)); data = trim_str(temp); if (!data) { free(temp); diff --git a/wearable/src/check.c b/wearable/src/check.c deleted file mode 100644 index f845be3..0000000 --- a/wearable/src/check.c +++ /dev/null @@ -1,425 +0,0 @@ -/* - * libfeedback - * Copyright (c) 2015 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include <stdio.h> -#include <vconf.h> - -#include "feedback.h" -#include "feedback-ids-internal.h" -#include "profiles.h" -#include "log.h" - - -static const char *wearable_str_type[] = { - "FEEDBACK_TYPE_NONE", - "FEEDBACK_TYPE_SOUND", - "FEEDBACK_TYPE_VIBRATION", -}; - -static const char *wearable_str_pattern[] = { - "FEEDBACK_PATTERN_TAP", - "FEEDBACK_PATTERN_SIP", - "", - "", - "", - "", - "FEEDBACK_PATTERN_KEY0", - "FEEDBACK_PATTERN_KEY1", - "FEEDBACK_PATTERN_KEY2", - "FEEDBACK_PATTERN_KEY3", - "FEEDBACK_PATTERN_KEY4", - "FEEDBACK_PATTERN_KEY5", - "FEEDBACK_PATTERN_KEY6", - "FEEDBACK_PATTERN_KEY7", - "FEEDBACK_PATTERN_KEY8", - "FEEDBACK_PATTERN_KEY9", - "FEEDBACK_PATTERN_KEY_STAR", - "FEEDBACK_PATTERN_KEY_SHARP", - "FEEDBACK_PATTERN_KEY_BACK", - "FEEDBACK_PATTERN_HOLD", - "", - "FEEDBACK_PATTERN_HW_TAP", - "FEEDBACK_PATTERN_HW_HOLD", - - "FEEDBACK_PATTERN_MESSAGE", - "FEEDBACK_PATTERN_MESSAGE_ON_CALL", - "FEEDBACK_PATTERN_EMAIL", - "FEEDBACK_PATTERN_EMAIL_ON_CALL", - "FEEDBACK_PATTERN_WAKEUP", - "FEEDBACK_PATTERN_WAKEUP_ON_CALL", - "FEEDBACK_PATTERN_SCHEDULE", - "FEEDBACK_PATTERN_SCHEDULE_ON_CALL", - "FEEDBACK_PATTERN_TIMER", - "FEEDBACK_PATTERN_TIMER_ON_CALL", - "FEEDBACK_PATTERN_GENERAL", - "FEEDBACK_PATTERN_GENERAL_ON_CALL", - "", - - "FEEDBACK_PATTERN_POWERON", - "FEEDBACK_PATTERN_POWEROFF", - "FEEDBACK_PATTERN_CHARGERCONN", - "FEEDBACK_PATTERN_CHARGERCONN_ON_CALL", - "FEEDBACK_PATTERN_CHARGING_ERROR", - "FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL", - "FEEDBACK_PATTERN_FULLCHARGED", - "FEEDBACK_PATTERN_FULLCHARGED_ON_CALL", - "FEEDBACK_PATTERN_LOWBATT", - "FEEDBACK_PATTERN_LOWBATT_ON_CALL", - "FEEDBACK_PATTERN_LOCK", - "FEEDBACK_PATTERN_UNLOCK", - "", - "", - "", - "", - "", - "", - "", - "FEEDBACK_PATTERN_VIBRATION_ON", - "FEEDBACK_PATTERN_SILENT_OFF", - "FEEDBACK_PATTERN_BT_CONNECTED", - "FEEDBACK_PATTERN_BT_DISCONNECTED", - "", - "", - "FEEDBACK_PATTERN_SCREEN_CAPTURE", - "FEEDBACK_PATTERN_LIST_REORDER", - "FEEDBACK_PATTERN_LIST_SLIDER", - "FEEDBACK_PATTERN_VOLUME_KEY", - - "", - "", - "", - "", - "", - "", - "", - "", - "", - "FEEDBACK_PATTERN_SEND_SOS_MESSAGE", - "FEEDBACK_PATTERN_RINGER", - "FEEDBACK_PATTERN_NOTIFICATION", - "FEEDBACK_PATTERN_INFO", - "FEEDBACK_PATTERN_WARNING", - "FEEDBACK_PATTERN_ERROR", - "FEEDBACK_PATTERN_EMERGENCY", -}; - -static int callstatus; -static int camerastatus; -static int shutter_sndstatus; -static int noti_vibstatus; -static int vib_level; -static int noti_level; -static int feedbackstatus; - -static void feedback_callstatus_cb(keynode_t *key, void* data) -{ - callstatus = vconf_keynode_get_int(key); -} - -static void feedback_camerastatus_cb(keynode_t *key, void* data) -{ - camerastatus = vconf_keynode_get_int(key); -} - -static void feedback_noti_vibstatus_cb(keynode_t *key, void* data) -{ - noti_vibstatus = vconf_keynode_get_bool(key); -} - -static void feedback_vib_cb(keynode_t *key, void* data) -{ - vib_level = vconf_keynode_get_int(key); -} - -static void feedback_noti_cb(keynode_t *key, void* data) -{ - noti_level = vconf_keynode_get_int(key); -} - -static void feedback_feedbackstatus_cb(keynode_t *key, void* data) -{ - feedbackstatus = vconf_keynode_get_bool(key); -} - -static void wearable_init(void) -{ - /* check call status */ - if (vconf_get_int(VCONFKEY_CALL_STATE, &callstatus) < 0) - _W("VCONFKEY_CALL_STATE ==> FAIL!!"); - - /* check camera status */ - if (vconf_get_int(VCONFKEY_CAMERA_STATE, &camerastatus) < 0) - _W("VCONFKEY_CAMERA_STATE ==> FAIL!!"); - - /* shutter sound policy */ - /* This vconf is read just once, because this value is not changed in running time. */ - if (vconf_get_int(VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY, &shutter_sndstatus) < 0) - _W("VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY ==> FAIL!!"); - - /* check vibration status */ - if (vconf_get_bool(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, ¬i_vibstatus) < 0) - _W("VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL ==> FAIL!!"); - - /* check vib_level */ - if (vconf_get_int(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, &vib_level) < 0) - _W("VCONFKEY_FEEDBACK_VIBRATION_LEVEL_INT ==> FAIL!!"); - - /* check noti_level */ - if (vconf_get_int(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, ¬i_level) < 0) - _W("VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT ==> FAIL!!"); - - /* feedback Init */ - if (vconf_get_bool(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, &feedbackstatus) < 0) - _W("VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL ==> FAIL!!"); - - /* add watch for status value */ - vconf_notify_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb, NULL); - vconf_notify_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb, NULL); - vconf_notify_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb, NULL); - vconf_notify_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb, NULL); - vconf_notify_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb, NULL); - vconf_notify_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb, NULL); -} - -static void wearable_exit(void) -{ - /* remove watch */ - vconf_ignore_key_changed(VCONFKEY_CALL_STATE, feedback_callstatus_cb); - vconf_ignore_key_changed(VCONFKEY_CAMERA_STATE, feedback_camerastatus_cb); - vconf_ignore_key_changed(VCONFKEY_SETAPPL_VIBRATE_WHEN_NOTIFICATION_BOOL, feedback_noti_vibstatus_cb); - vconf_ignore_key_changed(VCONFKEY_SETAPPL_TOUCH_FEEDBACK_VIBRATION_LEVEL_INT, feedback_vib_cb); - vconf_ignore_key_changed(VCONFKEY_SETAPPL_NOTI_VIBRATION_LEVEL_INT, feedback_noti_cb); - vconf_ignore_key_changed(VCONFKEY_SETAPPL_HAPTIC_FEEDBACK_STATUS_BOOL, feedback_feedbackstatus_cb); -} - -static bool wearable_get_switched_pattern(int pattern, int *switched) -{ - if (!switched) - return false; - - if (callstatus == VCONFKEY_CALL_OFF) - return false; - - /* in case of call connected or connecting */ - _D("Call status is connected or connecting."); - if (pattern == FEEDBACK_PATTERN_MESSAGE) - *switched = FEEDBACK_PATTERN_MESSAGE_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_EMAIL) - *switched = FEEDBACK_PATTERN_EMAIL_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_WAKEUP) - *switched = FEEDBACK_PATTERN_WAKEUP_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_SCHEDULE) - *switched = FEEDBACK_PATTERN_SCHEDULE_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_TIMER) - *switched = FEEDBACK_PATTERN_TIMER_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_GENERAL) - *switched = FEEDBACK_PATTERN_GENERAL_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_CHARGERCONN) - *switched = FEEDBACK_PATTERN_CHARGERCONN_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_CHARGING_ERROR) - *switched = FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_FULLCHARGED) - *switched = FEEDBACK_PATTERN_FULLCHARGED_ON_CALL; - else if (pattern == FEEDBACK_PATTERN_LOWBATT) - *switched = FEEDBACK_PATTERN_LOWBATT_ON_CALL; - else - return false; - - return true; -} - -static bool wearable_is_notification_type(int pattern) -{ - switch (pattern) { - case FEEDBACK_PATTERN_WAKEUP: - case FEEDBACK_PATTERN_WAKEUP_ON_CALL: - case FEEDBACK_PATTERN_TIMER: - case FEEDBACK_PATTERN_TIMER_ON_CALL: - return false; - case FEEDBACK_PATTERN_MESSAGE ... FEEDBACK_PATTERN_EMAIL_ON_CALL: - case FEEDBACK_PATTERN_SCHEDULE: - case FEEDBACK_PATTERN_SCHEDULE_ON_CALL: - case FEEDBACK_PATTERN_GENERAL ... FEEDBACK_PATTERN_LOWBATT_ON_CALL: - return true; - } - return false; -} - -static bool wearable_is_system_type(int pattern) -{ - switch (pattern) { - case FEEDBACK_PATTERN_POWERON ... FEEDBACK_PATTERN_VOLUME_KEY: - return true; - } - return false; -} - -static int wearable_get_priority(int pattern) -{ - return PRIORITY_MIDDLE; -} - -static bool wearable_get_always_alert_case(int type, int pattern) -{ - if (CHECK_SOUND(type)) { - switch (pattern) { - case FEEDBACK_PATTERN_WAKEUP: - case FEEDBACK_PATTERN_WAKEUP_ON_CALL: - return true; - case FEEDBACK_PATTERN_MESSAGE_ON_CALL: - case FEEDBACK_PATTERN_EMAIL_ON_CALL: - case FEEDBACK_PATTERN_GENERAL_ON_CALL: - break; - case FEEDBACK_PATTERN_SEND_SOS_MESSAGE: - return true; - case FEEDBACK_PATTERN_SCREEN_CAPTURE: - if (camerastatus && shutter_sndstatus) - return true; - break; - case FEEDBACK_PATTERN_OUTGOING_CALL: - return true; - default: - break; - } - } else if (CHECK_VIBRATION(type)) { - switch (pattern) { - case FEEDBACK_PATTERN_TAP: - case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK: - case FEEDBACK_PATTERN_HOLD: - if (feedbackstatus) - return true; - break; - case FEEDBACK_PATTERN_MESSAGE: - case FEEDBACK_PATTERN_EMAIL: - case FEEDBACK_PATTERN_GENERAL: - case FEEDBACK_PATTERN_SCHEDULE: - if (noti_vibstatus) - return true; - break; - case FEEDBACK_PATTERN_SIP: - case FEEDBACK_PATTERN_TIMER: - case FEEDBACK_PATTERN_TIMER_ON_CALL: - case FEEDBACK_PATTERN_WAKEUP: - case FEEDBACK_PATTERN_WAKEUP_ON_CALL: - case FEEDBACK_PATTERN_MESSAGE_ON_CALL: - case FEEDBACK_PATTERN_EMAIL_ON_CALL: - case FEEDBACK_PATTERN_GENERAL_ON_CALL: - case FEEDBACK_PATTERN_CHARGERCONN_ON_CALL: - case FEEDBACK_PATTERN_CHARGING_ERROR_ON_CALL: - case FEEDBACK_PATTERN_LOWBATT_ON_CALL: - case FEEDBACK_PATTERN_BT_DISCONNECTED: - case FEEDBACK_PATTERN_SEND_SOS_MESSAGE: - case FEEDBACK_PATTERN_OUTGOING_CALL: - return true; - default: - break; - } - } - return false; -} - -static bool wearable_get_always_off_case(int type, int pattern) -{ - int ret; - - if (CHECK_SOUND(type)) { - if ((wearable_is_notification_type(pattern) || wearable_is_system_type(pattern)) && - callstatus) { - _W("skip %s sound during call", wearable_str_pattern[pattern]); - return true; - } - /* check if the state of voice recorder is recording */ - if (vconf_get_int(VCONFKEY_RECORDER_STATE, &ret) == 0 && - ret == VCONFKEY_RECORDER_STATE_RECORDING) { - _D("voice recording status is RECORDING"); - return true; - } - - switch (pattern) { - case FEEDBACK_PATTERN_TAP: - case FEEDBACK_PATTERN_HOLD ... FEEDBACK_PATTERN_HW_HOLD: - if (!is_touch_sndstatus()) - return true; - break; - case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK: - if (!is_keytone_sndstatus()) - return true; - break; - default: - break; - } - } else if (CHECK_VIBRATION(type)) { - switch (pattern) { - case FEEDBACK_PATTERN_TAP: - case FEEDBACK_PATTERN_KEY0 ... FEEDBACK_PATTERN_KEY_BACK: - case FEEDBACK_PATTERN_HOLD: - if (!feedbackstatus) - return true; - break; - default: - break; - } - } - return false; -} - -static int wearable_get_strength_type(int type, int pattern) -{ - if (CHECK_SOUND(type)) { - if (pattern == FEEDBACK_PATTERN_TAP) - return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_TOUCH; - else if (pattern >= FEEDBACK_PATTERN_KEY0 && pattern <= FEEDBACK_PATTERN_KEY_BACK) - return VOLUME_TYPE_SYSTEM|VOLUME_GAIN_DIALER; - else if (pattern == FEEDBACK_PATTERN_VOLUME_KEY || pattern == FEEDBACK_PATTERN_SILENT_OFF) - return VOLUME_TYPE_RINGTONE; - else if (camerastatus && shutter_sndstatus && pattern == FEEDBACK_PATTERN_SCREEN_CAPTURE) - return VOLUME_TYPE_FIXED; - return VOLUME_TYPE_SYSTEM; - } else if (CHECK_VIBRATION(type)) { - if (pattern >= FEEDBACK_PATTERN_TAP && pattern <= FEEDBACK_PATTERN_HW_HOLD) { - _D("use default level"); - return DEFAULT_VIB_LEVEL * HAPTIC_FEEDBACK_STEP; - } - /* if call status is ON, vibration magnitude is 20% */ - if (pattern != FEEDBACK_PATTERN_RINGER && - (callstatus == VCONFKEY_CALL_VOICE_ACTIVE || callstatus == VCONFKEY_CALL_VIDEO_ACTIVE)) { - _W("force change weak level"); - return HAPTIC_FEEDBACK_STEP; - } - return noti_level * HAPTIC_FEEDBACK_STEP; - } - return -EINVAL; -} - -static const struct profile_ops wearable_profile_ops = { - .profile = "wearable", - .init = wearable_init, - .exit = wearable_exit, - .get_switched_pattern = wearable_get_switched_pattern, - .get_always_alert_case = wearable_get_always_alert_case, - .get_always_off_case = wearable_get_always_off_case, - .get_strength_type = wearable_get_strength_type, - .get_priority = wearable_get_priority, - .is_notification_type = wearable_is_notification_type, - .max_type = FEEDBACK_TYPE_END, - .max_pattern = FEEDBACK_PATTERN_INTERNAL_END, - .str_type = wearable_str_type, - .str_pattern = wearable_str_pattern, -}; - -PROFILE_OPS_REGISTER(&wearable_profile_ops); |