summaryrefslogtreecommitdiffstats
path: root/src/voicecall.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/voicecall.c')
-rw-r--r--src/voicecall.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/voicecall.c b/src/voicecall.c
index 36469519..ce975d35 100644
--- a/src/voicecall.c
+++ b/src/voicecall.c
@@ -734,6 +734,8 @@ static void notify_emulator_call_status(struct ofono_voicecall *vc)
{
struct ofono_modem *modem = __ofono_atom_get_modem(vc->atom);
gboolean call = FALSE;
+ unsigned int non_mpty = 0;
+ gboolean multiparty = FALSE;
gboolean held = FALSE;
gboolean incoming = FALSE;
gboolean dialing = FALSE;
@@ -751,6 +753,12 @@ static void notify_emulator_call_status(struct ofono_voicecall *vc)
switch (v->call->status) {
case CALL_STATUS_ACTIVE:
call = TRUE;
+ if (g_slist_find_custom(vc->multiparty_list,
+ GINT_TO_POINTER(v->call->id),
+ call_compare_by_id))
+ multiparty = TRUE;
+ else
+ non_mpty++;
break;
case CALL_STATUS_HELD:
@@ -801,6 +809,18 @@ static void notify_emulator_call_status(struct ofono_voicecall *vc)
if (held)
data.status = call ? OFONO_EMULATOR_CALLHELD_MULTIPLE :
OFONO_EMULATOR_CALLHELD_ON_HOLD;
+ else if (non_mpty > 1 || (non_mpty && multiparty))
+ /*
+ * After call swap, it is possible that all calls move
+ * temporarily to active state (depending on call state update
+ * order), generating an update of callheld indicator to 0.
+ * This will fail PTS test TP/TWC/BV-03-I.
+ *
+ * So, in case of multiple active calls, or an active call with
+ * an active mutiparty call, force update of callheld indicator
+ * to 2 (intermediate state allowed).
+ */
+ data.status = OFONO_EMULATOR_CALLHELD_ON_HOLD;
else
data.status = OFONO_EMULATOR_CALLHELD_NONE;