summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/Dialer.qml37
-rw-r--r--app/api/Telephony.qml20
-rw-r--r--package/config.xml1
-rw-r--r--telephony-binding/gdbus/ofono_voicecallmanager.c64
-rw-r--r--telephony-binding/gdbus/ofono_voicecallmanager.h7
-rw-r--r--telephony-binding/telephony-binding.c33
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;