hfp: Handle extra CCWA event
authorKuba Pawlak <kubax.t.pawlak@intel.com>
Tue, 18 Aug 2015 17:53:28 +0000 (19:53 +0200)
committerDenis Kenzior <denkenz@gmail.com>
Mon, 24 Aug 2015 21:29:29 +0000 (16:29 -0500)
When a call is waitng, CCWA event is sent and call object
in state WAITING is created. on ReleaseAndAnswer it is
promoted to INCOMING and later to ACTIVE.
iPhones send an extra CCWA event when active call is ended.
This extra event is creating a second call object in state
WAITING. It is not possible to have two WAITING calls, but
previously waiting call was already promoted to INCOMING.
For a brief time we have two calls from the same number,
one INCOMING and one WAITING. Later WAITING one is removed.
As we cannot have a waiting and incoming call at the same
time, ignore CCWA when there is already an INCOMING call.

< \r\n+CIEV: 3,3\r\n
< \r\n+CIEV: 2,1\r\n
< \r\n+CIEV: 3,0\r\n
< \r\n+CCWA: "01234567890",129,1,"Me"\r\n
< \r\n+CIEV: 3,1\r\n
> AT+CLCC\r
< \r\n+CLCC: 1,0,0,0,0,"09876543210",129,"Me"\r\n
< \r\n+CLCC: 2,1,5,0,0,"01234567890",129,"Me"\r\n
< \r\nOK\r\n
< \r\n+CIEV: 2,0\r\n
< \r\n+CCWA: "01234567890",129,1,"Me"\r\n
< \r\n+CIEV: 2,1\r\n
< \r\n+CIEV: 3,0\r\n
> AT+CLCC\r
< \r\n+CLCC: 2,1,0,0,0,"01234567890",129,"Me"\r\n
< \r\nOK\r\n

drivers/hfpmodem/voicecall.c

index f1e9096940328f05415cf5a6f3bed9ceaf447fe3..d0e9353796c335a1fc876779345eedeb6556345d 100644 (file)
@@ -715,6 +715,16 @@ static void ccwa_notify(GAtResult *result, gpointer user_data)
                                at_util_call_compare_by_status))
                return;
 
+       /* some phones may send extra CCWA after active call is ended
+        * this would trigger creation of second call in state 'WAITING'
+        * as our previous WAITING call has been promoted to INCOMING
+        */
+       if (g_slist_find_custom(vd->calls,
+                               GINT_TO_POINTER(CALL_STATUS_INCOMING),
+                               at_util_call_compare_by_status))
+               return;
+
+
        g_at_result_iter_init(&iter, result);
 
        if (!g_at_result_iter_next(&iter, "+CCWA:"))