binding: bluetooth: add initial avrcp controls 21/9421/1
authorMatt Ranostay <matt.ranostay@konsulko.com>
Wed, 17 May 2017 20:55:56 +0000 (13:55 -0700)
committerMatt Ranostay <matt.ranostay@konsulko.com>
Fri, 19 May 2017 06:56:53 +0000 (23:56 -0700)
These avrcp controls only work at the application level for the
settings application. The bluetooth binding at some point needs
to be converted to system level binding.

Change-Id: I5959c3939874b53c2b21115fb2a3e6a652ec0ffd
Bug-AGL: SPEC-596
Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
binding-bluetooth/bluetooth-api.c
binding-bluetooth/bluetooth-manager.c
binding-bluetooth/bluetooth-manager.h

index 31d179a..34caac5 100644 (file)
@@ -603,6 +603,54 @@ static void bt_set_property (struct afb_req request)
 
 }
 
+/**/
+static void bt_set_avrcp_controls (struct afb_req request)
+{
+    LOGD("\n");
+
+    const char *address = afb_req_value (request, "Address");
+    const char *value = afb_req_value (request, "value");
+    int ret = 0;
+    GSList *list = NULL;
+
+    if (NULL==value)
+    {
+        afb_req_fail (request, "failed", "Please Check Input Parameter");
+        return;
+    }
+
+    if (NULL == address)
+    {
+        list = adapter_get_devices_list();
+        if (NULL == list)
+        {
+            afb_req_fail (request, "failed", "No find devices");
+            return;
+        }
+
+        for (;list;list=list->next)
+        {
+            struct btd_device *BDdevice = list->data;
+            //LOGD("\n%s\t%s\n",BDdevice->bdaddr,BDdevice->name);
+            if (BDdevice->avconnected)
+            {
+                address = BDdevice->bdaddr;
+                break;
+            }
+        }
+    }
+
+    ret = device_call_avrcp_method(address, value);
+    if (0 == ret)
+    {
+        afb_req_success (request, NULL, NULL);
+    }
+    else
+    {
+        afb_req_fail (request, "failed", "Bluetooth set avrcp control failed");
+    }
+}
+
 static void eventadd (struct afb_req request)
 {
        const char *tag = afb_req_value(request, "tag");
@@ -792,6 +840,7 @@ static const struct afb_verb_desc_v1 binding_verbs[]= {
 { .name = "disconnect",          .session = AFB_SESSION_NONE,      .callback = bt_disconnect,          .info = "Disconnect special device" },
 { .name = "set_device_property", .session = AFB_SESSION_NONE,      .callback = bt_set_device_property, .info = "Set special device property" },
 { .name = "set_property",        .session = AFB_SESSION_NONE,      .callback = bt_set_property,        .info = "Set Bluetooth property" },
+{ .name = "set_avrcp_controls",  .session = AFB_SESSION_NONE,      .callback = bt_set_avrcp_controls,  .info = "Set Bluetooth AVRCP controls" },
 { .name = "send_confirmation",   .session = AFB_SESSION_NONE,      .callback = bt_send_confirmation,   .info = "Send Confirmation" },
 { .name = "eventadd",            .session = AFB_SESSION_NONE,      .callback = eventadd,               .info = "adds the event of 'name' for the 'tag'"},
 { .name = "eventdel",            .session = AFB_SESSION_NONE,      .callback = eventdel,               .info = "deletes the event of 'tag'"},
index a6c4472..35c770f 100644 (file)
@@ -1519,6 +1519,65 @@ int device_set_property(const char * bdaddr, const char *property_name,
     return 0;
 }
 
+/*
+ * call remote device avrcp method
+ * Only support controls (Play, Pause, Stop, Previous, Next)
+ * If success return 0, else return -1;
+ */
+int device_call_avrcp_method(const gchar* bdaddr, const gchar* method)
+{
+    LOGD("device:%s,value:%d\n", bdaddr, method);
+
+    struct btd_device * device;
+    GError *error = NULL;
+    GVariant *value;
+    gchar *path;
+
+    if (FALSE == BluetoothManage_InitFlag_Get()) {
+        LOGW("BluetoothManage Not Init\n");
+        return -1;
+    }
+
+    if ((0!=g_strcmp0 (method, "Play"))&&
+        (0!=g_strcmp0 (method, "Pause"))&&
+        (0!=g_strcmp0 (method, "Stop"))&&
+        (0!=g_strcmp0 (method, "Previous"))&&
+        (0!=g_strcmp0 (method, "Next")))
+    {
+        LOGD("Invalid method\n");
+        return -1;
+    }
+
+    devices_list_lock();
+    device = devices_list_find_device_by_bdaddr(bdaddr);
+
+    if (NULL == device) {
+        devices_list_unlock();
+        LOGD("not find device\n");
+        return -1;
+    }
+    path = g_strdup(device->path);
+    devices_list_unlock();
+
+    value = g_dbus_connection_call_sync(cli.system_conn, BLUEZ_SERVICE,
+                    path,    MEDIA_CONTROL1_INTERFACE,
+                    method,   NULL,  NULL,
+                    G_DBUS_CALL_FLAGS_NONE, DBUS_REPLY_TIMEOUT,
+                    NULL, &error);
+
+    g_free(path);
+
+    if (NULL == value) {
+        LOGW ("Error : %s", error->message);
+        g_error_free(error);
+        return -1;
+    }
+
+    g_variant_unref(value);
+
+    return 0;
+}
+
 
 /*
  * Stops the GMainLoop
index 4a86533..9b7eee0 100644 (file)
@@ -185,6 +185,7 @@ int device_connect(const gchar *addr);
 int device_disconnect(const gchar *addr);
 //int device_disconnectProfile();
 int device_set_property(const gchar * bdaddr, const gchar *property, const gchar *value);
+int device_call_avrcp_method(const gchar* device, const gchar* method);
 
 int adapter_set_property(const gchar* property, gboolean value) ;