Focus mode for DetailPopup. 16/49016/3
authorMaciej Skrzypkowski <m.skrzypkows@samsung.com>
Mon, 5 Oct 2015 07:29:48 +0000 (09:29 +0200)
committerJanusz Majnert <j.majnert@samsung.com>
Mon, 5 Oct 2015 11:59:29 +0000 (04:59 -0700)
[Issue]    https://bugs.tizen.org/jira/browse/TT-196
[Problem]  Keyboard navigation for Detail Popup was not implemented.
[Cause]    N/A
[Solution] Added links to focus chain.
[Verify]   Launch browser > Open few web pages > open Quick Access
           > navigate using keyboard, open Detail Popup, navigate there
           using keyboard, try choosing main link and history links.

Change-Id: Ia78b68f364220232359ec1583c3e32c8aa191924
Signed-off-by: Maciej Skrzypkowski <m.skrzypkows@samsung.com>
services/MainUI/DetailPopup.cpp
services/MainUI/DetailPopup.h
services/MainUI/MainUI.cpp
services/MainUI/MainUI.h
services/MainUI/edc/DetailPopup.edc
services/SimpleUI/SimpleUI.cpp

index d60d020..1d4695c 100644 (file)
@@ -32,9 +32,12 @@ const char * DetailPopup::URL_SEPARATOR = " - ";
 const int DetailPopup::HISTORY_ITEMS_NO = 5;
 
 DetailPopup::DetailPopup(MainUI *mainUI)
-    : m_layout(nullptr)
+    : m_main_view(nullptr)
+    , m_parent(nullptr)
+    , m_layout(nullptr)
     , m_historyList(nullptr)
     , m_mainUI(mainUI)
+    , m_urlButton(nullptr)
 {
     edjFilePath = EDJE_DIR;
     edjFilePath.append("MainUI/DetailPopup.edj");
@@ -53,16 +56,24 @@ DetailPopup::~DetailPopup()
     elm_genlist_item_class_free(m_history_item_class);
 }
 
-void DetailPopup::createLayout(Evas_Object *parent)
+void DetailPopup::createLayout()
 {
-    m_layout = elm_layout_add(parent);
+    m_layout = elm_layout_add(m_parent);
     elm_layout_file_set(m_layout, edjFilePath.c_str(), "popup");
     evas_object_size_hint_weight_set(m_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     evas_object_size_hint_align_set(m_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
     // TODO: add following (or simillar) callback for hardware back button when it will be available
     //evas_object_event_callback_add(m_layout, EVAS_CALLBACK_KEY_DOWN, _back, this);
     edje_object_signal_callback_add(elm_layout_edje_get(m_layout), "mouse,clicked,1", "bg", _bg_click, this);
-    edje_object_signal_callback_add(elm_layout_edje_get(m_layout), "mouse,clicked,1", "url_over", _url_click, this);
+    m_urlButton = elm_button_add(m_layout);     // add button to receive focus
+    elm_object_style_set(m_urlButton, "invisible_button");
+    evas_object_smart_callback_add(m_urlButton, "clicked", _url_click_button, this);
+    evas_object_show(m_urlButton);
+    elm_layout_content_set(m_layout, "url_over", m_urlButton);
+    elm_object_focus_custom_chain_unset(m_main_view);
+    elm_object_focus_custom_chain_append(m_main_view, m_urlButton, NULL);
+    elm_object_focus_set(m_urlButton, EINA_TRUE);
+
     edje_object_signal_callback_add(elm_layout_edje_get(m_layout), "mouse,clicked,1", "thumbnail", _url_click, this);
     elm_layout_text_set(m_layout, "history_title", "History");
     elm_layout_text_set(m_layout, "url", tools::clearURL(m_item->getUrl()));
@@ -70,9 +81,10 @@ void DetailPopup::createLayout(Evas_Object *parent)
     m_historyList = elm_genlist_add(m_layout);
     evas_object_size_hint_weight_set(m_historyList, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     evas_object_size_hint_align_set(m_historyList, EVAS_HINT_FILL, EVAS_HINT_FILL);
-    evas_object_smart_callback_add(m_historyList, "pressed", _history_url_click, this);
+    elm_genlist_select_mode_set(m_historyList, ELM_OBJECT_SELECT_MODE_ALWAYS);
+    elm_object_focus_custom_chain_append(m_main_view, m_historyList, NULL);
     for (auto it = m_prevItems->begin(); it != m_prevItems->end(); ++it) {
-        elm_genlist_item_append(m_historyList, m_history_item_class, it->get(), nullptr, ELM_GENLIST_ITEM_NONE, nullptr, this);
+        elm_genlist_item_append(m_historyList, m_history_item_class, it->get(), nullptr, ELM_GENLIST_ITEM_NONE, _history_url_click, this);
     }
     evas_object_show(m_historyList);
     elm_object_part_content_set(m_layout, "history_list", m_historyList);
@@ -85,23 +97,26 @@ void DetailPopup::createLayout(Evas_Object *parent)
     evas_object_show(m_layout);
 }
 
-void DetailPopup::show(Evas_Object *parent, std::shared_ptr<services::HistoryItem> currItem, std::shared_ptr<services::HistoryItemVector> prevItems)
+void DetailPopup::show(Evas_Object *parent, Evas_Object *main_view, std::shared_ptr<services::HistoryItem> currItem, std::shared_ptr<services::HistoryItemVector> prevItems)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    m_main_view = main_view;
+    m_parent = parent;
     m_item = currItem;
     m_prevItems = prevItems;
-    createLayout(parent);
+    createLayout();
 }
 
 void DetailPopup::hide()
 {
     edje_object_signal_callback_del(elm_layout_edje_get(m_layout), "mouse,clicked,1", "bg", _bg_click);
-    edje_object_signal_callback_del(elm_layout_edje_get(m_layout), "mouse,clicked,1", "url_over", _url_click);
+    elm_object_focus_custom_chain_unset(m_main_view);
+    evas_object_smart_callback_del(m_urlButton, "clicked", _url_click_button);
     edje_object_signal_callback_del(elm_layout_edje_get(m_layout), "mouse,clicked,1", "thumbnail", _url_click);
-    evas_object_smart_callback_del(m_historyList, "pressed", _history_url_click);
     elm_genlist_clear(m_historyList);
     evas_object_hide(m_layout);
     evas_object_del(m_layout);
+    refreshQuicAccessFocusChain();
 }
 
 void DetailPopup::_bg_click(void* data, Evas_Object*, const char*, const char*)
@@ -119,6 +134,14 @@ void DetailPopup::_url_click(void* data, Evas_Object*, const char*, const char*)
     dp->hide();
 }
 
+void DetailPopup::_url_click_button(void* data, Evas_Object*, void*)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    DetailPopup *dp = reinterpret_cast<DetailPopup*>(data);
+    dp->openURLInNewTab(dp->m_item, dp->m_mainUI->isDesktopMode());
+    dp->hide();
+}
+
 void DetailPopup::_history_url_click(void* data, Evas_Object*, void* event_info)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
index 953e9b8..1761d80 100644 (file)
@@ -36,9 +36,17 @@ namespace base_ui{
         /**
         * @brief Show popup window
         */
-        void show(Evas_Object *parent, std::shared_ptr<services::HistoryItem> currItem, std::shared_ptr<services::HistoryItemVector> prevItems);
+        void show(Evas_Object *parent, Evas_Object *main_view, std::shared_ptr<services::HistoryItem> currItem, std::shared_ptr<services::HistoryItemVector> prevItems);
+
+        /**
+        * @brief Hide popup
+        */
+        void hide();
+
+        bool isVisible() { return m_layout; }
 
         boost::signals2::signal<void (std::shared_ptr<tizen_browser::services::HistoryItem>, bool)> openURLInNewTab;
+        boost::signals2::signal<void ()> refreshQuicAccessFocusChain;
 
         static const int HISTORY_ITEMS_NO;
     private:
@@ -51,6 +59,7 @@ namespace base_ui{
         * @brief URL rectangle click callback
         */
         static void _url_click(void *data, Evas_Object *obj, const char *emission, const char *source);
+        static void _url_click_button(void *data, Evas_Object *obj, void *event_info);
 
         /**
          * @brief History genlist item click callback
@@ -58,22 +67,20 @@ namespace base_ui{
         static void _history_url_click(void *data, Evas_Object *o, void *event_info);
 
         /**
-        * @brief Hide popup
-        */
-        void hide();
-
-        /**
          * @brief Create main layout and all compnents.
          */
-        void createLayout(Evas_Object *parent);
+        void createLayout();
 
         /**
         * @brief Provide texts for history genlist
         */
         static char* _get_history_link_text(void *data, Evas_Object *obj, const char *part);
 
+        Evas_Object* m_main_view;
+        Evas_Object* m_parent;
         Evas_Object *m_layout;
         Evas_Object *m_historyList;
+        Evas_Object* m_urlButton;
         Elm_Gengrid_Item_Class * m_history_item_class;
         MainUI *m_mainUI;
         std::string edjFilePath;
index 6e64eae..b53c39f 100644 (file)
@@ -101,9 +101,6 @@ void MainUI::showMostVisited(std::shared_ptr< services::HistoryItemVector > vec)
 {
     addHistoryItems(vec);
     showHistory();
-    // update focus chain
-    elm_object_focus_custom_chain_append(m_parent, m_mostVisitedButton, NULL);
-    elm_object_focus_custom_chain_append(m_parent, m_bookmarksButton, NULL);
 }
 
 void MainUI::showBookmarks(std::vector< std::shared_ptr< tizen_browser::services::BookmarkItem > > vec)
@@ -292,7 +289,6 @@ void MainUI::addHistoryItem(std::shared_ptr<services::HistoryItem> hi)
     Evas_Object * thumb = tizen_browser::tools::EflTools::getEvasImage(hi->getThumbnail(), m_parent);
     elm_object_part_content_set(tile, "elm.thumbnail", thumb);
     evas_object_smart_callback_add(tile, "clicked", _thumbClicked, itemData);
-    elm_object_focus_custom_chain_append(m_parent, tile, NULL);
 
     m_historyItems.push_back(hi);
 }
@@ -450,6 +446,7 @@ void MainUI::showUI()
     } else {
         evas_object_show(m_mostVisitedView);
     }
+    refreshFocusChain();
 }
 
 void MainUI::hideUI()
@@ -464,7 +461,7 @@ void MainUI::hideUI()
 
 void MainUI::openDetailPopup(std::shared_ptr<services::HistoryItem> currItem, std::shared_ptr<services::HistoryItemVector> prevItems)
 {
-    m_detailPopup.show(m_layout, currItem, prevItems);
+    m_detailPopup.show(m_layout, m_parent, currItem, prevItems);
 }
 
 void MainUI::showNoHistoryLabel()
@@ -498,5 +495,21 @@ DetailPopup& MainUI::getDetailPopup()
     return m_detailPopup;
 }
 
+void MainUI::backButtonClicked()
+{
+    if (m_detailPopup.isVisible()) {
+        m_detailPopup.hide();
+    }
+}
+
+void MainUI::refreshFocusChain()
+{
+    elm_object_focus_custom_chain_append(m_parent, m_mostVisitedButton, NULL);
+    elm_object_focus_custom_chain_append(m_parent, m_bookmarksButton, NULL);
+    for (auto tile = m_tiles.begin(); tile != m_tiles.end(); ++tile) {
+            elm_object_focus_custom_chain_append(m_parent, *tile, NULL);
+    }
+}
+
 }
 }
index 1b9e43f..d18eeec 100644 (file)
@@ -50,6 +50,7 @@ public:
     bool isDesktopMode() const;
     void setDesktopMode(bool mode);
     DetailPopup & getDetailPopup();
+    void backButtonClicked();
 
     boost::signals2::signal<void (std::shared_ptr<tizen_browser::services::HistoryItem>, int)> mostVisitedTileClicked;
     boost::signals2::signal<void (std::shared_ptr<tizen_browser::services::HistoryItem>, bool)> openURLInNewTab;
@@ -71,6 +72,7 @@ private:
     Evas_Object* createBookmarkGengrid(Evas_Object *parent);
     void showHistory();
     void showBookmarks();
+    void refreshFocusChain();
 
     Evas_Object* createQuickAccessLayout(Evas_Object *parent);
     Evas_Object* createMostVisitedView(Evas_Object *parent);
index dd291d8..9640f04 100644 (file)
@@ -141,7 +141,7 @@ collections {
             }
 
             part { name: "url_over";
-                type: RECT;
+                type: SWALLOW;
                 mouse_events: 1;
                 repeat_events: 1;
                 description { state: "default" 0.0;
@@ -236,6 +236,14 @@ collections {
                 target: "url_bg";
                 target: "url";
             }
+            program {
+                name: "mouse_click";
+                signal: "mouse,clicked,1";
+                source: "url_over";
+                script {
+                    emit("elm,action,click", "");
+                }
+            }
         }
     }
 
index d0a29f6..b797ac6 100644 (file)
@@ -243,6 +243,7 @@ void SimpleUI::connectUISignals()
 
     M_ASSERT(m_mainUI.get());
     m_mainUI->getDetailPopup().openURLInNewTab.connect(boost::bind(&SimpleUI::onOpenURLInNewTab, this, _1, _2));
+    m_mainUI->getDetailPopup().refreshQuicAccessFocusChain.connect(boost::bind(&WebPageUI::showUI, m_webPageUI.get()));
     m_mainUI->openURLInNewTab.connect(boost::bind(&SimpleUI::onOpenURLInNewTab, this, _1, _2));
     m_mainUI->mostVisitedTileClicked.connect(boost::bind(&SimpleUI::onMostVisitedTileClicked, this, _1, _2));
     m_mainUI->mostVisitedClicked.connect(boost::bind(&SimpleUI::onMostVisitedClicked, this));
@@ -586,8 +587,12 @@ void SimpleUI::setwvIMEStatus(bool status)
 void SimpleUI::onBackPressed()
 {
     BROWSER_LOGD("[%s]", __func__);
-    if (!m_webPageUI->getURIEntry().hasFocus() && !m_wvIMEStatus && !m_webPageUI->isHomePageActive())
-        m_webEngine->backButtonClicked();
+    if (m_webPageUI->isHomePageActive()) {
+        m_mainUI->backButtonClicked();
+    } else {
+        if (!m_webPageUI->getURIEntry().hasFocus() && !m_wvIMEStatus)
+            m_webEngine->backButtonClicked();
+    }
 }
 
 void SimpleUI::reloadEnable(bool enable)