diff options
Diffstat (limited to 'src/voicecall.c')
-rw-r--r-- | src/voicecall.c | 20 |
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; |