efl-ext: apply prod efl-extension for supporting ONE UI 66/222266/1 accepted/tizen/unified/20200121.121441 submit/tizen/20200114.214303 submit/tizen/20200115.213910 submit/tizen/20200116.005149 submit/tizen/20200116.043425 submit/tizen/20200116.051036 submit/tizen/20200120.211529
authorHosang Kim <hosang12.kim@samsung.com>
Tue, 31 Dec 2019 11:38:37 +0000 (20:38 +0900)
committerHosang Kim <hosang12.kim@samsung.com>
Mon, 13 Jan 2020 06:18:05 +0000 (15:18 +0900)
add supporting color class
   - slider
   - progressbar
   - scroller
   - genlist
   - gengrid

Change-Id: I7b46a2a6bda3bee893f3c4fa8e36b1ffafcf62c9

21 files changed:
inc/wearable/circle/efl_extension_circle_private.h
inc/wearable/circle/efl_extension_rotary.h
inc/wearable/efl_extension_common_private.h
packaging/efl-extension.spec
src/CMakeLists.txt
src/efl_extension.c
src/efl_extension_events.c
src/wearable/circle/efl_extension_circle_object.c
src/wearable/circle/efl_extension_circle_object_datetime.c
src/wearable/circle/efl_extension_circle_object_gengrid.c
src/wearable/circle/efl_extension_circle_object_genlist.c
src/wearable/circle/efl_extension_circle_object_item.c
src/wearable/circle/efl_extension_circle_object_progressbar.c
src/wearable/circle/efl_extension_circle_object_scroller.c
src/wearable/circle/efl_extension_circle_object_slider.c
src/wearable/circle/efl_extension_circle_object_spinner.c
src/wearable/circle/efl_extension_circle_surface.c
src/wearable/circle/efl_extension_rotary.c
src/wearable/efl_extension_more_option.c
src/wearable/efl_extension_panel.c
src/wearable/efl_extension_rotary_selector.c

index c07ac55512281f6af7595e54b0f6f8df3a01f3a0..cbdb8ed5b490b5ff706325a751922d554fbca779 100644 (file)
@@ -42,12 +42,15 @@ typedef enum
 } Eext_Circle_Surface_Type;
 
 struct _Eext_Circle_Surface {
+#define EEXT_CIRCLE_SURFACE_MAGIC 0x87810516
+   EINA_MAGIC;
    Evas_Object         *parent;
    Evas_Object         *main_obj;
    Evas_Object         *vg_obj;
    Efl_VG              *vg_root;
    Evas_Object         *bg_obj;
    const char          *bg_file_path;
+   unsigned char       *buffer;
    Evas_Coord           w, h;
    Evas_Coord           center_x, center_y;
    Eext_Circle_Surface_Type type;
@@ -55,9 +58,21 @@ struct _Eext_Circle_Surface {
    Eina_List           *render_objs;
    Ecore_Job           *render_job;
 
+   Ecore_Idle_Enterer  *render_idle_enterer;
    Eext_Circle_Surface *parent_surface;
    Eina_List           *sub_surfaces;
    Eext_Circle_Object  *deactivated_obj;
+
+   Eina_Bool            changed : 1;
+   Eina_Bool            color_changed : 1;
+   Eina_Bool            bg_rendered : 1;
+   Eina_Bool            image_rendered : 1;
+   Eina_Bool            is_mirrored : 1;
+   //ONEUI1.5(13Aug2019): Fix for precision loss on angle calculation
+   double               angle_diff;
+   double               old_angle;
+   //
+   Evas_Map             *map;
 };
 
 typedef struct _Eext_Circle_Color Eext_Circle_Color;
@@ -86,12 +101,15 @@ struct _Eext_Circle_Object {
    void                (*disabled_func)(Eext_Circle_Object *obj);
    // color_changed_func: When color of an item is changed, it will be called.
    void                (*color_changed_func)(Eext_Circle_Object *obj, const char *item_name);
+   //Do something before vector render.
+   void                (*render_pre_cb)(Eext_Circle_Object *obj);
 
    Eina_Bool             visible : 1;
    Eina_Bool             disabled : 1;
    Eina_Bool             visible_on_activate: 1;
    Eina_Bool             is_active: 1;
    Eina_Bool             is_propagated: 1;
+   Eina_Bool             changed: 1;
 };
 
 typedef struct _Eext_Circle_Object_Item Eext_Circle_Object_Item;
@@ -154,18 +172,27 @@ struct _Eext_Circle_Object_Item {
    } angle_transit;
 
    Eina_Bool round_cap;
+   Eina_Bool color_changed;
 };
 
 /* Datetime widget data */
 typedef struct _Eext_Circle_Object_Datetime_Data Eext_Circle_Object_Datetime_Data;
 struct _Eext_Circle_Object_Datetime_Data {
    Elm_Datetime_Field_Type current_type;
+   Eext_Circle_Object* circle_obj;
    Eina_Bool activated;
+   //ONEUI1.5(21Jun2019): Avoid duplicate ampm object creation
+   Eina_Bool ampm_created;
+   //
+   //ONEUI1.5(02Jul2019): Set activate front spinner when datepicker set activate
+   Evas_Object *current_activated_obj;
+   //
 };
 
 /* Progressbar widget data */
 typedef struct _Eext_Circle_Object_Progressbar_Data Eext_Circle_Object_Progressbar_Data;
 struct _Eext_Circle_Object_Progressbar_Data {
+   Evas_Object *parent;
    Eext_Circle_Color color;
    Eext_Circle_Color bg_color;
    Eext_Circle_Color disabled_color;
@@ -177,13 +204,17 @@ typedef struct _Eext_Circle_Object_Slider_Data Eext_Circle_Object_Slider_Data;
 struct _Eext_Circle_Object_Slider_Data {
    double value_step;
    Evas_Object *parent;
-   Evas_Object *hit_rect;
    Eext_Circle_Color color;
    Eext_Circle_Color bg_color;
    Eext_Circle_Color disabled_color;
    Eext_Circle_Color disabled_bg_color;
    Eext_Circle_Color cue_color;
    Eext_Circle_Color cue_press_color;
+   //ONEUI1.5(11Jan2019): Slider access support
+   Ecore_Timer *highlight_timer;
+   Ecore_Timer *read_timer;
+   //
+
    unsigned int rotary_event_time_stamp;
    Evas_Point pressed_point;
    double prev_angle;
@@ -195,27 +226,86 @@ struct _Eext_Circle_Object_Slider_Data {
    Eina_Bool drag : 1;
    Eina_Bool tap : 1;
    Eina_Bool freeze : 1;
-   Eina_Bool rotary: 1;
+   Eina_Bool touch_enabled : 1;
+   // ONEUI1.5(23Jul2019) : s/w bezel support
+   Eina_Bool user_touch_overwritten : 1; // true if _eext_circle_object_slider_touch_enabled_set has been called, false otherwise.
+   //
 };
 
 /* Genlist widget data */
+typedef struct _Eext_Circle_Object_Genlist_Index_Item Eext_Circle_Object_Genlist_Index_Item;
+struct _Eext_Circle_Object_Genlist_Index_Item {
+   Elm_Object_Item *item;
+   const char      *letter;
+};
+
+typedef struct _Eext_Circle_Object_Genlist_Rotary_Time Eext_Circle_Object_Genlist_Rotary_Time;
+struct _Eext_Circle_Object_Genlist_Rotary_Time {
+   double time;
+};
+
+//ONEUI1.5(20182310) : Circular Gengrid
+typedef struct _Eext_Circle_Object_Gengrid_Rotary_Time Eext_Circle_Object_Gengrid_Rotary_Time;
+struct _Eext_Circle_Object_Gengrid_Rotary_Time {
+   double time;
+};
+//
+
 typedef struct _Eext_Circle_Object_Genlist_Data Eext_Circle_Object_Genlist_Data;
 struct _Eext_Circle_Object_Genlist_Data {
+   Ecore_Timer *bar_first_show_timer;
+   Ecore_Timer *change_flag_timer;
    Ecore_Timer *bar_hide_timer;
    Elm_Scroller_Policy policy_h, policy_v;
-   int dest_y;
 
    Eext_Circle_Color color;
    Eext_Circle_Color bg_color;
    Eext_Circle_Color disabled_color;
    Eext_Circle_Color disabled_bg_color;
+   //ONEUI1.5(04July2019): Support different color with bezel
+   Eext_Circle_Color bezel_color;
+   Eina_Stringshare *bezel_scrollbar_color_class;
+   //
+
+   Evas_Object                           *index_layout;
+   Ecore_Timer                           *index_hide_timer;
+   Eina_List                             *index_item_list;
+   Eext_Circle_Object_Genlist_Index_Item *index_selected_item;
+   Evas_Object                           *g_rect;
+   Evas_Object                           *g_layer;
+   Eina_Bool                             index_shown_anim : 1;
+
+   int              current_phase;
+
+   Eina_List *rotary_times;
+   double     last_time;
+   int        rotary_count;
+   int        detent_count;
+
+   Evas_Object *handler_layout;
+   double handler_angle;
 
    Eina_Bool realized_callback_added : 1;
-};
+   Eina_Bool drag_callback_added : 1;
 
-typedef struct _Eext_Circle_Object_Gengrid_Rotary_Time Eext_Circle_Object_Gengrid_Rotary_Time;
-struct _Eext_Circle_Object_Gengrid_Rotary_Time {
-   double time;
+   Eext_Circle_Object_Item *item;
+   Eext_Circle_Object_Item *bg_item;
+   Elm_Object_Item *current_item;
+   Elm_Object_Item *aligned_item;
+   Eina_Bool scrollbar_initializing;
+   const char *scrollbar_color_class;
+   const char *scrollbar_bg_color_class;
+   Evas_Object *access_object;
+   int dest_y;
+   double bar_size_y;
+   unsigned int latest_time_stamp;
+   Eina_Bool scrollbar_first_shown : 1;
+   Eina_Bool scrollbar_shown : 1;
+   Eina_Bool handler_drag : 1;
+   Eina_Bool handler : 1;
+   //ONEUI1.5(04July2019): Support different color with bezel
+   Eina_Bool bezel_on : 1;
+   //
 };
 
 typedef struct _Eext_Circle_Object_Gengrid_Data Eext_Circle_Object_Gengrid_Data;
@@ -260,22 +350,41 @@ struct _Eext_Circle_Object_Scroller_Data {
    Ecore_Timer *bar_hide_timer;
    Elm_Scroller_Policy policy_v, policy_h;
 
+   Evas_Object *handler_layout;
+   double handler_angle;
+
    Eext_Circle_Color vertical_color;
    Eext_Circle_Color vertical_bg_color;
    Eext_Circle_Color horizontal_color;
    Eext_Circle_Color horizontal_bg_color;
    Eext_Circle_Color disabled_color;
    Eext_Circle_Color disabled_bg_color;
+   //ONEUI1.5(04July2019): Support different color with bezel
+   Eext_Circle_Color bezel_vertical_color;
+   Eext_Circle_Color bezel_horizontal_color;
+   Eina_Stringshare *bezel_scrollbar_color_class;
+   //
 
    int step_x, step_y;
    int line_width;
    double radius;
+
+   const char *scrollbar_color_class;
+   const char *scrollbar_bg_color_class;
+
+   //ONEUI1.5(04July2019): Support different color with bezel
+   Eina_Bool bezel_on : 1;
+   //
+   Eina_Bool handler : 1;
+   Eina_Bool handler_drag : 1;
+   Eina_Bool handler_shown : 1;
 };
 
 /* Spinner widget data */
 typedef struct _Eext_Circle_Object_Spinner_Data Eext_Circle_Object_Spinner_Data;
 struct _Eext_Circle_Object_Spinner_Data {
    Evas_Object *genlist, *circle_genlist;
+   Eext_Circle_Object* circle_obj;
    Eina_Bool genlist_visible, spinner_activated, genlist_activated;
 };
 
index 55aadc0abc27ed15a5eff699042bd1d5324ca1fb..be4780e6bbe11dc2852be0da7adfdaa9ee1ec257 100644 (file)
@@ -76,6 +76,22 @@ typedef enum _Eext_Rotary_Event_Direction
    EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE /**< Rotary is rotated counter clockwise direction */
 } Eext_Rotary_Event_Direction;
 
+
+typedef enum _Eext_Rotary_Event_Type
+{
+   EEXT_ROTARY_EVENT_TYPE_UNDEFINED = -1,
+   EEXT_ROTARY_EVENT_TYPE_NONE = 0,
+   EEXT_ROTARY_EVENT_TYPE_HW_BEZEL = 1 << 0,
+   EEXT_ROTARY_EVENT_TYPE_SW_BEZEL = 1 << 1
+} Eext_Rotary_Event_Type;
+
+typedef void (*Eext_Rotary_Event_Changed_Cb) (int *node, void *user_data);
+
+EAPI Eext_Rotary_Event_Type eext_rotary_event_type_get(void);
+EAPI Eina_Bool eext_rotary_event_is_enabled(void);
+EAPI void eext_rotary_event_changed_callback_add(Eext_Rotary_Event_Changed_Cb cb, void* data);
+EAPI void eext_rotary_event_changed_callback_del(Eext_Rotary_Event_Changed_Cb cb);
+
 /**
  * @WEARABLE_ONLY
  * @brief Rotary event information structure
index 2f71aa2ba4f0ff4b550b04913e5ce40d08e9dced..af1ef026d9111989afac7b8c6dbb0d6136310f5c 100644 (file)
@@ -109,7 +109,9 @@ struct _Eext_Rotary_Selector_Data {
    Evas_Object *parent;
    Evas_Object *rotary_selector;
    Evas_Object *event_area;
+   //ONEUI1.5(08Jun2018): Add gesture swipe support
    Evas_Object *gesture_layer;
+   //
    Eina_List *item_list;
    int item_count;
    int selected_index;
@@ -153,6 +155,11 @@ struct _Eext_Rotary_Selector_Data {
    Ecore_Timer *longpress_timer;
    Ecore_Timer *stand_timer;
    Ecore_Timer *item_del_timer;
+   //ONEUI1.5(14Jun2018): Edit mode screen reader support
+   Ecore_Timer *highlight_timer;
+   Eina_Bool highlighted;
+   Eina_Bool rot_highlighted;
+   //
    Eext_Rotary_Selector_Direction stand_dir;
    int drag_item_index;
    int drop_item_index;
@@ -181,9 +188,18 @@ struct _Eext_Rotary_Selector_Data {
    Evas_Object *accessible_need_highlight_obj;
    //
 
+   //ONEUI1.5(20Jun2017): Add next/prev icons for product style.
+   Eina_Bool is_product_style;
+   Eina_Bool checked_product_style;
+   Evas_Object* next_icon;
+   Evas_Object* prev_icon;
+   //
+
+   //ONEUI1.5(04Jun2018): Delay for item animation
+   double item_swap_animator_delay_time;
    double item_drag_page_delay_time;
    double item_longpress_move_delay_time;
-
+   //
    Evas_Object *drag_obj;
    Evas_Coord drag_pos_x;
    Evas_Coord drag_pos_y;
@@ -211,6 +227,15 @@ struct _Eext_Rotary_Selector_Item_State_Color {
    Eext_Rotary_Selector_Item_Color disabled_color;
 };
 
+typedef struct
+{
+   Evas_Object *parent;
+   Eina_List *item_list;
+   Eext_Rotary_Selector_Item *add_item;
+   Eext_Rotary_Selector_Item *title_item;
+   Eina_Bool add_enabled;
+} Rotary_Genlist_Data;
+
 struct _Eext_Rotary_Selector_Item {
    EEXT_OBJECT_ITEM;
    int index;
@@ -233,9 +258,17 @@ struct _Eext_Rotary_Selector_Item {
    Evas_Object *content_icon;
    Evas_Object *custom_content;
    Eina_Bool delete_enabled;
+   Rotary_Genlist_Data *rgd;
+   Evas_Object *obj;
+   Evas_Object *dummy_button;
+   Elm_Object_Item *item;
+   Evas_Object *content;
+   Elm_Genlist_Item_Class *itc;
+   char *part;
+   char *main_text;
+   char *sub_text;
 };
 
-
 /* More Option data */
 typedef struct _Eext_More_Option_Data Eext_More_Option_Data;
 struct _Eext_More_Option_Data {
@@ -249,11 +282,36 @@ struct _Eext_More_Option_Data {
    Evas_Object* cue_access_object;
    Evas_Object* cue_target_object;
    //
+   Evas_Object* genlist;
+   Evas_Object* circle_genlist;
+   Evas_Object *blur_image;
+   Ecore_Timer *effect_timer;
+   unsigned int effect_count;
+   //ONEUI1.5(27May2019): Reduce tbm memory by adding surface on demand
+   Eext_Circle_Surface *surface;
+   //
+   //ONEUI1.5(20190424):Avoid panel close by api when panel is not active.
+   Eina_Bool is_panel_active;
+   //
+   //ONEUI1.5(30May2019): Improve VI effect
+   Ecore_Idler *blur_idler;
+   //
+   //ONEUI1.5(20Jun2019): Add blur timer in case blur idler is not invoked
+   Ecore_Timer *blur_timer;
+   //
+   //ONEUI1.5(20Jun2019): Add genlist scroller color class change
+   Eina_Stringshare *scrollbar_bezel_fg_color_class;
+   Eina_Stringshare *scrollbar_fg_color_class;
+   Eina_Stringshare *scrollbar_bg_color_class;
+   //
+   void *mask_buffer;
 };
 
 typedef struct _Eext_Panel_Data Eext_Panel_Data;
 struct _Eext_Panel_Data {
+   double prev_rel_y; // For determining scroll direction
    Evas_Object *parent;
+   Evas_Object *layout;
    Evas_Object *eext_panel;
    Evas_Object *primary_panel;
    Evas_Object *assist_panel;
index aa70d9d01cb252f78126267a2ccab873f64284f5..134cbc1e231b76c2d0e8533ecd3945d7c57020dc 100644 (file)
@@ -38,6 +38,12 @@ BuildRequires:  pkgconfig(glib-2.0)
 BuildRequires:  lcov
 %endif
 
+#TIZEN_ONLY(20191212): adding internal interface for rotary event type
+BuildRequires: pkgconfig(vconf)
+BuildRequires: pkgconfig(capi-system-info)
+BuildRequires: pkgconfig(capi-ui-efl-util)
+#
+
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
 
@@ -55,7 +61,6 @@ Requires:   %{name} = %{version}-%{release}
 %description devel
 EFL extension library providing small utility functions (devel)
 
-
 %if 0%{?gcov:1}
 %package gcov
 Summary:    EFL extensiona library (gcov)
index 2d39eb764993d7d4a8abe407113f099520f6ca04..e48b79a8266d1225cc1652954e3265bff77614c6 100755 (executable)
@@ -121,6 +121,20 @@ FOREACH(flag ${LIB_TARGET_PKGS_LDFLAGS})
    message("LIB_TARGET_PKGS_LDFLAGS ${flag}")
 ENDFOREACH(flag)
 
+#TIZEN_ONLY(20191212): adding packages for interface of rotary event type
+PKG_CHECK_MODULES(LIB_ROTARY_PKGS REQUIRED
+               vconf
+               capi-system-info
+                capi-ui-efl-util
+)
+FOREACH(flag ${LIB_ROTARY_PKGS_CFLAGS})
+       SET(LIB_CFLAGS "${LIB_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+FOREACH(flag ${LIB_ROTARY_PKGS_LDFLAGS})
+       SET(LIB_PKGS_LDFLAGS "${LIB_PKGS_LDFLAGS} ${flag}")
+ENDFOREACH(flag)
+#
+
 SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES COMPILE_FLAGS "${LIB_CFLAGS}")
 SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES VERSION ${VERSION})
 SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR})
index a7ed5a4995528e171afc96a1f62b62d54821cd94..d2a10e7afce633d2e87f7442ace97489ca831ddd 100644 (file)
@@ -45,13 +45,14 @@ eext_mod_init(void)
         EINA_LOG_ERR("could not register efl-extension log domain.");
         _eext_log_dom = EINA_LOG_DOMAIN_GLOBAL;
      }
-   INF("Init");
+
+   LOGI("Init");
 }
 
 __DESTRUCTOR__ static void
 eext_mod_shutdown(void)
 {
-   INF("Shutdown\n");
+   LOGI("Shutdown\n");
    if ((_eext_log_dom > -1) && (_eext_log_dom != EINA_LOG_DOMAIN_GLOBAL))
      {
         eina_log_domain_unregister(_eext_log_dom);
@@ -69,14 +70,14 @@ eext_mod_shutdown(void)
 void
 _eext_magic_fail(const void *d, eext_magic m, eext_magic req_m, const char *fname)
 {
-       ERR("\n*** MAGIC FAIL (%s) ***\n", fname);
+       LOGE("\n*** MAGIC FAIL (%s) ***\n", fname);
 
        if (!d)
-               ERR("  Input handle pointer is NULL!");
+               LOGE("  Input handle pointer is NULL!");
        else if (m == EEXT_MAGIC_NONE)
-               ERR("  Input handle has already been freed!");
+               LOGE("  Input handle has already been freed!");
        else if (m != req_m)
-               ERR("  Input handle is wrong type\n"
+               LOGE("  Input handle is wrong type\n"
                    "    Expected: %08x - %s\n"
                    "    Supplied: %08x - %s",
                    (unsigned int)req_m, _magic_string_get(req_m),
@@ -101,7 +102,7 @@ eext_win_tzsh_native_window_get(const Elm_Win *obj)
 
    if (strcmp(elm_object_widget_type_get(obj), "Elm_Win"))
      {
-        ERR("  Input object is not elm_win widget");
+        LOGE("  Input object is not elm_win widget");
         return 0;
      }
    if (engine_name &&
@@ -129,7 +130,7 @@ eext_win_keygrab_set(Elm_Win *obj, const char *key)
    Eina_Bool ret = EINA_FALSE;
    ret = elm_win_keygrab_set(obj, key, 0, 0, 0, ELM_WIN_KEYGRAB_TOPMOST);
    if (!ret)
-     ERR("  Can't set keygrab of [%s].", key);
+     LOGE("  Can't set keygrab of [%s].", key);
    return ret;
 }
 
@@ -139,6 +140,6 @@ eext_win_keygrab_unset(Elm_Win *obj, const char *key)
    Eina_Bool ret = EINA_FALSE;
    ret = elm_win_keygrab_unset(obj, key, 0, 0);
    if (!ret)
-     ERR("  Can't unset keygrab of [%s].", key);
+     LOGE("  Can't unset keygrab of [%s].", key);
    return ret;
 }
index f6d2b0b527c867c3a9507478c30acad910ad72fe..07d96452cea9674f048853877ada941b57253251 100644 (file)
@@ -83,6 +83,8 @@ _eext_object_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
    Eina_List *l;
    Eext_Event_Callback *callback;
 
+   if (!event_mgr) return;
+
    l = eina_list_data_find_list(event_mgr->obj_events, obj_event);
    if (!l) return;
 
@@ -344,39 +346,39 @@ _eext_key_grab_obj_create(Eext_Event_Mgr *event_mgr)
    evas_object_event_callback_add(key_grab_rect, EVAS_CALLBACK_KEY_UP,
                                   _eext_key_grab_rect_key_up_cb, event_mgr);
    if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP, 0, 0, EINA_FALSE))
-     ERR("Failed to grab END KEY\n");
+     LOGE("Failed to grab END KEY\n");
 
    if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP2, 0, 0, EINA_FALSE))
-     ERR("Failed to grab END KEY\n");
+     LOGE("Failed to grab END KEY\n");
 
    if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP3, 0, 0, EINA_FALSE))
-     ERR("Failed to grab END KEY\n");
+     LOGE("Failed to grab END KEY\n");
 
    if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND, 0, 0, EINA_FALSE))
-     ERR("Failed to grab MORE KEY\n");
+     LOGE("Failed to grab MORE KEY\n");
 
    if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND2, 0, 0, EINA_FALSE))
-     ERR("Failed to grab MORE KEY\n");
+     LOGE("Failed to grab MORE KEY\n");
 
    if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND3, 0, 0, EINA_FALSE))
-     ERR("Failed to grab MORE KEY\n");
+     LOGE("Failed to grab MORE KEY\n");
    if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK, 0, 0, EINA_FALSE))
      ERR ("Failed to grab BACK KEY\n");
 
    if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK2, 0, 0, EINA_FALSE))
-     ERR("Failed to grab BACK KEY\n");
+     LOGE("Failed to grab BACK KEY\n");
 
    if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK3, 0, 0, EINA_FALSE))
-     ERR("Failed to grab BACK KEY\n");
+     LOGE("Failed to grab BACK KEY\n");
 
    if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU, 0, 0, EINA_FALSE))
-     ERR("Failed to grab MENU KEY\n");
+     LOGE("Failed to grab MENU KEY\n");
 
    if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU2, 0, 0, EINA_FALSE))
-     ERR("Failed to grab MENU KEY\n");
+     LOGE("Failed to grab MENU KEY\n");
 
    if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU3, 0, 0, EINA_FALSE))
-     ERR("Failed to grab MENU KEY\n");
+     LOGE("Failed to grab MENU KEY\n");
 
    event_mgr->key_grab_rect = key_grab_rect;
 }
@@ -387,7 +389,7 @@ _eext_event_mgr_new(Evas *e)
    Eext_Event_Mgr *event_mgr = calloc(1, sizeof(Eext_Event_Mgr));
    if (!event_mgr)
      {
-        ERR("Failed to allocate event manager");
+        LOGE("Failed to allocate event manager");
         return NULL;
      }
    event_mgr->e = e;
@@ -489,7 +491,7 @@ eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_E
         obj_event = calloc(1, sizeof(Eext_Object_Event));
         if (!obj_event)
           {
-             ERR("Failed to allocate object event");
+             LOGE("Failed to allocate object event");
              return;
           }
         evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, obj_event);
@@ -506,7 +508,7 @@ eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_E
    callback = calloc(1, sizeof(Eext_Event_Callback));
    if (!callback)
      {
-        ERR("Failed to allocate event callback");
+        LOGE("Failed to allocate event callback");
         return;
      }
    callback->type = type;
@@ -526,17 +528,17 @@ eext_gesture_event_dispatch(Eext_Gesture_Event_Type type, int x, int y)
    eldbus_init();
    if (!(conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM)))
      {
-        ERR("Connection to system bus failed");
+        LOGE("Connection to system bus failed");
         return;
      }
    if (!(dobj = eldbus_object_get(conn, E_A11Y_SERVICE_BUS_NAME, E_A11Y_SERVICE_NAVI_OBJ_PATH)))
      {
-        ERR("Failed to create eldbus object");
+        LOGE("Failed to create eldbus object");
         goto fail_obj;
      }
    if (!(proxy = eldbus_proxy_get(dobj, E_A11Y_SERVICE_NAVI_IFC_NAME)))
      {
-        ERR("Failed to create proxy object for 'org.tizen.GestureNavigation'");
+        LOGE("Failed to create proxy object for 'org.tizen.GestureNavigation'");
         goto fail_proxy;
      }
    eldbus_proxy_call(proxy, "DispatchGestureEvent", NULL, NULL, -1, "iii", type, x, y);
index 6edf5529e5c9eea413291299d2bce91c376b46c6..2597636778f2e01304ce9afbef7fa3ed5893a4f8 100644 (file)
 #include "efl_extension_private.h"
 #include "wearable/circle/efl_extension_circle_private.h"
 
-static void
-_eext_circle_object_del_cb(void *data,
-                           Evas *e,
-                           Evas_Object *obj,
-                           void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Eext_Circle_Object_Item *item;
-   Eina_List *l, *l_next;
-
-   if (!circle_obj)
-     {
-        ERR("Eext_Circle_Object is NULL");
-        return;
-     }
-
-   efl_unref(circle_obj->vg_container);
-
-   if (circle_obj->del_func)
-     circle_obj->del_func(circle_obj);
-
-   EINA_LIST_FOREACH_SAFE(circle_obj->items, l, l_next, item)
-     {
-        _eext_circle_object_item_free(item);
-     }
-
-   if (circle_obj->surface)
-     {
-        _eext_circle_surface_object_remove(circle_obj->surface, circle_obj);
-        circle_obj->surface = NULL;
-     }
-
-   circle_obj->visible = EINA_FALSE;
-
-   if (obj)
-     evas_object_data_del(obj, EEXT_CIRCLE_OBJECT_TYPE);
-
-   _eext_circle_object_bg_file_path_set(circle_obj, NULL);
-
-   free(circle_obj);
-}
-
 static void
 _eext_circle_object_show_cb(void *data,
                             Evas *e,
@@ -117,10 +75,6 @@ _eext_circle_object_widget_object_show_cb(void *data,
         circle_obj->visible = EINA_TRUE;
         _eext_circle_object_changed(circle_obj);
      }
-   else
-     {
-        evas_object_show(circle_obj->main_obj);
-     }
 }
 
 static void
@@ -155,21 +109,44 @@ _eext_circle_object_widget_object_enabled_cb(void *data, Evas_Object *obj, void
 }
 
 static void
-_eext_circle_object_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_eext_circle_object_del_cb(void *data,
+                           Evas *e,
+                           Evas_Object *obj,
+                           void *event_info)
 {
-   //C# FIXME: make resizable when using single usability
-   return;
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Eext_Circle_Object_Item *item;
+   Eina_List *l, *l_next;
+
+   if (!circle_obj)
+     {
+        LOGE("Eext_Circle_Object is NULL");
+        return;
+     }
+
+   efl_unref(circle_obj->vg_container);
+   if (circle_obj->del_func)
+     circle_obj->del_func(circle_obj);
+
+   EINA_LIST_FOREACH_SAFE(circle_obj->items, l, l_next, item)
+     {
+        _eext_circle_object_item_free(item);
+     }
+
+   if (circle_obj->surface)
+     {
+        _eext_circle_surface_object_remove(circle_obj->surface, circle_obj);
+        circle_obj->surface = NULL;
+     }
 
-   /*
-   Evas_Coord w, h;
+   circle_obj->visible = EINA_FALSE;
 
-   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+   if (obj)
+     evas_object_data_del(obj, EEXT_CIRCLE_OBJECT_TYPE);
 
-   double radius = w > h? h : w;
-   radius /= 2;
+   _eext_circle_object_bg_file_path_set(circle_obj, NULL);
 
-   eext_circle_object_radius_set(obj, radius);
-   */
+   free(circle_obj);
 }
 
 //////////////////////////////
@@ -190,9 +167,14 @@ _eext_circle_object_add(Evas_Object *parent, Evas_Object *widget_obj, Eext_Circl
      {
         surface = _eext_circle_surface_init(obj, NULL, EEXT_CIRCLE_SURFACE_TYPE_PRIVATE);
         circle_obj->private_surface = surface;
+        if (!surface)
+          {
+             free(circle_obj);
+             return NULL;
+          }
      }
 
-   // Obj is expected to be elm_image object.
+   // Obj is expected to be elm_table object.
    circle_obj->main_obj = obj;
    circle_obj->widget_object = widget_obj;
    circle_obj->widget_data = NULL;
@@ -207,7 +189,6 @@ _eext_circle_object_add(Evas_Object *parent, Evas_Object *widget_obj, Eext_Circl
    evas_object_data_set(obj, EEXT_CIRCLE_OBJECT_TYPE, circle_obj);
    evas_object_repeat_events_set(obj, EINA_TRUE);
 
-   evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _eext_circle_object_resize_cb, NULL);
    evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _eext_circle_object_del_cb, circle_obj);
    evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _eext_circle_object_show_cb, circle_obj);
    evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _eext_circle_object_hide_cb, circle_obj);
@@ -228,26 +209,12 @@ _eext_circle_object_add(Evas_Object *parent, Evas_Object *widget_obj, Eext_Circl
    return obj;
 }
 
-EAPI void
-eext_circle_object_connect(Eext_Circle_Surface *surface, Evas_Object *widget_obj)
-{
-   EEXT_CIRCLE_OBJECT_GET(widget_obj, circle_obj) return;
-   _eext_circle_surface_object_append(surface, circle_obj);
-}
-
-EAPI void
-eext_circle_object_disconnect(Eext_Circle_Surface *surface, Evas_Object *widget_obj)
-{
-   EEXT_CIRCLE_OBJECT_GET(widget_obj, circle_obj) return;
-   _eext_circle_surface_object_remove(surface, circle_obj);
-   _eext_circle_surface_object_append(circle_obj->private_surface, circle_obj);
-}
-
 void
 _eext_circle_object_changed(Eext_Circle_Object *obj)
 {
    if (!obj) return;
 
+   obj->changed = EINA_TRUE;
    if (obj->surface)
      _eext_circle_surface_changed(obj->surface);
 }
@@ -260,13 +227,13 @@ _eext_circle_object_item_get(const Eext_Circle_Object *obj, const char *name)
 
    if (!obj)
      {
-        ERR("Eext_Circle_Object is NULL! It returns NULL!");
+        LOGE("Eext_Circle_Object is NULL! It returns NULL!");
         return NULL;
      }
 
    if (!name)
      {
-        ERR("The given item name is NULL! It returns NULL!");
+        LOGE("The given item name is NULL! It returns NULL!");
         return NULL;
      }
 
@@ -278,7 +245,7 @@ _eext_circle_object_item_get(const Eext_Circle_Object *obj, const char *name)
           return item;
      }
 
-   ERR("There is no [%s] item in the given object[%p:%s]! It returns NULL!", name, obj->main_obj, obj->widget_type);
+   LOGE("There is no [%s] item in the given object[%p:%s]! It returns NULL!", name, obj->main_obj, obj->widget_type);
    return NULL;
 }
 
@@ -482,6 +449,7 @@ eext_circle_object_add(Evas_Object *parent, Eext_Circle_Surface *surface)
 
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
 
+   circle_obj->changed = EINA_FALSE;
    item = _eext_circle_object_item_new();
    _eext_circle_object_item_append(circle_obj, item);
 
@@ -661,6 +629,31 @@ eext_circle_object_item_value_set(Evas_Object *obj, const char *item_name, doubl
 
    if (item)
      _eext_circle_object_item_value_set(item, value);
+
+   if (!strcmp(circle_obj->widget_type, "Eext_Circle_Object_Slider") && !strcmp(item_name, "default"))
+   {
+      Eext_Circle_Object_Item *cue = NULL, *effect = NULL;
+      cue = _eext_circle_object_item_get(circle_obj, "cue");
+      effect = _eext_circle_object_item_get(circle_obj, "effect");
+
+      double angle;
+      angle = _eext_circle_object_item_angle_get(item);
+
+      if (cue)
+        {
+           cue->angle_offset = cue->min_angle - 1.0;
+           _eext_circle_object_item_angle_offset_set(cue, angle - 0.05);
+           _eext_circle_object_item_angle_set(cue, 0.1);
+        }
+
+      if (effect)
+        {
+           effect->angle_offset = effect->min_angle - 1.0;
+           _eext_circle_object_item_angle_offset_set(effect, angle - 0.05);
+           _eext_circle_object_item_angle_set(effect, 0.1);
+        }
+
+   }
 }
 
 EAPI double
index b6ad90f0317c02f3ac74ac10fa7d1a692e3b32dc..78eb7e26d0c033c6129c31b992c26c902fae306d 100755 (executable)
@@ -40,6 +40,10 @@ _eext_circle_object_datetime_activated_cb(void *data,
    EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return;
 
    widget_data->activated = EINA_TRUE;
+   //ONEUI1.5(02Jul2019): Set activate front spinner when datepicker set activate
+   if (widget_data->current_activated_obj)
+     eext_rotary_object_event_activated_set(widget_data->current_activated_obj, EINA_TRUE);
+   //
 }
 
 static void
@@ -58,32 +62,151 @@ _eext_circle_object_datetime_del_cb(Eext_Circle_Object *obj)
 
 static void
 _spinner_focused_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return;
+   //ONEUI1.5(04Feb2019): Trigger rotary event on highlighted object in atspi mode
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled()) return;
+   //
+   if (widget_data->activated)
+     {
+        eext_rotary_object_event_activated_set(obj, EINA_TRUE);
+        //ONEUI1.5(01Oct2019): Update the activated object
+        widget_data->current_activated_obj = obj;
+        //
+     }
+}
+
+//ONEUI1.5(04Feb2019): Trigger rotary event on highlighted object in atspi mode
+static void
+_spinner_highlighted_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
    Eext_Circle_Object *circle_obj = data;
    EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return;
 
    if (widget_data->activated)
-     eext_rotary_object_event_activated_set(obj, EINA_TRUE);
+     {
+        eext_rotary_object_event_activated_set(obj, EINA_TRUE);
+        //ONEUI1.5(01Oct2019): Update the activated object
+        widget_data->current_activated_obj = obj;
+        //
+     }
 }
+//
 
+//ONEUI1.5(04Feb2019): Enable rotary on all fields of datetime, format changed can be triggered many times
+//and causes empty field issue and also As field objects are never deleted, we dont need format,changed.
 static void
 _enable_rotary_event(Evas_Object *datetime, Eext_Circle_Object *circle_obj)
 {
    int idx;
    char buf[DATETIME_FIELD_NAME_BUF_MAX];
+   //ONEUI1.5(21Jun2019): Avoid duplicate ampm object creation
+   Elm_Datetime_Field_Type field_type ;
+   EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return;
+   //
+   //ONEUI1.5(02Jul2019): Set activate front spinner when datepicker set activate
+   const char *style = elm_object_style_get(datetime);
+   //
 
    for (idx = ELM_DATETIME_YEAR; idx <= ELM_DATETIME_AMPM; idx++)
      {
         snprintf(buf, sizeof(buf), "field%d", idx);
         Evas_Object *field_obj = elm_object_part_content_get(datetime, buf);
-
         if (field_obj)
           {
              eext_circle_object_spinner_add(field_obj, circle_obj->surface);
+             //ONEUI1.5(21Jun2019): Avoid duplicate ampm object creation
+             field_type = (Elm_Datetime_Field_Type)evas_object_data_get(field_obj, "_field_type");
+             if (field_type == ELM_DATETIME_AMPM)
+                widget_data->ampm_created = EINA_TRUE;
+             //
+             //ONEUI1.5(02Jul2019): Set activate front spinner when datepicker set activate
+             if (!strcmp(style, "timepicker/circle"))
+               {
+                  if (idx == ELM_DATETIME_HOUR)
+                    widget_data->current_activated_obj = field_obj;
+               }
+             else
+               {
+                  if (idx == ELM_DATETIME_YEAR)
+                    widget_data->current_activated_obj = field_obj;
+               }
+             //
              evas_object_smart_callback_add(field_obj, "focused", _spinner_focused_cb, circle_obj);
+             //ONEUI1.5(04Feb2019): Trigger rotary event on highlighted object
+             evas_object_smart_callback_add(field_obj, "atspi,highlighted", _spinner_highlighted_cb, circle_obj);
+             //
           }
      }
 }
+//
+
+//ONEUI1.5(10Apr2019): enable rotary event on am/pm when it is swallowed as per format
+static void
+_eext_circle_object_datetime_timelayout_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   int idx;
+   char buf[DATETIME_FIELD_NAME_BUF_MAX];
+   Evas_Object *field_obj = NULL;
+   Elm_Datetime_Field_Type field_type;
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   //ONEUI1.5(21Jun2019): Avoid duplicate ampm object creation
+   EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return;
+
+   if (widget_data->ampm_created) return;
+   //
+
+   for (idx = ELM_DATETIME_YEAR; idx <= ELM_DATETIME_AMPM; idx++)
+     {
+        snprintf(buf, sizeof(buf), "field%d", idx);
+        field_obj = elm_object_part_content_get(obj, buf);
+        if (!field_obj) continue;
+        field_type = (Elm_Datetime_Field_Type)evas_object_data_get(field_obj, "_field_type");
+        if (field_type == ELM_DATETIME_AMPM) break;
+     }
+   if (field_obj)
+     {
+        eext_circle_object_spinner_add(field_obj, circle_obj->surface);
+        evas_object_smart_callback_add(field_obj, "focused", _spinner_focused_cb, circle_obj);
+        evas_object_smart_callback_add(field_obj, "atspi,highlighted", _spinner_highlighted_cb, circle_obj);
+     }
+}
+//
+
+//ONEUI1.5(02Jul2019): Set activate front spinner when datepicker set activate
+static void
+_eext_circle_object_datetime_stye_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return;
+
+   int idx;
+   char buf[DATETIME_FIELD_NAME_BUF_MAX];
+   const char *style = elm_object_style_get(circle_obj->widget_object);
+
+   for (idx = ELM_DATETIME_YEAR; idx <= ELM_DATETIME_HOUR; idx++)
+     {
+        snprintf(buf, sizeof(buf), "field%d", idx);
+        Evas_Object *field_obj = elm_object_part_content_get(obj, buf);
+        if (field_obj)
+          {
+             if (!strcmp(style, "timepicker/circle"))
+               {
+                  if (idx == ELM_DATETIME_HOUR)
+                    widget_data->current_activated_obj = field_obj;
+               }
+             else
+               {
+                  if (idx == ELM_DATETIME_YEAR)
+                    widget_data->current_activated_obj = field_obj;
+               }
+          }
+     }
+   if (widget_data->activated)
+     eext_rotary_object_event_activated_set(widget_data->current_activated_obj, EINA_TRUE);
+}
+//
 
 static Eina_Bool
 _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime)
@@ -96,15 +219,30 @@ _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime
    data = (Eext_Circle_Object_Datetime_Data *)calloc(1, sizeof(Eext_Circle_Object_Datetime_Data));
    if (!data) return EINA_FALSE;
 
+   data->circle_obj = obj;
+   //ONEUI1.5(21Jun2019): Avoid duplicate ampm object creation
+   data->ampm_created = EINA_FALSE;
+   //
    obj->widget_data = (void *)data;
    data->activated = EINA_FALSE;
    obj->del_func = _eext_circle_object_datetime_del_cb;
    obj->disabled_func = NULL;
+   //ONEUI1.5(02Jul2019): Set activate front spinner when datepicker set activate
+   data->current_activated_obj = NULL;
+   //
 
+   //ONEUI1.5(04Feb2019): Enable rotary on all fields of date-time, format changed can be triggered many times
+   //and causes empty field issue and also As field objects are never deleted, we don't need format,changed.
    _enable_rotary_event(datetime, obj);
+   //
    evas_object_smart_callback_add(obj->widget_object, SIGNAL_ACTIVATED, _eext_circle_object_datetime_activated_cb, obj);
    evas_object_smart_callback_add(obj->main_obj, SIGNAL_ACTIVATED, _eext_circle_object_datetime_activated_cb, obj);
-
+   //ONEUI1.5(10Apr2019): enable rotary event on am/pm when it is swallowed as per format
+   evas_object_smart_callback_add(obj->widget_object, "timelayout,changed", _eext_circle_object_datetime_timelayout_changed_cb, obj);
+   //
+   //ONEUI1.5(02Jul2019): Set activate front spinner when datepicker set activate
+   evas_object_smart_callback_add(obj->widget_object, "field,location,changed", _eext_circle_object_datetime_stye_changed_cb, obj);
+   //
    return EINA_TRUE;
 }
 
index 0ea0503a8b9fa467900a84686fa55acd0e51b53a..4c4cb7a47f91f32a2455d55287400e32cc8b402f 100644 (file)
 #define ROTARY_PHASE_N3 1.5
 #define ROTARY_PHASE_N4 4
 
+#define SCROLL_BAR_COLOR_R 14
+#define SCROLL_BAR_COLOR_G 137
+#define SCROLL_BAR_COLOR_B 181
+#define SCROLL_BAR_COLOR_A 255
+
+#define SCROLL_BAR_BG_COLOR_R 250
+#define SCROLL_BAR_BG_COLOR_G 250
+#define SCROLL_BAR_BG_COLOR_B 250
+#define SCROLL_BAR_BG_COLOR_A 38
+
+#define SCROLL_BAR_COLOR_DISABLED_R 45
+#define SCROLL_BAR_COLOR_DISABLED_G 45
+#define SCROLL_BAR_COLOR_DISABLED_B 45
+#define SCROLL_BAR_COLOR_DISABLED_A 255
+
+#define SCROLL_BAR_BG_COLOR_DISABLED_R 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_G 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_B 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_A 63
+
 static const char SIGNAL_LOADED[] = "loaded";
 static const char SIGNAL_ACTIVATED[] = "rotary,activated";
 static const char SIGNAL_DEACTIVATED[] = "rotary,deactivated";
@@ -230,17 +250,6 @@ _eext_circle_object_gengrid_region_show(Eext_Circle_Object *circle_obj,
      elm_scroller_region_bring_in(circle_obj->widget_object, x, y_pos, w, h);
 }
 
-static Eext_Circle_Object_Gengrid_Rotary_Time *
-_eext_circle_object_gengrid_rotary_time_new(double time)
-{
-   Eext_Circle_Object_Gengrid_Rotary_Time *rotary_time = calloc(1, sizeof(Eext_Circle_Object_Gengrid_Rotary_Time));
-
-   if (rotary_time)
-     rotary_time->time = time;
-
-   return rotary_time;
-}
-
 static Eina_Bool
 _rotary_changed_cb(void *data,
                    Evas_Object *obj,
@@ -364,7 +373,6 @@ _eext_circle_object_gengrid_scrollbar_update(Eext_Circle_Object *circle_obj)
         widget_data->bar_size_y = 0;
         _eext_circle_object_item_color_set(widget_data->item, 0, 0, 0, 0);
         _eext_circle_object_item_color_set(widget_data->bg_item, 0, 0, 0, 0);
-        _eext_circle_object_changed(circle_obj);
         return;
      }
    if (horizontal)
@@ -622,8 +630,6 @@ _eext_circle_object_gengrid_init_scroller_info(Eext_Circle_Object *circle_obj)
 
    _eext_circle_object_item_color_set(widget_data->item, 0, 0, 0, 0);
    _eext_circle_object_item_color_set(widget_data->bg_item, 0, 0, 0, 0);
-
-   _eext_circle_object_changed(circle_obj);
 }
 
 static void
@@ -783,6 +789,43 @@ _eext_circle_object_gengrid_del_cb(Eext_Circle_Object *circle_obj)
    eext_rotary_object_event_callback_del(circle_obj->widget_object, _rotary_changed_cb);
 }
 
+static void
+_update_color_info(Eext_Circle_Object *obj)
+{
+   EEXT_CIRCLE_OBJECT_GENGRID_DATA_GET(obj, widget_data) return;
+   int r, g, b, a;
+
+   if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object),
+                                    widget_data->scrollbar_color_class,
+                                    &r, &g, &b, &a,
+                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     {
+        r = SCROLL_BAR_COLOR_R;
+        g = SCROLL_BAR_COLOR_G;
+        b = SCROLL_BAR_COLOR_B;
+        a = SCROLL_BAR_COLOR_A;
+     }
+   widget_data->color.r = r;
+   widget_data->color.g = g;
+   widget_data->color.b = b;
+   widget_data->color.a = a;
+
+   if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object),
+                                    widget_data->scrollbar_bg_color_class,
+                                    &r, &g, &b, &a,
+                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     {
+        r = SCROLL_BAR_BG_COLOR_R;
+        g = SCROLL_BAR_BG_COLOR_G;
+        b = SCROLL_BAR_BG_COLOR_B;
+        a = SCROLL_BAR_BG_COLOR_A;
+     }
+   widget_data->bg_color.r = r;
+   widget_data->bg_color.g = g;
+   widget_data->bg_color.b = b;
+   widget_data->bg_color.a = a;
+}
+
 static void
 _eext_circle_object_gengrid_init(Eext_Circle_Object *circle_obj,
                                  Evas_Object *gengrid)
@@ -795,19 +838,21 @@ _eext_circle_object_gengrid_init(Eext_Circle_Object *circle_obj,
    circle_obj->mirrored_state = EEXT_CIRCLE_MIRRORED_CONFIG;
 
    widget_data = (Eext_Circle_Object_Gengrid_Data *)calloc(1, sizeof(Eext_Circle_Object_Gengrid_Data));
+   if (!widget_data)
+     {
+        LOGE("Could not allocate memory for Eext_Circle_Object_Gengrid_Data!");
+        return;
+     }
+
    widget_data->policy_v = ELM_SCROLLER_POLICY_AUTO;
    widget_data->scrollbar_initializing = EINA_FALSE;
    widget_data->scrollbar_color_class = edje_object_data_get(elm_layout_edje_get(gengrid), "bar_color_class");
    widget_data->scrollbar_bg_color_class = edje_object_data_get(elm_layout_edje_get(gengrid), "bar_bg_color_class");
 
+   circle_obj->widget_data = (void *)widget_data;
+   _update_color_info(circle_obj);
+
    widget_data->bg_item = _eext_circle_object_item_new();
-   edje_object_color_class_get(elm_layout_edje_get(circle_obj->widget_object),
-                               widget_data->scrollbar_bg_color_class,
-                               &widget_data->bg_color.r,
-                               &widget_data->bg_color.g,
-                               &widget_data->bg_color.b,
-                               &widget_data->bg_color.a,
-                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
    _eext_circle_object_item_name_set(widget_data->bg_item, GENGRID_BG_ITEM_NAME);
    _eext_circle_object_item_color_set(widget_data->bg_item, 0, 0, 0, 0);
    if (elm_gengrid_horizontal_get(gengrid))
@@ -827,13 +872,6 @@ _eext_circle_object_gengrid_init(Eext_Circle_Object *circle_obj,
    _eext_circle_object_item_append(circle_obj, widget_data->bg_item);
 
    widget_data->item = _eext_circle_object_item_new();
-   edje_object_color_class_get(elm_layout_edje_get(circle_obj->widget_object),
-                               widget_data->scrollbar_color_class,
-                               &widget_data->color.r,
-                               &widget_data->color.g,
-                               &widget_data->color.b,
-                               &widget_data->color.a,
-                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
    _eext_circle_object_item_name_set(widget_data->item, GENGRID_ITEM_NAME);
    _eext_circle_object_item_color_set(widget_data->item, 0, 0, 0, 0);
    if (elm_gengrid_horizontal_get(gengrid))
@@ -852,8 +890,6 @@ _eext_circle_object_gengrid_init(Eext_Circle_Object *circle_obj,
      }
    _eext_circle_object_item_append(circle_obj, widget_data->item);
 
-   circle_obj->widget_data = (void *)widget_data;
-
    elm_scroller_policy_set(circle_obj->widget_object, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
 
    evas_object_smart_callback_add(circle_obj->widget_object, SIGNAL_ACTIVATED, _eext_circle_object_gengrid_activated_cb, circle_obj);
@@ -894,7 +930,7 @@ eext_circle_object_gengrid_scroller_policy_set(Evas_Object *obj,
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
    EEXT_CIRCLE_OBJECT_GENGRID_DATA_GET(circle_obj, widget_data)
      {
-        ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
+        LOGE("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
              EEXT_CIRCLE_OBJECT_GENGRID_TYPE, circle_obj->widget_type);
         return;
      }
@@ -935,7 +971,7 @@ eext_circle_object_gengrid_scroller_policy_get(const Evas_Object *obj,
 
    EEXT_CIRCLE_OBJECT_GENGRID_DATA_GET(circle_obj, widget_data)
      {
-        ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
+        LOGE("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
              EEXT_CIRCLE_OBJECT_GENGRID_TYPE, circle_obj->widget_type);
         if (policy_h) *policy_h = ELM_SCROLLER_POLICY_AUTO;
         if (policy_v) *policy_v = ELM_SCROLLER_POLICY_AUTO;
index ead141f004edf039fba8a9a692cf4c1e20286577..57f3a37d55a7c4e202ef44d729b4c811ab0385bf 100644 (file)
 #include "efl_extension.h"
 #include "efl_extension_private.h"
 #include "wearable/circle/efl_extension_circle_private.h"
-
 #define EEXT_CIRCLE_OBJECT_GENLIST_TYPE "Eext_Circle_Object_Genlist"
 
 #define VERTICAL_BAR_ANGLE_START 60.0
 #define VERTICAL_BAR_ANGLE_RANGE 60.0
 #define VERTICAL_BAR_ANGLE_MAX_SIZE 60.0
 #define VERTICAL_BAR_ANGLE_MIN_SIZE 6.0
+#define VERTICAL_BAR_ANGLE_HANDLER_SIZE 15.3
 #define VERTICAL_BAR_TRANSIT_TIME 0.2
 #define VERTICAL_BAR_HIDE_WAITTING_TIME 0.2
 #define VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING 1.0
 #define VERTICAL_BAR_WIDTH_SIZE 10
-#define VERTICAL_BAR_RADIUS_SIZE 174 // (180 - (BAR_WIDTH / 2) - 1)
+#define HANDLER_BAR_WIDTH_SIZE 32
+#define VERTICAL_BAR_RADIUS_SIZE 174 // (180 - 6)
+#define DETENT_SCROLL_DISTANCE_RATE 0.4
+#define ROTARY_EVENT_TIME_STAMP_THRESHOLD 500
+//ONEUI1.5(04July2019): Support different color with bezel
+#define SCROLL_BAR_TRANSIT_TIME 0.2
+//
+#define SURFACE_WIDTH 360
+
+#define ROTARY_PHASE_N1 0.1
+#define ROTARY_PHASE_N2 3
+#define ROTARY_PHASE_N3 1.5
+#define ROTARY_PHASE_N4 4
 
 #define SCROLL_BAR_COLOR_R 14
 #define SCROLL_BAR_COLOR_G 137
 #define SCROLL_BAR_BG_COLOR_DISABLED_B 45
 #define SCROLL_BAR_BG_COLOR_DISABLED_A 63
 
+static const char SIGNAL_LOADED[] = "loaded";
+static const char SIGNAL_SCROLL[] = "scroll";
+static const char SIGNAL_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
+static const char SIGNAL_INDEX_SHOW[] = "index,state,show";
+static const char SIGNAL_INDEX_HIDE[] = "index,state,hide";
+static const char SIGNAL_EDGE_TOP_ROTARY_DETENTED[] = "elm,edge,top,rotary,detented";
+static const char SIGNAL_EDGE_BOTTOM_ROTARY_DETENTED[] = "elm,edge,bottom,rotary,detented";
+static const char SIGNAL_ITEM_DELETED[] = "item,deleted";
+static const char SIG_ALIGNED_ITEM_DETECTED[] = "aligned,item,detected";
+static const char SIG_BRING_IN_ITEM_ADJUSTED[] = "bring_in,item,adjusted";
+static const char SIG_REALIZED[] = "realized";
+static const char SIG_INDEX_SHOW[] = "index,show";
+static const char HANDLER_STYLE[] = "prod/handler";
+//ONEUI1.5(18FEB2019): Genlist resume/pause signal for scrollbar show
+static const char SIG_GENLIST_RESUME[] = "genlist,resume";
+static const char SIG_GENLIST_PAUSE[] = "genlist,pause";
+//
+//ONEUI1.5(03JUN2019): Update circle genlist on theme change
+static const char SIG_THEME_CHANGED[] = "theme,changed";
+//
+
+Elm_Scrollable_Smart_Interface_Data* __elm_scrollable_smart_interface_data_get(Eo *obj);
+extern void elm_pan_pos_adjust(Eo *obj, Evas_Coord *x, Evas_Coord *y);
+
 #define EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data) \
    Eext_Circle_Object_Genlist_Data *data = NULL; \
    if (circle_obj && circle_obj->widget_data && \
       data = (Eext_Circle_Object_Genlist_Data *)circle_obj->widget_data; \
    if (!data)
 
+#define EEXT_CIRCLE_OBJECT_GENLIST_SCROLL_IFACE_DATA_GET(o, ptr)                     \
+  Elm_Scrollable_Smart_Interface_Data *ptr =                            \
+    (Elm_Scrollable_Smart_Interface_Data *)(__elm_scrollable_smart_interface_data_get((Eo *)o)); \
+  if (!ptr) \
+    { \
+       LOGE("No interface data for object %p (%s)", o, evas_object_type_get(o)); \
+    }
+
 #define GENLIST_ITEM_NAME "default"
 #define GENLIST_BG_ITEM_NAME "vertical,scroll,bg"
+#define STR_DUP(x) x ? (char *)eina_stringshare_add(x) : NULL
 
-static void _eext_circle_object_genlist_scrollbar_update(Eext_Circle_Object *obj);
-static void _eext_circle_object_genlist_scrollbar_show(Eext_Circle_Object *obj,
-                                           double hide_waiting_time);
+static void _eext_circle_object_genlist_index_drag_cb(void *data,
+                                                      Evas_Object *obj,
+                                                      void *event_info);
+static void _eext_circle_object_genlist_scrollbar_show(Eext_Circle_Object *circle_obj);
+static Eina_Bool _eext_circle_object_genlist_change_flag_cb(void *);
+static Eina_Bool _eext_circle_object_genlist_scrollbar_first_show_cb(void *);
+extern Eina_Bool __elm_product_theme_is_loaded(void);
 
-static void
-_eext_circle_object_genlist_region_show(void *data, Eina_Bool clockwise)
+static Evas_Event_Flags _index_layout_lines_end(void *data, void *event_info);
+static Evas_Event_Flags _index_layout_tap_end(void *data, void *event_info);
+static void _remove_gesture_layer(Eext_Circle_Object *circle_obj);
+
+
+static Eext_Circle_Object_Genlist_Index_Item *
+_eext_circle_object_genlist_index_item_new(Eext_Circle_Object *circle_obj,
+                                           Elm_Object_Item *item,
+                                           const char *letter)
 {
-   Eext_Circle_Object *obj = (Eext_Circle_Object *)data;
-   Evas_Coord x, y, vw, vh;
-   Elm_Object_Item *next_item;
+   Eext_Circle_Object_Genlist_Index_Item *index_item;
+
+   if (!circle_obj || !letter || !item) return NULL;
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return NULL;
 
-   if (!obj) return;
+   index_item = (Eext_Circle_Object_Genlist_Index_Item *)calloc(1, sizeof(Eext_Circle_Object_Genlist_Index_Item));
+   if (!index_item) return NULL;
+
+   index_item->letter = eina_stringshare_add(letter);
+   index_item->item = item;
+
+   if (!widget_data->index_item_list)
+     widget_data->index_selected_item = index_item;
+
+   return index_item;
+}
+
+static void
+_eext_circle_object_genlist_index_hide(Eext_Circle_Object *circle_obj)
+{
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
 
-   if (efl_isa(obj->widget_object, EFL_UI_LEGACY_INTERFACE))
+   if (widget_data->index_layout)
      {
-        elm_scroller_region_get(obj->widget_object, NULL, NULL, &vw, &vh);
-        evas_object_geometry_get(obj->widget_object, &x, &y, NULL, NULL);
+        Eext_Circle_Object_Genlist_Rotary_Time *rotary_time;
 
-        next_item = elm_genlist_at_xy_item_get(obj->widget_object, (vw / 2) + x, (vh / 2) + y, 0);
+        if (widget_data->index_hide_timer)
+          {
+             ecore_timer_del(widget_data->index_hide_timer);
+             widget_data->index_hide_timer = NULL;
+          }
 
-        if (!next_item) return;
+        evas_object_smart_callback_call(circle_obj->main_obj, "index,state,hide", widget_data->index_layout);
+        elm_object_signal_emit(widget_data->index_layout, SIGNAL_INDEX_HIDE, "elm");
 
-        if (clockwise)
-          next_item = elm_genlist_item_next_get(next_item);
-        else
-          next_item = elm_genlist_item_prev_get(next_item);
+        if (widget_data->index_selected_item)
+          {
+             widget_data->current_item = widget_data->index_selected_item->item;
+          }
+
+        if (elm_atspi_bridge_utils_is_screen_reader_enabled() && widget_data->access_object)
+          {
+             elm_atspi_component_highlight_grab(widget_data->current_item);
+          }
 
-        if (!next_item) return;
+        if (widget_data->drag_callback_added)
+          {
+             evas_object_smart_callback_del_full(circle_obj->widget_object, "drag", _eext_circle_object_genlist_index_drag_cb, circle_obj);
+             widget_data->drag_callback_added = EINA_FALSE;
+          }
 
-        elm_genlist_item_bring_in(next_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+        EINA_LIST_FREE(widget_data->rotary_times, rotary_time)
+          free(rotary_time);
+
+        if (!__elm_product_theme_is_loaded())
+          widget_data->index_selected_item = NULL;
+        widget_data->rotary_count = 0;
+        widget_data->current_phase = 0;
      }
-   else
+}
+
+static Eina_Bool
+_eext_circle_object_genlist_index_hide_timer_cb(void *data)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   _eext_circle_object_genlist_index_hide(circle_obj);
+   //ONEUI1.5(19Jun2019): Enable sw/hw bezel
+    if (!eext_rotary_event_is_enabled())
+     _remove_gesture_layer(circle_obj);
+
+   return ECORE_CALLBACK_DONE;
+}
+
+static void
+_eext_circle_object_genlist_index_show(Eext_Circle_Object *circle_obj)
+{
+   double hide_time = ROTARY_PHASE_N3;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   if (widget_data->index_layout)
      {
-        Eina_Size2D size;
-        Eina_Position2D pos = efl_ui_scrollable_content_pos_get(obj->widget_object);
-        Eina_Rect rect = efl_ui_scrollable_viewport_geometry_get(obj->widget_object);
+        if (widget_data->index_hide_timer)
+          {
+             ecore_timer_del(widget_data->index_hide_timer);
+             widget_data->index_hide_timer = NULL;
+          }
+        else
+          {
+             evas_object_smart_callback_call(circle_obj->main_obj, "index,state,show", widget_data->index_layout);
+             elm_object_signal_emit(widget_data->index_layout, SIGNAL_INDEX_SHOW, "elm");
+          }
 
-        //C# FIXME: list should be center aligned
-        if (clockwise)
+        if (widget_data->index_selected_item)
           {
-             rect.y = pos.y + 30;
-             efl_ui_scrollable_scroll(obj->widget_object, rect, EINA_TRUE);
+             evas_object_smart_callback_call(circle_obj->main_obj, "index,state,change", widget_data->index_selected_item->item);
+             elm_object_part_text_set(widget_data->index_layout, "elm.text", widget_data->index_selected_item->letter);
           }
         else
+          elm_object_part_text_set(widget_data->index_layout, "elm.text", "");
+//ONEUI1.5(25Feb2019): Update based on 2019 watch access UX
+        if (elm_atspi_bridge_utils_is_screen_reader_enabled() && widget_data->index_selected_item && widget_data->access_object)
           {
-             rect.y = pos.y - 30;
-             efl_ui_scrollable_scroll(obj->widget_object, rect, EINA_TRUE);
+             char *first_text;
+             Eina_Strbuf *buf;
+
+             buf = eina_strbuf_new();
+             eina_strbuf_append(buf, widget_data->index_selected_item->letter);
+             eina_strbuf_append(buf, ", ");
+             eina_strbuf_append(buf, _("WDS_TTS_TBOPT_INDEX_SCROLL"));
+             first_text = eina_strbuf_string_steal(buf);
+             eina_strbuf_free(buf);
+             elm_atspi_accessible_name_set(widget_data->access_object, first_text);
+             Eext_Rotary_Event_Type _rotary_event_type = eext_rotary_event_type_get();
+             if (_rotary_event_type == EEXT_ROTARY_EVENT_TYPE_HW_BEZEL)
+               elm_atspi_accessible_description_set(widget_data->access_object, _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_SEARCH_INDEX"));
+             else if (_rotary_event_type == EEXT_ROTARY_EVENT_TYPE_SW_BEZEL && eext_rotary_event_is_enabled())
+               elm_atspi_accessible_description_set(widget_data->access_object, _("WDS_ACCS_TBBODY_SWIPE_THE_BEZEL_TO_SEARCH_THE_INDEX"));
+             else
+               elm_atspi_accessible_description_set(widget_data->access_object, _("WDS_ACCS_TBBODY_SWIPE_UP_OR_DOWN_TO_JUMP_TO_NEXT_LETTER_OF_THE_ALPHABET"));
+
+             elm_atspi_component_highlight_grab(widget_data->access_object);
+             hide_time = ROTARY_PHASE_N4;
           }
+//
+        widget_data->index_hide_timer = ecore_timer_add(hide_time, _eext_circle_object_genlist_index_hide_timer_cb, circle_obj);
      }
 }
 
 static Eina_Bool
-_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
+_eext_circle_object_genlist_index_selected_item_update(Eext_Circle_Object_Genlist_Data *widget_data,
+                                                       Eina_Bool next)
 {
-   Eext_Circle_Object *circle_obj = data;
+   Eext_Circle_Object_Genlist_Index_Item *index_item;
+   Elm_Object_Item *genlist_item;
+   Eina_List *l;
 
-   if (circle_obj->is_propagated)
+   if (!widget_data->index_selected_item)
      {
-        circle_obj->is_propagated = EINA_FALSE;
+        if (next)
+          genlist_item = elm_genlist_item_next_get(widget_data->current_item);
+        else
+          genlist_item = elm_genlist_item_prev_get(widget_data->current_item);
 
-        return EINA_TRUE;
+        while (genlist_item)
+          {
+             EINA_LIST_FOREACH(widget_data->index_item_list, l, index_item)
+               {
+                  if (index_item->item == genlist_item)
+                    {
+                       widget_data->index_selected_item = index_item;
+                       return EINA_TRUE;
+                    }
+               }
+
+             if (next)
+               genlist_item = elm_genlist_item_next_get(genlist_item);
+             else
+               genlist_item = elm_genlist_item_prev_get(genlist_item);
+          }
      }
-   if (obj == circle_obj->main_obj)
-     circle_obj->is_propagated = EINA_TRUE;
-   if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
-     _eext_circle_object_genlist_region_show(circle_obj, EINA_TRUE);
    else
-     _eext_circle_object_genlist_region_show(circle_obj, EINA_FALSE);
+     {
+        Eina_Bool found = EINA_FALSE;
 
-   _eext_circle_object_genlist_scrollbar_update(circle_obj);
-   _eext_circle_object_genlist_scrollbar_show(circle_obj,
-                                              VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+        if (next)
+          {
+             EINA_LIST_FOREACH(widget_data->index_item_list, l, index_item)
+               {
+                  if (widget_data->index_selected_item == index_item)
+                    {
+                       found = EINA_TRUE;
+                       continue;
+                    }
+
+                  if (found)
+                    {
+                       widget_data->index_selected_item = index_item;
+                       return EINA_TRUE;
+                    }
+               }
+          }
+        else
+          {
+             EINA_LIST_REVERSE_FOREACH(widget_data->index_item_list, l, index_item)
+               {
+                  if (widget_data->index_selected_item == index_item)
+                    {
+                       found = EINA_TRUE;
+                       continue;
+                    }
+
+                  if (found)
+                    {
+                       widget_data->index_selected_item = index_item;
+                       return EINA_TRUE;
+                    }
+               }
+          }
+     }
 
-   return EINA_TRUE;
+   return EINA_FALSE;
 }
 
 static void
-_eext_circle_object_genlist_scrollbar_update(Eext_Circle_Object *obj)
+_eext_circle_object_genlist_index_selected_item_region_show(Eext_Circle_Object *obj)
 {
-   Eext_Circle_Object_Item *item;
-   Evas_Coord ch; /* content h */
-   Evas_Coord py, vh; /* postion y, viewport h*/
-   double ratio;
-   double bar_pos_y = VERTICAL_BAR_ANGLE_START;
-   double bar_size_y = VERTICAL_BAR_ANGLE_RANGE;
-   double vertical_bar_angle_range = VERTICAL_BAR_ANGLE_RANGE;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
+   if (!widget_data->index_selected_item) return;
 
-   if (!obj) return;
+   elm_genlist_item_show(widget_data->index_selected_item->item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+}
 
-   item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
+static void
+_eext_circle_object_genlist_region_show(Eext_Circle_Object *circle_obj,
+                                        Eina_Bool clockwise)
+{
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
 
-   Eina_Size2D size;
-   Eina_Rect rect;
-   Eina_Position2D pos;
+   Elm_Object_Item *next_item = NULL;
+   Evas_Coord x = 0, y = 0, w = 0, h = 0;
+   Evas_Coord ch = 0, scroll_y = 0;
+   Eina_Bool loop_v = EINA_FALSE;
 
-   //C# FIXME: Optimize the code
-   ch = 0;
-   size.w = size.h = 0;
-   rect.x = rect.y = rect.w = rect.h = 0;
-   pos.x = pos.y = 0;
+   elm_scroller_loop_get(circle_obj->widget_object, NULL, &loop_v);
 
-   if (efl_isa(obj->widget_object, EFL_UI_LEGACY_INTERFACE))
-     {
-        elm_scroller_child_size_get(obj->widget_object, NULL, &ch);
-        elm_scroller_region_get(obj->widget_object, NULL, &py, NULL, &vh);
-     }
-   else
-     {
-        size = efl_ui_scrollable_content_size_get(obj->widget_object);
-        rect = efl_ui_scrollable_viewport_geometry_get(obj->widget_object);
-        pos = efl_ui_scrollable_content_pos_get(obj->widget_object);
-     }
+   elm_scroller_child_size_get(circle_obj->widget_object, NULL, &ch);
+   elm_scroller_region_get(circle_obj->widget_object, &x, &y, &w, &h);
 
-   if (ch > 0)
+   if (!elm_object_scroll_item_align_enabled_get(circle_obj->widget_object))
      {
-        ratio = (double)ch / (double)vh;
-
-        if (ratio == 0) return;
+        if (h >= ch) return;
 
-        if (ch > vh)
+        if (widget_data->policy_v != ELM_SCROLLER_POLICY_OFF && !widget_data->scrollbar_first_shown)
           {
-             bar_size_y = vertical_bar_angle_range / ratio;
+             _eext_circle_object_genlist_scrollbar_first_show_cb(circle_obj);
+             if (widget_data->change_flag_timer)
+               {
+                  ecore_timer_del(widget_data->change_flag_timer);
+                  widget_data->change_flag_timer = NULL;
+               }
+             widget_data->scrollbar_initializing = EINA_FALSE;
+          }
 
-             if (bar_size_y > VERTICAL_BAR_ANGLE_MAX_SIZE)
-               bar_size_y = VERTICAL_BAR_ANGLE_MAX_SIZE;
-             if (bar_size_y < VERTICAL_BAR_ANGLE_MIN_SIZE)
-               bar_size_y = VERTICAL_BAR_ANGLE_MIN_SIZE;
+        if (clockwise)
+          {
+             if (y < widget_data->dest_y)
+               scroll_y = y + (widget_data->dest_y - y) + (h * DETENT_SCROLL_DISTANCE_RATE);
+             else
+               scroll_y = y + h * DETENT_SCROLL_DISTANCE_RATE;
+
+             if (scroll_y > ch - h)
+               scroll_y = ch - h;
+             if (scroll_y == y)
+               edje_object_signal_emit(elm_layout_edje_get(circle_obj->widget_object), SIGNAL_EDGE_BOTTOM_ROTARY_DETENTED, "elm");
+          }
+        else
+          {
+             if (y > 0)
+               {
+                  if (y > widget_data->dest_y)
+                    scroll_y = y - (y - widget_data->dest_y) - (h * DETENT_SCROLL_DISTANCE_RATE);
+                  else
+                    scroll_y = y - h * DETENT_SCROLL_DISTANCE_RATE;
+
+                  if (scroll_y < 0)
+                    scroll_y = 0;
+               }
+             else
+               edje_object_signal_emit(elm_layout_edje_get(circle_obj->widget_object), SIGNAL_EDGE_TOP_ROTARY_DETENTED, "elm");
           }
-        bar_pos_y += (double)py / ch * vertical_bar_angle_range;
 
-        _eext_circle_object_item_angle_set(item, bar_size_y);
-        _eext_circle_object_item_angle_offset_set(item, bar_pos_y);
+        widget_data->dest_y = scroll_y;
+        elm_scroller_region_bring_in(circle_obj->widget_object, x, scroll_y, w, h);
+        return;
      }
-   else if (size.h > 0)
-     {
-        ratio = (double)size.h / (double)rect.h;
 
-        if (ratio == 0) return;
+   next_item = widget_data->current_item;
 
-        if (size.h > rect.h)
-          {
-             bar_size_y = vertical_bar_angle_range / ratio;
+   if (!next_item) return;
+   //ONEUI1.5(15Oct2019): Finger scroll is possible when ch > h and in loop case
+   //                         bezel scroll have to be supported to be in sync with
+   //                         finger scroll behaviour
+   if (!loop_v && ch < h + elm_config_finger_size_get()) return;
+   else if (loop_v && (ch < h)) return;
+   //
 
-             if (bar_size_y > VERTICAL_BAR_ANGLE_MAX_SIZE)
-               bar_size_y = VERTICAL_BAR_ANGLE_MAX_SIZE;
-             if (bar_size_y < VERTICAL_BAR_ANGLE_MIN_SIZE)
-               bar_size_y = VERTICAL_BAR_ANGLE_MIN_SIZE;
+   if (clockwise)
+     {
+        Elm_Object_Item *last_item = elm_genlist_last_item_get(circle_obj->widget_object);
+        if ((y + h + elm_config_finger_size_get()) >= ch && !loop_v)
+          {
+             edje_object_signal_emit(elm_layout_edje_get(circle_obj->widget_object), SIGNAL_EDGE_BOTTOM_ROTARY_DETENTED, "elm");
+             return;
+          }
+        else
+          {
+             if (next_item != last_item)
+               next_item = elm_genlist_item_next_get(next_item);
+             else if (loop_v)
+               next_item = elm_genlist_first_item_get(circle_obj->widget_object);
+          }
+     }
+   else
+     {
+        Elm_Object_Item *first_item = elm_genlist_first_item_get(circle_obj->widget_object);
+        if (y > (elm_config_finger_size_get() * -1) && y < elm_config_finger_size_get() && !loop_v)
+          {
+             edje_object_signal_emit(elm_layout_edje_get(circle_obj->widget_object), SIGNAL_EDGE_TOP_ROTARY_DETENTED, "elm");
+             return;
+          }
+        else
+          {
+             if (next_item != first_item)
+               next_item = elm_genlist_item_prev_get(next_item);
+             else if (loop_v)
+               next_item = elm_genlist_last_item_get(circle_obj->widget_object);
           }
-        bar_pos_y += (double)pos.y / size.h * vertical_bar_angle_range;
+     }
+
+   if (!next_item) return;
 
-        _eext_circle_object_item_angle_set(item, bar_size_y);
-        _eext_circle_object_item_angle_offset_set(item, bar_pos_y);
+   if (next_item != widget_data->current_item)
+     {
+        elm_genlist_item_bring_in(next_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
      }
 }
 
-static void
-_eext_circle_object_genlist_realized_cb(void *data,
-                                        Evas_Object *obj,
-                                        void *event_info)
+static Eext_Circle_Object_Genlist_Rotary_Time *
+_eext_circle_object_genlist_rotary_time_new(double time)
 {
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+   Eext_Circle_Object_Genlist_Rotary_Time *rotary_time = calloc(1, sizeof(Eext_Circle_Object_Genlist_Rotary_Time));
 
-   if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
+   if (rotary_time)
+     rotary_time->time = time;
 
-   _eext_circle_object_genlist_scrollbar_update(circle_obj);
+   return rotary_time;
 }
 
 static void
-_eext_circle_object_genlist_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
+_eext_circle_object_genlist_index_scroll_phase_update(Eext_Circle_Object_Genlist_Data *widget_data)
 {
-   Eext_Circle_Object_Item *item;
-   int r, g, b, a;
+   if(!widget_data->index_item_list) return;
 
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
+   Eext_Circle_Object_Genlist_Rotary_Time *rotary_time;
+   double current_time, start_time;
+   double reset_time = ROTARY_PHASE_N3;
 
-   item = _eext_circle_object_item_get(obj, item_name);
-   if (!item) return;
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+     {
+        reset_time = ROTARY_PHASE_N4;
+     }
 
-   _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
+   current_time = ecore_time_get();
 
-   if (!strcmp(item_name, GENLIST_ITEM_NAME))
+   if ((current_time - widget_data->last_time) > reset_time)
      {
-        widget_data->color.r = r;
-        widget_data->color.g = g;
-        widget_data->color.b = b;
-        widget_data->color.a = a;
+        EINA_LIST_FREE(widget_data->rotary_times, rotary_time)
+          free(rotary_time);
 
-        return;
+        widget_data->rotary_count = 0.0;
+        widget_data->current_phase = 0;
      }
 
-   if (!strcmp(item_name, GENLIST_BG_ITEM_NAME))
+   widget_data->last_time = current_time;
+
+   if (widget_data->current_phase == 0)
      {
-        widget_data->bg_color.r = r;
-        widget_data->bg_color.g = g;
-        widget_data->bg_color.b = b;
-        widget_data->bg_color.a = a;
+        rotary_time = _eext_circle_object_genlist_rotary_time_new(current_time);
+        widget_data->rotary_times = eina_list_append(widget_data->rotary_times, rotary_time);
+        widget_data->rotary_count += 1;
 
-        return;
+        if (widget_data->rotary_count > ROTARY_PHASE_N2)
+          {
+             rotary_time = eina_list_data_get(widget_data->rotary_times);
+             free(rotary_time);
+
+             widget_data->rotary_times = eina_list_remove_list(widget_data->rotary_times,
+                                                               widget_data->rotary_times);
+          }
+
+        if (widget_data->rotary_count >= ROTARY_PHASE_N2)
+          {
+             rotary_time = eina_list_data_get(widget_data->rotary_times);
+             start_time = rotary_time->time;
+
+             if ((current_time - start_time) < ROTARY_PHASE_N1)
+               {
+                  EINA_LIST_FREE(widget_data->rotary_times, rotary_time)
+                     free(rotary_time);
+
+                  // Current time is saved and used for checking delay in next phase
+                  rotary_time = _eext_circle_object_genlist_rotary_time_new(current_time);
+                  widget_data->rotary_times = eina_list_append(widget_data->rotary_times, rotary_time);
+                  widget_data->current_phase = 1;
+                  widget_data->rotary_count = 0;
+
+               }
+          }
+     }
+   else if (widget_data->current_phase == 1)
+     {
+        EINA_LIST_FREE(widget_data->rotary_times, rotary_time)
+           free(rotary_time);
+
+        rotary_time = _eext_circle_object_genlist_rotary_time_new(current_time);
+        widget_data->rotary_times = eina_list_append(widget_data->rotary_times, rotary_time);
+        widget_data->rotary_count += 1;
      }
 }
 
+static void
+_eext_circle_object_genlist_index_drag_cb(void *data, Evas_Object *obj,
+                                          void *event_info)
+{
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   _eext_circle_object_genlist_index_hide(circle_obj);
+}
+
 static Eina_Bool
-_eext_circle_object_genlist_scrollbar_policy_hide_cb(void *data)
+_rotary_changed_cb(void *data,
+                   Evas_Object *obj,
+                   Eext_Rotary_Event_Info *info)
 {
-   Eext_Circle_Object *obj = (Eext_Circle_Object *)data;
-   Eext_Circle_Object_Item *item;
-   Eina_List *l;
+   Eina_Bool clockwise;
+   unsigned int time_stamp_diff;
+
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return EINA_TRUE;
+
+   Eina_Bool loop_v = EINA_FALSE;
 
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return ECORE_CALLBACK_CANCEL;
+   elm_scroller_loop_get(circle_obj->widget_object, NULL, &loop_v);
 
-   if (widget_data->realized_callback_added)
+   if (circle_obj->is_propagated)
      {
-        evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
-        widget_data->realized_callback_added = EINA_FALSE;
+        circle_obj->is_propagated = EINA_FALSE;
+
+        return EINA_TRUE;
      }
+   //ONEUI1.5(04July2019): Support different color with bezel
+   if (__elm_product_theme_is_loaded())
+     widget_data->bezel_on = EINA_TRUE;
+   //
 
-   EINA_LIST_FOREACH(obj->items, l, item)
+   if (obj == circle_obj->main_obj)
      {
-        _eext_circle_object_item_color_transit_set(item, VERTICAL_BAR_TRANSIT_TIME,
-                                                   0, 0, 0, 0,
-                                                   EINA_TRUE,
-                                                   0.25, 0.46, 0.45, 1.0);
+        circle_obj->is_propagated = EINA_TRUE;
      }
 
-   if (widget_data->bar_hide_timer)
+   if (!widget_data->drag_callback_added && widget_data->index_layout)
      {
-         ecore_timer_del(widget_data->bar_hide_timer);
-         widget_data->bar_hide_timer = NULL;
+        evas_object_smart_callback_add(circle_obj->widget_object, "drag", _eext_circle_object_genlist_index_drag_cb, circle_obj);
+        widget_data->drag_callback_added = EINA_TRUE;
      }
 
-   return ECORE_CALLBACK_CANCEL;
-}
+   time_stamp_diff = info->time_stamp - widget_data->latest_time_stamp;
+   if (time_stamp_diff > ROTARY_EVENT_TIME_STAMP_THRESHOLD || !widget_data->current_item)
+     {
+        Evas_Coord ox, oy, ow, oh;
+        evas_object_geometry_get(circle_obj->widget_object, &ox, &oy, &ow, &oh);
+        widget_data->current_item = elm_genlist_at_xy_item_get(circle_obj->widget_object, ox + ow/2, oy + oh/2, NULL);
+        if (!elm_object_scroll_item_align_enabled_get(circle_obj->widget_object))
+          {
+             Evas_Coord y;
+             elm_scroller_region_get(circle_obj->widget_object, NULL, &y, NULL, NULL);
+             widget_data->dest_y = y;
+          }
+        if (loop_v && !widget_data->current_item)
+          widget_data->current_item = elm_genlist_first_item_get(circle_obj->widget_object);
+        widget_data->detent_count = 0;
+        //ONEUI1.5(25Oct2019): Logs for genlist rotary operation
+        LOGE("obj (%p) current_item (%p) direction (%d)", obj, widget_data->current_item, info->direction);
+        //
+     }
 
-static void
-_eext_circle_object_genlist_scrollbar_show(Eext_Circle_Object *obj,
-                                           double hide_waiting_time)
-{
-   Eext_Circle_Object_Item *item;
+   if (elm_object_scroll_item_align_enabled_get(circle_obj->widget_object) && loop_v &&
+       (abs(widget_data->detent_count) >= elm_genlist_items_count(circle_obj->widget_object) / 2))
+     return EINA_TRUE;
 
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
+   widget_data->latest_time_stamp = info->time_stamp;
 
-   if (widget_data->realized_callback_added)
+   if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
      {
-        evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
-        widget_data->realized_callback_added = EINA_FALSE;
+        clockwise = EINA_TRUE;
+        widget_data->detent_count++;
      }
-
-   if (widget_data->bar_hide_timer)
+   else
      {
-         ecore_timer_del(widget_data->bar_hide_timer);
-         widget_data->bar_hide_timer = NULL;
+        clockwise = EINA_FALSE;
+        widget_data->detent_count--;
      }
 
-   item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
-   if (obj->disabled)
-     _eext_circle_object_item_color_set(item,
-                                        widget_data->disabled_bg_color.r,
-                                        widget_data->disabled_bg_color.g,
-                                        widget_data->disabled_bg_color.b,
-                                        widget_data->disabled_bg_color.a);
-   else
-     _eext_circle_object_item_color_set(item,
-                                        widget_data->bg_color.r,
-                                        widget_data->bg_color.g,
-                                        widget_data->bg_color.b,
-                                        widget_data->bg_color.a);
-
-   item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
-   if (obj->disabled)
-     _eext_circle_object_item_color_set(item,
-                                        widget_data->disabled_color.r,
-                                        widget_data->disabled_color.g,
-                                        widget_data->disabled_color.b,
-                                        widget_data->disabled_color.a);
-   else
-     _eext_circle_object_item_color_set(item,
-                                        widget_data->color.r,
-                                        widget_data->color.g,
-                                        widget_data->color.b,
-                                        widget_data->color.a);
+   _eext_circle_object_genlist_index_scroll_phase_update(widget_data);
 
-   if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO)
+   if ((widget_data->current_phase == 1) && widget_data->index_item_list &&
+       _eext_circle_object_genlist_index_selected_item_update(widget_data, clockwise))
      {
-        widget_data->bar_hide_timer = ecore_timer_add(hide_waiting_time,
-                                                      _eext_circle_object_genlist_scrollbar_policy_hide_cb,
-                                                      obj);
+        _eext_circle_object_genlist_index_show(circle_obj);
+        _eext_circle_object_genlist_index_selected_item_region_show(circle_obj);
+     }
+   else if (widget_data->current_phase == 1)
+     {
+        _eext_circle_object_genlist_index_hide(circle_obj);
+     }
+
+   if (widget_data->current_phase == 0)
+     {
+        widget_data->index_selected_item = NULL;
+        _eext_circle_object_genlist_region_show(circle_obj, clockwise);
      }
+
+   return EINA_TRUE;
 }
 
 static void
-_eext_circle_object_genlist_show_cb(void *data,
-                                    Evas *e,
-                                    Evas_Object *obj,
-                                    void *event_info)
+_eext_circle_object_genlist_items_index_clear_internal(Eext_Circle_Object *circle_obj)
 {
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Eext_Circle_Object_Genlist_Index_Item *index_item;
 
    EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
 
-   if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
-
-   _eext_circle_object_genlist_scrollbar_update(circle_obj);
-   _eext_circle_object_genlist_scrollbar_show(circle_obj,
-                                              VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
-   if (!widget_data->realized_callback_added)
+   if (widget_data->index_item_list)
      {
-        evas_object_smart_callback_add(circle_obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, circle_obj);
-        widget_data->realized_callback_added = EINA_TRUE;
+        EINA_LIST_FREE(widget_data->index_item_list, index_item)
+          {
+             eina_stringshare_del(index_item->letter);
+             index_item->letter = NULL;
+             free(index_item);
+          }
      }
+
+   widget_data->index_item_list = NULL;
+   widget_data->index_selected_item = NULL;
 }
 
 static void
-_eext_circle_object_genlist_scroll_cb(void *data,
-                                      Evas_Object *obj,
-                                      void *event_info)
+_update_color_info(Eext_Circle_Object *obj)
 {
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
-
-   if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
+   int r, g, b, a;
 
-   _eext_circle_object_genlist_scrollbar_update(circle_obj);
-   _eext_circle_object_genlist_scrollbar_show(circle_obj,
-                                              VERTICAL_BAR_HIDE_WAITTING_TIME);
+   if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object),
+                                    widget_data->scrollbar_color_class,
+                                    &r, &g, &b, &a,
+                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     {
+        r = SCROLL_BAR_COLOR_R;
+        g = SCROLL_BAR_COLOR_G;
+        b = SCROLL_BAR_COLOR_B;
+        a = SCROLL_BAR_COLOR_A;
+     }
+   widget_data->color.r = r;
+   widget_data->color.g = g;
+   widget_data->color.b = b;
+   widget_data->color.a = a;
+
+   if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object),
+                                    widget_data->scrollbar_bg_color_class,
+                                    &r, &g, &b, &a,
+                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     {
+        r = SCROLL_BAR_BG_COLOR_R;
+        g = SCROLL_BAR_BG_COLOR_G;
+        b = SCROLL_BAR_BG_COLOR_B;
+        a = SCROLL_BAR_BG_COLOR_A;
+     }
+   widget_data->bg_color.r = r;
+   widget_data->bg_color.g = g;
+   widget_data->bg_color.b = b;
+   widget_data->bg_color.a = a;
+
+   if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object),
+                                    widget_data->bezel_scrollbar_color_class,
+                                    &r, &g, &b, &a,
+                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     {
+        r = SCROLL_BAR_COLOR_R;
+        g = SCROLL_BAR_COLOR_G;
+        b = SCROLL_BAR_COLOR_B;
+        a = SCROLL_BAR_COLOR_A;
+     }
+   widget_data->bezel_color.r = r;
+   widget_data->bezel_color.g = g;
+   widget_data->bezel_color.b = b;
+   widget_data->bezel_color.a = a;
 }
 
 static void
-_scroll_cb(void *data EINA_UNUSED, const Efl_Event *ev)
+_eext_circle_object_genlist_bg_color_set(Eext_Circle_Object *circle_obj)
 {
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
    EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
-
-   if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
-
-   _eext_circle_object_genlist_scrollbar_update(circle_obj);
-   _eext_circle_object_genlist_scrollbar_show(circle_obj,
-                                              VERTICAL_BAR_HIDE_WAITTING_TIME);
+   int a;
+
+   edje_object_color_class_get(elm_layout_edje_get(circle_obj->widget_object),
+                               widget_data->scrollbar_bg_color_class,
+                               &widget_data->bg_color.r,
+                               &widget_data->bg_color.g,
+                               &widget_data->bg_color.b,
+                               &widget_data->bg_color.a,
+                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+
+   //ONEUI1.5(31July2019): Fix VI effect logic about hide
+   _eext_circle_object_item_color_get(widget_data->bg_item, NULL, NULL, NULL, &a);
+   if (!a)
+     {
+        _eext_circle_object_item_color_set(widget_data->bg_item,
+                                           widget_data->bg_color.r,
+                                           widget_data->bg_color.g,
+                                           widget_data->bg_color.b,
+                                           0);
+     }
+   else
+     {
+   //
+        _eext_circle_object_item_color_set(widget_data->bg_item,
+                                           widget_data->bg_color.r,
+                                           widget_data->bg_color.g,
+                                           widget_data->bg_color.b,
+                                           widget_data->bg_color.a);
+     }
 }
 
 static void
-_eext_circle_object_genlist_del_cb(Eext_Circle_Object *obj)
+_eext_circle_object_genlist_line_color_set(Eext_Circle_Object *circle_obj)
 {
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
-
-   evas_object_event_callback_del_full(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb, obj);
-   evas_object_smart_callback_del_full(obj->widget_object, "scroll", _eext_circle_object_genlist_scroll_cb, obj);
-
-   if (widget_data->realized_callback_added)
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+   int a;
+
+   edje_object_color_class_get(elm_layout_edje_get(circle_obj->widget_object),
+                               widget_data->scrollbar_color_class,
+                               &widget_data->color.r,
+                               &widget_data->color.g,
+                               &widget_data->color.b,
+                               &widget_data->color.a,
+                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+
+   //ONEUI1.5(31July2019): Fix VI effect logic about hide
+   _eext_circle_object_item_color_get(widget_data->item, NULL, NULL, NULL, &a);
+   if (!a)
      {
-        evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
-        widget_data->realized_callback_added = EINA_FALSE;
+        _eext_circle_object_item_color_set(widget_data->item,
+                                           widget_data->color.r,
+                                           widget_data->color.g,
+                                           widget_data->color.b,
+                                           0);
      }
-
-   if (widget_data->bar_hide_timer)
+   else
      {
-        ecore_timer_del(widget_data->bar_hide_timer);
-        widget_data->bar_hide_timer = NULL;
+   //
+        _eext_circle_object_item_color_set(widget_data->item,
+                                           widget_data->color.r,
+                                           widget_data->color.g,
+                                           widget_data->color.b,
+                                           widget_data->color.a);
      }
+}
 
-   free(obj->widget_data);
-   obj->widget_data = NULL;
+static void
+_eext_circle_object_genlist_change_color_signal_cb(void *data,
+                                                   Evas_Object *widget_obj,
+                                                   const char *emission,
+                                                   const char *source)
+{
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+   if (!source) return;
 
-   eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
+   //ONEUI1.5(04July2019): Support different color with bezel
+   if (widget_data->bezel_scrollbar_color_class && !strcmp(source, widget_data->bezel_scrollbar_color_class))
+     {
+        edje_object_color_class_get(elm_layout_edje_get(circle_obj->widget_object),
+                                    widget_data->bezel_scrollbar_color_class,
+                                    &widget_data->bezel_color.r,
+                                    &widget_data->bezel_color.g,
+                                    &widget_data->bezel_color.b,
+                                    &widget_data->bezel_color.a,
+                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+     }
+   //
+   else if (widget_data->scrollbar_bg_color_class && !strcmp(source, widget_data->scrollbar_bg_color_class))
+     _eext_circle_object_genlist_bg_color_set(circle_obj);
+   else if (widget_data->scrollbar_color_class && !strcmp(source, widget_data->scrollbar_color_class))
+     _eext_circle_object_genlist_line_color_set(circle_obj);
 }
 
 static void
-_eext_circle_object_genlist_disabled_cb(Eext_Circle_Object *obj)
+//ONEUI1.5(13Aug2019): Update circle scrollbar size on item processing
+//_eext_circle_object_genlist_scrollbar_update(Eext_Circle_Object *circle_obj)
+_eext_circle_object_genlist_scrollbar_update(Eext_Circle_Object *circle_obj, Eina_Bool anim)
+//
 {
-   Eext_Circle_Object_Item *item;
+   Evas_Coord ch = 0, py = 0, vh = 0; /* content h postion y, viewport h */
+   double ratio = 0.0;
+   double bar_pos_y;
+   double vertical_bar_angle_range = VERTICAL_BAR_ANGLE_RANGE;
+
+   if (!circle_obj) return;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   if (widget_data->handler && circle_obj->surface->is_mirrored)
+     bar_pos_y = VERTICAL_BAR_ANGLE_START + VERTICAL_BAR_ANGLE_MAX_SIZE;
+   else
+     bar_pos_y = VERTICAL_BAR_ANGLE_START;
+   elm_scroller_child_size_get(circle_obj->widget_object, NULL, &ch);
+   elm_scroller_region_get(circle_obj->widget_object, NULL, &py, NULL, &vh);
 
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, data) return;
+   if (ch < vh + elm_config_finger_size_get())
+     {
+        widget_data->bar_size_y = 0;
+        _eext_circle_object_item_color_set(widget_data->item, 0, 0, 0, 0);
+        _eext_circle_object_item_color_set(widget_data->bg_item, 0, 0, 0, 0);
+        return;
+     }
+   ratio = (double)ch / (double)vh;
 
-   if (obj->disabled)
+   if (ch > vh)
      {
-        item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->disabled_color.r,
-                                           data->disabled_color.g,
-                                           data->disabled_color.b,
-                                           data->disabled_color.a);
+        if (widget_data->handler)
+          {
+             widget_data->bar_size_y = VERTICAL_BAR_ANGLE_HANDLER_SIZE;
+          }
+        else
+          {
+             widget_data->bar_size_y = vertical_bar_angle_range / ratio;
 
-        item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->disabled_bg_color.r,
-                                           data->disabled_bg_color.g,
-                                           data->disabled_bg_color.b,
-                                           data->disabled_bg_color.a);
+             if (widget_data->bar_size_y > VERTICAL_BAR_ANGLE_MAX_SIZE)
+               widget_data->bar_size_y = VERTICAL_BAR_ANGLE_MAX_SIZE;
+             if (widget_data->bar_size_y < VERTICAL_BAR_ANGLE_MIN_SIZE)
+               widget_data->bar_size_y = VERTICAL_BAR_ANGLE_MIN_SIZE;
+          }
 
-        eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-        eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
+        if (widget_data->handler && circle_obj->surface->is_mirrored)
+          bar_pos_y -= ((VERTICAL_BAR_ANGLE_MAX_SIZE - widget_data->bar_size_y) * py / (ch - vh));
+        else
+          bar_pos_y += (VERTICAL_BAR_ANGLE_MAX_SIZE - widget_data->bar_size_y) * py / (ch - vh);
      }
-   else
+   if (widget_data->handler)
      {
-        item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->color.r,
-                                           data->color.g,
-                                           data->color.b,
-                                           data->color.a);
-
-        item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->bg_color.r,
-                                           data->bg_color.g,
-                                           data->bg_color.b,
-                                           data->bg_color.a);
-
-        eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-        eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj);
-     }
-}
-
-static void
-_eext_circle_object_genlist_init(Eext_Circle_Object *obj, Evas_Object *genlist)
-{
-   Eext_Circle_Object_Genlist_Data *data;
-   Eext_Circle_Object_Item *item;
-
-   obj->widget_type = EEXT_CIRCLE_OBJECT_GENLIST_TYPE;
-   obj->del_func = _eext_circle_object_genlist_del_cb;
-   obj->disabled_func = _eext_circle_object_genlist_disabled_cb;
-   obj->color_changed_func = _eext_circle_object_genlist_color_changed_cb;
-   obj->mirrored_state = EEXT_CIRCLE_MIRRORED_CONFIG;
-
-   data = (Eext_Circle_Object_Genlist_Data *)calloc(1, sizeof(Eext_Circle_Object_Genlist_Data));
-   data->policy_v = ELM_SCROLLER_POLICY_AUTO;
-   data->color.r = SCROLL_BAR_COLOR_R;
-   data->color.g = SCROLL_BAR_COLOR_G;
-   data->color.b = SCROLL_BAR_COLOR_B;
-   data->color.a = SCROLL_BAR_COLOR_A;
-   data->bg_color.r = SCROLL_BAR_BG_COLOR_R;
-   data->bg_color.g = SCROLL_BAR_BG_COLOR_G;
-   data->bg_color.b = SCROLL_BAR_BG_COLOR_B;
-   data->bg_color.a = SCROLL_BAR_BG_COLOR_A;
-   data->disabled_color.r = SCROLL_BAR_COLOR_DISABLED_R;
-   data->disabled_color.g = SCROLL_BAR_COLOR_DISABLED_G;
-   data->disabled_color.b = SCROLL_BAR_COLOR_DISABLED_B;
-   data->disabled_color.a = SCROLL_BAR_COLOR_DISABLED_A;
-   data->disabled_bg_color.r = SCROLL_BAR_BG_COLOR_DISABLED_R;
-   data->disabled_bg_color.g = SCROLL_BAR_BG_COLOR_DISABLED_G;
-   data->disabled_bg_color.b = SCROLL_BAR_BG_COLOR_DISABLED_B;
-   data->disabled_bg_color.a = SCROLL_BAR_BG_COLOR_DISABLED_A;
-   obj->widget_data = (void *)data;
-
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_name_set(item, GENLIST_BG_ITEM_NAME);
-   _eext_circle_object_item_color_set(item,
-                                      data->bg_color.r,
-                                      data->bg_color.g,
-                                      data->bg_color.b,
-                                      data->bg_color.a);
-   _eext_circle_object_item_line_width_set(item, VERTICAL_BAR_WIDTH_SIZE);
-   _eext_circle_object_item_radius_set(item, VERTICAL_BAR_RADIUS_SIZE);
-   _eext_circle_object_item_angle_set(item, VERTICAL_BAR_ANGLE_RANGE);
-   _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START);
-   _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
-   _eext_circle_object_item_append(obj, item);
-
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_name_set(item, GENLIST_ITEM_NAME);
-   _eext_circle_object_item_color_set(item,
-                                      data->color.r,
-                                      data->color.g,
-                                      data->color.b,
-                                      data->color.a);
-   _eext_circle_object_item_line_width_set(item, VERTICAL_BAR_WIDTH_SIZE);
-   _eext_circle_object_item_radius_set(item, VERTICAL_BAR_RADIUS_SIZE);
-   _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START);
-   _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
-   _eext_circle_object_item_append(obj, item);
-
-   if (efl_isa(obj->widget_object, EFL_UI_LEGACY_INTERFACE))
-     {
-        elm_scroller_policy_set(obj->widget_object, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
-        evas_object_event_callback_add(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb, obj);
-        evas_object_smart_callback_add(obj->widget_object, "scroll", _eext_circle_object_genlist_scroll_cb, obj);
+        Evas_Map *m = evas_map_new(4);
+        evas_map_util_points_populate_from_object(m, widget_data->handler_layout);
+        // layout is 90 degrees ahead so 90 needs to be subtracted here
+        if (widget_data->handler && circle_obj->surface->is_mirrored)
+          widget_data->handler_angle = bar_pos_y - 90 - VERTICAL_BAR_ANGLE_HANDLER_SIZE / 2;
+        else
+          widget_data->handler_angle = bar_pos_y - 90 + VERTICAL_BAR_ANGLE_HANDLER_SIZE / 2;
+        evas_map_util_rotate(m, widget_data->handler_angle, SURFACE_WIDTH / 2, SURFACE_WIDTH / 2);
+        evas_object_map_set(widget_data->handler_layout, m);
+        evas_object_map_enable_set(widget_data->handler_layout, EINA_TRUE);
+        evas_map_free(m);
+        evas_object_show(widget_data->handler_layout);
      }
+
+   //ONEUI1.5(13Aug2019): Update circle scrollbar size on item processing
+   if (anim)
+     _eext_circle_object_item_angle_transit_set(widget_data->item, 0.2,
+                                                widget_data->bar_size_y, bar_pos_y, EINA_TRUE,
+                                                0.0, 0.0, 1.0, 1.0);
    else
      {
-        efl_ui_scrollbar_bar_mode_set(obj->widget_object, EFL_UI_SCROLLBAR_MODE_OFF, EFL_UI_SCROLLBAR_MODE_OFF);
-        efl_event_callback_add(genlist, EFL_UI_EVENT_SCROLL_CHANGED, _scroll_cb, obj);
+       _eext_circle_object_item_angle_set(widget_data->item, widget_data->bar_size_y);
+       _eext_circle_object_item_angle_offset_set(widget_data->item, bar_pos_y);
      }
-
-   eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-   eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj);
+   //
 }
 
-EAPI Evas_Object *
-eext_circle_object_genlist_add(Evas_Object *genlist, Eext_Circle_Surface *surface)
+static void
+_eext_circle_object_genlist_color_changed_cb(Eext_Circle_Object *circle_obj,
+                                             const char *item_name)
 {
-   Evas_Object *obj;
+   Eext_Circle_Object_Item *item = NULL;
+   int r = 0, g = 0, b = 0, a = 0;
 
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+   if (!item) return;
+
+   _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
+
+   if (!strcmp(item_name, GENLIST_ITEM_NAME))
+     {
+        widget_data->color.r = r;
+        widget_data->color.g = g;
+        widget_data->color.b = b;
+        widget_data->color.a = a;
+
+        return;
+     }
+
+   if (!strcmp(item_name, GENLIST_BG_ITEM_NAME))
+     {
+        widget_data->bg_color.r = r;
+        widget_data->bg_color.g = g;
+        widget_data->bg_color.b = b;
+        widget_data->bg_color.a = a;
+
+        return;
+     }
+}
+
+static Eina_Bool
+_eext_circle_object_genlist_scrollbar_policy_hide_cb(void *data)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return ECORE_CALLBACK_CANCEL;
+
+   if (widget_data->handler)
+     {
+        elm_layout_signal_emit(widget_data->handler_layout, "elm,state,handler,hidden", "elm");
+     }
+   else if (!widget_data->scrollbar_initializing)
+     {
+        if (widget_data->bar_size_y > 0.0)
+        {
+          //ONEUI1.5(31July2019): Fix VI effect logic about hide
+          if (widget_data->bezel_on)
+            {
+               _eext_circle_object_item_color_transit_set(widget_data->item, VERTICAL_BAR_TRANSIT_TIME,
+                                                          widget_data->bezel_color.r,
+                                                          widget_data->bezel_color.g,
+                                                          widget_data->bezel_color.b,
+                                                          0,
+                                                          EINA_TRUE,
+                                                          0.0, 0.0, 1.0, 1.0);
+            }
+          else
+            {
+               _eext_circle_object_item_color_transit_set(widget_data->item, VERTICAL_BAR_TRANSIT_TIME,
+                                                          widget_data->color.r,
+                                                          widget_data->color.g,
+                                                          widget_data->color.b,
+                                                          0,
+                                                          EINA_TRUE,
+                                                          0.0, 0.0, 1.0, 1.0);
+            }
+          _eext_circle_object_item_color_transit_set(widget_data->bg_item, VERTICAL_BAR_TRANSIT_TIME,
+                                                          widget_data->bg_color.r,
+                                                          widget_data->bg_color.g,
+                                                          widget_data->bg_color.b,
+                                                          0,
+                                                          EINA_TRUE,
+                                                          0.0, 0.0, 1.0, 1.0);
+          //
+        }
+     }
+
+   if (widget_data->bar_hide_timer)
+     {
+         ecore_timer_del(widget_data->bar_hide_timer);
+         widget_data->bar_hide_timer = NULL;
+     }
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_eext_circle_object_genlist_scrollbar_showing(Eext_Circle_Object *circle_obj,
+                                              double hide_waiting_time)
+{
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   if (widget_data->bar_size_y <= 0) return;
+   widget_data->scrollbar_shown = EINA_TRUE;
+
+   if (widget_data->handler)
+     {
+        elm_layout_signal_emit(widget_data->handler_layout, "elm,state,handler,visible", "elm");
+     }
+   else
+     {
+        //ONEUI1.5(04July2019): Support different color with bezel
+        if (widget_data->bezel_on)
+          {
+             _eext_circle_object_item_color_transit_set(widget_data->item, SCROLL_BAR_TRANSIT_TIME,
+                                                        widget_data->bezel_color.r,
+                                                        widget_data->bezel_color.g,
+                                                        widget_data->bezel_color.b,
+                                                        widget_data->bezel_color.a,
+                                                        EINA_TRUE,
+                                                        0.0, 0.0, 1.0, 1.0);
+          }
+        else
+          {
+             _eext_circle_object_item_color_transit_set(widget_data->item, SCROLL_BAR_TRANSIT_TIME,
+                                                        widget_data->color.r,
+                                                        widget_data->color.g,
+                                                        widget_data->color.b,
+                                                        widget_data->color.a,
+                                                        EINA_TRUE,
+                                                        0.0, 0.0, 1.0, 1.0);
+          }
+        /*
+        _eext_circle_object_item_color_set(widget_data->item,
+                                           widget_data->color.r,
+                                           widget_data->color.g,
+                                           widget_data->color.b,
+                                           widget_data->color.a);
+        */
+        //
+        _eext_circle_object_item_color_set(widget_data->bg_item,
+                                           widget_data->bg_color.r,
+                                           widget_data->bg_color.g,
+                                           widget_data->bg_color.b,
+                                           widget_data->bg_color.a);
+     }
+
+   if (widget_data->bar_hide_timer)
+     {
+         ecore_timer_del(widget_data->bar_hide_timer);
+         widget_data->bar_hide_timer = NULL;
+     }
+
+   if (!widget_data->handler_drag && widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO)
+     {
+        widget_data->bar_hide_timer = ecore_timer_add(hide_waiting_time,
+                                                      _eext_circle_object_genlist_scrollbar_policy_hide_cb,
+                                                      circle_obj);
+     }
+}
+
+static Eina_Bool
+_eext_circle_object_genlist_scrollbar_first_show_cb(void *data)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Evas_Coord x = 0, y = 0, w = 0, h = 0;
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return EINA_FALSE;
+
+   if (widget_data->bar_first_show_timer)
+     {
+        ecore_timer_del(widget_data->bar_first_show_timer);
+        widget_data->bar_first_show_timer = NULL;
+     }
+
+   //ONEUI1.5(13Aug2019): Update circle scrollbar size on item processing
+   _eext_circle_object_genlist_scrollbar_update(circle_obj, EINA_FALSE);
+   //
+   _eext_circle_object_genlist_scrollbar_showing(circle_obj, VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+
+   if (!elm_object_scroll_item_align_enabled_get(circle_obj->widget_object))
+     {
+        elm_scroller_region_get(circle_obj->widget_object, &x, &y, &w, &h);
+        widget_data->dest_y = y;
+     }
+
+   widget_data->scrollbar_first_shown = EINA_TRUE;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_eext_circle_object_genlist_change_flag_cb(void *data)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return EINA_FALSE;
+
+   widget_data->scrollbar_initializing = EINA_FALSE;
+
+   if (widget_data->change_flag_timer)
+     {
+        ecore_timer_del(widget_data->change_flag_timer);
+        widget_data->change_flag_timer = NULL;
+     }
+
+   if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO)
+     {
+        if (widget_data->bar_hide_timer)
+          {
+           ecore_timer_del(widget_data->bar_hide_timer);
+           widget_data->bar_hide_timer = NULL;
+          }
+
+        widget_data->bar_hide_timer = ecore_timer_add(0.5,
+                                                      _eext_circle_object_genlist_scrollbar_policy_hide_cb,
+                                                      circle_obj);
+     }
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_eext_circle_object_genlist_scrollbar_show(Eext_Circle_Object *circle_obj)
+{
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   if (!widget_data->scrollbar_first_shown)
+     {
+        widget_data->scrollbar_initializing = EINA_TRUE;
+        widget_data->scrollbar_first_shown = EINA_FALSE;
+
+        if (!widget_data->change_flag_timer)
+          widget_data->change_flag_timer = ecore_timer_add(1.5, _eext_circle_object_genlist_change_flag_cb, circle_obj);
+        if (!widget_data->bar_first_show_timer)
+          widget_data->bar_first_show_timer = ecore_timer_add(0.5, _eext_circle_object_genlist_scrollbar_first_show_cb, circle_obj);
+     }
+   else
+     {
+        //ONEUI1.5(13Aug2019): Update circle scrollbar size on item processing
+        _eext_circle_object_genlist_scrollbar_update(circle_obj, EINA_FALSE);
+        //
+        _eext_circle_object_genlist_scrollbar_showing(circle_obj, VERTICAL_BAR_HIDE_WAITTING_TIME);
+     }
+}
+
+void
+_eext_circle_object_genlist_init_scroller_info(Eext_Circle_Object *circle_obj)
+{
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   if (widget_data->bar_first_show_timer)
+     {
+        ecore_timer_del(widget_data->bar_first_show_timer);
+        widget_data->bar_first_show_timer = NULL;
+     }
+   if (widget_data->change_flag_timer)
+     {
+        ecore_timer_del(widget_data->change_flag_timer);
+        widget_data->change_flag_timer = NULL;
+     }
+   if (widget_data->bar_hide_timer)
+     {
+        ecore_timer_del(widget_data->bar_hide_timer);
+        widget_data->bar_hide_timer = NULL;
+     }
+   widget_data->scrollbar_initializing = EINA_FALSE;
+
+   _eext_circle_object_item_color_set(widget_data->item, 0, 0, 0, 0);
+   _eext_circle_object_item_color_set(widget_data->bg_item, 0, 0, 0, 0);
+}
+
+//ONEUI1.5(18FEB2019): Genlist resume/pause signal for scrollbar show
+static void
+_eext_circle_object_genlist_resume_cb(void *data,
+                                         Evas_Object *obj,
+                                         void *event_info)
+{
+//
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   if (widget_data->scrollbar_initializing) return;
+   if (widget_data->scrollbar_first_shown) return;
+   widget_data->scrollbar_shown = EINA_FALSE;
+
+   _eext_circle_object_genlist_init_scroller_info(circle_obj);
+
+   if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
+
+   _eext_circle_object_genlist_scrollbar_show(circle_obj);
+}
+
+//ONEUI1.5(18FEB2019): Genlist resume/pause signal for scrollbar show
+static void
+_eext_circle_object_genlist_pause_cb(void *data,
+                                         Evas_Object *obj,
+                                         void *event_info)
+{
+//
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+   widget_data->scrollbar_first_shown = EINA_FALSE;
+
+   _eext_circle_object_genlist_init_scroller_info(circle_obj);
+}
+
+static void
+_eext_circle_object_genlist_scroll_cb(void *data,
+                                      Evas_Object *obj,
+                                      void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
+
+   if (widget_data->scrollbar_first_shown)
+     _eext_circle_object_genlist_scrollbar_show(circle_obj);
+   //ONEUI1.5(19Jun2019): Enable sw/hw bezel
+   if (!eext_rotary_event_is_enabled())
+     {
+        if (widget_data->index_shown_anim)
+          _eext_circle_object_genlist_index_show(circle_obj);
+     }
+}
+
+static void
+_eext_circle_object_genlist_scroll_anim_stop_cb(void *data,
+                                                Evas_Object *obj,
+                                                void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Evas_Coord x = 0, y = 0, w = 0, h = 0;
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+   //ONEUI1.5(19Jun2019): Enable sw/hw bezel
+   if (!eext_rotary_event_is_enabled())
+     {
+        if (widget_data->index_shown_anim)
+          widget_data->index_shown_anim = EINA_FALSE;
+     }
+   if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
+
+   if (!elm_object_scroll_item_align_enabled_get(circle_obj->widget_object))
+     {
+        elm_scroller_region_get(circle_obj->widget_object, &x, &y, &w, &h);
+        widget_data->dest_y = y;
+     }
+}
+
+static void
+_eext_circle_object_genlist_loaded_cb(void *data,
+                                      Evas_Object *widget_obj,
+                                      void *event_info)
+{
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF)
+     {
+        if (widget_data->bar_hide_timer)
+          {
+             ecore_timer_del(widget_data->bar_hide_timer);
+             widget_data->bar_hide_timer = NULL;
+          }
+        _eext_circle_object_genlist_scrollbar_policy_hide_cb(circle_obj);
+     }
+   else if (widget_data->policy_v == ELM_SCROLLER_POLICY_ON)
+     {
+        //ONEUI1.5(13Aug2019): Update circle scrollbar size on item processing
+        _eext_circle_object_genlist_scrollbar_update(circle_obj, EINA_TRUE);
+        //
+        _eext_circle_object_genlist_scrollbar_show(circle_obj);
+     }
+   //ONEUI1.5(13Aug2019): Update circle scrollbar size on item processing
+   else if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO && widget_data->bar_hide_timer)
+     _eext_circle_object_genlist_scrollbar_update(circle_obj, EINA_TRUE);
+   else
+     _eext_circle_object_genlist_scrollbar_update(circle_obj, EINA_FALSE);
+   //
+}
+
+static void
+_eext_circle_object_genlist_item_deleted_cb(void *data,
+                                            Evas_Object *widget_obj,
+                                            void *event_info)
+{
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   Elm_Object_Item* deleted_item = (Elm_Object_Item*)event_info;
+
+   if(widget_data->current_item == deleted_item)
+     {
+        widget_data->current_item = NULL;
+     }
+
+   if(widget_data->aligned_item == deleted_item)
+     {
+        widget_data->aligned_item = NULL;
+     }
+}
+
+static Eina_Bool
+_circle_path_check(Eext_Circle_Object *circle_obj, Evas_Coord x, Evas_Coord y, double handler_angle)
+{
+   Evas_Coord r, c;
+   double angle;
+   evas_object_geometry_get(circle_obj->widget_object, NULL, NULL, &r, NULL);
+   c = r / 2;
+
+   if (circle_obj->surface->is_mirrored)
+     angle = -(atan2((double)(y - c), (double)(c - x)));
+   else
+     angle = atan2((double)(y - c), (double)(x - c));
+   angle *= 180 / M_PI; // convert from radians to degrees
+
+   if (fabs(handler_angle - angle) > VERTICAL_BAR_ANGLE_HANDLER_SIZE) return EINA_FALSE;
+   r /= 2;
+   r -= 2 * HANDLER_BAR_WIDTH_SIZE;
+   if (((circle_obj->surface->is_mirrored && x < c) ||
+        (!circle_obj->surface->is_mirrored && x > c)) &&
+       ((pow (x - c, 2) + pow(y - c, 2) >= pow(r, 2))))
+      return EINA_TRUE;
+   else return EINA_FALSE;
+}
+
+static void
+_handler_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   Eext_Circle_Object_Genlist_Data *widget_data = (Eext_Circle_Object_Genlist_Data *) data;
+   widget_data->scrollbar_shown = EINA_FALSE;
+}
+
+static void
+_eext_circle_object_genlist_handler_drag_start_cb(void *data,
+                                                  Evas *evas,
+                                                  Evas_Object *widget_obj,
+                                                  void *event_info)
+{
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+   EEXT_CIRCLE_OBJECT_GENLIST_SCROLL_IFACE_DATA_GET(circle_obj->widget_object, sid);
+   Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down*) event_info;
+   if (!widget_data->handler) return;
+   if (!widget_data->scrollbar_shown) return;
+   if (!_circle_path_check(circle_obj, ev->canvas.x, ev->canvas.y, widget_data->handler_angle)) return;
+
+   if (widget_data->bar_hide_timer)
+     {
+        ecore_timer_del(widget_data->bar_hide_timer);
+        widget_data->bar_hide_timer = NULL;
+     }
+
+   widget_data->handler_drag = EINA_TRUE;
+/*   if (elm_object_scroll_item_align_enabled_get(circle_obj->widget_object))
+     sid->is_unset_cb_called = EINA_FALSE;*/
+   elm_object_scroll_freeze_push(circle_obj->widget_object);
+}
+
+static void
+_eext_circle_object_genlist_handler_drag_end_cb(void *data,
+                                                Evas *evas,
+                                                Evas_Object *widget_obj,
+                                                void *event_info)
+{
+   Evas_Coord px, py, vw, vh, yy = 0;
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   if (!widget_data->handler_drag) return;
+   elm_object_scroll_freeze_pop(circle_obj->widget_object);
+   widget_data->handler_drag = EINA_FALSE;
+
+   if (elm_object_scroll_item_align_enabled_get(circle_obj->widget_object))
+     {
+        EEXT_CIRCLE_OBJECT_GENLIST_SCROLL_IFACE_DATA_GET(circle_obj->widget_object, sid);
+        elm_scroller_region_get(circle_obj->widget_object, &px, &py, &vw, &vh);
+        elm_pan_pos_adjust(sid->pan_obj, NULL, &yy);
+        elm_scroller_region_bring_in(circle_obj->widget_object, px, py - yy, vw, vh);
+     }
+
+   if (widget_data->bar_hide_timer)
+     {
+        ecore_timer_del(widget_data->bar_hide_timer);
+        widget_data->bar_hide_timer = NULL;
+     }
+   widget_data->bar_hide_timer = ecore_timer_add(VERTICAL_BAR_HIDE_WAITTING_TIME,
+                                                 _eext_circle_object_genlist_scrollbar_policy_hide_cb,
+                                                 circle_obj);
+   _eext_circle_object_genlist_index_hide(circle_obj);
+}
+
+static void
+_eext_circle_object_genlist_drag_cb(void *data,
+                                            Evas *evas,
+                                            Evas_Object *widget_obj,
+                                            void *event_info)
+{
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+   Evas_Coord region;
+   Evas_Event_Mouse_Move *ev = event_info;
+   Evas_Coord ch, px, py, vw, vh;
+   Evas_Coord x, y;
+   double angle;
+
+   x = ev->cur.canvas.x;
+   y = ev->cur.canvas.y;
+
+   //ONEUI1.5(04July2019): Support different color with bezel
+   if (__elm_product_theme_is_loaded())
+     widget_data->bezel_on = EINA_FALSE;
+   //
+   if (!widget_data->handler_drag) return;
+
+   elm_scroller_child_size_get(circle_obj->widget_object, NULL, &ch);
+   elm_scroller_region_get(circle_obj->widget_object, &px, &py, &vw, &vh);
+
+   Evas_Coord c = vw / 2;
+   if (circle_obj->surface->is_mirrored)
+     angle = atan((double)(c - y) / (double)(c - x));
+   else
+     angle = atan((double)(c - y) / (double)(x - c));
+   double ratio = ((M_PI / 6.0) - angle) / (M_PI / 3.0);
+
+   ratio = ratio > 1.0 ? 1.0 : ratio;
+   ratio = ratio < 0.0 ? 0.0 : ratio;
+
+   if ((!circle_obj->surface->is_mirrored && x < c) ||
+       (circle_obj->surface->is_mirrored && x > c))
+      ratio = 1.0 - ratio;
+
+   region = (int) (ch * ratio);
+   elm_scroller_region_show(circle_obj->widget_object, px, region, vw, vh);
+}
+
+//ONEUI1.5(06MAR2019): Genlist scrollbar init on genlist show/hide
+static void
+_eext_circle_object_genlist_show_cb(void *data,
+                                            Evas *evas,
+                                            Evas_Object *widget_obj,
+                                            void *event_info)
+{
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   _eext_circle_object_genlist_resume_cb(circle_obj, widget_obj, NULL);
+}
+
+static void
+_eext_circle_object_genlist_hide_cb(void *data,
+                                            Evas *evas,
+                                            Evas_Object *widget_obj,
+                                            void *event_info)
+{
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   _eext_circle_object_genlist_pause_cb(circle_obj, widget_obj, NULL);
+}
+//
+
+static Eina_Bool
+_eext_circle_object_genlist_index_next(Eext_Circle_Object *circle_obj)
+{
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return EINA_FALSE;
+
+   if(widget_data->index_item_list &&
+      _eext_circle_object_genlist_index_selected_item_update(widget_data, EINA_TRUE))
+     {
+        _eext_circle_object_genlist_index_show(circle_obj);
+        _eext_circle_object_genlist_index_selected_item_region_show(circle_obj);
+        return EINA_TRUE;
+     }
+   else if (widget_data->index_item_list)
+     {
+        _eext_circle_object_genlist_index_hide(circle_obj);
+        _remove_gesture_layer(circle_obj);
+        return EINA_FALSE;
+     }
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_eext_circle_object_genlist_index_prev(Eext_Circle_Object *circle_obj)
+{
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return EINA_FALSE;
+
+   if(widget_data->index_item_list &&
+      _eext_circle_object_genlist_index_selected_item_update(widget_data, EINA_FALSE))
+     {
+        _eext_circle_object_genlist_index_show(circle_obj);
+        _eext_circle_object_genlist_index_selected_item_region_show(circle_obj);
+        return EINA_TRUE;
+     }
+   else if (widget_data->index_item_list)
+    {
+       _eext_circle_object_genlist_index_hide(circle_obj);
+       _remove_gesture_layer(circle_obj);
+       return EINA_FALSE;
+    }
+   return EINA_FALSE;
+}
+
+static void
+_eext_circle_object_genlist_index_update_cb(void *data,
+                                            Evas_Object *widget_obj,
+                                            void *event_info)
+{
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled()
+            && eext_rotary_event_type_get() != EEXT_ROTARY_EVENT_TYPE_HW_BEZEL) return;
+   Eext_Circle_Object *circle_obj = data;
+   Elm_Object_Item *it = (Elm_Object_Item *)event_info;
+   Eext_Circle_Object_Genlist_Index_Item *index_item;
+   Eina_List *l;
+
+   if (!it) return;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+   if (!widget_data->index_item_list) return;
+
+   EINA_LIST_FOREACH(widget_data->index_item_list, l, index_item)
+     if (index_item->item == it)
+       widget_data->index_selected_item = index_item;
+}
+
+static void
+_remove_gesture_layer(Eext_Circle_Object *circle_obj)
+{
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+   elm_gesture_layer_cb_del(widget_data->g_layer, ELM_GESTURE_N_LINES,
+                            ELM_GESTURE_STATE_END, _index_layout_lines_end, circle_obj);
+   elm_gesture_layer_cb_del(widget_data->g_layer, ELM_GESTURE_N_TAPS,
+                            ELM_GESTURE_STATE_END, _index_layout_tap_end, circle_obj);
+   evas_object_repeat_events_set(widget_data->g_rect, EINA_TRUE);
+   widget_data->index_shown_anim = EINA_FALSE;
+}
+
+static Evas_Event_Flags
+_index_layout_lines_end(void *data, void *event_info)
+{
+   Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
+   Eext_Circle_Object *circle_obj = data;
+   if ((p->momentum.y2 - p->momentum.y1) >=0)
+      _eext_circle_object_genlist_index_prev(circle_obj);
+   else
+     _eext_circle_object_genlist_index_next(circle_obj);
+   return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static Evas_Event_Flags
+_index_layout_tap_end(void *data, void *event_info)
+{
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return EVAS_EVENT_FLAG_NONE;
+   _eext_circle_object_genlist_index_hide(circle_obj);
+   elm_gesture_layer_cb_del(widget_data->g_layer, ELM_GESTURE_N_LINES,
+                            ELM_GESTURE_STATE_END, _index_layout_lines_end, circle_obj);
+   elm_gesture_layer_cb_del(widget_data->g_layer, ELM_GESTURE_N_TAPS,
+                            ELM_GESTURE_STATE_END, _index_layout_tap_end, circle_obj);
+   evas_object_repeat_events_set(widget_data->g_rect, EINA_TRUE);
+   widget_data->index_shown_anim = EINA_FALSE;
+   return EVAS_EVENT_FLAG_ON_HOLD;
+}
+
+static void
+_eext_circle_object_genlist_index_show_cb(void *data,
+                                            Evas_Object *widget_obj,
+                                            void *event_info)
+{
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled()
+            && eext_rotary_event_type_get() != EEXT_ROTARY_EVENT_TYPE_HW_BEZEL) return;
+   Eext_Circle_Object *circle_obj = data;
+   Eina_Bool dir = (int)event_info;
+   Eina_Bool ret = EINA_FALSE;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+   if (dir)
+     ret = _eext_circle_object_genlist_index_prev(circle_obj);
+   else
+     ret = _eext_circle_object_genlist_index_next(circle_obj);
+   if (!ret) return;
+   widget_data->index_shown_anim = EINA_TRUE;
+   elm_gesture_layer_cb_set(widget_data->g_layer, ELM_GESTURE_N_LINES,
+                            ELM_GESTURE_STATE_END, _index_layout_lines_end, circle_obj);
+   elm_gesture_layer_cb_set(widget_data->g_layer, ELM_GESTURE_N_TAPS,
+                            ELM_GESTURE_STATE_END, _index_layout_tap_end, circle_obj);
+   evas_object_repeat_events_set(widget_data->g_rect, EINA_FALSE);
+}
+
+static void
+_on_obj_resize(void * data,
+           Evas *e EINA_UNUSED,
+           Evas_Object *obj,
+           void *event_info EINA_UNUSED)
+{
+   Eext_Circle_Object_Genlist_Data *widget_data = data;
+   Evas_Coord w, h;
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+   evas_object_resize(widget_data->g_rect, w, h);
+}
+
+static void
+_eext_circle_object_genlist_aligned_item_cb(void *data,
+                                            Evas_Object *widget_obj,
+                                            void *event_info)
+{
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   widget_data->aligned_item = (Elm_Object_Item*)event_info;
+   widget_data->current_item = (Elm_Object_Item*)event_info;
+   widget_data->detent_count = 0;
+}
+
+//ONEUI1.5(03JUN2019): Update circle genlist on theme change
+static void
+_eext_circle_object_genlist_theme_changed_cb(void *data,
+                                             Evas_Object *widget_obj,
+                                             void *event_info)
+{
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+   Evas_Object *genlist = circle_obj->widget_object;
+   const char *style = elm_object_style_get(genlist);
+   if (style && !strcmp(style, HANDLER_STYLE))
+     widget_data->handler = EINA_TRUE;
+   else
+     {
+        widget_data->handler = EINA_FALSE;
+        evas_object_smart_member_del(widget_data->handler_layout);
+        evas_object_del(widget_data->handler_layout);
+        widget_data->handler_layout = NULL;
+        evas_object_event_callback_del(genlist, EVAS_CALLBACK_MOUSE_DOWN, _eext_circle_object_genlist_handler_drag_start_cb);
+        evas_object_event_callback_del(genlist, EVAS_CALLBACK_MOUSE_UP, _eext_circle_object_genlist_handler_drag_end_cb);
+     }
+
+   if (widget_data->handler && !widget_data->handler_layout)
+     {
+        widget_data->handler_layout = elm_layout_add(genlist);
+        elm_layout_theme_set(widget_data->handler_layout, "scroller", "base", "prod/handler/indicator");
+        evas_object_resize(widget_data->handler_layout, SURFACE_WIDTH, SURFACE_WIDTH);
+        evas_object_show(widget_data->handler_layout);
+        evas_object_smart_member_add(widget_data->handler_layout, genlist);
+        elm_layout_signal_callback_add(widget_data->handler_layout, "elm,state,hide,finished", "elm", _handler_hide_cb, widget_data);
+        evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_DOWN, _eext_circle_object_genlist_handler_drag_start_cb, circle_obj);
+        evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_UP, _eext_circle_object_genlist_handler_drag_end_cb, circle_obj);
+     }
+}
+//
+
+static void
+_eext_circle_object_genlist_bring_in_item_adjusted_cb(void *data,
+                                                      Evas_Object *widget_obj,
+                                                      void *event_info)
+{
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   widget_data->current_item = (Elm_Object_Item*)event_info;
+}
+
+static Eina_Bool
+_index_gesture_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj)
+{
+   Eext_Circle_Object *circle_obj = data;
+   LOGI("Gesture_type = %d x_beg = %d, x_end=%d y_beg=%d y_end=%d",gesture_info.type,
+       gesture_info.x_beg, gesture_info.x_end, gesture_info.y_beg, gesture_info.y_end);
+   if (gesture_info.type != ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_UP &&
+       gesture_info.type != ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_DOWN)
+     return EINA_FALSE;
+   if (gesture_info.type == ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_UP)
+     {
+        _eext_circle_object_genlist_index_next(circle_obj);
+     }
+   else
+     {
+        _eext_circle_object_genlist_index_prev(circle_obj);
+     }
+   return EINA_TRUE;
+}
+
+//ONEUI1.5(20181009):Register access object when screen-reader is dynamically switched on
+static void
+_eext_circle_object_genlist_screen_reader_changed(void *data, Evas_Object *obj, void *event_info)
+{
+    Eext_Circle_Object *circle_obj = data;
+    EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+    if (!widget_data->index_layout) return;
+    if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+      {
+         Evas_Object *text_object = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(widget_data->index_layout), "elm.text");
+         widget_data->access_object = elm_access_object_register(text_object, circle_obj->widget_object);
+         elm_atspi_accessible_role_set(widget_data->access_object, ELM_ATSPI_ROLE_RADIO_MENU_ITEM);
+         elm_atspi_accessible_reading_info_type_set(widget_data->access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME|
+                                                                                ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+         //ONEUI1.5(19Jun2019): Enable sw/hw bezel
+         if (!eext_rotary_event_is_enabled())
+           elm_atspi_accessible_gesture_cb_set(widget_data->access_object, _index_gesture_cb, circle_obj);
+      }
+    else
+      {
+        if (widget_data->access_object)
+          {
+             elm_access_object_unregister(widget_data->access_object);
+             widget_data->access_object = NULL;
+          }
+      }
+}
+//
+
+static void
+_eext_circle_object_genlist_del_cb(Eext_Circle_Object *circle_obj)
+{
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+   Eext_Circle_Object_Genlist_Rotary_Time *rotary_time;
+
+   //ONEUI1.5(18FEB2019): Genlist resume/pause signal for scrollbar show
+   evas_object_smart_callback_del_full(circle_obj->widget_object, SIG_GENLIST_RESUME, _eext_circle_object_genlist_resume_cb, circle_obj);
+   evas_object_smart_callback_del_full(circle_obj->main_obj, SIG_GENLIST_RESUME, _eext_circle_object_genlist_resume_cb, circle_obj);
+   evas_object_smart_callback_del_full(circle_obj->widget_object, SIG_GENLIST_PAUSE, _eext_circle_object_genlist_pause_cb, circle_obj);
+   evas_object_smart_callback_del_full(circle_obj->main_obj, SIG_GENLIST_PAUSE, _eext_circle_object_genlist_pause_cb, circle_obj);
+   //
+   evas_object_smart_callback_del_full(circle_obj->widget_object, SIGNAL_SCROLL, _eext_circle_object_genlist_scroll_cb, circle_obj);
+   evas_object_smart_callback_del_full(circle_obj->widget_object, SIGNAL_SCROLL_ANIM_STOP, _eext_circle_object_genlist_scroll_anim_stop_cb, circle_obj);
+   evas_object_smart_callback_del_full(circle_obj->widget_object, SIGNAL_LOADED, _eext_circle_object_genlist_loaded_cb, circle_obj);
+   evas_object_smart_callback_del_full(circle_obj->widget_object, SIGNAL_ITEM_DELETED, _eext_circle_object_genlist_item_deleted_cb, circle_obj);
+   evas_object_smart_callback_del_full(circle_obj->widget_object, SIG_BRING_IN_ITEM_ADJUSTED, _eext_circle_object_genlist_bring_in_item_adjusted_cb, circle_obj);
+   evas_object_smart_callback_del_full(circle_obj->widget_object, SIG_ALIGNED_ITEM_DETECTED, _eext_circle_object_genlist_aligned_item_cb, circle_obj);
+   //ONEUI1.5(20181009):Register access object when screen-reader is dynamically switched on
+   evas_object_smart_callback_del(circle_obj->widget_object, "atspi,screen,reader,changed", _eext_circle_object_genlist_screen_reader_changed);
+   //
+   //ONEUI1.5(03JUN2019): Update circle genlist on theme change
+   evas_object_smart_callback_del_full(circle_obj->widget_object, SIG_THEME_CHANGED, _eext_circle_object_genlist_theme_changed_cb, circle_obj);
+   //
+   //ONEUI1.5(06MAR2019): Genlist scrollbar init on genlist show/hide
+   evas_object_event_callback_del(circle_obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb);
+   evas_object_event_callback_del(circle_obj->widget_object, EVAS_CALLBACK_HIDE, _eext_circle_object_genlist_hide_cb);
+   //
+   if (widget_data->handler)
+     {
+        evas_object_event_callback_del(circle_obj->widget_object, EVAS_CALLBACK_MOUSE_DOWN, _eext_circle_object_genlist_handler_drag_start_cb);
+        evas_object_event_callback_del(circle_obj->widget_object, EVAS_CALLBACK_MOUSE_UP, _eext_circle_object_genlist_handler_drag_end_cb);
+     }
+   //ONEUI1.5(04July2019): Support different color with bezel
+   evas_object_event_callback_del(circle_obj->widget_object, EVAS_CALLBACK_MOUSE_MOVE, _eext_circle_object_genlist_drag_cb);
+   //
+   //ONEUI1.5(19Jun2019): Enable sw/hw bezel
+   if (!eext_rotary_event_is_enabled())
+     {
+        if (__elm_product_theme_is_loaded())
+          {
+             evas_object_smart_callback_del_full(circle_obj->widget_object, SIG_REALIZED, _eext_circle_object_genlist_index_update_cb, circle_obj);
+             evas_object_smart_callback_del_full(circle_obj->widget_object, SIG_INDEX_SHOW, _eext_circle_object_genlist_index_show_cb, circle_obj);
+          }
+     }
+
+   edje_object_signal_callback_del(elm_layout_edje_get(circle_obj->widget_object), "color_class,set", widget_data->scrollbar_color_class, _eext_circle_object_genlist_change_color_signal_cb);
+   edje_object_signal_callback_del(elm_layout_edje_get(circle_obj->widget_object), "color_class,set", widget_data->scrollbar_bg_color_class, _eext_circle_object_genlist_change_color_signal_cb);
+   if (widget_data->scrollbar_color_class) eina_stringshare_del(widget_data->scrollbar_color_class);
+   if (widget_data->scrollbar_bg_color_class) eina_stringshare_del(widget_data->scrollbar_bg_color_class);
+
+   //ONEUI1.5(04July2019): Support different color with bezel
+   edje_object_signal_callback_del(elm_layout_edje_get(circle_obj->widget_object), "color_class,set",
+                                                       widget_data->bezel_scrollbar_color_class,
+                                                       _eext_circle_object_genlist_change_color_signal_cb);
+   if (widget_data->bezel_scrollbar_color_class) eina_stringshare_del(widget_data->bezel_scrollbar_color_class);
+   //
+
+   if (widget_data->bar_hide_timer)
+     {
+        ecore_timer_del(widget_data->bar_hide_timer);
+        widget_data->bar_hide_timer = NULL;
+     }
+   if (widget_data->index_layout)
+     {
+        evas_object_del(widget_data->index_layout);
+        widget_data->index_layout = NULL;
+     }
+   if (widget_data->index_hide_timer)
+     {
+        ecore_timer_del(widget_data->index_hide_timer);
+        widget_data->index_hide_timer = NULL;
+     }
+   if (widget_data->bar_first_show_timer)
+     {
+        ecore_timer_del(widget_data->bar_first_show_timer);
+        widget_data->bar_first_show_timer = NULL;
+     }
+   if (widget_data->change_flag_timer)
+     {
+        ecore_timer_del(widget_data->change_flag_timer);
+        widget_data->change_flag_timer = NULL;
+     }
+
+   _eext_circle_object_genlist_items_index_clear_internal(circle_obj);
+
+   EINA_LIST_FREE(widget_data->rotary_times, rotary_time)
+     free(rotary_time);
+
+   free(circle_obj->widget_data);
+   circle_obj->widget_data = NULL;
+
+   eext_rotary_object_event_callback_del(circle_obj->widget_object, _rotary_changed_cb);
+}
+
+static void
+_eext_circle_object_genlist_init(Eext_Circle_Object *circle_obj,
+                                 Evas_Object *genlist)
+{
+   Eext_Circle_Object_Genlist_Data *widget_data = NULL;
+
+   circle_obj->widget_type = EEXT_CIRCLE_OBJECT_GENLIST_TYPE;
+   circle_obj->del_func = _eext_circle_object_genlist_del_cb;
+   circle_obj->color_changed_func = _eext_circle_object_genlist_color_changed_cb;
+   circle_obj->mirrored_state = EEXT_CIRCLE_MIRRORED_CONFIG;
+
+   widget_data = (Eext_Circle_Object_Genlist_Data *)calloc(1, sizeof(Eext_Circle_Object_Genlist_Data));
+   if (!widget_data)
+     {
+        LOGE("Could not allocate memory for Eext_Circle_Object_Genlist_Data!");
+        return;
+     }
+
+   const char *style = elm_object_style_get(genlist);
+   if (style && !strcmp(style, HANDLER_STYLE))
+     widget_data->handler = EINA_TRUE;
+   else
+     widget_data->handler = EINA_FALSE;
+
+   widget_data->policy_v = ELM_SCROLLER_POLICY_AUTO;
+   widget_data->scrollbar_initializing = EINA_FALSE;
+   widget_data->scrollbar_first_shown = EINA_FALSE;
+
+   widget_data->bezel_scrollbar_color_class = STR_DUP(edje_object_data_get(elm_layout_edje_get(genlist), "bezel_bar_color_class"));
+   widget_data->scrollbar_color_class = STR_DUP(edje_object_data_get(elm_layout_edje_get(genlist), "bar_color_class"));
+   widget_data->scrollbar_bg_color_class = STR_DUP(edje_object_data_get(elm_layout_edje_get(genlist), "bar_bg_color_class"));
+
+   widget_data->handler_layout = NULL;
+   widget_data->handler_angle = 0;
+   widget_data->handler_drag = EINA_FALSE;
+   widget_data->aligned_item = NULL;
+   //ONEUI1.5(19Jun2019): Enable sw/hw bezel
+   if (!eext_rotary_event_is_enabled())
+     widget_data->index_shown_anim = EINA_FALSE;
+
+   if (widget_data->handler)
+     {
+        widget_data->handler_layout = elm_layout_add(genlist);
+        elm_layout_theme_set(widget_data->handler_layout, "scroller", "base", "prod/handler/indicator");
+        evas_object_resize(widget_data->handler_layout, SURFACE_WIDTH, SURFACE_WIDTH);
+        evas_object_show(widget_data->handler_layout);
+        evas_object_smart_member_add(widget_data->handler_layout, genlist);
+        elm_layout_signal_callback_add(widget_data->handler_layout, "elm,state,hide,finished", "elm", _handler_hide_cb, widget_data);
+        evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_DOWN, _eext_circle_object_genlist_handler_drag_start_cb, circle_obj);
+        evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_UP, _eext_circle_object_genlist_handler_drag_end_cb, circle_obj);
+     }
+   //ONEUI1.5(04July2019): Support different color with bezel
+   evas_object_event_callback_priority_add(genlist, EVAS_CALLBACK_MOUSE_MOVE, EVAS_CALLBACK_PRIORITY_BEFORE,
+                                           _eext_circle_object_genlist_drag_cb, circle_obj);
+   //
+   circle_obj->widget_data = (void *)widget_data;
+   _update_color_info(circle_obj);
+
+   widget_data->bg_item = _eext_circle_object_item_new();
+
+   _eext_circle_object_item_color_set(widget_data->bg_item,
+                               widget_data->bg_color.r,
+                               widget_data->bg_color.g,
+                               widget_data->bg_color.b,
+                               0);
+   _eext_circle_object_item_name_set(widget_data->bg_item, GENLIST_BG_ITEM_NAME);
+   _eext_circle_object_item_angle_set(widget_data->bg_item, VERTICAL_BAR_ANGLE_MAX_SIZE);
+   _eext_circle_object_item_line_width_set(widget_data->bg_item, VERTICAL_BAR_WIDTH_SIZE);
+   _eext_circle_object_item_radius_set(widget_data->bg_item, VERTICAL_BAR_RADIUS_SIZE);
+
+   _eext_circle_object_item_angle_offset_set(widget_data->bg_item, VERTICAL_BAR_ANGLE_START);
+   _eext_circle_object_item_append(circle_obj, widget_data->bg_item);
+
+   widget_data->item = _eext_circle_object_item_new();
+   _eext_circle_object_item_color_set(widget_data->item,
+                               widget_data->color.r,
+                               widget_data->color.g,
+                               widget_data->color.b,
+                               0);
+   _eext_circle_object_item_name_set(widget_data->item, GENLIST_ITEM_NAME);
+   _eext_circle_object_item_angle_set(widget_data->item, VERTICAL_BAR_ANGLE_MAX_SIZE);
+   _eext_circle_object_item_line_width_set(widget_data->item, VERTICAL_BAR_WIDTH_SIZE);
+   _eext_circle_object_item_radius_set(widget_data->item, VERTICAL_BAR_RADIUS_SIZE);
+
+   _eext_circle_object_item_angle_offset_set(widget_data->item, VERTICAL_BAR_ANGLE_START);
+   _eext_circle_object_item_append(circle_obj, widget_data->item);
+
+
+   elm_scroller_policy_set(circle_obj->widget_object, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+
+   //ONEUI1.5(18FEB2019): Genlist resume/pause signal for scrollbar show
+   evas_object_smart_callback_add(circle_obj->widget_object, SIG_GENLIST_RESUME, _eext_circle_object_genlist_resume_cb, circle_obj);
+   evas_object_smart_callback_add(circle_obj->main_obj, SIG_GENLIST_RESUME, _eext_circle_object_genlist_resume_cb, circle_obj);
+   evas_object_smart_callback_add(circle_obj->widget_object, SIG_GENLIST_PAUSE, _eext_circle_object_genlist_pause_cb, circle_obj);
+   evas_object_smart_callback_add(circle_obj->main_obj, SIG_GENLIST_PAUSE, _eext_circle_object_genlist_pause_cb, circle_obj);
+   //
+   evas_object_smart_callback_add(circle_obj->widget_object, SIGNAL_SCROLL, _eext_circle_object_genlist_scroll_cb, circle_obj);
+   evas_object_smart_callback_add(circle_obj->widget_object, SIGNAL_SCROLL_ANIM_STOP, _eext_circle_object_genlist_scroll_anim_stop_cb, circle_obj);
+   evas_object_smart_callback_add(circle_obj->widget_object, SIGNAL_LOADED, _eext_circle_object_genlist_loaded_cb, circle_obj);
+   evas_object_smart_callback_add(circle_obj->widget_object, SIGNAL_ITEM_DELETED, _eext_circle_object_genlist_item_deleted_cb, circle_obj);
+   evas_object_smart_callback_add(circle_obj->widget_object, SIG_BRING_IN_ITEM_ADJUSTED, _eext_circle_object_genlist_bring_in_item_adjusted_cb, circle_obj);
+   evas_object_smart_callback_add(circle_obj->widget_object, SIG_ALIGNED_ITEM_DETECTED, _eext_circle_object_genlist_aligned_item_cb, circle_obj);
+   //ONEUI1.5(20181009):Register access object when screen-reader is dynamically switched on
+   evas_object_smart_callback_add(circle_obj->widget_object, "atspi,screen,reader,changed", _eext_circle_object_genlist_screen_reader_changed, circle_obj);
+   //
+   //ONEUI1.5(03JUN2019): Update circle genlist on theme change
+   evas_object_smart_callback_add(circle_obj->widget_object, SIG_THEME_CHANGED, _eext_circle_object_genlist_theme_changed_cb, circle_obj);
+   //
+   //ONEUI1.5(19Jun2019): Enable sw/hw bezel
+   if (!eext_rotary_event_is_enabled())
+     {
+        if (__elm_product_theme_is_loaded())
+          {
+             evas_object_smart_callback_add(circle_obj->widget_object, SIG_REALIZED, _eext_circle_object_genlist_index_update_cb, circle_obj);
+             evas_object_smart_callback_add(circle_obj->widget_object, SIG_INDEX_SHOW, _eext_circle_object_genlist_index_show_cb, circle_obj);
+          }
+     }
+
+   edje_object_signal_callback_add(elm_layout_edje_get(circle_obj->widget_object), "color_class,set", widget_data->scrollbar_color_class, _eext_circle_object_genlist_change_color_signal_cb, circle_obj);
+   edje_object_signal_callback_add(elm_layout_edje_get(circle_obj->widget_object), "color_class,set", widget_data->scrollbar_bg_color_class, _eext_circle_object_genlist_change_color_signal_cb, circle_obj);
+   //ONEUI1.5(04July2019): Support different color with bezel
+   edje_object_signal_callback_add(elm_layout_edje_get(circle_obj->widget_object), "color_class,set",
+                                                       widget_data->bezel_scrollbar_color_class,
+                                                       _eext_circle_object_genlist_change_color_signal_cb,
+                                                       circle_obj);
+   //
+
+   eext_rotary_object_event_callback_add(circle_obj->widget_object, _rotary_changed_cb, circle_obj);
+}
+
+EAPI Evas_Object *
+eext_circle_object_genlist_add(Evas_Object *genlist,
+                               Eext_Circle_Surface *surface)
+{
    if (!genlist) return NULL;
 
-   obj = _eext_circle_object_add(genlist, genlist, surface);
+   Evas_Object *obj = _eext_circle_object_add(genlist, genlist, surface);
 
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
 
@@ -573,9 +1944,9 @@ eext_circle_object_genlist_scroller_policy_set(Evas_Object *obj,
                                                Elm_Scroller_Policy policy_v)
 {
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data)
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data)
      {
-        ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
+        LOGE("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
              EEXT_CIRCLE_OBJECT_GENLIST_TYPE, circle_obj->widget_type);
         return;
      }
@@ -584,21 +1955,20 @@ eext_circle_object_genlist_scroller_policy_set(Evas_Object *obj,
        (policy_v >= ELM_SCROLLER_POLICY_LAST))
      return;
 
-   data->policy_h = policy_h;
-   data->policy_v = policy_v;
+   widget_data->policy_h = policy_h;
+   widget_data->policy_v = policy_v;
 
-   if (data->policy_v == ELM_SCROLLER_POLICY_ON)
+   if (widget_data->policy_v == ELM_SCROLLER_POLICY_ON ||
+       widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO)
      {
-        _eext_circle_object_genlist_scrollbar_update(circle_obj);
-        _eext_circle_object_genlist_scrollbar_show(circle_obj,
-                                                   VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+        _eext_circle_object_genlist_scrollbar_show(circle_obj);
      }
    else
      {
-        if (data->bar_hide_timer)
+        if (widget_data->bar_hide_timer)
           {
-             ecore_timer_del(data->bar_hide_timer);
-             data->bar_hide_timer = NULL;
+             ecore_timer_del(widget_data->bar_hide_timer);
+             widget_data->bar_hide_timer = NULL;
           }
         _eext_circle_object_genlist_scrollbar_policy_hide_cb(circle_obj);
      }
@@ -616,15 +1986,149 @@ eext_circle_object_genlist_scroller_policy_get(const Evas_Object *obj,
         return;
      }
 
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data)
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data)
      {
-        ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
+        LOGE("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
              EEXT_CIRCLE_OBJECT_GENLIST_TYPE, circle_obj->widget_type);
         if (policy_h) *policy_h = ELM_SCROLLER_POLICY_AUTO;
         if (policy_v) *policy_v = ELM_SCROLLER_POLICY_AUTO;
         return;
      }
 
-   if (policy_h) *policy_h = data->policy_h;
-   if (policy_v) *policy_v = data->policy_v;
+   if (policy_h) *policy_h = widget_data->policy_h;
+   if (policy_v) *policy_v = widget_data->policy_v;
+}
+
+EAPI void
+eext_circle_object_genlist_item_index_set(Evas_Object *obj,
+                                          Elm_Object_Item *item,
+                                          const char *text)
+{
+   Eext_Circle_Object_Genlist_Index_Item *index_item = NULL, *iit = NULL;
+   Elm_Object_Item *genlist_item = NULL;
+   Eina_List *l = NULL;
+
+   if (!item || !text) return;
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   if (!widget_data->index_layout)
+     {
+        widget_data->index_layout = elm_layout_add(circle_obj->widget_object);
+        elm_layout_theme_set(widget_data->index_layout, "layout", "rotary_index", "indicator");
+        elm_object_part_content_set(circle_obj->widget_object, "elm.swallow.index", widget_data->index_layout);
+        //ONEUI1.5(19Jun2019): Enable sw/hw bezel
+        if (!eext_rotary_event_is_enabled())
+          {
+             widget_data->g_rect = evas_object_rectangle_add(evas_object_evas_get(circle_obj->widget_object));
+             evas_object_smart_member_add(widget_data->g_rect, circle_obj->widget_object);
+             evas_object_color_set(widget_data->g_rect, 0, 0, 0, 0);
+             evas_object_resize(widget_data->g_rect, SURFACE_WIDTH, SURFACE_WIDTH);
+             evas_object_show(widget_data->g_rect);
+             evas_object_repeat_events_set(widget_data->g_rect, EINA_TRUE);
+             evas_object_raise(widget_data->g_rect);
+
+             evas_object_event_callback_add(circle_obj->widget_object, EVAS_CALLBACK_RESIZE, _on_obj_resize, widget_data);
+
+             widget_data->g_layer = elm_gesture_layer_add(circle_obj->widget_object);
+             elm_gesture_layer_attach(widget_data->g_layer, widget_data->g_rect);
+          }
+#ifdef PRODUCT_FEATURE_SCREEN_READER_MODE
+        if (__elm_access_screen_reader_enabled_get())
+          {
+             Evas_Object *text_object = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(widget_data->index_layout), "elm.text");
+             widget_data->access_object = elm_access_object_register(text_object, circle_obj->widget_object);
+             elm_atspi_accessible_role_set(widget_data->access_object, ELM_ATSPI_ROLE_RADIO_MENU_ITEM);
+             elm_atspi_accessible_reading_info_type_set(widget_data->access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME|
+                                                                                    ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+             //ONEUI1.5(19Jun2019): Enable sw/hw bezel
+             if (!eext_rotary_event_is_enabled())
+               elm_atspi_accessible_gesture_cb_set(widget_data->access_object, _index_gesture_cb, circle_obj);
+          }
+#endif
+     }
+
+   genlist_item = elm_genlist_first_item_get(circle_obj->widget_object);
+
+   EINA_LIST_FOREACH(widget_data->index_item_list, l, iit)
+     {
+        if (iit->item == item)
+          {
+             eina_stringshare_replace(&(iit->letter), text);
+             return;
+          }
+
+        while (genlist_item)
+          {
+             if (item == genlist_item)
+               {
+                  index_item = _eext_circle_object_genlist_index_item_new(circle_obj, item, text);
+                  widget_data->index_item_list = eina_list_prepend_relative_list(widget_data->index_item_list, index_item, l);
+                  return;
+               }
+
+             if (iit->item == genlist_item)
+               break;
+
+             genlist_item = elm_genlist_item_next_get(genlist_item);
+          }
+     }
+
+   index_item = _eext_circle_object_genlist_index_item_new(circle_obj, item, text);
+   widget_data->index_item_list = eina_list_append(widget_data->index_item_list, index_item);
+}
+
+EAPI const char *
+eext_circle_object_genlist_item_index_get(Evas_Object *obj,
+                                          Elm_Object_Item *item)
+{
+   Eext_Circle_Object_Genlist_Index_Item *index_item = NULL;
+   Eina_List *l = NULL;
+
+   if (!item) return NULL;
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return NULL;
+
+   EINA_LIST_FOREACH(widget_data->index_item_list, l, index_item)
+     {
+        if (index_item->item == item)
+          return index_item->letter;
+     }
+
+   return NULL;
+}
+
+EAPI void
+eext_circle_object_genlist_item_index_unset(Evas_Object *obj,
+                                            Elm_Object_Item *item)
+{
+   Eext_Circle_Object_Genlist_Index_Item *index_item = NULL;
+   Eina_List *l = NULL;
+
+   if (!item) return;
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   if (widget_data->index_selected_item->item == item)
+     widget_data->index_selected_item = NULL;
+
+   EINA_LIST_FOREACH(widget_data->index_item_list, l, index_item)
+     {
+        if (index_item->item == item)
+          {
+             widget_data->index_item_list = eina_list_remove_list(widget_data->index_item_list, l);
+
+             if (index_item->letter) eina_stringshare_del(index_item->letter);
+             free(index_item);
+             break;
+          }
+     }
+}
+
+EAPI void
+eext_circle_object_genlist_items_index_clear(Evas_Object *obj)
+{
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+   _eext_circle_object_genlist_items_index_clear_internal(circle_obj);
 }
index ca3fda26854b462de3dfb587729dee3c60a6fc75..e30bfae62e182d845db96896c01369093fa3c8ff 100644 (file)
@@ -18,8 +18,6 @@
 #include "efl_extension_private.h"
 #include "wearable/circle/efl_extension_circle_private.h"
 
-static const char SIG_VALUE_CHANGED[] = "value,changed";
-static Eina_Bool _eext_circle_object_item_value_set_internal(Eext_Circle_Object_Item *item, double value, Eina_Bool angle_update);
 static void _eext_circle_object_item_color_transit_animator_del(Eext_Circle_Object_Item *item);
 static void _eext_circle_object_item_angle_transit_animator_del(Eext_Circle_Object_Item *item);
 
@@ -99,7 +97,7 @@ _eext_circle_object_item_angle_transit_animator_cb(void *data, double pos)
 static Eina_Bool
 _eext_circle_object_item_angle_set_internal(Eext_Circle_Object_Item *item, double angle)
 {
-   double temp_angle, value;
+   double temp_angle;
 
    if (item->angle == angle) return EINA_FALSE;
 
@@ -111,8 +109,7 @@ _eext_circle_object_item_angle_set_internal(Eext_Circle_Object_Item *item, doubl
    if (item->angle == temp_angle) return EINA_FALSE;
 
    item->angle = temp_angle;
-   value = _eext_circle_object_item_angle_value_get(item, item->angle);
-   _eext_circle_object_item_value_set_internal(item, value, EINA_TRUE);
+   item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
 
    return EINA_TRUE;
 }
@@ -120,7 +117,7 @@ _eext_circle_object_item_angle_set_internal(Eext_Circle_Object_Item *item, doubl
 static Eina_Bool
 _eext_circle_object_item_angle_set_round_internal(Eext_Circle_Object_Item *item, double angle)
 {
-   double temp_angle, value;
+   double temp_angle;
 
    if (item->angle == angle) return EINA_FALSE;
 
@@ -132,8 +129,7 @@ _eext_circle_object_item_angle_set_round_internal(Eext_Circle_Object_Item *item,
    if (item->angle == temp_angle) return EINA_FALSE;
 
    item->angle = temp_angle;
-   value = _eext_circle_object_item_angle_value_get_round(item, item->angle);
-   _eext_circle_object_item_value_set_internal(item, value, EINA_FALSE);
+   item->value = _eext_circle_object_item_angle_value_get_round(item, item->angle);
 
    return EINA_TRUE;
 }
@@ -149,9 +145,8 @@ _eext_circle_object_item_angle_offset_set_internal(Eext_Circle_Object_Item *item
 }
 
 static Eina_Bool
-_eext_circle_object_item_value_set_internal(Eext_Circle_Object_Item *item, double value, Eina_Bool angle_update)
+_eext_circle_object_item_value_set_internal(Eext_Circle_Object_Item *item, double value)
 {
-   Eext_Circle_Object *obj = item->obj;
    double angle;
 
    if (item->value == value) return EINA_FALSE;
@@ -161,11 +156,6 @@ _eext_circle_object_item_value_set_internal(Eext_Circle_Object_Item *item, doubl
    if (item->value < item->min_value) item->value = item->min_value;
    if (item->value > item->max_value) item->value = item->max_value;
 
-   if (obj)
-     evas_object_smart_callback_call(obj->main_obj, SIG_VALUE_CHANGED, NULL);
-
-   if (!angle_update) return EINA_TRUE;
-
    angle = _eext_circle_object_item_value_angle_get(item, item->value);
 
    if (item->angle == angle) return EINA_FALSE;
@@ -320,10 +310,8 @@ _eext_circle_object_item_angle_value_get_round(const Eext_Circle_Object_Item *it
    value = item->min_value;
    if (item->max_angle != item->min_angle)
      value += (angle - item->min_angle) * (item->max_value - item->min_value) / (item->max_angle - item->min_angle);
-
    value += 0.5;
    value = (int)value;
-
    if (value < item->min_value) value = item->min_value;
    if (value > item->max_value) value = item->max_value;
 
@@ -367,7 +355,7 @@ _eext_circle_text_font_get(const char *text, const char *font_family)
 
    if (set == NULL)
      {
-        ERR("Fail to sort the fonts");
+        LOGE("Fail to sort the fonts");
         return NULL;
      }
 
@@ -376,7 +364,7 @@ _eext_circle_text_font_get(const char *text, const char *font_family)
 
    if (result == FcResultNoMatch)
      {
-        ERR("Fail to Load Family Name to draw %s [%X]", text, (unsigned int)u_str);
+        LOGE("Fail to Load Family Name to draw %s [%X]", text, (unsigned int)u_str);
         return NULL;
      }
 
@@ -394,6 +382,8 @@ _eext_circle_object_item_new(void)
    item->name = eina_stringshare_add("default");
    item->angle = item->draw.angle = 0.0;
    item->angle_offset = item->draw.angle_offset = 0.0;
+   item->round_cap = EINA_TRUE;
+   item->color_changed = EINA_FALSE;
    item->min_angle = 0;
    item->max_angle = 360;
    item->min_value = 0;
@@ -434,24 +424,22 @@ _eext_circle_object_item_append(Eext_Circle_Object *obj, Eext_Circle_Object_Item
 
    if (obj == item->obj)
      {
-        ERR("You are trying to append the item that is already appended");
+        LOGE("You are trying to append the item that is already appended");
         return;
      }
 
    if (item->obj)
      {
-        ERR("You are trying to append the item that is already appended to the other object!");
+        LOGE("You are trying to append the item that is already appended to the other object!");
         return;
      }
 
    obj->items = eina_list_append(obj->items, item);
    item->obj = obj;
-
    if (obj->vg_container)
      {
         item->vg = evas_vg_shape_add(obj->vg_container);
      }
-
    _eext_circle_object_changed(item->obj);
 }
 
@@ -462,24 +450,22 @@ _eext_circle_object_item_prepend(Eext_Circle_Object *obj, Eext_Circle_Object_Ite
 
    if (obj == item->obj)
      {
-        ERR("You are trying to append the item that is already appended");
+        LOGE("You are trying to append the item that is already appended");
         return;
      }
 
    if (item->obj)
      {
-        ERR("You are trying to append the item that is already appended to the other object!");
+        LOGE("You are trying to append the item that is already appended to the other object!");
         return;
      }
 
    obj->items = eina_list_prepend(obj->items, item);
    item->obj = obj;
-
    if (obj->vg_container)
      {
         item->vg = evas_vg_shape_add(obj->vg_container);
      }
-
    _eext_circle_object_changed(item->obj);
 }
 
@@ -490,13 +476,13 @@ _eext_circle_object_item_insert_before(Eext_Circle_Object *obj, Eext_Circle_Obje
 
    if (obj == item->obj)
      {
-        ERR("You are trying to append the item that is already appended");
+        LOGE("You are trying to append the item that is already appended");
         return;
      }
 
    if (item->obj)
      {
-        ERR("You are trying to append the item that is already appended to the other object!");
+        LOGE("You are trying to append the item that is already appended to the other object!");
         return;
      }
 
@@ -504,12 +490,10 @@ _eext_circle_object_item_insert_before(Eext_Circle_Object *obj, Eext_Circle_Obje
 
    obj->items = eina_list_prepend_relative(obj->items, item, before);
    item->obj = obj;
-
    if (obj->vg_container)
      {
         item->vg = evas_vg_shape_add(obj->vg_container);
      }
-
    _eext_circle_object_changed(item->obj);
 }
 
@@ -520,13 +504,13 @@ _eext_circle_object_item_insert_after(Eext_Circle_Object *obj, Eext_Circle_Objec
 
    if (obj == item->obj)
      {
-        ERR("You are trying to append the item that is already appended");
+        LOGE("You are trying to append the item that is already appended");
         return;
      }
 
    if (item->obj)
      {
-        ERR("You are trying to append the item that is already appended to the other object!");
+        LOGE("You are trying to append the item that is already appended to the other object!");
         return;
      }
 
@@ -534,12 +518,10 @@ _eext_circle_object_item_insert_after(Eext_Circle_Object *obj, Eext_Circle_Objec
 
    obj->items = eina_list_append_relative(obj->items, item, after);
    item->obj = obj;
-
    if (obj->vg_container)
      {
         item->vg = evas_vg_shape_add(obj->vg_container);
      }
-
    _eext_circle_object_changed(item->obj);
 }
 
@@ -646,6 +628,14 @@ _eext_circle_object_item_angle_get(const Eext_Circle_Object_Item *item)
    return item->angle;
 }
 
+double
+_eext_circle_object_item_draw_angle_offset_get(const Eext_Circle_Object_Item *item)
+{
+   if (!item) return -1.0;
+
+   return item->draw.angle_offset;
+}
+
 void
 _eext_circle_object_item_angle_offset_set(Eext_Circle_Object_Item *item, double angle_offset)
 {
@@ -669,7 +659,7 @@ _eext_circle_object_item_angle_offset_get(const Eext_Circle_Object_Item *item)
 void
 _eext_circle_object_item_angle_min_max_set(Eext_Circle_Object_Item *item, double min_angle, double max_angle)
 {
-   double angle = 0.0, value;
+   double angle = 0.0;
 
    if (!item) return;
 
@@ -691,8 +681,7 @@ _eext_circle_object_item_angle_min_max_set(Eext_Circle_Object_Item *item, double
    if (item->angle == angle) return;
 
    item->angle = angle;
-   value = _eext_circle_object_item_angle_value_get(item, item->angle);
-   _eext_circle_object_item_value_set_internal(item, value, EINA_TRUE);
+   item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
    item->draw.angle = item->angle;
 
    _eext_circle_object_changed(item->obj);
@@ -732,10 +721,8 @@ _eext_circle_object_item_value_min_max_set(Eext_Circle_Object_Item *item, double
    item->min_value = min_value;
    item->max_value = max_value;
 
-   if (item->value < item->min_value)
-     _eext_circle_object_item_value_set_internal(item, item->min_value, EINA_TRUE);
-   if (item->value > item->max_value)
-     _eext_circle_object_item_value_set_internal(item, item->max_value, EINA_TRUE);
+   if (item->value < item->min_value) item->value = item->min_value;
+   if (item->value > item->max_value) item->value = item->max_value;
 
    angle = _eext_circle_object_item_value_angle_get(item, item->value);
 
@@ -774,7 +761,7 @@ _eext_circle_object_item_value_set(Eext_Circle_Object_Item *item, double value)
         _eext_circle_object_changed(item->obj);
      }
 
-   if (_eext_circle_object_item_value_set_internal(item, value, EINA_TRUE))
+   if (_eext_circle_object_item_value_set_internal(item, value))
      {
         item->draw.angle = item->angle;
         _eext_circle_object_changed(item->obj);
@@ -795,6 +782,7 @@ _eext_circle_object_item_color_set(Eext_Circle_Object_Item *item,
 {
    if (!item) return;
 
+   item->color_changed = EINA_TRUE;
    if (item->color_transit.animator_cb)
      {
         _eext_circle_object_item_color_transit_animator_del(item);
@@ -880,7 +868,7 @@ _eext_circle_object_item_text_set(Eext_Circle_Object_Item *item,
 
    if (!selected_font)
      {
-        ERR("There is no font for the text: %s", text);
+        LOGE("There is no font for the text: %s", text);
      }
 
    eina_stringshare_replace(&item->selected_font, selected_font);
@@ -991,7 +979,6 @@ _eext_circle_object_item_angle_transit_set(Eext_Circle_Object_Item *item, double
                                            double cubic_bezier_p2_x, double cubic_bezier_p2_y)
 {
    Eina_Bool ret;
-   double value;
 
    if (!item) return;
 
@@ -1002,10 +989,7 @@ _eext_circle_object_item_angle_transit_set(Eext_Circle_Object_Item *item, double
                                                              cubic_bezier_p2_x, cubic_bezier_p2_y);
 
    if (ret)
-     {
-        value = _eext_circle_object_item_angle_value_get(item, item->angle);
-        _eext_circle_object_item_value_set_internal(item, value, EINA_TRUE);
-     }
+     item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
 }
 
 void
@@ -1030,7 +1014,11 @@ _eext_circle_object_item_value_transit_set(Eext_Circle_Object_Item *item, double
                                                              cubic_bezier_p2_x, cubic_bezier_p2_y);
 
    if (ret)
-     _eext_circle_object_item_value_set_internal(item, to_value, EINA_TRUE);
+     {
+        if (to_value < item->min_value) to_value = item->min_value;
+        if (to_value > item->max_value) to_value = item->max_value;
+        item->value = to_value;
+     }
 }
 
 void
index 704c379b33397df0feaca141631b9cdf40ca688b..8b2ca5d1e6ccf2c13d37a3437f5c885101b90db5 100644 (file)
 #define PROGRESSBAR_WIDTH_SIZE 6
 #define PROGRESSBAR_RADIUS_SIZE 177
 
+static void
+_update_color_info(Eext_Circle_Object *obj)
+{
+   EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(obj, data) return;
+
+   Eext_Circle_Color ext_color;
+   //default color
+   if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B065L2", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     if (!edje_color_class_get("B065L2", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+       {
+          ext_color.r = PROGRESSBAR_COLOR_R;
+          ext_color.g = PROGRESSBAR_COLOR_G;
+          ext_color.b = PROGRESSBAR_COLOR_B;
+          ext_color.a = PROGRESSBAR_COLOR_A;
+       }
+   data->color.r = ext_color.r;
+   data->color.g = ext_color.g;
+   data->color.b = ext_color.b;
+   data->color.a = ext_color.a;
+
+   //disabled color
+   if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B104L2D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     if (!edje_color_class_get("B104L2D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+       {
+          ext_color.r = PROGRESSBAR_COLOR_DISABLED_R;
+          ext_color.g = PROGRESSBAR_COLOR_DISABLED_G;
+          ext_color.b = PROGRESSBAR_COLOR_DISABLED_B;
+          ext_color.a = PROGRESSBAR_COLOR_DISABLED_A;
+       }
+   data->disabled_color.r = ext_color.r;
+   data->disabled_color.g = ext_color.g;
+   data->disabled_color.b = ext_color.b;
+   data->disabled_color.a = ext_color.a;
+
+   //BG color
+   if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B065L3", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     if (!edje_color_class_get("B065L3", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+       {
+          ext_color.r = PROGRESSBAR_BG_COLOR_R;
+          ext_color.g = PROGRESSBAR_BG_COLOR_G;
+          ext_color.b = PROGRESSBAR_BG_COLOR_B;
+          ext_color.a = PROGRESSBAR_BG_COLOR_A;
+       }
+   data->bg_color.r = ext_color.r;
+   data->bg_color.g = ext_color.g;
+   data->bg_color.b = ext_color.b;
+   data->bg_color.a = ext_color.a;
+
+   //disabled BG color
+   if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B104L1D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     if (!edje_color_class_get("B104L1D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+       {
+          ext_color.r = PROGRESSBAR_BG_COLOR_DISABLED_R;
+          ext_color.g = PROGRESSBAR_BG_COLOR_DISABLED_G;
+          ext_color.b = PROGRESSBAR_BG_COLOR_DISABLED_B;
+          ext_color.a = PROGRESSBAR_BG_COLOR_DISABLED_A;
+       }
+   data->disabled_bg_color.r = ext_color.r;
+   data->disabled_bg_color.g = ext_color.g;
+   data->disabled_bg_color.b = ext_color.b;
+   data->disabled_bg_color.a = ext_color.a;
+}
+
+static void
+_eext_circle_object_progressbar_change_color_signal_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   LOGI("theme is changed");
+
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(circle_obj, progressbar_data) return;
+
+   _update_color_info(circle_obj);
+
+   Eext_Circle_Object_Item *item = NULL;
+
+   item = _eext_circle_object_item_get(circle_obj, PROGRESSBAR_BG_ITEM_NAME);
+   if (item)
+     {
+        _eext_circle_object_item_color_set(item, progressbar_data->bg_color.r, progressbar_data->bg_color.g, progressbar_data->bg_color.b, progressbar_data->bg_color.a);
+     }
+   item = _eext_circle_object_item_get(circle_obj, PROGRESSBAR_ITEM_NAME);
+   if (item)
+     {
+        _eext_circle_object_item_color_set(item, progressbar_data->color.r, progressbar_data->color.g, progressbar_data->color.b, progressbar_data->color.a);
+     }
+}
+
+
 static void
 _eext_circle_object_progressbar_del_cb(Eext_Circle_Object *obj)
 {
+   EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(obj, data) return;
+
+   edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B065L2", _eext_circle_object_progressbar_change_color_signal_cb);
+   edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B104L2D", _eext_circle_object_progressbar_change_color_signal_cb);
+   edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B065L3", _eext_circle_object_progressbar_change_color_signal_cb);
+   edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B104L1D", _eext_circle_object_progressbar_change_color_signal_cb);
+
    if (obj->widget_data)
      {
         free(obj->widget_data);
@@ -140,7 +236,7 @@ _eext_circle_object_progressbar_disabled_cb(Eext_Circle_Object *obj)
 }
 
 static void
-_eext_circle_object_progressbar_init(Eext_Circle_Object *obj)
+_eext_circle_object_progressbar_init(Evas_Object *parent, Eext_Circle_Object *obj)
 {
    Eext_Circle_Object_Item *item;
    Eext_Circle_Object_Progressbar_Data *data;
@@ -152,23 +248,10 @@ _eext_circle_object_progressbar_init(Eext_Circle_Object *obj)
    obj->color_changed_func = _eext_circle_object_progressbar_color_changed_cb;
 
    data = (Eext_Circle_Object_Progressbar_Data *)calloc(1, sizeof(Eext_Circle_Object_Progressbar_Data));
-   data->color.r = PROGRESSBAR_COLOR_R;
-   data->color.g = PROGRESSBAR_COLOR_G;
-   data->color.b = PROGRESSBAR_COLOR_B;
-   data->color.a = PROGRESSBAR_COLOR_A;
-   data->bg_color.r = PROGRESSBAR_BG_COLOR_R;
-   data->bg_color.g = PROGRESSBAR_BG_COLOR_G;
-   data->bg_color.b = PROGRESSBAR_BG_COLOR_B;
-   data->bg_color.a = PROGRESSBAR_BG_COLOR_A;
-   data->disabled_color.r = PROGRESSBAR_COLOR_DISABLED_R;
-   data->disabled_color.g = PROGRESSBAR_COLOR_DISABLED_G;
-   data->disabled_color.b = PROGRESSBAR_COLOR_DISABLED_B;
-   data->disabled_color.a = PROGRESSBAR_COLOR_DISABLED_A;
-   data->disabled_bg_color.r = PROGRESSBAR_BG_COLOR_DISABLED_R;
-   data->disabled_bg_color.g = PROGRESSBAR_BG_COLOR_DISABLED_G;
-   data->disabled_bg_color.b = PROGRESSBAR_BG_COLOR_DISABLED_B;
-   data->disabled_bg_color.a = PROGRESSBAR_BG_COLOR_DISABLED_A;
+   data->parent = parent;
+
    obj->widget_data = (void *)data;
+   _update_color_info(obj);
 
    item = _eext_circle_object_item_new();
    _eext_circle_object_item_name_set(item, PROGRESSBAR_BG_ITEM_NAME);
@@ -211,7 +294,12 @@ eext_circle_object_progressbar_add(Evas_Object *parent, Eext_Circle_Surface *sur
 
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
 
-   _eext_circle_object_progressbar_init(circle_obj);
+   _eext_circle_object_progressbar_init(parent, circle_obj);
+
+   edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B065L2", _eext_circle_object_progressbar_change_color_signal_cb, circle_obj);
+   edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B104L2D", _eext_circle_object_progressbar_change_color_signal_cb, circle_obj);
+   edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B065L3", _eext_circle_object_progressbar_change_color_signal_cb, circle_obj);
+   edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B104L1D", _eext_circle_object_progressbar_change_color_signal_cb, circle_obj);
 
    /* Accessibility */
    if (!surface)
index b5637b603c0eb668e3a7fbe4a121151eb75c412b..c8190ac9c74b0a1159862871cfb248413f8500d3 100644 (file)
@@ -26,6 +26,7 @@
 #define VERTICAL_BAR_ANGLE_RANGE 60.0
 #define VERTICAL_BAR_ANGLE_MAX_SIZE 60.0
 #define VERTICAL_BAR_ANGLE_MIN_SIZE 6.0
+#define VERTICAL_BAR_ANGLE_HANDLER_SIZE 15.3
 
 #define HORIZONTAL_BAR_NAME "horizontal,scroll,bar"
 #define HORIZONTAL_BAR_BG_NAME "horizontal,scroll,bg"
@@ -38,6 +39,7 @@
 #define SCROLL_BAR_HIDE_WAITTING_TIME 0.2
 #define SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING 1.0
 #define SCROLL_BAR_WIDTH_SIZE 10
+#define SCROLL_BAR_HANDLER_WIDTH_SIZE 32
 #define SCROLL_BAR_RADIUS_SIZE 174 // (180 - (BAR_WIDTH / 2) - 1)
 
 #define SCROLL_BAR_COLOR_R 14
 #define SCROLL_BAR_BG_COLOR_DISABLED_B 45
 #define SCROLL_BAR_BG_COLOR_DISABLED_A 63
 
+#define SURFACE_WIDTH 360
+#define SIG_SCROLLER_RESUME "scroller,resume"
+//ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation
+#define BEZEL_SCROLL "bezel_scroll"
+static const char SIGNAL_DEACTIVATED[] = "rotary,deactivated";
+//
+static const char HANDLER_STYLE[] = "prod/handler";
+
+static const int LEFT = 0;
+static const int RIGHT = 1;
+static const int UP = 2;
+static const int DOWN = 3;
+
+extern Elm_Scrollable_Smart_Interface_Data* __elm_scrollable_smart_interface_data_get(Eo *obj);
+
 #define EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, data) \
    Eext_Circle_Object_Scroller_Data *data = NULL; \
    if (circle_obj && circle_obj->widget_data && \
        circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_SCROLLER_TYPE)) \
       data = (Eext_Circle_Object_Scroller_Data *)circle_obj->widget_data; \
+   if (!data) \
+     {  \
+        LOGE("No widget data for circle object %p (%s)", circle_obj, circle_obj->widget_type); \
+     } \
    if (!data)
 
+#define EEXT_CIRCLE_OBJECT_SCROLLER_SCROLL_IFACE_DATA_GET(o, ptr)                     \
+  Elm_Scrollable_Smart_Interface_Data *ptr =                            \
+    (Elm_Scrollable_Smart_Interface_Data *)(__elm_scrollable_smart_interface_data_get((Eo *)o)); \
+  if (!ptr) \
+    { \
+       LOGE("No interface data for object %p (%s)", o, evas_object_type_get(o)); \
+    }
+
+#define STR_DUP(x) x ? (char *)eina_stringshare_add(x) : NULL
+
+Eina_Bool
+__elm_product_theme_is_loaded(void)
+{
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_eext_circle_object_scroller_mirror_mode_get(Eext_Circle_Object *obj)
+{
+   Eina_Bool is_mirrored = EINA_FALSE;
+
+   if (obj->mirrored_state == EEXT_CIRCLE_MIRRORED_CONFIG)
+     is_mirrored = elm_config_mirrored_get();
+   else if (obj->mirrored_state == EEXT_CIRCLE_MIRRORED_ON)
+     is_mirrored = EINA_TRUE;
+
+   if(obj->widget_object)
+     is_mirrored = elm_object_mirrored_get(obj->widget_object);
+
+   return is_mirrored;
+}
+
 static void
 _eext_circle_object_scroller_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
 {
@@ -129,19 +182,52 @@ _eext_circle_object_scroller_scrollbar_policy_hide_cb(void *data)
 
    EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, widget_data) return ECORE_CALLBACK_CANCEL;
 
+   if (widget_data->bar_hide_timer)
+     {
+         ecore_timer_del(widget_data->bar_hide_timer);
+         widget_data->bar_hide_timer = NULL;
+     }
+
+   if (widget_data->handler)
+     {
+         elm_layout_signal_emit(widget_data->handler_layout, "elm,state,handler,hidden", "elm");
+         return ECORE_CALLBACK_CANCEL;
+     }
+
    if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO)
      {
         item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
         bg_item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
 
-        _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
-                                                   0, 0, 0, 0,
+        //ONEUI1.5(31July2019): Fix VI effect logic about hide
+        if (widget_data->bezel_on)
+           {
+             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+                                                   widget_data->bezel_vertical_color.r,
+                                                   widget_data->bezel_vertical_color.g,
+                                                   widget_data->bezel_vertical_color.b,
+                                                   0,
                                                    EINA_TRUE,
-                                                   0.25, 0.46, 0.45, 1.0);
+                                                   0.0, 0.0, 1.0, 1.0);
+           }
+        else
+        //
+          {
+             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+                                                   widget_data->vertical_color.r,
+                                                   widget_data->vertical_color.g,
+                                                   widget_data->vertical_color.b,
+                                                   0,
+                                                   EINA_TRUE,
+                                                   0.0, 0.0, 1.0, 1.0);
+          }
         _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
-                                                   0, 0, 0, 0,
+                                                   widget_data->vertical_bg_color.r,
+                                                   widget_data->vertical_bg_color.g,
+                                                   widget_data->vertical_bg_color.b,
+                                                   0,
                                                    EINA_TRUE,
-                                                   0.25, 0.46, 0.45, 1.0);
+                                                   0.0, 0.0, 1.0, 1.0);
      }
 
    if (widget_data->policy_h == ELM_SCROLLER_POLICY_AUTO)
@@ -149,20 +235,35 @@ _eext_circle_object_scroller_scrollbar_policy_hide_cb(void *data)
         item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
         bg_item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
 
-        _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
-                                                   0, 0, 0, 0,
+        //ONEUI1.5(31July2019): Fix VI effect logic about hide
+        if (widget_data->bezel_on)
+          {
+             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+                                                   widget_data->bezel_horizontal_color.r,
+                                                   widget_data->bezel_horizontal_color.g,
+                                                   widget_data->bezel_horizontal_color.b,
+                                                   0,
+                                                   EINA_TRUE,
+                                                   0.0, 0.0, 1.0, 1.0);
+          }
+        else
+          {
+             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+                                                   widget_data->horizontal_color.r,
+                                                   widget_data->horizontal_color.g,
+                                                   widget_data->horizontal_color.b,
+                                                   0,
                                                    EINA_TRUE,
-                                                   0.25, 0.46, 0.45, 1.0);
+                                                   0.0, 0.0, 1.0, 1.0);
+          }
         _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
-                                                   0, 0, 0, 0,
+                                                   widget_data->horizontal_bg_color.r,
+                                                   widget_data->horizontal_bg_color.g,
+                                                   widget_data->horizontal_bg_color.b,
+                                                   0,
                                                    EINA_TRUE,
-                                                   0.25, 0.46, 0.45, 1.0);
-     }
-
-   if (widget_data->bar_hide_timer)
-     {
-         ecore_timer_del(widget_data->bar_hide_timer);
-         widget_data->bar_hide_timer = NULL;
+                                                   0.0, 0.0, 1.0, 1.0);
+        //
      }
 
    return ECORE_CALLBACK_CANCEL;
@@ -183,89 +284,127 @@ _eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj,
 
    EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
 
-   Eina_Size2D size;
-   Eina_Rect rect;
-   Eina_Position2D pos;
-
-   //C# FIXME: Optimize the code
-   if (efl_isa(obj->widget_object, EFL_UI_LEGACY_INTERFACE))
-     {
-        elm_scroller_child_size_get(scroller, &content_w, &content_h);
-        elm_scroller_region_get(scroller, &position_x, &position_y, &viewport_w, &viewport_h);
-     }
-   else
-     {
-        size = efl_ui_scrollable_content_size_get(obj->widget_object);
-        rect = efl_ui_scrollable_viewport_geometry_get(obj->widget_object);
-        pos = efl_ui_scrollable_content_pos_get(obj->widget_object);
-
-        content_w = size.w;
-        content_h = size.h;
-
-        viewport_w = rect.w;
-        viewport_h = rect.h;
-
-        position_x = pos.x;
-        position_y = pos.y;
-     }
+   is_mirrored = _eext_circle_object_scroller_mirror_mode_get(obj);
+   elm_scroller_child_size_get(scroller, &content_w, &content_h);
+   elm_scroller_region_get(scroller, &position_x, &position_y, &viewport_w, &viewport_h);
 
    item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
    bg_item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
 
    if ((content_h > 0.0) && (viewport_h > 0.0) &&
-       (data->policy_v != ELM_SCROLLER_POLICY_OFF))
+       (data->policy_v != ELM_SCROLLER_POLICY_OFF) && (viewport_h < content_h))
      {
         if (content_h > viewport_h)
           {
-             bar_size_v = VERTICAL_BAR_ANGLE_RANGE / ((double)content_h / (double)viewport_h);
+             if (data->handler)
+               {
+                  bar_size_v = VERTICAL_BAR_ANGLE_HANDLER_SIZE;
+               }
+             else
+               {
+                  bar_size_v = VERTICAL_BAR_ANGLE_RANGE / ((double)content_h / (double)viewport_h);
+
+                  if (bar_size_v > VERTICAL_BAR_ANGLE_MAX_SIZE)
+                     bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE;
+                  if (bar_size_v < VERTICAL_BAR_ANGLE_MIN_SIZE)
+                     bar_size_v = VERTICAL_BAR_ANGLE_MIN_SIZE;
+               }
 
-             if (bar_size_v > VERTICAL_BAR_ANGLE_MAX_SIZE)
-                bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE;
-             if (bar_size_v < VERTICAL_BAR_ANGLE_MIN_SIZE)
-                bar_size_v = VERTICAL_BAR_ANGLE_MIN_SIZE;
+             bar_pos_v = (VERTICAL_BAR_ANGLE_RANGE - bar_size_v) * position_y / (content_h - viewport_h);
           }
         else
-           bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE;
+          {
+             bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE;
+             bar_pos_v = (VERTICAL_BAR_ANGLE_RANGE / (double)content_h) * (double)position_y;
+          }
 
-        bar_pos_v = (VERTICAL_BAR_ANGLE_RANGE / (double)content_h) * (double)position_y;
+        if (is_mirrored)
+          {
+             bar_pos_v = -bar_pos_v;
+             bar_pos_v += VERTICAL_BAR_ANGLE_RANGE;
+          }
         bar_pos_v += VERTICAL_BAR_ANGLE_START;
 
         _eext_circle_object_item_angle_offset_set(item, bar_pos_v);
         _eext_circle_object_item_angle_set(item, bar_size_v);
 
-        if (obj->disabled)
+        if (data->handler)
           {
-             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
-                                                        data->disabled_color.r,
-                                                        data->disabled_color.g,
-                                                        data->disabled_color.b,
-                                                        data->disabled_color.a,
-                                                        EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
-             _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
-                                                        data->disabled_bg_color.r,
-                                                        data->disabled_bg_color.g,
-                                                        data->disabled_bg_color.b,
-                                                        data->disabled_bg_color.a,
-                                                        EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
+             Evas_Map *m = evas_map_new(4);
+             evas_map_util_points_populate_from_object(m, data->handler_layout);
+             // layout is 90 degrees ahead so 90 needs to be subtracted here
+             if (is_mirrored)
+               data->handler_angle = bar_pos_v - 90 - VERTICAL_BAR_ANGLE_HANDLER_SIZE / 2;
+             else
+               data->handler_angle = bar_pos_v - 90 + VERTICAL_BAR_ANGLE_HANDLER_SIZE / 2;
+             evas_map_util_rotate(m, data->handler_angle, SURFACE_WIDTH / 2, SURFACE_WIDTH / 2);
+             evas_object_map_set(data->handler_layout, m);
+             evas_object_map_enable_set(data->handler_layout, EINA_TRUE);
+             evas_map_free(m);
+             evas_object_show(data->handler_layout);
           }
+
+        if (bar_pos_v > 0)
+          _eext_circle_object_item_angle_set(bg_item, VERTICAL_BAR_ANGLE_MAX_SIZE);
         else
+          _eext_circle_object_item_angle_set(bg_item, 0.0);
+
+        if (data->handler)
           {
-             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
-                                                        data->vertical_color.r,
-                                                        data->vertical_color.g,
-                                                        data->vertical_color.b,
-                                                        data->vertical_color.a,
-                                                        EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
-             _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
+             data->handler_shown = EINA_TRUE;
+             elm_layout_signal_emit(data->handler_layout, "elm,state,handler,visible", "elm");
+          }
+        else
+          {
+             if (obj->disabled)
+               {
+                  _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+                                                             data->disabled_color.r,
+                                                             data->disabled_color.g,
+                                                             data->disabled_color.b,
+                                                             data->disabled_color.a,
+                                                             EINA_TRUE,
+                                                             0.0, 0.0, 1.0, 1.0);
+                  _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
+                                                             data->disabled_bg_color.r,
+                                                             data->disabled_bg_color.g,
+                                                             data->disabled_bg_color.b,
+                                                             data->disabled_bg_color.a,
+                                                             EINA_TRUE,
+                                                             0.0, 0.0, 1.0, 1.0);
+               }
+             else
+               {
+                  //ONEUI1.5(04July2019): Support different color with bezel
+                  if (data->bezel_on)
+                    {
+                       _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+                                                            data->bezel_vertical_color.r,
+                                                            data->bezel_vertical_color.g,
+                                                            data->bezel_vertical_color.b,
+                                                            data->bezel_vertical_color.a,
+                                                            EINA_TRUE,
+                                                            0.0, 0.0, 1.0, 1.0);
+                    }
+                  else
+                  //
+                    {
+                       _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+                                                             data->vertical_color.r,
+                                                             data->vertical_color.g,
+                                                             data->vertical_color.b,
+                                                             data->vertical_color.a,
+                                                             EINA_TRUE,
+                                                             0.0, 0.0, 1.0, 1.0);
+                    }
+                  _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
                                                         data->vertical_bg_color.r,
                                                         data->vertical_bg_color.g,
                                                         data->vertical_bg_color.b,
                                                         data->vertical_bg_color.a,
                                                         EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
+                                                        0.0, 0.0, 1.0, 1.0);
+               }
           }
      }
    else
@@ -278,7 +417,7 @@ _eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj,
    bg_item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
 
    if ((content_w > 0.0) && (viewport_w > 0.0) &&
-       (data->policy_h != ELM_SCROLLER_POLICY_OFF))
+       (data->policy_h != ELM_SCROLLER_POLICY_OFF) && (viewport_w < content_w))
      {
         if (content_w > viewport_w)
           {
@@ -288,15 +427,12 @@ _eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj,
                 bar_size_h = HORIZONTAL_BAR_ANGLE_MAX_SIZE;
              if (bar_size_h < HORIZONTAL_BAR_ANGLE_MIN_SIZE)
                 bar_size_h = HORIZONTAL_BAR_ANGLE_MIN_SIZE;
+
+             bar_pos_h = (HORIZONTAL_BAR_ANGLE_RANGE - bar_size_h) * position_x / (content_w - viewport_w);
           }
         else
            bar_size_h = HORIZONTAL_BAR_ANGLE_MAX_SIZE;
 
-        if (obj->mirrored_state == EEXT_CIRCLE_MIRRORED_CONFIG)
-          is_mirrored = elm_config_mirrored_get();
-        else if (obj->mirrored_state == EEXT_CIRCLE_MIRRORED_ON)
-          is_mirrored = EINA_TRUE;
-
         if (is_mirrored)
           bar_pos_h = (HORIZONTAL_BAR_ANGLE_RANGE / (double)content_w) * ((double)content_w - ((double)position_x + (double)viewport_w));
         else
@@ -306,6 +442,11 @@ _eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj,
         _eext_circle_object_item_angle_offset_set(item, bar_pos_h);
         _eext_circle_object_item_angle_set(item, bar_size_h);
 
+        if (bar_size_h > 0)
+          _eext_circle_object_item_angle_set(bg_item, HORIZONTAL_BAR_ANGLE_MAX_SIZE);
+        else
+          _eext_circle_object_item_angle_set(bg_item, 0.0);
+
         if (obj->disabled)
           {
              _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
@@ -314,31 +455,46 @@ _eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj,
                                                         data->disabled_color.b,
                                                         data->disabled_color.a,
                                                         EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
+                                                        0.0, 0.0, 1.0, 1.0);
              _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
                                                         data->disabled_bg_color.r,
                                                         data->disabled_bg_color.g,
                                                         data->disabled_bg_color.b,
                                                         data->disabled_bg_color.a,
                                                         EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
+                                                        0.0, 0.0, 1.0, 1.0);
           }
         else
           {
-             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+            //ONEUI1.5(04July2019): Support different color with bezel
+             if (data->bezel_on)
+               {
+                  _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+                                                       data->bezel_horizontal_color.r,
+                                                       data->bezel_horizontal_color.g,
+                                                       data->bezel_horizontal_color.b,
+                                                       data->bezel_horizontal_color.a,
+                                                       EINA_TRUE,
+                                                       0.0, 0.0, 1.0, 1.0);
+               }
+             //
+             else
+               {
+                  _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
                                                         data->horizontal_color.r,
                                                         data->horizontal_color.g,
                                                         data->horizontal_color.b,
                                                         data->horizontal_color.a,
                                                         EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
+                                                        0.0, 0.0, 1.0, 1.0);
+               }
              _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
                                                         data->horizontal_bg_color.r,
                                                         data->horizontal_bg_color.g,
                                                         data->horizontal_bg_color.b,
                                                         data->horizontal_bg_color.a,
                                                         EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
+                                                        0.0, 0.0, 1.0, 1.0);
           }
      }
    else
@@ -348,6 +504,7 @@ _eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj,
      }
 
    if ((hide_waiting_time > 0.0) &&
+       (!data->handler_drag) &&
        ((data->policy_v == ELM_SCROLLER_POLICY_AUTO) ||
         (data->policy_h == ELM_SCROLLER_POLICY_AUTO)))
      {
@@ -360,12 +517,9 @@ _eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj,
      }
 }
 
-//C# FIXME: Optimize the code
 static void
-_scroll_cb(void *data EINA_UNUSED, const Efl_Event *ev)
+_update_scrollbar(Eext_Circle_Object *circle_obj, double hide_waiting_time)
 {
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
    EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
 
    if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
@@ -373,7 +527,7 @@ _scroll_cb(void *data EINA_UNUSED, const Efl_Event *ev)
      return;
 
    _eext_circle_object_scroller_scrollbar_update(circle_obj,
-                                                 0.3);
+                                                 hide_waiting_time);
 }
 
 static void
@@ -383,33 +537,30 @@ _eext_circle_object_scroller_scroll_cb(void *data,
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
 
-   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
-
-   if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
-       (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
-     return;
-
-   _eext_circle_object_scroller_scrollbar_update(circle_obj,
-                                                 SCROLL_BAR_HIDE_WAITTING_TIME);
+   _update_scrollbar(circle_obj, SCROLL_BAR_HIDE_WAITTING_TIME);
 }
 
 static void
-_eext_circle_object_scroller_show_cb(void *data,
-                                     Evas *e,
+_eext_circle_object_scroller_resume_cb(void *data,
                                      Evas_Object *obj,
                                      void *event_info)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
 
-   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
+   _update_scrollbar(circle_obj, SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+}
 
-   if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
-       (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
-     return;
+//ONEUI1.5(11JUN2019): Update scrollbar size on viewport resize
+static void
+_eext_circle_object_scroller_viewport_resize_cb(void *data,
+                                                Evas_Object *obj,
+                                                void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
 
-   _eext_circle_object_scroller_scrollbar_update(circle_obj,
-                                                 SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+   _update_scrollbar(circle_obj, SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
 }
+//
 
 static void
 _eext_circle_object_scroller_content_resize_cb(void *data,
@@ -418,14 +569,445 @@ _eext_circle_object_scroller_content_resize_cb(void *data,
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
 
+   _update_scrollbar(circle_obj, SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+}
+
+static Eina_Bool
+_eext_circle_object_scroller_can_scroll(Elm_Scrollable_Smart_Interface_Data *sid, int dir)
+{
+   Evas_Coord mx = 0, my = 0, px = 0, py = 0, minx = 0, miny = 0;
+
+   if (!sid->pan_obj) return EINA_FALSE;
+
+   elm_obj_pan_pos_max_get(sid->pan_obj, &mx, &my);
+   elm_obj_pan_pos_min_get(sid->pan_obj, &minx, &miny);
+   elm_obj_pan_pos_get(sid->pan_obj, &px, &py);
+
+   LOGE("[%p] mx(%d), my(%d), minx(%d), miny(%d), px(%d), py(%d)", sid->obj, mx, my, minx, miny, px, py);
+   switch (dir)
+     {
+      case 0:
+        if (px > minx) return EINA_TRUE;
+        break;
+
+      case 1:
+        if ((px - minx) < mx) return EINA_TRUE;
+        break;
+
+      case 2:
+        if (py > miny) return EINA_TRUE;
+        break;
+
+      case 3:
+        if ((py - miny) < my) return EINA_TRUE;
+        break;
+
+      default:
+        break;
+     }
+   return EINA_FALSE;
+}
+
+static void
+_eext_circle_object_scroller_scroll_animatioin_stop_cb(void *data,
+                                               Evas_Object *obj,
+                                               void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
    EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
 
-   if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
-       (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
+   Evas_Object *scroller = circle_obj->widget_object;
+
+   EEXT_CIRCLE_OBJECT_SCROLLER_SCROLL_IFACE_DATA_GET(scroller, sid);
+   if (sid == NULL) return ;
+
+   int pagenumber_h = 0, pagenumber_v = 0;
+   int last_pagenumber_v = 0, last_pagenumber_h = 0;
+   //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation
+   Evas_Object *top_widget = NULL;
+   if (__elm_product_theme_is_loaded())
+     top_widget = elm_object_top_widget_get(scroller);
+   //
+
+   elm_scroller_last_page_get(scroller, &last_pagenumber_h, &last_pagenumber_v);
+   elm_scroller_current_page_get(scroller, &pagenumber_h, &pagenumber_v);
+
+   LOGE("[%p] detent_count(%d) pagenumber_v(%d), pagenumber_h(%d)", scroller, sid->rotary_animation_info.detent_count, pagenumber_v, pagenumber_h);
+
+   if (sid->pagesize_h > 0)
+     {
+        if (sid->rotary_animation_info.current_page != pagenumber_h)
+          {
+             if (sid->rotary_animation_info.detent_count != 0)
+               {
+                  if ((sid->rotary_animation_info.current_page == 0) && (sid->rotary_animation_info.detent_count < 0))
+                     sid->rotary_animation_info.detent_count = 0;
+                  else if((sid->rotary_animation_info.current_page == last_pagenumber_h)  && (sid->rotary_animation_info.detent_count > 0))
+                     sid->rotary_animation_info.detent_count = 0;
+                  else
+                    {
+                       if ((sid->rotary_animation_info.detent_count > 0 && (sid->rotary_animation_info.current_page - pagenumber_h) > 0) ||
+                            (sid->rotary_animation_info.detent_count < 0 && (sid->rotary_animation_info.current_page - pagenumber_h) < 0))
+                          sid->rotary_animation_info.detent_count = 0;
+                       else
+                          sid->rotary_animation_info.detent_count += (sid->rotary_animation_info.current_page - pagenumber_h);
+
+                       if (pagenumber_h + sid->rotary_animation_info.detent_count < 0)
+                         sid->rotary_animation_info.detent_count++;
+                       else if(pagenumber_h + sid->rotary_animation_info.detent_count > last_pagenumber_h)
+                         sid->rotary_animation_info.detent_count--;
+                    }
+               }
+             sid->rotary_animation_info.current_page = pagenumber_h;
+             LOGE("[%p] CurrentPage(%d)", scroller, sid->rotary_animation_info.current_page);
+       }
+     else
+       {
+          sid->rotary_animation_info.detent_count = 0;
+       }
+     //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation
+     if (top_widget)
+       evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)1);
+     //
+   }
+   else if (sid->pagesize_v > 0)
+     {
+        if (sid->rotary_animation_info.current_page != pagenumber_v)
+          {
+             if (sid->rotary_animation_info.detent_count != 0)
+               {
+                  if ((sid->rotary_animation_info.current_page == 0) && (sid->rotary_animation_info.detent_count < 0))
+                     sid->rotary_animation_info.detent_count = 0;
+                  else if ((sid->rotary_animation_info.current_page == last_pagenumber_v)  && (sid->rotary_animation_info.detent_count > 0))
+                     sid->rotary_animation_info.detent_count = 0;
+                  else
+                    {
+                       if ((sid->rotary_animation_info.detent_count > 0 && (sid->rotary_animation_info.current_page - pagenumber_v) > 0) ||
+                            (sid->rotary_animation_info.detent_count < 0 && (sid->rotary_animation_info.current_page - pagenumber_v) < 0))
+                          sid->rotary_animation_info.detent_count = 0;
+                       else
+                          sid->rotary_animation_info.detent_count += (sid->rotary_animation_info.current_page - pagenumber_v);
+
+                       if (pagenumber_v + sid->rotary_animation_info.detent_count < 0)
+                         sid->rotary_animation_info.detent_count++;
+                       else if(pagenumber_v + sid->rotary_animation_info.detent_count > last_pagenumber_v)
+                         sid->rotary_animation_info.detent_count--;
+                    }
+               }
+             sid->rotary_animation_info.current_page = pagenumber_v;
+             LOGE("[%p] CurrentPage(%d)", scroller, sid->rotary_animation_info.current_page);
+          }
+        else
+          {
+             sid->rotary_animation_info.detent_count = 0;
+          }
+        //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation
+        if (top_widget)
+          evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)1);
+        //
+     }
+   else
+     {
+        if (sid->rotary_animation_info.detent_count != 0)
+          sid->rotary_animation_info.detent_count = 0;
+     }
+}
+
+static void
+_update_color_info(Eext_Circle_Object *obj)
+{
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
+   int r, g, b, a;
+
+   if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object), data->scrollbar_color_class, &r, &g, &b, &a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     {
+        r = SCROLL_BAR_COLOR_R;
+        g = SCROLL_BAR_COLOR_G;
+        b = SCROLL_BAR_COLOR_B;
+        a = SCROLL_BAR_COLOR_A;
+     }
+   data->vertical_color.r = data->horizontal_color.r = r;
+   data->vertical_color.g = data->horizontal_color.g = g;
+   data->vertical_color.b = data->horizontal_color.b = b;
+   data->vertical_color.a = data->horizontal_color.a = a;
+
+   if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object), data->scrollbar_bg_color_class, &r, &g, &b, &a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     {
+        r = SCROLL_BAR_BG_COLOR_R;
+        g = SCROLL_BAR_BG_COLOR_G;
+        b = SCROLL_BAR_BG_COLOR_B;
+        a = SCROLL_BAR_BG_COLOR_A;
+     }
+   data->vertical_bg_color.r = data->horizontal_bg_color.r = r;
+   data->vertical_bg_color.g = data->horizontal_bg_color.g = g;
+   data->vertical_bg_color.b = data->horizontal_bg_color.b = b;
+   data->vertical_bg_color.a = data->horizontal_bg_color.a = a;
+
+   if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object), data->bezel_scrollbar_color_class, &r, &g, &b, &a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     {
+        r = SCROLL_BAR_COLOR_R;
+        g = SCROLL_BAR_COLOR_G;
+        b = SCROLL_BAR_COLOR_B;
+        a = SCROLL_BAR_COLOR_A;
+     }
+   data->bezel_vertical_color.r = data->bezel_horizontal_color.r = r;
+   data->bezel_vertical_color.g = data->bezel_horizontal_color.g = g;
+   data->bezel_vertical_color.b = data->bezel_horizontal_color.b = b;
+   data->bezel_vertical_color.a = data->bezel_horizontal_color.a = a;
+
+   data->disabled_color.r = SCROLL_BAR_COLOR_DISABLED_R;
+   data->disabled_color.g = SCROLL_BAR_COLOR_DISABLED_G;
+   data->disabled_color.b = SCROLL_BAR_COLOR_DISABLED_B;
+   data->disabled_color.a = SCROLL_BAR_COLOR_DISABLED_A;
+   data->disabled_bg_color.r = SCROLL_BAR_BG_COLOR_DISABLED_R;
+   data->disabled_bg_color.g = SCROLL_BAR_BG_COLOR_DISABLED_G;
+   data->disabled_bg_color.b = SCROLL_BAR_BG_COLOR_DISABLED_B;
+   data->disabled_bg_color.a = SCROLL_BAR_BG_COLOR_DISABLED_A;
+}
+
+static void
+_eext_circle_object_scroller_change_color_signal_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Evas_Object *scroller = circle_obj->widget_object;
+   Eext_Circle_Object_Item *item = NULL;
+   if (!source) return;
+   int a;
+
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
+   //ONEUI1.5(04July2019): Support different color with bezel
+   if (widget_data->bezel_scrollbar_color_class && !strcmp(source, widget_data->bezel_scrollbar_color_class))
+     {
+        edje_object_color_class_get(elm_layout_edje_get(scroller), widget_data->bezel_scrollbar_color_class,
+                                                        &widget_data->bezel_vertical_color.r,
+                                                        &widget_data->bezel_vertical_color.g,
+                                                        &widget_data->bezel_vertical_color.b,
+                                                        &widget_data->bezel_vertical_color.a,
+                                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+        widget_data->bezel_horizontal_color.r = widget_data->bezel_vertical_color.r;
+        widget_data->bezel_horizontal_color.g = widget_data->bezel_vertical_color.g;
+        widget_data->bezel_horizontal_color.b = widget_data->bezel_vertical_color.b;
+        widget_data->bezel_horizontal_color.a = widget_data->bezel_vertical_color.a;
+     }
+   //
+   else if (widget_data->scrollbar_color_class && !strcmp(source, widget_data->scrollbar_color_class))
+     {
+        edje_object_color_class_get(elm_layout_edje_get(scroller), widget_data->scrollbar_color_class, &widget_data->vertical_color.r, &widget_data->vertical_color.g, &widget_data->vertical_color.b, &widget_data->vertical_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+        widget_data->horizontal_color.r = widget_data->vertical_color.r;
+        widget_data->horizontal_color.g = widget_data->vertical_color.g;
+        widget_data->horizontal_color.b = widget_data->vertical_color.b;
+        widget_data->horizontal_color.a = widget_data->vertical_color.a;
+
+        if (widget_data->policy_v != ELM_SCROLLER_POLICY_OFF)
+          {
+             item = _eext_circle_object_item_get(circle_obj, VERTICAL_BAR_NAME);
+             //ONEUI1.5(31July2019): Fix VI effect logic about hide
+             _eext_circle_object_item_color_get(item, NULL, NULL, NULL, &a);
+             if (!a)
+               _eext_circle_object_item_color_set(item, widget_data->vertical_color.r, widget_data->vertical_color.g, widget_data->vertical_color.b, 0);
+             else
+             //
+               _eext_circle_object_item_color_set(item, widget_data->vertical_color.r, widget_data->vertical_color.g, widget_data->vertical_color.b, widget_data->vertical_color.a);
+          }
+        if (widget_data->policy_h != ELM_SCROLLER_POLICY_OFF)
+          {
+             item = _eext_circle_object_item_get(circle_obj, HORIZONTAL_BAR_NAME);
+             //ONEUI1.5(31July2019): Fix VI effect logic about hide
+             _eext_circle_object_item_color_get(item, NULL, NULL, NULL, &a);
+             if (!a)
+               _eext_circle_object_item_color_set(item, widget_data->horizontal_color.r, widget_data->horizontal_color.g, widget_data->horizontal_color.b, 0);
+             else
+             //
+               _eext_circle_object_item_color_set(item, widget_data->horizontal_color.r, widget_data->horizontal_color.g, widget_data->horizontal_color.b, widget_data->horizontal_color.a);
+          }
+     }
+   else if (widget_data->scrollbar_bg_color_class && !strcmp(source, widget_data->scrollbar_bg_color_class))
+     {
+        edje_object_color_class_get(elm_layout_edje_get(scroller), widget_data->scrollbar_bg_color_class, &widget_data->vertical_bg_color.r, &widget_data->vertical_bg_color.g, &widget_data->vertical_bg_color.b, &widget_data->vertical_bg_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+        widget_data->horizontal_bg_color.r = widget_data->vertical_bg_color.r;
+        widget_data->horizontal_bg_color.g = widget_data->vertical_bg_color.g;
+        widget_data->horizontal_bg_color.b = widget_data->vertical_bg_color.b;
+        widget_data->horizontal_bg_color.a = widget_data->vertical_bg_color.a;
+
+        if (widget_data->policy_v != ELM_SCROLLER_POLICY_OFF)
+          {
+             item = _eext_circle_object_item_get(circle_obj, VERTICAL_BAR_BG_NAME);
+             //ONEUI1.5(31July2019): Fix VI effect logic about hide
+             _eext_circle_object_item_color_get(item, NULL, NULL, NULL, &a);
+             if (!a)
+               _eext_circle_object_item_color_set(item, widget_data->vertical_bg_color.r, widget_data->vertical_bg_color.g, widget_data->vertical_bg_color.b, 0);
+             else
+             //
+               _eext_circle_object_item_color_set(item, widget_data->vertical_bg_color.r, widget_data->vertical_bg_color.g, widget_data->vertical_bg_color.b, widget_data->vertical_bg_color.a);
+          }
+
+        if (widget_data->policy_h != ELM_SCROLLER_POLICY_OFF)
+          {
+             item = _eext_circle_object_item_get(circle_obj, HORIZONTAL_BAR_BG_NAME);
+             //ONEUI1.5(31July2019): Fix VI effect logic about hide
+             _eext_circle_object_item_color_get(item, NULL, NULL, NULL, &a);
+             if (!a)
+               _eext_circle_object_item_color_set(item, widget_data->horizontal_bg_color.r, widget_data->horizontal_bg_color.g, widget_data->horizontal_bg_color.b, 0);
+             else
+             //
+               _eext_circle_object_item_color_set(item, widget_data->horizontal_bg_color.r , widget_data->horizontal_bg_color.g, widget_data->horizontal_bg_color.b, widget_data->horizontal_bg_color.a);
+          }
+     }
+}
+
+static void
+_eext_circle_object_scroller_deactivated_cb(void *data,
+                                          Evas_Object *obj,
+                                         void *event_info)
+{
+    if (__elm_product_theme_is_loaded())
+      {
+         Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+         if(!circle_obj) return;
+
+         Evas_Object *scroller = circle_obj->widget_object;
+         if(!scroller) return;
+
+         Evas_Object *top_widget = elm_object_top_widget_get(scroller);
+         if (top_widget)
+           evas_object_data_del(top_widget, BEZEL_SCROLL);
+      }
+}
+
+static void
+_handler_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   Eext_Circle_Object_Scroller_Data *widget_data = (Eext_Circle_Object_Scroller_Data *) data;
+   widget_data->handler_shown = EINA_FALSE;
+}
+
+static void
+_mouse_down_cb(void *data,
+               Evas *evas,
+               Evas_Object *scroller,
+               void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Evas_Event_Mouse_Down *ev = event_info;
+   double angle;
+
+   if (circle_obj->disabled) return;
+
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
+
+   if (!widget_data->handler_shown) return;
+
+   Eina_Bool is_mirrored = _eext_circle_object_scroller_mirror_mode_get(circle_obj);
+   Evas_Coord r = 0, c = 0;
+   evas_object_geometry_get(scroller, NULL, NULL, &r, NULL);
+
+   r /= 2;
+   c = r;
+   r -= 2 * SCROLL_BAR_HANDLER_WIDTH_SIZE;
+
+   if (is_mirrored)
+     angle = -atan2((double)(ev->canvas.y - c), (double)(c - ev->canvas.x));
+   else
+     angle = atan2((double)(ev->canvas.y - c), (double)(ev->canvas.x - c));
+   angle *= 180 / M_PI; // convert from radians to degrees
+   if (fabs(widget_data->handler_angle - angle) > VERTICAL_BAR_ANGLE_HANDLER_SIZE) return;
+
+   int point = sqrt(pow(c - ev->canvas.x, 2) + pow(c - ev->canvas.y, 2));
+
+   if (point < r) return;
+
+   if ((!is_mirrored && ev->canvas.x < c) || (is_mirrored && ev->canvas.x > c))
      return;
 
-   _eext_circle_object_scroller_scrollbar_update(circle_obj,
-                                                 SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+   if (widget_data->bar_hide_timer)
+     {
+        ecore_timer_del(widget_data->bar_hide_timer);
+        widget_data->bar_hide_timer = NULL;
+     }
+
+   widget_data->handler_drag = EINA_TRUE;
+   elm_object_scroll_freeze_push(circle_obj->widget_object);
+}
+
+static void
+_mouse_up_cb(void *data,
+               Evas *evas,
+               Evas_Object *scroller,
+               void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
+
+   if (circle_obj->disabled) return;
+
+   elm_object_scroll_freeze_pop(circle_obj->widget_object);
+   widget_data->handler_drag = EINA_FALSE;
+
+   if (widget_data->bar_hide_timer)
+     {
+        ecore_timer_del(widget_data->bar_hide_timer);
+        widget_data->bar_hide_timer = NULL;
+     }
+
+   widget_data->bar_hide_timer = ecore_timer_add(SCROLL_BAR_HIDE_WAITTING_TIME,
+                                                 _eext_circle_object_scroller_scrollbar_policy_hide_cb,
+                                                 circle_obj);
+}
+
+static void
+_mouse_move_cb(void *data,
+               Evas *evas,
+               Evas_Object *scroller,
+               void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Evas_Event_Mouse_Move *ev = event_info;
+   double angle;
+   Eina_Bool is_mirrored;
+
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
+
+   if (circle_obj->disabled) return;
+
+   //ONEUI1.5(04July2019): Support different color with bezel
+   if (__elm_product_theme_is_loaded())
+     widget_data->bezel_on = EINA_FALSE;
+   //
+
+   //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation
+   if (__elm_product_theme_is_loaded())
+     {
+        Evas_Object *top_widget = elm_object_top_widget_get(scroller);
+        if (top_widget)
+          evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)1);
+     }
+   //
+   if (!widget_data->handler_drag) return;
+
+   is_mirrored = _eext_circle_object_scroller_mirror_mode_get(circle_obj);
+   Evas_Coord ch, px, py, vw, vh, region;
+
+   elm_scroller_child_size_get(circle_obj->widget_object, NULL, &ch);
+   elm_scroller_region_get(circle_obj->widget_object, &px, &py, &vw, &vh);
+
+   Evas_Coord c = vw / 2;
+   if (is_mirrored)
+     angle = atan((double)(c - ev->cur.canvas.y) / (double)(c - ev->cur.canvas.x));
+   else
+     angle = atan((double)(c - ev->cur.canvas.y) / (double)(ev->cur.canvas.x - c));
+
+   double ratio = ((M_PI / 6.0) - angle) / (M_PI / 3.0);
+
+   ratio = ratio > 1.0 ? 1.0 : ratio;
+   ratio = ratio < 0.0 ? 0.0 : ratio;
+
+   if ((ev->cur.canvas.x < c && !is_mirrored) ||
+       (ev->cur.canvas.x > c && is_mirrored))
+      ratio = 1.0 - ratio;
+
+   region = (int) (ch * ratio);
+   elm_scroller_region_show(circle_obj->widget_object, px, region, vw, vh);
 }
 
 static Eina_Bool
@@ -441,10 +1023,21 @@ _eext_circle_object_scroller_rotary_changed_cb(void *data,
    int d = (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) ? 1 : -1;
    Elm_Scroller_Movement_Block scroller_block;
    Eina_Bool scroll_locked_x, scroll_locked_y;
+   Evas_Coord px = 0, py = 0;
+   Evas_Coord minx = 0, miny = 0, mx = 0, my = 0;
    Eina_Bool is_mirrored = EINA_FALSE;
 
+   if (scroller)
+      LOGE("[%p : %s] rotary callabck is called.", scroller, elm_object_widget_type_get(scroller));
+
    EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return EINA_TRUE;
 
+   EEXT_CIRCLE_OBJECT_SCROLLER_SCROLL_IFACE_DATA_GET(scroller, sid);
+   if (sid == NULL)
+      return EINA_TRUE;
+
+   if (sid->obj)
+
    if (elm_object_scroll_freeze_get(scroller))
      return EINA_TRUE;
 
@@ -456,6 +1049,20 @@ _eext_circle_object_scroller_rotary_changed_cb(void *data,
      }
    if (obj == circle_obj->main_obj)
      circle_obj->is_propagated = EINA_TRUE;
+   //ONEUI1.5(04July2019): Support different color with bezel
+   if (__elm_product_theme_is_loaded())
+     widget_data->bezel_on = EINA_TRUE;
+   //
+
+   if (circle_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_CONFIG)
+      is_mirrored = elm_config_mirrored_get();
+   else if (circle_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_ON)
+      is_mirrored = EINA_TRUE;
+
+   elm_obj_pan_pos_max_get(sid->pan_obj, &mx, &my);
+   elm_obj_pan_pos_min_get(sid->pan_obj, &minx, &miny);
+
+   elm_interface_scrollable_content_pos_get(sid->obj, &px, &py);
 
    elm_scroller_page_size_get(scroller, &h_pagesize, &v_pagesize);
    elm_scroller_child_size_get(scroller, &cw, &ch);
@@ -465,74 +1072,227 @@ _eext_circle_object_scroller_rotary_changed_cb(void *data,
    scroll_locked_x = elm_object_scroll_lock_x_get(scroller);
    scroll_locked_y = elm_object_scroll_lock_y_get(scroller);
 
-   //C# FIXME: Apply center alignment
-   if (efl_isa(scroller, EFL_UI_LEGACY_INTERFACE))
+   LOGE("[%p] block(%d) scroll_locked_x(%d), scroll_locked_y(%d) content size(%d, %d) viewport size(%d, %d)", scroller, scroller_block, scroll_locked_x, scroll_locked_y, cw, ch, w, h);
+
+   if ((h_pagesize > 0) || (v_pagesize > 0))
      {
-        if ((h_pagesize > 0) || (v_pagesize > 0))
-          {
-             int h_current_page, v_current_page;
+        int last_pagenumber_v = 0, last_pagenumber_h = 0;
+        int pagenumber_v = 0, pagenumber_h = 0;
 
-             // Handle scroll per page
-             elm_scroller_current_page_get(scroller, &h_current_page, &v_current_page);
+        elm_scroller_last_page_get(scroller, &last_pagenumber_h, &last_pagenumber_v);
 
-             if (!scroll_locked_y &&
-                 !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
-                 (ch > h) && (v_pagesize > 0))
-               {
-                  v_current_page += d;
-               }
-             else if (!scroll_locked_x &&
-                      !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) &&
-                      (cw > w) && (h_pagesize > 0))
+        // Handle scroll per page
+        if (!scroll_locked_y &&
+            !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
+            (ch > h) && (v_pagesize > 0))
+          {
+             pagenumber_v = sid->rotary_animation_info.current_page + sid->rotary_animation_info.detent_count + d;
+             LOGE("[%p] CurrentPage(%d) DetentValue(%d) DetentCount(%d)", scroller, sid->rotary_animation_info.current_page, d, sid->rotary_animation_info.detent_count);
+
+             if (pagenumber_v < 0) pagenumber_v = 0;
+             if (pagenumber_v > last_pagenumber_v) pagenumber_v = last_pagenumber_v;
+             if (_eext_circle_object_scroller_can_scroll(sid, UP) ||_eext_circle_object_scroller_can_scroll(sid, DOWN))
                {
-                  h_current_page += d;
+                  //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation
+                  Evas_Object *top_widget = NULL;
+                  if (__elm_product_theme_is_loaded())
+                    top_widget = elm_object_top_widget_get(scroller);
+                  //
+                  if (!_eext_circle_object_scroller_can_scroll(sid, UP) && d < 0)
+                    {
+                       if(!sid->loop_v)
+                         {
+                            sid->rotary_animation_info.detent_count = 0;
+                            edje_object_signal_emit(sid->edje_obj, "elm,edge,top,rotary,detented", "elm");
+                            LOGE("[%p] edge top", scroller);
+                         }
+                       else
+                         {
+                            //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation
+                            if (top_widget) evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)2);
+                            //
+                            elm_scroller_page_bring_in(scroller, 0, pagenumber_v);
+                         }
+                    }
+                  else if (!_eext_circle_object_scroller_can_scroll(sid, DOWN) && d > 0)
+                    {
+                       if(!sid->loop_v)
+                         {
+                            sid->rotary_animation_info.detent_count = 0;
+                            edje_object_signal_emit(sid->edje_obj, "elm,edge,bottom,rotary,detented", "elm");
+                            LOGE("[%p] edge bottom", scroller);
+                         }
+                       else
+                         {
+                            //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation
+                            if (top_widget) evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)2);
+                            //
+                            elm_scroller_page_bring_in(scroller, 0, pagenumber_v);
+                         }
+                    }
+                  else if((pagenumber_v >= 0) && (pagenumber_v <= last_pagenumber_v))
+                    {
+                         if(!sid->loop_v)
+                           {
+                              sid->rotary_animation_info.detent_count += d;
+                              //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation
+                              if (top_widget) evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)2);
+                              //
+                              elm_scroller_page_bring_in(scroller, 0, pagenumber_v);
+                           }
+                         else
+                           {
+                              //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation
+                              if (top_widget) evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)2);
+                              //
+                              elm_scroller_page_bring_in(scroller, 0, pagenumber_v);
+                           }
+                    }
                }
-
-             if (v_current_page < 0) v_current_page = 0;
-             if (h_current_page < 0) h_current_page = 0;
-
-             elm_scroller_page_bring_in(scroller, h_current_page,v_current_page);
           }
-        else
+        else if (!scroll_locked_x &&
+                 !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) &&
+                 (cw > w) && (h_pagesize > 0))
           {
-             // Handle scroll
-             if (!scroll_locked_y &&
-                 !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
-                 (ch > h))
-               {
-                  y += d * widget_data->step_y;
-               }
-             else if (!scroll_locked_x &&
-                      !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) &&
-                      (cw > w))
-               {
-                  if (circle_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_CONFIG)
-                    is_mirrored = elm_config_mirrored_get();
-                  else if (circle_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_ON)
-                    is_mirrored = EINA_TRUE;
+             if (circle_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_CONFIG)
+                is_mirrored = elm_config_mirrored_get();
+             else if (circle_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_ON)
+                is_mirrored = EINA_TRUE;
 
-                  if (is_mirrored)
-                    d *= -1;
+             int mirroed_d = d;
 
-                  x += d * widget_data->step_x;
-               }
+             if (is_mirrored)
+                mirroed_d *= -1;
 
-             if (y < 0) y = 0;
-             if (x < 0) x = 0;
+             if (is_mirrored == elm_object_mirrored_get(scroller))
+                pagenumber_h = sid->rotary_animation_info.current_page + sid->rotary_animation_info.detent_count + d;
+             else
+                pagenumber_h = sid->rotary_animation_info.current_page + sid->rotary_animation_info.detent_count - d;
+             LOGE("[%p] CurrentPage(%d) DetentValue(%d) DetentCount(%d)", scroller, sid->rotary_animation_info.current_page, d, sid->rotary_animation_info.detent_count);
 
-             elm_scroller_region_bring_in(scroller, x, y, w, h);
+             if (pagenumber_h < 0) pagenumber_h = 0;
+             if (pagenumber_h > last_pagenumber_h) pagenumber_h = last_pagenumber_h;
+             if (_eext_circle_object_scroller_can_scroll(sid, LEFT) ||_eext_circle_object_scroller_can_scroll(sid, RIGHT))
+               {
+                  //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation
+                  Evas_Object *top_widget = NULL;
+                  if (__elm_product_theme_is_loaded())
+                    top_widget = elm_object_top_widget_get(scroller);
+                  //
+                  if (!_eext_circle_object_scroller_can_scroll(sid, LEFT) && mirroed_d < 0)
+                    {
+                       if(!sid->loop_h)
+                         {
+                            sid->rotary_animation_info.detent_count = 0;
+                            edje_object_signal_emit(sid->edje_obj, "elm,edge,left,rotary,detented", "elm");
+                            LOGE("[%p] edge left", scroller);
+                         }
+                       else
+                         {
+                            //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation
+                            if (top_widget) evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)2);
+                            //
+                            elm_scroller_page_bring_in(scroller, pagenumber_h, 0);
+                         }
+                    }
+                  else if (!_eext_circle_object_scroller_can_scroll(sid, RIGHT) && mirroed_d > 0)
+                    {
+                       if(!sid->loop_h)
+                         {
+                            sid->rotary_animation_info.detent_count = 0;
+                            edje_object_signal_emit(sid->edje_obj, "elm,edge,right,rotary,detented", "elm");
+                            LOGE("[%p] edge right", scroller);
+                         }
+                       else
+                         {
+                            //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation
+                            if (top_widget) evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)2);
+                            //
+                            elm_scroller_page_bring_in(scroller, pagenumber_h, 0);
+                         }
+                    }
+                  else if((pagenumber_h >= 0) && (pagenumber_h <= last_pagenumber_h))
+                    {
+                       if (is_mirrored == elm_object_mirrored_get(scroller))
+                          sid->rotary_animation_info.detent_count += d;
+                       else
+                          sid->rotary_animation_info.detent_count -= d;
+                       LOGE("[%p] bring in %d page", scroller, pagenumber_h);
+
+                       //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation
+                       if (top_widget) evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)2);
+                       //
+                       elm_scroller_page_bring_in(scroller, pagenumber_h, 0);
+                    }
+               }
           }
      }
    else
      {
-        Eina_Position2D pos = efl_ui_scrollable_content_pos_get(scroller);
-        Eina_Rect rect = efl_ui_scrollable_viewport_geometry_get(scroller);
-        if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO)
-          rect.y = pos.y + (d * widget_data->step_y);
-        else
-          rect.x = pos.x + (d * widget_data->step_x);
+        Evas_Coord screensize_w = 0, screensize_h = 0;
+        int move_distance_h = 0, move_distance_v = 0;
+
+        Evas_Object *win = elm_object_top_widget_get(scroller);
+        elm_win_screen_size_get(win, NULL, NULL, &screensize_w, &screensize_h);
 
-        efl_ui_scrollable_scroll(scroller, rect, EINA_TRUE);
+        if ((sid->rotary_animation_info.detent_count < 0 && d > 0) || (sid->rotary_animation_info.detent_count > 0 && d < 0))
+           sid->rotary_animation_info.detent_count = 0;
+
+        sid->rotary_animation_info.detent_count += d;
+
+        move_distance_h = screensize_w * sid->rotary_animation_info.detent_count * 2 /5;
+        move_distance_v = screensize_h * sid->rotary_animation_info.detent_count * 2 /5;
+        // Handle scroll
+        if (!scroll_locked_y &&
+            !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
+            (ch > h))
+          {
+             if (_eext_circle_object_scroller_can_scroll(sid, UP) ||_eext_circle_object_scroller_can_scroll(sid, DOWN))
+               {
+                  if (!_eext_circle_object_scroller_can_scroll(sid, UP) && move_distance_v < 0)
+                    {
+                       sid->rotary_animation_info.detent_count = 0;
+                       if (py == miny)
+                          edje_object_signal_emit(sid->edje_obj, "elm,edge,top,rotary,detented", "elm");
+                    }
+                  else if (!_eext_circle_object_scroller_can_scroll(sid, DOWN) && move_distance_v > 0)
+                    {
+                       sid->rotary_animation_info.detent_count = 0;
+                       if (py == my)
+                          edje_object_signal_emit(sid->edje_obj, "elm,edge,bottom,rotary,detented", "elm");
+                    }
+                  else
+                    {
+                          elm_scroller_region_bring_in(scroller, px, py + move_distance_v, screensize_w, screensize_h);
+                    }
+               }
+          }
+        else if (!scroll_locked_x &&
+                 !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) &&
+                 (cw > w))
+          {
+             if (_eext_circle_object_scroller_can_scroll(sid, LEFT) ||_eext_circle_object_scroller_can_scroll(sid, RIGHT))
+               {
+             if (is_mirrored)
+                    move_distance_h *= -1;
+                  if (!_eext_circle_object_scroller_can_scroll(sid, LEFT) && move_distance_h < 0)
+                    {
+                       sid->rotary_animation_info.detent_count = 0;
+                       if (px == minx)
+                          edje_object_signal_emit(sid->edje_obj, "elm,edge,left,rotary,detented", "elm");
+                    }
+                  else if (!_eext_circle_object_scroller_can_scroll(sid, RIGHT) && move_distance_h > 0)
+                    {
+                       sid->rotary_animation_info.detent_count = 0;
+                       if (px == mx)
+                          edje_object_signal_emit(sid->edje_obj, "elm,edge,right,rotary,detented", "elm");
+                     }
+                  else
+                    {
+                          elm_scroller_region_bring_in(scroller, px + move_distance_h, py, screensize_w, screensize_h);
+                    }
+               }
+          }
      }
 
    return EINA_TRUE;
@@ -543,12 +1303,34 @@ _eext_circle_object_scroller_del_cb(Eext_Circle_Object *obj)
 {
    EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
 
-   evas_object_event_callback_del_full(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_scroller_show_cb, obj);
    evas_object_smart_callback_del_full(obj->widget_object, "scroll", _eext_circle_object_scroller_scroll_cb, obj);
    evas_object_smart_callback_del_full(obj->widget_object, "content,resize", _eext_circle_object_scroller_content_resize_cb, obj);
+   //ONEUI1.5(11JUN2019): Update scrollbar size on viewport resize
+   evas_object_smart_callback_del_full(obj->widget_object, "viewport,resize", _eext_circle_object_scroller_viewport_resize_cb, obj);
+   //
    eext_rotary_object_event_callback_del(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb);
    eext_rotary_object_event_callback_del(obj->main_obj, _eext_circle_object_scroller_rotary_changed_cb);
-
+   LOGE("[%p] rotary callabck is deleted", obj->widget_object);
+
+   evas_object_smart_callback_del_full(obj->widget_object, "scroll,anim,stop", _eext_circle_object_scroller_scroll_animatioin_stop_cb, obj);
+   evas_object_smart_callback_del_full(obj->widget_object, SIG_SCROLLER_RESUME, _eext_circle_object_scroller_resume_cb, obj);
+   edje_object_signal_callback_del(elm_layout_edje_get(obj->widget_object), "color_class,set", data->scrollbar_color_class, _eext_circle_object_scroller_change_color_signal_cb);
+   edje_object_signal_callback_del(elm_layout_edje_get(obj->widget_object), "color_class,set", data->scrollbar_bg_color_class, _eext_circle_object_scroller_change_color_signal_cb);
+   if (data->scrollbar_color_class) eina_stringshare_del(data->scrollbar_color_class);
+   if (data->scrollbar_bg_color_class) eina_stringshare_del(data->scrollbar_bg_color_class);
+   //ONEUI1.5(04July2019): Support different color with bezel
+   edje_object_signal_callback_del(elm_layout_edje_get(obj->widget_object), "color_class,set",
+                                   data->bezel_scrollbar_color_class, _eext_circle_object_scroller_change_color_signal_cb);
+   if (data->bezel_scrollbar_color_class) eina_stringshare_del(data->bezel_scrollbar_color_class);
+   evas_object_event_callback_del(obj->widget_object, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb);
+   evas_object_smart_callback_del_full(obj->widget_object, SIGNAL_DEACTIVATED, _eext_circle_object_scroller_deactivated_cb, obj);
+   evas_object_smart_callback_del_full(obj->main_obj, SIGNAL_DEACTIVATED, _eext_circle_object_scroller_deactivated_cb, obj);
+   //
+   if (data->handler)
+     {
+        evas_object_event_callback_del(obj->widget_object, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb);
+        evas_object_event_callback_del(obj->widget_object, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb);
+     }
    if (data->bar_hide_timer)
      {
         ecore_timer_del(data->bar_hide_timer);
@@ -568,6 +1350,8 @@ _eext_circle_object_scroller_disabled_cb(Eext_Circle_Object *obj)
 
    if (obj->disabled)
      {
+        if (data->handler)
+          evas_object_hide(data->handler_layout);
         item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
         _eext_circle_object_item_color_set(item,
                                            data->disabled_color.r,
@@ -639,6 +1423,7 @@ _eext_circle_object_scroller_init(Eext_Circle_Object *obj, Evas_Object *scroller
 {
    Eext_Circle_Object_Scroller_Data *data;
    Eext_Circle_Object_Item *item;
+   const char *style = elm_object_style_get(scroller);
 
    obj->widget_type = EEXT_CIRCLE_OBJECT_SCROLLER_TYPE;
    obj->del_func = _eext_circle_object_scroller_del_cb;
@@ -647,29 +1432,36 @@ _eext_circle_object_scroller_init(Eext_Circle_Object *obj, Evas_Object *scroller
    obj->mirrored_state = EEXT_CIRCLE_MIRRORED_CONFIG;
 
    data = (Eext_Circle_Object_Scroller_Data *)calloc(1, sizeof(Eext_Circle_Object_Scroller_Data));
+   if (style && !strncmp(style, HANDLER_STYLE, strlen(HANDLER_STYLE) + 1))
+     data->handler = EINA_TRUE;
+   else
+     data->handler = EINA_FALSE;
+   data->handler_drag = EINA_FALSE;
+   data->handler_layout = NULL;
+   data->handler_angle = 0;
+   data->handler_shown = EINA_FALSE;
    data->policy_v = ELM_SCROLLER_POLICY_AUTO;
    data->policy_h = ELM_SCROLLER_POLICY_AUTO;
    data->line_width = SCROLL_BAR_WIDTH_SIZE;
    data->radius = SCROLL_BAR_RADIUS_SIZE;
    data->step_x = data->step_y = 32;
-   data->vertical_color.r = data->horizontal_color.r = SCROLL_BAR_COLOR_R;
-   data->vertical_color.g = data->horizontal_color.g = SCROLL_BAR_COLOR_G;
-   data->vertical_color.b = data->horizontal_color.b = SCROLL_BAR_COLOR_B;
-   data->vertical_color.a = data->horizontal_color.a = SCROLL_BAR_COLOR_A;
-   data->vertical_bg_color.r = data->horizontal_bg_color.r = SCROLL_BAR_BG_COLOR_R;
-   data->vertical_bg_color.g = data->horizontal_bg_color.g = SCROLL_BAR_BG_COLOR_G;
-   data->vertical_bg_color.b = data->horizontal_bg_color.b = SCROLL_BAR_BG_COLOR_B;
-   data->vertical_bg_color.a = data->horizontal_bg_color.a = SCROLL_BAR_BG_COLOR_A;
-   data->disabled_color.r = SCROLL_BAR_COLOR_DISABLED_R;
-   data->disabled_color.g = SCROLL_BAR_COLOR_DISABLED_G;
-   data->disabled_color.b = SCROLL_BAR_COLOR_DISABLED_B;
-   data->disabled_color.a = SCROLL_BAR_COLOR_DISABLED_A;
-   data->disabled_bg_color.r = SCROLL_BAR_BG_COLOR_DISABLED_R;
-   data->disabled_bg_color.g = SCROLL_BAR_BG_COLOR_DISABLED_G;
-   data->disabled_bg_color.b = SCROLL_BAR_BG_COLOR_DISABLED_B;
-   data->disabled_bg_color.a = SCROLL_BAR_BG_COLOR_DISABLED_A;
+
+   data->bezel_scrollbar_color_class = STR_DUP(edje_object_data_get(elm_layout_edje_get(obj->widget_object), "bezel_bar_color_class"));
+   data->scrollbar_color_class = STR_DUP(edje_object_data_get(elm_layout_edje_get(obj->widget_object), "bar_color_class"));
+   data->scrollbar_bg_color_class = STR_DUP(edje_object_data_get(elm_layout_edje_get(obj->widget_object), "bar_bg_color_class"));
+
+   if (data->handler)
+     {
+        data->handler_layout = elm_layout_add(scroller);
+        elm_layout_theme_set(data->handler_layout, "scroller", "base", "prod/handler/indicator");
+        evas_object_resize(data->handler_layout, SURFACE_WIDTH, SURFACE_WIDTH);
+        evas_object_show(data->handler_layout);
+        evas_object_smart_member_add(data->handler_layout, scroller);
+        elm_layout_signal_callback_add(data->handler_layout, "elm,state,hide,finished", "elm", _handler_hide_cb, data);
+     }
    obj->widget_data = (void *)data;
 
+   _update_color_info(obj);
    // We don't want to allow to change properties of these items.
    // There is no item with "default" as its name.
    // So, eext_circle_object_* APIs is meaningless in here.
@@ -707,7 +1499,7 @@ _eext_circle_object_scroller_init(Eext_Circle_Object *obj, Evas_Object *scroller
                                       data->vertical_color.r,
                                       data->vertical_color.g,
                                       data->vertical_color.b,
-                                      data->vertical_color.a);
+                                      0);
    _eext_circle_object_item_line_width_set(item, data->line_width);
    _eext_circle_object_item_radius_set(item, data->radius);
    _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
@@ -719,29 +1511,33 @@ _eext_circle_object_scroller_init(Eext_Circle_Object *obj, Evas_Object *scroller
                                       data->horizontal_color.r,
                                       data->horizontal_color.g,
                                       data->horizontal_color.b,
-                                      data->horizontal_color.a);
+                                      0);
    _eext_circle_object_item_line_width_set(item, data->line_width);
    _eext_circle_object_item_radius_set(item, data->radius);
    _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
    _eext_circle_object_item_append(obj, item);
+   elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
 
-   if (efl_isa(obj->widget_object, EFL_UI_LEGACY_INTERFACE))
-     {
-        elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
-        evas_object_smart_callback_add(scroller, "scroll", _eext_circle_object_scroller_scroll_cb, obj);
-     }
-   else
-     {
-        efl_ui_scrollbar_bar_mode_set(obj->widget_object, EFL_UI_SCROLLBAR_MODE_OFF, EFL_UI_SCROLLBAR_MODE_OFF);
-        efl_event_callback_add(scroller, EFL_UI_EVENT_SCROLL_CHANGED, _scroll_cb, obj);
-     }
-
-   evas_object_event_callback_add(scroller, EVAS_CALLBACK_SHOW, _eext_circle_object_scroller_show_cb, obj);
-
+   evas_object_smart_callback_add(scroller, SIG_SCROLLER_RESUME, _eext_circle_object_scroller_resume_cb, obj);
+   evas_object_smart_callback_add(scroller, "scroll", _eext_circle_object_scroller_scroll_cb, obj);
+   evas_object_smart_callback_add(scroller, "scroll,anim,stop", _eext_circle_object_scroller_scroll_animatioin_stop_cb, obj);
    evas_object_smart_callback_add(scroller, "content,resize", _eext_circle_object_scroller_content_resize_cb, obj);
+   //ONEUI1.5(11JUN2019): Update scrollbar size on viewport resize
+   evas_object_smart_callback_add(scroller, "viewport,resize", _eext_circle_object_scroller_viewport_resize_cb, obj);
+   //
+
+   edje_object_signal_callback_add(elm_layout_edje_get(obj->widget_object), "color_class,set", data->scrollbar_color_class, _eext_circle_object_scroller_change_color_signal_cb, obj);
+   edje_object_signal_callback_add(elm_layout_edje_get(obj->widget_object), "color_class,set", data->scrollbar_bg_color_class, _eext_circle_object_scroller_change_color_signal_cb, obj);
+   //ONEUI1.5(04July2019): Support different color with bezel
+   edje_object_signal_callback_add(elm_layout_edje_get(obj->widget_object), "color_class,set", data->bezel_scrollbar_color_class, _eext_circle_object_scroller_change_color_signal_cb, obj);
+   evas_object_smart_callback_add(obj->widget_object, SIGNAL_DEACTIVATED, _eext_circle_object_scroller_deactivated_cb, obj);
+   evas_object_smart_callback_add(obj->main_obj, SIGNAL_DEACTIVATED, _eext_circle_object_scroller_deactivated_cb, obj);
+   //
 
    eext_rotary_object_event_callback_add(scroller, _eext_circle_object_scroller_rotary_changed_cb, obj);
    eext_rotary_object_event_callback_add(obj->main_obj, _eext_circle_object_scroller_rotary_changed_cb, obj);
+
+   LOGE("scroller(%p), obj->main_obj(%p)", scroller, obj->main_obj);
 }
 
 EAPI Evas_Object *
@@ -757,6 +1553,15 @@ eext_circle_object_scroller_add(Evas_Object *scroller, Eext_Circle_Surface *surf
 
    _eext_circle_object_scroller_init(circle_obj, scroller);
 
+   const char *style = elm_object_style_get(scroller);
+   //ONEUI1.5(04July2019): Support different color with bezel
+   evas_object_event_callback_priority_add(scroller, EVAS_CALLBACK_MOUSE_MOVE, EVAS_CALLBACK_PRIORITY_BEFORE, _mouse_move_cb, circle_obj);
+   //
+   if (style && !strncmp(style, HANDLER_STYLE, strlen(HANDLER_STYLE) + 1))
+     {
+        evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, circle_obj);
+        evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, circle_obj);
+     }
    return obj;
 }
 
index 8034877d8579109f555d2d638a189610ca892446..990c96bf2556653c1a2dda7d594ca8a1123ac7a3 100644 (file)
 
 #define SLIDER_ROTARY_EVENT_TIME_STAMP_THRESHOLD 500
 #define SLIDER_ROTARY_EVENT_ACCELERATION_TIME_DIFF 100
-#define SLIDER_ROTARY_EVENT_VALUE_MULTIPLYER 1
+#define SLIDER_ROTARY_EVENT_VALUE_MULTIPLIER 1
 
 #define SLIDER_TRANSIT_TIME 0.2
+#define SLIDER_CUE_SHOW_TRANSIT_TIME 0.2
+#define SLIDER_CUE_HIDE_TRANSIT_TIME 0.4
 #define SLIDER_TOUCH_AREA_SIZE 50
 #define SLIDER_WIDTH_SIZE 6
-#define SLIDER_RADIUS_SIZE 174
+#define SLIDER_RADIUS_SIZE 168
 #define SLIDER_CUE_SIZE 0.1
 #define SLIDER_CUE_OFFSET 0.05
 #define SLIDER_CUE_SHOWN_WIDTH 56
-#define SLIDER_CUE_HIDDEN_WIDTH 14
+#define SLIDER_CUE_HIDDEN_WIDTH 19
+
+//ONEUI1.5(25Jan2019): Slider access support, add read timer
+#define HIGHLIGHT_UPDATE_READ_TIMEOUT 0.3
+//
 
 #define EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, data) \
       Eext_Circle_Object_Slider_Data *data = NULL; \
 #define SLIDER_CUE_EFFECT_COLOR_A 128
 
 static const char SIG_VALUE_CHANGED[] = "value,changed";
-static const double durations[4] = {0.3, 0.4, 0.5, 0.6};
+static const double durations[4] = {0.2, 0.4, 0.6, 0.8};
 
 static Eina_Bool _eext_circle_object_slider_value_transit_set_internal(Evas_Object *obj, double value);
 
+//ONEUI1.5(11Jan2019): Slider access support
+static void _grab_highlight_cb(void *data, Evas_Object *obj, void *event_info);
+static void _win_focus_cb(void *data, Evas_Object *obj, void *event_info);
+static void _slider_screen_reader_changed(void *data, Evas_Object *obj, void *event_info);
+static char *_get_accessible_name(Evas_Object *slider);
+static char *_get_accessible_description(Evas_Object *slider);
+extern void __elm_atspi_bridge_highlighted_object_read(void);
+//
+
 static double
 _angle_calculate(Evas_Object *obj, Evas_Coord mouse_x, Evas_Coord mouse_y)
 {
@@ -182,14 +197,14 @@ _angle_drag_set(Evas_Object *obj, double new_angle)
      }
 
    double new_value = eext_circle_object_value_get(obj);
+   if (new_value != current_value)
+     evas_object_smart_callback_call(obj, SIG_VALUE_CHANGED, NULL);
    widget_data->prev_angle = new_angle;
 }
 
 static void
 _angle_tap_set(Evas_Object *obj, double new_angle)
 {
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
    double min = 0.0, max = 0.0;
    eext_circle_object_value_min_max_get(obj, &min, &max);
 
@@ -197,7 +212,12 @@ _angle_tap_set(Evas_Object *obj, double new_angle)
    double new_value = min + (new_angle * (max - min))/360.0;
 
    if (floor(new_value + 0.5) != floor(current_value + 0.5))
-     _eext_circle_object_slider_value_transit_set_internal(obj, floor(new_value + 0.5));
+     {
+        //eext_circle_object_value_set(obj, floor(new_value + 0.5));
+
+        _eext_circle_object_slider_value_transit_set_internal(obj, floor(new_value + 0.5));
+        evas_object_smart_callback_call(obj, SIG_VALUE_CHANGED, NULL);
+     }
 }
 
 static Eina_Bool _cue_effect_animator_cb(void *data, double pos)
@@ -218,6 +238,9 @@ static Eina_Bool _cue_effect_animator_cb(void *data, double pos)
         return ECORE_CALLBACK_CANCEL;
      }
 
+   double cubic_bezier_v[] = {0.25, 0.46, 0.45, 1};
+   pos = ecore_animator_pos_map_n(pos, ECORE_POS_MAP_CUBIC_BEZIER, 4, cubic_bezier_v);
+
    int to_width = SLIDER_CUE_HIDDEN_WIDTH;
    if (widget_data->cue_effect_transit.showing)
      to_width = SLIDER_CUE_SHOWN_WIDTH;
@@ -256,7 +279,7 @@ static void _show_cue_effect(Evas_Object *obj)
    widget_data->cue_effect_transit.from_line_width = _eext_circle_object_item_line_width_get(item);
    widget_data->cue_effect_transit.showing = EINA_TRUE;
 
-   widget_data->cue_effect_transit.animator = ecore_animator_timeline_add(SLIDER_TRANSIT_TIME, _cue_effect_animator_cb, obj);
+   widget_data->cue_effect_transit.animator = ecore_animator_timeline_add(SLIDER_CUE_SHOW_TRANSIT_TIME, _cue_effect_animator_cb, obj);
 }
 
 static void _hide_cue_effect(Evas_Object *obj)
@@ -279,24 +302,27 @@ static void _hide_cue_effect(Evas_Object *obj)
    widget_data->cue_effect_transit.from_line_width = _eext_circle_object_item_line_width_get(item);
    widget_data->cue_effect_transit.showing = EINA_FALSE;
 
-   widget_data->cue_effect_transit.animator = ecore_animator_timeline_add(SLIDER_TRANSIT_TIME, _cue_effect_animator_cb, obj);
+   widget_data->cue_effect_transit.animator = ecore_animator_timeline_add(SLIDER_CUE_HIDE_TRANSIT_TIME, _cue_effect_animator_cb, obj);
 }
 
 static void
 _mouse_down_cb(void *data,
                Evas *evas,
-               Evas_Object *obj,
+               // FIXME(23Jul2019): callbacks are not working on image object
+               Evas_Object *parent,
+               //
                void *event_info)
 {
    Evas_Event_Mouse_Down *ev = event_info;
-   Evas_Object *img_obj = data;
-
-   EEXT_CIRCLE_OBJECT_GET(img_obj, circle_obj) return;
+   // FIXME(23Jul2019): callbacks are not working on image object
+   Evas_Object *obj = (Evas_Object *)data;
+   //
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
    EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
 
    if (circle_obj->disabled) return;
 
-   int radius = eext_circle_object_radius_get(img_obj);
+   int radius = eext_circle_object_radius_get(obj);
    Evas_Coord_Point center = {0,0};
    Evas_Coord x = 0, y = 0, w = 0, h = 0;
    evas_object_geometry_get(obj, &x, &y, &w, &h);
@@ -309,18 +335,19 @@ _mouse_down_cb(void *data,
    if ((point <= radius) && (point >= (radius - SLIDER_TOUCH_AREA_SIZE)))
      {
         double new_angle = _angle_calculate(obj, ev->canvas.x, ev->canvas.y);
-        double current_angle = eext_circle_object_angle_get(img_obj);
+        double current_angle = eext_circle_object_angle_get(obj);
 
         double angle_difference = fabs(new_angle - current_angle);
         if (angle_difference <= 18.0)
           {
-             _show_cue_effect(img_obj);
+             _show_cue_effect(obj);
 
              widget_data->freeze = EINA_FALSE;
              widget_data->prev_angle = -1.0;
-             _angle_drag_set(img_obj, new_angle);
+             _angle_drag_set(obj, new_angle);
+
              widget_data->drag = EINA_TRUE;
-             efl_ui_widget_scroll_freeze_push(img_obj);
+             efl_ui_widget_scroll_freeze_push(obj);
           }
         else
           {
@@ -335,13 +362,17 @@ _mouse_down_cb(void *data,
 static void
 _mouse_move_cb(void *data,
                Evas *evas,
-               Evas_Object *obj,
+               // FIXME(23Jul2019): callbacks are not working on image object
+               Evas_Object *parent,
+               //
                void *event_info)
 {
    Evas_Event_Mouse_Move *ev = event_info;
-   Evas_Object *img_obj = data;
+   // FIXME(23Jul2019): callbacks are not working on image object
+   Evas_Object *obj = (Evas_Object *)data;
+   //
 
-   EEXT_CIRCLE_OBJECT_GET(img_obj, circle_obj) return;
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
    EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
 
    if (circle_obj->disabled) return;
@@ -351,7 +382,7 @@ _mouse_move_cb(void *data,
         int gap = sqrt(pow(widget_data->pressed_point.x - ev->cur.canvas.x, 2) + pow(widget_data->pressed_point.y - ev->cur.canvas.y, 2));
         if (gap > elm_config_scroll_thumbscroll_threshold_get())
           {
-             _show_cue_effect(img_obj);
+             _show_cue_effect(obj);
 
              widget_data->freeze = EINA_FALSE;
              widget_data->prev_angle = -1.0;
@@ -362,37 +393,40 @@ _mouse_move_cb(void *data,
      }
 
    if (widget_data->drag)
-     _angle_drag_set(img_obj, _angle_calculate(obj, ev->cur.canvas.x, ev->cur.canvas.y));
+        _angle_drag_set(obj, _angle_calculate(obj, ev->cur.canvas.x, ev->cur.canvas.y));
 }
 
 static void
 _mouse_up_cb(void *data,
                Evas *evas,
-               Evas_Object *obj,
+               // FIXME(23Jul2019): callbacks are not working on image object
+               Evas_Object *parent,
+               //
                void *event_info)
 {
    Evas_Event_Mouse_Up *ev = event_info;
-   Evas_Object *img_obj = data;
-
-   EEXT_CIRCLE_OBJECT_GET(img_obj, circle_obj) return;
+   // FIXME(23Jul2019): callbacks are not working on image object
+   Evas_Object *obj = (Evas_Object *)data;
+   //
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
    EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
 
    if (circle_obj->disabled) return;
 
    if (widget_data->drag)
      {
-        _eext_circle_object_slider_value_transit_set_internal(img_obj, eext_circle_object_value_get(img_obj));
+        _eext_circle_object_slider_value_transit_set_internal(obj, eext_circle_object_value_get(obj));
 
-        _hide_cue_effect(img_obj);
+        _hide_cue_effect(obj);
 
         widget_data->drag = EINA_FALSE;
-        efl_ui_widget_scroll_freeze_pop(img_obj);
+        efl_ui_widget_scroll_freeze_pop(obj);
      }
    else if (widget_data->tap)
      {
         int gap = sqrt(pow(widget_data->pressed_point.x - ev->canvas.x, 2) + pow(widget_data->pressed_point.y - ev->canvas.y, 2));
         if (gap < elm_config_scroll_thumbscroll_threshold_get())
-          _angle_tap_set(img_obj, _angle_calculate(obj, ev->canvas.x, ev->canvas.y));
+          _angle_tap_set(obj, _angle_calculate(obj, ev->canvas.x, ev->canvas.y));
 
         widget_data->tap = EINA_FALSE;
      }
@@ -404,12 +438,15 @@ _mouse_up_cb(void *data,
 static void
 _mouse_out_cb(void *data,
                Evas *evas,
-               Evas_Object *obj,
+               // FIXME(23Jul2019): callbacks are not working on image object
+               Evas_Object *parent,
+               //
                void *event_info)
 {
-   Evas_Object *img_obj = data;
-
-   EEXT_CIRCLE_OBJECT_GET(img_obj, circle_obj) return;
+   // FIXME(23Jul2019): callbacks are not working on image object
+   Evas_Object *obj = (Evas_Object *)data;
+   //
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
    EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
 
    if (circle_obj->disabled) return;
@@ -419,53 +456,263 @@ _mouse_out_cb(void *data,
 }
 
 static void
-_value_changed_cb(void *data, Evas_Object *obj, void *event_info)
+_update_color_info(Eext_Circle_Object *obj)
 {
-   Eext_Circle_Object *circle_obj = data;
-   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(obj, data) return;
 
-   if (widget_data->drag) return;
-   if (widget_data->tap) return;
-   if (widget_data->rotary) return;
+   Eext_Circle_Color ext_color;
+   //default color
+   if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B065L2", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     if (!edje_color_class_get("B065L2", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+       {
+          ext_color.r = SLIDER_COLOR_R;
+          ext_color.g = SLIDER_COLOR_G;
+          ext_color.b = SLIDER_COLOR_B;
+          ext_color.a = SLIDER_COLOR_A;
+       }
+   data->color.r = ext_color.r;
+   data->color.g = ext_color.g;
+   data->color.b = ext_color.b;
+   data->color.a = ext_color.a;
+
+   //disabled color
+   if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B104L2D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     if (!edje_color_class_get("B104L2D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+       {
+          ext_color.r = SLIDER_COLOR_DISABLED_R;
+          ext_color.g = SLIDER_COLOR_DISABLED_G;
+          ext_color.b = SLIDER_COLOR_DISABLED_B;
+          ext_color.a = SLIDER_COLOR_DISABLED_A;
+       }
+   data->disabled_color.r = ext_color.r;
+   data->disabled_color.g = ext_color.g;
+   data->disabled_color.b = ext_color.b;
+   data->disabled_color.a = ext_color.a;
+
+   //BG color
+   if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B065L3", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     if (!edje_color_class_get("B065L3", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+       {
+          ext_color.r = SLIDER_BG_COLOR_R;
+          ext_color.g = SLIDER_BG_COLOR_G;
+          ext_color.b = SLIDER_BG_COLOR_B;
+          ext_color.a = SLIDER_BG_COLOR_A;
+       }
+   data->bg_color.r = ext_color.r;
+   data->bg_color.g = ext_color.g;
+   data->bg_color.b = ext_color.b;
+   data->bg_color.a = ext_color.a;
+
+   //disabled BG color
+   if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B104L1D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     if (!edje_color_class_get("B104L1D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+       {
+          ext_color.r = SLIDER_BG_COLOR_DISABLED_R;
+          ext_color.g = SLIDER_BG_COLOR_DISABLED_G;
+          ext_color.b = SLIDER_BG_COLOR_DISABLED_B;
+          ext_color.a = SLIDER_BG_COLOR_DISABLED_A;
+       }
+   data->disabled_bg_color.r = ext_color.r;
+   data->disabled_bg_color.g = ext_color.g;
+   data->disabled_bg_color.b = ext_color.b;
+   data->disabled_bg_color.a = ext_color.a;
+
+   //cue color
+   if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B083", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     if (!edje_color_class_get("B083", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+       {
+          ext_color.r = SLIDER_CUE_COLOR_R;
+          ext_color.g = SLIDER_CUE_COLOR_G;
+          ext_color.b = SLIDER_CUE_COLOR_B;
+          ext_color.a = SLIDER_CUE_COLOR_A;
+       }
+   data->cue_color.r = ext_color.r;
+   data->cue_color.g = ext_color.g;
+   data->cue_color.b = ext_color.b;
+   data->cue_color.a = ext_color.a;
+
+   //cue press color
+   if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B083P", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+     if (!edje_color_class_get("B083P", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+       {
+          ext_color.r = SLIDER_CUE_EFFECT_COLOR_R;
+          ext_color.g = SLIDER_CUE_EFFECT_COLOR_G;
+          ext_color.b = SLIDER_CUE_EFFECT_COLOR_B;
+          ext_color.a = SLIDER_CUE_EFFECT_COLOR_A;
+       }
+   data->cue_press_color.r = ext_color.r;
+   data->cue_press_color.g = ext_color.g;
+   data->cue_press_color.b = ext_color.b;
+   data->cue_press_color.a = ext_color.a;
+}
 
-   Eext_Circle_Object_Item *item = NULL, *cue_item = NULL, *effect_item = NULL;
+static void
+_eext_circle_object_slider_change_color_signal_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   LOGI("theme is changed");
+
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, slider_data) return;
+
+   _update_color_info(circle_obj);
+
+   Eext_Circle_Object_Item *item = NULL;
+
+   item = _eext_circle_object_item_get(circle_obj, SLIDER_BG_ITEM_NAME);
+   if (item)
+     {
+        _eext_circle_object_item_color_set(item, slider_data->bg_color.r, slider_data->bg_color.g, slider_data->bg_color.b, slider_data->bg_color.a);
+     }
    item = _eext_circle_object_item_get(circle_obj, SLIDER_ITEM_NAME);
+   if (item)
+     {
+        _eext_circle_object_item_color_set(item, slider_data->color.r, slider_data->color.g, slider_data->color.b, slider_data->color.a);
+     }
+   item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_ITEM_NAME);
+   // ONEUI1.5(23Jul2019): s/w bezel support
+   if (item && slider_data->touch_enabled)
+   //
+     {
+        _eext_circle_object_item_color_set(item, slider_data->cue_color.r, slider_data->cue_color.g, slider_data->cue_color.b, slider_data->cue_color.a);
+     }
+   item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_EFFECT_ITEM_NAME);
+   // ONEUI1.5(23Jul2019): s/w bezel support
+   if (item && slider_data->touch_enabled)
+   //
+     {
+        _eext_circle_object_item_color_set(item, slider_data->cue_press_color.r, slider_data->cue_press_color.g, slider_data->cue_press_color.b, slider_data->cue_press_color.a);
+     }
+}
+
+// ONEUI1.5(23Jul2019): s/w bezel support
+static void
+_slider_touch_enable(Evas_Object *obj)
+{
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
+
+   if (widget_data->touch_enabled) return;
+
+   evas_object_event_callback_add(widget_data->parent, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, obj);
+   evas_object_event_callback_add(widget_data->parent, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, obj);
+   evas_object_event_callback_add(widget_data->parent, EVAS_CALLBACK_MOUSE_OUT, _mouse_out_cb, obj);
+   evas_object_event_callback_add(widget_data->parent, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, obj);
+
+   widget_data->touch_enabled = EINA_TRUE;
+
+   Eext_Circle_Object_Item *cue_item = NULL, *effect_item = NULL;
    cue_item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_ITEM_NAME);
    effect_item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_EFFECT_ITEM_NAME);
-   if (!item || !cue_item || !effect_item) return;
+   if (cue_item)
+     _eext_circle_object_item_color_set(cue_item, widget_data->cue_color.r, widget_data->cue_color.g, widget_data->cue_color.b, widget_data->cue_color.a);
+   if (effect_item)
+     _eext_circle_object_item_color_set(effect_item, widget_data->cue_press_color.r, widget_data->cue_press_color.g, widget_data->cue_press_color.b, widget_data->cue_press_color.a);
+}
 
-   double value = item->value;
-   double angle = _eext_circle_object_item_value_angle_get(item, value);
+static void
+_slider_touch_disable(Evas_Object *obj)
+{
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
+
+   if (!widget_data->touch_enabled) return;
+
+   evas_object_event_callback_del(widget_data->parent, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb);
+   evas_object_event_callback_del(widget_data->parent, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb);
+   evas_object_event_callback_del(widget_data->parent, EVAS_CALLBACK_MOUSE_OUT, _mouse_out_cb);
+   evas_object_event_callback_del(widget_data->parent, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb);
 
-   _eext_circle_object_item_angle_offset_set(effect_item, angle - SLIDER_CUE_OFFSET);
-   _eext_circle_object_item_angle_set(effect_item, SLIDER_CUE_SIZE);
-   _eext_circle_object_item_angle_offset_set(cue_item, angle - SLIDER_CUE_OFFSET);
-   _eext_circle_object_item_angle_set(cue_item, SLIDER_CUE_SIZE);
+   widget_data->touch_enabled = EINA_FALSE;
+
+   Eext_Circle_Object_Item *cue_item = NULL, *effect_item = NULL;
+   cue_item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_ITEM_NAME);
+   effect_item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_EFFECT_ITEM_NAME);
+   if (cue_item)
+     _eext_circle_object_item_color_set(cue_item, widget_data->cue_color.r, widget_data->cue_color.g, widget_data->cue_color.b, 0);
+   if (effect_item)
+     _eext_circle_object_item_color_set(effect_item, widget_data->cue_press_color.r, widget_data->cue_press_color.g, widget_data->cue_press_color.b, 0);
 }
 
+static void
+_bezel_changed_cb(int *node, void *data)
+{
+   Evas_Object *obj = (Evas_Object *)data;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
+   if (widget_data->user_touch_overwritten) return;
+
+   Eina_Bool rotary = eext_rotary_event_is_enabled();
+   if (!rotary)
+     _slider_touch_enable(obj);
+   else
+     _slider_touch_disable(obj);
+
+}
+//
+
 static void
 _eext_circle_object_slider_del_cb(Eext_Circle_Object *obj)
 {
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(obj, data) return;
+   //ONEUI1.5(23Jul2019): sync with tizen4.0
+   edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B065L2", _eext_circle_object_slider_change_color_signal_cb);
+   edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B104L2D", _eext_circle_object_slider_change_color_signal_cb);
+   edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B065L3", _eext_circle_object_slider_change_color_signal_cb);
+   edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B104L1D", _eext_circle_object_slider_change_color_signal_cb);
+   edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B083", _eext_circle_object_slider_change_color_signal_cb);
+   edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B083P", _eext_circle_object_slider_change_color_signal_cb);
+   //
    if (obj->widget_data)
      {
         Eext_Circle_Object_Slider_Data *slider_data = (Eext_Circle_Object_Slider_Data *)obj->widget_data;
-        if (slider_data)
+        if (slider_data && slider_data->touch_enabled)
           {
-             evas_object_event_callback_del(slider_data->hit_rect, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb);
-             evas_object_event_callback_del(slider_data->hit_rect, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb);
-             evas_object_event_callback_del(slider_data->hit_rect, EVAS_CALLBACK_MOUSE_OUT, _mouse_out_cb);
-             evas_object_event_callback_del(slider_data->hit_rect, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb);
+             // FIXME(23Jul2019): callbacks are not working on image object
+             evas_object_event_callback_del(data->parent, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb);
+             evas_object_event_callback_del(data->parent, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb);
+             evas_object_event_callback_del(data->parent, EVAS_CALLBACK_MOUSE_OUT, _mouse_out_cb);
+             evas_object_event_callback_del(data->parent, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb);
+             //
           }
-
-        evas_object_smart_callback_del(obj->main_obj, SIG_VALUE_CHANGED, _value_changed_cb);
-
+        //ONEUI1.5(02Jul2019): s/w bezel support
+        eext_rotary_event_changed_callback_del(_bezel_changed_cb);
         if (slider_data->cue_effect_transit.animator)
           ecore_animator_del(slider_data->cue_effect_transit.animator);
+        //ONEUI1.5(11Jan2019): Slider access support
+        Evas_Object *parent = elm_object_parent_widget_get(data->parent);
+        if (parent && !strcmp(evas_object_type_get(parent), "elm_naviframe"))
+          evas_object_smart_callback_del(parent, "item,activated", _grab_highlight_cb);
+        if (data->highlight_timer)
+          {
+             ecore_timer_del(data->highlight_timer);
+             data->highlight_timer = NULL;
+          }
+        if (data->read_timer)
+          {
+             ecore_timer_del(data->read_timer);
+             data->read_timer = NULL;
+          }
+        evas_object_smart_callback_del(elm_object_top_widget_get(data->parent), "focused", _win_focus_cb);
+        //
         free(obj->widget_data);
         obj->widget_data = NULL;
      }
 }
 
+//ONEUI1.5(25Jan2019): Slider access support, add read timer
+static Eina_Bool
+_read_timer_cb(void *data)
+{
+   EEXT_CIRCLE_OBJECT_GET(data, circle_obj) return ECORE_CALLBACK_CANCEL;
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return ECORE_CALLBACK_CANCEL;
+   __elm_atspi_bridge_highlighted_object_read();
+   widget_data->read_timer = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+//
+
 static Eina_Bool
 _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
 {
@@ -480,6 +727,8 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return EINA_FALSE;
    EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return EINA_FALSE;
 
+   LOGE("Slider_rotary_changed_callback call : time_stamp[%d], direction[%d]", info->time_stamp, info->direction);
+
    Eext_Circle_Object_Item *item = NULL, *cue_item = NULL, *effect_item = NULL;
    item = _eext_circle_object_item_get(circle_obj, SLIDER_ITEM_NAME);
    cue_item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_ITEM_NAME);
@@ -489,7 +738,7 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
    current_value = _eext_circle_object_item_value_get(item);
    _eext_circle_object_item_value_min_max_get(item, &min, &max);
 
-   multiplier = SLIDER_ROTARY_EVENT_VALUE_MULTIPLYER;
+   multiplier = SLIDER_ROTARY_EVENT_VALUE_MULTIPLIER;
 
    time_stamp_diff = info->time_stamp - widget_data->rotary_event_time_stamp;
    if (time_stamp_diff > SLIDER_ROTARY_EVENT_TIME_STAMP_THRESHOLD)
@@ -507,21 +756,24 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
      {
         multiplier  = value_count / (digit + 1) * pow(((threshold - time_stamp_diff) / threshold), digit + 1);
 
-        if (multiplier < SLIDER_ROTARY_EVENT_VALUE_MULTIPLYER)
-          multiplier = SLIDER_ROTARY_EVENT_VALUE_MULTIPLYER;
+        if (multiplier < SLIDER_ROTARY_EVENT_VALUE_MULTIPLIER)
+          multiplier = SLIDER_ROTARY_EVENT_VALUE_MULTIPLIER;
      }
 
    if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
-     next_value = current_value + widget_data->value_step * multiplier;
+     {
+        next_value = current_value + widget_data->value_step*multiplier;
+     }
    else
-     next_value = current_value - widget_data->value_step * multiplier;
+     {
+        next_value = current_value - widget_data->value_step*multiplier;
+     }
 
    if (next_value < min) next_value = min;
    else if (next_value > max) next_value = max;
 
    angle = _eext_circle_object_item_value_angle_get(item, next_value);
 
-   widget_data->rotary = EINA_TRUE;
    _eext_circle_object_item_angle_transit_set(effect_item, SLIDER_TRANSIT_TIME,
                                               SLIDER_CUE_SIZE, angle - SLIDER_CUE_OFFSET, EINA_TRUE,
                                               0.25, 0.46, 0.45, 1.0);
@@ -535,16 +787,16 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
                                               EINA_TRUE,
                                               0.25, 0.46, 0.45, 1.0);
 
-   widget_data->rotary = EINA_FALSE;
+   evas_object_smart_callback_call(slider, SIG_VALUE_CHANGED, NULL);
 
    /* Accessibility */
+   //ONEUI1.5(25Jan2019): Slider access support, add read timer
    if (elm_atspi_bridge_utils_is_screen_reader_enabled())
      {
-        const char *slider_desc = NULL;
-        slider_desc = elm_atspi_accessible_description_get(slider);
-        if (slider_desc && strlen(slider_desc) > 0)
-          elm_atspi_bridge_utils_say(slider_desc, EINA_TRUE, NULL, NULL);
+        if (widget_data->read_timer) ecore_timer_del(widget_data->read_timer);
+        widget_data->read_timer = ecore_timer_add(HIGHLIGHT_UPDATE_READ_TIMEOUT, _read_timer_cb, slider);
      }
+   //
 
    return EINA_TRUE;
 }
@@ -607,7 +859,7 @@ _eext_circle_object_slider_disabled_cb(Eext_Circle_Object *obj)
                                              data->disabled_bg_color.g,
                                              data->disabled_bg_color.b,
                                              data->disabled_bg_color.a);
-
+        //ONEUI1.5(19Jun2019): Enable sw/hw bezel
         eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
      }
    else
@@ -624,7 +876,7 @@ _eext_circle_object_slider_disabled_cb(Eext_Circle_Object *obj)
                                              data->bg_color.g,
                                              data->bg_color.b,
                                              data->bg_color.a);
-
+        //ONEUI1.5(19Jun2019): Enable sw/hw bezel
         eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, NULL);
      }
 }
@@ -644,48 +896,24 @@ _eext_circle_object_slider_init(Evas_Object *parent, Eext_Circle_Object *obj)
    data = (Eext_Circle_Object_Slider_Data *)calloc(1, sizeof(Eext_Circle_Object_Slider_Data));
    data->parent = parent;
    data->value_step = 1.0;
-   data->rotary_event_time_stamp = 0.0;
+   //ONEUI1.5(02Jul2019): s/w bezel support
+   data->user_touch_overwritten = EINA_FALSE;
+   //
+   //ONEUI1.5(19Jun2019): Enable sw/hw bezel
+   if (eext_rotary_event_is_enabled())
+     {
+        data->rotary_event_time_stamp = 0.0;
+        data->touch_enabled = EINA_FALSE;
+     }
+   else
+     data->touch_enabled = EINA_TRUE;
+   //
+
    data->tap = EINA_FALSE;
    data->drag = EINA_FALSE;
 
-   data->color.r = SLIDER_COLOR_R;
-   data->color.g = SLIDER_COLOR_G;
-   data->color.b = SLIDER_COLOR_B;
-   data->color.a = SLIDER_COLOR_A;
-   data->bg_color.r = SLIDER_BG_COLOR_R;
-   data->bg_color.g = SLIDER_BG_COLOR_G;
-   data->bg_color.b = SLIDER_BG_COLOR_B;
-   data->bg_color.a = SLIDER_BG_COLOR_A;
-   data->disabled_color.r = SLIDER_COLOR_DISABLED_R;
-   data->disabled_color.g = SLIDER_COLOR_DISABLED_G;
-   data->disabled_color.b = SLIDER_COLOR_DISABLED_B;
-   data->disabled_color.a = SLIDER_COLOR_DISABLED_A;
-   data->disabled_bg_color.r = SLIDER_BG_COLOR_DISABLED_R;
-   data->disabled_bg_color.g = SLIDER_BG_COLOR_DISABLED_G;
-   data->disabled_bg_color.b = SLIDER_BG_COLOR_DISABLED_B;
-   data->disabled_bg_color.a = SLIDER_BG_COLOR_DISABLED_A;
-   data->cue_color.r = SLIDER_CUE_COLOR_R;
-   data->cue_color.g = SLIDER_CUE_COLOR_G;
-   data->cue_color.b = SLIDER_CUE_COLOR_B;
-   data->cue_color.a = SLIDER_CUE_COLOR_A;
-   data->cue_press_color.r = SLIDER_CUE_EFFECT_COLOR_R;
-   data->cue_press_color.g = SLIDER_CUE_EFFECT_COLOR_G;
-   data->cue_press_color.b = SLIDER_CUE_EFFECT_COLOR_B;
-   data->cue_press_color.a = SLIDER_CUE_EFFECT_COLOR_A;
-
-   data->hit_rect = evas_object_rectangle_add(evas_object_evas_get(parent));
-   evas_object_smart_member_add(data->hit_rect, parent);
-   evas_object_color_set(data->hit_rect, 0, 0, 0, 0);
-   evas_object_resize(data->hit_rect, 360, 360);
-   evas_object_show(data->hit_rect);
-   evas_object_repeat_events_set(data->hit_rect, EINA_TRUE);
-
-   evas_object_event_callback_add(data->hit_rect, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, obj->main_obj);
-   evas_object_event_callback_add(data->hit_rect, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, obj->main_obj);
-   evas_object_event_callback_add(data->hit_rect, EVAS_CALLBACK_MOUSE_OUT, _mouse_out_cb, obj->main_obj);
-   evas_object_event_callback_add(data->hit_rect, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, obj->main_obj);
-
    obj->widget_data = data;
+   _update_color_info(obj);
 
    //BG
    item = _eext_circle_object_item_new();
@@ -698,8 +926,13 @@ _eext_circle_object_slider_init(Evas_Object *parent, Eext_Circle_Object *obj)
 
    item = _eext_circle_object_item_new();
    _eext_circle_object_item_name_set(item, SLIDER_CUE_EFFECT_ITEM_NAME);
-   _eext_circle_object_item_color_set(item, data->cue_press_color.r, data->cue_press_color.g, data->cue_press_color.b, data->cue_press_color.a);
-   _eext_circle_object_item_line_width_set(item, 14);
+   // ONEUI1.5(23Jul2019): s/w bezel support
+   if (data->touch_enabled)
+     _eext_circle_object_item_color_set(item, data->cue_press_color.r, data->cue_press_color.g, data->cue_press_color.b, data->cue_press_color.a);
+   else
+     _eext_circle_object_item_color_set(item, data->cue_press_color.r, data->cue_press_color.g, data->cue_press_color.b, 0);
+   //
+   _eext_circle_object_item_line_width_set(item, SLIDER_CUE_HIDDEN_WIDTH);
    _eext_circle_object_item_radius_set(item, SLIDER_RADIUS_SIZE);
    _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
    _eext_circle_object_item_angle_offset_set(item, item->angle_offset - SLIDER_CUE_OFFSET);
@@ -708,8 +941,13 @@ _eext_circle_object_slider_init(Evas_Object *parent, Eext_Circle_Object *obj)
 
    item = _eext_circle_object_item_new();
    _eext_circle_object_item_name_set(item, SLIDER_CUE_ITEM_NAME);
-   _eext_circle_object_item_color_set(item, data->cue_color.r, data->cue_color.g, data->cue_color.b, data->cue_color.a);
-   _eext_circle_object_item_line_width_set(item, 14);
+   // ONEUI1.5(23Jul2019): s/w bezel support
+   if (data->touch_enabled)
+     _eext_circle_object_item_color_set(item, data->cue_color.r, data->cue_color.g, data->cue_color.b, data->cue_color.a);
+   else
+     _eext_circle_object_item_color_set(item, data->cue_color.r, data->cue_color.g, data->cue_color.b, 0);
+   //
+   _eext_circle_object_item_line_width_set(item, SLIDER_CUE_HIDDEN_WIDTH);
    _eext_circle_object_item_radius_set(item, SLIDER_RADIUS_SIZE);
    _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
    _eext_circle_object_item_angle_offset_set(item, item->angle_offset - SLIDER_CUE_OFFSET);
@@ -724,40 +962,225 @@ _eext_circle_object_slider_init(Evas_Object *parent, Eext_Circle_Object *obj)
    _eext_circle_object_item_value_min_max_set(item, 0, 10);
    _eext_circle_object_item_value_set(item, 0);
    _eext_circle_object_item_append(obj, item);
-
-   evas_object_smart_callback_add(obj->main_obj, SIG_VALUE_CHANGED, _value_changed_cb, obj);
    eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, NULL);
 }
 
+//ONEUI1.5(11Jan2019): Slider access support
+static Eina_Bool
+_slider_gesture_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj)
+{
+   LOGI("Gesture_type = %d x_beg = %d, x_end=%d y_beg=%d y_end=%d",gesture_info.type,
+       gesture_info.x_beg, gesture_info.x_end, gesture_info.y_beg, gesture_info.y_end);
+
+   Evas_Object *slider = data;
+   int time_stamp_diff, multiplier;
+   double current_value;
+   double next_value;
+   double min, max;
+   double value_count, digit, threshold;
+   double angle;
+
+   EEXT_CIRCLE_OBJECT_GET(slider, circle_obj) return EINA_FALSE;
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return EINA_FALSE;
+
+   if (gesture_info.type != ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_UP &&
+       gesture_info.type != ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_DOWN)
+     return EINA_FALSE;
+
+   Eext_Circle_Object_Item *item = NULL, *cue_item = NULL, *effect_item = NULL;
+   item = _eext_circle_object_item_get(circle_obj, SLIDER_ITEM_NAME);
+   cue_item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_ITEM_NAME);
+   effect_item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_EFFECT_ITEM_NAME);
+   if (!item || !cue_item || !effect_item) return EINA_FALSE;
+
+   current_value = _eext_circle_object_item_value_get(item);
+   _eext_circle_object_item_value_min_max_get(item, &min, &max);
+
+   multiplier = SLIDER_ROTARY_EVENT_VALUE_MULTIPLIER;
+
+   time_stamp_diff = gesture_info.event_time - widget_data->rotary_event_time_stamp;
+   if (time_stamp_diff > SLIDER_ROTARY_EVENT_TIME_STAMP_THRESHOLD)
+     {
+        widget_data->rotary_event_time_stamp = gesture_info.event_time;
+     }
+
+   _eext_circle_object_item_value_min_max_get(item, &min, &max);
+   value_count = (max - min) / widget_data->value_step;
+
+   digit = log10(value_count);
+
+   threshold = SLIDER_ROTARY_EVENT_ACCELERATION_TIME_DIFF + (digit * 10);
+   if (time_stamp_diff < threshold)
+     {
+        multiplier  = value_count / (digit + 1) * pow(((threshold - time_stamp_diff) / threshold), digit + 1);
+
+        if (multiplier < SLIDER_ROTARY_EVENT_VALUE_MULTIPLIER)
+          multiplier = SLIDER_ROTARY_EVENT_VALUE_MULTIPLIER;
+     }
+
+   if (gesture_info.type == ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_UP)
+     {
+        next_value = current_value + widget_data->value_step*multiplier;
+     }
+   else
+     {
+        next_value = current_value - widget_data->value_step*multiplier;
+     }
+
+   if (next_value < min) next_value = min;
+   else if (next_value > max) next_value = max;
+
+   angle = _eext_circle_object_item_value_angle_get(item, next_value);
+
+   _eext_circle_object_item_angle_transit_set(effect_item, SLIDER_TRANSIT_TIME,
+                                              SLIDER_CUE_SIZE, angle - SLIDER_CUE_OFFSET, EINA_TRUE,
+                                              0.25, 0.46, 0.45, 1.0);
+
+   _eext_circle_object_item_angle_transit_set(cue_item, SLIDER_TRANSIT_TIME,
+                                              SLIDER_CUE_SIZE, angle - SLIDER_CUE_OFFSET, EINA_TRUE,
+                                              0.25, 0.46, 0.45, 1.0);
+
+   _eext_circle_object_item_value_transit_set(item, SLIDER_TRANSIT_TIME,
+                                              next_value,
+                                              EINA_TRUE,
+                                              0.25, 0.46, 0.45, 1.0);
+
+   evas_object_smart_callback_call(slider, SIG_VALUE_CHANGED, NULL);
+
+   if (widget_data->read_timer) ecore_timer_del(widget_data->read_timer);
+   widget_data->read_timer = ecore_timer_add(HIGHLIGHT_UPDATE_READ_TIMEOUT, _read_timer_cb, slider);
+   return EINA_TRUE;
+}
+
+static Eina_Bool _highlight_timer_cb(void *data)
+{
+   EEXT_CIRCLE_OBJECT_GET(data, circle_obj) return ECORE_CALLBACK_CANCEL;
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return ECORE_CALLBACK_CANCEL;
+   //ONEUI1.5(09Jul2019): Check role before setting highlight
+   if (elm_atspi_accessible_role_get(widget_data->parent) != ELM_ATSPI_ROLE_REDUNDANT_OBJECT)
+     elm_atspi_component_highlight_grab(widget_data->parent);
+   //
+   widget_data->highlight_timer = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_grab_highlight_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   EEXT_CIRCLE_OBJECT_GET(data, circle_obj) return;
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
+   if (!evas_object_visible_get(widget_data->parent)) return;
+   if (widget_data->highlight_timer) ecore_timer_del(widget_data->highlight_timer);
+   widget_data->highlight_timer = ecore_timer_add(0.5, _highlight_timer_cb, data);
+   evas_object_smart_callback_del(obj, "item,activated", _grab_highlight_cb);
+}
+
+static void
+_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   //ONEUI1.5(09Jul2019): Check role before setting highlight
+   if (elm_atspi_accessible_role_get(obj) != ELM_ATSPI_ROLE_REDUNDANT_OBJECT)
+     elm_atspi_component_highlight_grab(obj);
+   //
+}
+
+static void
+_win_focus_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   EEXT_CIRCLE_OBJECT_GET(data, circle_obj) return;
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
+   if (!evas_object_visible_get(widget_data->parent)) return;
+   if (widget_data->highlight_timer) ecore_timer_del(widget_data->highlight_timer);
+   widget_data->highlight_timer = ecore_timer_add(0.5, _highlight_timer_cb, data);
+}
+
+static void
+_slider_screen_reader_changed(void *data, Evas_Object *obj, void *event_info)
+{
+   EEXT_CIRCLE_OBJECT_GET(data, circle_obj) return;
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
+
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+     {
+        if (!strcmp(evas_object_type_get(elm_object_parent_widget_get(widget_data->parent)), "elm_naviframe"))
+          evas_object_smart_callback_add(elm_object_parent_widget_get(widget_data->parent), "item,activated", _grab_highlight_cb, obj);
+        evas_object_event_callback_add(widget_data->parent, EVAS_CALLBACK_SHOW, _show_cb, NULL);
+        evas_object_smart_callback_add(elm_object_top_widget_get(widget_data->parent), "focused", _win_focus_cb, obj);
+     }
+   else
+     {
+        if (!strcmp(evas_object_type_get(elm_object_parent_widget_get(widget_data->parent)), "elm_naviframe"))
+          evas_object_smart_callback_del(elm_object_parent_widget_get(widget_data->parent), "item,activated", _grab_highlight_cb);
+        if (widget_data->highlight_timer)
+          {
+             ecore_timer_del(widget_data->highlight_timer);
+             widget_data->highlight_timer = NULL;
+          }
+        evas_object_event_callback_del(widget_data->parent, EVAS_CALLBACK_SHOW, _show_cb);
+        evas_object_smart_callback_del(elm_object_top_widget_get(widget_data->parent), "focused", _win_focus_cb);
+     }
+}
+
 static char *
-_accessible_description_cb(void *data, Evas_Object *obj)
+_get_accessible_name(Evas_Object *slider)
 {
    char *ret;
-   char buf[255];
    Eina_Strbuf *sbuf;
+   char buf[10];
    const char *slider_name;
-   const char *format;
-   Evas_Object *slider;
 
    sbuf = eina_strbuf_new();
-   slider = data;
    slider_name = elm_atspi_accessible_name_get(slider);
 
    bindtextdomain (PACKAGE, LOCALE_DIR);
    if (!slider_name) slider_name = "Slider";
+   snprintf(buf, sizeof(buf), "%d", (int)eext_circle_object_value_get(slider));
 
-   eina_strbuf_append(sbuf, slider_name);
-   eina_strbuf_append(sbuf, ", ");
-
-   format = _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS");
-   snprintf(buf, sizeof(buf), format, slider_name);
    eina_strbuf_append(sbuf, buf);
+   eina_strbuf_append(sbuf, ", ");
+   eina_strbuf_append(sbuf, slider_name);
 
    ret = eina_strbuf_string_steal(sbuf);
    eina_strbuf_free(sbuf);
-   return ret;
+   return strdup(ret);
 }
 
+static char *
+_get_accessible_description(Evas_Object *slider)
+{
+   char buf[255];
+   const char *slider_name;
+
+   slider_name = elm_atspi_accessible_name_get(slider);
+
+   bindtextdomain (PACKAGE, LOCALE_DIR);
+   if (!slider_name) slider_name = "Slider";
+
+   //ONEUI1.5(19Jun2019): Enable sw/hw bezel
+   char *str = NULL;
+   if (eext_rotary_event_type_get() == EEXT_ROTARY_EVENT_TYPE_HW_BEZEL)
+     str = _("WDS_ACCS_TBBODY_TURN_BEZEL_TO_ADJUST_PS");
+   else
+     str = _("WDS_ACCS_TBBODY_SWIPE_UP_OR_DOWN_TO_CHANGE_PS");
+   //
+
+   snprintf(buf, sizeof(buf), str, slider_name);
+   return strdup(buf);
+}
+
+static char *
+_accessible_name_cb(void *data, Evas_Object *obj)
+{
+   return _get_accessible_name((Evas_Object *)data);
+}
+
+static char *
+_accessible_description_cb(void *data, Evas_Object *obj)
+{
+   return _get_accessible_description((Evas_Object *)data);
+}
+//
+
 EAPI Evas_Object *
 eext_circle_object_slider_add(Evas_Object *parent, Eext_Circle_Surface *surface)
 {
@@ -770,12 +1193,44 @@ eext_circle_object_slider_add(Evas_Object *parent, Eext_Circle_Surface *surface)
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
 
    _eext_circle_object_slider_init(parent, circle_obj);
-
-   /* TODO: Reading information should be changed with UX team */
-   /* ELM_ATSPI_ROLE_PUSH_BUTTON to make layout grab highlight */
-   elm_atspi_accessible_role_set(parent, ELM_ATSPI_ROLE_PUSH_BUTTON);
+   //ONEUI1.5(02Jul2019): s/w bezel support
+   eext_rotary_event_changed_callback_add(_bezel_changed_cb, obj);
+
+   //ONEUI1.5(23Jul2019): sync with tizen4.0
+   edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B065L2", _eext_circle_object_slider_change_color_signal_cb, circle_obj);
+   edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B104L2D", _eext_circle_object_slider_change_color_signal_cb, circle_obj);
+   edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B065L3", _eext_circle_object_slider_change_color_signal_cb, circle_obj);
+   edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B104L1D", _eext_circle_object_slider_change_color_signal_cb, circle_obj);
+   edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B083", _eext_circle_object_slider_change_color_signal_cb, circle_obj);
+   edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B083P", _eext_circle_object_slider_change_color_signal_cb, circle_obj);
+   //
+
+   //ONEUI1.5(24Jan2019): Slider access support
+   elm_atspi_accessible_role_set(parent, ELM_ATSPI_ROLE_SLIDER);
+   elm_atspi_accessible_reading_info_type_set(parent, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME|ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+   elm_atspi_accessible_name_cb_set(parent, _accessible_name_cb, obj);
    elm_atspi_accessible_description_cb_set(parent, _accessible_description_cb, obj);
-   elm_atspi_accessible_reading_info_type_set(parent, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+   //
+   //ONEUI1.5(19Jun2019): Enable sw/hw bezel
+   if (!eext_rotary_event_is_enabled())
+   //
+     {
+        evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, NULL);
+        evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, NULL);
+        evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_OUT, _mouse_out_cb, NULL);
+        evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, NULL);
+     }
+   //ONEUI1.5(11Jan2019): Slider access support
+   evas_object_smart_callback_add(parent, "atspi,screen,reader,changed", _slider_screen_reader_changed, obj);
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+     {
+        if (!strcmp(evas_object_type_get(elm_object_parent_widget_get(parent)), "elm_naviframe"))
+          evas_object_smart_callback_add(elm_object_parent_widget_get(parent), "item,activated", _grab_highlight_cb, obj);
+        evas_object_event_callback_add(parent, EVAS_CALLBACK_SHOW, _show_cb, NULL);
+        evas_object_smart_callback_add(elm_object_top_widget_get(parent), "focused", _win_focus_cb, obj);
+     }
+   elm_atspi_accessible_gesture_cb_set(parent, _slider_gesture_cb, obj);
+   //
 
    return obj;
 }
@@ -842,4 +1297,4 @@ _eext_circle_object_slider_value_transit_set_internal(Evas_Object *obj, double v
                                               0.25, 0.46, 0.45, 1.0);
 
    return EINA_TRUE;
-}
\ No newline at end of file
+}
index 8d4a7da16d68a760f096cbe8960540b3b2c8a414..67ea7bd54f57a37476375f9935c814388efdd57a 100644 (file)
@@ -29,7 +29,9 @@
 
 static const char SIGNAL_ACTIVATED[] = "rotary,activated";
 static const char SIGNAL_DEACTIVATED[] = "rotary,deactivated";
+extern void *elm_object_accessibility_currently_highlighted_get(void);
 
+//ONEUI1.5(04Jul2019): Apply blink effect
 static void
 _start_blink_effect(Evas_Object *obj)
 {
@@ -53,100 +55,172 @@ _stop_blink_effect(Evas_Object *obj)
 }
 
 static void
-_eext_circle_object_spinner_activated_cb(void *data,
-                                         Evas_Object *obj EINA_UNUSED,
-                                         void *event_info EINA_UNUSED)
+_spinner_bezel_changed_cb(int *node, void *data)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
    EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
 
-   widget_data->spinner_activated = EINA_TRUE;
-   _start_blink_effect(circle_obj->widget_object);
+   Eina_Bool rotary = eext_rotary_event_is_enabled();
+   if (rotary && widget_data->spinner_activated)
+     _start_blink_effect(circle_obj->widget_object);
+   else
+     _stop_blink_effect(circle_obj->widget_object);
+}
+//
 
+static void
+_eext_circle_object_spinner_activated_cb(void *data,
+                                         Evas_Object *obj,
+                                         void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
+   widget_data->spinner_activated = EINA_TRUE;
+   //ONEUI1.5(04Jul2019): Apply blink effect
+   if (eext_rotary_event_is_enabled())
+      _start_blink_effect(circle_obj->widget_object);
+   eext_rotary_event_changed_callback_add(_spinner_bezel_changed_cb, circle_obj);
 }
 
 static void
 _eext_circle_object_spinner_deactivated_cb(void *data,
-                                         Evas_Object *obj EINA_UNUSED,
-                                         void *event_info EINA_UNUSED)
+                                         Evas_Object *obj,
+                                         void *event_info)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
    EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
-
    widget_data->spinner_activated = EINA_FALSE;
+   //ONEUI1.5(04Jul2019): Apply blink effect
    _stop_blink_effect(circle_obj->widget_object);
+   eext_rotary_event_changed_callback_del(_spinner_bezel_changed_cb);
+   //
 }
 
 static void
 _eext_circle_object_spinner_genlist_activated_cb(void *data,
-                                         Evas_Object *obj EINA_UNUSED,
-                                         void *event_info EINA_UNUSED)
+                                         Evas_Object *obj,
+                                         void *event_info)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
    EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
-
    widget_data->genlist_activated = EINA_TRUE;
 }
 
 static void
 _eext_circle_object_spinner_genlist_deactivated_cb(void *data,
-                                         Evas_Object *obj EINA_UNUSED,
-                                         void *event_info EINA_UNUSED)
+                                         Evas_Object *obj,
+                                         void *event_info)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
    EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
-
    widget_data->genlist_activated = EINA_FALSE;
 }
 
 static void
-_spinner_genlist_hide_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+_spinner_genlist_hide_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
-
+   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)data;
    if (!widget_data->circle_genlist) return;
-
    widget_data->genlist_visible = EINA_FALSE;
+   if (widget_data->genlist_activated) eext_rotary_object_event_activated_set(widget_data->circle_obj->widget_object, EINA_TRUE);
+}
 
-   if (widget_data->genlist_activated) eext_rotary_object_event_activated_set(circle_obj->widget_object, EINA_TRUE);
+//ONEUI1.5(14Mar2019): Scrolling should be enabled after current value item is aligned
+static void
+_spinner_genlist_aligned_item_detected_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)data;
+   if (widget_data->spinner_activated && widget_data->genlist_visible)
+     eext_rotary_object_event_activated_set(widget_data->circle_genlist, EINA_TRUE);
 }
+//
 
 static void
 _spinner_genlist_show_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
-
+   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)data;
    Evas_Object *genlist = NULL;
-
    if (!widget_data->circle_genlist)
      {
         genlist = elm_object_part_content_get(obj, "elm.swallow.genlist");
-
         widget_data->genlist = genlist;
-        widget_data->circle_genlist = eext_circle_object_genlist_add(widget_data->genlist, circle_obj->surface);
-
+        widget_data->circle_genlist = eext_circle_object_genlist_add(widget_data->genlist, widget_data->circle_obj->surface);
         eext_circle_object_genlist_scroller_policy_set(widget_data->circle_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
-
-        evas_object_smart_callback_add(widget_data->genlist, "hide", _spinner_genlist_hide_cb, circle_obj);
-        evas_object_smart_callback_add(widget_data->circle_genlist, SIGNAL_ACTIVATED, _eext_circle_object_spinner_genlist_activated_cb, circle_obj);
-        evas_object_smart_callback_add(widget_data->circle_genlist, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_genlist_deactivated_cb, circle_obj);
+        evas_object_smart_callback_add(widget_data->genlist, "hide", _spinner_genlist_hide_cb, widget_data);
+        //ONEUI1.5(14Mar2019): Scrolling should be enabled after current value item is aligned
+        evas_object_smart_callback_add(widget_data->genlist, "aligned,item,detected", _spinner_genlist_aligned_item_detected_cb, widget_data);
+        //
+        evas_object_smart_callback_add(widget_data->circle_genlist, SIGNAL_ACTIVATED, _eext_circle_object_spinner_genlist_activated_cb, widget_data->circle_obj);
+        evas_object_smart_callback_add(widget_data->circle_genlist, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_genlist_deactivated_cb, widget_data->circle_obj);
      }
-
    widget_data->genlist_visible = EINA_TRUE;
-   if (widget_data->spinner_activated) eext_rotary_object_event_activated_set(widget_data->circle_genlist, EINA_TRUE);
 }
 
+//ONEUI1.5(28Feb2019): update spinner value based on rotation direction
+static void
+_update_spinner_value(Evas_Object *spinner, Eext_Rotary_Event_Direction direction)
+{
+   double current_val, step_val, max_val, min_val;
+   Eina_Bool wrap_mode;
+   current_val = elm_spinner_value_get(spinner);
+   step_val = elm_spinner_step_get(spinner);
+   elm_spinner_min_max_get(spinner, &min_val, &max_val);
+   wrap_mode = elm_spinner_wrap_get(spinner);
+   if (direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
+     {
+        if (wrap_mode)
+          {
+             if (current_val == max_val)
+               elm_spinner_value_set(spinner, min_val);
+             else
+               elm_spinner_value_set(spinner, current_val + step_val);
+          }
+        else
+          {
+             if (current_val == max_val)
+               elm_spinner_value_set(spinner, max_val);
+             else
+               elm_spinner_value_set(spinner, current_val + step_val);
+          }
+     }
+   else if (direction == EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE)
+     {
+        if (wrap_mode)
+          {
+             if (current_val == min_val)
+               elm_spinner_value_set(spinner, max_val);
+             else
+               elm_spinner_value_set(spinner, current_val - step_val);
+          }
+        else
+          {
+             if (current_val == min_val)
+               elm_spinner_value_set(spinner, min_val);
+             else
+               elm_spinner_value_set(spinner, current_val - step_val);
+          }
+     }
+}
+//
+
 static Eina_Bool
-_rotary_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, Eext_Rotary_Event_Info *info EINA_UNUSED)
+_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
 {
    Eext_Circle_Object *circle_obj = data;
    Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
-   if (!widget_data->genlist_visible)
+   Eina_Bool is_activated_or_is_highlighted = EINA_FALSE;
+
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+     is_activated_or_is_highlighted = (elm_object_accessibility_currently_highlighted_get() == (void*)circle_obj->widget_object);
+   else is_activated_or_is_highlighted = widget_data->spinner_activated;
+
+   if (!widget_data->genlist_visible && is_activated_or_is_highlighted)
      {
+        //ONEUI1.5(28Feb2019): update spinner value based on rotation direction
+        _update_spinner_value(circle_obj->widget_object, info->direction);
+        //
         widget_data->genlist_visible = EINA_TRUE;
-        elm_layout_signal_emit(circle_obj->widget_object, "elm,action,genlist,toggle", "elm");
+        elm_layout_signal_emit(circle_obj->widget_object, "elm,action,entry,toggle", "elm");
      }
    return EINA_TRUE;
 }
@@ -156,14 +230,12 @@ _eext_circle_object_spinner_del_cb(Eext_Circle_Object *obj)
 {
    if (!obj)
      return;
-
    EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(obj, widget_data) return;
 
    evas_object_smart_callback_del_full(obj->widget_object, SIGNAL_ACTIVATED, _eext_circle_object_spinner_activated_cb, obj);
    evas_object_smart_callback_del_full(obj->main_obj, SIGNAL_ACTIVATED, _eext_circle_object_spinner_activated_cb, obj);
    evas_object_smart_callback_del_full(obj->widget_object, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_deactivated_cb, obj);
    evas_object_smart_callback_del_full(obj->main_obj, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_deactivated_cb, obj);
-
    if (widget_data->circle_genlist)
      {
         evas_object_smart_callback_del_full(widget_data->circle_genlist, SIGNAL_ACTIVATED, _eext_circle_object_spinner_genlist_activated_cb, obj);
@@ -190,19 +262,19 @@ _eext_circle_object_spinner_init(Eext_Circle_Object *obj, Evas_Object *spinner)
    data = (Eext_Circle_Object_Spinner_Data *)calloc(1, sizeof(Eext_Circle_Object_Spinner_Data));
    if (!data)
      {
-        ERR("Could not allocate memory for Eext_Circle_Object_Spinner_Data!");
+        LOGE("Could not allocate memory for Eext_Circle_Object_Spinner_Data!");
         return;
      }
 
+   data->circle_obj = obj;
    obj->widget_data = (void *)data;
    data->genlist_visible = EINA_FALSE;
    data->spinner_activated = EINA_FALSE;
    data->genlist_activated = EINA_FALSE;
-   evas_object_smart_callback_add(spinner, "list,show", _spinner_genlist_show_cb, obj);
+   evas_object_smart_callback_add(spinner, "genlist,show", _spinner_genlist_show_cb, data);
 
    eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
    eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj);
-
    evas_object_smart_callback_add(obj->widget_object, SIGNAL_ACTIVATED, _eext_circle_object_spinner_activated_cb, obj);
    evas_object_smart_callback_add(obj->main_obj, SIGNAL_ACTIVATED, _eext_circle_object_spinner_activated_cb, obj);
    evas_object_smart_callback_add(obj->widget_object, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_deactivated_cb, obj);
index 831f62515c2dc896d5bc3df956b6d0f8233381cf..3215f33f3c2245756e4414cae39836a3ffc43815 100644 (file)
@@ -30,7 +30,7 @@ _eext_circle_surface_main_obj_add(Evas_Object *parent)
 
    if (!main_obj)
      {
-        ERR("Failed to create elm_table object.");
+        LOGE("Failed to create elm_table object.");
         return NULL;
      }
 
@@ -55,7 +55,7 @@ _eext_circle_surface_vector_draw_arc(Efl_VG *vg,
    r = (r * a) / 255;
    g = (g * a) / 255;
    b = (b * a) / 255;
-   evas_vg_shape_stroke_color_set(vg, r, g, b, a);
+   efl_gfx_shape_stroke_color_set(vg, r, g, b, a);
 
    int x, y, w, h;
    w = radius  * 2;
@@ -63,12 +63,12 @@ _eext_circle_surface_vector_draw_arc(Efl_VG *vg,
    x = (surface_width - w) / 2;
    y = (surface_height - h) / 2;
 
-   evas_vg_shape_append_arc(vg, x, y, w, h, (angle1 * -1) + 90, (angle2 - angle1) * -1);
+   efl_gfx_path_append_arc(vg, x, y, w, h, (angle1 * -1) + 90, (angle2 - angle1) * -1);
 
    if (round_cap)
-     evas_vg_shape_stroke_cap_set(vg, EFL_GFX_CAP_ROUND);
+     efl_gfx_shape_stroke_cap_set(vg, EFL_GFX_CAP_ROUND);
    else
-     evas_vg_shape_stroke_cap_set(vg, EFL_GFX_CAP_BUTT);
+     efl_gfx_shape_stroke_cap_set(vg, EFL_GFX_CAP_BUTT);
 }
 
 static void
@@ -81,7 +81,7 @@ _eext_circle_surface_render(void *data)
 
    if (!surface)
      {
-        ERR("Surface is NULL... Going to remove surface render function.");
+        LOGE("Surface is NULL... Going to remove surface render function.");
         return;
      }
 
@@ -91,8 +91,8 @@ _eext_circle_surface_render(void *data)
      {
         Eext_Circle_Object_Item *item;
 
-        if ((!render_obj->visible) ||
-            (render_obj->visible_on_activate && !(render_obj->is_active)))
+        if (!render_obj->changed && ((!render_obj->visible) ||
+            (render_obj->visible_on_activate && !(render_obj->is_active))))
           {
              efl_parent_set(render_obj->vg_container, render_obj->main_obj);
              continue;
@@ -102,6 +102,7 @@ _eext_circle_surface_render(void *data)
              efl_parent_set(render_obj->vg_container, surface->vg_root);
           }
 
+        render_obj->changed = EINA_FALSE;
         /* Find the last object's bg file path.
          * Currently, only one bg image can be drawn. */
         if (_eext_circle_object_bg_file_path_get(render_obj))
@@ -116,8 +117,9 @@ _eext_circle_surface_render(void *data)
         EINA_LIST_FOREACH(render_obj->items, ll, item)
           {
              // Skip invisible item.
-             if (item->draw.color.a == 0) continue;
+             if (!item->color_changed && item->draw.color.a == 0) continue;
 
+             item->color_changed = EINA_FALSE;
              // If there is no text, the item is arc item.
              if (!item->text)
                {
@@ -125,14 +127,14 @@ _eext_circle_surface_render(void *data)
                   if (item->line_width)
                     {
                        double angle1, angle2;
-                       Eina_Bool is_mirrored = EINA_FALSE;
+                       surface->is_mirrored = EINA_FALSE;
 
                        if (render_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_CONFIG)
-                         is_mirrored = elm_config_mirrored_get();
+                         surface->is_mirrored = elm_config_mirrored_get();
                        else if (render_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_ON)
-                         is_mirrored = EINA_TRUE;
+                         surface->is_mirrored = EINA_TRUE;
 
-                       if (is_mirrored)
+                       if (surface->is_mirrored)
                          {
                             angle1 = (item->draw.angle_offset + item->min_angle) * -1;
                             angle2 = (item->draw.angle_offset + item->draw.angle) * -1;
@@ -182,6 +184,7 @@ static void
 _eext_circle_surface_render_finish(Eext_Circle_Surface *surface)
 {
    if (!surface) return;
+   if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return;
 
    if (surface->render_job) ecore_job_del(surface->render_job);
    surface->render_job = NULL;
@@ -190,6 +193,9 @@ _eext_circle_surface_render_finish(Eext_Circle_Surface *surface)
 static void
 _eext_circle_surface_vector_finish(Eext_Circle_Surface *surface)
 {
+   if (!surface) return;
+   if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return;
+
    if (surface->vg_obj) evas_object_del(surface->vg_obj);
 
    surface->vg_obj = NULL;
@@ -207,7 +213,7 @@ _eext_circle_surface_vector_init(Eext_Circle_Surface *surface)
 
    if (surface->main_obj == NULL)
      {
-        ERR("Fail to get buffer from image object!");
+        LOGE("Fail to get buffer from image object!");
         return;
      }
 
@@ -237,7 +243,7 @@ _eext_circle_surface_update(Eext_Circle_Surface *surface)
 
    if ((surface->w != 0) && (surface->h != 0))
      {
-        INF("Surface will be initialized!");
+        LOGI("Surface will be initialized!");
         _eext_circle_surface_vector_init(surface);
         _eext_circle_surface_changed(surface);
      }
@@ -260,7 +266,10 @@ _eext_circle_surface_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_i
 {
    Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
 
-   INF("Surface is going to free in delete callback for image widget.");
+   if (!surface) return;
+   if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return;
+
+   LOGI("Surface is going to free in delete callback for image widget.");
    _eext_circle_surface_del_internal(surface);
 }
 
@@ -268,6 +277,8 @@ static void
 _eext_circle_surface_parent_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
    Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+   if (!surface) return;
+   if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return;
 
    surface->parent = NULL;
 }
@@ -276,6 +287,8 @@ static void
 _eext_circle_surface_hide_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
    Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+   if (!surface) return;
+   if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return;
 
    evas_object_hide(surface->vg_obj);
    _eext_circle_surface_render_finish(surface);
@@ -294,6 +307,7 @@ static void
 _eext_circle_surface_object_rotary_activated_cb(void *data, Evas_Object *obj, void *event_info)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   if (!circle_obj) return;
 
    evas_object_show(circle_obj->main_obj);
    circle_obj->is_active = EINA_TRUE;
@@ -325,6 +339,8 @@ static void
 _deactivated_obj_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   if (!circle_obj) return;
+   if (!EINA_MAGIC_CHECK(circle_obj->surface, EEXT_CIRCLE_SURFACE_MAGIC)) return;
 
    if (circle_obj && circle_obj->surface && circle_obj->surface->parent_surface &&
        (circle_obj->surface->parent_surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME))
@@ -338,10 +354,13 @@ static void
 _eext_circle_surface_object_rotary_deactivated_cb(void *data, Evas_Object *obj, void *event_info)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   if (!circle_obj) return;
 
    evas_object_hide(circle_obj->main_obj);
    circle_obj->is_active = EINA_FALSE;
 
+   if (!EINA_MAGIC_CHECK(circle_obj->surface, EEXT_CIRCLE_SURFACE_MAGIC)) return;
+
    // Previous view's circle object should not be disappeared while naviframe effect.
    // At here, just keep the current deactivated object.
    if (circle_obj->surface && circle_obj->surface->parent_surface &&
@@ -362,11 +381,11 @@ _eext_circle_surface_object_rotary_deactivated_cb(void *data, Evas_Object *obj,
 static Eext_Circle_Surface *
 _eext_circle_surface_naviframe_item_view_add(Evas_Object *layout)
 {
-   Eext_Circle_Surface *surface;
+   Eext_Circle_Surface *surface = NULL;
 
    if (!layout)
      {
-        ERR("The given Evas_Object is NULL! It returns NULL.");
+        LOGE("The given Evas_Object is NULL! It returns NULL.");
         return NULL;
      }
 
@@ -374,20 +393,27 @@ _eext_circle_surface_naviframe_item_view_add(Evas_Object *layout)
      {
         surface = _eext_circle_surface_add(layout, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
 
+        if (!surface)
+          {
+             LOGE("Surface creation failed!");
+             return NULL;
+          }
+
+
         if (!surface->main_obj)
           {
-             ERR("Surface doesn't have image widget for drawing. It returns NULL.");
+             LOGE("Surface doesn't have image widget for drawing. It returns NULL.");
              return NULL;
           }
 
-        INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->main_obj, layout);
+        LOGI("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->main_obj, layout);
         elm_object_part_content_set(layout, "elm.swallow.circle", surface->main_obj);
 
         return surface;
      }
    else
      {
-        ERR("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL.");
+        LOGE("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL.");
         return NULL;
      }
 }
@@ -396,15 +422,16 @@ static void _naviframe_item_push_cb(void *data, Evas_Object *obj, void *event_in
 {
    Evas_Object *view = (Evas_Object *)event_info;
    Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
-   Eext_Circle_Surface *view_surface;
-   Eext_Circle_Object *circle_obj;
-   Eina_List *l, *l_next;
+   Eext_Circle_Surface *view_surface = NULL;
+   Eext_Circle_Object *circle_obj = NULL;
+   Eina_List *l = NULL, *l_next = NULL;
 
    if (!surface)
      {
-        ERR("No matched surface exists for the naviframe:%p", obj);
+        LOGE("No matched surface exists for the naviframe:%p", obj);
         return;
      }
+   if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return;
 
    view_surface = _eext_circle_surface_naviframe_item_view_add(view);
    view_surface->parent_surface = surface;
@@ -434,8 +461,10 @@ static void _naviframe_item_push_cb(void *data, Evas_Object *obj, void *event_in
 static void
 _eext_circle_surface_del_internal(Eext_Circle_Surface *surface)
 {
-   Eext_Circle_Object *obj;
-   Eina_List *l, *l_next;
+   Eext_Circle_Object *obj = NULL;
+   Eina_List *l = NULL, *l_next = NULL;
+   if (!surface) return;
+   if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return;
 
    if (surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
      {
@@ -477,7 +506,7 @@ _eext_circle_surface_del_internal(Eext_Circle_Surface *surface)
         if (surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
           {
              Eext_Circle_Surface *private_surface;
-             INF("Private Surface will be initialized for widget[%p], circle_obj[%p]!",
+             LOGI("Private Surface will be initialized for widget[%p], circle_obj[%p]!",
                   obj->main_obj, obj);
 
              surface->render_objs = eina_list_remove_list(surface->render_objs, l);
@@ -502,12 +531,19 @@ _eext_circle_surface_del_internal(Eext_Circle_Surface *surface)
           }
      }
 
+   if (surface->map)
+     evas_map_free(surface->map);
+
+
    if (surface->bg_file_path)
      {
         eina_stringshare_del(surface->bg_file_path);
         surface->bg_file_path = NULL;
      }
 
+   EINA_MAGIC_SET(surface, EINA_MAGIC_NONE);
+   LOGI("surface %p is freed", surface);
+
    free(surface);
 }
 
@@ -535,14 +571,15 @@ _eext_circle_surface_common_init(Eext_Circle_Surface *surface)
 Eext_Circle_Surface *
 _eext_circle_surface_init(Evas_Object *main_obj, Evas_Object *parent, Eext_Circle_Surface_Type type)
 {
-   Eext_Circle_Surface *surface;
+   Eext_Circle_Surface *surface = NULL;
 
    surface = (Eext_Circle_Surface *)calloc(1, sizeof(Eext_Circle_Surface));
    if (!surface)
      {
-        ERR("Fail to calloc for (Eext_Circle_Surface)");
+        LOGE("Fail to calloc for (Eext_Circle_Surface)");
         return NULL;
      }
+   EINA_MAGIC_SET(surface, EEXT_CIRCLE_SURFACE_MAGIC);
 
    surface->type = type;
    surface->parent = parent;
@@ -552,11 +589,23 @@ _eext_circle_surface_init(Evas_Object *main_obj, Evas_Object *parent, Eext_Circl
 
    if (type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
      {
+        // ONEUI1.5 (20180508) : Fix for avoiding multiple callbacks when multiple naviframe surfaces are added
+        evas_object_smart_callback_del(surface->parent, "item,pushed,internal", _naviframe_item_push_cb);
+        evas_object_event_callback_del(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb);
+        //
+
         // If the surface is created with elm_naviframe.
         evas_object_smart_callback_add(surface->parent, "item,pushed,internal", _naviframe_item_push_cb, surface);
         evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
      }
-   else if (type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
+   else if (type == EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
+     {
+        evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb, surface);
+        evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
+        evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb, surface);
+        evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb, surface);
+     }
+   else
      {
         evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_parent_del_cb, surface);
      }
@@ -579,6 +628,7 @@ _eext_circle_surface_object_remove(Eext_Circle_Surface *surface, Eext_Circle_Obj
    Eext_Circle_Object_Item *item;
 
    if (!surface) return;
+   if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return;
    if (!obj) return;
 
    EINA_LIST_FOREACH(obj->items, l, item)
@@ -621,6 +671,7 @@ void
 _eext_circle_surface_object_append(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
 {
    if (!surface) return;
+   if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return;
    if (!obj) return;
 
    if (obj->surface)
@@ -649,7 +700,6 @@ _eext_circle_surface_object_append(Eext_Circle_Surface *surface, Eext_Circle_Obj
                   parent = elm_object_parent_widget_get(parent);
                   if (parent == surface->parent) break;
                }
-
           }
      }
 
@@ -682,6 +732,7 @@ _eext_circle_surface_object_exclusive_show(Eext_Circle_Surface *surface, Eext_Ci
    Eina_List *l;
 
    if (!surface) return;
+   if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return;
    if (!obj) return;
 
    if (!evas_object_visible_get(obj->main_obj) &&
@@ -699,6 +750,8 @@ void
 _eext_circle_surface_changed(Eext_Circle_Surface *surface)
 {
    if (!surface) return;
+   if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return;
+   surface->changed = EINA_TRUE;
 
    if (!surface->render_job && surface->main_obj &&
        evas_object_visible_get(surface->main_obj) &&
@@ -730,12 +783,12 @@ _eext_circle_surface_add(Evas_Object *parent, Eext_Circle_Surface_Type type)
 EAPI Eext_Circle_Surface *
 eext_circle_surface_conformant_add(Evas_Object *conform)
 {
-   Eext_Circle_Surface *surface;
+   Eext_Circle_Surface *surface = NULL;
    const char *type = NULL;
 
    if (!conform)
      {
-        ERR("The given Evas_Object is NULL! It returns NULL.");
+        LOGE("The given Evas_Object is NULL! It returns NULL.");
         return NULL;
      }
 
@@ -748,11 +801,11 @@ eext_circle_surface_conformant_add(Evas_Object *conform)
 
         if (!surface->main_obj)
           {
-             ERR("Surface doesn't have image widget for drawing. It returns NULL.");
+             LOGE("Surface doesn't have image widget for drawing. It returns NULL.");
              return NULL;
           }
 
-        INF("Put the surface[%p]'s widget[%p] to elm_conformant widget[%p]", surface, surface->main_obj, conform);
+        LOGI("Put the surface[%p]'s widget[%p] to elm_conformant widget[%p]", surface, surface->main_obj, conform);
 
         efl_content_set(efl_part(conform, "efl.content.circle"), surface->main_obj);
 
@@ -767,43 +820,49 @@ eext_circle_surface_conformant_add(Evas_Object *conform)
           {
              if (!edje_object_part_exists(elm_layout_edje_get(conform), "elm.swallow.circle"))
                {
-                  ERR("There is no \"elm.swallow.circle\" part in elm_conformant widget! It returns NULL.");
+                  LOGE("There is no \"elm.swallow.circle\" part in elm_conformant widget! It returns NULL.");
                   return NULL;
                }
 
              surface = _eext_circle_surface_add(conform, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
+             if (!surface)
+               {
+                  LOGE("Surface creation failed!");
+                  return NULL;
+               }
 
              if (!surface->main_obj)
                {
-                  ERR("Surface doesn't have image widget for drawing. It returns NULL.");
+                  LOGE("Surface doesn't have image widget for drawing. It returns NULL.");
+                  _eext_circle_surface_del_internal(surface);
                   return NULL;
                }
 
-             INF("Put the surface[%p]'s widget[%p] to elm_conformant widget[%p]", surface, surface->main_obj, conform);
+             LOGI("Put the surface[%p]'s widget[%p] to elm_conformant widget[%p]", surface, surface->main_obj, conform);
              elm_object_part_content_set(conform, "elm.swallow.circle", surface->main_obj);
 
              return surface;
           }
         else
           {
-             ERR("elm_object_style_set is failed! The theme doesn't have \"elm/conformant/base/circle\" group. It returns NULL.");
+             LOGE("elm_object_style_set is failed! The theme doesn't have \"elm/conformant/base/circle\" group. It returns NULL.");
              return NULL;
           }
      }
 
-   ERR("The given Evas_Object[%p] is not elm_conformant widget! It returns NULL.", conform);
+   LOGE("The given Evas_Object[%p] is not elm_conformant widget! It returns NULL.", conform);
    return NULL;
 }
 
 EAPI Eext_Circle_Surface *
 eext_circle_surface_layout_add(Evas_Object *layout)
 {
-   Eext_Circle_Surface *surface;
+   Eext_Circle_Surface *surface = NULL;
    const char *type = NULL;
 
    if (!layout)
      {
-        ERR("The given Evas_Object is NULL! It returns NULL.");
+        LOGE("The given Evas_Object is NULL! It returns NULL.");
         return NULL;
      }
 
@@ -815,43 +874,50 @@ eext_circle_surface_layout_add(Evas_Object *layout)
           {
              if (!edje_object_part_exists(elm_layout_edje_get(layout), "elm.swallow.circle"))
                {
-                  ERR("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL.");
+                  LOGE("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL.");
                   return NULL;
                }
 
              surface = _eext_circle_surface_add(layout, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
 
+             if (!surface)
+               {
+                  LOGE("Surface creation failed!");
+                  return NULL;
+               }
+
+
              if (!surface->main_obj)
                {
-                  ERR("Surface doesn't have image widget for drawing. It returns NULL.");
+                  LOGE("Surface doesn't have image widget for drawing. It returns NULL.");
                   return NULL;
                }
 
-             INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->main_obj, layout);
+             LOGI("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->main_obj, layout);
              elm_object_part_content_set(layout, "elm.swallow.circle", surface->main_obj);
 
              return surface;
           }
         else
           {
-             ERR("elm_layout_theme_set is failed! The theme doesn't have \"elm/layout/circle/surface\" group. It returns NULL.");
+             LOGE("elm_layout_theme_set is failed! The theme doesn't have \"elm/layout/circle/surface\" group. It returns NULL.");
              return NULL;
           }
      }
 
-   ERR("The given Evas_Object[%p] is not elm_layout widget! It returns NULL.", layout);
+   LOGE("The given Evas_Object[%p] is not elm_layout widget! It returns NULL.", layout);
    return NULL;
 }
 
 EAPI Eext_Circle_Surface *
 eext_circle_surface_naviframe_add(Evas_Object *naviframe)
 {
-   Eext_Circle_Surface *surface;
+   Eext_Circle_Surface *surface = NULL;
    const char *type = NULL;
 
    if (!naviframe)
      {
-        ERR("The given Evas_Object is NULL! It returns NULL.");
+        LOGE("The given Evas_Object is NULL! It returns NULL.");
         return NULL;
      }
 
@@ -860,10 +926,14 @@ eext_circle_surface_naviframe_add(Evas_Object *naviframe)
    if (type && (!strcmp(type, "Elm_Naviframe") || !strcmp(type, "elm_naviframe")))
      {
         surface = _eext_circle_surface_add(naviframe, EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME);
+
+        Evas_Object *win = elm_object_top_widget_get(naviframe);
+        evas_object_data_set(win, "EEXT_NAVIFRAME_SURFACE", surface);
+
         return surface;
      }
 
-   ERR("The given Evas_Object[%p] is not elm_naviframe widget! It returns NULL.", naviframe);
+   LOGE("The given Evas_Object[%p] is not elm_naviframe widget! It returns NULL.", naviframe);
    return NULL;
 }
 
@@ -872,21 +942,21 @@ eext_circle_surface_del(Eext_Circle_Surface *surface)
 {
    if (!surface)
      {
-        ERR("Surface is already NULL");
+        LOGE("Surface is already NULL");
         return;
      }
+   if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return;
 
    if (surface->main_obj)
      {
+
         _eext_circle_surface_vector_finish(surface);
         _eext_circle_surface_render_finish(surface);
 
-        evas_object_event_callback_del(surface->main_obj, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb);
-        evas_object_event_callback_del(surface->main_obj, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb);
         evas_object_del(surface->main_obj);
         surface->main_obj = NULL;
      }
 
-   INF("Surface[%p] is going to free in eext_circle_surface_del API.", surface);
+   LOGI("Surface[%p] is going to free in eext_circle_surface_del API.", surface);
    _eext_circle_surface_del_internal(surface);
 }
index f523272fc0dba79f1133caca0ac88d4da7d9bb0c..7a5760f9b0c3dff2ccfa423150f2830587b86353 100644 (file)
@@ -105,21 +105,21 @@ eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data)
    Eext_Rotary_Handler *new_hd = NULL;
    if (!func) return EINA_FALSE;
 
-   INF("detent: In");
+   LOGI("detent: In");
    /* init event registration */
    if (!_is_init)
      {
 #ifdef WITH_X
         if (!_init_Xi2_system())
           {
-             ERR("Failed to init Xi2 system");
+             LOGE("Failed to init Xi2 system");
              return EINA_FALSE;
           }
 #endif
 #ifdef WITH_WAYLAND
         if (!_init_ecore_event())
           {
-             ERR("Failed to init ecore_event");
+             LOGE("Failed to init ecore_event");
              return EINA_FALSE;
           }
 #endif
@@ -134,7 +134,7 @@ eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data)
                                                   _motion_changed_cb, NULL);
         if (!_motion_handler)
           {
-             ERR("Cannot register generic ecore event handler");
+             LOGE("Cannot register generic ecore event handler");
              return EINA_FALSE;
           }
      }
@@ -146,7 +146,7 @@ eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data)
                                                         _ecore_detent_cb, NULL);
         if (!_ecore_detent_handler)
           {
-             ERR("Cannot register ecore detent handler");
+             LOGE("Cannot register ecore detent handler");
              return EINA_FALSE;
           }
      }
@@ -157,7 +157,7 @@ eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data)
                                                   _rotary_rotate_event_cb, NULL);
         if (!_rotate_handler)
           {
-             ERR("Cannot register eext rotate event handler");
+             LOGE("Cannot register eext rotate event handler");
              return EINA_FALSE;
           }
      }
@@ -165,7 +165,7 @@ eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data)
    new_hd = malloc(sizeof(Eext_Rotary_Handler));
    if (!new_hd)
      {
-        ERR("Cannot allocate memory");
+        LOGE("Cannot allocate memory");
         return EINA_FALSE;
      }
    new_hd->func = func;
@@ -178,7 +178,7 @@ eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data)
 EAPI void *
 eext_rotary_event_handler_del(Eext_Rotary_Handler_Cb func)
 {
-   INF("detent: In");
+   LOGI("detent: In");
    Eina_List *l = NULL;
    Eext_Rotary_Handler *hd = NULL;
    void *data = NULL;
@@ -203,14 +203,14 @@ eext_rotary_event_handler_del(Eext_Rotary_Handler_Cb func)
 EAPI Eina_Bool
 eext_rotary_object_event_callback_add(Evas_Object *obj, Eext_Rotary_Event_Cb func, void *data)
 {
-   INF("In");
+   LOGI("In");
    return eext_rotary_object_event_callback_priority_add(obj, 0, func, data);
 }
 
 EAPI Eina_Bool
 eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_Priority priority, Eext_Rotary_Event_Cb func, void *data)
 {
-   INF("detent: In");
+   LOGI("detent: In");
    Eina_List *l;
    Eext_Rotary_Obj_Pri *op = NULL;
    Eext_Rotary_Cb *cb = NULL, *new_cb = NULL;
@@ -223,7 +223,7 @@ eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_P
      {
         if (!eext_rotary_event_handler_add(_rotary_rotate_handler_cb, NULL))
           {
-             ERR("Cannot register rotary handler");
+             LOGE("Cannot register rotary handler");
              return EINA_FALSE;
           }
         _handler_registered = EINA_TRUE;
@@ -232,7 +232,7 @@ eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_P
    new_cb = malloc(sizeof(Eext_Rotary_Cb));
    if (!new_cb)
      {
-        ERR("Cannot allocate memory");
+        LOGE("Cannot allocate memory");
         return EINA_FALSE;
      }
    new_cb->obj = obj;
@@ -258,7 +258,7 @@ eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_P
         new_op = calloc(1, sizeof(Eext_Rotary_Obj_Pri));
         if (!new_op)
           {
-             ERR("Cannot allocate memory");
+             LOGE("Cannot allocate memory");
              free(new_cb);
              return EINA_FALSE;
           }
@@ -292,12 +292,12 @@ eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_P
 EAPI void *
 eext_rotary_object_event_callback_del(Evas_Object *obj, Eext_Rotary_Event_Cb func)
 {
-   INF("In");
+   LOGI("In");
    Eina_List *l = NULL;
    Eext_Rotary_Cb *cb = NULL;
    void *data = NULL;
 
-   INF("callback del %p, %s, func : %p", obj, evas_object_type_get(obj), func);
+   LOGI("callback del %p, %s, func : %p", obj, evas_object_type_get(obj), func);
 
    EINA_LIST_FOREACH(_callbacks, l, cb)
      {
@@ -305,7 +305,7 @@ eext_rotary_object_event_callback_del(Evas_Object *obj, Eext_Rotary_Event_Cb fun
           {
              data = cb->data;
              _callbacks = eina_list_remove(_callbacks, cb);
-             INF("Removed cb from callbacks");
+             LOGI("Removed cb from callbacks");
              break;
           }
         cb = NULL;
@@ -323,14 +323,14 @@ eext_rotary_object_event_callback_del(Evas_Object *obj, Eext_Rotary_Event_Cb fun
                }
           }
         free(cb);
-        INF("Freed cb");
+        LOGI("Freed cb");
      }
    if (!_callbacks)
      {
         eext_rotary_event_handler_del(_rotary_rotate_handler_cb);
         _handler_registered = EINA_FALSE;
      }
-   INF("done");
+   LOGI("done");
 
    return data;
 }
@@ -340,7 +340,7 @@ eext_rotary_object_event_activated_set(Evas_Object *obj, Eina_Bool activated)
 {
    if (!obj) return;
 
-   INF("eext_rotary_object_event_activated_set : %p, %s, _activated_obj : %p, activated : %d", obj, evas_object_type_get(obj), _activated_obj, activated);
+   LOGI("eext_rotary_object_event_activated_set : %p, %s, _activated_obj : %p, activated : %d", obj, evas_object_type_get(obj), _activated_obj, activated);
 
    if (activated)
      {
@@ -348,7 +348,7 @@ eext_rotary_object_event_activated_set(Evas_Object *obj, Eina_Bool activated)
           {
              if (_activated_obj != NULL)
                {
-                  ERR("Activation delete!!!!");
+                  LOGE("Activation delete!!!!");
                   evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
                   evas_object_smart_callback_call(_activated_obj, SIG_DEACTIVATED, NULL);
                }
@@ -383,19 +383,107 @@ eext_rotary_object_event_activated_get(Evas_Object *obj)
      return EINA_FALSE;
 }
 
+#include <system_info.h>
+#include <vconf.h>
+
+static Eext_Rotary_Event_Type _rotary_event_type = EEXT_ROTARY_EVENT_TYPE_UNDEFINED;
+static int _is_rotary_event_enabled = -1;
+
+static void
+_rotary_event_changed_cb(keynode_t* node EINA_UNUSED, void* data EINA_UNUSED)
+{
+   int ret = vconf_get_bool(VCONFKEY_SETAPPL_ROTARY_EVENT_ENABLED_BOOL, &_is_rotary_event_enabled);
+   if (ret != VCONF_OK)
+     {
+        LOGE("failed to get rotary event on/off value. ret: %d", ret);
+        return;
+     }
+   INF("state of rotary event is changed to [%d]", _is_rotary_event_enabled);
+}
+
+EAPI Eext_Rotary_Event_Type
+eext_rotary_event_type_get(void)
+{
+   if (_rotary_event_type != EEXT_ROTARY_EVENT_TYPE_UNDEFINED)
+     return _rotary_event_type;
+
+   bool bezel = false;
+   int ret = system_info_get_platform_bool("http://tizen.org/feature/input.rotating_bezel" , &bezel);
+   if (ret != SYSTEM_INFO_ERROR_NONE)
+     {
+        LOGE("failed to get input.rotating.bezel info");
+        return EEXT_ROTARY_EVENT_TYPE_NONE;
+     }
+
+   if (!bezel)
+     return _rotary_event_type = EEXT_ROTARY_EVENT_TYPE_NONE;
+
+   bool virtual_bezel = false;
+   ret = system_info_get_platform_bool("http://tizen.org/feature/input.rotating_bezel.virtual" , &virtual_bezel);
+   if (ret != SYSTEM_INFO_ERROR_NONE)
+     {
+        LOGE("failed to get input.rotating.bezel.virtual info");
+        return EEXT_ROTARY_EVENT_TYPE_HW_BEZEL;
+     }
+
+   if (!virtual_bezel)
+     return _rotary_event_type = EEXT_ROTARY_EVENT_TYPE_HW_BEZEL;
+
+   return _rotary_event_type = EEXT_ROTARY_EVENT_TYPE_SW_BEZEL;
+}
+
+EAPI Eina_Bool
+eext_rotary_event_is_enabled(void)
+{
+   if (_is_rotary_event_enabled != -1)
+     return (Eina_Bool) _is_rotary_event_enabled;
+   int ret = vconf_get_bool(VCONFKEY_SETAPPL_ROTARY_EVENT_ENABLED_BOOL, &_is_rotary_event_enabled);
+   if (ret != VCONF_OK)
+     {
+        LOGE("failed to get rotary event on/off value. ret: %d", ret);
+        return EINA_TRUE;
+     }
+   ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_ROTARY_EVENT_ENABLED_BOOL, _rotary_event_changed_cb, NULL);
+   if (ret != VCONF_OK)
+     {
+        LOGE("failed to set rotary event changed callback. ret: %d", ret);
+     }
+   return (Eina_Bool) _is_rotary_event_enabled;
+}
+
+EAPI void
+eext_rotary_event_changed_callback_add(Eext_Rotary_Event_Changed_Cb cb, void* data)
+{
+   int ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_ROTARY_EVENT_ENABLED_BOOL, (vconf_callback_fn) cb, data);
+   if (ret != VCONF_OK)
+     {
+        LOGE("failed to set rotary event changed callback. ret: %d", ret);
+     }
+}
+
+EAPI void
+eext_rotary_event_changed_callback_del(Eext_Rotary_Event_Changed_Cb cb)
+{
+   int ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_ROTARY_EVENT_ENABLED_BOOL, (vconf_callback_fn) cb);
+   if (ret != VCONF_OK)
+     {
+        LOGE("failed to delete rotary event changed callback. ret: %d", ret);
+     }
+}
+
 #ifdef WITH_WAYLAND
 static void
 _rotary_rotate_event_free(void *udata EINA_UNUSED, void *fdata)
 {
-   INF("detent: In");
-   INF("In: ddata: %p", fdata);
+   LOGI("detent: In");
+   LOGI("In: ddata: %p", fdata);
    free(fdata);
 }
 
 static Eina_Bool
 _init_ecore_event(void)
 {
-   INF("detent: In");
+   LOGI("detent: In");
    if (!ecore_event_init()) return EINA_FALSE;
    EEXT_EVENT_ROTARY_ROTATE = ecore_event_type_new();
    return EINA_TRUE;
@@ -403,14 +491,14 @@ _init_ecore_event(void)
 static Eina_Bool
 _ecore_detent_cb(void *data, int type, void *event_info)
 {
-   INF("detent: In");
+   LOGI("detent: In");
    Ecore_Event_Detent_Rotate *e = event_info;
    Rotary_Raw_Info *event = NULL;
 
    event = calloc(1, sizeof(Rotary_Raw_Info));
    if (!event)
      {
-        ERR("Cannot allocate memory");
+        LOGE("Cannot allocate memory");
         return ECORE_CALLBACK_PASS_ON;
      }
    if (e->direction == ECORE_DETENT_DIRECTION_CLOCKWISE)
@@ -418,7 +506,7 @@ _ecore_detent_cb(void *data, int type, void *event_info)
    else
      event->direction =  EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE;
    event->time_stamp = e->timestamp;
-   INF("detent: new EEXT_EVENT_ROTARY_ROTATE ecore event");
+   LOGI("detent: new EEXT_EVENT_ROTARY_ROTATE ecore event");
    ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event, _rotary_rotate_event_free, NULL);
 
    return ECORE_CALLBACK_PASS_ON;
@@ -429,7 +517,7 @@ _ecore_detent_cb(void *data, int type, void *event_info)
 static Eina_Bool
 _init_Xi2_system(void)
 {
-   INF("In");
+   LOGI("In");
    Ecore_X_Display *display = NULL;
    Ecore_X_Window root_win;
    int opcode = 0, event = 0, error = 0;
@@ -448,14 +536,14 @@ _init_Xi2_system(void)
    if (!XQueryExtension((Display *)display, "XInputExtension", &opcode,
                         &event, &error))
      {
-        ERR("Failed to query XInputExtension");
+        LOGE("Failed to query XInputExtension");
         return EINA_FALSE;
      }
 
    /* We support version 2.0 */
    if (XIQueryVersion((Display *)display, &major, &minor) == BadRequest)
      {
-        ERR("Failed to query XI Version");
+        LOGE("Failed to query XI Version");
         return EINA_FALSE;
      }
 
@@ -483,11 +571,11 @@ _init_Xi2_system(void)
    int ret = XISelectEvents((Display *)display, (Window)root_win, _xi_event_mask, 1);
    if (ret != 0)
      {
-        ERR("Failed to Select Events");
+        LOGE("Failed to Select Events");
         return EINA_FALSE;
      }
 
-   INF("Done");
+   LOGI("Done");
    return EINA_TRUE;
 }
 
@@ -509,7 +597,7 @@ _motion_changed_cb(void *data, int type, void *event_info)
 static void
 _rotary_rotate_event_free(void *udata EINA_UNUSED, void *fdata)
 {
-   INF("In: ddata: %p", fdata);
+   LOGI("In: ddata: %p", fdata);
    free(fdata);
 }
 
@@ -525,11 +613,11 @@ _process_raw_event(void *data EINA_UNUSED, int type EINA_UNUSED, void *raw_event
         return;
      }
 
-   INF("In");
+   LOGI("In");
    event = calloc(1, sizeof(Rotary_Raw_Info));
    if (!event)
      {
-        ERR("Cannot allocate memory");
+        LOGE("Cannot allocate memory");
         return;
      }
    event->devid = xi_raw_event->deviceid;
@@ -540,32 +628,32 @@ _process_raw_event(void *data EINA_UNUSED, int type EINA_UNUSED, void *raw_event
    if (XIMaskIsSet(xi_raw_event->valuators.mask, 1))
      {
         event->time_stamp = (unsigned int)(*(value + 1));
-        INF("time stamp: %d", event->time_stamp);
+        LOGI("time stamp: %d", event->time_stamp);
      }
    if (XIMaskIsSet(xi_raw_event->valuators.mask, 2))
      {
         int dir = (int)(*(value + 2));
-        INF("raw dir: %d", dir);
+        LOGI("raw dir: %d", dir);
         switch (dir)
           {
            case -1:
               event->direction =  EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE;
-              INF("direction: Counter Clockwise");
+              LOGI("direction: Counter Clockwise");
               ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event,
                               _rotary_rotate_event_free, NULL);
               break;
            case 1:
               event->direction = EEXT_ROTARY_DIRECTION_CLOCKWISE;
-              INF("direction: Clockwise");
+              LOGI("direction: Clockwise");
               ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event,
                               _rotary_rotate_event_free, NULL);
               break;
            case 0:
-              INF("Not detent");
+              LOGI("Not detent");
               free(event);
               break;
            default:
-              INF("Should not get in here");
+              LOGI("Should not get in here");
               free(event);
           }
      }
@@ -579,7 +667,7 @@ _process_raw_event(void *data EINA_UNUSED, int type EINA_UNUSED, void *raw_event
 static Eina_Bool
 _rotary_rotate_event_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event_info)
 {
-   INF("In");
+   LOGI("In");
    Eina_List *l;
    Eext_Rotary_Handler *hd;
    Rotary_Raw_Info *ev = event_info;
@@ -619,16 +707,44 @@ _pri_compare(const void *data1, const void *data2)
 static Eina_Bool
 _rotary_rotate_handler_cb(void *data EINA_UNUSED, Eext_Rotary_Event_Info *info)
 {
-   INF("_rotary_rotate_handler_cb : %p, %s, %d", _activated_obj, evas_object_type_get(_activated_obj), evas_object_visible_get(_activated_obj));
+   LOGI("_rotary_rotate_handler_cb : %p, %s, %d", _activated_obj, evas_object_type_get(_activated_obj), evas_object_visible_get(_activated_obj));
    Eina_List *l;
    Eext_Rotary_Cb *cb;
 
    if (!info) return EINA_TRUE;
 
-   /* Deliver to the activated object and its parents */
-   if ((_activated_obj) &&
-       (evas_focus_state_get(evas_object_evas_get(_activated_obj))) &&
-       (evas_object_visible_get(_activated_obj)))
+//ONEUI1.5(20180313): support unfocusable window(keyboard window)
+   Evas* evas = NULL;
+   Eina_Bool force_event = EINA_FALSE;
+   Eina_Bool focus_state = EINA_FALSE;
+
+   if (_activated_obj)
+     {
+        void *object = NULL;
+        evas = evas_object_evas_get(_activated_obj);
+        focus_state = evas_focus_state_get(evas);
+
+        Eina_List* objs = evas_objects_in_rectangle_get(evas, SHRT_MIN, SHRT_MIN, USHRT_MAX, USHRT_MAX, EINA_TRUE, EINA_TRUE);
+        EINA_LIST_FREE(objs, object)
+          {
+             if (!strcmp((char*)evas_object_type_get((Evas_Object*)object), "elm_win"))
+               {
+                  const int __ROTARY_EVENT_FORCE_VALUE = 1;
+                  const char* EEXT_ROTARY_EVENT = "_eext_rotary_event";
+
+                  if (__ROTARY_EVENT_FORCE_VALUE == (int)evas_object_data_get((Evas_Object*)object, EEXT_ROTARY_EVENT))
+                    {
+                       force_event = EINA_TRUE;
+                    }
+                  break;
+               }
+          }
+     }
+//
+
+  /* Deliver to the activated object and its parents */
+   if ((_activated_obj) && ((!force_event && focus_state) || force_event)&&
+        (evas_object_visible_get(_activated_obj)))
      {
         Evas_Object *obj = NULL;
         Eext_Rotary_Obj_Pri *op = NULL;
@@ -639,9 +755,9 @@ _rotary_rotate_handler_cb(void *data EINA_UNUSED, Eext_Rotary_Event_Info *info)
              if (obj == _activated_obj)
                {
                  if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
-                    INF("Deliver clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp);
+                    LOGI("Deliver clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp);
                  else
-                    INF("Deliver counter clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp);
+                    LOGI("Deliver counter clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp);
                }
              EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
                {
@@ -667,13 +783,13 @@ _rotary_rotate_handler_cb(void *data EINA_UNUSED, Eext_Rotary_Event_Info *info)
 static void
 _remove_ecore_handlers(void)
 {
-   INF("In");
+   LOGI("In");
 #ifdef HAVE_X
    if (_motion_handler)
      {
         ecore_event_handler_del(_motion_handler);
         _motion_handler = NULL;
-        INF("removed _motion_handler");
+        LOGI("removed _motion_handler");
      }
 #endif
 #ifdef HAVE_WAYLAND
@@ -681,21 +797,21 @@ _remove_ecore_handlers(void)
      {
         ecore_event_handler_del(_ecore_detent_handler);
         _ecore_detent_handler = NULL;
-        INF("removed _ecore_detent_handler");
+        LOGI("removed _ecore_detent_handler");
      }
 #endif
    if (_rotate_handler)
      {
         ecore_event_handler_del(_rotate_handler);
         _rotate_handler = NULL;
-        INF("removed _rotate_handler");
+        LOGI("removed _rotate_handler");
      }
 }
 
 static void
 _object_deleted_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
-   INF("In: data: %p, obj: %p", data, obj);
+   LOGI("In: data: %p, obj: %p", data, obj);
    Eina_List *l = NULL;
 
    Eext_Rotary_Obj_Pri *op = NULL;
@@ -724,14 +840,15 @@ _object_deleted_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj
      }
    if (_activated_obj == obj)
      _activated_obj = NULL;
-   INF("done");
+   LOGI("done");
 }
 
 static void
-_activated_obj_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+_activated_obj_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
-   INF("_activated_obj_del_cb : %p", _activated_obj);
+   LOGI("_activated_obj_del_cb : %p", _activated_obj);
 
-   evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
+   evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
+   if (_activated_obj == obj)
    _activated_obj = NULL;
 }
index f375e0adb7b0a3d65a17ad612189a0a8156b88b4..65009224e666b8e3e034a2e77376e74861b3e851 100644 (file)
 #include "wearable/circle/efl_extension_circle_private.h"
 #include "wearable/efl_extension_common_private.h"
 
+#include <efl_util.h>
+//#include <gxt_buffer.h>
+
 #define EEXT_MORE_OPTION_DATA_KEY "eext_more_option_data"
+//ONEUI1.5(21MAR2019): Support for scrollbar show timing
+#define OBJECT_SHOW_INTERNAL "object,show,internal"
+#define OBJECT_HIDE_INTERNAL "object,hide,internal"
+//
+
+static const char SIGNAL_ACTIVATED[] = "rotary,activated";
+
+/* === /internal object cb & util === */
+static void _drawer_back_cb(void *data, Evas_Object *obj, void *event_info);
+static void _panel_active_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _panel_inactive_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _panel_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _cue_show_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _rotary_activated_cb(void *data, Evas_Object *obj, void *event_info);
+
+/* === internal object creation (elm-demo-tizen/drawer.c) === */
+static Evas_Object *_drawer_layout_create(Evas_Object *parent);
+static Evas_Object *_panel_create(Evas_Object *parent, Eext_More_Option_Data *mold);
+
+/* === more option API === */
+static Eext_More_Option_Data *_more_option_data_init(Evas_Object *obj, Evas_Object *parent);
+static Eext_More_Option_Data *_more_option_data_get(const Evas_Object *more_option);
+static void _more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _rotary_selector_item_selected(void *data, Evas_Object *obj, void *event_info);
+static void _rotary_selector_item_clicked(void *data, Evas_Object *obj, void *event_info);
+
+/* === Accessibility === */
+static Eina_Bool _access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info);
+static char * _accessibility_name_set_cb(void *data, Evas_Object *obj);
+static void _more_option_screen_reader_changed(void *data, Evas_Object *obj, void *event_info);
+static char *_accessibility_panel_name_set_cb(void *data, Evas_Object *obj);
+static char *_accessibility_panel_description_set_cb(void *data, Evas_Object *obj);
+//ONEUI1.5(2019Mar01): Read name and description from dummy button
+static void _set_item_access_info(Eext_Rotary_Selector_Item* item);
+static char *_accessibility_item_name_cb(void *data, Evas_Object *obj);
+static char *_accessibility_item_description_cb(void *data, Evas_Object *obj);
+//
+/* === color class === */
+void _eext_more_option_color_class_parent_set(Evas_Object *obj, Evas_Object *parent);
+
+extern Eina_Bool __elm_product_theme_is_loaded(void);
+
+/* === internal object cb & util === */
+
+#define MORE_OPTION_GENLIST_CONTENT_SIZE 76
+#define MORE_OPTION_GENLIST_SCREEN_WIDTH 360
+#define MORE_OPTION_GENLIST_SCREEN_HEIGHT 360
+#define TIZEN_WEARABLE_SCREEN_SIZE 360
+#define TIZEN_EFFECT_BLUR_RADIUS 4.5
+#define TIZEN_EFFECT_ITEM_DURATION 0.08
+#define TIZEN_EFFECT_IMAGE_PATH \
+   "/opt/usr/home/owner/share/.elementary/config/Effect_bg.png"
+
+static const char *more_option_mask_image = "more_option_masking_image.png";
+extern void* gxt_image_effect_object_mask(const Evas_Object *object, const char *mask, int w, int h, int mask_x, int mask_y);
+
+typedef enum {
+   ITEM_STYLE_1_TEXT,
+   ITEM_STYLE_2_TEXT,
+   ITEM_STYLE_1_TEXT_1_ICON,
+   ITEM_STYLE_2_TEXT_1_ICON,
+   ITEM_STYLE_MAX
+} Genlist_Item_Style;
+
+static void
+_genlist_item_text_copy(char **target, const char* source)
+{
+   int size = 0;
+
+   if (*target)
+     {
+        free(*target);
+        *target = NULL;
+     }
+   size = strlen(source) + 1;
+   *target = malloc(sizeof(char)*size);
+   if (!(*target))
+     {
+        LOGE("allocation is failed!!");
+        return;
+     }
+   memset(*target, 0, size);
+   strncpy(*target, source, size);
+}
+
+static Rotary_Genlist_Data *
+_rotary_genlist_data_get(Evas_Object *genlist)
+{
+   return evas_object_data_get(genlist, "EEXT_ROTARY_GENLIST_DATA");
+}
+
+static const char*
+_genlist_item_style_get(Evas_Object *obj, Genlist_Item_Style style)
+{
+   switch (style)
+     {
+        case ITEM_STYLE_1_TEXT:
+          return "prod/1text/more_option";
+
+        case ITEM_STYLE_2_TEXT:
+          return "prod/2text/more_option";
+
+        case ITEM_STYLE_1_TEXT_1_ICON:
+          return "prod/1text.1icon/more_option";
+
+        case ITEM_STYLE_2_TEXT_1_ICON:
+          return "prod/2text.1icon/more_option";
+
+        default:
+          LOGE("Returning Default Style");
+          return "prod/1text/more_option";
+     }
+}
+
+static Eext_Rotary_Selector_Item *
+_rotary_genlist_item_create(Evas_Object *obj, Rotary_Genlist_Data *rgd)
+{
+   Eext_Rotary_Selector_Item *item = calloc(sizeof(Eext_Rotary_Selector_Item), 1);
+   if (!item)
+     {
+        LOGE("Memory Allocation failed");
+        return NULL;
+     }
+   Evas_Object *dummy_button = elm_button_add(rgd->parent);
+   elm_object_style_set(dummy_button, "prod/more_option/dummy");
+
+   item->dummy_button = dummy_button;
+   item->rgd = rgd;
+   item->base.obj = dummy_button;
+   item->obj = obj;
+   item->main_text = NULL;
+   item->sub_text = NULL;
+   item->domain = NULL;
+   item->parent = rgd->parent;
+   return item;
+}
+
+//ONEUI1.5(20Jun2019): Add genlist scroller color class change
+static void
+_genlist_color_change_signal_cb(void *data,
+                                Evas_Object *widget_obj,
+                                const char *emission,
+                                const char *source)
+{
+   Eext_More_Option_Data *mold = data;
+   if (!source) return;
+
+   int r, g ,b, a;
+   if (mold->scrollbar_bezel_fg_color_class && !strcmp(source, mold->scrollbar_bezel_fg_color_class))
+     {
+        edje_object_color_class_get(elm_layout_edje_get(mold->more_option),
+                                    mold->scrollbar_bezel_fg_color_class,
+                                    &r, &g, &b, &a,
+                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+        edje_object_color_class_set(elm_layout_edje_get(mold->genlist),
+                                    mold->scrollbar_bezel_fg_color_class,
+                                    r, g, b, a,
+                                    0, 0, 0, 0, 0, 0, 0, 0);
+     }
+   else if (mold->scrollbar_bg_color_class && !strcmp(source, mold->scrollbar_bg_color_class))
+     {
+        edje_object_color_class_get(elm_layout_edje_get(mold->more_option),
+                                    mold->scrollbar_bg_color_class,
+                                    &r, &g, &b, &a,
+                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+        edje_object_color_class_set(elm_layout_edje_get(mold->genlist),
+                                    mold->scrollbar_bg_color_class,
+                                    r, g, b, a,
+                                    0, 0, 0, 0, 0, 0, 0, 0);
+     }
+   else if (mold->scrollbar_fg_color_class && !strcmp(source, mold->scrollbar_fg_color_class))
+     {
+        edje_object_color_class_get(elm_layout_edje_get(mold->more_option),
+                                    mold->scrollbar_fg_color_class,
+                                    &r, &g, &b, &a,
+                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+        edje_object_color_class_set(elm_layout_edje_get(mold->genlist),
+                                    mold->scrollbar_fg_color_class,
+                                    r, g, b, a,
+                                    0, 0, 0, 0, 0, 0, 0, 0);
+     }
+}
+//
+
+static void
+_genlist_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eina_List *l;
+   Eext_Rotary_Selector_Item *item = NULL;
+   Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj);
+
+   EINA_LIST_FOREACH(rgd->item_list, l, item)
+    {
+       if (item->main_text) free(item->main_text);
+       if (item->sub_text) free(item->sub_text);
+       if (item->domain) free(item->domain);
+       if (item->itc) elm_genlist_item_class_free(item->itc);
+       free(item);
+       rgd->item_list = eina_list_remove_list(rgd->item_list, l);
+    }
+
+   eina_list_free(rgd->item_list);
+   free(rgd);
+}
+
+static char *
+_genlist_item_text_get_cb(void *data, Evas_Object *obj, const char *part)
+{
+   Eext_Rotary_Selector_Item *item = data;
+
+   if (!strcmp(part, "elm.text"))
+     {
+        if (item->domain)
+          {
+             if (item->main_text) return strdup(dgettext(item->domain, item->main_text));
+          }
+        else if (item->main_text)
+          {
+             return strdup(item->main_text);
+          }
+     }
+   else if (!strcmp(part, "elm.text.1"))
+     {
+       if (item->domain)
+         {
+            if (item->sub_text) return strdup(dgettext(item->domain, item->sub_text));
+         }
+       else if (item->sub_text)
+         {
+            return strdup(item->sub_text);
+         }
+     }
+
+   return NULL;
+}
+
+static Evas_Object *
+_genlist_content_get_cb(void *data, Evas_Object *obj, const char *part)
+{
+   Eext_Rotary_Selector_Item *item = data;
+
+   if (!strcmp(part, "elm.icon"))
+     {
+        evas_object_show(item->content);
+        return item->content;
+     }
+   return NULL;
+}
+
+static Evas_Object *
+_genlist_add_item_content_get_cb(void *data, Evas_Object *obj, const char *part)
+{
+   if (strcmp(part, "elm.swallow.content")) return NULL;
+
+   Eext_Rotary_Selector_Item *item = data;
+   Evas_Object *button = NULL;
+
+   button = elm_button_add(obj);
+   elm_object_style_set(button, "rotary_selector_add_item");
+   evas_object_repeat_events_set(button, EINA_TRUE);
+   elm_object_mirrored_set(button, EINA_FALSE);
+   elm_object_mirrored_automatic_set(button, EINA_FALSE);
+   evas_object_size_hint_weight_set(button,EVAS_HINT_EXPAND,EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+   evas_object_size_hint_min_set(button, ELM_SCALE_SIZE(MORE_OPTION_GENLIST_CONTENT_SIZE), ELM_SCALE_SIZE(MORE_OPTION_GENLIST_CONTENT_SIZE));
+
+   evas_object_show(button);
+   item->content = button;
+   return item->content;
+}
+
+static void
+_genlist_item_selected_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj);
+
+   if (eext_more_option_opened_get(rgd->parent))
+     {
+        Eext_Rotary_Selector_Item *item = (Eext_Rotary_Selector_Item *)data;
+        evas_object_smart_callback_call(rgd->parent, "item,clicked", item);
+        LOGI("item clicked: item: %p", event_info);
+     }
+   else
+     {
+        LOGI("item clicked rejected, panel closed");
+     }
+}
+
+static void
+_genlist_selected_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   Elm_Object_Item *item = event_info;
+   if (!item) return;
+   elm_genlist_item_selected_set(item, EINA_FALSE);
+}
+
+static void
+_genlist_add_item_selected_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   evas_object_smart_callback_call(obj, "add_item,clicked", (void*)data);
+}
+
+static void
+_genlist_title_item_del_cb(void *data, Evas_Object *obj)
+{
+   free(data);
+}
+
+static char *
+_genlist_item_title_text_get_cb(void *data, Evas_Object *obj, const char *part)
+{
+   return strdup("");
+}
+
+static void
+_genlist_title_item_create(Evas_Object *obj, Rotary_Genlist_Data *rgd) {
+   Eext_Rotary_Selector_Item *item = _rotary_genlist_item_create(obj, rgd);
+
+   Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
+   itc->item_style = "title";
+   itc->func.text_get = _genlist_item_title_text_get_cb;
+   itc->func.del = _genlist_title_item_del_cb;
+   item->item = elm_genlist_item_append(
+                obj,
+                itc,
+                item,
+                NULL,
+                ELM_GENLIST_ITEM_NONE,
+                NULL,
+                item);
+   elm_genlist_item_class_free(itc);
+   rgd->title_item = item;
+   //ONEUI1.5(04Feb2019): top empty item, should not take highlight
+   elm_atspi_accessible_role_set(item->item, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
+   //
+}
+
+static void
+_genlist_add_item_create(Evas_Object *obj, Rotary_Genlist_Data *rgd) {
+   Eext_Rotary_Selector_Item *item = _rotary_genlist_item_create(obj, rgd);
+   rgd->item_list = eina_list_prepend(rgd->item_list, item);
+
+   Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
+   itc->item_style = "full";
+   itc->func.content_get = _genlist_add_item_content_get_cb;
+
+   item->item = elm_genlist_item_append(
+                obj,
+                itc,
+                item,
+                NULL,
+                ELM_GENLIST_ITEM_NONE,
+                _genlist_add_item_selected_cb,
+                item);
+   elm_genlist_item_class_free(itc);
+   rgd->add_item = item;
+}
+
+static Elm_Genlist_Item_Class *
+_genlist_item_class_create(Evas_Object *obj)
+{
+   Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
+   itc->item_style = _genlist_item_style_get(obj, ITEM_STYLE_1_TEXT);
+   itc->func.text_get = _genlist_item_text_get_cb;
+   itc->func.content_get = _genlist_content_get_cb;
+   return itc;
+}
+
+static Evas_Object *
+_eext_more_option_genlist_add(Evas_Object *parent)
+{
+   if (!parent) return NULL;
+
+   Rotary_Genlist_Data *rgd = calloc(sizeof(Rotary_Genlist_Data), 1);
+   if (!rgd)
+     {
+        LOGE("Memory Allocation failed");
+        return NULL;
+     }
+   rgd->add_enabled = EINA_FALSE;
+   rgd->parent = parent;
+
+   Eext_More_Option_Data *mold = _more_option_data_get(parent);
+   if (!mold)
+     {
+        free(rgd);
+        LOGE("More option data is null");
+        return NULL;
+     }
+
+   //Panel supports show/hide signals of scrollbar for genlist
+   Evas_Object *genlist = elm_genlist_add(mold->panel);
+   elm_object_style_set(genlist, "prod/more_option");
+   evas_object_smart_callback_add(genlist, "selected", _genlist_selected_cb, NULL);
+   evas_object_smart_callback_call(genlist, "bottom,margin,enable", NULL);
+   /* Dont remove sizing code, it wont trigger item realization on first launch */
+   evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND,EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_move(genlist, 0, 0);
+   evas_object_resize(genlist, MORE_OPTION_GENLIST_SCREEN_WIDTH, MORE_OPTION_GENLIST_SCREEN_HEIGHT);
+   elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
+   /* End */
+   evas_object_event_callback_add(genlist, EVAS_CALLBACK_DEL, _genlist_del_cb, rgd);
+   evas_object_data_set(genlist, "EEXT_ROTARY_GENLIST_DATA", rgd);
+   //ONEUI1.5(20Jun2019): Add genlist scroller color class change
+#define STRING_ADD(x) \
+   x ? (char *)eina_stringshare_add(x) : NULL
+   mold->scrollbar_bezel_fg_color_class = STRING_ADD(edje_object_data_get(elm_layout_edje_get(genlist), "bezel_bar_color_class"));
+   mold->scrollbar_fg_color_class = STRING_ADD(edje_object_data_get(elm_layout_edje_get(genlist), "bar_color_class"));
+   mold->scrollbar_bg_color_class = STRING_ADD(edje_object_data_get(elm_layout_edje_get(genlist), "bar_bg_color_class"));
+   if (mold->scrollbar_bezel_fg_color_class)
+     edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", mold->scrollbar_bezel_fg_color_class, _genlist_color_change_signal_cb, mold);
+   if (mold->scrollbar_fg_color_class)
+     edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", mold->scrollbar_fg_color_class, _genlist_color_change_signal_cb, mold);
+   if (mold->scrollbar_bg_color_class)
+     edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", mold->scrollbar_bg_color_class, _genlist_color_change_signal_cb, mold);
+   //
+   _genlist_title_item_create(genlist, rgd);
+   LOGI("genlist added successfully");
+   return genlist;
+}
+
+static Eext_Object_Item *
+_eext_more_option_genlist_item_append(Evas_Object *obj)
+{
+   Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj);
+
+   Eext_Rotary_Selector_Item *item = _rotary_genlist_item_create(obj, rgd);
+   item->itc = _genlist_item_class_create(obj);
+   rgd->item_list = eina_list_append(rgd->item_list, item);
+
+   item->item = elm_genlist_item_append(
+                obj,
+                item->itc,
+                item,
+                NULL,
+                ELM_GENLIST_ITEM_NONE,
+                _genlist_item_selected_cb,
+                item);
+
+   //ONEUI1.5(2019Mar01): Read name and description from dummy button
+   _set_item_access_info(item);
+   //
+
+   return (Eext_Object_Item *)item;
+}
+
+static Eext_Object_Item *
+_eext_more_option_item_prepend(Evas_Object *obj)
+{
+   Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj);
+   Eext_Rotary_Selector_Item *item = _rotary_genlist_item_create(obj, rgd);
+   item->itc = _genlist_item_class_create(obj);
+   rgd->item_list = eina_list_prepend(rgd->item_list, item);
+
+   item->item = elm_genlist_item_prepend(
+                obj,
+                item->itc,
+                item,
+                NULL,
+                ELM_GENLIST_ITEM_NONE,
+                _genlist_item_selected_cb,
+                item);
+
+   //ONEUI1.5(2019Mar01): Read name and description from dummy button
+   _set_item_access_info(item);
+   //
+
+   return (Eext_Object_Item *)item;
+}
+
+static Eext_Object_Item *
+_eext_more_option_genlist_item_insert_after(Evas_Object *obj, Eext_Object_Item *after)
+{
+   Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj);
+   Eext_Rotary_Selector_Item *after_item = (Eext_Rotary_Selector_Item *)after;
+   Eext_Rotary_Selector_Item *item = _rotary_genlist_item_create(obj, rgd);
+   item->itc = _genlist_item_class_create(obj);
+   rgd->item_list = eina_list_append_relative(rgd->item_list, item, after);
+
+   item->item = elm_genlist_item_insert_after(
+                obj,
+                item->itc,
+                item,
+                NULL,
+                after_item->item,
+                ELM_GENLIST_ITEM_NONE,
+                _genlist_item_selected_cb,
+                item);
+
+   //ONEUI1.5(2019Mar01): Read name and description from dummy button
+   _set_item_access_info(item);
+   //
+
+   return (Eext_Object_Item *)item;
+}
+
+static Eext_Object_Item *
+_eext_more_option_genlist_item_insert_before(Evas_Object *obj, Eext_Object_Item *before)
+{
+   Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj);
+   Eext_Rotary_Selector_Item *before_item = (Eext_Rotary_Selector_Item *)before;
+   Eext_Rotary_Selector_Item *item = _rotary_genlist_item_create(obj, rgd);
+   item->itc = _genlist_item_class_create(obj);
+   rgd->item_list = eina_list_prepend_relative(rgd->item_list, item, before);
+
+   item->item = elm_genlist_item_insert_before(
+                obj,
+                item->itc,
+                item,
+                NULL,
+                before_item->item,
+                ELM_GENLIST_ITEM_NONE,
+                _genlist_item_selected_cb,
+                item);
+
+   //ONEUI1.5(2019Mar01): Read name and description from dummy button
+   _set_item_access_info(item);
+   //
+
+   return (Eext_Object_Item *)item;
+}
+
+static void
+_eext_more_option_genlist_item_del(Eext_Object_Item *item)
+{
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+   Rotary_Genlist_Data *rgd = rotary_selector_item->rgd;
+   elm_object_item_del(rotary_selector_item->item);
+   rgd->item_list = eina_list_remove(rgd->item_list, rotary_selector_item);
+
+   if (rotary_selector_item->main_text) free(rotary_selector_item->main_text);
+   if (rotary_selector_item->sub_text) free(rotary_selector_item->sub_text);
+   if (rotary_selector_item->domain) free(rotary_selector_item->domain);
+   evas_object_del(rotary_selector_item->content);
+   evas_object_del(rotary_selector_item->dummy_button);
+   elm_genlist_item_class_free(rotary_selector_item->itc);
+   free(item);
+}
+
+static void
+_eext_more_option_genlist_items_clear(Evas_Object *obj)
+{
+   Eina_List *l;
+   Eext_Rotary_Selector_Item *item = NULL;
+   Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj);
+
+   EINA_LIST_FOREACH(rgd->item_list, l, item)
+    {
+       if (item->main_text) free(item->main_text);
+       if (item->sub_text) free(item->sub_text);
+       if (item->domain) free(item->domain);
+       elm_genlist_item_class_free(item->itc);
+       elm_object_item_del(item->item);
+       evas_object_del(item->dummy_button);
+       evas_object_del(item->content);
+       free(item);
+       rgd->item_list = eina_list_remove_list(rgd->item_list, l);
+    }
+
+   eina_list_free(rgd->item_list);
+}
+
+static void
+_eext_more_option_genlist_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text)
+{
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+   if (!rotary_selector_item)
+     {
+        LOGE("rotary_selector_item is NULL!!");
+        return;
+     }
+   if (!part_name)
+     {
+        LOGE("part_name is NULL!!");
+        return;
+     }
+   if (!text)
+     {
+        LOGE("text is NULL!!");
+        return;
+     }
+
+   Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(rotary_selector_item->obj);
+   if (!rgd)
+     {
+        LOGE("rgd is NULL!!");
+        return;
+     }
+
+   if (!strcmp(part_name, "selector,main_text"))
+     {
+        _genlist_item_text_copy(&(rotary_selector_item->main_text), text);
+        if (rotary_selector_item->content)
+          {
+             rotary_selector_item->itc->item_style  = _genlist_item_style_get(item->obj, ITEM_STYLE_1_TEXT_1_ICON);
+             elm_genlist_item_item_class_update(rotary_selector_item->item, rotary_selector_item->itc);
+          }
+        elm_genlist_item_fields_update(rotary_selector_item->item, "elm.text", ELM_GENLIST_ITEM_FIELD_TEXT);
+        elm_genlist_item_fields_update(rotary_selector_item->item, "elm.swallow.dummy_button", ELM_GENLIST_ITEM_FIELD_CONTENT);
+     }
+   else if (!strcmp(part_name, "selector,sub_text"))
+     {
+        _genlist_item_text_copy(&(rotary_selector_item->sub_text), text);
+        if (rotary_selector_item->content)
+          {
+             rotary_selector_item->itc->item_style  = _genlist_item_style_get(item->obj, ITEM_STYLE_2_TEXT_1_ICON);
+          }
+        else
+          {
+             rotary_selector_item->itc->item_style  = _genlist_item_style_get(item->obj, ITEM_STYLE_2_TEXT);
+          }
+        elm_genlist_item_item_class_update(rotary_selector_item->item, rotary_selector_item->itc);
+        elm_genlist_item_fields_update(rotary_selector_item->item, "elm.text.1", ELM_GENLIST_ITEM_FIELD_TEXT);
+        elm_genlist_item_fields_update(rotary_selector_item->item, "elm.swallow.dummy_button", ELM_GENLIST_ITEM_FIELD_CONTENT);
+     }
+   else
+     {
+        LOGE("Not supported part name [%s]", part_name);
+        return;
+     }
+}
+
+static const char *
+_eext_more_option_genlist_item_part_text_get(const Eext_Object_Item *item, const char *part_name)
+{
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
+   if (!rotary_selector_item)
+     {
+        LOGE("item is NULL!!");
+        return NULL;
+     }
+   if (!strcmp(part_name, "selector,main_text"))
+     {
+       return rotary_selector_item->main_text;
+     }
+   else if (!strcmp(part_name, "selector,sub_text"))
+     {
+        return rotary_selector_item->sub_text;
+     }
+
+   return NULL;
+}
+
+static void
+_eext_more_option_genlist_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text)
+{
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+   if (!rotary_selector_item)
+     {
+        LOGE("rotary_selector_item is NULL!!");
+        return;
+     }
+   if (!part_name)
+     {
+        LOGE("part_name is NULL!!");
+        return;
+     }
+   if (!domain)
+     {
+        LOGE("domain is NULL!!");
+        return;
+     }
+   if (!text)
+     {
+        LOGE("text is NULL!!");
+        return;
+     }
+
+   Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(rotary_selector_item->obj);
+   if (!rgd)
+     {
+        LOGE("rsd is NULL!!");
+        return;
+     }
+
+   if (!strcmp(part_name, "selector,main_text"))
+     {
+        _genlist_item_text_copy(&(rotary_selector_item->domain), domain);
+        _genlist_item_text_copy(&(rotary_selector_item->main_text), text);
+        if (rotary_selector_item->content)
+          {
+             rotary_selector_item->itc->item_style  = _genlist_item_style_get(item->obj, ITEM_STYLE_1_TEXT_1_ICON);
+             elm_genlist_item_item_class_update(rotary_selector_item->item, rotary_selector_item->itc);
+          }
+        elm_genlist_item_fields_update(rotary_selector_item->item, "elm.text", ELM_GENLIST_ITEM_FIELD_TEXT);
+        elm_genlist_item_fields_update(rotary_selector_item->item, "elm.swallow.dummy_button", ELM_GENLIST_ITEM_FIELD_CONTENT);
+     }
+   else if (!strcmp(part_name, "selector,sub_text"))
+     {
+        _genlist_item_text_copy(&(rotary_selector_item->domain), domain);
+        _genlist_item_text_copy(&(rotary_selector_item->sub_text), text);
+        if (rotary_selector_item->content)
+          {
+             rotary_selector_item->itc->item_style  = _genlist_item_style_get(item->obj, ITEM_STYLE_2_TEXT_1_ICON);
+          }
+        else
+          {
+             rotary_selector_item->itc->item_style  = _genlist_item_style_get(item->obj, ITEM_STYLE_2_TEXT);
+          }
+        elm_genlist_item_item_class_update(rotary_selector_item->item, rotary_selector_item->itc);
+        elm_genlist_item_fields_update(rotary_selector_item->item, "elm.text.1", ELM_GENLIST_ITEM_FIELD_TEXT);
+        elm_genlist_item_fields_update(rotary_selector_item->item, "elm.swallow.dummy_button", ELM_GENLIST_ITEM_FIELD_CONTENT);
+     }
+   else
+     {
+        LOGE("Not supported part name [%s]", part_name);
+     }
+
+   return;
+}
+
+static void
+_eext_more_option_genlist_item_part_content_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, Evas_Object *content)
+{
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+   if (!rotary_selector_item)
+     {
+        LOGE("rotary_selector_item is NULL!!");
+        return;
+     }
+   if (!part_name)
+     {
+        LOGE("part_name is NULL!!");
+        return;
+     }
+   if (!content)
+     {
+        LOGE("content is NULL!!");
+        return;
+     }
+   if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+     {
+        LOGE("Not implemented!!");
+        return;
+     }
+
+   Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(rotary_selector_item->obj);
+   if (!rgd)
+     {
+        LOGE("rgd is NULL!!");
+        return;
+     }
+   /* FIXME: TBD for other parts */
+   if (!strcmp(part_name, "item,icon"))
+     {
+        rotary_selector_item->content = content;
+        if (rotary_selector_item->main_text && rotary_selector_item->sub_text)
+          {
+             rotary_selector_item->itc->item_style  = _genlist_item_style_get(item->obj, ITEM_STYLE_2_TEXT_1_ICON);
+          }
+        else
+          {
+             rotary_selector_item->itc->item_style  = _genlist_item_style_get(item->obj, ITEM_STYLE_1_TEXT_1_ICON);
+          }
+
+        elm_genlist_item_item_class_update(rotary_selector_item->item, rotary_selector_item->itc);
+        elm_genlist_item_fields_update(rotary_selector_item->item, "elm.text", ELM_GENLIST_ITEM_FIELD_TEXT);
+        elm_genlist_item_fields_update(rotary_selector_item->item, "elm.text.1", ELM_GENLIST_ITEM_FIELD_TEXT);
+        elm_genlist_item_fields_update(rotary_selector_item->item, "elm.icon", ELM_GENLIST_ITEM_FIELD_CONTENT);
+        elm_genlist_item_fields_update(rotary_selector_item->item, "elm.swallow.dummy_button", ELM_GENLIST_ITEM_FIELD_CONTENT);
+     }
+   else
+     {
+        LOGE("Not supported part name!!");
+     }
+}
+
+static Evas_Object *
+_eext_more_option_genlist_item_part_content_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state)
+{
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
+   if (!rotary_selector_item)
+     {
+        LOGE("rotary_selector_item is NULL!!");
+        return NULL;
+     }
+   if (!part_name)
+     {
+        LOGE("part_name is NULL!!");
+        return NULL;
+     }
+   if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+     {
+        LOGE("Not implemented!!");
+        return NULL;
+     }
+   /* FIXME: TBD for other parts */
+   if (!strcmp(part_name, "item,icon"))
+     {
+        return rotary_selector_item->content;
+     }
+   else
+     {
+        LOGE("Not supported part name!!");
+     }
+
+   return NULL;
+}
+
+static const Eina_List*
+_eext_more_option_genlist_items_get(const Evas_Object *obj)
+{
+   Rotary_Genlist_Data *rgd = _rotary_genlist_data_get((Evas_Object *)obj);
+   if (!rgd)
+     {
+        LOGE("rsd is NULL!!");
+        return NULL;
+     }
+
+   return rgd->item_list;
+}
+
+static Eina_Bool
+_eext_more_option_genlist_editing_enabled_get(const Evas_Object *obj)
+{
+   //FIXME: TBD
+   return EINA_FALSE;
+}
+
+static void
+_eext_more_option_genlist_editing_enabled_set(Evas_Object *obj, Eina_Bool enabled)
+{
+   //FIXME: TBD
+   return;
+}
+
+static void
+_eext_more_option_genlist_add_item_enabled_set(Evas_Object *obj, Eina_Bool enabled)
+{
+   Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj);
+   if (!rgd)
+     {
+        LOGE("rgd is NULL!!");
+        return;
+     }
+
+   if (rgd->add_enabled == enabled)
+     return;
+   rgd->add_enabled = enabled;
+
+   if (enabled)
+     {
+        _genlist_add_item_create(obj, rgd);
+     }
+   else if (rgd->add_item)
+     {
+        rgd->item_list = eina_list_remove(rgd->item_list, rgd->add_item);
+        if(rgd->add_item->main_text) free(rgd->add_item->main_text);
+        if(rgd->add_item->sub_text) free(rgd->add_item->sub_text);
+        if(rgd->add_item->domain) free(rgd->add_item->domain);
+
+        elm_object_item_del(rgd->add_item->item);
+        free(rgd->add_item);
+        rgd->add_item = NULL;
+     }
+}
+
+static Eina_Bool
+_eext_more_option_genlist_add_item_enabled_get(const Evas_Object *obj)
+{
+   Rotary_Genlist_Data *rgd = _rotary_genlist_data_get((Evas_Object *)obj);;
+
+   if (!rgd)
+     {
+        LOGE("rotary_selector_item is NULL!!");
+        return EINA_FALSE;
+     }
+
+   return rgd->add_enabled;
+}
+
+static void
+_eext_more_option_genlist_item_delete_enabled_set(Eext_Object_Item *item, Eina_Bool enabled)
+{
+   //FIXME: TBD
+   return;
+}
+
+static Eina_Bool
+_eext_more_option_genlist_item_delete_enabled_get(const Eext_Object_Item *item)
+{
+   //FIXME: TBD
+   return EINA_FALSE;
+}
+
+/*static Evas_Object *
+_capture_image_masking_apply(Eext_More_Option_Data *mold, Evas_Object *captured_image)
+{
+   char buf[PATH_MAX];
+   Evas_Object *image;
+
+   snprintf(buf, sizeof(buf), "%s/%s", IMG_DIR, more_option_mask_image);
+
+   void* masking_buffer = gxt_image_effect_object_mask(captured_image, buf, TIZEN_WEARABLE_SCREEN_SIZE, TIZEN_WEARABLE_SCREEN_SIZE, 0, 0);
+
+   image = evas_object_image_filled_add(evas_object_evas_get(mold->more_option));
+   evas_object_image_size_set(image, TIZEN_WEARABLE_SCREEN_SIZE, TIZEN_WEARABLE_SCREEN_SIZE);
+   evas_object_image_data_set(image, masking_buffer);
+   evas_object_image_smooth_scale_set(image, EINA_FALSE);
+   evas_object_image_alpha_set(image, EINA_TRUE);
+   evas_object_image_data_update_add(image, 0, 0, TIZEN_WEARABLE_SCREEN_SIZE, TIZEN_WEARABLE_SCREEN_SIZE);
+
+   mold->mask_buffer = masking_buffer;
+   return image;
+}*/
+
+static Eina_Bool
+_screen_shot_take(Eext_More_Option_Data *data)
+{
+   Eext_More_Option_Data *mold = data;
+   int error;
+   int width = TIZEN_WEARABLE_SCREEN_SIZE, height = TIZEN_WEARABLE_SCREEN_SIZE;
+   efl_util_screenshot_h screenshot;
+   tbm_surface_h surface;
+   tbm_surface_info_s info;
+   void *ptr = NULL;
+   Eina_Bool freeMem = EINA_FALSE;
+   unsigned char *src = NULL;
+   unsigned char *dst = NULL;
+
+   screenshot = efl_util_screenshot_initialize(width, height);
+   if (!screenshot)
+     {
+        LOGE("Screenshot init fail");
+        return EINA_FALSE;
+     }
+
+   surface = efl_util_screenshot_take_tbm_surface(screenshot);
+   error = get_last_result();
+   if (error != EFL_UTIL_ERROR_NONE)
+     {
+        efl_util_screenshot_deinitialize(screenshot);
+        LOGE("Screenshot take fail");
+        return EINA_FALSE;
+     }
+
+   tbm_surface_map(surface, TBM_SURF_OPTION_READ, &info);
+   if (info.width == (info.planes[0].stride / 4))
+     {
+        ptr = info.planes[0].ptr;
+     }
+   else
+     {
+        ptr = malloc(info.width * info.height * 4);
+        if (!ptr)
+          {
+             LOGE("Memory Error");
+          }
+        freeMem = EINA_TRUE;
+
+        src = (unsigned char *)info.planes[0].ptr;
+        dst = (unsigned char *)ptr;
+        int src_stride = info.planes[0].stride;
+        int dst_stride = info.width * 4;
+        int i;
+
+        for (i = 0; i < info.height; i++)
+          {
+             memcpy(dst, src, dst_stride);
+             src += src_stride;
+             dst += dst_stride;
+          }
+     }
+
+   char *bufpixels;
+   bufpixels = alloca(sizeof(char) * 4 * height * width);
+
+   memcpy(bufpixels, ptr, sizeof(char) * 4 * height * width);
+   Evas_Object *image = evas_object_image_filled_add(evas_object_evas_get(mold->more_option));
+   if (!image)
+     {
+        LOGE("Image Creation failed");
+        return EINA_FALSE;
+     }
+   evas_object_image_size_set(image, TIZEN_WEARABLE_SCREEN_SIZE, TIZEN_WEARABLE_SCREEN_SIZE);
+   evas_object_image_data_set(image, bufpixels);
+   evas_object_image_smooth_scale_set(image, EINA_FALSE);
+   evas_object_image_data_update_add(image, 0, 0, width, height);
+
+   Eina_Bool success = evas_object_image_save(image, TIZEN_EFFECT_IMAGE_PATH, NULL, "quality=100 compress=1");
+   if (!success)
+     {
+        evas_object_del(image);
+        LOGE("Image Save failed");
+        return EINA_FALSE;
+     }
+//   mold->blur_image = //_capture_image_masking_apply(data, image);
+   evas_object_del(image);
+
+   if (freeMem == EINA_TRUE && ptr)
+     {
+        free(ptr);
+        ptr = NULL;
+     }
+   tbm_surface_unmap(surface);
+   tbm_surface_destroy(surface);
+   efl_util_screenshot_deinitialize(screenshot);
+
+   LOGI("Screenshot Success");
+   return EINA_TRUE;
+}
+
+static void
+_effect_cancel(Eext_More_Option_Data *data)
+{
+   Eext_More_Option_Data *mold = data;
+   if (!mold)
+     {
+        LOGI("Mold data null, object deleted");
+        return;
+     }
+
+   if (mold->mask_buffer)
+     {
+        free(mold->mask_buffer);
+        mold->mask_buffer = NULL;
+     }
+   evas_object_del(mold->blur_image);
+   mold->blur_image = NULL;
+}
+
+static Eina_Bool
+_effect_bg_image_create(Eext_More_Option_Data *data)
+{
+   Eext_More_Option_Data *mold = data;
+
+   evas_object_del(mold->blur_image);
+
+   Evas_Object *conform = evas_object_data_get(elm_object_top_widget_get(mold->more_option), "\377 elm,conformant");
+   if (!conform)
+     {
+        if (_screen_shot_take(mold))
+          {
+             return EINA_TRUE;
+          }
+        return EINA_FALSE;
+     }
+   Evas_Object *image = evas_object_image_filled_add(evas_object_evas_get(mold->more_option));
+   if (!image)
+     {
+        LOGE("Image Creation failed");
+        return EINA_FALSE;
+     }
+   evas_object_image_alpha_set(image, EINA_TRUE);
+   evas_object_image_colorspace_set(image, EVAS_COLORSPACE_ARGB8888);
+   evas_object_image_smooth_scale_set(image, EINA_FALSE);
+   evas_object_image_size_set(image, TIZEN_WEARABLE_SCREEN_SIZE, TIZEN_WEARABLE_SCREEN_SIZE);
+   evas_object_image_source_set(image, conform);
+   Eina_Bool success = evas_object_image_save(image, TIZEN_EFFECT_IMAGE_PATH, NULL, "quality=100 compress=1");
+   if (success)
+     {
+        LOGI("Bg capture success");
+        evas_object_del(image);
+        image = evas_object_image_filled_add(evas_object_evas_get(mold->more_option));
+        evas_object_image_file_set(image, TIZEN_EFFECT_IMAGE_PATH, NULL);
+
+//        mold->blur_image = _capture_image_masking_apply(data, image);
+        evas_object_del(image);
+        return EINA_TRUE;
+     }
+   else
+     {
+        LOGE("Image could not be saved!!!!");
+        evas_object_del(image);
+        if (_screen_shot_take(mold))
+          {
+             return EINA_TRUE;
+          }
+        return EINA_FALSE;
+     }
+}
+
+static void
+_bg_image_hide_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_More_Option_Data *mold = data;
+   _effect_cancel(mold);
+}
+
+/*static void
+_bg_blur_set(unsigned int *dst, unsigned int *src, double level)
+{
+   gxt_buffer_s src_obj, dst_obj;
+   src_obj.pixels = src;
+   src_obj.width = TIZEN_WEARABLE_SCREEN_SIZE;
+   src_obj.height = TIZEN_WEARABLE_SCREEN_SIZE;
+   src_obj.bytes_per_line = TIZEN_WEARABLE_SCREEN_SIZE * sizeof(unsigned int);
+   src_obj.pixel_format = GXT_PIXEL_FORMAT_XRGB8888;
+
+   dst_obj.pixels = dst;
+   dst_obj.width = TIZEN_WEARABLE_SCREEN_SIZE;
+   dst_obj.height = TIZEN_WEARABLE_SCREEN_SIZE;
+   dst_obj.bytes_per_line = TIZEN_WEARABLE_SCREEN_SIZE * sizeof(unsigned int);
+   dst_obj.pixel_format = GXT_PIXEL_FORMAT_XRGB8888;
+
+   gxt_buffer_blur(&dst_obj, &src_obj, level);
+}*/
+
+static void
+_effect_blur_bg_image(Eext_More_Option_Data *data)
+{
+   unsigned int *bg_src, *bg_dst;
+   Eext_More_Option_Data *mold = data;
+
+   Evas_Object *image =  evas_object_image_filled_add(evas_object_evas_get(mold->more_option));
+   evas_object_image_size_set(image, TIZEN_WEARABLE_SCREEN_SIZE, TIZEN_WEARABLE_SCREEN_SIZE);
+   evas_object_event_callback_add(image, EVAS_CALLBACK_HIDE, _bg_image_hide_cb, mold);
+   elm_object_part_content_set(mold->panel, "blur_base", image);
+
+   bg_src = evas_object_image_data_get(mold->blur_image, 0);
+   bg_dst = evas_object_image_data_get(image, 1);
+
+  // _bg_blur_set(bg_dst, bg_src, TIZEN_EFFECT_BLUR_RADIUS);
+   evas_object_image_data_set(image, bg_dst);
+   evas_object_image_data_update_add(image, 0, 0, TIZEN_WEARABLE_SCREEN_SIZE, TIZEN_WEARABLE_SCREEN_SIZE);
+   evas_object_show(image);
+   evas_object_del(mold->blur_image);
+   mold->blur_image = image;
+}
+
+//ONEUI1.5(27May2019): Reduce tbm memory by adding surface on demand
+static void
+_more_option_genlist_surface_create(Eext_More_Option_Data *data)
+{
+   Eext_More_Option_Data *mold = data;
+
+   Evas_Object *circle_genlist = NULL;
+   Evas_Object *surface_layout = NULL;
+
+   surface_layout = elm_layout_add(mold->genlist);
+   if (!surface_layout)
+     {
+        LOGE("Surface Layout creation failed");
+        return;
+     }
+   evas_object_size_hint_weight_set(surface_layout, EVAS_HINT_EXPAND,EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(surface_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   Eext_Circle_Surface *surface = eext_circle_surface_layout_add(surface_layout);
+   if (!surface)
+     {
+        LOGE("Surface creation failed");
+        return;
+     }
+   elm_object_part_content_set(mold->genlist, "elm.swallow.circle", surface_layout);
+   circle_genlist = eext_circle_object_genlist_add(mold->genlist, surface);
+   if (!circle_genlist)
+     {
+        LOGE("Circle Genlist creation failed");
+        return;
+     }
+   eext_circle_object_genlist_scroller_policy_set(circle_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
+   mold->circle_genlist = circle_genlist;
+   mold->surface = surface;
+
+   LOGI("Surface created: %p", surface);
+}
+
+static void
+_more_option_genlist_surface_destroy(Eext_More_Option_Data *data)
+{
+   Eext_More_Option_Data *mold = data;
+
+   LOGI("Surface destroyed: %p", mold->surface);
+
+   eext_circle_surface_del(mold->surface);
+   evas_object_del(elm_object_part_content_get(mold->genlist, "elm.swallow.circle"));
+   evas_object_del(mold->circle_genlist);
+   mold->circle_genlist = NULL;
+   mold->surface = NULL;
+}
+//
+
+static Eina_Bool
+_effect_timer_cb(void *data)
+{
+   Eext_More_Option_Data *mold = data;
+   Elm_Object_Item *it = elm_genlist_nth_item_get(mold->genlist, ++mold->effect_count);
+
+   if (it)
+     {
+        if (mold->effect_count == 1) elm_object_item_signal_emit(it, "elm,state,first,vi,show", "elm");
+        else elm_object_item_signal_emit(it, "elm,state,vi,show", "elm");
+        if (mold->effect_count == 3)
+          {
+             return ECORE_CALLBACK_CANCEL;
+          }
+        else
+          {
+             return ECORE_CALLBACK_RENEW;
+          }
+     }
+   else
+     {
+        return ECORE_CALLBACK_CANCEL;
+     }
+}
+
+static void
+_item_hide_signal_emit(Eext_More_Option_Data *data)
+{
+   Eext_More_Option_Data *mold = data;
+
+   Elm_Object_Item *it = elm_genlist_nth_item_get(mold->genlist, 1);
+   if (it)
+     {
+        elm_object_item_signal_emit(it, "elm,state,first,vi,hide", "elm");
+     }
+   int idx = 0;
+   for (idx = 1; idx <= 3; idx++)
+     {
+        it = elm_genlist_nth_item_get(mold->genlist, idx);
+        if (it)
+          {
+             elm_object_item_signal_emit(it, "elm,state,vi,hide", "elm");
+          }
+     }
+   mold->effect_count = 0;
+   if (mold->effect_timer)
+     {
+        ecore_timer_del(mold->effect_timer);
+        mold->effect_timer = NULL;
+     }
+   mold->effect_timer = ecore_timer_add(TIZEN_EFFECT_ITEM_DURATION, _effect_timer_cb, mold);
+}
 
-/* === /internal object cb & util === */
-static void _drawer_back_cb(void *data, Evas_Object *obj, void *event_info);
-static void _panel_active_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-static void _panel_inactive_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-static void _panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-static void _panel_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-static void _cue_show_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+//ONEUI1.5(30May2019): Improve VI effect
+static Eina_Bool
+_after_blur_idler_cb(void * data)
+{
+   Eext_More_Option_Data *mold = data;
 
-/* === internal object creation (elm-demo-tizen/drawer.c) === */
-static Evas_Object *_drawer_layout_create(Evas_Object *parent);
-static Evas_Object *_panel_create(Evas_Object *parent, Eext_More_Option_Data *mold);
+   //ONEUI1.5(20Jun2019): Add blur timer in case blur idler is not invoked
+   if (mold->blur_timer)
+     {
+        ecore_timer_del(mold->blur_timer);
+        mold->blur_timer = NULL;
+     }
+   //
+   LOGI("Panel Status: %d",elm_panel_hidden_get(mold->panel));
+   _item_hide_signal_emit(mold);
+   elm_panel_toggle(mold->panel);
+   mold->blur_idler = NULL;
 
-/* === more option API === */
-static Eext_More_Option_Data *_more_option_data_init(Evas_Object *obj, Evas_Object *parent);
-static Eext_More_Option_Data *_more_option_data_get(const Evas_Object *more_option);
-static void _more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+   return EINA_FALSE;
+}
+//
 
-/* === Accessibility === */
-static Eina_Bool _access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info);
-static char * _accessibility_name_set_cb(void *data, Evas_Object *obj);
-static void _more_option_screen_reader_changed(void *data, Evas_Object *obj, void *event_info);
-static char *_accessibility_panel_name_set_cb(void *data, Evas_Object *obj);
-static char *_accessibility_panel_description_set_cb(void *data, Evas_Object *obj);
+//ONEUI1.5(20Jun2019): Add blur timer in case blur idler is not invoked
+static Eina_Bool
+_after_blur_timer_cb(void * data)
+{
+   Eext_More_Option_Data *mold = data;
 
-/* === color class === */
-void _eext_more_option_color_class_parent_set(Evas_Object *obj, Evas_Object *parent);
+   if (mold->blur_idler)
+     {
+        ecore_idler_del(mold->blur_idler);
+        mold->blur_idler = NULL;
+     }
+   LOGI("Panel Status: %d",elm_panel_hidden_get(mold->panel));
+   _item_hide_signal_emit(mold);
+   elm_panel_toggle(mold->panel);
+   mold->blur_timer = NULL;
+
+   return EINA_FALSE;
+}
+//
+
+static void
+_eext_more_option_effect_create(Eext_More_Option_Data *data)
+{
+   Eext_More_Option_Data *mold = data;
+   //ONEUI1.5(27May2019): Reduce tbm memory by adding surface on demand
+   _more_option_genlist_surface_destroy(mold);
+   _more_option_genlist_surface_create(mold);
+   //
+   //ONEUI1.5(31Oct2019): For access on case, show first item when panel becomes active
+   if (!elm_atspi_bridge_utils_is_screen_reader_enabled())
+     elm_genlist_item_bring_in(elm_genlist_nth_item_get(mold->genlist, 1), ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+   else
+     elm_genlist_item_show(elm_genlist_nth_item_get(mold->genlist, 1), ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+   //
+
+   LOGI("blur effect create");
+
+   if (_effect_bg_image_create(mold))
+     {
+        _effect_blur_bg_image(mold);
+     }
+   else
+     {
+        LOGE("Bg image is NULL!!!");
+     }
+
+   evas_object_freeze_events_set(mold->panel, EINA_TRUE);
+   eext_rotary_object_event_activated_set(mold->circle_genlist, EINA_TRUE);
+   //ONEUI1.5(20Jun2019): Add blur timer in case blur idler is not invoked
+   if (mold->blur_timer)
+     {
+        ecore_timer_del(mold->blur_timer);
+        mold->blur_timer = NULL;
+     }
+   mold->blur_timer = ecore_timer_add(0.5, _after_blur_timer_cb, mold);
+   //
+   //ONEUI1.5(30May2019): Improve VI effect
+   if (mold->blur_idler)
+     {
+        ecore_idler_del(mold->blur_idler);
+        mold->blur_idler = NULL;
+     }
+   mold->blur_idler = ecore_idler_add(_after_blur_idler_cb, mold);
+   //
+}
 
-/* === internal object cb & util === */
 static void
 _drawer_back_cb(void *data, Evas_Object *obj, void *event_info)
 {
+   LOGI("panel back cb");
+
    Evas_Object *panel = obj;
    if (!panel)
      {
-        ERR("panel is NULL!!");
+        LOGE("panel is NULL!!");
         return;
      }
 
    Eext_More_Option_Data *mold = data;
    if (!mold)
      {
-        ERR("mold is NULL!!");
+        LOGE("mold is NULL!!");
         return;
      }
 
+   if (__elm_product_theme_is_loaded())
+     eext_rotary_object_event_activated_set(mold->circle_genlist, EINA_FALSE);
+   else
+     eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_FALSE);
+
+   LOGI("Panel Status: %d",elm_panel_hidden_get(panel));
    if (!elm_panel_hidden_get(panel)) elm_panel_toggle(panel);
 }
 
@@ -78,26 +1376,42 @@ _panel_active_cb(void *data, Evas_Object *obj, const char *emission, const char
    if (mold)
      {
         evas_object_smart_callback_call(mold->more_option, "more,option,opened", NULL);
-        eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_TRUE);
-        eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, _drawer_back_cb, mold);
 
-        Edje_Message_Int msg;
-        msg.val = 0;
-
-        Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content");
-        if (content_part)
+        if (__elm_product_theme_is_loaded())
+          {
+             LOGI("panel back registered");
+             eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, _drawer_back_cb, mold);
+             evas_object_freeze_events_set(mold->panel, EINA_FALSE);
+             //Support for scrollbar show and hide
+             evas_object_smart_callback_call(mold->panel, OBJECT_SHOW_INTERNAL, mold->genlist);
+             //
+          }
+        else
           {
-             edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT, 0, &msg);
+             eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, _drawer_back_cb, mold);
+             Edje_Message_Int msg;
+             msg.val = 0;
+
+             Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content");
+             if (content_part)
+               {
+                  edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT, 0, &msg);
+               }
           }
         //for accessibility
         // signal send to rotary selector for highlighted access object
-        evas_object_show(mold->rotary_selector);
-        if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+        if (elm_atspi_bridge_utils_is_screen_reader_enabled())
           {
              evas_object_smart_callback_call(mold->rotary_selector, "more,option,opened", NULL);
+             if (mold->cue_access_object)
+                elm_atspi_component_highlight_clear(mold->cue_access_object);
           }
         //
+        //ONEUI1.5(20190424):Avoid panel close by api when panel is not active.
+        mold->is_panel_active = EINA_TRUE;
+        //
      }
+   LOGI("panel active");
 }
 
 static void
@@ -106,49 +1420,112 @@ _panel_inactive_cb(void *data, Evas_Object *obj, const char *emission, const cha
    Eext_More_Option_Data *mold = data;
    if (mold)
      {
+        /*ONEUI1.5(10Oct2019): Do nothing in inactive state when panel was not active.
+        This case occurs when panel first loaded with toggle signal
+        which invokes inactive state and before cue clicked is processed, inactive state
+        is invoked and cue event becomes unresponsive.
+        */
+        if (!mold->is_panel_active) return;
+        //
         evas_object_repeat_events_set(mold->panel, EINA_FALSE);
-
+        LOGI("Panel is inactive");
         evas_object_smart_callback_call(mold->more_option, "more,option,closed", NULL);
-        eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_FALSE);
-
-        Edje_Message_Int msg;
-        msg.val = 1;
-
-        Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content");
-        if (content_part)
+        if (__elm_product_theme_is_loaded())
           {
-             edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT, 0, &msg);
+             //ONEUI1.5(20Jun2019): Add blur timer in case blur idler is not invoked
+             if (mold->blur_timer)
+               {
+                  ecore_timer_del(mold->blur_timer);
+                  mold->blur_timer = NULL;
+               }
+             if (mold->blur_idler)
+               {
+                  ecore_idler_del(mold->blur_idler);
+                  mold->blur_idler = NULL;
+               }
+             //
+             eext_rotary_object_event_activated_set(mold->circle_genlist, EINA_FALSE);
+             //ONEUI1.5(31Oct2019): For access on case, show first item when panel becomes inactive
+             if (!elm_atspi_bridge_utils_is_screen_reader_enabled())
+               elm_genlist_item_bring_in(elm_genlist_nth_item_get(mold->genlist, 1), ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+             else
+               elm_genlist_item_show(elm_genlist_nth_item_get(mold->genlist, 1), ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+             //
+             mold->effect_count = 0;
+             evas_object_del(mold->blur_image);
+             if (mold->effect_timer)
+               {
+                  ecore_timer_del(mold->effect_timer);
+                  mold->effect_timer = NULL;
+               }
+             //ONEUI1.5(27May2019): Reduce tbm memory by adding surface on demand
+             _more_option_genlist_surface_destroy(mold);
+             //
+             //Support for scrollbar show and hide
+             evas_object_smart_callback_call(mold->panel, OBJECT_HIDE_INTERNAL, mold->genlist);
+             //
           }
-
-        //item index is initialized as zero.
-        if (mold->rotary_selector)
+        else
           {
-             //Initialize item to zero
-             Eext_Object_Item *item = eina_list_data_get(mold->item_list);
-             eext_rotary_selector_selected_item_set(mold->rotary_selector, item);
+             eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_FALSE);
+
+             Edje_Message_Int msg;
+             msg.val = 1;
+
+             Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content");
+             if (content_part)
+               {
+                  edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT, 0, &msg);
+               }
+
+             //item index is initialized as zero.
+             if (mold->rotary_selector)
+               {
+                  //Initialize item to zero
+                  Eext_Object_Item *item = eina_list_data_get(mold->item_list);
+                  if (item)
+                    {
+                       eext_rotary_selector_selected_item_set(mold->rotary_selector, item);
+                    }
+               }
           }
-
         //for accessibility
         // signal send to rotary selector for highlighted access object
-        evas_object_hide(mold->rotary_selector);
-        if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+        if (elm_atspi_bridge_utils_is_screen_reader_enabled())
           {
              evas_object_smart_callback_call(mold->rotary_selector, "more,option,closed", NULL);
           }
         //
+        //ONEUI1.5(20190424):Avoid panel close by api when panel is not active.
+        mold->is_panel_active = EINA_FALSE;
+        //
      }
-
+   LOGI("panel inactive, panel back deregister");
    eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, _drawer_back_cb);
 }
 
 static void
 _panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
 {
-   INF("more_option cue clicked!!");
+   LOGI("more_option cue clicked!!");
 
    Eext_More_Option_Data *mold = data;
-   if (mold)
-     evas_object_smart_callback_call(mold->more_option, "cue,clicked", NULL);
+   if (!mold)
+     {
+        LOGE("mold is NULL");
+        return;
+     }
+
+   if (__elm_product_theme_is_loaded())
+     {
+        _eext_more_option_effect_create(mold);
+     }
+   else
+     {
+        eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_TRUE);
+     }
+
+   evas_object_smart_callback_call(mold->more_option, "cue,clicked", NULL);
 }
 
 static void
@@ -168,7 +1545,7 @@ _drawer_layout_create(Evas_Object *parent)
    layout = elm_layout_add(parent);
    if (!layout)
      {
-        ERR("drawer layout is NULL");
+        LOGE("drawer layout is NULL");
         return NULL;
      }
 
@@ -186,15 +1563,21 @@ _panel_create(Evas_Object *parent, Eext_More_Option_Data *mold)
    panel = elm_panel_add(parent);
    if (!panel)
      {
-        ERR("panel is NULL");
+        LOGE("panel is NULL");
         return NULL;
      }
 
    evas_object_show(panel);
 
    //Default : right
-   elm_panel_orient_set(panel, ELM_PANEL_ORIENT_RIGHT);
+   //ONEUI1.5 20170418 performace inhancement
+   //elm_panel_orient_set(panel, ELM_PANEL_ORIENT_RIGHT);
+   //
    elm_object_part_content_set(parent, "elm.swallow.right", panel);
+   if (__elm_product_theme_is_loaded())
+     {
+        elm_object_signal_emit(panel, "eext,more,option,enable", "elm");
+     }
 
    evas_object_event_callback_add(panel, EVAS_CALLBACK_DEL, _panel_del_cb, NULL);
 
@@ -210,7 +1593,7 @@ _more_option_data_init(Evas_Object *obj, Evas_Object *parent)
    mold = (Eext_More_Option_Data *)calloc(1, sizeof(Eext_More_Option_Data));
    if (!mold)
      {
-        ERR("mold is NULL!!");
+        LOGE("mold is NULL!!");
         return NULL;
      }
 
@@ -219,6 +1602,13 @@ _more_option_data_init(Evas_Object *obj, Evas_Object *parent)
    mold->item_list = NULL;
    mold->panel = NULL;
    mold->rotary_selector = NULL;
+   mold->genlist = NULL;
+   mold->effect_timer = NULL;
+   mold->effect_count = 0;
+   mold->mask_buffer = NULL;
+   //ONEUI1.5(20190424):Avoid panel close by api when panel is not active.
+   mold->is_panel_active = EINA_FALSE;
+   //
    mold->direction = EEXT_MORE_OPTION_DIRECTION_RIGHT;
 
    return mold;
@@ -229,7 +1619,7 @@ _more_option_data_get(const Evas_Object *more_option)
 {
    if (!more_option)
      {
-        ERR("more_option is NULL!!");
+        LOGE("more_option is NULL!!");
         return NULL;
      }
 
@@ -260,7 +1650,27 @@ static void
 _more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
    Eext_More_Option_Data *mold = data;
-
+   if (mold->effect_timer)
+     {
+        ecore_timer_del(mold->effect_timer);
+        mold->effect_timer = NULL;
+     }
+   //ONEUI1.5(20Jun2019): Add blur timer in case blur idler is not invoked
+   if (mold->blur_timer)
+     {
+        ecore_timer_del(mold->blur_timer);
+        mold->blur_timer = NULL;
+     }
+   if (mold->blur_idler)
+     {
+        ecore_idler_del(mold->blur_idler);
+        mold->blur_idler = NULL;
+     }
+   //
+   if (__elm_product_theme_is_loaded())
+     {
+        evas_object_del(mold->blur_image);
+     }
    // accessibility
    evas_object_smart_callback_del(mold->more_option, "atspi,screen,reader,changed", _more_option_screen_reader_changed);
    if (mold->cue_access_object)
@@ -273,12 +1683,38 @@ _more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 
    evas_object_event_callback_del(mold->more_option, EVAS_CALLBACK_HIDE, _more_option_hide_cb);
    evas_object_event_callback_del(mold->more_option, EVAS_CALLBACK_SHOW, _more_option_show_cb);
+   evas_object_smart_callback_del(mold->more_option, SIGNAL_ACTIVATED, _rotary_activated_cb);
+   //ONEUI1.5(06AUG2019): Delete callbacks to avoid invalid read
+   if (__elm_product_theme_is_loaded())
+     evas_object_smart_callback_del(mold->genlist, "aligned,item,detected", _rotary_selector_item_selected);
+   else
+     {
+        evas_object_smart_callback_del(mold->rotary_selector, "item,selected", _rotary_selector_item_selected);
+        evas_object_smart_callback_del(mold->rotary_selector, "item,clicked", _rotary_selector_item_clicked);
+     }
+   //
 
    if (mold->item_list)
      {
         mold->item_list = eina_list_free(mold->item_list);
      }
-
+   //ONEUI1.5(20Jun2019): Add genlist scroller color class change
+   if (mold->scrollbar_bezel_fg_color_class)
+     {
+        edje_object_signal_callback_del(elm_layout_edje_get(mold->more_option), "color_class,set", mold->scrollbar_bezel_fg_color_class, _genlist_color_change_signal_cb);
+        eina_stringshare_del(mold->scrollbar_bezel_fg_color_class);
+     }
+   if (mold->scrollbar_fg_color_class)
+     {
+        edje_object_signal_callback_del(elm_layout_edje_get(mold->more_option), "color_class,set", mold->scrollbar_fg_color_class, _genlist_color_change_signal_cb);
+        eina_stringshare_del(mold->scrollbar_fg_color_class);
+     }
+   if (mold->scrollbar_bg_color_class)
+     {
+        edje_object_signal_callback_del(elm_layout_edje_get(mold->more_option), "color_class,set", mold->scrollbar_bg_color_class, _genlist_color_change_signal_cb);
+        eina_stringshare_del(mold->scrollbar_bg_color_class);
+     }
+   //
    evas_object_data_del(obj, EEXT_MORE_OPTION_DATA_KEY);
 
    free(mold);
@@ -287,9 +1723,14 @@ _more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 static void
 _cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
 {
-   INF("called!!");
+   LOGI("called!!");
 
    Eext_More_Option_Data *mold = data;
+   if (!mold)
+     {
+        LOGE("mold is NULL");
+        return;
+     }
 
    // accessibility
    elm_layout_signal_emit(mold->panel, "cue,hide", "elm");
@@ -299,19 +1740,50 @@ _cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *sou
 static void
 _cue_show_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
 {
-   INF("called!!");
+   LOGI("called!!");
 
    Eext_More_Option_Data *mold = data;
+   if (!mold)
+     {
+        LOGE("mold is NULL");
+        return;
+     }
 
    // accessibility
    elm_layout_signal_emit(mold->panel, "cue,show", "elm");
    //
 }
 
+static void
+_rotary_activated_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   LOGI("called!!");
+
+   Eext_More_Option_Data *mold = data;
+   if (!mold || elm_panel_hidden_get(mold->panel))
+     {
+        return;
+     }
+
+   if (__elm_product_theme_is_loaded())
+     {
+        eext_rotary_object_event_activated_set(mold->circle_genlist, EINA_TRUE);
+     }
+   else
+     {
+        eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_TRUE);
+     }
+}
+
 static void
 _rotary_selector_item_clicked(void *data, Evas_Object *obj, void *event_info)
 {
    Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
+   if (!mold)
+     {
+        LOGE("mold is NULL");
+        return;
+     }
    evas_object_smart_callback_call(mold->more_option, "item,clicked", event_info);
 }
 
@@ -322,6 +1794,13 @@ _more_option_screen_reader_changed(void *data, Evas_Object *obj, void *event_inf
 
    if (elm_atspi_bridge_utils_is_screen_reader_enabled())
      {
+
+        //ONEUI1.5(20180521): Add name and description when SR is on after creation of more_option
+        elm_atspi_accessible_name_cb_set(mold->panel, _accessibility_panel_name_set_cb, NULL);
+        elm_atspi_accessible_description_cb_set(mold->panel, _accessibility_panel_description_set_cb, mold);
+        elm_atspi_accessible_reading_info_type_set(mold->panel, (ELM_ACCESSIBLE_READING_INFO_TYPE_NAME | ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION));
+        //
+
         if (!mold->cue_access_object)
           {
              if (!mold->cue_target_object)
@@ -330,7 +1809,9 @@ _more_option_screen_reader_changed(void *data, Evas_Object *obj, void *event_inf
 
              elm_atspi_accessible_name_cb_set(mold->cue_access_object, _accessibility_name_set_cb, (Eext_More_Option_Data*)mold);
              elm_atspi_accessible_role_set(mold->cue_access_object, ELM_ATSPI_ROLE_PUSH_BUTTON);
-             elm_atspi_accessible_reading_info_type_set(mold->cue_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
+             elm_atspi_accessible_reading_info_type_set(mold->cue_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME|
+                                                                                 ELM_ACCESSIBLE_READING_INFO_TYPE_ROLE|
+                                                                                 ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
              elm_access_action_cb_set(mold->cue_access_object, ELM_ACCESS_ACTION_ACTIVATE, _access_action_cb, mold);
 
              evas_object_data_set(mold->more_option, "_cue_access_object", mold->cue_access_object);
@@ -350,18 +1831,40 @@ _more_option_screen_reader_changed(void *data, Evas_Object *obj, void *event_inf
 static void
 _rotary_selector_item_selected(void *data, Evas_Object *obj, void *event_info)
 {
+   //ONEUI1.5(06AUG2019): Avoid operations for aligned item undetected case
+   if (__elm_product_theme_is_loaded() && !event_info) return;
+   //
+   LOGI("Genlist Selected CB");
    Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
-   evas_object_smart_callback_call(mold->more_option, "item,selected", event_info);
+   if (!mold || !(mold->more_option))
+     {
+        LOGE("INFO: mold:%p\n", mold);
+        return;
+     }
+   if (__elm_product_theme_is_loaded())
+     {
+        if (eext_more_option_opened_get(mold->more_option))
+          {
+             LOGI("genlist item selected");
+             event_info = elm_object_item_data_get(event_info);
+             evas_object_smart_callback_call(mold->more_option, "item,selected", event_info);
+          }
+        else
+          {
+             LOGE("panel is closed");
+          }
+     }
+   else
+     evas_object_smart_callback_call(mold->more_option, "item,selected", event_info);
 }
 
 /* === public API implementation === */
-
 EAPI Evas_Object *
 eext_more_option_add(Evas_Object *parent)
 {
    if (!parent)
      {
-        ERR("parent is NULL!!");
+        LOGE("parent is NULL!!");
         return NULL;
      }
 
@@ -371,14 +1874,14 @@ eext_more_option_add(Evas_Object *parent)
    more_option = _drawer_layout_create(parent);
    if (!more_option)
      {
-        ERR("more_option is NULL!!");
+        LOGE("more_option is NULL!!");
         return NULL;
      }
 
    mold = _more_option_data_init(more_option, parent);
    if (!mold)
      {
-        ERR("mold is NULL!!");
+        LOGE("mold is NULL!!");
         return NULL;
      }
 
@@ -390,7 +1893,7 @@ eext_more_option_add(Evas_Object *parent)
    mold->panel = _panel_create(mold->more_option, mold);
    if (!mold->panel)
      {
-        ERR("panel is NULL!!");
+        LOGE("panel is NULL!!");
         return NULL;
      }
 
@@ -399,41 +1902,52 @@ eext_more_option_add(Evas_Object *parent)
    elm_layout_signal_callback_add(mold->panel, "cue,clicked", "elm", _panel_cue_clicked_cb, mold);
    _eext_more_option_color_class_parent_set(mold->panel, mold->more_option);
 
-   mold->rotary_selector = eext_rotary_selector_add(mold->more_option);
-   if (!mold->rotary_selector)
+   if (__elm_product_theme_is_loaded())
      {
-        ERR("rotary_selector is NULL!!");
-        return NULL;
+        LOGE("genlist added");
+        mold->genlist = _eext_more_option_genlist_add(mold->more_option);
+        if (!mold->genlist)
+          {
+             LOGE("genlist is NULL!!");
+             return NULL;
+          }
+        evas_object_smart_callback_add(mold->genlist, "aligned,item,detected", _rotary_selector_item_selected, mold);
+        elm_object_part_content_set(mold->panel, "elm.swallow.content.blur", mold->genlist);
      }
-
-   evas_object_smart_callback_add(mold->rotary_selector, "item,selected", _rotary_selector_item_selected, mold);
-   evas_object_smart_callback_add(mold->rotary_selector, "item,clicked", _rotary_selector_item_clicked, mold);
-   _eext_more_option_color_class_parent_set(mold->rotary_selector, mold->more_option);
-
-   Evas_Object *selector_content = elm_layout_add(mold->rotary_selector);
-   if (!selector_content)
+   else
      {
-        ERR("selector_content is NULL!!");
-        return NULL;
-     }
-
-   elm_layout_theme_set(selector_content, "rotary_selector", "content", "more_option");
-
-   elm_object_part_content_set(mold->rotary_selector, "content", selector_content);
-
-   elm_object_content_set(mold->panel, mold->rotary_selector);
+        mold->rotary_selector = eext_rotary_selector_add(mold->more_option);
+        if (!mold->rotary_selector)
+          {
+             LOGE("rotary_selector is NULL!!");
+             return NULL;
+          }
+        evas_object_smart_callback_add(mold->rotary_selector, "item,selected", _rotary_selector_item_selected, mold);
+        evas_object_smart_callback_add(mold->rotary_selector, "item,clicked", _rotary_selector_item_clicked, mold);
+        _eext_more_option_color_class_parent_set(mold->rotary_selector, mold->more_option);
 
-   _eext_more_option_color_class_parent_set(selector_content, mold->more_option);
+        Evas_Object *selector_content = elm_layout_add(mold->rotary_selector);
+        if (!selector_content)
+          {
+             LOGE("selector_content is NULL!!");
+             return NULL;
+          }
 
+        elm_layout_theme_set(selector_content, "rotary_selector", "content", "more_option");
+        elm_object_part_content_set(mold->rotary_selector, "content", selector_content);
+        elm_object_content_set(mold->panel, mold->rotary_selector);
+        _eext_more_option_color_class_parent_set(selector_content, mold->more_option);
+     }
+   LOGI("Panel Status: %d",elm_panel_hidden_get(mold->panel));
    elm_panel_toggle(mold->panel);
 
    //for accessibility
    evas_object_smart_callback_add(mold->more_option, "atspi,screen,reader,changed", _more_option_screen_reader_changed, mold);
 
-   if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
      {
         elm_atspi_accessible_name_cb_set(mold->panel, _accessibility_panel_name_set_cb, NULL);
-        elm_atspi_accessible_description_cb_set(mold->panel, _accessibility_panel_description_set_cb, NULL);
+        elm_atspi_accessible_description_cb_set(mold->panel, _accessibility_panel_description_set_cb, mold);
         elm_atspi_accessible_reading_info_type_set(mold->panel, (ELM_ACCESSIBLE_READING_INFO_TYPE_NAME | ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION));
 
         mold->cue_target_object = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(mold->panel), "access");
@@ -441,7 +1955,9 @@ eext_more_option_add(Evas_Object *parent)
 
         elm_atspi_accessible_name_cb_set(mold->cue_access_object, _accessibility_name_set_cb, (Eext_More_Option_Data*)mold);
         elm_atspi_accessible_role_set(mold->cue_access_object, ELM_ATSPI_ROLE_PUSH_BUTTON);
-        elm_atspi_accessible_reading_info_type_set(mold->cue_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
+        elm_atspi_accessible_reading_info_type_set(mold->cue_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME|
+                                                                                         ELM_ACCESSIBLE_READING_INFO_TYPE_ROLE|
+                                                                                         ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
         elm_access_action_cb_set(mold->cue_access_object, ELM_ACCESS_ACTION_ACTIVATE, _access_action_cb, mold);
         evas_object_data_set(mold->more_option, "_cue_access_object", mold->cue_access_object);
      }
@@ -449,6 +1965,7 @@ eext_more_option_add(Evas_Object *parent)
 
    evas_object_event_callback_add(mold->more_option, EVAS_CALLBACK_HIDE, _more_option_hide_cb, NULL);
    evas_object_event_callback_add(mold->more_option, EVAS_CALLBACK_SHOW, _more_option_show_cb, NULL);
+   evas_object_smart_callback_add(mold->more_option, SIGNAL_ACTIVATED, _rotary_activated_cb, mold);
 
    return mold->more_option;
 }
@@ -458,7 +1975,7 @@ eext_more_option_direction_set(Evas_Object *obj, Eext_More_Option_Direction dire
 {
    if (!obj)
      {
-        ERR("obj is NULL!!");
+        LOGE("obj is NULL!!");
         return;
      }
 
@@ -467,6 +1984,12 @@ eext_more_option_direction_set(Evas_Object *obj, Eext_More_Option_Direction dire
    if (mold)
      {
         elm_panel_orient_set(mold->panel, direction);
+        //ONEUI1.5(11July2019): Enable product theme when style changes
+        if (__elm_product_theme_is_loaded())
+          {
+             elm_object_signal_emit(mold->panel, "eext,more,option,enable", "elm");
+          }
+        //
         mold->direction = direction;
      }
 }
@@ -476,7 +1999,7 @@ eext_more_option_direction_get(const Evas_Object *obj)
 {
    if (!obj)
      {
-        ERR("obj is NULL!!");
+        LOGE("obj is NULL!!");
         return EEXT_MORE_OPTION_DIRECTION_RIGHT; // defalut
      }
 
@@ -499,12 +2022,13 @@ eext_more_option_item_append(Evas_Object *obj)
    mold = _more_option_data_get(obj);
    if (!mold)
      {
-        ERR("mold is NULL!!");
+        LOGE("mold is NULL!!");
         return NULL;
      }
-
-   item = eext_rotary_selector_item_append(mold->rotary_selector);
-
+   if (__elm_product_theme_is_loaded())
+     item = _eext_more_option_genlist_item_append(mold->genlist);
+   else
+     item = eext_rotary_selector_item_append(mold->rotary_selector);
    mold->item_list = eina_list_append(mold->item_list, item);
 
    return item;
@@ -519,11 +2043,13 @@ eext_more_option_item_prepend(Evas_Object *obj)
    mold = _more_option_data_get(obj);
    if (!mold)
      {
-        ERR("mold is NULL!!");
+        LOGE("mold is NULL!!");
         return NULL;
      }
-
-   item = eext_rotary_selector_item_prepend(mold->rotary_selector);
+   if (__elm_product_theme_is_loaded())
+     item = _eext_more_option_item_prepend(mold->genlist);
+   else
+     item = eext_rotary_selector_item_prepend(mold->rotary_selector);
 
    mold->item_list = eina_list_prepend(mold->item_list, item);
 
@@ -539,11 +2065,14 @@ eext_more_option_item_insert_after(Evas_Object *obj, Eext_Object_Item *after)
    mold = _more_option_data_get(obj);
    if (!mold)
      {
-        ERR("mold is NULL!!");
+        LOGE("mold is NULL!!");
         return NULL;
      }
 
-   item = eext_rotary_selector_item_insert_after(mold->rotary_selector, after);
+   if (__elm_product_theme_is_loaded())
+     item = _eext_more_option_genlist_item_insert_after(mold->genlist, after);
+   else
+     item = eext_rotary_selector_item_insert_after(mold->rotary_selector, after);
 
    mold->item_list = eina_list_append_relative(mold->item_list, item, after);
 
@@ -559,11 +2088,14 @@ eext_more_option_item_insert_before(Evas_Object *obj, Eext_Object_Item *before)
    mold = _more_option_data_get(obj);
    if (!mold)
      {
-        ERR("mold is NULL!!");
+        LOGE("mold is NULL!!");
         return NULL;
      }
 
-   item = eext_rotary_selector_item_insert_before(mold->rotary_selector, before);
+   if (__elm_product_theme_is_loaded())
+     item = _eext_more_option_genlist_item_insert_before(mold->genlist, before);
+   else
+     item = eext_rotary_selector_item_insert_before(mold->rotary_selector, before);
 
    mold->item_list = eina_list_prepend_relative(mold->item_list, item, before);
 
@@ -577,22 +2109,27 @@ eext_more_option_item_del(Eext_Object_Item *item)
    Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
    if (!rotary_selector_item)
      {
-        ERR("rotary_selector_item is NULL!!");
+        LOGE("rotary_selector_item is NULL!!");
         return;
      }
 
    Eext_More_Option_Data *mold = _more_option_data_get(rotary_selector_item->parent);
    if (!mold)
      {
-        ERR("mold is NULL!!");
+        LOGE("mold is NULL!!");
         return;
      }
 
-   eext_rotary_selector_item_del(item);
-
-   mold->item_list = eina_list_remove(mold->item_list, item);
-
-   return;
+   if (__elm_product_theme_is_loaded())
+     {
+        mold->item_list = eina_list_remove(mold->item_list, item);
+        _eext_more_option_genlist_item_del(item);
+     }
+   else
+     {
+        eext_rotary_selector_item_del(item);
+        mold->item_list = eina_list_remove(mold->item_list, item);
+     }
 }
 
 EAPI void
@@ -603,27 +2140,32 @@ eext_more_option_items_clear(Evas_Object *obj)
 
    if (!more_option)
      {
-        ERR("more_option is NULL!!");
+        LOGE("more_option is NULL!!");
         return;
      }
 
    mold = _more_option_data_get(more_option);
    if (!mold)
      {
-        ERR("mold is NULL!!");
+        LOGE("mold is NULL!!");
         return;
      }
-   eext_rotary_selector_items_clear(mold->rotary_selector);
 
-   mold->item_list = eina_list_free(mold->item_list);
+   if (__elm_product_theme_is_loaded())
+     _eext_more_option_genlist_items_clear(mold->genlist);
+   else
+     eext_rotary_selector_items_clear(mold->rotary_selector);
 
-   return;
+   mold->item_list = eina_list_free(mold->item_list);
 }
 
 EAPI void
 eext_more_option_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text)
 {
-   eext_rotary_selector_item_part_text_set(item, part_name, text);
+   if (__elm_product_theme_is_loaded())
+     _eext_more_option_genlist_item_part_text_set(item, part_name, text);
+   else
+     eext_rotary_selector_item_part_text_set(item, part_name, text);
 
    return;
 }
@@ -631,7 +2173,10 @@ eext_more_option_item_part_text_set(Eext_Object_Item *item, const char *part_nam
 EAPI void
 eext_more_option_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text)
 {
-   eext_rotary_selector_item_domain_translatable_part_text_set(item, part_name, domain, text);
+   if (__elm_product_theme_is_loaded())
+     _eext_more_option_genlist_item_domain_translatable_part_text_set(item, part_name, domain, text);
+   else
+      eext_rotary_selector_item_domain_translatable_part_text_set(item, part_name, domain, text);
 
    return;
 }
@@ -639,13 +2184,19 @@ eext_more_option_item_domain_translatable_part_text_set(Eext_Object_Item *item,
 EAPI const char *
 eext_more_option_item_part_text_get(const Eext_Object_Item *item, const char *part_name)
 {
-   return eext_rotary_selector_item_part_text_get(item, part_name);
+   if (__elm_product_theme_is_loaded())
+     return _eext_more_option_genlist_item_part_text_get(item, part_name);
+   else
+     return eext_rotary_selector_item_part_text_get(item, part_name);
 }
 
 EAPI void
 eext_more_option_item_part_content_set(Eext_Object_Item *item, const char *part_name, Evas_Object *content)
 {
-   eext_rotary_selector_item_part_content_set(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL, content);
+   if (__elm_product_theme_is_loaded())
+     _eext_more_option_genlist_item_part_content_set(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL, content);
+   else
+     eext_rotary_selector_item_part_content_set(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL, content);
 
    return;
 }
@@ -653,7 +2204,10 @@ eext_more_option_item_part_content_set(Eext_Object_Item *item, const char *part_
 EAPI Evas_Object *
 eext_more_option_item_part_content_get(const Eext_Object_Item *item, const char *part_name)
 {
-   return eext_rotary_selector_item_part_content_get(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
+   if (__elm_product_theme_is_loaded())
+     return _eext_more_option_genlist_item_part_content_get(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
+   else
+     return eext_rotary_selector_item_part_content_get(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
 }
 
 EAPI void
@@ -661,7 +2215,7 @@ eext_more_option_opened_set(Evas_Object *obj, Eina_Bool opened)
 {
    if (!obj)
      {
-        ERR("obj is NULL!!");
+        LOGE("obj is NULL!!");
         return;
      }
 
@@ -669,8 +2223,43 @@ eext_more_option_opened_set(Evas_Object *obj, Eina_Bool opened)
    mold = _more_option_data_get(obj);
    if (mold)
      {
-        if (elm_panel_hidden_get(mold->panel) && opened) elm_panel_toggle(mold->panel);
-        else if (!elm_panel_hidden_get(mold->panel) && !opened) elm_panel_toggle(mold->panel);
+        if (__elm_product_theme_is_loaded())
+          {
+             //ONEUI1.5(20Jun2019): Add blur timer in case blur idler is not invoked
+             if (mold->blur_timer)
+               {
+                  ecore_timer_del(mold->blur_timer);
+                  mold->blur_timer = NULL;
+               }
+             if (mold->blur_idler)
+               {
+                  ecore_idler_del(mold->blur_idler);
+                  mold->blur_idler = NULL;
+               }
+             //
+             //ONEUI1.5(20190424):Avoid panel close by api when panel is not active.
+             if (!opened && !mold->is_panel_active) return;
+             //
+             if (elm_panel_hidden_get(mold->panel) && opened)
+               {
+                  _eext_more_option_effect_create(mold);
+               }
+             else if (!elm_panel_hidden_get(mold->panel) && !opened)
+               {
+                  LOGI("Panel Status: %d",elm_panel_hidden_get(mold->panel));
+                  elm_panel_toggle(mold->panel);
+               }
+          }
+        else
+          {
+             LOGI("Panel Status: %d",elm_panel_hidden_get(mold->panel));
+             if (elm_panel_hidden_get(mold->panel) && opened)
+               {
+                  eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_TRUE);
+                  elm_panel_toggle(mold->panel);
+               }
+             else if (!elm_panel_hidden_get(mold->panel) && !opened) elm_panel_toggle(mold->panel);
+          }
      }
 }
 
@@ -679,7 +2268,7 @@ eext_more_option_opened_get(Evas_Object *obj)
 {
    if (!obj)
      {
-        ERR("obj is NULL!!");
+        LOGE("obj is NULL!!");
         return EINA_FALSE;
      }
 
@@ -701,18 +2290,21 @@ eext_more_option_items_get(const Evas_Object *obj)
 
    if (!more_option)
      {
-        ERR("more_option is NULL!!");
+        LOGE("more_option is NULL!!");
         return NULL;
      }
 
    mold = _more_option_data_get(more_option);
    if (!mold)
      {
-        ERR("mold is NULL!!");
+        LOGE("mold is NULL!!");
         return NULL;
      }
 
-   return eext_rotary_selector_items_get(mold->rotary_selector);
+   if (__elm_product_theme_is_loaded())
+     return _eext_more_option_genlist_items_get(mold->genlist);
+   else
+     return eext_rotary_selector_items_get(mold->rotary_selector);
 }
 
 EAPI void
@@ -723,18 +2315,21 @@ eext_more_option_editing_enabled_set(Evas_Object *obj, Eina_Bool enabled)
 
    if (!more_option)
      {
-        ERR("more_option is NULL!!");
+        LOGE("more_option is NULL!!");
         return;
      }
 
    mold = _more_option_data_get(more_option);
    if (!mold)
      {
-        ERR("mold is NULL!!");
+        LOGE("mold is NULL!!");
         return;
      }
 
-   eext_rotary_selector_editing_enabled_set(mold->rotary_selector, enabled);
+   if (__elm_product_theme_is_loaded())
+     _eext_more_option_genlist_editing_enabled_set(mold->genlist, enabled);
+   else
+     eext_rotary_selector_editing_enabled_set(mold->rotary_selector, enabled);
 }
 
 EAPI Eina_Bool
@@ -745,18 +2340,21 @@ eext_more_option_editing_enabled_get(const Evas_Object *obj)
 
    if (!more_option)
      {
-        ERR("more_option is NULL!!");
+        LOGE("more_option is NULL!!");
         return EINA_FALSE;
      }
 
    mold = _more_option_data_get(more_option);
    if (!mold)
      {
-        ERR("mold is NULL!!");
+        LOGE("mold is NULL!!");
         return EINA_FALSE;
      }
 
-   return eext_rotary_selector_editing_enabled_get(mold->rotary_selector);
+   if (__elm_product_theme_is_loaded())
+     return _eext_more_option_genlist_editing_enabled_get(mold->genlist);
+   else
+    return eext_rotary_selector_editing_enabled_get(mold->rotary_selector);
 }
 
 EAPI Eina_Bool
@@ -767,18 +2365,21 @@ eext_more_option_add_item_enabled_get(const Evas_Object *obj)
 
    if (!more_option)
      {
-        ERR("more_option is NULL!!");
+        LOGE("more_option is NULL!!");
         return EINA_FALSE;
      }
 
    mold = _more_option_data_get(more_option);
    if (!mold)
      {
-        ERR("mold is NULL!!");
+        LOGE("mold is NULL!!");
         return EINA_FALSE;
      }
 
-   return eext_rotary_selector_add_item_enabled_get(mold->rotary_selector);
+   if (__elm_product_theme_is_loaded())
+     return _eext_more_option_genlist_add_item_enabled_get(mold->genlist);
+   else
+    return eext_rotary_selector_add_item_enabled_get(mold->rotary_selector);
 }
 
 EAPI void
@@ -789,30 +2390,39 @@ eext_more_option_add_item_enabled_set(Evas_Object *obj, Eina_Bool enabled)
 
    if (!more_option)
      {
-        ERR("more_option is NULL!!");
+        LOGE("more_option is NULL!!");
         return;
      }
 
    mold = _more_option_data_get(more_option);
    if (!mold)
      {
-        ERR("mold is NULL!!");
+        LOGE("mold is NULL!!");
         return;
      }
 
-   return eext_rotary_selector_add_item_enabled_set(mold->rotary_selector, enabled);
+   if (__elm_product_theme_is_loaded())
+     return _eext_more_option_genlist_add_item_enabled_set(mold->genlist, enabled);
+   else
+    return eext_rotary_selector_add_item_enabled_set(mold->rotary_selector, enabled);
 }
 
 EAPI Eina_Bool
 eext_more_option_item_delete_enabled_get(const Eext_Object_Item *item)
 {
-   return eext_rotary_selector_item_delete_enabled_get(item);
+   if (__elm_product_theme_is_loaded())
+     return _eext_more_option_genlist_item_delete_enabled_get(item);
+   else
+    return eext_rotary_selector_item_delete_enabled_get(item);
 }
 
 EAPI void
 eext_more_option_item_delete_enabled_set(Eext_Object_Item *item, Eina_Bool enabled)
 {
-   eext_rotary_selector_item_delete_enabled_set(item, enabled);
+   if (__elm_product_theme_is_loaded())
+     _eext_more_option_genlist_item_delete_enabled_set(item, enabled);
+   else
+    eext_rotary_selector_item_delete_enabled_set(item, enabled);
 }
 
 //for accessibility
@@ -826,7 +2436,17 @@ _access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_i
         case ELM_ACCESS_ACTION_ACTIVATE:
           if (mold)
             {
-               elm_panel_toggle(mold->panel);
+//ONEUI1.5(12MAR2019): fixed bug(The bezel is not operated when screen-reader is on)
+               if (__elm_product_theme_is_loaded())
+                 {
+                    _eext_more_option_effect_create(mold);
+                 }
+               else
+                 {
+                    eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_TRUE);
+                    elm_panel_toggle(mold->panel);
+                 }
+//
             }
         break;
         default:
@@ -834,6 +2454,7 @@ _access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_i
      }
    return EINA_FALSE;
 }
+
 static char *
 _accessibility_name_set_cb(void *data, Evas_Object *obj)
 {
@@ -855,11 +2476,73 @@ _accessibility_panel_name_set_cb(void *data, Evas_Object *obj)
 static char *
 _accessibility_panel_description_set_cb(void *data, Evas_Object *obj)
 {
+   Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
    char buf[255] = "";
-   snprintf(buf, sizeof(buf), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_NAVIGATE_ITEMS"));
+   const Eina_List *list = NULL;
+
+   if (mold)
+     {
+        list = _eext_more_option_genlist_items_get(mold->genlist);
+        if (list && eina_list_count(list) > 1)
+          {
+             Eext_Rotary_Event_Type _rotary_event_type = eext_rotary_event_type_get();
+             if (_rotary_event_type == EEXT_ROTARY_EVENT_TYPE_HW_BEZEL)
+               snprintf(buf, sizeof(buf), _("WDS_ACCS_TBBODY_TURN_BEZEL_TO_NAVIGATE_THROUGH_ITEMS"));
+             else if (_rotary_event_type == EEXT_ROTARY_EVENT_TYPE_SW_BEZEL && eext_rotary_event_is_enabled())
+               snprintf(buf, sizeof(buf), _("WDS_ACCS_TBBODY_SWIPE_THE_BEZEL_TO_NAVIGATE_THROUGH_ITEMS"));
+             else
+               snprintf(buf, sizeof(buf), _("WDS_ACCS_TBBODY_SWIPE_RIGHT_FOR_NEXT_ITEM"));
+          }
+     }
    return strdup(buf);
 }
 
+//ONEUI1.5(2019Feb28): Read button name and description instead of genlist item
+static char *
+_accessibility_item_name_cb(void *data, Evas_Object *obj)
+{
+   char *ret;
+   Eina_Strbuf *buf;
+   Eext_Rotary_Selector_Item* item = data;
+   const char *btn_name = NULL;
+
+   btn_name = elm_atspi_accessible_name_get(item->dummy_button);
+   if (!btn_name) return NULL;
+
+   buf = eina_strbuf_new();
+   eina_strbuf_append(buf, btn_name);
+
+   ret = eina_strbuf_string_steal(buf);
+   eina_strbuf_free(buf);
+   return strdup(ret);
+}
+
+static char *
+_accessibility_item_description_cb(void *data, Evas_Object *obj)
+{
+   char *ret;
+   Eina_Strbuf *buf;
+   Eext_Rotary_Selector_Item* item = data;
+   const char *btn_desc = NULL;
+
+   btn_desc = elm_atspi_accessible_description_get(item->dummy_button);
+   if (!btn_desc) return NULL;
+
+   buf = eina_strbuf_new();
+   eina_strbuf_append(buf, btn_desc);
+
+   ret = eina_strbuf_string_steal(buf);
+   eina_strbuf_free(buf);
+   return strdup(ret);
+}
+
+static void
+_set_item_access_info(Eext_Rotary_Selector_Item* item)
+{
+   elm_atspi_accessible_name_cb_set(item->item, _accessibility_item_name_cb, item);
+   elm_atspi_accessible_description_cb_set(item->item, _accessibility_item_description_cb, item);
+}
+//
 //
 
 void
@@ -881,7 +2564,7 @@ _eext_more_option_color_class_parent_set(Evas_Object *obj, Evas_Object *parent)
 
    if (!edje || !parent_edje)
      {
-        ERR("There is a missing edje to have color class relationship... edje[%p], parent_edje[%p]", edje, parent_edje);
+        LOGE("There is a missing edje to have color class relationship... edje[%p], parent_edje[%p]", edje, parent_edje);
         return;
      }
 
index b4fa99401c4e9058c5449a6ed04d55050a04289e..2143af36940b89a93dfffed56124b3182c2b2ae5 100644 (file)
 #include "wearable/efl_extension_common_private.h"
 
 #define EEXT_PANEL_DATA_KEY "eext_panel_data"
+//ONEUI1.5(13MAR2019): Support for scrollbar show timing
+#define OBJECT_SHOW_HIDE_KEY "object_show_hide"
+#define OBJECT_SHOW_INTERNAL "object,show,internal"
+#define OBJECT_HIDE_INTERNAL "object,hide,internal"
+//
 
+#define MAXALPHA 229 //90% of 255
 
 static Eext_Panel_Data *
 _eext_panel_data_init(Evas_Object *obj, Evas_Object *parent)
@@ -31,7 +37,7 @@ _eext_panel_data_init(Evas_Object *obj, Evas_Object *parent)
 
    if (!pd)
      {
-        ERR("pd is NULL!!");
+        LOGE("pd is NULL!!");
         return NULL;
      }
 
@@ -49,7 +55,7 @@ _eext_panel_data_get(const Evas_Object *eext_panel)
 {
    if (!eext_panel)
      {
-        ERR("eext_panel is NULL!!");
+        LOGE("eext_panel is NULL!!");
         return NULL;
      }
 
@@ -61,13 +67,29 @@ _panel_hide_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_U
 {
    if (!obj)
      {
-        ERR("panel is NULL!!");
+        LOGE("panel is NULL!!");
         return;
      }
 
    if (!elm_panel_hidden_get(obj)) elm_panel_toggle(obj);
 }
 
+//ONEUI1.5(13MAR2019): Support for scrollbar show timing
+static void
+_panel_active_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   Eext_Panel_Data *pd = data;
+   evas_object_smart_callback_call(pd->layout, OBJECT_SHOW_INTERNAL, pd->assist_panel);
+}
+
+static void
+_panel_inactive_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   Eext_Panel_Data *pd = data;
+   evas_object_smart_callback_call(pd->layout, OBJECT_HIDE_INTERNAL, pd->assist_panel);
+}
+//
+
 static void
 _panel_unhold_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
@@ -141,14 +163,35 @@ _panel_hold_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_U
    evas_object_smart_callback_call(pd->eext_panel, "assist,panel,hidden", NULL);
 }
 
+static void
+_cue_start_animation_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   Eext_Panel_Data *pd = data;
+   elm_layout_signal_emit(pd->primary_panel, "elm,state,panel,start,animation", "elm");
+}
+
+static void
+_cue_stop_animation_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   Eext_Panel_Data *pd = data;
+   elm_layout_signal_emit(pd->primary_panel, "elm,state,panel,stop,animation", "elm");
+}
+
 static void
 _panel_scroll_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    Eext_Panel_Data *pd = data;
    Elm_Panel_Scroll_Info *ev = event_info;
+   double pos = ev->rel_y;
+
+   if (ev->rel_y < pd->prev_rel_y)
+     {
+        double cubic_bezier_v[] = {0.47, 0.0, 0.745, 0.715};
+        pos = ecore_animator_pos_map_n(pos, ECORE_POS_MAP_CUBIC_BEZIER, 4, cubic_bezier_v);
+     }
 
-   int col = 229 * ev->rel_y;
-   evas_object_color_set(pd->panel_bg, 0, 0, 0, col);
+   int alpha = MAXALPHA * pos;
+   evas_object_color_set(pd->panel_bg, 0, 0, 0, alpha);
 }
 
 static void
@@ -174,6 +217,18 @@ _eext_panel_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
    Eext_Panel_Data *pd = data;
 
+   elm_object_signal_callback_del(pd->assist_panel, "elm,state,unhold", "elm", (Edje_Signal_Cb)_panel_unhold_cb);
+   elm_object_signal_callback_del(pd->assist_panel, "elm,state,hold", "elm", (Edje_Signal_Cb)_panel_hold_cb);
+   //ONEUI1.5(13MAR2019): Support for scrollbar show timing
+   elm_object_signal_callback_del(pd->assist_panel, "elm,state,active", "elm", (Edje_Signal_Cb)_panel_active_cb);
+   elm_object_signal_callback_del(pd->assist_panel, "elm,state,inactive", "elm", (Edje_Signal_Cb)_panel_inactive_cb);
+   //
+   elm_layout_signal_callback_del(obj, "cue,start_animation", "ext", _cue_start_animation_cb);
+   elm_layout_signal_callback_del(obj, "cue,stop_animation", "ext", _cue_stop_animation_cb);
+   evas_object_smart_callback_del(pd->assist_panel, "scroll", _panel_scroll_cb);
+   evas_object_event_callback_del(pd->assist_panel, EVAS_CALLBACK_MOUSE_UP, _panel_mouse_up_cb);
+   evas_object_event_callback_del(pd->assist_panel, EVAS_CALLBACK_MOUSE_DOWN, _panel_mouse_down_cb);
+
    free(pd);
 }
 
@@ -190,7 +245,7 @@ eext_panel_add(Evas_Object *parent)
    layout = elm_layout_add(parent);
    if (!layout)
      {
-        ERR("eext_panel is NULL!!");
+        LOGE("eext_panel is NULL!!");
         return NULL;
      }
 
@@ -206,7 +261,7 @@ eext_panel_add(Evas_Object *parent)
    ret = elm_layout_theme_set(layout, "layout", "drawer", "panel");
    if (!ret)
      {
-        ERR("Failed to set theme!!");
+        LOGE("Failed to set theme!!");
         evas_object_del(layout);
         free(pd);
         return NULL;
@@ -215,7 +270,7 @@ eext_panel_add(Evas_Object *parent)
    primary_ly = elm_layout_add(layout);
    if (!primary_ly)
      {
-        ERR("Primary layout is NULL!!");
+        LOGE("Primary layout is NULL!!");
         evas_object_del(layout);
         free(pd);
         return NULL;
@@ -224,7 +279,7 @@ eext_panel_add(Evas_Object *parent)
    ret = elm_layout_theme_set(primary_ly, "layout", "panel", "primary");
    if (!ret)
      {
-        ERR("Failed to set primary layout theme!!");
+        LOGE("Failed to set primary layout theme!!");
         evas_object_del(primary_ly);
         evas_object_del(layout);
         free(pd);
@@ -239,7 +294,7 @@ eext_panel_add(Evas_Object *parent)
    panel = elm_panel_add(layout);
    if (!panel)
      {
-        ERR("Assist panel is NULL!!");
+        LOGE("Assist panel is NULL!!");
         evas_object_del(primary_ly);
         evas_object_del(layout);
         free(pd);
@@ -253,15 +308,30 @@ eext_panel_add(Evas_Object *parent)
    elm_object_part_content_set(layout, "elm.swallow.right", panel);
 
    pd->assist_panel = panel;
+   pd->layout = layout;
 
    pd->panel_bg = evas_object_rectangle_add(evas_object_evas_get(layout));
    evas_object_color_set(pd->panel_bg, 0, 0, 0, 0);
    elm_object_part_content_set(layout, "elm.swallow.bg", pd->panel_bg);
 
+   //ONEUI1.5(13MAR2019): Support for scrollbar show timing
+   evas_object_data_set(layout, OBJECT_SHOW_HIDE_KEY, pd->assist_panel);
+   //
+
    elm_object_signal_callback_add(panel, "elm,state,unhold", "elm",
                                   (Edje_Signal_Cb)_panel_unhold_cb, pd);
    elm_object_signal_callback_add(panel, "elm,state,hold", "elm",
                                   (Edje_Signal_Cb)_panel_hold_cb, pd);
+   //ONEUI1.5(13MAR2019): Support for scrollbar show timing
+   elm_object_signal_callback_add(panel, "elm,state,active", "elm",
+                                  (Edje_Signal_Cb)_panel_active_cb, pd);
+   elm_object_signal_callback_add(panel, "elm,state,inactive", "elm",
+                                  (Edje_Signal_Cb)_panel_inactive_cb, pd);
+   //
+   elm_layout_signal_callback_add(layout, "cue,start_animation", "ext",
+                                  _cue_start_animation_cb, pd);
+   elm_layout_signal_callback_add(layout, "cue,stop_animation", "ext",
+                                  _cue_stop_animation_cb, pd);
    evas_object_smart_callback_add(panel, "scroll", _panel_scroll_cb, pd);
    evas_object_event_callback_add(panel, EVAS_CALLBACK_MOUSE_UP,
                                   _panel_mouse_up_cb, pd);
@@ -281,24 +351,24 @@ eext_panel_part_content_set(Evas_Object *obj, const char *part_name,
 
    if (!obj)
      {
-        ERR("obj is NULL!!");
+        LOGE("obj is NULL!!");
         return;
      }
    if (!part_name)
      {
-        ERR("part_name is NULL!!");
+        LOGE("part_name is NULL!!");
         return;
      }
    if (!content)
      {
-        ERR("content is NULL!!");
+        LOGE("content is NULL!!");
         return;
      }
 
    pd = _eext_panel_data_get(obj);
    if (!pd)
      {
-        ERR("pd is NULL!!");
+        LOGE("pd is NULL!!");
         return;
      }
 
@@ -313,7 +383,7 @@ eext_panel_part_content_set(Evas_Object *obj, const char *part_name,
      }
    else
      {
-        ERR("Not supported part name!!!");
+        LOGE("Not supported part name!!!");
         return;
      }
 }
@@ -325,19 +395,19 @@ eext_panel_part_content_get(const Evas_Object *obj, const char *part_name)
 
    if (!obj)
      {
-        ERR("obj is NULL!!");
+        LOGE("obj is NULL!!");
         return NULL;
      }
    if (!part_name)
      {
-        ERR("part_name is NULL!!");
+        LOGE("part_name is NULL!!");
         return NULL;
      }
 
    pd = _eext_panel_data_get(obj);
    if (!pd)
      {
-        ERR("pd is NULL!!");
+        LOGE("pd is NULL!!");
         return NULL;
      }
 
@@ -352,7 +422,7 @@ eext_panel_part_content_get(const Evas_Object *obj, const char *part_name)
      }
    else
      {
-        ERR("Not supported part name!!!");
+        LOGE("Not supported part name!!!");
         return NULL;
      }
 }
index cb3a01a0d05b4439cbf836d8ea3d646872f5b6c7..f8cce25c35517da89c0af677c4367b54460e4e54 100644 (file)
 #define _ROTARY_SELECTOR_ROTARY_EVENT_RESET_TIME 500
 #define _ROTARY_SELECTOR_ROTARY_EVENT_TIME_ACCELERATION_THRESHOLD 60
 
-#define _ROTARY_SELECTOR_ITEM_DRAG_PAGE_ANIMATOIN_DELAY_TIME 0.1
-#define _ROTARY_SELECTOR_ITEM_LONGPRESS_MOVE_ANIMATOIN_DELAY_TIME 0.3
-
+//ONEUI1.5(18Jun2018): Adjust drag iem size as per GUI
 #define _ROTARY_SELECTOR_DRAG_ITEM_WIDTH 80
 #define _ROTARY_SELECTOR_DRAG_ITEM_HEIGHT 80
+//
+//ONEUI1.5(04Jun2018) : Delay for item animatoin
+#define _ROTARY_SELECTOR_ITEM_SWAP_ANIMATOIN_DELAY_TIME 0.1
+#define _ROTARY_SELECTOR_ITEM_DRAG_PAGE_ANIMATOIN_DELAY_TIME 0.2
+#define _ROTARY_SELECTOR_ITEM_LONGPRESS_MOVE_ANIMATOIN_DELAY_TIME 0.3
+//
 #define _ROTARY_SELECTOR_DEBUG_ENABLED 0
 
 // ====================================== util ==================================== //
                                  if (a) *a = obj->part.state.a; \
                               } while (0)
 
+// ONEUI1.5(20180607) - v2.4 ROTARY SELECTOR UI
+#define ITEM_SIGNAL_BUF_SIZE 32
+char stylenumber[11][3] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};
+//
 void _eext_rotary_selector_color_class_parent_set(Evas_Object *obj, Evas_Object *parent);
 
 static double
@@ -213,6 +221,11 @@ static void _layer_items_invalidate(Eext_Rotary_Selector_Data *rsd);
 static void _item_rearrange(Eext_Rotary_Selector_Data *rsd, int selected_index);
 static void _item_select(Eext_Rotary_Selector_Data *rsd, int index);
 static void _item_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+//ONEUI1.5(20Jun2017): Add next/prev icons for product style.
+static void _product_style_check(Eext_Rotary_Selector_Data *rsd);
+static Evas_Object *_product_layer_icon_create(Eext_Rotary_Selector_Data *rsd, const char* style);
+
 static Eext_Rotary_Selector_Item *_item_create(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item_Type item_type);
 static void _item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_index, int current_item_index);
 static void _item_touched_signal_send(Eext_Rotary_Selector_Data *rsd, int index, Eina_Bool pressed, Eina_Bool sound);
@@ -242,13 +255,19 @@ static Eina_Bool _content_update_timer_cb(void *data);
 
 // ----------------------------------------- Accessibility API --------------------------------------//
 static void _accessibility_item_btn_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
+//ONEUI1.5(20180709): On double tap and hold, mouse down, up are sent in access mode
+static void _accessibility_theme_changed_cb(void *data, Evas_Object *obj, void *event_info);
+//
+static char *_accessibility_item_name_set_cb(void *data, Evas_Object *obj);
 static void _accessibility_item_name_set(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *it);
 static void _accessibility_item_chain_end_set(Eext_Rotary_Selector_Data *rsd);
 static void _rotary_selector_moreoption_opened_cb(void *data, Evas_Object *obj, void *event_info);
-static void _accessibility_item_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info);
+void *elm_object_accessibility_currently_highlighted_get(void);
 static void _rotary_selector_screen_reader_changed(void *data, Evas_Object *obj, void *event_info);
 static void _accessibility_rotary_selector_item_relationship_set(Evas_Object* obj, Evas_Object* after_obj);
-static Eina_Bool _accessibility_item_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj);
+static Eina_Bool _accessibility_item_gesture_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj);
+static void _accessibility_rotary_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
+static void _accessibility_rotary_unhighlighted_cb(void *data, Evas_Object *obj, void *event_info);
 
 // ----------------------------------------- event area API --------------------------------------//
 
@@ -261,28 +280,63 @@ _delete_icon_mouse_on_check(Eext_Rotary_Selector_Data *rsd, int idx, Evas_Coord
    Eina_Rectangle *rect = NULL;
 
    item = eina_list_nth(rsd->item_list, idx);
+   //ONEUI1.5(09Jul2018):More safety for delete case
    if (!item)
      {
-        ERR("item is NULL");
+        LOGE("item is NULL");
         return EINA_FALSE;
      }
+   //
    if (!item->delete_enabled)
      return EINA_FALSE;
 
    idx = idx - rsd->current_page * _ROTARY_SELECTOR_PAGE_ITEM_MAX;
    evas_object_geometry_get(item->base.obj, &x, &y, &w, &h);
-   if (idx < _ROTARY_SELECTOR_PAGE_ITEM_MAX / 2)
-     {
-        rect = eina_rectangle_new(x, y, rsd->delete_icon_width, rsd->delete_icon_height);
+   //ONEUI1.5(20180620):delete_icon area r0~r10
+   switch (idx)
+     {
+        case 0:
+           rect = eina_rectangle_new(x + 1, y + 32, rsd->delete_icon_width, rsd->delete_icon_height);
+        break;
+        case 1:
+            rect = eina_rectangle_new(x - 7, y + 23, rsd->delete_icon_width, rsd->delete_icon_height);
+        break;
+        case 2:
+            rect = eina_rectangle_new(x - 10, y + 12, rsd->delete_icon_width, rsd->delete_icon_height);
+        break;
+        case 3:
+            rect = eina_rectangle_new(x - 7, y + 2, rsd->delete_icon_width, rsd->delete_icon_height);
+        break;
+        case 4:
+            rect = eina_rectangle_new(x + 1, y - 5, rsd->delete_icon_width, rsd->delete_icon_height);
+        break;
+        case 5:
+            rect = eina_rectangle_new(x + 12, y - 9, rsd->delete_icon_width, rsd->delete_icon_height);
+        break;
+        case 6:
+            rect = eina_rectangle_new(x + 23, y - 5, rsd->delete_icon_width, rsd->delete_icon_height);
+        break;
+        case 7:
+            rect = eina_rectangle_new(x + 31, y + 2, rsd->delete_icon_width, rsd->delete_icon_height);
+        break;
+        case 8:
+            rect = eina_rectangle_new(x + 34, y + 12, rsd->delete_icon_width, rsd->delete_icon_height);
+        break;
+        case 9:
+            rect = eina_rectangle_new(x + 31, y + 23, rsd->delete_icon_width, rsd->delete_icon_height);
+        break;
+        case 10:
+            rect = eina_rectangle_new(x + 23, y + 32, rsd->delete_icon_width, rsd->delete_icon_height);
+        break;
      }
-   else
+   //
+
+   if (rect)
      {
-        rect = eina_rectangle_new(x + w - rsd->delete_icon_width, y,
-                                  rsd->delete_icon_width, rsd->delete_icon_height);
-     }
-   inside = eina_rectangle_coords_inside(rect, px, py);
+       inside = eina_rectangle_coords_inside(rect, px, py);
 
-   eina_rectangle_free(rect);
+       eina_rectangle_free(rect);
+     }
 
    return inside;
 }
@@ -291,6 +345,13 @@ static void
 _no_items_show(Eext_Rotary_Selector_Data *rsd)
 {
    Evas_Object *bg;
+
+   //ONEUI1.5(11Apr2018) : Apply workaround for app launch time issue
+   if (!rsd->edit_mode_enabled)
+     {
+       return;
+     }
+
    //FIXME: translation
    elm_object_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"),
                             "selector,main_text", _("No items"));
@@ -372,7 +433,16 @@ _del_item_move_animator_cb(void *data)
           {
              _no_items_show(rsd);
           }
+        //ONEUI1.5(20180822): Case of setting add_item enabled while animation
+        evas_object_smart_callback_call(rsd->rotary_selector, "item,deleted", (void*)rsd->del_item);
+        if (rsd->del_item)
+          {
+             evas_object_del(rsd->del_item->base.obj);
+          }
+        //
+        //ONEUI1.5(20180611): Disable edit mode deletion during item rearrange animation
         rsd->del_item_move_animator = NULL;
+        //
         return ECORE_CALLBACK_CANCEL;
      }
 
@@ -385,6 +455,52 @@ _del_item_timer_cb(void *data)
    Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
 
    rsd->item_del_timer = NULL;
+   //ONEUI1.5(20180621):Synchronized Item and delete icon
+   Eina_List *l;
+   Eext_Rotary_Selector_Item *item;
+   int i = 0;
+   int idx1 = 0, idx2 = 0;
+   int last_index = 0;
+   idx1 = rsd->del_item_index;
+
+   last_index = (rsd->current_page + 1) * _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+   int item_no = eina_list_count(rsd->item_list);
+   if (last_index < item_no)
+     {
+        idx2 = last_index;
+     }
+   else
+     {
+        idx2 = item_no;
+     }
+   EINA_LIST_FOREACH(rsd->item_list, l, item)
+     {
+        if (i >= idx1 && i <= idx2)
+          {
+             Evas_Object *button;
+             button = item->base.obj;
+             char style[ITEM_SIGNAL_BUF_SIZE]="elm,selector,delete,r";
+
+             if (rsd->editing && item->delete_enabled && rsd->drag_done && i != idx2)
+               {
+                  int style_number = item->index % _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+                  //ONEUI1.5(20181224): SVACE #3665 fix
+                  strncat(style, stylenumber[style_number], 3);
+                  //
+                  elm_object_signal_emit(button, style, "elm");
+               }
+             else if (rsd->editing && item->delete_enabled && rsd->drag_done && i == idx2)
+               {
+                  int style_number = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+                  //ONEUI1.5(20181224): SVACE #3665 fix
+                  strncat(style, stylenumber[style_number], 3);
+                  //
+                  elm_object_signal_emit(button, style, "elm");
+               }
+          }
+        i++;
+    }
+   //
    rsd->del_item_move_animator = ecore_animator_add(_del_item_move_animator_cb, rsd);
 
    return ECORE_CALLBACK_CANCEL;
@@ -393,6 +509,7 @@ _del_item_timer_cb(void *data)
 static void
 _delete_item(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *it)
 {
+   //ONEUI1.5(20180611): Disable edit mode deletion during item rearrange animation
    if (rsd->item_del_timer || rsd->del_item_move_animator)
      {
         return;
@@ -406,12 +523,26 @@ _delete_item(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *it)
    rsd->del_item_index = rsd->pressed_item_index;
    rsd->item_move_started = EINA_TRUE;
 
-   evas_object_smart_callback_call(rsd->rotary_selector, "item,deleted", (void*)rsd->del_item);
+   //ONEUI1.5(20180611): Edit mode screen reader support
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+     {
+        //Edit mode screen reader deletion case
+        rsd->del_item_index = rsd->selected_index;
+
+        elm_atspi_bridge_utils_say(_("WDS_ACCS_TBBODY_ITEM_REMOVED"), EINA_FALSE, NULL, NULL);
+     }
+   //
    if (rsd->del_item)
      {
-        evas_object_del(rsd->del_item->base.obj);
+        //ONEUI1.5(20180822): Case of setting add_item enabled while animation
+        evas_object_hide(rsd->del_item->base.obj);
+        //
+        //ONEUI1.5(20180620):Release pressed delete icon
         rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+        //
+        //ONEUI1.5 (20180625): Reset drop_item_index
         rsd->drop_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+        //
      }
 
    if (rsd->item_del_timer)
@@ -419,6 +550,7 @@ _delete_item(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *it)
    rsd->item_del_timer = ecore_timer_add(_ROTARY_SELECTOR_DEL_ANIMATION_DURATION, _del_item_timer_cb, rsd);
 }
 
+//ONEUI1.5(20180608): Add gesture swipe support
 static Evas_Event_Flags
 _on_flick_end_cb(void *data, void *event_info)
 {
@@ -476,6 +608,7 @@ _on_flick_end_cb(void *data, void *event_info)
      }
    return EVAS_EVENT_FLAG_ON_HOLD;
 }
+//
 
 static void
 _dnd_end(Eext_Rotary_Selector_Data *data)
@@ -483,10 +616,10 @@ _dnd_end(Eext_Rotary_Selector_Data *data)
    Eext_Rotary_Selector_Data *rsd = data;
 
    rsd->drag_done = EINA_TRUE;
-
+   //ONEUI1.5(201806012) : Support gesture ux
    elm_gesture_layer_cb_set(rsd->gesture_layer, ELM_GESTURE_N_FLICKS,
                              ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd);
-
+   //
    if (rsd->stand_timer)
      {
         ecore_timer_del(rsd->stand_timer);
@@ -530,8 +663,6 @@ _dnd_end(Eext_Rotary_Selector_Data *data)
         //add back
         if (rsd->drag_item)
           {
-             Eext_Rotary_Selector_Item *tmp_item;
-
              evas_object_del(rsd->drag_obj);
              rsd->item_list = eina_list_prepend_relative(rsd->item_list, rsd->drag_item, rsd->tmp_drag_item);
              rsd->item_list = eina_list_remove(rsd->item_list, rsd->tmp_drag_item);
@@ -548,16 +679,55 @@ _dnd_end(Eext_Rotary_Selector_Data *data)
           }
         else
           {
-             ERR("drag item is NULL");
+             LOGE("drag item is NULL");
           }
      }
 
     if (rsd->drag_item)
       {
+         //ONEUI1.5(20180629): on reorder, update flow
+         if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+           {
+              int index = 0;
+              int first_index = rsd->current_page * _ROTARY_SELECTOR_PAGE_ITEM_MAX;
+              int last_index = (rsd->current_page + 1) * _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+              if (rsd->drop_item_index < 0)
+                index = rsd->drag_item_index;
+              else
+                index = rsd->drop_item_index;
+              Eext_Rotary_Selector_Item *prev_item = eina_list_nth(rsd->item_list, index - 1);
+              Eext_Rotary_Selector_Item *next_item = eina_list_nth(rsd->item_list, index + 1);
+              if (prev_item)
+                _accessibility_rotary_selector_item_relationship_set(prev_item->base.obj, rsd->drag_item->base.obj);
+              if (next_item)
+                _accessibility_rotary_selector_item_relationship_set(rsd->drag_item->base.obj, next_item->base.obj);
+              if (!prev_item)
+                {
+                   elm_atspi_accessible_relationship_append(rsd->rotary_selector, ELM_ATSPI_RELATION_FLOWS_TO, rsd->drag_item->base.obj);
+                   elm_atspi_accessible_relationship_append(rsd->drag_item->base.obj, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->drag_item->base.obj);
+                }
+              else if (!next_item)
+                elm_atspi_accessible_relationship_append(rsd->drag_item->base.obj, ELM_ATSPI_RELATION_FLOWS_TO, rsd->drag_item->base.obj);
+
+               if (index >= first_index && index <= last_index)
+                 elm_atspi_component_highlight_grab(rsd->drag_item->base.obj);
+              _accessibility_item_chain_end_set(rsd);
+           }
+         //
          evas_object_smart_callback_call(rsd->rotary_selector, "item,reordered", (void*)rsd->drag_item);
          rsd->drag_item = NULL;
+         //ONEUI1.5(20180625): Reset drop_item_index
+         rsd->drop_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+         //
+         //ONEUI1.5(20180612): Edit mode screen reader support
+         if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+           {
+              elm_atspi_bridge_utils_say(_("WDS_ACCS_TBBODY_ITEM_MOVED"), EINA_FALSE, NULL, NULL);
+           }
+         //
       }
 }
+//
 
 static Eina_Bool
 _page_move(void *data)
@@ -694,9 +864,22 @@ _drag_item_move_animator_cb(void *data)
         _items_transformation_update(rsd);
         _items_invalidate(rsd);
         rsd->drag_item_index = eina_list_data_idx(rsd->item_list, rsd->tmp_drag_item);
+        rsd->is_item_animating = EINA_FALSE;
 
         rsd->is_item_animating = EINA_FALSE;
 
+        //ONEUI1.5(20180612): Edit mode screen reader support
+        if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+          {
+             char buf_slot[255];
+             int drag_slot = rsd->drop_item_index + 1;
+             int total_slots = eina_list_count(rsd->item_list);
+             if (rsd->add_item) total_slots = total_slots - 1;
+             char *str = _("WDS_ACCS_TBOPT_SLOT_P1SD_OF_P2SD");
+             snprintf(buf_slot, sizeof(buf_slot)-1, str, drag_slot, total_slots);
+             elm_atspi_bridge_utils_say(buf_slot, EINA_TRUE, NULL, NULL);
+          }
+        //
         return ECORE_CALLBACK_CANCEL;
      }
 
@@ -739,11 +922,11 @@ _dnd_pos(Eext_Rotary_Selector_Data *data, Evas_Coord x, Evas_Coord y)
    const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH / 2.0f;
    const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT / 2.0f;
 
+   rsd->drop_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
    int point = sqrt(pow(center_x - x, 2) + pow(center_y - y, 2));
    if ((point > _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH / 2) &&
        (!rsd->page_anim_on_going))
      {
-        rsd->drop_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
         double angle = _mouse_event_angle_get(x, y);
         if (angle < 20.f)
           {
@@ -815,14 +998,13 @@ _image_create_icon(Eext_Rotary_Selector_Data *data)
 {
    Eext_Rotary_Selector_Data *rsd = data;
    Eext_Rotary_Selector_Item *item, *tmp_item;
-   int start_idx;
    const char *file, *group;
    Evas_Object *clone_img = NULL;
    Evas_Object *icon, *item_icon, *action_bg;
 
    if (!rsd)
      {
-        ERR("failed");
+        LOGE("failed");
         return NULL;
      }
 
@@ -836,6 +1018,24 @@ _image_create_icon(Eext_Rotary_Selector_Data *data)
    item = eina_list_nth(rsd->item_list, rsd->pressed_item_index);
    rsd->drag_item = item;
    tmp_item->index = item->index;
+
+   //ONEUI1.5(20180629): on reorder, update flow
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+     {
+        Eext_Rotary_Selector_Item *before_item = eina_list_nth(rsd->item_list, item->index - 1);
+        Eext_Rotary_Selector_Item *after_item = eina_list_nth(rsd->item_list, item->index + 1);
+        if (before_item && after_item)
+          _accessibility_rotary_selector_item_relationship_set(before_item->base.obj, after_item->base.obj);
+        else if (!before_item && after_item)
+          {
+             elm_atspi_accessible_relationship_append(rsd->rotary_selector, ELM_ATSPI_RELATION_FLOWS_TO, after_item->base.obj);
+             elm_atspi_accessible_relationship_append(after_item->base.obj, ELM_ATSPI_RELATION_FLOWS_FROM, after_item->base.obj);
+          }
+        else if (before_item && !after_item)
+          elm_atspi_accessible_relationship_append(before_item->base.obj, ELM_ATSPI_RELATION_FLOWS_TO, before_item->base.obj);
+        _accessibility_item_chain_end_set(rsd);
+     }
+   //
    rsd->item_list = eina_list_prepend_relative(rsd->item_list, tmp_item, item);
    rsd->item_list = eina_list_remove(rsd->item_list, item);
 
@@ -853,20 +1053,22 @@ _image_create_icon(Eext_Rotary_Selector_Data *data)
    evas_object_show(action_bg);
    elm_object_part_content_set(icon, "item,bg_image", action_bg);
    _eext_rotary_selector_color_class_parent_set(action_bg, rsd->rotary_selector);
-
-   start_idx = rsd->current_page * _ROTARY_SELECTOR_PAGE_ITEM_MAX;
+   //ONEUI1.5(20180705):show highlight for item when drag it
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+     elm_object_signal_emit(icon, "elm,action,access_highlight,show", "elm");
+   //
    tmp_item->delete_enabled = EINA_FALSE;
-   if (item->delete_enabled)
-     {
-        if (item->index >= start_idx &&
-            item->index < start_idx + _ROTARY_SELECTOR_PAGE_ITEM_MAX / 2 )
-          {
-             elm_object_signal_emit(icon, "elm,selector,delete,left", "elm");
-          }
-        else
-          {
-             elm_object_signal_emit(icon, "elm,selector,delete,right", "elm");
-          }
+   //ONEUI1.5(20180611) : Hide delete icon while dnd
+   if (item->delete_enabled && rsd->drag_done)
+     {
+        // ONEUI1.5(20180607) - v2.4 ROTARY SELECTOR UI
+        char style[ITEM_SIGNAL_BUF_SIZE]="elm,selector,delete,r";
+        int style_number = item->index % 11;
+        //ONEUI1.5(20181224): SVACE #3665 fix
+        strncat(style, stylenumber[style_number], 3);
+        //
+        elm_object_signal_emit(icon, style, "elm");
+        //
      }
    else
      {
@@ -884,10 +1086,13 @@ _image_create_icon(Eext_Rotary_Selector_Data *data)
      }
    else
      {
-        ERR("Cannot get image file path. Item icon only supports elm image");
+        LOGE("Cannot get image file path. Item icon only supports elm image");
      }
    elm_object_part_content_set(icon, "item,icon", clone_img);
    elm_object_signal_emit(icon, "elm,action,button,longpressed", "");
+   //ONEUI1.5 (20180612) Set delete_icon state to hide
+   elm_object_signal_emit(item->base.obj, "elm,selector,delete,hide", "elm");
+   //
    evas_object_hide(item->base.obj);
 
    _item_rearrange(rsd, rsd->selected_index);
@@ -898,36 +1103,6 @@ _image_create_icon(Eext_Rotary_Selector_Data *data)
    return icon;
 }
 
-static void
-_drag_done(Eext_Rotary_Selector_Data *data)
-{
-   Eext_Rotary_Selector_Data *rsd = data;
-   //there was no dnd pos, leave, done at drop side
-   //add back item
-   if (rsd->drag_item && rsd->tmp_drag_item)
-     {
-        Eext_Rotary_Selector_Item *tmp_item;
-
-        rsd->item_list = eina_list_prepend_relative(rsd->item_list, rsd->drag_item, rsd->tmp_drag_item);
-        rsd->item_list = eina_list_remove(rsd->item_list, rsd->tmp_drag_item);
-
-        evas_object_show(rsd->drag_item->base.obj);
-
-        _item_rearrange(rsd, rsd->selected_index);
-        _items_transformation_update(rsd);
-        _items_invalidate(rsd);
-        _item_update_animation_run(rsd);
-        //delete tmp_item
-        evas_object_del(rsd->tmp_drag_item->base.obj);
-        rsd->drag_item = NULL;
-        rsd->tmp_drag_item = NULL;
-     }
-   else
-     {
-        ERR("drag item is NULL");
-     }
-}
-
 static Eina_Bool
 _item_longpress_cb(void *data)
 {
@@ -935,14 +1110,19 @@ _item_longpress_cb(void *data)
 
    rsd->on_delete_icon = EINA_FALSE;
    rsd->drag_done = EINA_FALSE;
-
+   //ONEUI1.5 (20180612) : Support gesture UX
    elm_gesture_layer_cb_del(rsd->gesture_layer, ELM_GESTURE_N_FLICKS,
                              ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd);
-
+   //
    _image_create_icon(rsd);
 
    rsd->longpress_timer = NULL;
-
+   //ONEUI1.5(20180612): Edit mode screen reader support
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+     {
+        elm_atspi_bridge_utils_say(_("WDS_ACCS_TBBODY_DRAG_ITEM_TO_REORDER"), EINA_FALSE, NULL, NULL);
+     }
+   //
    return ECORE_CALLBACK_CANCEL;
 }
 
@@ -958,7 +1138,7 @@ _event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf
    rsd->drag_pos_y = -1;
    if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
      {
-        INF("animator is running!!");
+        LOGI("animator is running!!");
         return;
      }
    rsd->pressed = EINA_TRUE;
@@ -968,7 +1148,7 @@ _event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf
      {
         double angle = _mouse_event_angle_get(ev->canvas.x, ev->canvas.y);
 #if _ROTARY_SELECTOR_DEBUG_ENABLED
-        INF("OUTSIDE OF SELECTOR : angle : %f", angle);
+        LOGI("OUTSIDE OF SELECTOR : angle : %f", angle);
 #endif
 
         int new_index = 0;
@@ -1039,7 +1219,9 @@ _event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf
                        if (!rsd->add_enabled || (new_index != add_idx))
                          {
                             rsd->drag_item_index = new_index;
+                            //ONEUI1.5(20180622): Sometimes _dnd_pos is not called
                             rsd->drop_item_index = new_index;
+                            //
                             rsd->longpress_timer = ecore_timer_add(rsd->item_longpress_move_delay_time,
                                                                    _item_longpress_cb, rsd);
                          }
@@ -1050,7 +1232,7 @@ _event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf
                     }
                }
 #if _ROTARY_SELECTOR_DEBUG_ENABLED
-             INF("pressed_item_index : %d", rsd->pressed_item_index);
+             LOGI("pressed_item_index : %d", rsd->pressed_item_index);
 #endif
           }
      }
@@ -1059,8 +1241,6 @@ _event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf
 static void
 _event_area_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
-   const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
-   const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
    Evas_Event_Mouse_Move *ev = event_info;
    Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
 
@@ -1114,13 +1294,12 @@ _event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
         rsd->touched_item_changed = EINA_FALSE;
         rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
         _dnd_end(rsd);
-        _drag_done(rsd);
         return;
      }
 
    if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
      {
-        INF("animator is running!!");
+        LOGI("animator is running!!");
         return;
      }
    if (!rsd->pressed)
@@ -1136,13 +1315,14 @@ _event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
              rsd->touched_item_changed = EINA_FALSE;
              rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
              rsd->pressed = EINA_FALSE;
+             rsd->entering_edit_mode = EINA_FALSE;
 
              return;
           }
 
         double angle = _mouse_event_angle_get(ev->canvas.x, ev->canvas.y);
 #if _ROTARY_SELECTOR_DEBUG_ENABLED
-        INF("OUTSIDE OF SELECTOR : angle : %f", angle);
+        LOGI("OUTSIDE OF SELECTOR : angle : %f", angle);
 #endif
 
         int new_index = 0;
@@ -1200,36 +1380,45 @@ _event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
                   int add_idx = eina_list_count(rsd->item_list) - 1;
                   if (rsd->editing)
                     {
-                       if (rsd->on_delete_icon)
+                       if (!rsd->entering_edit_mode)
                          {
-                            Eina_Bool still_on = _delete_icon_mouse_on_check(rsd, new_index, ev->canvas.x, ev->canvas.y);
-                            if (still_on)
+                            if (rsd->on_delete_icon)
                               {
-                                 Eext_Rotary_Selector_Item *it = NULL;
-                                 it = eina_list_nth(rsd->item_list, new_index);
-                                 _delete_item(rsd, it);
+                                 Eina_Bool still_on = _delete_icon_mouse_on_check(rsd, new_index, ev->canvas.x, ev->canvas.y);
+                                 if (still_on)
+                                   {
+                                      Eext_Rotary_Selector_Item *it = NULL;
+                                      it = eina_list_nth(rsd->item_list, new_index);
+                                      _delete_item(rsd, it);
+                                   }
                               }
-                         }
-                       else if (!rsd->add_enabled || (new_index != add_idx))
-                         {
-                            Eext_Rotary_Selector_Item *it = NULL;
-                            it = eina_list_nth(rsd->item_list, new_index);
-                            if (it->delete_enabled)
+                            else if (rsd->add_enabled && (new_index == add_idx))
                               {
-                                 _delete_item(rsd, it);
+                                 if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
+                                   {
+                                      _editing_mode_turnoff(rsd);
+                                      evas_object_smart_callback_call(rsd->rotary_selector,
+                                                                   "add_item,clicked", NULL);
+                                      _item_touched_signal_send(rsd, add_idx, EINA_FALSE, EINA_TRUE);
+                                   }
+                                 else
+                                   {
+                                      _item_touched_signal_send(rsd, add_idx, EINA_FALSE, EINA_FALSE);
+                                   }
+                                 //
                               }
                          }
-                       else if (rsd->add_enabled && (new_index == add_idx))
-                         {
-                            _editing_mode_turnoff(rsd);
-                            evas_object_smart_callback_call(rsd->rotary_selector,
-                                                            "add_item,clicked", NULL);
-                            _item_touched_signal_send(rsd, add_idx, EINA_FALSE, EINA_TRUE);
-                         }
                     }
-                  else
+                  else  if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
                     {
                        _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_TRUE);
+                       //ONEUI1.5(19Jun2019): Enable sw/hw bezel
+                       Eina_Bool send_clicked = EINA_FALSE;
+                       if (!eext_rotary_event_is_enabled())
+                         {
+                            send_clicked = rsd->selected_index == new_index ? EINA_TRUE : EINA_FALSE;
+                         }
+                       //
                        rsd->selected_index = new_index;
                        _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
                        _selector_update(rsd, EINA_FALSE, EINA_FALSE, EINA_FALSE);
@@ -1237,20 +1426,61 @@ _event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
                        if (rsd->add_enabled && (new_index == add_idx))
                          {
                             evas_object_smart_callback_call(rsd->rotary_selector,
-                                                            "add_item,clicked", NULL);
+                                                         "add_item,clicked", NULL);
                          }
                        else
                          {
-                            evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
+                           //ONEUI1.5(19Jun2019): Enable sw/hw bezel
+                            if (!eext_rotary_event_is_enabled())
+                              {
+                                 if (send_clicked)
+                                   {
+                                      evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
+                                   }
+                                 else
+                                   {
+                                       evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+                                   }
+                              }
+                            else
+                              {
+                                 evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
+                              }
+                            //
                          }
                     }
+                  //ONEUI1.5(25Sept2019): Fix touch cancel for s/w bezel
+                  else
+                    {
+                       _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
+                    }
+                  //
                }
           }
      }
-
+   //ONEUI1.5(20180620):Release pressed delete icon
+   if (rsd->pressed_item_index != _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID)
+     {
+        Eext_Rotary_Selector_Item *it = NULL;
+        it = eina_list_nth(rsd->item_list, rsd->pressed_item_index);
+        if (it != NULL)
+          {
+             if (it->delete_enabled && rsd->editing)
+               {
+                  char style[ITEM_SIGNAL_BUF_SIZE]="elm,selector,delete,r";
+                  int style_number = rsd->pressed_item_index % _ROTARY_SELECTOR_PAGE_ITEM_MAX;
+                  //ONEUI1.5(20181224): SVACE #3665 fix
+                  strncat(style, stylenumber[style_number], 3);
+                  //
+                  elm_object_signal_emit(it->base.obj, style, "elm");
+               }
+          }
+     }
+   //
    rsd->pressed = EINA_FALSE;
    rsd->touched_item_changed = EINA_FALSE;
    rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+   rsd->entering_edit_mode = EINA_FALSE;
 }
 
 static void
@@ -1271,7 +1501,7 @@ _event_area_mouse_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
 static void
 _event_area_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
-   INF("called!!");
+   LOGI("called!!");
 
    evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_DOWN, _event_area_mouse_down_cb);
    evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE, _event_area_mouse_move_cb);
@@ -1282,7 +1512,7 @@ _event_area_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 static void
 _event_area_callback_add(Eext_Rotary_Selector_Data *rsd)
 {
-   INF("called!!");
+   LOGI("called!!");
 
    rsd->event_area = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(rsd->rotary_selector), "event_area");
 
@@ -1309,7 +1539,7 @@ _eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent)
    rsd = (Eext_Rotary_Selector_Data *)calloc(1, sizeof(Eext_Rotary_Selector_Data));
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return NULL;
      }
    rsd->parent = parent;
@@ -1335,17 +1565,21 @@ _eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent)
    rsd->selector_bg_image_color.pressed_color.set_flag = EINA_FALSE;
    rsd->pressed = EINA_FALSE;
    rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+   //ONEUI1.5 (20180625): Init drop_item_index
    rsd->drop_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+   //
    rsd->touched_item_changed = EINA_FALSE;
    rsd->acceleration = EINA_FALSE;
    rsd->edit_mode_enabled = EINA_FALSE;
    rsd->editing = EINA_FALSE;
+   //ONEUI1.5 (20180611) : Hide delete icon while dnd
    rsd->drag_done = EINA_TRUE;
+   //
 
    radius = edje_object_data_get(elm_layout_edje_get(obj), "radius");
    if (!radius)
      {
-        ERR("radius is NULL!!");
+        LOGE("radius is NULL!!");
         free(rsd);
         return NULL;
      }
@@ -1354,7 +1588,7 @@ _eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent)
    item_width = edje_object_data_get(elm_layout_edje_get(obj), "item_width");
    if (!item_width)
      {
-        ERR("item_width is NULL!!");
+        LOGE("item_width is NULL!!");
         free(rsd);
         return NULL;
      }
@@ -1363,7 +1597,7 @@ _eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent)
    item_height = edje_object_data_get(elm_layout_edje_get(obj), "item_height");
    if (!item_height)
      {
-        ERR("item_height is NULL!!");
+        LOGE("item_height is NULL!!");
         free(rsd);
         return NULL;
      }
@@ -1372,25 +1606,27 @@ _eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent)
    data = edje_object_data_get(elm_layout_edje_get(obj), "delete_icon_width");
    if (!data)
      {
-        ERR("item's delete_icon_width is NULL!");
+        LOGE("item's delete_icon_width is NULL!");
         free(rsd);
         return NULL;
      }
-   rsd->delete_icon_width = (Evas_Coord)atoi(data);
-
+   //ONEUI1.5(20180620):Size up for delete icon touch detection
+   rsd->delete_icon_width = (Evas_Coord)atoi(data) + 10;
+   //
    data = edje_object_data_get(elm_layout_edje_get(obj), "delete_icon_height");
    if (!data)
      {
-        ERR("item's delete_icon_height is NULL!");
+        LOGE("item's delete_icon_height is NULL!");
         free(rsd);
         return NULL;
      }
-   rsd->delete_icon_height = (Evas_Coord)atoi(data);
-
+   //ONEUI1.5(20180620):Size up for delete icon touch detection
+   rsd->delete_icon_height = (Evas_Coord)atoi(data) + 10;
+   //
    data = edje_object_data_get(elm_layout_edje_get(obj), "page_item_width");
    if (!data)
      {
-        ERR("item's page_item_width is NULL!");
+        LOGE("item's page_item_width is NULL!");
         free(rsd);
         return NULL;
      }
@@ -1399,14 +1635,14 @@ _eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent)
    data = edje_object_data_get(elm_layout_edje_get(obj), "page_item_height");
    if (!data)
      {
-        ERR("item's page_item_height is NULL!");
+        LOGE("item's page_item_height is NULL!");
         free(rsd);
         return NULL;
      }
    rsd->page_item_height = (Evas_Coord)atoi(data);
    rsd->rotary_event_time_stamp = 0.0;
 
-   INF("rsd is initialized!!");
+   LOGI("rsd is initialized!!");
 
    return rsd;
 }
@@ -1416,7 +1652,7 @@ _eext_rotary_selector_data_get(const Evas_Object *rotary_selector)
 {
    if (!rotary_selector)
      {
-        ERR("rotary_selector is NULL!!");
+        LOGE("rotary_selector is NULL!!");
         return NULL;
      }
 
@@ -1452,7 +1688,7 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info
 
    if (rsd->acceleration)
      {
-        INF("rotary acceleration!!");
+        LOGI("rotary acceleration!!");
         return EINA_FALSE;
      }
 
@@ -1524,10 +1760,25 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info
                   if (elm_atspi_bridge_utils_is_screen_reader_enabled() && rsd->is_first_rotary_control)
                     {
                        rsd->is_first_rotary_control = EINA_FALSE;
+                       rsd->rot_highlighted = EINA_FALSE;
+                       //ONEUI1.5(20180702): Sync item index when page transition, on edit mode, rotary selector
+                       if (rsd->selected_index % (_ROTARY_SELECTOR_PAGE_ITEM_MAX) == 0 )
+                         {
+                            rsd->selected_index = first_index;
+                         }
+                       else if(rsd->selected_index % (_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1) == 0 )
+                         {
+                            rsd->selected_index = last_index;
+                         }
+                       //
                     }
                   else
                     {
-                       rsd->selected_index += 1;
+                       //ONEUI1.5(20180705):Manage selected_index as rotary highlighted
+                       if (!rsd->rot_highlighted)
+                         rsd->selected_index += 1;
+                       else rsd->rot_highlighted = EINA_FALSE;
+                       //
                     }
                }
              else
@@ -1542,13 +1793,11 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info
                   //for accessibility
                   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
                     {
-                       Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
-                       if (_item)
-                         {
-                            rsd->accessible_need_highlight_obj = _item->base.obj;
-                         }
+                       //ONEUI1.5(20180702): Sync item index when page transition, on edit mode, rotary selector
+                       //rsd->selected_index = previous_item_index;
+                       rsd->is_first_rotary_control = EINA_TRUE;
+                       //
                     }
-                  //
                   else
                     {
                        evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
@@ -1578,7 +1827,7 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info
         //for accessibility
         else if (elm_atspi_bridge_utils_is_screen_reader_enabled() && (rsd->selected_index == 0 && rsd->item_count == 1))
           {
-             if (rsd->is_first_rotary_control)
+             if (rsd->is_first_rotary_control || rsd->rot_highlighted)
                {
                   rsd->is_first_rotary_control = EINA_FALSE;
                   Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
@@ -1588,6 +1837,12 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info
                        rsd->accessible_need_highlight_obj = NULL;
                     }
                }
+             //ONEUI1.5(20180702): Do end effect when selected_index = 0
+             else
+               {
+                  _end_effect_animation_run(rsd, EINA_TRUE);
+               }
+             //
           }
         //
         else
@@ -1618,10 +1873,25 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info
                   if (elm_atspi_bridge_utils_is_screen_reader_enabled() && rsd->is_first_rotary_control)
                     {
                        rsd->is_first_rotary_control = EINA_FALSE;
+                       rsd->rot_highlighted = EINA_FALSE;
+                       //ONEUI1.5(20180702): Sync item index when page transition, on edit mode, rotary selector
+                       if (rsd->selected_index % (_ROTARY_SELECTOR_PAGE_ITEM_MAX) == 0 )
+                         {
+                            rsd->selected_index = first_index;
+                         }
+                       else if(rsd->selected_index % (_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1) == 0 )
+                         {
+                            rsd->selected_index = last_index;
+                         }
+                       //
                     }
                   else
                     {
-                       rsd->selected_index -= 1;
+                       //ONEUI1.5(20180705):Manage selected_index as rotary highlighted
+                       if (!rsd->rot_highlighted)
+                         rsd->selected_index -= 1;
+                       else rsd->rot_highlighted = EINA_FALSE;
+                       //
                     }
                }
              else
@@ -1636,11 +1906,10 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info
                   //for accessibility
                   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
                     {
-                       Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
-                       if (_item)
-                         {
-                            rsd->accessible_need_highlight_obj = _item->base.obj;
-                         }
+                       //ONEUI1.5(20180702): Sync item index when page transition, on edit mode, rotary selector
+                       //rsd->selected_index = previous_item_index;
+                       rsd->is_first_rotary_control = EINA_TRUE;
+                       //
                     }
                   //
                   else
@@ -1671,9 +1940,10 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info
         //for accessibility
         else if (elm_atspi_bridge_utils_is_screen_reader_enabled() && rsd->selected_index == 0)
           {
-             if (rsd->is_first_rotary_control)
+             if (rsd->is_first_rotary_control || rsd->rot_highlighted)
                {
                   rsd->is_first_rotary_control = EINA_FALSE;
+                  rsd->rot_highlighted = EINA_FALSE;
                   Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
                   if (_item)
                     {
@@ -1681,14 +1951,18 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info
                        rsd->accessible_need_highlight_obj = NULL;
                     }
                }
+             //ONEUI1.5(20180702): Do end effect when selected_index = 0
+             else
+               {
+                  _end_effect_animation_run(rsd, EINA_FALSE);
+               }
+             //
           }
-        //
         else
           {
              _end_effect_animation_run(rsd, EINA_FALSE);
           }
      }
-
    return ECORE_CALLBACK_PASS_ON;
 }
 
@@ -1698,7 +1972,7 @@ _rotary_selector_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
    Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
 
@@ -1712,26 +1986,71 @@ _rotary_selector_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
    rsd = data;
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
-
+   //ONEUI1.5(20180614): Edit mode screen reader support
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+     elm_atspi_component_highlight_grab(obj);
+   //
    _item_select(rsd, rsd->selected_index);
 }
 
+//ONEUI1.5(20180614): Edit mode screen reader support
+static Eina_Bool _highlight_timer_cb(void *data)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+   if (!rsd) return ECORE_CALLBACK_CANCEL;
+   elm_atspi_component_highlight_grab(rsd->rotary_selector);
+   rsd->highlight_timer = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_grab_highlight_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+   if (!rsd) return;
+   if (!evas_object_visible_get(rsd->rotary_selector)) return;
+   if (rsd->highlight_timer) ecore_timer_del(rsd->highlight_timer);
+   rsd->highlight_timer = ecore_timer_add(0.5, _highlight_timer_cb, rsd);
+   evas_object_smart_callback_del(obj, "item,activated", _grab_highlight_cb);
+}
+
+static void
+_win_focus_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+   if (!rsd) return;
+   if (!evas_object_visible_get(rsd->rotary_selector)) return;
+   if (rsd->highlight_timer) ecore_timer_del(rsd->highlight_timer);
+   rsd->highlight_timer = ecore_timer_add(0.5, _highlight_timer_cb, rsd);
+}
+//
+
 static void
 _rotary_selector_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
    Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
 
    // accessibility
    evas_object_smart_callback_del(rsd->rotary_selector, "atspi,screen,reader,changed", _rotary_selector_screen_reader_changed);
    evas_object_smart_callback_del(rsd->rotary_selector, "more,option,opened", _rotary_selector_moreoption_opened_cb);
+   //ONEUI1.5(20180614): Edit mode screen reader support
+   Evas_Object *widget = elm_object_parent_widget_get(obj);
+   if (widget && !strcmp(evas_object_type_get(widget), "elm_naviframe"))
+     evas_object_smart_callback_del(widget, "item,activated", _grab_highlight_cb);
+   if (rsd->highlight_timer)
+     {
+        ecore_timer_del(rsd->highlight_timer);
+        rsd->highlight_timer = NULL;
+     }
+   evas_object_smart_callback_del(elm_object_top_widget_get(rsd->rotary_selector), "focused", _win_focus_cb);
    //
 
    if (rsd->item_list)
@@ -1766,7 +2085,6 @@ _rotary_selector_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
         ecore_animator_del(rsd->item_update_animator);
         rsd->item_update_animator = NULL;
      }
-
    if (rsd->editing_timer)
      {
         ecore_timer_del(rsd->editing_timer);
@@ -1821,6 +2139,9 @@ _rotary_selector_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
    evas_object_data_del(obj, EEXT_ROTARY_SELECTOR_DATA_KEY);
 
    free(rsd);
+   //ONEUI1.5(20180614): Edit mode screen reader support
+   rsd = NULL;
+   //
 }
 
 static void
@@ -1828,29 +2149,24 @@ _rotary_selector_item_delete_icon_show(Eext_Rotary_Selector_Data *rsd)
 {
    Eina_List *l = NULL;
    Eext_Rotary_Selector_Item *item;
-   int start_idx, i = 0, page;
 
    EINA_LIST_FOREACH(rsd->item_list, l, item)
      {
-        page = i / _ROTARY_SELECTOR_PAGE_ITEM_MAX;
-        start_idx = page * _ROTARY_SELECTOR_PAGE_ITEM_MAX;
         if (item->delete_enabled)
           {
-             if (item->index >= start_idx &&
-                 item->index < start_idx + _ROTARY_SELECTOR_PAGE_ITEM_MAX / 2 )
-               {
-                  elm_object_signal_emit(item->base.obj, "elm,selector,delete,left", "elm");
-               }
-             else
-               {
-                  elm_object_signal_emit(item->base.obj, "elm,selector,delete,right", "elm");
-               }
+             // ONEUI1.5(20180607) - v2.4 ROTARY SELECTOR UI
+             char style[ITEM_SIGNAL_BUF_SIZE]="elm,selector,delete,r";
+             int style_number = item->index % 11;
+             //ONEUI1.5(20181224): SVACE #3665 fix
+             strncat(style, stylenumber[style_number], 3);
+             //
+             elm_object_signal_emit(item->base.obj, style, "elm");
+             //
           }
         else
           {
              elm_object_signal_emit(item->base.obj, "elm,selector,delete,hide", "elm");
           }
-        i++;
      }
 }
 
@@ -1870,7 +2186,9 @@ static void
 _add_item_create(Eext_Rotary_Selector_Data *rsd)
 {
    if (rsd->add_item) return;
+   Eext_Rotary_Selector_Item *prev_item = NULL;
 
+   prev_item = eina_list_data_get(eina_list_last(rsd->item_list));
    Eext_Rotary_Selector_Item *add_item = _item_create(rsd, EEXT_ROTARY_SELECTOR_ADD_ITEM);
    if (!add_item)
      return;
@@ -1880,6 +2198,23 @@ _add_item_create(Eext_Rotary_Selector_Data *rsd)
    add_item->index = rsd->item_count;
    rsd->item_count++;
    rsd->add_item = add_item;
+
+   //ONEUI1.5(20180516) speak add_item main title when screen-reader
+   /* Accessibility */
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+     {
+        _accessibility_item_name_set(rsd, rsd->add_item);
+        _accessibility_item_chain_end_set(rsd);
+        if (prev_item)
+          {
+             _accessibility_rotary_selector_item_relationship_set(prev_item->base.obj, rsd->add_item->base.obj);
+          }
+        else
+          {
+             _accessibility_rotary_selector_item_relationship_set(rsd->rotary_selector, rsd->add_item->base.obj);//add item is the only item
+          }
+     }
+   //
 }
 
 static Eina_Bool
@@ -1891,22 +2226,26 @@ _editing_timer_cb(void *data)
    Eext_Rotary_Selector_Item *item;
 
    rsd->editing_timer = NULL;
-   //FIXME: translate text Editing
+
    elm_object_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"),
-                            "selector,main_text", "Editing");
+                            "selector,main_text", _("WDS_TPLATFORM_TMBODY_EDIT_MODE_ABB"));
    elm_object_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"),
                             "selector,sub_text", "");
    elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"),
                           "text1,show", "eext");
    evas_object_smart_callback_call(rsd->rotary_selector, "editing,entered", NULL);
    rsd->editing = EINA_TRUE;
+   rsd->entering_edit_mode = EINA_TRUE;
+
 
    EINA_LIST_FOREACH(rsd->item_list, l, item)
      {
         elm_object_signal_emit(item->base.obj, "elm,action,button,unselected", "");
      }
 
+   //ONEUI1.5(20180618): Drag on first long press
    if (rsd->drag_pos_x == -1 && rsd->drag_pos_y == -1)
+   //
      _rotary_selector_item_delete_icon_show(rsd);
    else
      {
@@ -1915,10 +2254,16 @@ _editing_timer_cb(void *data)
         add_idx = eina_list_count(rsd->item_list) - 1;
         if (!rsd->add_enabled || (rsd->pressed_item_index != add_idx))
           {
-             rsd->drag_item_index = rsd->pressed_item_index;
-             _item_longpress_cb(rsd);
+             //ONEUI1.5(20180703): instant dnd when only normal mode
+             if (!elm_atspi_bridge_utils_is_screen_reader_enabled())
+             //
+               {
+                  rsd->drag_item_index = rsd->pressed_item_index;
+                  _item_longpress_cb(rsd);
+               }
           }
      }
+   //
    _items_invalidate(rsd);
    bg = elm_object_part_content_get(rsd->rotary_selector, "selector,bg_image");
    elm_object_signal_emit(bg, "elm,selector,bg,hide", "elm");
@@ -1926,6 +2271,22 @@ _editing_timer_cb(void *data)
 
    eext_object_event_callback_add(rsd->rotary_selector, EEXT_CALLBACK_BACK,
                                   _back_event_cb, rsd);
+   //ONEUI1.5(20180611): Edit mode screen reader support
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+     {
+        char buf[4056];
+        char buf_page[255];
+        int max_page = ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX) + 1;
+        int min_page = rsd->current_page + 1;
+        char *str = _("WDS_TPLATFORM_TMBODY_EDIT_MODE_ABB");
+        char *str1 = _("WDS_ACCS_TBBODY_DOUBLE_TAP_TO_REMOVE_OR_DOUBLE_TAP_AND_HOLD_TO_REORDER_ITEMS");
+        snprintf(buf, sizeof(buf)-1, "%s, %s ", str, str1);
+        str = _("WDS_ACCS_TBOPT_PAGE_P1SD_OF_P2SD");
+        snprintf(buf_page, sizeof(buf_page)-1, str, min_page, max_page);
+        strncat(buf, buf_page, sizeof(buf) - strlen(buf) - 1);
+        elm_atspi_bridge_utils_say(buf, EINA_TRUE, NULL, NULL);
+     }
+   //
    return ECORE_CALLBACK_CANCEL;
 }
 
@@ -2035,19 +2396,19 @@ _eext_rotary_selector_color_class_parent_set(Evas_Object *obj, Evas_Object *pare
 
    if (!obj || !parent) return;
 
-   if (efl_isa(obj, EFL_UI_LAYOUT_CLASS))
+   if (efl_isa(obj,    EFL_UI_LAYOUT_CLASS))
      edje =  elm_layout_edje_get(obj);
    else if (efl_isa(obj, EFL_CANVAS_LAYOUT_CLASS))
      edje = obj;
 
-   if (efl_isa(parent, EFL_UI_LAYOUT_CLASS))
+   if (efl_isa(parent,         EFL_UI_LAYOUT_CLASS))
      parent_edje =  elm_layout_edje_get(parent);
    else if (efl_isa(parent, EFL_CANVAS_LAYOUT_CLASS))
      parent_edje = parent;
 
    if (!edje || !parent_edje)
      {
-        ERR("There is a missing edje to have color class relationship... edje[%p], parent_edje[%p]", edje, parent_edje);
+        LOGE("There is a missing edje to have color class relationship... edje[%p], parent_edje[%p]", edje, parent_edje);
         return;
      }
 
@@ -2067,7 +2428,7 @@ _item_coords_update(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *i
    Evas_Coord x, y, w, h;
    evas_object_geometry_get(item->base.obj, &x, &y, &w, &h);
 
-   INF("item(0x%x), index(%d), x(%f), y(%f)", item, item->index, coords->x, coords->y);
+   LOGI("item(0x%x), index(%d), x(%f), y(%f)", item, item->index, coords->x, coords->y);
 #endif
 }
 
@@ -2115,12 +2476,17 @@ _items_invalidate(Eext_Rotary_Selector_Data *rsd)
 
         if (i >= first_index && i <= last_index)
           {
+             //ONEUI1.5(20180611) : Hide delete icon while editing mode dnd
              if (rsd->editing && item->delete_enabled && rsd->drag_done)
                {
-                  if (item->index < first_index + _ROTARY_SELECTOR_PAGE_ITEM_MAX / 2)
-                    elm_object_signal_emit(button, "elm,selector,delete,left", "elm");
-                  else
-                    elm_object_signal_emit(button, "elm,selector,delete,right", "elm");
+                  // ONEUI1.5(20180607) - v2.4 ROTARY SELECTOR UI
+                  char style[ITEM_SIGNAL_BUF_SIZE]="elm,selector,delete,r";
+                  int style_number = item->index % _ROTARY_SELECTOR_PAGE_ITEM_MAX;
+                  //ONEUI1.5(20181224): SVACE #3665 fix
+                  strncat(style, stylenumber[style_number], 3);
+                  //
+                  elm_object_signal_emit(button, style, "elm");
+                  //
                }
              else
                {
@@ -2133,15 +2499,29 @@ _items_invalidate(Eext_Rotary_Selector_Data *rsd)
              evas_object_raise(button);
              evas_object_show(button);
 #if _ROTARY_SELECTOR_DEBUG_ENABLED
-             INF("obj : 0x%x show index : %d x:%f y:%f", item->base.obj, item->index, x + item->coords.x, y + item->coords.y);
+             LOGI("obj : 0x%x show index : %d x:%f y:%f", item->base.obj, item->index, x + item->coords.x, y + item->coords.y);
 #endif
           }
         else
           {
-             elm_object_signal_emit(button, "elm,selector,delete,hide", "elm");
+              //ONEUI1.5 (20180611) : Don't hide delete badge of other page while editing mode
+              if (rsd->editing && !rsd->drag_done)
+                {
+                   elm_object_signal_emit(button, "elm,selector,delete,hide", "elm");
+                }
+              else if (rsd->editing && item->delete_enabled && rsd->drag_done)
+                {
+                   char style[ITEM_SIGNAL_BUF_SIZE]="elm,selector,delete,r";
+                   int style_number = item->index % _ROTARY_SELECTOR_PAGE_ITEM_MAX;
+                   //ONEUI1.5(20181224): SVACE #3665 fix
+                   strncat(style, stylenumber[style_number], 3);
+                   //
+                   elm_object_signal_emit(button, style, "elm");
+                }
+              //
              evas_object_hide(button);
 #if _ROTARY_SELECTOR_DEBUG_ENABLED
-             INF("obj : 0x%x hide index : %d", item->base.obj, item->index);
+             LOGI("obj : 0x%x hide index : %d", item->base.obj, item->index);
 #endif
           }
         i++;
@@ -2150,7 +2530,7 @@ _items_invalidate(Eext_Rotary_Selector_Data *rsd)
    _layer_items_invalidate(rsd);
 
 #if _ROTARY_SELECTOR_DEBUG_ENABLED
-   INF("elapsed time(%f)", ecore_time_unix_get() - start_time);
+   LOGI("elapsed time(%f)", ecore_time_unix_get() - start_time);
 #endif
 }
 
@@ -2255,7 +2635,7 @@ _item_rearrange(Eext_Rotary_Selector_Data *rsd, int selected_index)
    rsd->selected_index = selected_index;
 
 #if _ROTARY_SELECTOR_DEBUG_ENABLED
-   INF("item is rearranged!! : item_count(%d)", rsd->item_count);
+   LOGI("item is rearranged!! : item_count(%d)", rsd->item_count);
 #endif
 }
 
@@ -2263,8 +2643,10 @@ static void
 _item_select(Eext_Rotary_Selector_Data *rsd, int index)
 {
 #if _ROTARY_SELECTOR_DEBUG_ENABLED
-   INF("item is selected!! : index(%d)", index);
+   LOGI("item is selected!! : index(%d)", index);
 #endif
+//ONEUI1.5(20170620): Add next/prev icons for product style.
+   _product_style_check(rsd);
    if (!rsd->editing)
      _item_selected_signal_send(rsd, rsd->selected_index, index);
    rsd->selected_index = index;
@@ -2317,11 +2699,10 @@ _item_create(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item_Type item
    button = elm_button_add(rotary_selector);
    if (!button)
     {
-       ERR("button is NULL!!");
+       LOGE("button is NULL!!");
        return NULL;
     }
 
-
    if (!elm_atspi_bridge_utils_is_screen_reader_enabled())
       evas_object_freeze_events_set(button, EINA_TRUE);
    evas_object_repeat_events_set(button, EINA_TRUE);
@@ -2354,16 +2735,19 @@ _item_create(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item_Type item
    item = (Eext_Rotary_Selector_Item *)calloc(1, sizeof(Eext_Rotary_Selector_Item));
    if (!item)
      {
-        ERR("item is NULL!!");
+        LOGE("item is NULL!!");
         return NULL;
      }
 
    //for accessibility
    if (elm_atspi_bridge_utils_is_screen_reader_enabled())
      {
-        evas_object_smart_callback_add(button, "clicked",_accessibility_item_btn_clicked_cb, (Eext_Rotary_Selector_Data*)rsd);
         evas_object_smart_callback_add(button, "atspi,highlighted", _accessibility_item_btn_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
-        elm_atspi_accessible_gesture_cb_set(button, _accessibility_item_gesutre_cb, (Eext_Rotary_Selector_Data*)rsd);
+        elm_atspi_accessible_gesture_cb_set(button, _accessibility_item_gesture_cb, (Eext_Rotary_Selector_Data*)rsd);
+        //ONEUI1.5(20180709): On double tap and hold, mouse down, up are sent in access mode
+        elm_object_signal_emit(button, "elm,action,access_on", "elm");
+        evas_object_smart_callback_add(button, "theme,changed", _accessibility_theme_changed_cb, (Eext_Rotary_Selector_Data*)rsd);
+        //
      }
    //
 
@@ -2397,6 +2781,66 @@ _item_create(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item_Type item
    return item;
 }
 
+//ONEUI1.5(20170620): Add next/prev icons for product style.
+static void
+_product_style_check(Eext_Rotary_Selector_Data *rsd)
+{
+   if (!rsd->checked_product_style)
+     {
+        Eext_Rotary_Selector_Item *item = eina_list_nth(rsd->item_list, 0);
+        if (!item) return;
+
+        if (evas_object_data_get(rsd->parent, "eext_more_option_data"))
+          {
+             if (!strcmp(elm_object_style_get(item->base.obj), "prod/more_option_item"))
+               {
+                  rsd->is_product_style = EINA_TRUE;
+               }
+          }
+         else
+          {
+             if (!strcmp(elm_object_style_get(item->base.obj), "prod/rotary_selector_item"))
+               {
+                  rsd->is_product_style = EINA_TRUE;
+               }
+          }
+
+        rsd->checked_product_style = EINA_TRUE;
+        if(rsd->is_product_style)
+          {
+             if (rsd->item_count > _ROTARY_SELECTOR_PAGE_ITEM_MAX)
+               {
+                  if (!rsd->next_icon && !rsd->prev_icon)
+                    {
+                       rsd->next_icon = _product_layer_icon_create(rsd, "next_icon");
+                       rsd->prev_icon = _product_layer_icon_create(rsd, "prev_icon");
+                    }
+               }
+          }
+     }
+}
+
+static Evas_Object*
+_product_layer_icon_create(Eext_Rotary_Selector_Data *rsd, const char* style)
+{
+   Evas_Object *layout = elm_layout_add(rsd->rotary_selector);
+   if (!layout)
+     {
+        LOGE("layout is NULL!!");
+        return NULL;
+     }
+
+   elm_layout_theme_set(layout, "rotary_selector", "prod_item", style);
+   evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND,EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+   evas_object_move(layout, -_ROTARY_SELECTOR_SCREEN_WIDTH, -_ROTARY_SELECTOR_SCREEN_HEIGHT);
+   evas_object_resize(layout, rsd->item_width, rsd->item_height);
+   evas_object_smart_member_add(layout, rsd->rotary_selector);
+   evas_object_repeat_events_set(layout, EINA_TRUE);
+
+   return layout;
+}
 
 static void
 _item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_index, int current_item_index)
@@ -2411,7 +2855,7 @@ _item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_ind
           {
              elm_object_signal_emit(item->base.obj, "elm,action,button,unselected", "");
 #if _ROTARY_SELECTOR_DEBUG_ENABLED
-             INF("item is unselected!! : index(%d)", previous_item_index);
+             LOGI("item is unselected!! : index(%d)", previous_item_index);
 #endif
           }
         if ((current_item_index != -1) &&
@@ -2420,7 +2864,7 @@ _item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_ind
           {
              elm_object_signal_emit(item->base.obj, "elm,action,button,selected", "");
 #if _ROTARY_SELECTOR_DEBUG_ENABLED
-             INF("item is selected!! : index(%d)", current_item_index);
+             LOGI("item is selected!! : index(%d)", current_item_index);
 #endif
           }
         i++;
@@ -2485,7 +2929,7 @@ _item_text_copy(char **target, const char* source)
    *target = malloc(sizeof(char)*size);
    if (!(*target))
    {
-      ERR("allocation is failed!!");
+      LOGE("allocation is failed!!");
       return;
    }
    memset(*target, 0, size);
@@ -2644,8 +3088,21 @@ _item_update_animator_cb(void *data)
 
    rsd->item_update_animator = NULL;
 
+//ONEUI1.5(20170620): Add next/prev icons for product style.
+   if(rsd->is_product_style)
+     {
+        if (rsd->item_count <= _ROTARY_SELECTOR_PAGE_ITEM_MAX)
+          {
+             if (rsd->next_icon && rsd->prev_icon)
+               {
+                  evas_object_color_set(rsd->next_icon, 0, 0, 0, 0);
+                  evas_object_color_set(rsd->prev_icon, 0, 0, 0, 0);
+               }
+          }
+     }
+
 #if _ROTARY_SELECTOR_DEBUG_ENABLED
-   INF("item_list(0x%d), count(%d)", rsd->item_list, rsd->item_count);
+   LOGI("item_list(0x%d), count(%d)", rsd->item_list, rsd->item_count);
 #endif
 
    return ECORE_CALLBACK_CANCEL;
@@ -2669,6 +3126,7 @@ _page_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction)
    msg->count = 1;
    msg->val[0] = 1;
    edje_object_message_send(elm_layout_edje_get(rsd->rotary_selector), EDJE_MESSAGE_FLOAT_SET, 0, msg);
+   free(msg);
 
    rsd->page_anim_on_going = EINA_TRUE;
    rsd->previous_page_animator_start_time = ecore_loop_time_get();
@@ -2699,7 +3157,7 @@ _item_update_animation_run(Eext_Rotary_Selector_Data *rsd)
    if (rsd->item_update_animator)
      {
 #if _ROTARY_SELECTOR_DEBUG_ENABLED
-        INF("item update animator is already running!!");
+        LOGI("item update animator is already running!!");
 #endif
         return;
      }
@@ -2833,14 +3291,34 @@ _next_page_animator_cb(void *data)
         if (rsd->animation_direction)
           {
              rsd->current_page += 1;
+             //ONEUI1.5(20180706):More safety for page transition
+             if (rsd->current_page > ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX))
+               {
+                  rsd->current_page -= 1;
+                  rsd->next_page_animator_start_time = 0.0f;
+                  rsd->next_page_animator = NULL;
+                  rsd->page_anim_on_going = EINA_FALSE;
+                  return ECORE_CALLBACK_CANCEL;
+               }
+             //
              _items_invalidate(rsd);
           }
         else //Backward
           {
              rsd->current_page -= 1;
+             //ONEUI1.5(20180706):More safety for page transition
+             if (rsd->current_page < 0)
+               {
+                  rsd->current_page = 0;
+                  rsd->next_page_animator_start_time = 0.0f;
+                  rsd->next_page_animator = NULL;
+                  rsd->page_anim_on_going = EINA_FALSE;
+                  return ECORE_CALLBACK_CANCEL;
+               }
+             //
              _items_invalidate(rsd);
           }
-
+        //ONEUI1.5 (20180608) : When item dnd happend to other page
         if (rsd->editing)
            {
              int page_selected_index = rsd->selected_index % _ROTARY_SELECTOR_PAGE_ITEM_MAX;
@@ -2854,18 +3332,26 @@ _next_page_animator_cb(void *data)
              rsd->selected_index = next_selected_index;
              _item_select(rsd, rsd->selected_index);
           }
-
+       //
         rsd->next_page_animator_start_time = 0.0f;
         rsd->next_page_animator = NULL;
 
         /* Accessibility */
         if (elm_atspi_bridge_utils_is_screen_reader_enabled())
           {
-             if (rsd->accessible_need_highlight_obj)
+             rsd->rot_highlighted = EINA_FALSE;
+             if (!rsd->highlighted)
+               elm_atspi_component_highlight_grab(rsd->rotary_selector);
+             else
                {
-                  elm_atspi_component_highlight_grab(rsd->accessible_need_highlight_obj);
-                  rsd->accessible_need_highlight_obj = NULL;
+                  char buf_page[255];
+                  int max_page = ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX) + 1;
+                  int min_page = rsd->current_page + 1;
+                  char *str = _("WDS_ACCS_TBOPT_PAGE_P1SD_OF_P2SD");
+                  snprintf(buf_page, sizeof(buf_page)-1, str, min_page, max_page);
+                  elm_atspi_bridge_utils_say(buf_page, EINA_TRUE, NULL, NULL);
                }
+             //
           }
         //
 
@@ -2911,7 +3397,7 @@ _end_effect_animator_cb(void *data)
    Evas_Object *selector = elm_object_part_content_get(rsd->rotary_selector, "selector,bg_image");
    if (!selector)
      {
-        ERR("selector is NULL!!");
+        LOGE("selector is NULL!!");
         return ECORE_CALLBACK_CANCEL;
      }
 
@@ -2919,7 +3405,7 @@ _end_effect_animator_cb(void *data)
    map = evas_map_new(4);
    if (!map)
      {
-        ERR("map is NULL!!");
+        LOGE("map is NULL!!");
         return ECORE_CALLBACK_CANCEL;
      }
 
@@ -2963,7 +3449,7 @@ _selector_update(Eext_Rotary_Selector_Data *rsd, Eina_Bool page_changed, Eina_Bo
    Evas_Object *edje = elm_layout_edje_get(rsd->rotary_selector);
    if (!edje)
      {
-        ERR("edje is NULL!!");
+        LOGE("edje is NULL!!");
         return;
      }
 
@@ -2986,7 +3472,14 @@ _selector_update(Eext_Rotary_Selector_Data *rsd, Eina_Bool page_changed, Eina_Bo
         if (is_anim)
           edje_object_signal_emit(edje, signals[rsd->selected_index % _ROTARY_SELECTOR_PAGE_ITEM_MAX], "eext");
         else
-          edje_object_signal_emit(edje, signals[rsd->selected_index % _ROTARY_SELECTOR_PAGE_ITEM_MAX], "noanim");
+          {
+             edje_object_signal_emit(edje, signals[rsd->selected_index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], "noanim");
+             if (rsd->acceleration)
+               {
+                  rsd->acceleration = EINA_FALSE;
+                  rsd->rotary_event_time_stamp = 0;
+               }
+          }
      }
 
    if (!rsd->editing)
@@ -3134,12 +3627,12 @@ _selector_content_update(Eext_Rotary_Selector_Data *rsd)
                     {
                        elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text1,show", "eext");
                     }
-
-                  /* Accessibility */
-                  if (elm_atspi_bridge_utils_is_screen_reader_enabled())
-                    _accessibility_item_name_set(rsd, item);
+                  //ONEUI1.5(20180515): Update selector,main_text for add_item
+                  if (item == rsd->add_item)
+                  {
+                     evas_object_smart_callback_call(rsd->rotary_selector, "add_item,selected", NULL);
+                  }
                   //
-
                }
           }
         i++;
@@ -3150,12 +3643,14 @@ _selector_content_update(Eext_Rotary_Selector_Data *rsd)
      }
    else if (rsd->selector_bg_hidden)
      {
+        //ONEUI1.5(20180719):Should not show selector on edit mode
         if (!rsd->editing)
           {
              Evas_Object *bg = elm_object_part_content_get(rsd->rotary_selector, "selector,bg_image");
              elm_object_signal_emit(bg, "elm,selector,bg,show", "elm");
              rsd->selector_bg_hidden = EINA_FALSE;
           }
+        //
      }
 
 }
@@ -3163,7 +3658,7 @@ _selector_content_update(Eext_Rotary_Selector_Data *rsd)
 static void
 _selector_clicked_signal(void *data, Evas_Object *obj, const char *emission, const char *source)
 {
-   INF("called!!");
+   LOGI("called!!");
 
    Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
    if (rsd && !rsd->editing)
@@ -3184,7 +3679,7 @@ _selector_clicked_signal(void *data, Evas_Object *obj, const char *emission, con
 static void
 _selector_animation_finished_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
 {
-   INF("called!!");
+   LOGI("called!!");
 
    Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
    if (rsd)
@@ -3197,7 +3692,132 @@ _selector_animation_finished_cb(void *data, Evas_Object *obj, const char *emissi
      }
 }
 
+//ONEUI1.5(20180614): Edit mode screen reader support
+static Eina_Bool
+_accessibility_gesture_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data*)data;
+   if (!rsd)
+     return EINA_FALSE;
+   if (rsd->previous_page_animator || rsd->next_page_animator)
+     return EINA_FALSE;
+
+   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+   int last_index = 0;
+   int previous_item_index = rsd->selected_index;
+   if (rsd->current_page == 0)
+     {
+        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+   else
+     {
+        last_index = (rsd->current_page + 1) * _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+   if (last_index > rsd->item_count - 1)
+     {
+        last_index = rsd->item_count - 1;
+     }
+
+   LOGI("Gesture_type = %d x_beg = %d, x_end=%d y_beg=%d y_end=%d",gesture_info.type,
+       gesture_info.x_beg, gesture_info.x_end, gesture_info.y_beg, gesture_info.y_end);
+
+   switch (gesture_info.type)
+     {
+        case ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_LEFT:
+          {
+             if (rsd->editing)
+               {
+                  Eext_Rotary_Selector_Item *_item = _item_get(rsd, last_index);
+                  if (_item)
+                    elm_atspi_component_highlight_grab(_item->base.obj);
+               }
+             else
+               {
+                  Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
+                  if (_item)
+                    {
+                       rsd->accessible_need_highlight_obj = _item->base.obj;
+                       elm_atspi_component_highlight_grab(rsd->accessible_need_highlight_obj);
+                       rsd->accessible_need_highlight_obj = NULL;
+                    }
+               }
+             return EINA_TRUE;
+          }
+        break;
+        case ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_RIGHT:
+          {
+             if (rsd->editing)
+               {
+                  Eext_Rotary_Selector_Item *_item = _item_get(rsd, first_index);
+                  if (_item)
+                    elm_atspi_component_highlight_grab(_item->base.obj);
+               }
+             else
+               {
+                  Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
+                  if (_item)
+                    {
+                       rsd->accessible_need_highlight_obj = _item->base.obj;
+                       elm_atspi_component_highlight_grab(rsd->accessible_need_highlight_obj);
+                       rsd->accessible_need_highlight_obj = NULL;
+                    }
+               }
+             return EINA_TRUE;
+          }
+        break;
+        case ELM_ATSPI_GESTURE_TWO_FINGERS_FLICK_RIGHT:
+           if (rsd->current_page > 0)
+             {
+                rsd->selected_index = first_index - 1;
+                _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+                _page_animation_run(rsd, EINA_FALSE);
+                _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE);
+                evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+                return EINA_TRUE;
+             }
+        break;
+        case ELM_ATSPI_GESTURE_TWO_FINGERS_FLICK_LEFT:
+           if (rsd->current_page < ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX))
+              {
+                 rsd->selected_index = last_index + 1;
+                 _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+                 _page_animation_run(rsd, EINA_TRUE);
+                 _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE);
+                 evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+                 return EINA_TRUE;
+              }
+        break;
+        //ONEUI1.5(20180704):Consume hover and tap event to avoid highlight while dnd
+        case ELM_ATSPI_GESTURE_ONE_FINGER_HOVER:
+           if (rsd->editing)
+             return EINA_TRUE;
+           break;
+        case ELM_ATSPI_GESTURE_ONE_FINGER_SINGLE_TAP:
+            if (rsd->editing && gesture_info.state == EFL_ACCESS_GESTURE_STATE_ABORT)
+              return EINA_TRUE;
+            break;
+        //
+        default:
+          break;
+     }
+   return EINA_FALSE;
+}
+
+static char *
+_accessibility_name_set_cb(void *data, Evas_Object *obj)
+{
+   char buf_page[255];
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+   int max_page = ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX) + 1;
+   int min_page = rsd->current_page + 1;
+   char *str = _("WDS_ACCS_TBOPT_PAGE_P1SD_OF_P2SD");
+   snprintf(buf_page, sizeof(buf_page)-1, str, min_page, max_page);
+   return strdup(buf_page);
+}
+//
+
 // ----------------------------------------- public API implementation --------------------------------------//
+
 EAPI Evas_Object *
 eext_rotary_selector_add(Evas_Object *parent)
 {
@@ -3208,7 +3828,7 @@ eext_rotary_selector_add(Evas_Object *parent)
    Evas_Object *rotary_selector = elm_layout_add(parent);
    if (!rotary_selector)
      {
-        ERR("rotary_selector is NULL!!");
+        LOGE("rotary_selector is NULL!!");
         return NULL;
      }
 
@@ -3221,16 +3841,18 @@ eext_rotary_selector_add(Evas_Object *parent)
    rsd = _eext_rotary_selector_data_init(rotary_selector, parent);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return NULL;
      }
 
    evas_object_data_set(rotary_selector, EEXT_ROTARY_SELECTOR_DATA_KEY, rsd);
 
+   //ONEUI1.5(20180608): Add gesture swipe support
    rsd->gesture_layer = elm_gesture_layer_add(rotary_selector);
    elm_gesture_layer_attach(rsd->gesture_layer, rotary_selector);
    elm_gesture_layer_cb_set(rsd->gesture_layer, ELM_GESTURE_N_FLICKS,
                             ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd);
+   //
 
    edje_object_signal_callback_add(elm_layout_edje_get(rsd->rotary_selector), "eext,clicked", "", _selector_clicked_signal, rsd);
    edje_object_signal_callback_add(elm_layout_edje_get(rsd->rotary_selector), "elm,anim,finished", "elm", _selector_animation_finished_cb, rsd);
@@ -3239,11 +3861,18 @@ eext_rotary_selector_add(Evas_Object *parent)
    Evas_Object *selector_bg = elm_layout_add(rotary_selector);
    if (!selector_bg)
      {
-        ERR("selector_bg is NULL!!");
+        LOGE("selector_bg is NULL!!");
         return NULL;
      }
 
-   elm_layout_theme_set(selector_bg, "rotary_selector", "selector", "selector_bg");
+   if (!evas_object_data_get(parent, "eext_more_option_data"))
+     {
+        elm_layout_theme_set(selector_bg, "rotary_selector", "selector", "selector_bg");
+     }
+   else
+     {
+        elm_layout_theme_set(selector_bg, "rotary_selector", "selector", "more_option");
+     }
    elm_object_part_content_set(rotary_selector, "selector,bg_image", selector_bg);
    _eext_rotary_selector_color_class_parent_set(selector_bg, rotary_selector);
 
@@ -3251,11 +3880,13 @@ eext_rotary_selector_add(Evas_Object *parent)
    Evas_Object *content = elm_layout_add(rotary_selector);
    if (!content)
      {
-        ERR("content is NULL!!");
+        LOGE("content is NULL!!");
         return NULL;
      }
-
-   elm_layout_theme_set(content, "rotary_selector", "content", "default");
+   if (!evas_object_data_get(parent, "eext_more_option_data"))
+     {
+        elm_layout_theme_set(content, "rotary_selector", "content", "default");
+     }
    elm_object_part_content_set(rotary_selector, "content", content);
    _eext_rotary_selector_color_class_parent_set(content, rotary_selector);
 
@@ -3284,8 +3915,27 @@ eext_rotary_selector_add(Evas_Object *parent)
      {
         evas_object_smart_callback_add(rotary_selector, "more,option,opened", _rotary_selector_moreoption_opened_cb, rsd);
         rsd->is_first_rotary_control = EINA_TRUE;
+        //ONEUI1.5(20180614): Edit mode screen reader support
+        elm_atspi_accessible_role_set(rotary_selector, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
+
+        if (!evas_object_data_get(parent, "eext_more_option_data"))
+          {
+             //elm_atspi_accessible_attribute_append(widget, "default_label", "disabled"); ->check why not working
+             if (!strcmp(evas_object_type_get(parent), "elm_naviframe"))
+               evas_object_smart_callback_add(parent, "item,activated", _grab_highlight_cb, rsd);
+             evas_object_smart_callback_add(elm_object_top_widget_get(rotary_selector), "focused", _win_focus_cb, rsd);
+              //
+          }
+        elm_atspi_accessible_gesture_cb_set(rotary_selector, _accessibility_gesture_cb, (Eext_Rotary_Selector_Data*)rsd);
+        elm_atspi_accessible_name_cb_set(rotary_selector, _accessibility_name_set_cb, (Eext_Rotary_Selector_Data*)rsd);
+        evas_object_smart_callback_add(rotary_selector, "atspi,highlighted", _accessibility_rotary_highlighted_cb, rsd);
+        evas_object_smart_callback_add(rotary_selector, "atspi,unhighlighted", _accessibility_rotary_unhighlighted_cb, rsd);
+        elm_atspi_accessible_reading_info_type_set(rotary_selector, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
+        elm_gesture_layer_cb_del(rsd->gesture_layer, ELM_GESTURE_N_FLICKS,
+                                  ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd);
      }
    //
+
    return rotary_selector;
 }
 
@@ -3300,14 +3950,14 @@ eext_rotary_selector_item_append(Evas_Object *obj)
    rsd = _eext_rotary_selector_data_get(rotary_selector);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return NULL;
      }
 
    item = _item_create(rsd, EEXT_ROTARY_SELECTOR_NORMAL_ITEM);
    if (!item)
      {
-        ERR("item is NULL!!");
+        LOGE("item is NULL!!");
         return NULL;
      }
 
@@ -3372,14 +4022,14 @@ eext_rotary_selector_item_prepend(Evas_Object *obj)
    rsd = _eext_rotary_selector_data_get(rotary_selector);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return NULL;
      }
 
    item = _item_create(rsd, EEXT_ROTARY_SELECTOR_NORMAL_ITEM);
    if (!item)
      {
-        ERR("item is NULL!!");
+        LOGE("item is NULL!!");
         return NULL;
      }
 
@@ -3437,21 +4087,21 @@ eext_rotary_selector_item_insert_after(Evas_Object *obj, Eext_Object_Item *after
 
    if (!after_item)
      {
-        ERR("after_item is NULL!!");
+        LOGE("after_item is NULL!!");
         return NULL;
      }
 
    rsd = _eext_rotary_selector_data_get(rotary_selector);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return NULL;
      }
 
    item = _item_create(rsd, EEXT_ROTARY_SELECTOR_NORMAL_ITEM);
    if (!item)
      {
-        ERR("item is NULL!!");
+        LOGE("item is NULL!!");
         return NULL;
      }
 
@@ -3526,21 +4176,21 @@ eext_rotary_selector_item_insert_before(Evas_Object *obj, Eext_Object_Item *befo
 
    if (!before_item)
      {
-        ERR("before_item is NULL!!");
+        LOGE("before_item is NULL!!");
         return NULL;
      }
 
    rsd = _eext_rotary_selector_data_get(rotary_selector);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return NULL;
      }
 
    item = _item_create(rsd, EEXT_ROTARY_SELECTOR_NORMAL_ITEM);
    if (!item)
      {
-        ERR("item is NULL!!");
+        LOGE("item is NULL!!");
         return NULL;
      }
 
@@ -3617,14 +4267,14 @@ eext_rotary_selector_item_del(Eext_Object_Item *item)
 
    if (!rotary_selector_item)
      {
-        ERR("rotary_selector_item is NULL!!");
+        LOGE("rotary_selector_item is NULL!!");
         return;
      }
 
    rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
 
@@ -3670,7 +4320,6 @@ eext_rotary_selector_item_del(Eext_Object_Item *item)
         else if (before_item && !after_item)
           elm_atspi_accessible_relationship_append(before_item->base.obj, ELM_ATSPI_RELATION_FLOWS_TO, before_item->base.obj);
 
-        evas_object_smart_callback_del(find_item->base.obj, "clicked",_accessibility_item_btn_clicked_cb);
         evas_object_smart_callback_del(find_item->base.obj, "atspi,highlighted", _accessibility_item_btn_highlighted_cb);
         elm_atspi_accessible_gesture_cb_set(find_item->base.obj, NULL, NULL);
      }
@@ -3704,14 +4353,14 @@ eext_rotary_selector_items_clear(Evas_Object *obj)
 
    if (!rotary_selector)
      {
-        ERR("rotary_selector is NULL!!");
+        LOGE("rotary_selector is NULL!!");
         return;
      }
 
    rsd = _eext_rotary_selector_data_get(rotary_selector);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
 
@@ -3725,8 +4374,9 @@ eext_rotary_selector_items_clear(Evas_Object *obj)
      }
 
    rsd->selected_index = 0;
+   //ONEUI1.5 (20180607) : Current page also have to init
    rsd->current_page = 0;
-
+   //
    _item_rearrange(rsd, rsd->selected_index);
    _items_transformation_update(rsd);
    _items_invalidate(rsd);
@@ -3742,17 +4392,17 @@ eext_rotary_selector_item_part_text_set(Eext_Object_Item *item, const char *part
 
    if (!rotary_selector_item)
      {
-        ERR("rotary_selector_item is NULL!!");
+        LOGE("rotary_selector_item is NULL!!");
         return;
      }
    if (!part_name)
      {
-        ERR("part_name is NULL!!");
+        LOGE("part_name is NULL!!");
         return;
      }
    if (!text)
      {
-        ERR("text is NULL!!");
+        LOGE("text is NULL!!");
         return;
      }
 
@@ -3760,7 +4410,7 @@ eext_rotary_selector_item_part_text_set(Eext_Object_Item *item, const char *part
    rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
 
@@ -3770,11 +4420,20 @@ eext_rotary_selector_item_part_text_set(Eext_Object_Item *item, const char *part
      }
    else if (!strcmp(part_name, "selector,sub_text"))
      {
+        //ONEUI1.5(20180726): Support accessibility for sub_text toggle item case
+        if (elm_atspi_bridge_utils_is_screen_reader_enabled() &&
+            rotary_selector_item->text2 != NULL &&
+            rotary_selector_item->base.obj == (Evas_Object *)elm_object_accessibility_currently_highlighted_get() &&
+            strcmp(rotary_selector_item->text2, text))
+          {
+             efl_access_state_changed_signal_emit(rotary_selector_item->base.obj, EFL_ACCESS_STATE_TYPE_HIGHLIGHTED, EINA_TRUE);
+          }
+        //
         _item_text_copy(&(rotary_selector_item->text2), text);
      }
    else
      {
-       ERR("Not supported part name [%s]", part_name);
+       LOGE("Not supported part name [%s]", part_name);
        return;
      }
 
@@ -3790,7 +4449,7 @@ eext_rotary_selector_item_part_text_get(const Eext_Object_Item *item, const char
 
    if (!rotary_selector_item)
      {
-        ERR("item is NULL!!");
+        LOGE("item is NULL!!");
         return NULL;
      }
    if (!strcmp(part_name, "selector,main_text"))
@@ -3812,22 +4471,22 @@ eext_rotary_selector_item_domain_translatable_part_text_set(Eext_Object_Item *it
 
    if (!rotary_selector_item)
      {
-        ERR("rotary_selector_item is NULL!!");
+        LOGE("rotary_selector_item is NULL!!");
         return;
      }
    if (!part_name)
      {
-        ERR("part_name is NULL!!");
+        LOGE("part_name is NULL!!");
         return;
      }
    if (!domain)
      {
-        ERR("domain is NULL!!");
+        LOGE("domain is NULL!!");
         return;
      }
    if (!text)
      {
-        ERR("text is NULL!!");
+        LOGE("text is NULL!!");
         return;
      }
 
@@ -3835,7 +4494,7 @@ eext_rotary_selector_item_domain_translatable_part_text_set(Eext_Object_Item *it
    rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
 
@@ -3846,12 +4505,21 @@ eext_rotary_selector_item_domain_translatable_part_text_set(Eext_Object_Item *it
      }
    else if (!strcmp(part_name, "selector,sub_text"))
      {
+        //ONEUI1.5(20180706): Support accessibility for sub_text toggle item case
+        if (elm_atspi_bridge_utils_is_screen_reader_enabled() &&
+            rotary_selector_item->text2 != NULL &&
+            rotary_selector_item->base.obj == (Evas_Object *)elm_object_accessibility_currently_highlighted_get() &&
+            strcmp(rotary_selector_item->text2, text))
+          {
+             efl_access_state_changed_signal_emit(rotary_selector_item->base.obj, EFL_ACCESS_STATE_TYPE_HIGHLIGHTED, EINA_TRUE);
+          }
+        //
         _item_text_copy(&(rotary_selector_item->domain), domain);
         _item_text_copy(&(rotary_selector_item->text2), text);
      }
    else
      {
-        ERR("Not supported part name [%s]", part_name);
+        LOGE("Not supported part name [%s]", part_name);
         return;
      }
 
@@ -3868,29 +4536,29 @@ eext_rotary_selector_item_part_content_set(Eext_Object_Item *item, const char *p
    Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
    if (!rotary_selector_item)
      {
-        ERR("rotary_selector_item is NULL!!");
+        LOGE("rotary_selector_item is NULL!!");
         return;
      }
    if (!part_name)
      {
-        ERR("part_name is NULL!!");
+        LOGE("part_name is NULL!!");
         return;
      }
    if (!content)
      {
-        ERR("content is NULL!!");
+        LOGE("content is NULL!!");
         return;
      }
    if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
      {
-        ERR("Not implemented!!");
+        LOGE("Not implemented!!");
         return;
      }
    Eext_Rotary_Selector_Data *rsd = NULL;
    rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
    // for Accessibility
@@ -3925,7 +4593,7 @@ eext_rotary_selector_item_part_content_set(Eext_Object_Item *item, const char *p
      }
    else
      {
-        ERR("Not supported part name!!");
+        LOGE("Not supported part name!!");
         return;
      }
 
@@ -3939,17 +4607,17 @@ eext_rotary_selector_item_part_content_get(const Eext_Object_Item *item, const c
 
    if (!rotary_selector_item)
      {
-        ERR("rotary_selector_item is NULL!!");
+        LOGE("rotary_selector_item is NULL!!");
         return NULL;
      }
    if (!part_name)
      {
-        ERR("part_name is NULL!!");
+        LOGE("part_name is NULL!!");
         return NULL;
      }
    if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
      {
-        ERR("Not implemented!!");
+        LOGE("Not implemented!!");
         return NULL;
      }
 
@@ -3967,7 +4635,7 @@ eext_rotary_selector_item_part_content_get(const Eext_Object_Item *item, const c
      }
    else
      {
-       ERR("Not supported part name!!");
+       LOGE("Not supported part name!!");
        return NULL;
      }
 
@@ -3981,29 +4649,29 @@ eext_rotary_selector_part_content_set(Evas_Object *obj, const char *part_name, E
 
    if (!obj)
      {
-        ERR("obj is NULL!!");
+        LOGE("obj is NULL!!");
         return;
      }
    if (!part_name)
      {
-        ERR("part_name is NULL!!");
+        LOGE("part_name is NULL!!");
         return;
      }
    if (!content)
      {
-        ERR("content is NULL!!");
+        LOGE("content is NULL!!");
         return;
      }
 
    if (strcmp(part_name, "selector,bg_image"))
    {
-      ERR("Not supported part name!!!");
+      LOGE("Not supported part name!!!");
       return;
    }
 
    if (state != EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
      {
-        ERR("Not implemented!!");
+        LOGE("Not implemented!!");
         return;
      }
 
@@ -4011,7 +4679,7 @@ eext_rotary_selector_part_content_set(Evas_Object *obj, const char *part_name, E
    rsd = _eext_rotary_selector_data_get(obj);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
 
@@ -4025,23 +4693,23 @@ eext_rotary_selector_part_content_get(const Evas_Object *obj, const char *part_n
    //Supported part names : "selector,bg_image"
    if (!obj)
      {
-        ERR("obj is NULL!!");
+        LOGE("obj is NULL!!");
         return NULL;
      }
    if (!part_name)
      {
-        ERR("part_name is NULL!!");
+        LOGE("part_name is NULL!!");
         return NULL;
      }
    if (strcmp(part_name, "selector,bg_image"))
      {
-        ERR("Not supported part name!!!");
+        LOGE("Not supported part name!!!");
         return NULL;
      }
 
    if (state != EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
      {
-        ERR("Not implemented!!");
+        LOGE("Not implemented!!");
         return NULL;
      }
 
@@ -4049,7 +4717,7 @@ eext_rotary_selector_part_content_get(const Evas_Object *obj, const char *part_n
    rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return NULL;
      }
 
@@ -4064,12 +4732,12 @@ eext_rotary_selector_item_part_color_set(Eext_Object_Item *item, const char *par
 
    if (!rotary_selector_item)
      {
-        ERR("rotary_selector_item is NULL!!");
+        LOGE("rotary_selector_item is NULL!!");
         return;
      }
    if (!part_name)
      {
-        ERR("part_name is NULL!!");
+        LOGE("part_name is NULL!!");
         return;
      }
 
@@ -4165,7 +4833,7 @@ eext_rotary_selector_item_part_color_set(Eext_Object_Item *item, const char *par
      }
    else
      {
-       ERR("Not supported part name [%s]", part_name);
+       LOGE("Not supported part name [%s]", part_name);
        return;
      }
 
@@ -4179,12 +4847,12 @@ eext_rotary_selector_item_part_color_get(const Eext_Object_Item *item, const cha
 
    if (!rotary_selector_item)
      {
-        ERR("rotary_selector_item is NULL!!");
+        LOGE("rotary_selector_item is NULL!!");
         return;
      }
    if (!part_name)
      {
-        ERR("part_name is NULL!!");
+        LOGE("part_name is NULL!!");
         return;
      }
 
@@ -4234,7 +4902,7 @@ eext_rotary_selector_item_part_color_get(const Eext_Object_Item *item, const cha
      }
    else
      {
-       ERR("Not supported part name [%s]", part_name);
+       LOGE("Not supported part name [%s]", part_name);
        return;
      }
 }
@@ -4248,12 +4916,12 @@ eext_rotary_selector_part_color_set(Evas_Object *obj, const char *part_name, Eex
 
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
    if (!part_name)
      {
-        ERR("part_name is NULL!!");
+        LOGE("part_name is NULL!!");
         return;
      }
 
@@ -4282,7 +4950,7 @@ eext_rotary_selector_part_color_set(Evas_Object *obj, const char *part_name, Eex
      }
    else
      {
-       ERR("Not supported part name [%s]", part_name);
+       LOGE("Not supported part name [%s]", part_name);
        return;
      }
 
@@ -4297,12 +4965,12 @@ eext_rotary_selector_part_color_get(const Evas_Object *obj, const char *part_nam
 
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
    if (!part_name)
      {
-        ERR("part_name is NULL!!");
+        LOGE("part_name is NULL!!");
         return;
      }
 
@@ -4320,7 +4988,7 @@ eext_rotary_selector_part_color_get(const Evas_Object *obj, const char *part_nam
      }
    else
      {
-       ERR("Not supported part name [%s]", part_name);
+       LOGE("Not supported part name [%s]", part_name);
        return;
      }
 }
@@ -4333,14 +5001,14 @@ eext_rotary_selector_selected_item_set(Evas_Object *obj, Eext_Object_Item *item)
 
    if (!rotary_selector_item)
      {
-        ERR("rotary_selector_item is NULL!!");
+        LOGE("rotary_selector_item is NULL!!");
         return;
      }
 
    rsd = _eext_rotary_selector_data_get(obj);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
    if (rsd->item_update_animator)
@@ -4358,7 +5026,7 @@ eext_rotary_selector_selected_item_set(Evas_Object *obj, Eext_Object_Item *item)
         _item_update_animation_run(rsd);
      }
 
-   INF("selected item index(%d)", rsd->selected_index);
+   LOGI("selected item index(%d)", rsd->selected_index);
 }
 
 EAPI Eext_Object_Item*
@@ -4367,7 +5035,7 @@ eext_rotary_selector_selected_item_get(const Evas_Object *obj)
    Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return NULL;
      }
 
@@ -4380,7 +5048,7 @@ eext_rotary_selector_items_get(const Evas_Object *obj)
    Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return NULL;
      }
 
@@ -4393,7 +5061,7 @@ eext_rotary_selector_editing_enabled_get(const Evas_Object *obj)
    Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(obj);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return EINA_FALSE;
      }
    return rsd->edit_mode_enabled;
@@ -4405,7 +5073,7 @@ eext_rotary_selector_editing_enabled_set(Evas_Object *obj, Eina_Bool enabled)
    Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(obj);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
    rsd->edit_mode_enabled = enabled;
@@ -4417,7 +5085,7 @@ eext_rotary_selector_add_item_enabled_get(const Evas_Object *obj)
    Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(obj);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return EINA_FALSE;
      }
    return rsd->add_enabled;
@@ -4429,7 +5097,7 @@ eext_rotary_selector_add_item_enabled_set(Evas_Object *obj, Eina_Bool enabled)
    Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(obj);
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
 
@@ -4460,7 +5128,7 @@ eext_rotary_selector_item_delete_enabled_get(const Eext_Object_Item *item)
 
    if (!rotary_selector_item)
      {
-        ERR("rotary_selector_item is NULL!!");
+        LOGE("rotary_selector_item is NULL!!");
         return EINA_FALSE;
      }
 
@@ -4474,7 +5142,7 @@ eext_rotary_selector_item_delete_enabled_set(Eext_Object_Item *item, Eina_Bool e
 
    if (!rotary_selector_item)
      {
-        ERR("rotary_selector_item is NULL!!");
+        LOGE("rotary_selector_item is NULL!!");
         return;
      }
 
@@ -4482,6 +5150,38 @@ eext_rotary_selector_item_delete_enabled_set(Eext_Object_Item *item, Eina_Bool e
 }
 
 // ----------------------------------------- Accessibility API --------------------------------------//
+static void
+_accessibility_rotary_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   Eext_Rotary_Selector_Data *rsd = data;
+   if (!rsd) return;
+   rsd->highlighted = EINA_TRUE;
+   rsd->rot_highlighted = EINA_TRUE;
+}
+
+static void
+_accessibility_rotary_unhighlighted_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   Eext_Rotary_Selector_Data *rsd = data;
+   if (!rsd) return;
+   rsd->highlighted = EINA_FALSE;
+   rsd->rot_highlighted = EINA_FALSE;
+}
+
+//ONEUI1.5(20180709): On double tap and hold, mouse down, up are sent in access mode
+static void
+_accessibility_theme_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   //for accessibility
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+     {
+        elm_object_signal_emit(obj, "elm,action,access_on", "elm");
+     }
+   //
+}
+//
+
+
 static void
 _accessibility_item_btn_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
 {
@@ -4561,24 +5261,51 @@ _rotary_selector_moreoption_opened_cb(void *data, Evas_Object *obj, void *event_
    rsd = data;
    if (!rsd)
      {
-        ERR("rsd is NULL!!");
+        LOGE("rsd is NULL!!");
         return;
      }
 
    rsd->is_first_rotary_control = EINA_TRUE;
 }
 
-
-static void
-_accessibility_item_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+static char *
+_accessibility_item_name_set_cb(void *data, Evas_Object *obj)
 {
-   INF("called!!");
+   Eext_Rotary_Selector_Item *item = (Eext_Rotary_Selector_Item*)data;
+   Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(item->rotary_selector);
 
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-   if (rsd)
+   char buf[255] = "";
+   if (rsd && item->text1)
+     {
+        strncat(buf, elm_object_part_text_get(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text"), sizeof(buf) - strlen(buf) - 1);
+     }
+   if (rsd && item->text2)
+     {
+        strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
+        strncat(buf, elm_object_part_text_get(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,sub_text"), sizeof(buf) - strlen(buf) - 1);
+     }
+   //ONEUI1.5(20180516): speak add_item main title when screen-reader
+   if (rsd && rsd->add_item && item->index == rsd->add_item->index)
+     {
+        strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
+        strncat(buf, elm_object_part_text_get(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text"), sizeof(buf) - strlen(buf) - 1);
+     }
+   //
+   if (rsd && rsd->edit_mode_enabled && rsd->editing)
      {
-        evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
+        if (item->text1) strncpy(buf, item->text1, sizeof(buf) - strlen(buf) - 1);
+        if (item->text2)
+          {
+             strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
+             strncat(buf, item->text2, sizeof(buf) - strlen(buf) - 1);
+          }
+        if (item->delete_enabled)
+          {
+             strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
+             strncat(buf, _("WDS_ACCS_TBBODY_DOUBLE_TAP_TO_REMOVE"), sizeof(buf) - strlen(buf) - 1);
+          }
      }
+   return strdup(buf);
 }
 
 static void
@@ -4602,28 +5329,39 @@ _rotary_selector_screen_reader_changed(void *data, Evas_Object *obj, void *event
         EINA_LIST_FOREACH(rsd->item_list, l, item)
           {
              evas_object_freeze_events_set(item->base.obj, EINA_FALSE);
-             evas_object_smart_callback_add(item->base.obj, "clicked",_accessibility_item_btn_clicked_cb, (Eext_Rotary_Selector_Data*)rsd);
+             //ONEUI1.5(20180709): On double tap and hold, mouse down, up are sent in access mode
+             elm_object_signal_emit(item->base.obj, "elm,action,access_on", "elm");
+             //
              evas_object_smart_callback_add(item->base.obj, "atspi,highlighted", _accessibility_item_btn_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
-             elm_atspi_accessible_gesture_cb_set(item->base.obj, _accessibility_item_gesutre_cb, (Eext_Rotary_Selector_Data*)rsd);
+             evas_object_smart_callback_add(item->base.obj, "theme,changed", _accessibility_theme_changed_cb, (Eext_Rotary_Selector_Data*)rsd);
+             elm_atspi_accessible_gesture_cb_set(item->base.obj, _accessibility_item_gesture_cb, (Eext_Rotary_Selector_Data*)rsd);
              if (prev_item)
                {
                   _accessibility_rotary_selector_item_relationship_set(prev_item->base.obj, item->base.obj);
                }
+             _accessibility_item_name_set(rsd, item);
              prev_item = item;
           }
         _accessibility_item_chain_end_set(rsd);
         rsd->is_first_rotary_control = EINA_TRUE;
+        elm_gesture_layer_cb_set(rsd->gesture_layer, ELM_GESTURE_N_FLICKS,
+                                 ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd);
      }
    else
      {
         EINA_LIST_FOREACH(rsd->item_list, l, item)
           {
              evas_object_freeze_events_set(item->base.obj, EINA_TRUE);
-             evas_object_smart_callback_del(item->base.obj, "clicked",_accessibility_item_btn_clicked_cb);
+             //ONEUI1.5(20180709): On double tap and hold, mouse down, up are sent in access mode
+             elm_object_signal_emit(item->base.obj, "elm,action,access_off", "elm");
+             //
              evas_object_smart_callback_del(item->base.obj, "atspi,highlighted", _accessibility_item_btn_highlighted_cb);
+             evas_object_smart_callback_del(item->base.obj, "theme,changed", _accessibility_theme_changed_cb);
              elm_atspi_accessible_gesture_cb_set(item->base.obj, NULL, NULL);
           }
         evas_object_smart_callback_del(rsd->rotary_selector, "more,option,opened", _rotary_selector_moreoption_opened_cb);
+        elm_gesture_layer_cb_del(rsd->gesture_layer, ELM_GESTURE_N_FLICKS,
+                                  ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd);
      }
 }
 
@@ -4635,12 +5373,11 @@ _accessibility_rotary_selector_item_relationship_set(Evas_Object* obj, Evas_Obje
 }
 
 static Eina_Bool
-_accessibility_item_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj)
+_accessibility_item_gesture_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj)
 {
    Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data*)data;
    if (!rsd)
      return EINA_FALSE;
-
    if (rsd->previous_page_animator || rsd->next_page_animator)
      return EINA_FALSE;
 
@@ -4654,12 +5391,37 @@ _accessibility_item_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info,
    if (!item)
      return EINA_FALSE;
 
+   LOGI("Gesture_type = %d x_beg = %d, x_end=%d y_beg=%d y_end=%d",gesture_info.type,
+       gesture_info.x_beg, gesture_info.x_end, gesture_info.y_beg, gesture_info.y_end);
+
+   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+   int last_index = 0;
+   int previous_item_index = rsd->selected_index;
+   if (rsd->current_page == 0)
+     {
+        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+   else
+     {
+        last_index = (rsd->current_page + 1) * _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+   if (last_index > rsd->item_count - 1)
+     {
+        last_index = rsd->item_count - 1;
+     }
    switch (gesture_info.type)
      {
         case ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_LEFT:
           if (item->index % (_ROTARY_SELECTOR_PAGE_ITEM_MAX) == 0 && item->index - 1 > 0)
             {
                rsd->selected_index = item->index - 1;
+               //ONEUI1.5(20180712):Prevent same page transition more safety
+               if ((rsd->selected_index / _ROTARY_SELECTOR_PAGE_ITEM_MAX) == rsd->current_page)
+                 {
+                    _item_select(rsd, rsd->selected_index);
+                    return EINA_TRUE;
+                 }
+               //
                _page_animation_run(rsd, EINA_FALSE);
                _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE);
                Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
@@ -4669,11 +5431,18 @@ _accessibility_item_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info,
                     return EINA_TRUE;
                  }
             }
-           break;
+        break;
         case ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_RIGHT:
           if (item->index % (_ROTARY_SELECTOR_PAGE_ITEM_MAX) == _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1 && rsd->selected_index < rsd->item_count - 1)
             {
                rsd->selected_index = item->index + 1;
+               //ONEUI1.5(20180712):Prevent same page transition more safety
+               if ((rsd->selected_index / _ROTARY_SELECTOR_PAGE_ITEM_MAX) == rsd->current_page)
+                 {
+                    _item_select(rsd, rsd->selected_index);
+                    return EINA_TRUE;
+                 }
+               //
                _page_animation_run(rsd, EINA_TRUE);
                _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE);
                Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
@@ -4683,9 +5452,67 @@ _accessibility_item_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info,
                     return EINA_TRUE;
                  }
             }
+        break;
+        //ONEUI1.5(20180614): Edit mode screen reader support
+        case ELM_ATSPI_GESTURE_ONE_FINGER_DOUBLE_TAP:
+           {
+              Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
+
+              if (_item)
+                {
+                   if (rsd->editing)
+                     {
+                        if (_item != rsd->add_item && _item->delete_enabled) _delete_item(rsd, _item);
+                          return EINA_TRUE;
+                     }
+                     //ONEUI1.5(20180615): Clicked signal not sent issue fix
+                   else
+                     {
+                        if (_item != rsd->add_item)
+                          evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item);
+                        else
+                          evas_object_smart_callback_call(rsd->rotary_selector,
+                                                          "add_item,clicked", NULL);
+                     }
+                     //
+                }
+           }
+        break;
+        case ELM_ATSPI_GESTURE_TWO_FINGERS_FLICK_RIGHT:
+           if (rsd->current_page > 0)
+             {
+                rsd->selected_index = first_index - 1;
+                _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+                _page_animation_run(rsd, EINA_FALSE);
+                _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE);
+                evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+                return EINA_TRUE;
+             }
+        break;
+        case ELM_ATSPI_GESTURE_TWO_FINGERS_FLICK_LEFT:
+           if (rsd->current_page < ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX))
+              {
+                 rsd->selected_index = last_index + 1;
+                 _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+                 _page_animation_run(rsd, EINA_TRUE);
+                 _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE);
+                 evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+                 return EINA_TRUE;
+              }
+        break;
+        //ONEUI1.5(20180704):Consume hover and tap event to avoid highlight while dnd
+        case ELM_ATSPI_GESTURE_ONE_FINGER_HOVER:
+           if (rsd->editing)
+             return EINA_TRUE;
            break;
-               default:
+        case ELM_ATSPI_GESTURE_ONE_FINGER_SINGLE_TAP:
+            if (rsd->editing && gesture_info.state == EFL_ACCESS_GESTURE_STATE_ABORT)
+              return EINA_TRUE;
+            break;
+        //
+        default:
            break;
+        //
      }
    return EINA_FALSE;
 }
@@ -4695,17 +5522,16 @@ _accessibility_item_name_set(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selecto
 {
    if (!rsd || !it)
      return;
-   char buf[255] = "";
-   if (rsd && it->text1)
-     {
-        strncat(buf, elm_object_part_text_get(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text"), sizeof(buf) - strlen(buf) - 1);
-     }
-   if (rsd && it->text2)
+   Eina_List *l = NULL;
+   Eext_Rotary_Selector_Item *_item = NULL;
+   int i = 0;
+   EINA_LIST_FOREACH(rsd->item_list, l, _item)
      {
-        strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
-        strncat(buf, elm_object_part_text_get(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,sub_text"), sizeof(buf) - strlen(buf) - 1);
+        if (_item == it)
+          break;
+        i++;
      }
-   elm_atspi_accessible_name_set(it->base.obj, buf);
+   elm_atspi_accessible_name_cb_set(it->base.obj, _accessibility_item_name_set_cb, (Eext_Rotary_Selector_Item*)it);
    elm_atspi_accessible_reading_info_type_set(it->base.obj, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
 }
 
@@ -4723,7 +5549,8 @@ static void _accessibility_item_chain_end_set(Eext_Rotary_Selector_Data *rsd)
    if (l_count == 1)
      {
         Eext_Rotary_Selector_Item *_item = eina_list_nth(rsd->item_list, 0);
-        elm_atspi_accessible_attribute_append(_item->base.obj, "relation_chain_end", "prev,next,end");
+        if (_item)
+          elm_atspi_accessible_attribute_append(_item->base.obj, "relation_chain_end", "prev,next,end");
      }
    else
      {
@@ -4736,8 +5563,10 @@ static void _accessibility_item_chain_end_set(Eext_Rotary_Selector_Data *rsd)
           {
              elm_atspi_accessible_attribute_append(_item->base.obj, "relation_chain_end", "not,end");
           }
-        elm_atspi_accessible_attribute_append(first_item->base.obj, "relation_chain_end", "prev,end");
-        elm_atspi_accessible_attribute_append(last_item->base.obj, "relation_chain_end", "next,end");
+        if (first_item)
+          elm_atspi_accessible_attribute_append(first_item->base.obj, "relation_chain_end", "prev,end");
+        if (last_item)
+          elm_atspi_accessible_attribute_append(last_item->base.obj, "relation_chain_end", "next,end");
      }
 }
 //