Set ScreenReaderEnabled property on initialization
authorLukasz Stanislawski <l.stanislaws@samsung.com>
Wed, 1 Jul 2015 12:56:56 +0000 (14:56 +0200)
committerLukasz Stanislawski <l.stanislaws@samsung.com>
Wed, 5 Aug 2015 01:27:00 +0000 (03:27 +0200)
Change-Id: I285b65d591d9f565b80dec41eaafa95b0c195a96

include/screen_reader_switch.h [new file with mode: 0644]
src/main.c
src/screen_reader_switch.c [new file with mode: 0644]

diff --git a/include/screen_reader_switch.h b/include/screen_reader_switch.h
new file mode 100644 (file)
index 0000000..67cadb3
--- /dev/null
@@ -0,0 +1,32 @@
+#ifndef _SCREEN_READER_SWITCH
+#define _SCREEN_READER_SWITCH
+
+/**
+ * @brief Set "ScreenReaderEnabled" status of AT-SPI framework
+ *
+ * Function used to iniform applications that screen reader has been enabled in
+ * the system.
+ *
+ * ScreenReaderEnabled property refers to
+ * org.a11y.Bus bus at /org/a11y/bus object path in org.a11y.Status interface
+ *
+ * @param value EINA_TRUE if screen reader should be enabled, EINA_FALSE otherwise.
+ * @return EINA_TRUE if setting 'ScreenReaderEnabled' to value has successed,
+ * EINA_FALSE otherwise
+ */
+Eina_Bool screen_reader_switch_enabled_set(Eina_Bool value);
+
+
+/**
+ * @brief Get "ScreenReaderEnabled" status of AT-SPI framework
+ *
+ * ScreenReaderEnabled property refers to
+ * org.a11y.Bus bus at /org/a11y/bus object path in org.a11y.Status interface
+ *
+ * @param value EINA_TRUE if screen reader is enabled, EINA_FALSE otherwise.
+ * @return EINA_TRUE if getting of value has successed,
+ * EINA_FALSE otherwise
+ */
+Eina_Bool screen_reader_switch_enabled_get(Eina_Bool *value);
+
+#endif
index 2a1db94..5fe0717 100644 (file)
@@ -30,6 +30,7 @@
 #include "logger.h"
 #include "screen_reader.h"
 #include "screen_reader_gestures.h"
+#include "screen_reader_switch.h"
 
 #define MAX_STACK_FRAMES 64
 static void *stack_traces[MAX_STACK_FRAMES];
@@ -200,8 +201,8 @@ static int app_create(void *data)
    elm_init(0, NULL);
 
    logger_init();
+   screen_reader_switch_enabled_set(EINA_TRUE);
    screen_reader_create_service(data);
-
 #ifndef SCREEN_READER_TV
    screen_reader_gestures_init();
    navigator_init();
@@ -222,6 +223,8 @@ static int app_terminate(void *data)
 #endif
    DEBUG("terminate service");
    screen_reader_terminate_service(data);
+   DEBUG("clear ScreenReaderEnabled property");
+   screen_reader_switch_enabled_set(EINA_FALSE);
    DEBUG("terminate logger");
    logger_shutdown();
    DEBUG("screen reader terminated");
diff --git a/src/screen_reader_switch.c b/src/screen_reader_switch.c
new file mode 100644 (file)
index 0000000..5afcae5
--- /dev/null
@@ -0,0 +1,151 @@
+#include "logger.h"
+#include <Eldbus.h>
+
+Eina_Bool screen_reader_switch_enabled_get(Eina_Bool *value)
+{
+   Eldbus_Connection *conn;
+   Eldbus_Object *dobj;
+   Eldbus_Proxy *proxy;
+   Eldbus_Message *req, *reply;
+   const char *errname = NULL, *errmsg = NULL;
+   Eina_Bool ret = EINA_FALSE;
+   Eldbus_Message_Iter *iter;
+
+   eldbus_init();
+
+   if (!(conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION)))
+     {
+        ERROR("Connection to session bus failed");
+        return EINA_FALSE;
+     }
+   if (!(dobj = eldbus_object_get(conn, "org.a11y.Bus", "/org/a11y/bus")))
+     {
+        ERROR("Failed to create eldbus object for /org/a11y/bus");
+        goto fail_obj;
+     }
+   if (!(proxy = eldbus_proxy_get(dobj, "org.freedesktop.DBus.Properties")))
+     {
+        ERROR("Failed to create proxy object for 'org.freedesktop.DBus.Properties'");
+        goto fail_proxy;
+     }
+   if (!(req = eldbus_proxy_method_call_new(proxy, "Get")))
+     {
+        ERROR("Failed to create method call on org.freedesktop.DBus.Properties.Get");
+        goto fail_proxy;
+     }
+   eldbus_message_ref(req);
+
+   if (!eldbus_message_arguments_append(req, "ss", "org.a11y.Status", "ScreenReaderEnabled"))
+     {
+        ERROR("Failed to append message args");
+        goto fail_msg;
+     }
+
+   reply = eldbus_proxy_send_and_block(proxy, req, 100);
+   if (!reply || eldbus_message_error_get(reply, &errname, &errmsg))
+     {
+        ERROR("Unable to call method org.freedesktop.DBus.Properties.Get: %s %s", errname, errmsg);
+        goto fail_msg;
+     }
+
+   if (!eldbus_message_arguments_get(reply, "v", &iter))
+     {
+        ERROR("Invalid answer signature");
+        goto fail_msg;
+     }
+   else
+     {
+        if (!eldbus_message_iter_arguments_get(iter, "b", value))
+          {
+             ERROR("Invalid variant signature");
+          }
+        else
+           ret = EINA_TRUE;
+     }
+
+fail_msg:
+   eldbus_message_unref(req);
+fail_proxy:
+   eldbus_object_unref(dobj);
+fail_obj:
+   eldbus_connection_unref(conn);
+
+   eldbus_shutdown();
+
+   return ret;
+}
+
+Eina_Bool screen_reader_switch_enabled_set(Eina_Bool value)
+{
+   Eldbus_Connection *conn;
+   Eldbus_Object *dobj;
+   Eldbus_Proxy *proxy;
+   Eldbus_Message *req, *reply;
+   const char *errname = NULL, *errmsg = NULL;
+   Eina_Bool ret = EINA_FALSE;
+   Eldbus_Message_Iter *iter;
+
+   eldbus_init();
+
+   if (!(conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION)))
+     {
+        ERROR("Connection to session bus failed");
+        return EINA_FALSE;
+     }
+   if (!(dobj = eldbus_object_get(conn, "org.a11y.Bus", "/org/a11y/bus")))
+     {
+        ERROR("Failed to create eldbus object");
+        goto fail_obj;
+     }
+   if (!(proxy = eldbus_proxy_get(dobj, "org.freedesktop.DBus.Properties")))
+     {
+        ERROR("Failed to create proxy object for 'org.freedesktop.DBus.Properties'");
+        goto fail_proxy;
+     }
+   if (!(req = eldbus_proxy_method_call_new(proxy, "Set")))
+     {
+        ERROR("Failed to create method call on org.freedesktop.DBus.Properties.Set");
+        goto fail_proxy;
+     }
+   eldbus_message_ref(req);
+
+   if (!eldbus_message_arguments_append(req, "ss", "org.a11y.Status", "ScreenReaderEnabled"))
+     {
+        ERROR("Failed to append message args");
+        goto fail_msg;
+     }
+   if (!(iter = eldbus_message_iter_container_new(eldbus_message_iter_get(req), 'v', "b")))
+     {
+        ERROR("Unable to create variant iterator");
+        goto fail_msg;
+     }
+   if (!eldbus_message_iter_arguments_append(iter, "b", value))
+     {
+        ERROR("Unable to append to variant iterator");
+        goto fail_msg;
+     }
+   if (!eldbus_message_iter_container_close(eldbus_message_iter_get(req), iter))
+     {
+        ERROR("Failed to close variant iterator");
+        goto fail_msg;
+     }
+   reply = eldbus_proxy_send_and_block(proxy, req, 100.0);
+   if (!reply || eldbus_message_error_get(reply, &errname, &errmsg))
+     {
+        ERROR("Send failed: %s %s\n", errname, errmsg);
+        goto fail_msg;
+     }
+   else
+        ret = EINA_TRUE;
+
+fail_msg:
+   eldbus_message_unref(req);
+fail_proxy:
+   eldbus_object_unref(dobj);
+fail_obj:
+   eldbus_connection_unref(conn);
+
+   eldbus_shutdown();
+
+   return ret;
+}