summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpr.jung <pr.jung@samsung.com>2017-02-24 18:07:14 +0900
committerpr.jung <pr.jung@samsung.com>2017-02-24 20:02:48 +0900
commit65ff796c7477d405fbc97e3a3cc4605d8da5f7e6 (patch)
tree9a26536d0ea32a594b0a60d8ee551010107143d7
parent01d9d29620f741fcb81637d5b94710d26554d894 (diff)
downloadlibsvi-accepted/tizen_common.tar.gz
libsvi-accepted/tizen_common.tar.bz2
libsvi-accepted/tizen_common.zip
- 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.c175
-rw-r--r--mobile/src/check.c417
-rw-r--r--src/check.c951
-rw-r--r--src/feedback.c10
-rw-r--r--src/parser.c6
-rw-r--r--src/profiles.h4
-rw-r--r--src/sound.c6
-rw-r--r--src/vibrator.c4
-rw-r--r--wearable/src/check.c425
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, &noti_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, &noti_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, &noti_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, &noti_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, &noti_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, &noti_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);