D-pad navigation for bookmarks in Quick Access view 17/49117/4
authorMaciej Skrzypkowski <m.skrzypkows@samsung.com>
Thu, 8 Oct 2015 09:46:48 +0000 (11:46 +0200)
committerMaciej Skrzypkowski <m.skrzypkows@samsung.com>
Thu, 8 Oct 2015 09:46:48 +0000 (11:46 +0200)
[Issue]    https://bugs.tizen.org/jira/browse/TT-205
[Problem]  Threre was no d-pad navigation for bookmarks
[Cause]    Not implemented.
[Solution] Implemented adding and removing items from focus
           chain while switching between Most Visted and Bookmarks.
           Additionaly fixed switching between Most Visited
           and Bookmark buttons.
[Verify]   Add few bookmarks, switch to bookmarks view on Quick
           Access page, try to navigate using keboard.

Change-Id: Idb3f89e46af1ae3656fc3cc3d9ddb65115ba549e
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/SimpleUI/SimpleUI.cpp
services/WebPageUI/WebPageUI.cpp
services/WebPageUI/WebPageUI.h

index 1d4695c8816c3c27c666ea219b3ce86e0752c4bb..eafd236a2947c75dbe0c6a4ffce5e4b3e9cd42d8 100644 (file)
@@ -116,7 +116,7 @@ void DetailPopup::hide()
     elm_genlist_clear(m_historyList);
     evas_object_hide(m_layout);
     evas_object_del(m_layout);
-    refreshQuicAccessFocusChain();
+    m_mainUI->refreshFocusChain();
 }
 
 void DetailPopup::_bg_click(void* data, Evas_Object*, const char*, const char*)
index 1761d8009cfff0934cf5ef43673db093afadd0ad..019932a02626ab30a0e5adb031d23febae4e9e2a 100644 (file)
@@ -46,7 +46,6 @@ namespace base_ui{
         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:
index b53c39f2dd36a7d1902b51dd0df5178038a451c8..6b30adf2d8560a8ca95dd73e2fa08773ea6ed013 100644 (file)
@@ -37,6 +37,9 @@ const int MainUI::MAX_TILES_NUMBER = 5;
 const int MainUI::MAX_THUMBNAIL_WIDTH = 840;
 const int MainUI::MAX_THUMBNAIL_HEIGHT = 648;
 const int MainUI::BIG_TILE_INDEX = 0;
+const int MainUI::TOP_RIGHT_TILE_INDEX = 3;
+const int MainUI::BOTTOM_RIGHT_TILE_INDEX = 4;
+
 const std::vector<std::string> MainUI::TILES_NAMES = {
     "elm.swallow.big",
     "elm.swallow.small_first",
@@ -65,6 +68,8 @@ MainUI::MainUI()
     , m_bookmarksButton(nullptr)
     , m_mostVisitedButton(nullptr)
     , m_bookmarkGengrid(nullptr)
+    , m_bookmarkManagerButton(nullptr)
+    , m_parentFocusChain(nullptr)
     , m_bookmark_item_class(nullptr)
     , m_detailPopup(this)
 {
@@ -79,6 +84,7 @@ MainUI::~MainUI()
 {
     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
     elm_gengrid_item_class_free(m_bookmark_item_class);
+    eina_list_free(m_parentFocusChain);
 }
 
 void MainUI::init(Evas_Object* parent)
@@ -232,12 +238,12 @@ Evas_Object* MainUI::createBottomButton(Evas_Object *parent)
     evas_object_size_hint_align_set(layoutBottom, EVAS_HINT_FILL, EVAS_HINT_FILL);
     evas_object_show(layoutBottom);
 
-    Evas_Object * bookmark_manager_button = elm_button_add(layoutBottom);
-    elm_object_style_set(bookmark_manager_button, "invisible_button");
-    evas_object_smart_callback_add(bookmark_manager_button, "clicked", _bookmark_manager_clicked, this);
-    evas_object_show(bookmark_manager_button);
+    m_bookmarkManagerButton = elm_button_add(layoutBottom);
+    elm_object_style_set(m_bookmarkManagerButton, "invisible_button");
+    evas_object_smart_callback_add(m_bookmarkManagerButton, "clicked", _bookmark_manager_clicked, this);
+    evas_object_show(m_bookmarkManagerButton);
 
-    elm_object_part_content_set(layoutBottom, "bookmarkmanager_click", bookmark_manager_button);
+    elm_object_part_content_set(layoutBottom, "bookmarkmanager_click", m_bookmarkManagerButton);
 
     return layoutBottom;
 }
@@ -313,12 +319,8 @@ void MainUI::addBookmarkItem(std::shared_ptr<tizen_browser::services::BookmarkIt
     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
     BookmarkItemData *itemData = new BookmarkItemData();
     itemData->item = bi;
-        itemData->mainUI = std::shared_ptr<tizen_browser::base_ui::MainUI>(this);
-        Elm_Object_Item* bookmarkView = elm_gengrid_item_append(m_bookmarkGengrid, m_bookmark_item_class, itemData, nullptr, this);
-    m_map_bookmark_views.insert(std::pair<std::string,Elm_Object_Item*>(bi->getAddress(),bookmarkView));
-
-    // unselect by default
-    elm_gengrid_item_selected_set(bookmarkView, EINA_FALSE);
+    itemData->mainUI = std::shared_ptr<tizen_browser::base_ui::MainUI>(this);
+    elm_gengrid_item_append(m_bookmarkGengrid, m_bookmark_item_class, itemData, _thumbBookmarkClicked, itemData);
 }
 
 void MainUI::addBookmarkItems(std::vector<std::shared_ptr<tizen_browser::services::BookmarkItem> > items)
@@ -342,7 +344,7 @@ char* MainUI::_grid_bookmark_text_get(void *data, Evas_Object *, const char *par
         return strdup("");
 }
 
-Evas_Object * MainUI::_grid_bookmark_content_get(void *data, Evas_Object *obj, const char *part)
+Evas_Object * MainUI::_grid_bookmark_content_get(void *data, Evas_Object*, const char *part)
 {
     BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part);
     BookmarkItemData *itemData = reinterpret_cast<BookmarkItemData*>(data);
@@ -356,12 +358,7 @@ Evas_Object * MainUI::_grid_bookmark_content_get(void *data, Evas_Object *obj, c
                 return nullptr;
         }
     }
-    else if (!strcmp(part, "elm.thumbButton")) {
-                Evas_Object *thumbButton = elm_button_add(obj);
-                elm_object_style_set(thumbButton, "thumbButton");
-                evas_object_smart_callback_add(thumbButton, "clicked", _thumbBookmarkClicked, data);
-                return thumbButton;
-    }
+
     return nullptr;
 }
 
@@ -399,12 +396,10 @@ void MainUI::showHistory()
     if (elm_layout_content_get(m_layout, "elm.swallow.content") == m_mostVisitedView)
         return;
 
-    elm_layout_content_unset(m_layout, "elm.swallow.content");
     evas_object_hide(m_bookmarksView);
     elm_layout_content_set(m_layout, "elm.swallow.content", m_mostVisitedView);
     evas_object_show(m_mostVisitedView);
 
-    elm_object_focus_set(m_mostVisitedButton, true);
 
     if (m_historyItems.empty()) {
         setEmptyView(true);
@@ -412,13 +407,14 @@ void MainUI::showHistory()
     }
     setEmptyView(false);
     evas_object_show(m_layout);
+    refreshFocusChain();
+    elm_object_focus_set(m_mostVisitedButton, true);
 }
 
 void MainUI::clearBookmarkGengrid()
 {
     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
     elm_gengrid_clear(m_bookmarkGengrid);
-    m_map_bookmark_views.clear();
 }
 
 void MainUI::showBookmarks()
@@ -428,13 +424,13 @@ void MainUI::showBookmarks()
     if (elm_layout_content_get(m_layout, "elm.swallow.content") == m_bookmarksView && m_bookmarksView != nullptr)
         return;
 
-    elm_layout_content_unset(m_layout, "elm.swallow.content");
     evas_object_hide(m_mostVisitedView);
     elm_layout_content_set(m_layout, "elm.swallow.content", m_bookmarksView);
     evas_object_show(m_bookmarksView);
 
-    elm_object_focus_set(m_bookmarksButton, true);
     evas_object_show(m_layout);
+    refreshFocusChain();
+    elm_object_focus_set(m_bookmarksButton, true);
 }
 
 void MainUI::showUI()
@@ -446,7 +442,6 @@ void MainUI::showUI()
     } else {
         evas_object_show(m_mostVisitedView);
     }
-    refreshFocusChain();
 }
 
 void MainUI::hideUI()
@@ -502,12 +497,38 @@ void MainUI::backButtonClicked()
     }
 }
 
+bool MainUI::isMostVisitedActive() const
+{
+    return evas_object_visible_get(m_mostVisitedView);
+}
+
 void MainUI::refreshFocusChain()
 {
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+
+    if (!m_parentFocusChain) {
+        m_parentFocusChain = eina_list_clone(elm_object_focus_custom_chain_get(m_parent));
+    } else {
+        elm_object_focus_custom_chain_unset(m_parent);
+        elm_object_focus_custom_chain_set(m_parent, eina_list_clone(m_parentFocusChain));
+    }
+
     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);
+    if (isMostVisitedActive()) {
+        for (auto tile = m_tiles.begin(); tile != m_tiles.end(); ++tile) {
+                elm_object_focus_custom_chain_append(m_parent, *tile, NULL);
+        }
+        // prevent from moving outside of screen
+        elm_object_focus_next_object_set(m_tiles[BIG_TILE_INDEX], m_tiles[BIG_TILE_INDEX], ELM_FOCUS_LEFT);
+        elm_object_focus_next_object_set(m_tiles[TOP_RIGHT_TILE_INDEX], m_tiles[TOP_RIGHT_TILE_INDEX], ELM_FOCUS_RIGHT);
+        elm_object_focus_next_object_set(m_tiles[BOTTOM_RIGHT_TILE_INDEX], m_tiles[BOTTOM_RIGHT_TILE_INDEX], ELM_FOCUS_RIGHT);
+    } else {
+        elm_object_focus_custom_chain_append(m_parent, m_bookmarkGengrid, NULL);
+        elm_object_focus_custom_chain_append(m_parent, m_bookmarkManagerButton, NULL);
+        // prevent from moving outside of screen
+        elm_object_focus_next_object_set(m_bookmarkGengrid, m_bookmarkGengrid, ELM_FOCUS_LEFT);
+        elm_object_focus_next_object_set(m_bookmarkGengrid, m_bookmarkGengrid, ELM_FOCUS_RIGHT);
     }
 }
 
index d18eeec89add3b17bf7c1f9e29c104728fe9606e..592f45e0737a6f529e79f6f9eac7308619d262cc 100644 (file)
@@ -51,6 +51,8 @@ public:
     void setDesktopMode(bool mode);
     DetailPopup & getDetailPopup();
     void backButtonClicked();
+    inline bool isMostVisitedActive() const;
+    void refreshFocusChain();
 
     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;
@@ -72,7 +74,6 @@ 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);
@@ -98,18 +99,21 @@ private:
     Evas_Object *m_bookmarksButton;
     Evas_Object *m_mostVisitedButton;
     Evas_Object *m_bookmarkGengrid;
+    Evas_Object *m_bookmarkManagerButton;
     std::vector<Evas_Object *> m_tiles;
+    Eina_List* m_parentFocusChain;
 
     Elm_Gengrid_Item_Class * m_bookmark_item_class;
     DetailPopup m_detailPopup;
     services::HistoryItemVector m_historyItems;
-    std::map<std::string,Elm_Object_Item*> m_map_bookmark_views;
     bool m_gengridSetup;
     std::string edjFilePath;
     bool m_desktopMode;
 
     static const int MAX_TILES_NUMBER;
     static const int BIG_TILE_INDEX;
+    static const int TOP_RIGHT_TILE_INDEX;
+    static const int BOTTOM_RIGHT_TILE_INDEX;
     static const std::vector<std::string> TILES_NAMES;
 };
 
index 14adab50ce41b3288b3ef0ce0e6cab2934dc2af6..472c528debb9f152b39473f517623833624bef15 100644 (file)
@@ -243,7 +243,6 @@ 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));
@@ -414,12 +413,7 @@ void SimpleUI::connectActions()
 void SimpleUI::switchViewToWebPage()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    M_ASSERT(m_mainUI.get());
     M_ASSERT(m_viewManager);
-
-    if(m_webPageUI->isHomePageActive())
-        m_mainUI->hideUI();
-
     m_webPageUI->switchViewToWebPage(m_webEngine->getLayout(), m_webEngine->getURI());
 }
 
@@ -455,10 +449,10 @@ void SimpleUI::switchViewToQuickAccess()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     M_ASSERT(m_viewManager);
-    m_viewManager->popStackTo(m_webPageUI.get());
 
     m_webPageUI->switchViewToQuickAccess(m_mainUI->getContent());
     m_webEngine->disconnectCurrentWebViewSignals();
+    m_viewManager->popStackTo(m_webPageUI.get());
 }
 
 void SimpleUI::checkTabId(const tizen_browser::basic_webengine::TabId& id){
index 38f2bb373434222ad0d4dfce6f5a8feec7958ac8..18ae8d77fbf5e4969f534a6b1d34e2fa9a20d990 100644 (file)
@@ -71,19 +71,8 @@ void WebPageUI::showUI()
     evas_object_show(elm_object_part_content_get(m_mainLayout, "uri_bar_buttons_left"));
     evas_object_show(elm_object_part_content_get(m_mainLayout, "uri_bar_buttons_right"));
 
-    // set custom focus chain
-    elm_object_focus_custom_chain_unset(m_mainLayout);
-    elm_object_focus_custom_chain_append(m_mainLayout, m_rightButtonBar->getContent(), NULL);
-    if (!isHomePageActive())
-        elm_object_focus_custom_chain_append(m_mainLayout, m_leftButtonBar->getContent(), NULL);
-    elm_object_focus_custom_chain_append(m_mainLayout, m_URIEntry->getContent(), NULL);
-
-    if (m_homePageActive) {
-        m_URIEntry->setFocus();
+    if (m_homePageActive)
         showMainUI();
-    } else {
-        elm_object_focus_set(elm_object_part_content_get(m_mainLayout, "web_view"), EINA_TRUE);
-    }
 }
 
 
@@ -151,6 +140,7 @@ void WebPageUI::switchViewToErrorPage()
     setMainContent(m_errorLayout);
     evas_object_show(m_leftButtonBar->getContent());
     setErrorButtons();
+    refreshFocusChain();
 }
 
 void WebPageUI::switchViewToWebPage(Evas_Object* content, const std::string uri)
@@ -162,8 +152,9 @@ void WebPageUI::switchViewToWebPage(Evas_Object* content, const std::string uri)
         m_homePageActive = false;
     }
     setMainContent(content);
-    evas_object_show(m_leftButtonBar->getContent());
     updateURIBar(uri);
+    refreshFocusChain();
+    evas_object_show(m_leftButtonBar->getContent());
     elm_object_focus_custom_chain_append(m_mainLayout, content, NULL);
 }
 
@@ -171,20 +162,16 @@ void WebPageUI::switchViewToQuickAccess(Evas_Object* content)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
 
-    if (m_homePageActive)
-        return;
-
     m_homePageActive = true;
     setMainContent(content);
-    showMainUI();
-
-    m_URIEntry->changeUri("");
-    m_leftButtonBar->setActionForButton("refresh_stop_button", m_reload);
     evas_object_hide(m_leftButtonBar->getContent());
     elm_object_signal_emit(m_mainLayout, "shiftback_uri", "ui");
     elm_object_signal_emit(m_URIEntry->getContent(), "shiftback_uribg", "ui");
     hideProgressBar();
+    refreshFocusChain();
+    m_URIEntry->changeUri("");
     m_URIEntry->setFocus();
+    showMainUI();
 }
 
 void WebPageUI::faviconClicked(void* data, Evas_Object*, const char*, const char*)
@@ -358,5 +345,18 @@ void WebPageUI::showMoreMenuConnect()
     showMoreMenu();
 }
 
+void WebPageUI::refreshFocusChain()
+{
+    // set custom focus chain
+    elm_object_focus_custom_chain_unset(m_mainLayout);
+    elm_object_focus_custom_chain_append(m_mainLayout, m_rightButtonBar->getContent(), NULL);
+    if (!m_homePageActive) {
+        elm_object_focus_custom_chain_append(m_mainLayout, m_leftButtonBar->getContent(), NULL);
+    } else {
+        m_reload->setEnabled(false);
+    }
+    elm_object_focus_custom_chain_append(m_mainLayout, m_URIEntry->getContent(), NULL);
+}
+
 }   // namespace tizen_browser
 }   // namespace base_ui
index d9fd5638b54268edf34f03bfa300a5d8f8a7b80e..0ad71589bb88444265ea5bf99c8f7d9b81d4ae45 100644 (file)
@@ -77,6 +77,7 @@ private:
     void setMainContent(Evas_Object* content);
     void updateURIBar(const std::string& uri);
     std::string edjePath(const std::string& file);
+    void refreshFocusChain();
 
     // wrappers to call singal as a reaction to other signal
     void backPageConnect() { backPage(); }