summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Porter <mporter@konsulko.com>2017-05-18 22:43:27 -0400
committerMatt Porter <mporter@konsulko.com>2017-05-19 10:01:02 -0400
commit91520f0839b47641162b2f4ba5e788f6a602b4e4 (patch)
tree47864b1e5d5c3ff1e5145a34bb4dbd4206af75f2
parented2a6d1359b7967d56172c0a37660181722a2019 (diff)
Add telephony binding event support and UI call status notification
Add supports for incoming call, dialing call, and terminated call events in the telephony binding. The phone UI is enhanced to make use of these telephony binding events to display a notifications of phone call status. These include generate a ring tone and displaying incoming phone number information, outgoing phone number being dialed, and halt of the ring tone and clearing of the notification space when a call is terminated. AGL-Bug: SPEC-598 Change-Id: Ied610b70c2e6edb1f631decd417cdbd39746a558 Signed-off-by: Matt Porter <mporter@konsulko.com>
-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;