TizenRefApp-8236 [Apps Shortcut Widget] Implement Screen Reader for widget edit appli... 79/120779/3
authorIgor Olshevskyi <i.olshevskyi@samsung.com>
Thu, 23 Mar 2017 07:10:21 +0000 (09:10 +0200)
committerIgor Olshevskyi <i.olshevskyi@samsung.com>
Fri, 24 Mar 2017 11:51:35 +0000 (13:51 +0200)
Change-Id: I4148badf898c4e1f6f5eb75e11169b5ce30a9f1d

12 files changed:
apptray-widget-app/CMakeLists.txt
apptray-widget-app/edc/apptray_wgt_app_edit_slots_ly.edc
apptray-widget-app/edc/apptray_wgt_app_slots.edc
apptray-widget-app/inc/apptray_wgt_app_accessibility_utils.h [new file with mode: 0644]
apptray-widget-app/inc/apptray_wgt_app_common_def.h
apptray-widget-app/inc/apptray_wgt_app_item_info.h
apptray-widget-app/inc/apptray_wgt_app_utils.h
apptray-widget-app/org.tizen.apptray-widget.xml
apptray-widget-app/src/apptray_wgt_app.c
apptray-widget-app/src/apptray_wgt_app_accessibility_utils.c [new file with mode: 0644]
apptray-widget-app/src/apptray_wgt_app_utils.c
apptray-widget-app/tizen-manifest.xml

index c4329792cac7b0df174f72cd2c05537662215c25..6b278a2a6c28e6d875054a4bdf13a4a22fae2b57 100755 (executable)
@@ -6,6 +6,7 @@ SET(SRCS
         src/apptray_wgt_app_key.c
         src/apptray_wgt_app_utils.c
         src/apptray_wgt_app_item_info.c
+        src/apptray_wgt_app_accessibility_utils.c
 )
 
 SET(VENDOR "tizen")
index ad89d0fe1c663354086f1da1d84fc3315423113c..9808a67b4fc7c566716a02801a9357eb2eafeec4 100644 (file)
@@ -56,6 +56,18 @@ group {
                                color: 0 0 0 255;
                        }
                }
+               part {
+                       name: "ao_rect";
+                       type: RECT;
+                       scale: 1;
+                       description { state: "default" 0.0;
+                               fixed: 0 1;
+                               min: 0 1;
+                               max: -1 1;
+                               align: 0.0 0.0;
+                               color: 0 0 0 0;
+                       }
+               }
                part {
                        name: "edit_stroke";
                        type: IMAGE;
index b6e6687e85ece1a0a2f4829b7fc11c8ee0c839f7..211e2f32eb4c10b482d3b35856a0c2ab3af1527c 100644 (file)
@@ -32,7 +32,7 @@ styles {
 #define SHORTCUT_APP_DEL_BTN_SIZE_MIN 63 63
 
 group {
-       name: "empty_slot";
+       name: "elm/button/base/apptray/empty_slot";
        images {
                image: "apps_widget_edit_plus.png" COMP;
                image: "apps_widget_edit_stroke.png" COMP;
@@ -89,94 +89,70 @@ group {
        programs {
                program {
                        signal: "pressed";
-                       source: "widget_plus";
+                       source: "*";
                        action: STATE_SET "pressed" 0.0;
                        target: "widget_plus";
                        target: "widget_bg_stroke";
                }
                program {
-                       signal: "released";
-                       source: "widget_plus";
+                       signal: "unpressed";
+                       source: "*";
                        action: STATE_SET "default" 0.0;
                        target: "widget_plus";
                        target: "widget_bg_stroke";
                }
-               program{
+               program {
                        name: "mouse_clicked";
-                       signal: "mouse,clicked,*";
+                       signal: "mouse,clicked,1";
                        source: "widget_plus";
-                       action: SIGNAL_EMIT "mouse_clicked" "*";
+                       action: SIGNAL_EMIT "elm,action,click" "";
                }
        }
 }
 
 group {
-       name: "icon_slot";
-       images {
-               image: "widget_del_bg.png" COMP;
-               image: "widget_del_icon.png" COMP;
-               image: "widget_del_shadow.png" COMP;
-       }
+       name: "elm/button/base/apptray/icon_slot";
        parts {
                part {
-                       name: "bg";
-                       type: SPACER;
-                       description {
-                               state: "default" 0.0;
-                       }
-               }
-               part {
-                       name: "icon";
+                       name: "content";
                        type: SWALLOW;
-                       clip_to: "clipper";
                        scale: 1;
                        mouse_events: 1;
                        description {
                                state: "default" 0.0;
-                               align: 0.5 0.0;
-                               fixed: 1 1;
-                               rel1 { relative: 0.0 0.0; to: "bg"; }
-                               rel2 { relative: 1.0 1.0; to: "bg"; }
-                               min : SHORTCUT_APP_ICON_DIMENTION;
-                               max : SHORTCUT_APP_ICON_DIMENTION;
                        }
                }
-               part{
-                       name: "name";
-                       type: TEXTBLOCK;
-                       mouse_events : 0;
-                       description {
-                               state: "default" 0.0;
-                               rel1 { relative: 0.0 1.0; to : "icon"; }
-                               rel2 { relative: 1.0 1.0; to : "icon"; }
-                               align: 0.5 0.0;
-                               fixed : 1 1;
-                               min : SHORTCUT_APP_TXT_DIMENTION;
-                               max : SHORTCUT_APP_TXT_DIMENTION;
-                               text.style: "app_name";
-                       }
-                       description { state: "hide" 0.0;
-                               inherit: "default" 0.0;
-                               visible: 0;
-                       }
+       }
+       programs {
+               program {
+                       signal: "pressed";
+                       source: "*";
+                       action: STATE_SET "pressed" 0.0;
+                       target: "content";
                }
-               part {
-                       name: "clipper";
-                       type: RECT;
-                       scale: 1;
-                       mouse_events: 1;
-                       description {
-                               state: "default" 0.0;
-                               rel1 { relative: 0.0 0.0; to: "icon"; }
-                               rel2 { relative: 1.0 1.0; to: "icon"; }
-                               color : 255 255 255 255;
-                       }
-                       description {
-                               state: "hide" 0.0;
-                               inherit: "default" 0.0;
-                               color : 255 255 255 127;
-                       }
+               program {
+                       signal: "unpressed";
+                       source: "*";
+                       action: STATE_SET "default" 0.0;
+                       target: "content";
+               }
+               program {
+                       name: "mouse_clicked";
+                       signal: "mouse,clicked,1";
+                       source: "content";
+                       action: SIGNAL_EMIT "elm,action,click" "";
                }
+       }
+}
+
+group {
+       name: "elm/button/base/apptray/delete_btn";
+       images {
+               image: "widget_del_bg.png" COMP;
+               image: "widget_del_icon.png" COMP;
+               image: "widget_del_shadow.png" COMP;
+       }
+       parts {
                part {
                        name: "del_icon_bg";
                        type: IMAGE;
@@ -185,11 +161,10 @@ group {
                        description {
                                state: "default" 0.0;
                                align: 1.0 0.0;
-                               rel1 { relative: 1.0 0.0; to: "icon"; offset: SHORTCUT_APP_DEL_BTN_OFFSET; }
-                               rel2 { relative: 1.0 0.0; to: "icon"; offset: SHORTCUT_APP_DEL_BTN_OFFSET; }
                                image.normal: "widget_del_bg.png";
                                color_class: "AO044L1";
                                min: SHORTCUT_APP_DEL_BTN_SIZE_MIN;
+                               max: SHORTCUT_APP_DEL_BTN_SIZE_MIN;
                                fixed: 1 1;
                        }
                        description {
@@ -197,11 +172,6 @@ group {
                                inherit: "default" 0.0;
                                color_class: "AO044L1P";
                        }
-                       description {
-                               state: "hide" 0.0;
-                               inherit: "default" 0.0;
-                               visible: 0;
-                       }
                }
                part {
                        name: "del_icon";
@@ -211,8 +181,8 @@ group {
                        description {
                                state: "default" 0.0;
                                align: 1.0 0.0;
-                               rel1 { relative: 1.0 0.0; to: "icon"; offset: SHORTCUT_APP_DEL_BTN_OFFSET; }
-                               rel2 { relative: 1.0 0.0; to: "icon"; offset: SHORTCUT_APP_DEL_BTN_OFFSET; }
+                               rel1 { relative: 0.0 0.0; to: "del_icon_bg"; }
+                               rel2 { relative: 1.0 1.0; to: "del_icon_bg"; }
                                image.normal: "widget_del_icon.png";
                                color_class: "AO044L3";
                                min: SHORTCUT_APP_DEL_BTN_SIZE_MIN;
@@ -223,11 +193,6 @@ group {
                                inherit: "default" 0.0;
                                color_class: "AO044L3P";
                        }
-                       description {
-                               state: "hide" 0.0;
-                               inherit: "default" 0.0;
-                               visible: 0;
-                       }
                }
                part {
                        name: "del_icon_shadow";
@@ -237,25 +202,19 @@ group {
                        description {
                                state: "default" 0.0;
                                align: 1.0 0.0;
-                               rel1 { relative: 1.0 0.0; to: "icon"; offset: SHORTCUT_APP_DEL_BTN_OFFSET; }
-                               rel2 { relative: 1.0 0.0; to: "icon"; offset: SHORTCUT_APP_DEL_BTN_OFFSET; }
+                               rel1 { relative: 0.0 0.0; to: "del_icon_bg"; }
+                               rel2 { relative: 1.0 1.0; to: "del_icon_bg"; }
                                image.normal: "widget_del_shadow.png";
                                color_class: "AO044L4";
                                min: SHORTCUT_APP_DEL_BTN_SIZE_MIN;
                                fixed: 1 1;
                        }
-                       description {
-                               state: "hide" 0.0;
-                               inherit: "default" 0.0;
-                               visible: 0;
-                       }
                }
                part {
                        name: "del_touch_rect";
                        type: RECT;
                        scale: 1;
                        mouse_events: 1;
-                       repeat_events: 1;
                        description {
                                state: "default" 0.0;
                                rel1 { relative: 0.0 0.0; to: "del_icon_bg"; }
@@ -266,43 +225,132 @@ group {
                }
        }
        programs {
-               program{
-                       name : "pressed";
-                       signal : "pressed";
-                       source : "slot";
+               program {
+                       name: "del_mouse_down";
+                       signal: "mouse,down,*";
+                       source: "del_touch_rect";
                        action : STATE_SET "pressed" 0.0;
                        target : "del_icon_bg";
                        target : "del_icon";
                }
-               program{
-                       name : "released";
-                       signal : "released";
-                       source : "slot";
+               program {
+                       name: "del_mouse_up";
+                       signal: "mouse,up,*";
+                       source: "del_touch_rect";
                        action : STATE_SET "default" 0.0;
                        target : "del_icon_bg";
                        target : "del_icon";
                }
-               program{
+               program {
+                       name: "del_mouse_clicked";
+                       signal: "mouse,clicked,*";
+                       source: "del_touch_rect";
+                       action: SIGNAL_EMIT "elm,action,click" "";
+               }
+       }
+}
+
+group {
+       name: "slot_ly";
+       parts {
+               part {
+                       name: "bg";
+                       type: SPACER;
+                       description {
+                               state: "default" 0.0;
+                       }
+               }
+               part {
+                       name: "icon";
+                       type: SWALLOW;
+                       clip_to: "clipper";
+                       scale: 1;
+                       mouse_events: 1;
+                       description {
+                               state: "default" 0.0;
+                               align: 0.5 0.0;
+                               fixed: 1 1;
+                               rel1 { relative: 0.0 0.0; to: "bg"; }
+                               rel2 { relative: 1.0 1.0; to: "bg"; }
+                               min : SHORTCUT_APP_ICON_DIMENTION;
+                               max : SHORTCUT_APP_ICON_DIMENTION;
+                       }
+               }
+               part {
+                       name: "name";
+                       type: TEXTBLOCK;
+                       mouse_events : 0;
+                       description {
+                               state: "default" 0.0;
+                               rel1 { relative: 0.0 1.0; to : "icon"; }
+                               rel2 { relative: 1.0 1.0; to : "icon"; }
+                               align: 0.5 0.0;
+                               fixed : 1 1;
+                               min : SHORTCUT_APP_TXT_DIMENTION;
+                               max : SHORTCUT_APP_TXT_DIMENTION;
+                               text.style: "app_name";
+                       }
+                       description { state: "hide" 0.0;
+                               inherit: "default" 0.0;
+                               visible: 0;
+                       }
+               }
+               part {
+                       name: "clipper";
+                       type: RECT;
+                       scale: 1;
+                       mouse_events: 1;
+                       description {
+                               state: "default" 0.0;
+                               rel1 { relative: 0.0 0.0; to: "icon"; }
+                               rel2 { relative: 1.0 1.0; to: "icon"; }
+                               color : 255 255 255 255;
+                       }
+                       description {
+                               state: "hide" 0.0;
+                               inherit: "default" 0.0;
+                               color : 255 255 255 127;
+                       }
+               }
+               part {
+                       name: "delete_ly";
+                       type: SWALLOW;
+                       scale: 1;
+                       mouse_events: 1;
+                       description {
+                               state: "default" 0.0;
+                               align: 1.0 0.0;
+                               rel1 { relative: 1.0 0.0; to: "icon"; offset: SHORTCUT_APP_DEL_BTN_OFFSET; }
+                               rel2 { relative: 1.0 0.0; to: "icon"; offset: SHORTCUT_APP_DEL_BTN_OFFSET; }
+                               min: SHORTCUT_APP_DEL_BTN_SIZE_MIN;
+                               max: SHORTCUT_APP_DEL_BTN_SIZE_MIN;
+                               fixed: 1 1;
+                       }
+                       description {
+                               state: "hide" 0.0;
+                               inherit: "default" 0.0;
+                               visible: 0;
+                       }
+               }
+       }
+       programs {
+               program {
                        name : "show";
                        signal : "show";
                        source : "slot";
                        action : STATE_SET "default" 0.0;
-                       target : "del_icon_bg";
-                       target : "del_icon";
-                       target : "del_icon_shadow";
+                       target : "delete_ly";
                        target : "name";
                }
-               program{
+               program {
                        name : "hide";
                        signal : "hide";
                        source : "slot";
                        action : STATE_SET "hide" 0.0;
-                       target : "del_icon_bg";
-                       target : "del_icon";
-                       target : "del_icon_shadow";
+                       target : "delete_ly";
                        target : "name";
                }
-               program{
+               program {
                        name : "show_vi";
                        signal : "show_vi";
                        source : "slot";
@@ -310,54 +358,19 @@ group {
                        target : "clipper";
                        transition : CUBIC_BEZIER 0.3 0.25 0.46 0.45 1.0;
                }
-               program{
+               program {
                        name : "hide_icon";
                        signal : "hide_icon";
                        source : "slot";
                        action : STATE_SET "hide" 0.0;
                        target : "clipper";
                }
-               program{
-                       name: "del_mouse_down";
-                       signal: "mouse,down,*";
-                       source: "del_touch_rect";
-                       action: SIGNAL_EMIT "del_mouse_down" "*";
-               }
-               program{
-                       name: "del_mouse_up";
-                       signal: "mouse,up,*";
-                       source: "del_touch_rect";
-                       action: SIGNAL_EMIT "del_mouse_up" "*";
-               }
-               program{
-                       name: "del_mouse_clicked";
-                       signal: "mouse,clicked,*";
-                       source: "del_touch_rect";
-                       action: SIGNAL_EMIT "del_mouse_clicked" "*";
-               }
-               program{
-                       name: "del_mouse_clicked_icon";
-                       signal: "mouse,clicked,*";
-                       source: "icon";
-                       action: SIGNAL_EMIT "del_mouse_clicked_icon" "*";
-               }
-               program{
-                       name: "mouse_down";
-                       signal: "mouse,down,*";
-                       source: "icon";
-                       action: SIGNAL_EMIT "mouse_down" "*";
-               }
-               program{
-                       name: "mouse_up";
-                       signal: "mouse,up,*";
-                       source: "icon";
-                       action: SIGNAL_EMIT "mouse_up" "*";
-               }
-               program{
-                       name: "mouse_clicked";
-                       signal: "mouse,clicked,*";
-                       source: "icon";
-                       action: SIGNAL_EMIT "mouse_clicked" "*";
+               program {
+                       name : "show_icon";
+                       signal : "show_icon";
+                       source : "slot";
+                       action : STATE_SET "default" 0.0;
+                       target : "clipper";
                }
        }
 }
diff --git a/apptray-widget-app/inc/apptray_wgt_app_accessibility_utils.h b/apptray-widget-app/inc/apptray_wgt_app_accessibility_utils.h
new file mode 100644 (file)
index 0000000..d3b6a9d
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Samsung API
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Flora License, Version 1.1 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPTRAY_WIDGET_ACCESSIBILITY_UTILS_H__
+#define __APPTRAY_WIDGET_ACCESSIBILITY_UTILS_H__
+
+#include <Elementary.h>
+#include <stdbool.h>
+
+/**
+ * @brief Registers accessible object
+ *
+ * @param[in]  parent                  Accessible object parent
+ * @param[in]  ly                              Layout from which part for creation accessible object is taken
+ * @param[in]  ly_part                 Part of layout for creation accessible object
+ *
+ * @return Accessible object on success or NULL otherwise
+ */
+Evas_Object *apptray_wgt_app_au_register_access_object(Evas_Object *parent, Evas_Object *ly, const char *ly_part);
+
+/**
+ * @brief Unregisters accessible object
+ *
+ * @param[in]  obj                     Accessible object to unregister
+ *
+ */
+void apptray_wgt_app_au_unregister_access_object(Evas_Object *obj);
+
+/**
+ * @brief Registers fake first accessible object
+ *
+ * @param[in]  parent                  Accessible object parent
+ * @param[in]  ly                              Layout from which part for creation accessible object is taken
+ * @param[in]  ly_part                 Part of layout for creation accessible object
+ *
+ * @return Accessible object on success or NULL otherwise
+ */
+Evas_Object *apptray_wgt_app_au_register_fake_access_object(Evas_Object *parent, Evas_Object *ly, const char *ly_part);
+
+/**
+ * @brief Symmetrically appends custom relationship between objects
+ *
+ * @param[in]  from                    Highlight from object
+ * @param[in]  to                              Highlight to object
+ *
+ * @return true on success or false otherwise
+ */
+bool apptray_wgt_app_au_append_symmetric_relationship(Evas_Object *from, Evas_Object *to);
+
+/**
+ * @brief Symmetrically removes custom relationship between objects
+ *
+ * @param[in]  from                    Highlight from object
+ * @param[in]  to                              Highlight to object
+ */
+void apptray_wgt_app_au_remove_symmetric_relationship(Evas_Object *from, Evas_Object *to);
+
+/**
+ * @brief Appends end point to custom relationship
+ *
+ * @param[in]  obj                     Evas object
+ *
+ * @return true on success or false otherwise
+ */
+bool apptray_wgt_app_au_append_relationship_end_point(Evas_Object *obj);
+
+/**
+ * @brief Removes end point from custom relationship
+ *
+ * @param[in]  obj                     Evas object
+ */
+void apptray_wgt_app_au_remove_relationship_end_point(Evas_Object *obj);
+
+/**
+ * @brief Appends start point to custom relationship
+ *
+ * @param[in]  obj                     Evas object
+ *
+ * @return true on success or false otherwise
+ */
+bool apptray_wgt_app_au_append_relationship_start_point(Evas_Object *obj);
+
+/**
+ * @brief Removes start point from custom relationship
+ *
+ * @param[in]  obj                     Evas object
+ */
+void apptray_wgt_app_au_remove_relationship_start_point(Evas_Object *obj);
+
+#endif /* __APPTRAY_WIDGET_ACCESSIBILITY_UTILS_H__ */
index 0503f339a52ba236f1024110415057238b655173..2ec5ea72c7b184377f3e9c496714e6bd840a99f1 100644 (file)
@@ -29,6 +29,7 @@
 
 #define BUF_SIZE_SMALL 32
 #define BUF_SIZE_NORMAL 128
+#define BUF_SIZE_LARGE 512
 #define BUF_SIZE_BIG 1024
 
 #define APP_TYPE_WGT "wgt"
@@ -39,6 +40,8 @@
 
 #define APPS_PKG "org.tizen.apptray-widget-app"
 
+#define APPTRAY_WIDGET_APP_DOMAIN "apptray-widget-app"
+
 #undef IS_STRING_EMPTY
 #define IS_STRING_EMPTY(x) !(x && x[0] != '\0')
 
                } \
        } while (0)
 
+#undef DEL_ECORE_TIMER
+#define DEL_ECORE_TIMER(ptr) \
+       do { \
+               if (ptr) { \
+                       ecore_timer_del(ptr); \
+                       ptr = NULL; \
+               } \
+       } while (0)
+
 #endif /* APPTRAY_WGT_APP_COMMON_DEF_H_ */
index 8458b85ae3c512a16fd217ed8551ca2d75d3e4e6..b4a02add27c00389ace66d3614c2e2ad622311cb 100755 (executable)
@@ -33,6 +33,7 @@ typedef struct {
        int open_app;
        int removable;
        Eina_Bool is_selected;
+       Elm_Object_Item *gl_item;
 } apptray_wgt_app_item_info_s;
 
 apptray_wgt_app_item_info_s *apptray_wgt_app_item_info_create(const char *appid);
index e57d7d3a6d4185bf9c1ac711acf36686d8d8b011..56f82667c59a16e272cdfa353bc0056aa1d9d162 100755 (executable)
@@ -20,4 +20,6 @@
 
 const char *apptray_wgt_app_utils_get_edje_path();
 
+const char *apptray_wgt_app_utils_get_locale_path();
+
 #endif /* __APPTRAY_WGT_APP_UTIL_H__ */
index 0a5e3519b1c19541d5a4ef1b4f2fb9cbbf0e3c4a..1873dd72d5229f94b93fed15b860e7d5bd801468 100755 (executable)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <manifest xmlns="http://tizen.org/ns/packages" api-version="3.0" package="org.tizen.apptray-widget" version="1.0.0">
     <profile name="wearable"/>
-    <ui-application appid="org.tizen.apptray-widget-app" exec="apptray-widget-app" multiple="false" nodisplay="true" taskmanage="true" type="capp" hw-acceleration="on">
+    <ui-application appid="org.tizen.apptray-widget-app" exec="apptray-widget-app" multiple="false" nodisplay="true" taskmanage="false" type="capp" hw-acceleration="on">
         <label>Apps</label>
         <icon>org.tizen.apptray-widget-app.png</icon>
     </ui-application>
index cf88ca7f10c84a2fdb1da77c3a05857648f1264e..05f42d3dadae439482bc7244d8408bd11e39c832 100755 (executable)
 #include <bundle.h>
 #include <efl_extension.h>
 #include <system_settings.h>
+#include <elm_theme.h>
 
 #include "apptray_wgt_app_item_info.h"
 #include "apptray_wgt_app_key.h"
 #include "apptray_wgt_app_log.h"
 #include "apptray_wgt_app_utils.h"
 #include "apptray_wgt_app_common_def.h"
+#include "apptray_wgt_app_accessibility_utils.h"
 
-#define DEFAULT_APP_ORDER "org.tizen.apptray-widget-app org.tizen.watch-setting empty empty"
+#define DEFAULT_APP_ORDER              "org.tizen.apptray-widget-app org.tizen.watch-setting empty empty"
 
-#define APP_WIDGET_CONTENT_KEY "org.tizen.apptray-widget"
+#define APP_WIDGET_CONTENT_KEY         "org.tizen.apptray-widget"
 
-#define BUNDLE_KEY_SHORTCUT_LIST               "shortcut_list"
-#define BUNDLE_KEY_WIDGET_INSTANCE_ID  "instance_id"
+#define BUNDLE_KEY_SHORTCUT_LIST       "shortcut_list"
+#define BUNDLE_KEY_WIDGET_INSTANCE_ID  "instance_id"
 
-#define APP_SLOTS_MAX_COUNT 4
-#define GENLIST_ITEM_ICON_DIMENTION 76
+#define APP_SLOTS_MAX_COUNT            4
+#define GENLIST_ITEM_ICON_DIMENSION    76
 
-#define SLOT_ITEM_MOVE_THRESHOLD 50
-#define SLOT_ITEM_DIMENSION 110
-#define SLOT_ITEM_SET_POS_THRESHOLD (SLOT_ITEM_DIMENSION - SLOT_ITEM_MOVE_THRESHOLD)
+#define SLOT_ITEM_MOVE_THRESHOLD       50
+#define SLOT_ITEM_DIMENSION            110
+#define SLOT_ITEM_SET_POS_THRESHOLD    (SLOT_ITEM_DIMENSION - SLOT_ITEM_MOVE_THRESHOLD)
 
 #define SLOT_ITEM_MOVE_THRESHOLD_VIS_X 80
 #define SLOT_ITEM_MOVE_THRESHOLD_VIS_Y 100
 
+#define CLICK_BLOCKER_TIMER_DURATION   0.1
+
+/* TODO: need replace it with IDS strings */
+#define AO_STRING_WIN_NAME              "Apps Shortcut"
+#define AO_STRING_WIDGET_NAME           AO_STRING_WIN_NAME" Widget"
+#define AO_STRING_WDIT_INSTRUCTION_NAME "Edit %s. Rotate bazel to navigate for editing."
+#define AO_STRING_UPSIDE                "Upside"
+#define AO_STRING_LEFTSIDE              "Leftside"
+#define AO_STRING_RIGHTSIDE             "Rightside"
+#define AO_STRING_BOTTOMSIDE            "Bottomside"
+#define AO_STRING_DOUBLE_TAP_TO_ADD     "Double tap to add"
+#define AO_STRING_DOUBLE_TAP_TO_REMOVE  "Double tap to remove"
+#define AO_STRING_EMPTY                 "Empty"
+
 static Elm_Genlist_Item_Class header_itc = { ELM_GEN_ITEM_CLASS_HEADER, 0 };
 static bool header_itc_inited = false;
 
@@ -121,22 +137,24 @@ typedef struct appdata {
        Evas_Object *select_win;
        Evas_Object *select_conform;
        Eext_Circle_Surface *select_circle_surf;
+       Evas_Object *circle_genlist;
        Evas_Object *select_layout;
        Evas_Object *select_gl;
        Evas_Object *select_count_btn;
        int select_count;
 
        Evas_Object *scroller;
-       Evas_Object *title;
        char *widget_instance_id;
        _apptray_wgt_launch_type_e launch_type;
        Eina_List *all_app_list;
        char *appid_list[APP_SLOTS_MAX_COUNT];
 
        Evas_Object *toast_popup;
+
+       Evas_Object *ao_first;
+       Evas_Object *ao_edit_ly;
 } appdata_s;
 
-char *widget_id = NULL;
 int slot_index = 0;
 int pressed_index = 0;
 int dst_index = 0;
@@ -144,8 +162,8 @@ Evas_Object *transit_obj = NULL;
 Eina_Bool longpress_flag = EINA_FALSE;
 Eina_Bool launch_flag = EINA_TRUE;
 Eina_Bool transit_go = EINA_FALSE;
-Ecore_Timer *longpress_timer;
-int empty_count = 0;
+Ecore_Timer *longpress_timer = NULL;
+Ecore_Timer *click_blocker_timer = NULL;
 
 static appdata_s *g_info = NULL;
 
@@ -158,58 +176,90 @@ static Evas_Object *_create_win(appdata_s *info, const char *name, const char *t
 static Eina_Bool _longpress_timer_cb(void *data);
 static void _render_post_cb(void *data, Evas *e , void *event_info);
 
-static void _plus_mouse_clicked_cb(void *data, Evas_Object *o, const char *emission, const char *source);
-static void _del_mouse_down_cb(void *data, Evas_Object *o, const char *emission, const char *source);
-static void _del_mouse_up_cb(void *data, Evas_Object *o, const char *emission, const char *source);
-static void _del_mouse_clicked_cb(void *data, Evas_Object *o, const char *emission, const char *source);
-static void _down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _app_icon_clicked_cb(void *data, Evas_Object *obj, void *event_info);
+static void _plus_clicked_cb(void *data, Evas_Object *obj, void *event_info);
 static void _transit_del_cb(void *data, Elm_Transit *transit);
 static void _anim_switch_item(Evas_Object *item, int src, int dst);
+
+static void _down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
 static void _move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
 static void _up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _create_edit_layout(appdata_s *info);
+
+static void _del_btn_click_cb(void *data, Evas_Object *obj, void *event_info);
+
 static char *_title_item_get_txt_cb(void *data, Evas_Object *obj, const char *part);
 static Elm_Genlist_Item_Class *_get_gl_itc_header();
 static char *_cont_item_get_txt_cb(void *data, Evas_Object *obj, const char *part);
+
 static void _toast_popup_hide_cb(void *data, Evas_Object *obj, void *event_info);
 static void _toast_popup_dismiss_cb(void *data, Evas_Object *obj, void *event_info);
 static void _create_toast_popup(const char *text);
+
 static void _gl_check_clicked_cb(void *data, Evas_Object *obj, void *event_info);
 static void _cont_item_del_cb(void *data, Evas_Object *obj);
 static Elm_Genlist_Item_Class *_get_gl_itc_content();
 static Elm_Genlist_Item_Class *_get_gl_itc_empty();
-static void _set_select_genlist_content(Evas_Object *genlist, appdata_s *info);
-static Evas_Object *_create_simple_genlist(Evas_Object *parent, appdata_s *info);
+
 static void _gl_add_header_item(Evas_Object *gl);
 static bool _check_already_added_apps(const char *appid);
 static void _gl_item_clicked_cb(void *data, Evas_Object *obj, void *event_info);
 static void _gl_add_apps_items(Evas_Object *gl, appdata_s *info);
 static void _gl_add_empty_item(Evas_Object *gl);
-static Evas_Object *_create_bottom_btn_ly(appdata_s *info);
 static void _bottom_btn_click_cb(void *data, Evas_Object *obj, void *event_info);
-static Evas_Object *_create_bottom_btn(Evas_Object *parent, appdata_s *info);
-static Evas_Object *_create_genlist_ly(Evas_Object *parent, appdata_s *info);
-static Evas_Object *_create_pick_genlist(Evas_Object *parent, appdata_s *info);
-static Evas_Object *_create_select_count_btn(Evas_Object *parent, appdata_s *info);
-static void _create_select_view(appdata_s *info);
 Evas_Object *_set_app_slot(const char *appid, int pos);
+static Eina_Bool _click_blocker_timer_cb(void *data);
 
 static int _apps_sort_cb(const void *d1, const void *d2);
 static int _apps_all_cb(pkgmgrinfo_appinfo_h handle, void *user_data);
 static Eina_List *_read_all_apps(Eina_List **list);
 static Eina_Bool _load_list(void* data);
-static void _process_pick_operation(appdata_s *info, app_control_h service);
-static void _process_main_operation(appdata_s *info, app_control_h service, const char *app_list);
-static bool _create_edit_window(appdata_s *info, const char *name, const char *title);
-static Evas_Object *_create_conformant_without_indicator(Evas_Object *win);
-static bool _create_select_window(appdata_s *info, const char *name, const char *title);
 
+/* Select View */
+static bool _create_select_view_window(appdata_s *info, const char *name, const char *title);
+static Evas_Object *_select_view_create_conformant(Evas_Object *win);
+static void _create_select_view(appdata_s *info);
+static Evas_Object *_select_view_create_bottom_btn(Evas_Object *parent, appdata_s *info);
+static Evas_Object *_select_view_create_genlist_ly(Evas_Object *parent, appdata_s *info);
+static Evas_Object *_select_view_create_pick_genlist(Evas_Object *parent, appdata_s *info);
+static Evas_Object *_select_view_create_select_count_btn(Evas_Object *parent, appdata_s *info);
+static Evas_Object *_select_view_create_simple_genlist(Evas_Object *parent, appdata_s *info);
+static void _select_view_set_genlist_content(Evas_Object *genlist, appdata_s *info);
+static Evas_Object *_select_view_create_bottom_btn_ly(appdata_s *info);
+static void _select_view_update_apps_label(appdata_s *ad);
+
+/* Edit View */
+static bool _create_edit_view_window(appdata_s *info, const char *name, const char *title);
+static Evas_Object *_edit_view_create_layout(appdata_s *info);
+static void _edit_view_init_slots(const char *app_list);
+static Evas_Object *_edit_view_create_slot_ly(Evas_Object *parent);
+static Evas_Object *_edit_view_create_slot_app_btn(Evas_Object *parent);
+static Evas_Object *_edit_view_create_slot_app_btn_icon(Evas_Object *parent, const char *image_path);
+static Evas_Object *_edit_view_create_slot_app_btn_del_ly(Evas_Object *parent);
+static Evas_Object *_edit_view_create_slot_empty_btn(Evas_Object *parent);
+static int _edit_view_get_slot_index_by_pointer(Evas_Object *slot);
+static void _edit_view_replace_slot_with_empty(Evas_Object *slot);
+
+/* Accessibility */
+static void _edit_view_init_ly_access_data(appdata_s *info);
+static void _edit_view_create_ly_access_obj(appdata_s *info);
+static void _edit_view_update_ly_access_info();
+static const char *_edit_view_get_slot_position_text(int index);
+static void _edit_view_update_slots_access_info();
+static void _edit_view_set_access_rout();
+static void _edit_view_unset_access_rout();
+static void _unset_access_for_window(Evas_Object *win);
+
+/* App Lifecycle */
 static bool _app_create(void *data);
 static void _app_terminate(void *data);
 static void _app_pause(void *data);
 static void _app_resume(void *data);
 static void _app_control(app_control_h service, void *data);
 static void _app_lang_changed(app_event_info_h event_info, void *user_data);
+static void _app_process_pick_operation(appdata_s *info, app_control_h service);
+static void _app_process_main_operation(appdata_s *info, app_control_h service, const char *app_list);
+
+static void _set_select_window_active_state(bool is_active);
 
 static char *strdup_s(const char *val)
 {
@@ -317,6 +367,8 @@ static Eina_Bool _longpress_timer_cb(void *data)
        Evas_Object *item = NULL;
        char buff[BUF_SIZE_NORMAL] = { 0 };
 
+       _edit_view_unset_access_rout();
+
        snprintf(buff, sizeof(buff), "index%d", pressed_index);
        item = elm_object_part_content_unset(g_info->edit_layout, buff);
        elm_object_signal_emit(item, "hide", "slot");
@@ -341,42 +393,85 @@ static void _render_post_cb(void *data, Evas *e , void *event_info)
        elm_object_signal_emit(slot, "show_vi", "slot");
 }
 
-static void _plus_mouse_clicked_cb(void *data, Evas_Object *o, const char *emission, const char *source)
+static void _app_icon_clicked_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       _D("plus clicked");
        _ENTER;
-       if (launch_flag == EINA_FALSE) {
-               launch_flag = EINA_TRUE;
+
+       int pos;
+
+       if (!launch_flag) {
+               _D("Ignore");
                return;
        }
-       slot_index = dst_index - 1;
-       _D("index:%d", slot_index);
-       evas_object_show(g_info->select_win);
+
+       pos = _edit_view_get_slot_index_by_pointer(data);
+
+       _edit_view_unset_access_rout();
+
+       _edit_view_replace_slot_with_empty(data);
+
+       _update_content();
+
+       _edit_view_update_slots_access_info();
+
+       _edit_view_set_access_rout();
+
+       char buff[BUF_SIZE_NORMAL] = { 0 };
+       snprintf(buff, sizeof(buff), "index%d", pos);
+       elm_atspi_component_highlight_grab(
+                       elm_object_part_content_get(
+                                       elm_object_part_content_get(g_info->edit_layout, buff), "icon"));
 }
 
-static void _del_mouse_down_cb(void *data, Evas_Object *o, const char *emission, const char *source)
+static int _edit_view_get_slot_index_by_pointer(Evas_Object *slot)
 {
-       _ENTER;
-       _D("del mouse down");
-       elm_object_signal_emit((Evas_Object *)data, "pressed", "slot");
+       int i = 0;
+       for (; i < APP_SLOTS_MAX_COUNT; i++) {
+               char buff[BUF_SIZE_SMALL] = { 0 };
+               snprintf(buff, sizeof(buff), "index%d", i+1);
+               if (slot == elm_object_part_content_get(g_info->edit_layout, buff)) {
+                       return i+1;
+               }
+       }
+       return 0;
+}
+
+static void _set_select_window_active_state(bool is_active)
+{
+       if (is_active) {
+               evas_object_show(g_info->select_win);
+               eext_rotary_object_event_activated_set(g_info->edit_layout, EINA_FALSE);
+               eext_rotary_object_event_activated_set(g_info->circle_genlist, EINA_TRUE);
+       } else {
+               evas_object_hide(g_info->select_win);
+               eext_rotary_object_event_activated_set(g_info->circle_genlist, EINA_FALSE);
+               eext_rotary_object_event_activated_set(g_info->edit_layout, EINA_TRUE);
+       }
 }
 
-static void _del_mouse_up_cb(void *data, Evas_Object *o, const char *emission, const char *source)
+static void _plus_clicked_cb(void *data, Evas_Object *obj, void *event_info)
 {
+       _D("plus clicked");
        _ENTER;
-       _D("del mouse up");
-       elm_object_signal_emit((Evas_Object *)data, "released", "slot");
+
+       if (!launch_flag) {
+               _D("Ignore");
+               return;
+       }
+
+       slot_index = _edit_view_get_slot_index_by_pointer((Evas_Object *)data) - 1;
+       _D("index:%d", slot_index);
+
+       _set_select_window_active_state(true);
 }
 
-static void _del_mouse_clicked_cb(void *data, Evas_Object *o, const char *emission, const char *source)
+static void _edit_view_replace_slot_with_empty(Evas_Object *slot)
 {
        _ENTER;
        _D("del mouse clicked");
 
-       char index[BUF_SIZE_SMALL] = {0};
-       Evas_Object *slot = NULL;
-       int ret = 0;
-       Evas_Coord x, y, w, h;
+       char index[BUF_SIZE_SMALL] = { 0 };
+       Evas_Object *eo = NULL;
        int pos = 0;
 
        if (transit_go) {
@@ -384,92 +479,56 @@ static void _del_mouse_clicked_cb(void *data, Evas_Object *o, const char *emissi
                return;
        }
 
-       evas_object_geometry_get((Evas_Object *)data, &x, &y, &w, &h);
-       _D("X:%d,y:%d,w:%d,h:%d",x,y,w,h);
-
-       if ((123 <= x && x <= 126) && (18 <= y && y <= 22)) {
-               pos = 1;
-       } else if ((13 <= x && x <= 17) && (115 <= y && y <= 119)) {
-               pos = 2;
-       } else if ((233 <= x && x <= 237) && (115 <= y && y <= 119)) {
-               pos = 3;
-       } else if ((123 <= x && x <= 127) && (215 <= y && y <= 219)) {
-               pos = 4;
-       } else {
-               _E("can't reach here.");
-               return;
-       }
+       pos = _edit_view_get_slot_index_by_pointer(slot);
 
-       snprintf(index, sizeof(index)-1, "index%d", pos);
+       snprintf(index, sizeof(index), "index%d", pos);
        _D("%s", index);
        slot_index = pos - 1;
-       slot = elm_object_part_content_unset(g_info->edit_layout, index);
-       if (slot) {
-               evas_object_del(slot);
-               slot = NULL;
-       }
 
+       eo = elm_object_part_content_unset(g_info->edit_layout, index);
+       DEL_EVAS_OBJECT(eo);
+
+       _set_app_slot("empty", pos - 1);
+}
+
+static void _del_btn_click_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       _ENTER;
+       _D("del mouse clicked");
+
+       _edit_view_unset_access_rout();
+
+       _edit_view_replace_slot_with_empty(data);
 
-       slot = elm_layout_add(g_info->edit_layout);
-       ret = elm_layout_file_set(slot, EDJE_PATH, "empty_slot");
-       if (ret == EINA_FALSE) {
-               _E("failed to set empty slot");
-               return;
-       }
-       evas_object_size_hint_weight_set(slot, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       evas_object_event_callback_add(slot, EVAS_CALLBACK_MOUSE_DOWN, _down_cb, slot);
-       evas_object_event_callback_add(slot, EVAS_CALLBACK_MOUSE_UP, _up_cb, slot);
-       evas_object_event_callback_add(slot, EVAS_CALLBACK_MOUSE_MOVE, _move_cb, &slot_index);
-       elm_object_signal_callback_add(slot, "mouse_clicked", "*", _plus_mouse_clicked_cb, &slot_index);
-       elm_object_part_content_set(g_info->edit_layout, index, slot);
-       evas_object_show(slot);
-       g_info->appid_list[slot_index] = strdup("empty");
-       empty_count++;
        _update_content();
 
+       _edit_view_update_slots_access_info();
+
+       _edit_view_set_access_rout();
 }
 
 static void _down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
        _ENTER;
-       Evas_Object *icon = NULL;
-       Evas_Coord x,y,w,h;
-       evas_object_geometry_get((Evas_Object *)data, &x, &y, &w, &h);
-       _D("x:%d, y:%d, w:%d, h:%d",x,y,w,h);
 
        if (transit_go) {
                _E("transit is now processing");
                return;
        }
 
-       if ((123 <= x && x <= 126) && (18 <= y && y <= 22)) {
-               pressed_index = 1;
-               dst_index = 1;
-       } else if ((13 <= x && x <= 17) && (115 <= y && y <= 119)) {
-               pressed_index = 2;
-               dst_index = 2;
-       } else if ((233 <= x && x <= 237) && (115 <= y && y <= 119)) {
-               pressed_index = 3;
-               dst_index = 3;
-       } else if ((123 <= x && x <= 127) && (215 <= y && y <= 219)) {
-               pressed_index = 4;
-               dst_index = 4;
-       } else {
-               _E("can't reach here.");
-               return;
-       }
+       int tmp = _edit_view_get_slot_index_by_pointer((Evas_Object *)data);
+       pressed_index = tmp;
+       dst_index = tmp;
 
-       icon = elm_object_part_content_get(obj, "icon");
-       evas_object_color_set(icon, 255, 255, 255, 127);
-       elm_object_signal_emit(obj, "pressed", "widget_plus");
-       longpress_timer = ecore_timer_add(0.5, _longpress_timer_cb, obj);
+       elm_object_signal_emit(data, "hide_icon", "slot");
+       longpress_timer = ecore_timer_add(0.5, _longpress_timer_cb, data);
 }
 
 static void _transit_del_cb(void *data, Elm_Transit *transit)
 {
        _ENTER;
        _D("transit end");
-       char index[BUF_SIZE_SMALL] = {0};
+       char index[BUF_SIZE_SMALL] = { 0 };
        snprintf(index, sizeof(index), "index%d", pressed_index);
        elm_object_part_content_set(g_info->edit_layout, index, transit_obj);
        pressed_index = (int)data;
@@ -520,7 +579,7 @@ static void _move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
                const int eo_new_y = cur_y - SLOT_ITEM_MOVE_THRESHOLD_VIS_Y;
                int i = 0;
 
-               evas_object_move(obj, eo_new_x, eo_new_y);
+               evas_object_move(data, eo_new_x, eo_new_y);
 
                for (i = 0; i < APP_SLOTS_MAX_COUNT; i++) {
                        if ((eo_new_x > _slot_coords[i].x - SLOT_ITEM_SET_POS_THRESHOLD
@@ -529,16 +588,20 @@ static void _move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
                                                        && eo_new_y < _slot_coords[i].y + SLOT_ITEM_SET_POS_THRESHOLD)) {
                                int slot_index = i + 1;
                                if (pressed_index != slot_index && !transit_go) {
-                                       _D("Slot %d area", slot_index);
                                        char *tmp = NULL;
                                        char buff[BUF_SIZE_SMALL] = { 0 };
+                                       Evas_Object *item;
+
+                                       _D("Slot %d area", slot_index);
 
                                        snprintf(buff, sizeof(buff), "index%d", slot_index);
-                                       Evas_Object *item = elm_object_part_content_unset(g_info->edit_layout, buff);
+                                       item = elm_object_part_content_unset(g_info->edit_layout, buff);
                                        _anim_switch_item(item, slot_index, pressed_index);
                                        tmp = strdup(g_info->appid_list[pressed_index - 1]);
+
                                        g_info->appid_list[pressed_index - 1] = strdup(g_info->appid_list[i]);
                                        g_info->appid_list[i] = strdup(tmp);
+
                                        FREE(tmp);
                                        break;
                                }
@@ -547,71 +610,274 @@ static void _move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
        }
 }
 
+static Eina_Bool _click_blocker_timer_cb(void *data)
+{
+       _ENTER;
+
+       launch_flag = EINA_TRUE;
+       click_blocker_timer = NULL;
+       return ECORE_CALLBACK_CANCEL;
+}
+
 static void _up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
        _ENTER;
        Evas_Event_Mouse_Up *ev = event_info;
-       Evas_Object *icon = NULL;
        int cur_x, cur_y;
+       char index[BUF_SIZE_SMALL] = { 0 };
+
        cur_x = ev->output.x;
        cur_y = ev->output.y;
-       _D("cur_x:%d,cur_y:%d",cur_x,cur_y);
-       char index[BUF_SIZE_SMALL] = {0};
+
+       _D("cur_x:%d, cur_y:%d", cur_x, cur_y);
+
        snprintf(index, sizeof(index), "index%d", dst_index);
-       if (longpress_timer) {
-               ecore_timer_del(longpress_timer);
-               longpress_timer = NULL;
-       }
-       if (longpress_flag == EINA_TRUE) {
-               longpress_flag = EINA_FALSE;
-               elm_object_part_content_set(g_info->edit_layout, index, obj);
-               launch_flag = EINA_FALSE;
-               _D("dst index %d", dst_index);
+
+       DEL_ECORE_TIMER(longpress_timer);
+
+       if (longpress_flag) {
+               elm_object_part_content_set(g_info->edit_layout, index, data);
        }
-       icon = elm_object_part_content_get(obj, "icon");
-       evas_object_color_set(icon, 255, 255, 255, 255);
-       elm_object_signal_emit(obj, "released", "widget_plus");
-       elm_object_signal_emit(obj, "show", "slot");
+
+       elm_object_signal_emit(data, "show", "slot");
+       elm_object_signal_emit(data, "show_icon", "slot");
 
        elm_object_signal_emit(g_info->edit_layout, "hide_edit_stroke", "edit_layout");
 
        _update_content();
+
+       _edit_view_update_slots_access_info();
+
+       _edit_view_set_access_rout();
+
+       if (longpress_flag) {
+               longpress_flag = EINA_FALSE;
+               DEL_ECORE_TIMER(click_blocker_timer);
+               click_blocker_timer = ecore_timer_add(CLICK_BLOCKER_TIMER_DURATION, _click_blocker_timer_cb, NULL);
+       }
+}
+
+static const char *_edit_view_get_slot_position_text(int index)
+{
+       switch (index) {
+       case 0:
+               return AO_STRING_UPSIDE;
+       case 1:
+               return AO_STRING_LEFTSIDE;
+       case 2:
+               return AO_STRING_RIGHTSIDE;
+       case 3:
+               return AO_STRING_BOTTOMSIDE;
+       default:
+               return NULL;
+       }
+}
+
+static void _edit_view_update_slots_access_info()
+{
+       _ENTER;
+
+       int i;
+       Evas_Object *slot;
+       char buff[BUF_SIZE_SMALL] = { 0 };
+       char name[BUF_SIZE_LARGE] = { 0 };
+       const char *label;
+
+       for (i = 0; i < APP_SLOTS_MAX_COUNT; i++) {
+               snprintf(buff, sizeof(buff), "index%d", i+1);
+               slot = elm_object_part_content_get(g_info->edit_layout, buff);
+               ret_if(!slot);
+
+               if (!IS_STRING_EMPTY(g_info->appid_list[i]) && strcmp(g_info->appid_list[i], "empty")) {
+                       label = elm_object_part_text_get(slot, "name");;
+               } else {
+                       label = AO_STRING_EMPTY;
+               }
+               snprintf(name, sizeof(name), "%s, %s.", _edit_view_get_slot_position_text(i), label);
+               elm_atspi_accessible_name_set(elm_object_part_content_get(slot, "icon"), name);
+       }
+}
+
+static void _edit_view_update_ly_access_info()
+{
+       _ENTER;
+
+       char name[BUF_SIZE_LARGE] = { 0 };
+       const char *tmp;
+
+       ret_if(!g_info->ao_edit_ly);
+
+       tmp = AO_STRING_WDIT_INSTRUCTION_NAME;
+       snprintf(name, sizeof(name), tmp, AO_STRING_WIDGET_NAME);
+       elm_atspi_accessible_name_set(g_info->ao_edit_ly, name);
+}
+
+static void _edit_view_unset_access_rout()
+{
+       _ENTER;
+
+       Evas_Object *slot;
+       Evas_Object *btn;
+       int i;
+       Evas_Object *cur_ao = NULL;
+       char buff[BUF_SIZE_SMALL] = { 0 };
+
+       if (g_info->ao_first) {
+               apptray_wgt_app_au_remove_relationship_start_point(g_info->ao_first);
+               cur_ao = g_info->ao_first;
+       }
+
+       if (g_info->ao_edit_ly) {
+               apptray_wgt_app_au_remove_symmetric_relationship(cur_ao, g_info->ao_edit_ly);
+               cur_ao = g_info->ao_edit_ly;
+       }
+
+       for (i = 0; i < APP_SLOTS_MAX_COUNT; i++) {
+               snprintf(buff, sizeof(buff), "index%d", i+1);
+               slot = elm_object_part_content_get(g_info->edit_layout, buff);
+               ret_if(!slot);
+               btn = elm_object_part_content_get(slot, "icon");
+               apptray_wgt_app_au_remove_symmetric_relationship(cur_ao, btn);
+               cur_ao = btn;
+       }
+       apptray_wgt_app_au_remove_relationship_end_point(cur_ao);
+}
+
+static void _edit_view_set_access_rout()
+{
+       _ENTER;
+
+       Evas_Object *slot;
+       Evas_Object *btn;
+       int i;
+       Evas_Object *cur_ao = NULL;
+       char buff[BUF_SIZE_SMALL] = { 0 };
+
+       if (g_info->ao_first) {
+               apptray_wgt_app_au_append_relationship_start_point(g_info->ao_first);
+               cur_ao = g_info->ao_first;
+       }
+
+       if (g_info->ao_edit_ly) {
+               apptray_wgt_app_au_append_symmetric_relationship(cur_ao, g_info->ao_edit_ly);
+               cur_ao = g_info->ao_edit_ly;
+       }
+
+       for (i = 0; i < APP_SLOTS_MAX_COUNT; i++) {
+               snprintf(buff, sizeof(buff), "index%d", i+1);
+               slot = elm_object_part_content_get(g_info->edit_layout, buff);
+               ret_if(!slot);
+               btn = elm_object_part_content_get(slot, "icon");
+               apptray_wgt_app_au_append_symmetric_relationship(cur_ao, btn);
+               cur_ao = btn;
+       }
+       apptray_wgt_app_au_append_relationship_end_point(cur_ao);
+}
+
+static Evas_Object *_edit_view_create_slot_ly(Evas_Object *parent)
+{
+       Evas_Object *eo = elm_layout_add(g_info->edit_layout);
+       retv_if(!eo, NULL);
+       elm_layout_file_set(eo, EDJE_PATH, "slot_ly");
+       evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       evas_object_show(eo);
+
+       return eo;
+}
+
+static Evas_Object *_edit_view_create_slot_app_btn(Evas_Object *parent)
+{
+       Evas_Object *eo = elm_button_add(parent);
+       retv_if(!eo, NULL);
+       elm_object_style_set(eo, "apptray/icon_slot");
+       evas_object_event_callback_add(eo, EVAS_CALLBACK_MOUSE_DOWN, _down_cb, parent);
+       evas_object_event_callback_add(eo, EVAS_CALLBACK_MOUSE_MOVE, _move_cb, parent);
+       evas_object_event_callback_add(eo, EVAS_CALLBACK_MOUSE_UP, _up_cb, parent);
+       evas_object_smart_callback_add(eo, "clicked", _app_icon_clicked_cb, parent);
+       evas_object_show(eo);
+
+       /* Accessibility */
+       elm_atspi_accessible_translation_domain_set(eo, APPTRAY_WIDGET_APP_DOMAIN);
+       elm_atspi_accessible_reading_info_type_set(eo, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME
+                       | ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+       elm_atspi_accessible_description_set(eo, AO_STRING_DOUBLE_TAP_TO_REMOVE);
+
+       return eo;
+}
+
+static Evas_Object *_edit_view_create_slot_app_btn_icon(Evas_Object *parent, const char *image_path)
+{
+       Evas_Object *eo = evas_object_image_add(evas_object_evas_get(parent));
+       retv_if(!eo, NULL);
+       evas_object_image_file_set(eo, image_path, NULL);
+       evas_object_image_filled_set(eo, EINA_TRUE);
+       evas_object_show(eo);
+
+       return eo;
+}
+
+static Evas_Object *_edit_view_create_slot_app_btn_del_ly(Evas_Object *parent)
+{
+       Evas_Object *eo = elm_button_add(parent);
+       retv_if(!eo, NULL);
+       elm_object_style_set(eo, "apptray/delete_btn");
+       evas_object_smart_callback_add(eo, "clicked", _del_btn_click_cb, parent);
+       evas_object_show(eo);
+
+       /* Accessibility */
+       elm_atspi_accessible_can_highlight_set(eo, EINA_FALSE);
+
+       return eo;
+}
+
+static Evas_Object *_edit_view_create_slot_empty_btn(Evas_Object *parent)
+{
+       Evas_Object *eo = elm_button_add(parent);
+       retv_if(!eo, NULL);
+       elm_object_style_set(eo, "apptray/empty_slot");
+       evas_object_event_callback_add(eo, EVAS_CALLBACK_MOUSE_DOWN, _down_cb, parent);
+       evas_object_event_callback_add(eo, EVAS_CALLBACK_MOUSE_MOVE, _move_cb, parent);
+       evas_object_event_callback_add(eo, EVAS_CALLBACK_MOUSE_UP, _up_cb, parent);
+       evas_object_smart_callback_add(eo, "clicked", _plus_clicked_cb, parent);
+       evas_object_show(eo);
+
+       /* Accessibility */
+       elm_atspi_accessible_translation_domain_set(eo, APPTRAY_WIDGET_APP_DOMAIN);
+       elm_atspi_accessible_reading_info_type_set(eo, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME
+                       | ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+       elm_atspi_accessible_description_set(eo, AO_STRING_DOUBLE_TAP_TO_ADD);
+
+       return eo;
 }
 
 Evas_Object *_set_app_slot(const char *appid, int pos)
 {
        _ENTER;
-       pkgmgrinfo_appinfo_h appinfo_h = NULL;
-       _D("%s", appid);
-       char *icon_path_tmp = NULL;
-       char *icon_path = NULL;
-       int ret = 0;
-       Evas_Object *slot = NULL;
-       Evas_Object *icon = NULL;
 
+       Evas_Object *slot = NULL;
+       Evas_Object *btn = NULL;
        char index[BUF_SIZE_SMALL] = { 0 };
+
+       _D("App ID [%s]", appid);
+
+       slot = _edit_view_create_slot_ly(g_info->edit_layout);
        snprintf(index, sizeof(index), "index%d", pos+1);
-       char *label = NULL;
+       elm_object_part_content_set(g_info->edit_layout, index, slot);
 
        if (!strcmp(appid, "empty")) {
-               slot = elm_layout_add(g_info->edit_layout);
-               ret = elm_layout_file_set(slot, EDJE_PATH, "empty_slot");
-               if (ret == EINA_FALSE) {
-                       _E("failed to set empty slot");
-                       return NULL;
-               }
-               evas_object_size_hint_weight_set(slot, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
 
-               evas_object_event_callback_add(slot, EVAS_CALLBACK_MOUSE_DOWN, _down_cb, slot);
-               evas_object_event_callback_add(slot, EVAS_CALLBACK_MOUSE_MOVE, _move_cb, &pos);
-               evas_object_event_callback_add(slot, EVAS_CALLBACK_MOUSE_UP, _up_cb, slot);
-               elm_object_signal_callback_add(slot, "mouse_clicked", "*", _plus_mouse_clicked_cb, &pos);
+               btn = _edit_view_create_slot_empty_btn(slot);
+               elm_object_part_content_set(slot, "icon", btn);
 
-               elm_object_part_content_set(g_info->edit_layout, index, slot);
-               evas_object_show(slot);
                g_info->appid_list[pos] = strdup(appid);
-               empty_count++;
        } else {
+               pkgmgrinfo_appinfo_h appinfo_h = NULL;
+               char *icon_path_tmp = NULL;
+               char *icon_path = NULL;
+               Evas_Object *btn_icon = NULL;
+               Evas_Object *del_ly = NULL;
+               char *label = NULL;
+
                pkgmgrinfo_appinfo_get_appinfo(appid, &appinfo_h);
                if (PMINFO_R_OK != pkgmgrinfo_appinfo_get_icon(appinfo_h, &icon_path)) {
                        _E("get icon path failed");
@@ -630,28 +896,14 @@ Evas_Object *_set_app_slot(const char *appid, int pos)
                        _E("get label failed");
                }
 
-               slot = elm_layout_add(g_info->edit_layout);
-               elm_layout_file_set(slot, EDJE_PATH, "icon_slot");
-
-               evas_object_size_hint_weight_set(slot, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-               elm_object_part_content_set(g_info->edit_layout, index, slot);
-               evas_object_show(slot);
+               btn = _edit_view_create_slot_app_btn(slot);
+               elm_object_part_content_set(slot, "icon", btn);
 
-               icon = evas_object_image_add(evas_object_evas_get(slot));
-               evas_object_repeat_events_set(icon, EINA_TRUE);
-               evas_object_image_file_set(icon, icon_path_tmp, NULL);
-               evas_object_image_filled_set(icon, EINA_TRUE);
-               elm_object_part_content_set(slot, "icon", icon);
-               evas_object_show(icon);
+               btn_icon = _edit_view_create_slot_app_btn_icon(slot, icon_path_tmp);
+               elm_object_part_content_set(btn, "content", btn_icon);
 
-               evas_object_event_callback_add(slot, EVAS_CALLBACK_MOUSE_DOWN, _down_cb, slot);
-               evas_object_event_callback_add(slot, EVAS_CALLBACK_MOUSE_MOVE, _move_cb, slot);
-               evas_object_event_callback_add(slot, EVAS_CALLBACK_MOUSE_UP, _up_cb, slot);
-
-               elm_object_signal_callback_add(slot, "del_mouse_down", "*", _del_mouse_down_cb, slot);
-               elm_object_signal_callback_add(slot, "del_mouse_up", "*", _del_mouse_up_cb, slot);
-               elm_object_signal_callback_add(slot, "del_mouse_clicked", "*", _del_mouse_clicked_cb, slot);
-               elm_object_signal_callback_add(slot, "del_mouse_clicked_icon", "*", _del_mouse_clicked_cb, slot);
+               del_ly = _edit_view_create_slot_app_btn_del_ly(slot);
+               elm_object_part_content_set(slot, "delete_ly", del_ly);
 
                elm_object_part_text_set(slot, "name", label);
 
@@ -665,18 +917,42 @@ Evas_Object *_set_app_slot(const char *appid, int pos)
        return slot;
 }
 
-static void _create_edit_layout(appdata_s *info)
+static void _edit_view_create_ly_access_obj(appdata_s *info)
+{
+       _ENTER;
+
+       info->ao_edit_ly = (Evas_Object *)elm_access_object_register(info->edit_layout, info->edit_win);
+       ret_if(!info->ao_edit_ly);
+       elm_atspi_accessible_translation_domain_set(info->ao_edit_ly, APPTRAY_WIDGET_APP_DOMAIN);
+       elm_atspi_accessible_reading_info_type_set(info->ao_edit_ly, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
+}
+
+static Eina_Bool _rotary_event_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
+{
+       _ENTER;
+
+       if (elm_atspi_bridge_utils_is_screen_reader_enabled()) {
+               /* TODO: Need to implement logic for rotary events when Screen reader is on */
+       }
+
+       return EINA_FALSE;
+}
+
+static Evas_Object *_edit_view_create_layout(appdata_s *info)
 {
        _ENTER;
 
-       Evas_Object *layout = NULL;
+       Evas_Object *eo = elm_layout_add(info->edit_win);
+       elm_layout_file_set(eo, EDJE_PATH, "edit_layout");
+       evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       elm_win_resize_object_add(info->edit_win, eo);
+       evas_object_show(eo);
 
-       layout = elm_layout_add(info->edit_win);
-       elm_layout_file_set(layout, EDJE_PATH, "edit_layout");
-       evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       evas_object_show(layout);
+       if (!eext_rotary_object_event_callback_add(eo, _rotary_event_cb, info)) {
+               _E("Rotaty object event callback add failed");
+       }
 
-       info->edit_layout = layout;
+       return eo;
 }
 
 static char *_title_item_get_txt_cb(void *data, Evas_Object *obj, const char *part)
@@ -701,9 +977,7 @@ static Elm_Genlist_Item_Class *_get_gl_itc_header()
 
 static char *_cont_item_get_txt_cb(void *data, Evas_Object *obj, const char *part)
 {
-       _D();
        if (!strcmp(part, "elm.text")) {
-               _D();
                apptray_wgt_app_item_info_s *item_info = data;
                retv_if(!item_info, NULL);
                _D("Name created");
@@ -781,8 +1055,8 @@ static Evas_Object *_cont_item_get_content_cb(void *data, Evas_Object *obj, cons
                elm_image_aspect_fixed_set(image, EINA_TRUE);
                evas_object_repeat_events_set(image, EINA_TRUE);
                evas_object_size_hint_min_set(image,
-                               ELM_SCALE_SIZE(GENLIST_ITEM_ICON_DIMENTION),
-                               ELM_SCALE_SIZE(GENLIST_ITEM_ICON_DIMENTION));
+                               ELM_SCALE_SIZE(GENLIST_ITEM_ICON_DIMENSION),
+                               ELM_SCALE_SIZE(GENLIST_ITEM_ICON_DIMENSION));
                evas_object_show(image);
                return image;
        } else if (g_info->launch_type == APPTRAY_WGT_APP_LAUNCH_TYPE_PICK && !strcmp(part, "elm.swallow.center_check")) {
@@ -795,6 +1069,11 @@ static Evas_Object *_cont_item_get_content_cb(void *data, Evas_Object *obj, cons
                evas_object_propagate_events_set(check, EINA_FALSE);
                evas_object_show(check);
 
+               /* Accessibility */
+               elm_atspi_accessible_relationship_append(item_info->gl_item, ELM_ATSPI_RELATION_CONTROLLER_FOR, check);
+               elm_atspi_accessible_relationship_append(check, ELM_ATSPI_RELATION_CONTROLLED_BY, item_info->gl_item);
+               elm_atspi_accessible_relationship_append(item_info->gl_item, ELM_ATSPI_RELATION_DESCRIBED_BY, check);
+
                return check;
        }
        return NULL;
@@ -835,7 +1114,7 @@ static Elm_Genlist_Item_Class *_get_gl_itc_empty()
        return &empty_itc;
 }
 
-static void _set_select_genlist_content(Evas_Object *genlist, appdata_s *info)
+static void _select_view_set_genlist_content(Evas_Object *genlist, appdata_s *info)
 {
        if (info->launch_type == APPTRAY_WGT_APP_LAUNCH_TYPE_PICK) {
                _gl_add_empty_item(genlist);
@@ -846,7 +1125,7 @@ static void _set_select_genlist_content(Evas_Object *genlist, appdata_s *info)
        _gl_add_empty_item(genlist);
 }
 
-static Evas_Object *_create_simple_genlist(Evas_Object *parent, appdata_s *info)
+static Evas_Object *_select_view_create_simple_genlist(Evas_Object *parent, appdata_s *info)
 {
        Evas_Object *eo = elm_genlist_add(parent);
        retv_if(!eo, NULL);
@@ -855,9 +1134,8 @@ static Evas_Object *_create_simple_genlist(Evas_Object *parent, appdata_s *info)
        elm_genlist_mode_set(eo, ELM_LIST_COMPRESS);
        elm_genlist_homogeneous_set(eo, EINA_TRUE);
 
-       Evas_Object *circle_genlist = eext_circle_object_genlist_add(eo, info->select_circle_surf);
-       eext_circle_object_genlist_scroller_policy_set(circle_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
-       eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
+       info->circle_genlist = eext_circle_object_genlist_add(eo, info->select_circle_surf);
+       eext_circle_object_genlist_scroller_policy_set(info->circle_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
 
        evas_object_show(eo);
        return eo;
@@ -865,7 +1143,10 @@ static Evas_Object *_create_simple_genlist(Evas_Object *parent, appdata_s *info)
 
 static void _gl_add_header_item(Evas_Object *gl)
 {
-       elm_genlist_item_append(gl, _get_gl_itc_header(), NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+       Elm_Object_Item *item = elm_genlist_item_append(gl, _get_gl_itc_header(), NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+       /* Accessibility */
+       elm_atspi_accessible_can_highlight_set(item, EINA_FALSE);
 }
 
 static bool _check_already_added_apps(const char *appid)
@@ -902,29 +1183,30 @@ static void _gl_item_clicked_cb(void *data, Evas_Object *obj, void *event_info)
 
        Evas_Object *slot = _set_app_slot(item_info->appid, slot_index);
        elm_object_signal_emit(slot, "hide_icon", "slot");
-       empty_count--;
 
-       evas_object_hide(g_info->select_win);
-       evas_object_show(g_info->edit_win);
+       _set_select_window_active_state(false);
 
        evas_event_callback_add(evas_object_evas_get(g_info->edit_layout),
                        EVAS_CALLBACK_RENDER_POST, _render_post_cb, (void *)slot);
 
        _update_content();
+
+       _edit_view_update_slots_access_info();
+
+       _edit_view_set_access_rout();
 }
 
 static void _gl_add_apps_items(Evas_Object *gl, appdata_s *info)
 {
        apptray_wgt_app_item_info_s *item_info = NULL;
        Eina_List *item_info_list = g_info->all_app_list;
-       Elm_Object_Item *item = NULL;
        Eina_List *l = NULL;
        Eina_List *n = NULL;
 
        EINA_LIST_FOREACH_SAFE(item_info_list, l, n, item_info) {
-               item = elm_genlist_item_append(gl, _get_gl_itc_content(), item_info, NULL,
+               item_info->gl_item = elm_genlist_item_append(gl, _get_gl_itc_content(), item_info, NULL,
                                ELM_GENLIST_ITEM_NONE, _gl_item_clicked_cb, item_info);
-               if (!item) {
+               if (!item_info->gl_item) {
                        _E("Failed to append genlist item");
                }
        }
@@ -932,11 +1214,12 @@ static void _gl_add_apps_items(Evas_Object *gl, appdata_s *info)
 
 static void _gl_add_empty_item(Evas_Object *gl)
 {
-       elm_genlist_item_append(gl, _get_gl_itc_empty(), NULL, NULL,
-                       ELM_GENLIST_ITEM_NONE, NULL, NULL);
+       Elm_Object_Item *item = elm_genlist_item_append(gl, _get_gl_itc_empty(), NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+       /* Accessibility */
+       elm_atspi_accessible_can_highlight_set(item, EINA_FALSE);
 }
 
-static Evas_Object *_create_bottom_btn_ly(appdata_s *info)
+static Evas_Object *_select_view_create_bottom_btn_ly(appdata_s *info)
 {
        Evas_Object *eo = elm_layout_add(info->select_conform);
        retv_if(!eo, NULL);
@@ -953,7 +1236,7 @@ static void _bottom_btn_click_cb(void *data, Evas_Object *obj, void *event_info)
        _terminate_add_to_shortcut();
 }
 
-static Evas_Object *_create_bottom_btn(Evas_Object *parent, appdata_s *info)
+static Evas_Object *_select_view_create_bottom_btn(Evas_Object *parent, appdata_s *info)
 {
        Evas_Object *eo = elm_button_add(parent);
        retv_if(!eo, NULL);
@@ -968,7 +1251,7 @@ static Evas_Object *_create_bottom_btn(Evas_Object *parent, appdata_s *info)
        return eo;
 }
 
-static Evas_Object *_create_genlist_ly(Evas_Object *parent, appdata_s *info)
+static Evas_Object *_select_view_create_genlist_ly(Evas_Object *parent, appdata_s *info)
 {
        Evas_Object *eo = elm_layout_add(parent);
        retv_if(!eo, NULL);
@@ -981,18 +1264,18 @@ static Evas_Object *_create_genlist_ly(Evas_Object *parent, appdata_s *info)
        return eo;
 }
 
-static Evas_Object *_create_pick_genlist(Evas_Object *parent, appdata_s *info)
+static Evas_Object *_select_view_create_pick_genlist(Evas_Object *parent, appdata_s *info)
 {
-       Evas_Object *eo = _create_simple_genlist(parent, info);
+       Evas_Object *eo = _select_view_create_simple_genlist(parent, info);
        retv_if(!eo, NULL);
        elm_object_style_set(eo, "focus_bg");
-       _set_select_genlist_content(eo, info);
+       _select_view_set_genlist_content(eo, info);
        elm_layout_content_set(parent, "elm.swallow.content", eo);
 
        return eo;
 }
 
-static Evas_Object *_create_select_count_btn(Evas_Object *parent, appdata_s *info)
+static Evas_Object *_select_view_create_select_count_btn(Evas_Object *parent, appdata_s *info)
 {
        char buf[BUF_SIZE_SMALL] = { 0 };
 
@@ -1012,9 +1295,9 @@ static void _create_select_view(appdata_s *info)
        _ENTER;
 
        if (info->launch_type != APPTRAY_WGT_APP_LAUNCH_TYPE_PICK) {
-               info->select_gl = _create_simple_genlist(info->select_conform, info);
+               info->select_gl = _select_view_create_simple_genlist(info->select_conform, info);
                ret_if(!info->select_gl);
-               _set_select_genlist_content(info->select_gl, info);
+               _select_view_set_genlist_content(info->select_gl, info);
 
                elm_object_content_set(info->select_conform, info->select_gl);
        } else {
@@ -1022,19 +1305,19 @@ static void _create_select_view(appdata_s *info)
                Evas_Object *bottom_btn = NULL;
                Evas_Object *genlist_layout = NULL;
 
-               bottom_btn_ly = _create_bottom_btn_ly(info);
+               bottom_btn_ly = _select_view_create_bottom_btn_ly(info);
                ret_if(!bottom_btn_ly);
 
-               bottom_btn = _create_bottom_btn(bottom_btn_ly, info);
+               bottom_btn = _select_view_create_bottom_btn(bottom_btn_ly, info);
                ret_if(!bottom_btn);
 
-               genlist_layout = _create_genlist_ly(bottom_btn_ly, info);
+               genlist_layout = _select_view_create_genlist_ly(bottom_btn_ly, info);
                ret_if(!genlist_layout);
 
-               info->select_gl = _create_pick_genlist(genlist_layout, info);
+               info->select_gl = _select_view_create_pick_genlist(genlist_layout, info);
                ret_if(!info->select_gl);
 
-               info->select_count_btn = _create_select_count_btn(genlist_layout, info);
+               info->select_count_btn = _select_view_create_select_count_btn(genlist_layout, info);
                ret_if(!info->select_count_btn);
 
                elm_object_signal_emit(genlist_layout, "select_mode,button,show", "");
@@ -1098,38 +1381,58 @@ ERROR:
        return *list;
 }
 
+static void _unset_access_for_window(Evas_Object *win)
+{
+       elm_atspi_accessible_role_set(win, ELM_ATSPI_ROLE_TEXT);
+       elm_atspi_accessible_reading_info_type_set(win, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
+       elm_atspi_accessible_name_set(win, "");
+}
+
 static Eina_Bool _load_list(void* data)
 {
        Eina_List *pkgmgr_list = NULL;
        g_info->all_app_list = _read_all_apps(&pkgmgr_list);
        _create_select_view(g_info);
+
+       if (g_info->launch_type == APPTRAY_WGT_APP_LAUNCH_TYPE_PICK) {
+               _set_select_window_active_state(true);
+       } else {
+               _set_select_window_active_state(false);
+               _unset_access_for_window(g_info->select_win);
+       }
+
        return ECORE_CALLBACK_CANCEL;
 }
 
-static void _process_pick_operation(appdata_s *info, app_control_h service)
+static void _app_process_pick_operation(appdata_s *info, app_control_h service)
 {
        _ENTER;
-
-       evas_object_show(info->select_win);
-
        ecore_idler_add(_load_list, NULL);
 }
 
-static void _process_main_operation(appdata_s *info, app_control_h service, const char *app_list)
+static void _edit_view_init_ly_access_data(appdata_s *info)
 {
-       _ENTER;
+       info->ao_first = apptray_wgt_app_au_register_fake_access_object(
+                       info->edit_layout, info->edit_layout, "ao_rect");
+       ret_if(!info->ao_first);
 
+       _edit_view_create_ly_access_obj(info);
+       _edit_view_update_slots_access_info();
+       _edit_view_update_ly_access_info();
+       _edit_view_set_access_rout();
+
+       elm_atspi_component_highlight_grab(info->ao_first);
+}
+
+static void _edit_view_init_slots(const char *app_list)
+{
        char *content = NULL;
        char *save = NULL;
        char *app_name = NULL;
-       char *app_list_array[APP_SLOTS_MAX_COUNT] = { NULL };
+       char *app_list_array[APP_SLOTS_MAX_COUNT] = { 0 };
        int app_count = 0;
        int i = 0;
 
-       _create_edit_layout(info);
-       evas_object_show(info->edit_win);
-       elm_win_resize_object_add(info->edit_win, info->edit_layout);
-
        content = strdup_s(app_list);
        if (!content) {
                _D("Content is NULL. Set default applist");
@@ -1159,21 +1462,39 @@ static void _process_main_operation(appdata_s *info, app_control_h service, cons
                _set_app_slot(app_list_array[i], _input_slot_conv[app_count].slot_seq_arr[i]);
                free(app_list_array[i]);
        }
-
        free(content);
+}
+
+static void _app_process_main_operation(appdata_s *info, app_control_h service, const char *app_list)
+{
+       _ENTER;
+
+       evas_object_show(info->edit_win);
+       info->edit_layout = _edit_view_create_layout(info);
+       ret_if(!info->edit_layout);
+
+       _edit_view_init_slots(app_list);
+
+       _edit_view_init_ly_access_data(info);
 
        ecore_idler_add(_load_list, NULL);
 }
 
-static bool _create_edit_window(appdata_s *info, const char *name, const char *title)
+static bool _create_edit_view_window(appdata_s *info, const char *name, const char *title)
 {
        info->edit_win = _create_win(info, name, title);
        retv_if(!info->edit_win, false);
 
+       Evas_Object *edit_conform = _select_view_create_conformant(info->edit_win);
+       retv_if(!edit_conform, false);
+
+       Eext_Circle_Surface *edit_circle_surf = eext_circle_surface_conformant_add(edit_conform);
+       retv_if(!edit_circle_surf, false);
+
        return true;
 }
 
-static Evas_Object *_create_conformant_without_indicator(Evas_Object *win)
+static Evas_Object *_select_view_create_conformant(Evas_Object *win)
 {
        Evas_Object *conform = NULL;
 
@@ -1187,12 +1508,12 @@ static Evas_Object *_create_conformant_without_indicator(Evas_Object *win)
        return conform;
 }
 
-static bool _create_select_window(appdata_s *info, const char *name, const char *title)
+static bool _create_select_view_window(appdata_s *info, const char *name, const char *title)
 {
        info->select_win = _create_win(info, name, title);
        retv_if(!info->select_win, false);
 
-       info->select_conform = _create_conformant_without_indicator(info->select_win);
+       info->select_conform = _select_view_create_conformant(info->select_win);
        retv_if(!info->select_conform, false);
 
        info->select_circle_surf = eext_circle_surface_conformant_add(info->select_conform);
@@ -1212,8 +1533,8 @@ static apptray_wgt_app_key_cb_ret_e _key_release_cb(void *data)
 
        if (evas_object_visible_get(info->select_win)
                        && info->launch_type != APPTRAY_WGT_APP_LAUNCH_TYPE_PICK) {
-               evas_object_hide(info->select_win);
-               evas_object_show(info->edit_win);
+               _unset_access_for_window(g_info->edit_win);
+               _set_select_window_active_state(false);
        } else {
                if (info->launch_type == APPTRAY_WGT_APP_LAUNCH_TYPE_PICK) {
                        _update_appid_list_with_selected_items();
@@ -1224,19 +1545,28 @@ static apptray_wgt_app_key_cb_ret_e _key_release_cb(void *data)
        return APPTRAY_WGT_APP_KEY_CB_RET_STOP;
 }
 
+static void _update_win_title(Evas_Object *win, const char *title)
+{
+       ret_if(!win);
+       elm_win_title_set(win, title);
+}
+
 static bool _app_create(void *data)
 {
        _ENTER;
 
        elm_app_base_scale_set(1.3);
 
+       bindtextdomain(APPTRAY_WIDGET_APP_DOMAIN, apptray_wgt_app_utils_get_locale_path());
+       textdomain(APPTRAY_WIDGET_APP_DOMAIN);
+
        appdata_s *info = data;
        retv_if(!info, false);
 
        g_info = info;
 
-       retv_if(!_create_edit_window(info, "__ADD_TO_SHORTCUT__", "__ADD_TO_SHORTCUT__"), false);
-       retv_if(!_create_select_window(info, "__SELECT_LIST__", "__SELECT_LIST__"), false);
+       retv_if(!_create_edit_view_window(info, "__ADD_TO_SHORTCUT__", AO_STRING_WIN_NAME), false);
+       retv_if(!_create_select_view_window(info, "__SELECT_LIST__", AO_STRING_WIN_NAME), false);
 
        feedback_initialize();
 
@@ -1244,6 +1574,8 @@ static bool _app_create(void *data)
        apptray_wgt_app_key_register_cb(APPTRAY_WGT_APP_KEY_TYPE_BACK, _key_release_cb, info);
        apptray_wgt_app_key_register_cb(APPTRAY_WGT_APP_KEY_TYPE_POWER, _key_release_cb, info);
 
+       elm_theme_extension_add(NULL, EDJE_PATH);
+
        return true;
 }
 
@@ -1257,9 +1589,8 @@ static void _app_terminate(void *data)
        apptray_wgt_app_key_unregister_cb(APPTRAY_WGT_APP_KEY_TYPE_POWER, _key_release_cb);
        apptray_wgt_app_key_unregister();
 
-       if (longpress_timer) {
-               ecore_timer_del(longpress_timer);
-       }
+       DEL_ECORE_TIMER(longpress_timer);
+       DEL_ECORE_TIMER(click_blocker_timer);
 
        DEL_EVAS_OBJECT(g_info->edit_win);
        DEL_EVAS_OBJECT(g_info->select_win);
@@ -1275,6 +1606,8 @@ static void _app_terminate(void *data)
        g_info = NULL;
 
        feedback_deinitialize();
+
+       elm_theme_extension_del(NULL, EDJE_PATH);
 }
 
 static void _app_pause(void *data)
@@ -1314,16 +1647,16 @@ static void _app_control(app_control_h service, void *data)
        app_control_get_operation(service, &operation);
        if (!strcmp(operation, APP_CONTROL_OPERATION_PICK)) {
                info->launch_type = APPTRAY_WGT_APP_LAUNCH_TYPE_PICK;
-               _process_pick_operation(info, service);
+               _app_process_pick_operation(info, service);
        } else if (!strcmp(operation, APP_CONTROL_OPERATION_MAIN)) {
                info->launch_type = APPTRAY_WGT_APP_LAUNCH_TYPE_MAIN;
-               _process_main_operation(info, service, app_list);
+               _app_process_main_operation(info, service, app_list);
        }
 
        free(app_list);
 }
 
-static void _update_apps_label_for_select_view(appdata_s *ad)
+static void _select_view_update_apps_label(appdata_s *ad)
 {
        int ret;
        pkgmgrinfo_appinfo_h appinfo_h;
@@ -1363,7 +1696,7 @@ static void _update_apps_label_for_select_view(appdata_s *ad)
        elm_genlist_realized_items_update(ad->select_gl);
 }
 
-static void _update_apps_label_for_edit_view(appdata_s *ad)
+static void _edit_view_update_slots_apps_label(appdata_s *ad)
 {
        int ret;
        pkgmgrinfo_appinfo_h appinfo_h;
@@ -1405,18 +1738,26 @@ static void _update_apps_label_for_edit_view(appdata_s *ad)
 static void _app_lang_changed(app_event_info_h event_info, void *user_data)
 {
        _ENTER;
-
+       appdata_s *info = user_data;
        char *locale = NULL;
+
        system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &locale);
        elm_language_set(locale);
        free(locale);
 
-       ret_if(user_data);
+       ret_if(info);
 
        if (g_info->launch_type != APPTRAY_WGT_APP_LAUNCH_TYPE_PICK) {
-               _update_apps_label_for_edit_view(user_data);
+               /* TODO: need translation */
+               _update_win_title(info->edit_win, AO_STRING_WIN_NAME);
+               _edit_view_update_slots_apps_label(info);
+               _edit_view_update_slots_access_info();
+               _edit_view_update_ly_access_info();
+       } else {
+               /* TODO: need translation */
+               _update_win_title(info->select_win, AO_STRING_WIN_NAME);
        }
-       _update_apps_label_for_select_view(user_data);
+       _select_view_update_apps_label(info);
 }
 
 int main(int argc, char *argv[])
@@ -1427,7 +1768,7 @@ int main(int argc, char *argv[])
        int ret = 0;
 
        ui_app_lifecycle_callback_s lcc = { 0 };
-       app_event_handler_h handlers[1] = { NULL };
+       app_event_handler_h handlers[1] = { 0 };
 
        lcc.create = _app_create;
        lcc.terminate = _app_terminate;
diff --git a/apptray-widget-app/src/apptray_wgt_app_accessibility_utils.c b/apptray-widget-app/src/apptray_wgt_app_accessibility_utils.c
new file mode 100644 (file)
index 0000000..89d62e3
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Samsung API
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Flora License, Version 1.1 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "apptray_wgt_app_accessibility_utils.h"
+
+#include "apptray_wgt_app_log.h"
+
+static bool _append_symmetric_relationship(Evas_Object *from, Evas_Object *to);
+static void _remove_symmetric_relationship(Evas_Object *from, Evas_Object *to);
+static Evas_Object *_register_access_object(Evas_Object *parent, Evas_Object *ly, const char *ly_part);
+
+static Evas_Object *_register_access_object(Evas_Object *parent, Evas_Object *ly, const char *ly_part)
+{
+       Evas_Object *po = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(ly), ly_part);
+       retv_if(!po, NULL);
+       Evas_Object *ao = elm_access_object_register(po, parent);
+       retv_if(!ao, NULL);
+
+       return ao;
+}
+
+Evas_Object *apptray_wgt_app_au_register_access_object(Evas_Object *parent, Evas_Object *ly, const char *ly_part)
+{
+       retv_if(!parent, NULL);
+       retv_if(!ly, NULL);
+       retv_if(!ly_part, NULL);
+
+       return _register_access_object(parent, ly, ly_part);
+}
+
+void apptray_wgt_app_au_unregister_access_object(Evas_Object *obj)
+{
+       ret_if(!obj);
+
+       elm_access_object_unregister(obj);
+}
+
+Evas_Object *apptray_wgt_app_au_register_fake_access_object(Evas_Object *parent, Evas_Object *ly, const char *ly_part)
+{
+       retv_if(!parent, NULL);
+       retv_if(!ly, NULL);
+       retv_if(!ly_part, NULL);
+
+       Evas_Object *ao = _register_access_object(parent, ly, ly_part);
+       retv_if(!ao, NULL);
+       elm_atspi_accessible_can_highlight_set(ao, EINA_FALSE);
+       elm_atspi_accessible_role_set(ao, ELM_ATSPI_ROLE_TEXT);
+       elm_atspi_accessible_reading_info_type_set(ao, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
+       elm_atspi_accessible_name_set(ao, "");
+
+       return ao;
+}
+
+static bool _append_symmetric_relationship(Evas_Object *from, Evas_Object *to)
+{
+       Eina_Bool res = elm_atspi_accessible_relationship_append(from, ELM_ATSPI_RELATION_FLOWS_TO, to);
+       retv_if(!res, false);
+       res = elm_atspi_accessible_relationship_append(to, ELM_ATSPI_RELATION_FLOWS_FROM, from);
+       if (!res) {
+               elm_atspi_accessible_relationship_remove(from, ELM_ATSPI_RELATION_FLOWS_TO, to);
+               return false;
+       }
+       return true;
+}
+
+bool apptray_wgt_app_au_append_symmetric_relationship(Evas_Object *from, Evas_Object *to)
+{
+       retv_if(!from, false);
+       retv_if(!to, false);
+
+       return _append_symmetric_relationship(from, to);
+}
+
+static void _remove_symmetric_relationship(Evas_Object *from, Evas_Object *to)
+{
+       elm_atspi_accessible_relationship_remove(from, ELM_ATSPI_RELATION_FLOWS_TO, to);
+       elm_atspi_accessible_relationship_remove(to, ELM_ATSPI_RELATION_FLOWS_FROM, from);
+}
+
+void apptray_wgt_app_au_remove_symmetric_relationship(Evas_Object *from, Evas_Object *to)
+{
+       ret_if(!from);
+       ret_if(!to);
+
+       _remove_symmetric_relationship(from, to);
+}
+
+bool apptray_wgt_app_au_append_relationship_end_point(Evas_Object *obj)
+{
+       retv_if(!obj, false);
+
+       retv_if(!elm_atspi_accessible_relationship_append(obj, ELM_ATSPI_RELATION_FLOWS_TO, obj), false);
+       return true;
+}
+
+void apptray_wgt_app_au_remove_relationship_end_point(Evas_Object *obj)
+{
+       ret_if(!obj);
+
+       elm_atspi_accessible_relationship_remove(obj, ELM_ATSPI_RELATION_FLOWS_TO, obj);
+}
+
+bool apptray_wgt_app_au_append_relationship_start_point(Evas_Object *obj)
+{
+       retv_if(!obj, false);
+
+       retv_if(!elm_atspi_accessible_relationship_append(obj, ELM_ATSPI_RELATION_FLOWS_FROM, obj), false);
+       return true;
+}
+
+void apptray_wgt_app_au_remove_relationship_start_point(Evas_Object *obj)
+{
+       ret_if(!obj);
+
+       elm_atspi_accessible_relationship_remove(obj, ELM_ATSPI_RELATION_FLOWS_FROM, obj);
+}
+
index 0fb2e6a6baeabc3f06fac3af26b34de2dfa0a412..d23a475f35b4093b7162f699f6c33e66b389c773 100755 (executable)
@@ -26,6 +26,7 @@
 
 #define PATH_MAX 4096
 #define EDJE_FILE "edje/apptray_wgt_app.edj"
+#define PO_DIR "locale/"
 
 static const char *_get_app_res_dir_path();
 
@@ -56,3 +57,17 @@ const char *apptray_wgt_app_utils_get_edje_path()
        }
        return res_path;
 }
+
+const char *apptray_wgt_app_utils_get_locale_path()
+{
+       static char res_path[PATH_MAX] = {'\0'};
+       if (res_path[0] == '\0') {
+               const char *temp = _get_app_res_dir_path();
+               if (!temp) {
+                       return NULL;
+               }
+               snprintf(res_path, PATH_MAX, "%s%s", temp, PO_DIR);
+       }
+       return res_path;
+}
+
index 0f7f4a1664ac105a82514af043b6e45098adc34f..d491f6fc4fc1f6d2d7cc67f2589a5997dfc919c1 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <manifest xmlns="http://tizen.org/ns/packages" api-version="3.0" package="org.tizen.apptray-widget-app" version="1.0.0">
     <profile name="wearable"/>
-    <ui-application appid="org.tizen.apptray-widget-app" exec="apptray-widget-app" multiple="false" nodisplay="true" taskmanage="true" type="capp" hw-acceleration="on">
+    <ui-application appid="org.tizen.apptray-widget-app" exec="apptray-widget-app" multiple="false" nodisplay="true" taskmanage="false" type="capp" hw-acceleration="on">
         <label>Apps</label>
         <icon>app-widget-app.png</icon>
     </ui-application>