diff options
-rw-r--r-- | app/Dialer.qml | 37 | ||||
-rw-r--r-- | app/api/Telephony.qml | 20 | ||||
-rw-r--r-- | package/config.xml | 1 | ||||
-rw-r--r-- | telephony-binding/gdbus/ofono_voicecallmanager.c | 64 | ||||
-rw-r--r-- | telephony-binding/gdbus/ofono_voicecallmanager.h | 7 | ||||
-rw-r--r-- | telephony-binding/telephony-binding.c | 33 |
6 files changed, 142 insertions, 20 deletions
diff --git a/app/Dialer.qml b/app/Dialer.qml index 49495b3..5dc800a 100644 --- a/app/Dialer.qml +++ b/app/Dialer.qml @@ -28,6 +28,33 @@ Item { API.Telephony { id: telephony url: bindingAddress + property string callStatus: "idle" + property string callClipColp: "" + + onCallStatusChanged: { + if (callStatus == "incoming") { + ringtone.active = true + callStatusLabel.text = "Incoming call from " + callClipColp + } else if (callStatus == "dialing") { + callStatusLabel.text = "Calling " + callClipColp + } else if (callStatus == "idle") { + ringtone.active = false + callStatusLabel.text = "" + } + } + } + + Loader { + id: ringtone + active: false + sourceComponent: Component { + SoundEffect { + loops: SoundEffect.Infinite + source: './Phone.wav' + category: 'phone' + Component.onCompleted: play() + } + } } signal showContacts @@ -105,6 +132,12 @@ Item { } } + Label { + id: callStatusLabel + Layout.alignment: Qt.AlignHCenter + text: "" + } + ToggleButton { id: callButton Layout.alignment: Qt.AlignHCenter @@ -123,11 +156,11 @@ Item { if (contact.name === '') contact.name = 'Unknown' history.insert(0, contact) - telephony.dial(number.text) + telephony.dial(number.text) } else { name.text = '' number.text = '' - telephony.hangup() + telephony.hangup() } } } diff --git a/app/api/Telephony.qml b/app/api/Telephony.qml index 25af055..721a51a 100644 --- a/app/api/Telephony.qml +++ b/app/api/Telephony.qml @@ -39,7 +39,6 @@ WebSocket { var json = JSON.parse(message) var request = json[2].request var response = json[2].response - console.debug("response: " + JSON.stringify(response)) switch (json[0]) { case msgid.call: break @@ -52,10 +51,22 @@ WebSocket { console.debug("Hangup response") } break - case msg.reterr: + case msgid.reterr: root.statusString = "Bad return value, binding probably not installed" break - case MessageId.event: + case msgid.event: + var payload = JSON.parse(JSON.stringify(json[2])) + var event = payload.event + var data = payload.data + if (event == "telephony/incomingCall") { + callClipColp = data.clip + callStatus = "incoming" + } else if (event == "telephony/dialingCall") { + callClipColp = data.colp + callStatus = "dialing" + } else if (event == "telephony/terminatedCall") { + callStatus = "idle" + } break } } @@ -63,7 +74,6 @@ WebSocket { onStatusChanged: { switch (status) { case WebSocket.Open: - console.debug("onStatusChanged: Open") break case WebSocket.Error: root.statusString = "WebSocket error: " + root.errorString @@ -73,13 +83,11 @@ WebSocket { function sendSocketMesage(verb, parameter) { var requestJson = [ msgid.call, payloadLength, apiString + '/' + verb, parameter ] - console.debug("sendSocketMessage: " + JSON.stringify(requestJson)) verbs.push(verb) sendTextMessage(JSON.stringify(requestJson)) } function dial(number) { - console.debug("Dialing " + number) var parameterJson = { value: number } sendSocketMesage("dial", parameterJson) } diff --git a/package/config.xml b/package/config.xml index 8ebe8b8..6cff9d8 100644 --- a/package/config.xml +++ b/package/config.xml @@ -11,6 +11,7 @@ </feature> <feature name="urn:AGL:widget:required-permission"> <param name="urn:AGL:permission::public:no-htdocs" value="required" /> + <param name="http://tizen.org/privilege/internal/dbus" value="required" /> </feature> </widget> diff --git a/telephony-binding/gdbus/ofono_voicecallmanager.c b/telephony-binding/gdbus/ofono_voicecallmanager.c index 2beadc0..aab4f69 100644 --- a/telephony-binding/gdbus/ofono_voicecallmanager.c +++ b/telephony-binding/gdbus/ofono_voicecallmanager.c @@ -14,9 +14,10 @@ * limitations under the License. */ +#define _GNU_SOURCE + #include <string.h> -#define _GNU_SOURCE #include <afb/afb-binding.h> #include "ofono_voicecallmanager_interface.h" @@ -30,26 +31,38 @@ static void call_added(OrgOfonoVoiceCallManager *manager, GVariantIter *iter; gchar *key; GVariant *value; - const gchar *state, *clip = NULL; + const gchar *state, *cl = NULL; g_variant_get(properties, "a{sv}", &iter); while (g_variant_iter_loop(iter, "{sv}", &key, &value)) { - if (!strcmp(key, "State")) + if (!strcmp(key, "State")) { state = g_variant_get_string(value, NULL); - else if (!strcmp(key, "LineIdentification")) { - clip = g_variant_get_string(value, NULL); + } else if (!strcmp(key, "LineIdentification")) { + cl = g_variant_get_string(value, NULL); } } if (!strcmp(state, "incoming")) { - g_signal_emit_by_name(manager, "incoming-call", op, clip ? clip : ""); + g_signal_emit_by_name(manager, "incoming-call", op, cl ? cl : ""); + } else if (!strcmp(state, "dialing")) { + g_signal_emit_by_name(manager, "dialing-call", op, cl ? cl : ""); } } +static void call_removed(OrgOfonoVoiceCallManager *manager, + gchar *op, + GVariant *properties) +{ + g_signal_emit_by_name(manager, "terminated-call", op); +} + + const OrgOfonoVoiceCallManager *ofono_voicecallmanager_init(const struct afb_binding_interface *iface, const gchar *op, - void (*incoming_call)(OrgOfonoVoiceCallManager *manager,gchar *)) + void (*incoming_call)(OrgOfonoVoiceCallManager *manager,gchar *,gchar *), + void (*dialing_call)(OrgOfonoVoiceCallManager *manager,gchar *,gchar *), + void (*terminated_call)(OrgOfonoVoiceCallManager *manager,gchar *)) { interface = iface; @@ -69,14 +82,49 @@ const OrgOfonoVoiceCallManager G_TYPE_STRING, G_TYPE_STRING); + g_signal_new("dialing-call", + G_TYPE_OBJECT, + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, + 2, + G_TYPE_STRING, + G_TYPE_STRING); + + g_signal_new("terminated-call", + G_TYPE_OBJECT, + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, + 1, + G_TYPE_STRING); + if (g_signal_connect(G_OBJECT(manager), "incoming-call", G_CALLBACK(incoming_call), NULL) <= 0) { - ERROR(interface, "Failed to connect to signal call-added\n"); + ERROR(interface, "Failed to connect to signal incoming-call\n"); + } + + if (g_signal_connect(G_OBJECT(manager), "dialing-call", G_CALLBACK(dialing_call), NULL) <= 0) { + ERROR(interface, "Failed to connect to signal dialing-call\n"); + } + + if (g_signal_connect(G_OBJECT(manager), "terminated-call", G_CALLBACK(terminated_call), NULL) <= 0) { + ERROR(interface, "Failed to connect to signal terminated-call\n"); } if (g_signal_connect(manager, "call-added", G_CALLBACK(call_added), NULL) <= 0) { ERROR(interface, "Failed to connect to signal call-added\n"); } + if (g_signal_connect(manager, "call-removed", G_CALLBACK(call_removed), NULL) <= 0) { + ERROR(interface, "Failed to connect to signal call-removed\n"); + } + return manager; } diff --git a/telephony-binding/gdbus/ofono_voicecallmanager.h b/telephony-binding/gdbus/ofono_voicecallmanager.h index a5c3ae1..19ec509 100644 --- a/telephony-binding/gdbus/ofono_voicecallmanager.h +++ b/telephony-binding/gdbus/ofono_voicecallmanager.h @@ -18,6 +18,11 @@ #include "ofono_voicecallmanager_interface.h" -OrgOfonoVoiceCallManager *ofono_voicecallmanager_init(const struct afb_binding_interface *iface, const gchar *, void(*)(OrgOfonoVoiceCallManager *manager, gchar *, gchar *)); +OrgOfonoVoiceCallManager +*ofono_voicecallmanager_init(const struct afb_binding_interface *, + const gchar *, + void(*)(OrgOfonoVoiceCallManager *, gchar *, gchar *), + void(*)(OrgOfonoVoiceCallManager *, gchar *, gchar *), + void(*)(OrgOfonoVoiceCallManager *, gchar *)); gchar *ofono_voicecallmanager_dial(OrgOfonoVoiceCallManager *, gchar *, gchar *); void ofono_hangup_all(OrgOfonoVoiceCallManager *); diff --git a/telephony-binding/telephony-binding.c b/telephony-binding/telephony-binding.c index 6edecd3..bf618ce 100644 --- a/telephony-binding/telephony-binding.c +++ b/telephony-binding/telephony-binding.c @@ -78,11 +78,35 @@ static void hangup(struct afb_req request) } -static void incoming_call_cb(OrgOfonoVoiceCallManager *manager, gchar *op, gchar *clip) { - WARNING(interface, "Incoming call from %s\n", clip); +static void incoming_call_cb(OrgOfonoVoiceCallManager *manager, gchar *op, gchar *clip) +{ + struct json_object *call_info; + + call_info = json_object_new_object(); + json_object_object_add(call_info, "clip", json_object_new_string(clip)); + afb_daemon_broadcast_event(interface->daemon, "incomingCall", call_info); incoming_call = strdup(op); } +static void dialing_call_cb(OrgOfonoVoiceCallManager *manager, gchar *op, gchar *colp) +{ + struct json_object *call_info; + + call_info = json_object_new_object(); + json_object_object_add(call_info, "colp", json_object_new_string(colp)); + afb_daemon_broadcast_event(interface->daemon, "dialingCall", call_info); +} + +static void terminated_call_cb(OrgOfonoVoiceCallManager *manager, gchar *op) +{ + if (incoming_call) { + free(incoming_call); + incoming_call = NULL; + } + + afb_daemon_broadcast_event(interface->daemon, "terminatedCall", NULL); +} + static void *main_loop_thread(void *unused) { GMainLoop *loop = g_main_loop_new(NULL, FALSE); @@ -101,7 +125,10 @@ static int ofono_init(void) ofono_manager_init(interface); const gchar *modem_path = ofono_manager_get_default_modem_path(); DEBUG(interface, "modem_path: %s\n", modem_path); - vcm = ofono_voicecallmanager_init(interface, modem_path, incoming_call_cb); + vcm = ofono_voicecallmanager_init(interface, modem_path, + incoming_call_cb, + dialing_call_cb, + terminated_call_cb); if (!vcm) { ERROR(interface, "Failed to initialize voice call manager\n"); ret = -1; |