From f1686d110e12a7bd5aa0fb9bc6a6655fc08e6568 Mon Sep 17 00:00:00 2001 From: Maciej Skrzypkowski Date: Fri, 28 Aug 2015 16:23:53 +0200 Subject: [PATCH 01/16] Added detail popup to most visited view. [Issue#] https://bugs.tizen.org/jira/browse/TT-144 [Problem] N/A [Cause] N/A [Solution] Create popup view. [Verify] Open most visited view, click on tile, check if new popup with history appears Change-Id: Ia8ecffbba4d93e7d759780cf49f35a2c03c87fda Signed-off-by: Maciej Skrzypkowski --- core/Tools/GeneralTools.h | 22 +++ services/HistoryService/HistoryService.cpp | 39 +++++ services/HistoryService/HistoryService.h | 1 + services/MainUI/CMakeLists.txt | 18 +- services/MainUI/DetailPopup.cpp | 121 ++++++++++++++ services/MainUI/DetailPopup.h | 79 +++++++++ services/MainUI/MainUI.cpp | 25 ++- services/MainUI/MainUI.h | 6 +- services/MainUI/edc/DetailPopup.edc | 260 +++++++++++++++++++++++++++++ services/SimpleUI/SimpleUI.cpp | 13 +- services/SimpleUI/SimpleUI.h | 3 +- 11 files changed, 564 insertions(+), 23 deletions(-) create mode 100644 services/MainUI/DetailPopup.cpp create mode 100644 services/MainUI/DetailPopup.h create mode 100644 services/MainUI/edc/DetailPopup.edc diff --git a/core/Tools/GeneralTools.h b/core/Tools/GeneralTools.h index 2f131e4..83382b5 100644 --- a/core/Tools/GeneralTools.h +++ b/core/Tools/GeneralTools.h @@ -15,6 +15,7 @@ */ #include +#include #ifndef __GENERALTOOLS_H__ #define __GENERALTOOLS_H__ @@ -23,8 +24,29 @@ namespace tizen_browser { namespace tools { + static const int SUFIX_CHAR_DEL = 1; + static const char * PROTCOL_BEGIN = "://"; + static const char END_SLASH = '/'; + + // declaration using 'unused' attribute because in some modules not all functions are used + static std::string fromChar(const char* c) __attribute__ ((unused)); + static char * clearURL(const std::string & url) __attribute__ ((unused)); + static std::string extractDomain(const std::string & url) __attribute__ ((unused)); + static std::string fromChar(const char* c) { return c ? std::string(c) : std::string(); } + static char * clearURL(const std::string & url) { + size_t beg = url.find(PROTCOL_BEGIN); + beg += strlen(PROTCOL_BEGIN); + return strdup(url.substr(beg, url.size() - beg - SUFIX_CHAR_DEL).c_str()); + } + + static std::string extractDomain(const std::string & url) { + size_t beg = url.find(PROTCOL_BEGIN); + beg += strlen(PROTCOL_BEGIN); + size_t end = url.find(END_SLASH, beg); + return url.substr(beg, end - beg); + } } } diff --git a/services/HistoryService/HistoryService.cpp b/services/HistoryService/HistoryService.cpp index abccfc5..021c1e5 100644 --- a/services/HistoryService/HistoryService.cpp +++ b/services/HistoryService/HistoryService.cpp @@ -26,6 +26,7 @@ #include "HistoryItem.h" #include "AbstractWebEngine.h" #include "EflTools.h" +#include "Tools/GeneralTools.h" @@ -37,6 +38,8 @@ namespace services EXPORT_SERVICE(HistoryService, DOMAIN_HISTORY_SERVICE) +const int SEARCH_LIKE = 1; + HistoryService::HistoryService() : m_testDbMod(false) { BROWSER_LOGD("HistoryService"); @@ -243,6 +246,42 @@ std::shared_ptr HistoryService::getMostVisitedHistoryItems() return ret_history_list; } +std::shared_ptr HistoryService::getHistoryItemsByURL(const std::string& url, int maxItems) +{ + std::string search("%" + tools::extractDomain(url) + "%"); // add SQL 'any character' signs + + std::shared_ptr items(new HistoryItemVector); + int *ids=nullptr; + int count=-1; + bp_history_rows_cond_fmt conds; + conds.limit = maxItems; //no of rows to get negative means no limitation + conds.offset = -1; //the first row's index + conds.order_offset = BP_HISTORY_O_DATE_VISITED; // property to sort + conds.ordering = 1; //way of ordering 0 asc 1 desc + conds.period_offset = BP_HISTORY_O_DATE_VISITED; + conds.period_type = BP_HISTORY_DATE_ALL; + + int ret = bp_history_adaptor_get_cond_ids_p(&ids ,&count, &conds, BP_HISTORY_O_URL, search.c_str(), SEARCH_LIKE); + if (ret < 0) { + BROWSER_LOGD("Error! Could not get ids!"); + return items; + } + + bp_history_offset offset = (BP_HISTORY_O_URL | BP_HISTORY_O_TITLE | BP_HISTORY_O_DATE_VISITED); + for(int i = 0; i < count; i++) { + bp_history_info_fmt history_info; + bp_history_adaptor_get_info(ids[i], offset, &history_info); + + std::shared_ptr history = std::make_shared(std::string(history_info.url)); + history->setTitle(std::string(history_info.title ? history_info.title : "")); + + items->push_back(history); + } + + free(ids); + return items; +} + void HistoryService::addHistoryItem(std::shared_ptr his,std::shared_ptr thumbnail){ BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); his->setFavIcon(his->getFavIcon()); diff --git a/services/HistoryService/HistoryService.h b/services/HistoryService/HistoryService.h index eb556ea..f6fc91c 100644 --- a/services/HistoryService/HistoryService.h +++ b/services/HistoryService/HistoryService.h @@ -84,6 +84,7 @@ public: std::shared_ptr getHistoryOlder(); std::shared_ptr getCurrentTab(); std::shared_ptr getMostVisitedHistoryItems(); + std::shared_ptr getHistoryItemsByURL(const std::string & url, int maxItems); /** * @throws HistoryException on error diff --git a/services/MainUI/CMakeLists.txt b/services/MainUI/CMakeLists.txt index fd1710f..e12fb69 100644 --- a/services/MainUI/CMakeLists.txt +++ b/services/MainUI/CMakeLists.txt @@ -2,10 +2,12 @@ project(MainUI) set(MainUI_SRCS MainUI.cpp + DetailPopup.cpp ) set(MainUI_HEADERS MainUI.h + DetailPopup.h ) include(Coreheaders) @@ -23,7 +25,15 @@ install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION services ARCHIVE DESTINATION services/static) -include(EDCCompile) -EDJ_TARGET(MainUI.edj - ${CMAKE_CURRENT_SOURCE_DIR}/edc/MainUI.edc - ${CMAKE_CURRENT_BINARY_DIR}) +#please do not add edc/ directory +set(edcFiles + MainUI.edc + DetailPopup.edc + ) + +foreach(edec ${edcFiles}) + string(REPLACE ".edc" ".edj" target_name ${edec}) + EDJ_TARGET(${target_name} + ${CMAKE_CURRENT_SOURCE_DIR}/edc/${edec} + ${CMAKE_CURRENT_BINARY_DIR}) +endforeach(edec) diff --git a/services/MainUI/DetailPopup.cpp b/services/MainUI/DetailPopup.cpp new file mode 100644 index 0000000..f3d2ced --- /dev/null +++ b/services/MainUI/DetailPopup.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include "BrowserAssert.h" +#include "DetailPopup.h" +#include "BrowserLogger.h" +#include "Tools/GeneralTools.h" +#include "MainUI.h" + +namespace tizen_browser{ +namespace base_ui{ + +const int DetailPopup::HISTORY_ITEMS_NO = 5; + +DetailPopup::DetailPopup(MainUI *mainUI) + : m_layout(nullptr) + , m_historyList(nullptr) + , m_mainUI(mainUI) +{ + edjFilePath = EDJE_DIR; + edjFilePath.append("MainUI/DetailPopup.edj"); + elm_theme_extension_add(nullptr, edjFilePath.c_str()); + + m_history_item_class = elm_genlist_item_class_new(); + m_history_item_class->item_style = "history_grid_item"; + m_history_item_class->func.text_get = _get_history_link_text; + m_history_item_class->func.content_get = nullptr; + m_history_item_class->func.state_get = nullptr; + m_history_item_class->func.del = nullptr; +} + +DetailPopup::~DetailPopup() +{ + elm_genlist_item_class_free(m_history_item_class); +} + +void DetailPopup::createLayout(Evas_Object *parent) +{ + m_layout = elm_layout_add(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); + 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())); + 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_show(m_historyList); + elm_object_part_content_set(m_layout, "history_list", m_historyList); + + 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); + } + + evas_object_show(m_layout); +} + + +void DetailPopup::show(Evas_Object *parent, std::shared_ptr currItem, std::shared_ptr prevItems) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_item = currItem; + m_prevItems = prevItems; + createLayout(parent); +} + +void DetailPopup::hide() +{ + evas_object_hide(m_layout); +} + +void DetailPopup::_bg_click(void* data, Evas_Object* obj, const char* emission, const char* source) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + DetailPopup *dp = reinterpret_cast(data); + dp->hide(); +} + +void DetailPopup::_url_click(void* data, Evas_Object* obj, const char* emission, const char* source) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + DetailPopup *dp = reinterpret_cast(data); + dp->hide(); + dp->m_mainUI->openURLInNewTab(dp->m_item); +} + +char* DetailPopup::_get_history_link_text(void* data, Evas_Object* obj, const char* part) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + + services::HistoryItem *item = reinterpret_cast(data); + if (!strcmp(part, "page_dsc")) { + if (item != nullptr) { + return strdup(tools::clearURL(item->getUrl())); + } + } + return strdup(""); +} + +} +} \ No newline at end of file diff --git a/services/MainUI/DetailPopup.h b/services/MainUI/DetailPopup.h new file mode 100644 index 0000000..8d24a51 --- /dev/null +++ b/services/MainUI/DetailPopup.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DETAIL_POPUP_H__ +#define __DETAIL_POPUP_H__ + +#include +#include +#include +#include +#include "services/HistoryService/HistoryItem.h" + +namespace tizen_browser{ +namespace base_ui{ + + class MainUI; + + class DetailPopup { + public: + DetailPopup(MainUI *mainUI); + ~DetailPopup(); + + /** + * @brief Show popup window + */ + void show(Evas_Object *parent, std::shared_ptr currItem, std::shared_ptr prevItems); + + boost::signals2::signal)> openURLInNewTab; + + static const int HISTORY_ITEMS_NO; + private: + /** + * @brief Mouse background click callback + */ + static void _bg_click(void *data, Evas_Object *obj, const char *emission, const char *source); + + /** + * @brief URL rectangle click callback + */ + static void _url_click(void *data, Evas_Object *obj, const char *emission, const char *source); + + /** + * @brief Hide popup + */ + void hide(); + + void createLayout(Evas_Object *parent); + + /** + * @brief Provide texts for history genlist + */ + static char* _get_history_link_text(void *data, Evas_Object *obj, const char *part); + + Evas_Object *m_layout; + Evas_Object *m_historyList; + Elm_Gengrid_Item_Class * m_history_item_class; + MainUI *m_mainUI; + std::string edjFilePath; + std::shared_ptr m_item; + std::shared_ptr m_prevItems; + }; + +} +} + +#endif // __DETAIL_POPUP_H__ diff --git a/services/MainUI/MainUI.cpp b/services/MainUI/MainUI.cpp index e011d46..1657295 100644 --- a/services/MainUI/MainUI.cpp +++ b/services/MainUI/MainUI.cpp @@ -24,6 +24,7 @@ #include "BrowserLogger.h" #include "Tools/EflTools.h" #include "../Tools/BrowserImage.h" +#include "Tools/GeneralTools.h" #define efl_scale (elm_config_scale_get() / elm_app_base_scale_get()) @@ -32,9 +33,6 @@ namespace base_ui{ const int SMALL_TILES_ROWS = 2; const int MAX_TILES_NUMBER = 5; -const int SUFIX_CHAR_DEL = 1; -const char * HTTP_PREFIX = "http://"; -const char * HTTPS_PREFIX = "https://"; EXPORT_SERVICE(MainUI, "org.tizen.browser.mainui") @@ -70,6 +68,7 @@ MainUI::MainUI() , m_big_item_class(nullptr) , m_small_item_class(nullptr) , m_bookmark_item_class(nullptr) + , m_detailPopup(this) { BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); edjFilePath = EDJE_DIR; @@ -365,14 +364,7 @@ char* MainUI::_grid_text_get(void *data, Evas_Object *obj, const char *part) return strdup(itemData->item->getTitle().c_str()); } if (!strcmp(part, "page_url")) { - if (itemData->item->getUrl().find(HTTPS_PREFIX) == 0) { - size_t len = strlen(HTTPS_PREFIX); - return strdup(itemData->item->getUrl().substr(len, itemData->item->getUrl().size() - len - SUFIX_CHAR_DEL).c_str()); // remove https prefix - } else if (itemData->item->getUrl().find(HTTP_PREFIX) == 0) { - size_t len = strlen(HTTP_PREFIX); - return strdup(itemData->item->getUrl().substr(len, itemData->item->getUrl().size() - len - SUFIX_CHAR_DEL).c_str()); // remove http prefix - } - return strdup(itemData->item->getUrl().c_str()); + return tools::clearURL(itemData->item->getUrl()); } return strdup(""); } @@ -442,13 +434,13 @@ void MainUI::_itemSelected(void * data, Evas_Object * /* obj */, void * event_in HistoryItemData * itemData = reinterpret_cast(elm_object_item_data_get(selected)); MainUI * self = reinterpret_cast(data); - self->historyClicked(itemData->item); + self->openURLInNewTab(itemData->item); } void MainUI::_thumbSelected(void * data, Evas_Object * /* obj */, void * /* event_info */) { - HistoryItemData * itemData = reinterpret_cast(data); - itemData->mainUI->historyClicked(itemData->item); + HistoryItemData * itemData = reinterpret_cast(data); + itemData->mainUI->mostVisitedTileClicked(itemData->item, DetailPopup::HISTORY_ITEMS_NO); } void MainUI::clearHistoryGenlist() @@ -525,6 +517,11 @@ void MainUI::clearItems() clearBookmarkGengrid(); } +void MainUI::openDetailPopup(std::shared_ptr currItem, std::shared_ptr prevItems) +{ + m_detailPopup.show(m_layout, currItem, prevItems); +} + void MainUI::showNoHistoryLabel() { evas_object_hide(elm_object_part_content_get(m_mostVisitedView, "elm.swallow.left")); diff --git a/services/MainUI/MainUI.h b/services/MainUI/MainUI.h index 6809fd0..4ec341a 100644 --- a/services/MainUI/MainUI.h +++ b/services/MainUI/MainUI.h @@ -26,6 +26,7 @@ #include "service_macros.h" #include "services/HistoryService/HistoryItem.h" #include "BookmarkItem.h" +#include "DetailPopup.h" namespace tizen_browser{ namespace base_ui{ @@ -47,13 +48,15 @@ public: void showHistory(); void showBookmarks(); void clearItems(); + void openDetailPopup(std::shared_ptr currItem, std::shared_ptr prevItems); void addHistoryItem(std::shared_ptr); void addHistoryItems(std::shared_ptr); void addBookmarkItem(std::shared_ptr); void addBookmarkItems(std::vector >); - boost::signals2::signal)> historyClicked; + boost::signals2::signal)> openURLInNewTab; + boost::signals2::signal, int)> mostVisitedTileClicked; boost::signals2::signal mostVisitedClicked; boost::signals2::signal bookmarkClicked; boost::signals2::signal bookmarkManagerClicked; @@ -96,6 +99,7 @@ private: Elm_Gengrid_Item_Class * m_small_item_class; Elm_Gengrid_Item_Class * m_bookmark_item_class; + DetailPopup m_detailPopup; std::multimap m_map_history_views; std::map m_map_bookmark_views; bool m_gengridSetup; diff --git a/services/MainUI/edc/DetailPopup.edc b/services/MainUI/edc/DetailPopup.edc new file mode 100644 index 0000000..5a2ea1b --- /dev/null +++ b/services/MainUI/edc/DetailPopup.edc @@ -0,0 +1,260 @@ +collections { + + group { + name: "popup"; + + parts { + part { name: "bg"; + type: RECT; + mouse_events: 1; + description { state: "default" 0.0; + color: 0 0 0 102; + visible: 1; + min: 1920 1080; + max: -1 -1; + align: 0.0 0.0; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 1.0 1.0; + } + } + } + + part { name: "main_rect"; + type: RECT; + mouse_events: 1; + description { state: "default" 0.0; + color: 255 255 255 255; + min: 1336 648; + max: 1336 648; + visible: 1; + align: 0.5 0.0; + rel1 { + to: "bg"; + offset: 0 264; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 1.0 1.0; + } + } + } + + part { name: "thumbnail"; + //type: SWALLOW; TODO: change to swallow while adding thumbnail to Detail popup + type: RECT; + description { + color: 113 128 147 255; + min: 840 648; + max: 840 648; + visible: 1; + align: 0.0 0.0; + rel1 { + to: "main_rect"; + relative: 0.0 0.0; + } + rel2 { + to: "main_rect"; + relative: 1.0 1.0; + } + } + } + + part { name: "url_bg"; + type: RECT; + description { state: "default" 0.0; + color: 255 255 255 255; + min: 496 122; + max: 496 122; + visible: 1; + align: 0.0 0.0; + rel1 { + to: "thumbnail"; + relative: 1.0 0.0; + } + rel2 { + to: "main_rect"; + relative: 1.0 1.0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 0 119 246 255; + } + } + + part { name: "url"; + type: TEXT; + description { + visible: 1; + min: 428 122; + max: 428 122; + align: 0.0 0.0; + fixed: 1 1; + color: 51 51 51 255; + rel1 { + to: "url_bg"; + relative: 0.0 0.0; + offset: 34 0; + } + rel2 { + to: "url_bg"; + relative: 1.0 1.0; + } + text { + text: "Web page title"; + font: "Sans"; + size: 32; + align: 0 0.5; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + + part { name: "url_over"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + visible: 1; + color: 0 0 0 0; + rel1.to: "url_bg"; + rel2.to: "url_bg"; + } + } + + part { name: "history_title_bg"; + type: RECT; + description { + color: 244 244 244 255; + min: 496 44; + max: 496 44; + visible: 1; + align: 0.0 0.0; + rel1 { + to: "url_bg"; + relative: 0.0 1.0; + } + rel2 { + to: "main_rect"; + relative: 1.0 1.0; + } + } + } + + part { name: "history_title"; + type: TEXT; + description { + visible: 1; + min: 428 44; + max: 428 44; + align: 0.0 0.0; + fixed: 1 1; + color: 51 51 51 255; + rel1 { + to: "history_title_bg"; + relative: 0.0 0.0; + offset: 34 0; + } + rel2 { + to: "history_title_bg"; + relative: 1.0 1.0; + } + text { + text: "Web page title"; + font: "Sans"; + size: 22; + align: 0 0.5; + } + } + } + + part { name: "history_list"; + type: SWALLOW; + description { + color: 255 255 255 255; + min: 496 460; + max: 496 460; + visible: 1; + align: 0.0 0.0; + rel1 { + to: "history_title_bg"; + relative: 0.0 1.0; + offset: 0 22; + } + rel2 { + to: "main_rect"; + relative: 1.0 1.0; + } + } + } + } + + programs { + program { + name: "mouse_in_url"; + signal: "mouse,in"; + source: "url_over"; + action: STATE_SET "selected" 0.0; + target: "url_bg"; + target: "url"; + } + program { + name: "mouse_out_url"; + signal: "mouse,out"; + source: "url_over"; + action: STATE_SET "default" 0.0; + target: "url_bg"; + target: "url"; + } + } + } + + group { name: "elm/genlist/item/history_grid_item/default"; + data.item: "texts" "page_dsc"; + parts { + part { name: "bg"; + type: RECT; + mouse_events: 1; + description { state: "default" 0.0; + min: 496 86; + max: 496 86; + visible: 1; + color: 255 255 255 255; + align: 0.0 0.0; + } + } + + part { name: "page_dsc"; + type: TEXT; + description { state: "default" 0.0; + min: 428 86; + max: 428 86; + align: 0.0 0.0; + color: 0 0 0 255; + rel1 { + to: "bg"; + relative: 0.0 0.0; + offset: 34 0; + } + rel2 { + to: "bg"; + relative: 1.0 1.0; + } + text { + font: "Sans"; + size: 24; + align: 0 0.5; + } + } + } + + } + } +} \ No newline at end of file diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index a04a815..add69f3 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -308,7 +308,8 @@ int SimpleUI::exec(const std::string& _url) M_ASSERT(m_mainUI.get()); m_historyService->historyAllDeleted.connect(boost::bind(&tizen_browser::base_ui::MainUI::clearHistoryGenlist, m_mainUI.get())); - m_mainUI->historyClicked.connect(boost::bind(&SimpleUI::onHistoryClicked, this,_1)); + m_mainUI->openURLInNewTab.connect(boost::bind(&SimpleUI::onOpenURLInNewTab, this,_1)); + m_mainUI->mostVisitedTileClicked.connect(boost::bind(&SimpleUI::onMostVisitedTileClicked, this, _1, _2)); m_mainUI->mostVisitedClicked.connect(boost::bind(&SimpleUI::onMostVisitedClicked, this,_1)); m_mainUI->bookmarkClicked.connect(boost::bind(&SimpleUI::onBookmarkButtonClicked, this,_1)); m_mainUI->bookmarkManagerClicked.connect(boost::bind(&SimpleUI::onBookmarkManagerButtonClicked, this,_1)); @@ -595,7 +596,7 @@ void SimpleUI::onHistoryAdded(std::shared_ptr historyItem) +void SimpleUI::onOpenURLInNewTab(std::shared_ptr historyItem) { std::string historyAddress = historyItem->getUrl(); if(m_historyUI) { // TODO: remove this section when naviframes will be available @@ -610,6 +611,12 @@ void SimpleUI::onHistoryClicked(std::shared_ptr historyItem, int itemsNumber) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + m_mainUI->openDetailPopup(historyItem, m_historyService->getHistoryItemsByURL(historyItem->getUrl(), itemsNumber)); +} + void SimpleUI::onClearHistoryClicked(const std::string&) { BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); @@ -1095,7 +1102,7 @@ void SimpleUI::showHistoryUI(const std::string& str) M_ASSERT(m_historyUI); m_historyUI->clearHistoryClicked.connect(boost::bind(&SimpleUI::onClearHistoryClicked, this,_1)); m_historyUI->closeHistoryUIClicked.connect(boost::bind(&SimpleUI::closeHistoryUI, this,_1)); - m_historyUI->historyItemClicked.connect(boost::bind(&SimpleUI::onHistoryClicked, this,_1)); + m_historyUI->historyItemClicked.connect(boost::bind(&SimpleUI::onOpenURLInNewTab, this,_1)); m_historyUI->addHistoryItems(getHistory()); m_historyUI->show(m_window.get()); } diff --git a/services/SimpleUI/SimpleUI.h b/services/SimpleUI/SimpleUI.h index 2f3b261..82d03ee 100644 --- a/services/SimpleUI/SimpleUI.h +++ b/services/SimpleUI/SimpleUI.h @@ -132,7 +132,8 @@ private: void onHistoryAdded(std::shared_ptr historyItem); void onHistoryRemoved(const std::string& uri); - void onHistoryClicked(std::shared_ptr historyItem); + void onOpenURLInNewTab(std::shared_ptr historyItem); + void onMostVisitedTileClicked(std::shared_ptr historyItem, int itemsNumber); void onClearHistoryClicked(const std::string&); void onMostVisitedClicked(const std::string&); -- 2.7.4 From 9268130c9fd37150b47b7dc030917757928c0093 Mon Sep 17 00:00:00 2001 From: Maciej Skrzypkowski Date: Tue, 1 Sep 2015 09:28:14 +0200 Subject: [PATCH 02/16] Fixed not displaying thumbnails on Most visited screen. [Issue#] https://bugs.tizen.org/jira/browse/TT-73 [Problem] There was no thumbnails on main screen. [Cause] Website thumbnail was not saved and not fetched. [Solution] Added saving thumbnail on page finish loading and fetching it for Most visited screen. [Verify] Visit few different sites (wait until page is fully loaded) > open the Most visited screen, check if there are thumbnails. Change-Id: I8d8e648df0d1314fa772e5519ee07a06e795bc63 Signed-off-by: Maciej Skrzypkowski --- services/HistoryService/HistoryService.cpp | 7 ++----- services/MainUI/MainUI.cpp | 2 ++ services/MainUI/MainUI.h | 3 +++ services/SimpleUI/SimpleUI.cpp | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/services/HistoryService/HistoryService.cpp b/services/HistoryService/HistoryService.cpp index 021c1e5..e3d2a82 100644 --- a/services/HistoryService/HistoryService.cpp +++ b/services/HistoryService/HistoryService.cpp @@ -185,13 +185,10 @@ std::shared_ptr HistoryService::getMostVisitedHistoryItems() BROWSER_LOGD("Error! Could not get ids!"); } - bp_history_offset offset = (BP_HISTORY_O_URL | BP_HISTORY_O_TITLE | BP_HISTORY_O_FAVICON | BP_HISTORY_O_DATE_CREATED); + bp_history_offset offset = (BP_HISTORY_O_URL | BP_HISTORY_O_TITLE | BP_HISTORY_O_FAVICON | BP_HISTORY_O_DATE_CREATED | BP_HISTORY_O_THUMBNAIL); int freq_arr[1000]; for(int i = 0; i< count; i++){ - bp_history_info_fmt history_info; - bp_history_adaptor_get_info(ids[i],offset,&history_info); - int freq; if (0 == bp_history_adaptor_get_frequency(ids[i], &freq)) { @@ -232,7 +229,7 @@ std::shared_ptr HistoryService::getMostVisitedHistoryItems() //thumbail std::shared_ptr hi = std::make_shared(); - hi->imageType = tizen_browser::tools::BrowserImage::ImageType::ImageTypePNG; + hi->imageType = tools::BrowserImage::ImageTypePNG; hi->width = history_info.thumbnail_width; hi->height = history_info.thumbnail_height; hi->dataSize = history_info.thumbnail_length; diff --git a/services/MainUI/MainUI.cpp b/services/MainUI/MainUI.cpp index 1657295..74a2c52 100644 --- a/services/MainUI/MainUI.cpp +++ b/services/MainUI/MainUI.cpp @@ -33,6 +33,8 @@ namespace base_ui{ const int SMALL_TILES_ROWS = 2; const int MAX_TILES_NUMBER = 5; +const int MainUI::MAX_TILE_WIDTH = 784; +const int MainUI::MAX_TILE_HEIGHT = 498; EXPORT_SERVICE(MainUI, "org.tizen.browser.mainui") diff --git a/services/MainUI/MainUI.h b/services/MainUI/MainUI.h index 4ec341a..352051d 100644 --- a/services/MainUI/MainUI.h +++ b/services/MainUI/MainUI.h @@ -60,6 +60,9 @@ public: boost::signals2::signal mostVisitedClicked; boost::signals2::signal bookmarkClicked; boost::signals2::signal bookmarkManagerClicked; + + static const int MAX_TILE_WIDTH; + static const int MAX_TILE_HEIGHT; private: void createItemClasses(); diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index add69f3..6f0abe5 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -793,7 +793,7 @@ void SimpleUI::loadFinished() if(!m_webEngine->isPrivateMode()){ m_historyService->addHistoryItem(std::make_shared (m_webEngine->getURI(), m_webEngine->getTitle(), - m_webEngine->getFavicon())); + m_webEngine->getFavicon()), m_webEngine->getSnapshotData(MainUI::MAX_TILE_WIDTH, MainUI::MAX_TILE_HEIGHT)); } #if 0 if(!m_platformInputManager->getPointerModeEnabled()) -- 2.7.4 From 0e8109ef523ac8983822515d94c5119f73c0ca30 Mon Sep 17 00:00:00 2001 From: "t.dakowicz" Date: Thu, 27 Aug 2015 18:32:57 +0200 Subject: [PATCH 03/16] TT-106 Removed MoreMenu's tiles from BookmarkManager screen [Issue#] https://bugs.tizen.org/jira/browse/TT-106 [Problem] Tiles from MoreMenu was visible and accessible from BookmarkManager screen [Caused] Items were not cleared/hidden [Solution] This solution just clear those problematic items from MoreMenu - it should be removed after the new correct displaying design will be done [Verify] MoreMenu->BookmarkManager or MainUI->Bookmarks->BookmarkManager Check if any invisible tile is accessible or visible Change-Id: I371496d9befb64095721354f76fbb56d5fd18fc9 --- services/SimpleUI/SimpleUI.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index 6f0abe5..14ce4b8 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -646,6 +646,14 @@ void SimpleUI::onBookmarkButtonClicked(const std::string&) void SimpleUI::onBookmarkManagerButtonClicked(const std::string&) { BROWSER_LOGD("[%s]", __func__); + if(m_mainUI) { // TODO: remove this section when naviframes will be available + m_mainUI->clearBookmarkGengrid(); + } + + if(m_moreMenuUI) { // TODO: remove this section when naviframes will be available + m_moreMenuUI->clearItems(); + } + showBookmarkManagerMenu(); } @@ -1217,6 +1225,16 @@ void SimpleUI::closeBookmarkManagerMenu(std::string& str) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); m_bookmarkManagerUI.reset(); + + if(m_moreMenuUI) { + m_moreMenuUI.reset(); + showMoreMenu(); + } + + if(m_mainUI) { + m_mainUI->addBookmarkItems(getBookmarks()); + m_mainUI->showBookmarks(); + } } void SimpleUI::openLinkFromPopup(const std::string &uri) -- 2.7.4 From bbeb9ac34df2c2e5afcbf395c3977be8fb4b6b95 Mon Sep 17 00:00:00 2001 From: Maciej Skrzypkowski Date: Thu, 3 Sep 2015 12:28:26 +0200 Subject: [PATCH 04/16] User agent set depending on browsing mode (desktop/mobile). [Issue#] https://bugs.tizen.org/jira/browse/TT-132 [Problem] Browising mode switching was not implemented. [Cause] N/A [Solution]Added changing user agent by using EWK API method: ewk_view_user_agent_set. [Verify] Open new page, go to google.com then settings > view mobile web then close settings, type in new URL google.com, it should appear in mobile mode. Change-Id: I8a6888d09b94f97eb51b9d2440f04bf8e2ba544c Signed-off-by: Maciej Skrzypkowski --- core/AbstractWebEngine/AbstractWebEngine.h | 10 +++++++ services/MoreMenuUI/MoreMenuUI.cpp | 34 ++++++++++++++++++++-- services/MoreMenuUI/MoreMenuUI.h | 9 ++++-- services/MoreMenuUI/edc/MoreMenu.edc | 2 ++ services/SimpleUI/SimpleUI.cpp | 11 +++++++ services/SimpleUI/SimpleUI.h | 2 ++ .../WebKitEngineService/WebKitEngineService.cpp | 21 +++++++++++-- services/WebKitEngineService/WebKitEngineService.h | 5 ++++ services/WebKitEngineService/WebView.cpp | 20 +++++++++++-- services/WebKitEngineService/WebView.h | 13 +++++++-- 10 files changed, 117 insertions(+), 10 deletions(-) diff --git a/core/AbstractWebEngine/AbstractWebEngine.h b/core/AbstractWebEngine/AbstractWebEngine.h index bfe4199..8416229 100644 --- a/core/AbstractWebEngine/AbstractWebEngine.h +++ b/core/AbstractWebEngine/AbstractWebEngine.h @@ -257,6 +257,16 @@ public: virtual void backButtonClicked() const = 0; /** + * @brief Switch view to mobile + */ + virtual void switchToMobileView() = 0; + + /** + * @brief Switch view to desktop + */ + virtual void switchToDesktopView() = 0; + + /** * FavIcon of current page changed */ boost::signals2::signal)> favIconChanged; diff --git a/services/MoreMenuUI/MoreMenuUI.cpp b/services/MoreMenuUI/MoreMenuUI.cpp index fb1bcb5..8279289 100644 --- a/services/MoreMenuUI/MoreMenuUI.cpp +++ b/services/MoreMenuUI/MoreMenuUI.cpp @@ -48,6 +48,7 @@ MoreMenuUI::MoreMenuUI() : m_gengrid(NULL) , m_parent(NULL) , m_item_class(NULL) + , m_desktopView(true) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); m_edjFilePath = EDJE_DIR; @@ -230,9 +231,16 @@ void MoreMenuUI::hide() void MoreMenuUI::addItems() { BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); - for (size_t i = 0; i < static_cast(END_OF_RANGE); i++) { + for (int i = 0; i <= EXIT_BROWSER; i++) { + ItemType type = static_cast(i); + // take proper image for desktop/mobile view + if (type == ItemType::VIEW_DESKTOP_WEB && m_desktopView) + continue; + if (type == ItemType::VIEW_MOBILE_WEB && !m_desktopView) + continue; + MoreMenuItemData *itemData = new MoreMenuItemData(); - itemData->item = static_cast(i);; + itemData->item = type; itemData->moreMenuUI = std::shared_ptr(this); Elm_Object_Item* bookmarkView = elm_gengrid_item_append(m_gengrid, m_item_class, itemData, NULL, this); m_map_menu_views.insert(std::pair(itemData->item, bookmarkView)); @@ -277,6 +285,9 @@ char* MoreMenuUI::_grid_text_get(void* data, Evas_Object*, const char* part) case VIEW_MOBILE_WEB: item_name = "View mobile web"; break; + case VIEW_DESKTOP_WEB: + item_name = "View desktop web"; + break; case SHARE: item_name = "Share"; break; @@ -324,6 +335,9 @@ static const char* getImageFileNameForType(ItemType type, bool focused) case VIEW_MOBILE_WEB: file_name = focused ? "ic_more_mobileview_foc.png" : "ic_more_mobileview_nor.png"; break; + case VIEW_DESKTOP_WEB: + file_name = focused ? "ic_more_desktopview_foc.png" : "ic_more_desktopview_nor.png"; + break; case SHARE: file_name = focused ? "ic_more_share_foc.png" : "ic_more_share_nor.png"; break; @@ -401,6 +415,7 @@ void MoreMenuUI::_thumbSelected(void* data, Evas_Object*, void*) BROWSER_LOGD("[%s:%d]", __PRETTY_FUNCTION__, __LINE__); if (data) { MoreMenuItemData *itemData = static_cast(data); + BROWSER_LOGD("type: %d", itemData->item); switch (itemData->item) { case HISTORY: itemData->moreMenuUI->historyUIClicked(std::string()); @@ -426,6 +441,14 @@ void MoreMenuUI::_thumbSelected(void* data, Evas_Object*, void*) case FOCUS_MODE: break; case VIEW_MOBILE_WEB: + itemData->moreMenuUI->switchToMobileView(); + itemData->moreMenuUI->m_desktopView = false; + itemData->moreMenuUI->refreshGengrid(); + break; + case VIEW_DESKTOP_WEB: + itemData->moreMenuUI->switchToDesktopView(); + itemData->moreMenuUI->m_desktopView = true; + itemData->moreMenuUI->refreshGengrid(); break; case SHARE: break; @@ -454,6 +477,13 @@ void MoreMenuUI::clearItems() elm_cache_all_flush(); } +void MoreMenuUI::refreshGengrid() +{ + elm_gengrid_clear(m_gengrid); + m_map_menu_views.clear(); + addItems(); +} + void MoreMenuUI::_exitClicked() { BROWSER_LOGD("[%s:%d]", __PRETTY_FUNCTION__, __LINE__); diff --git a/services/MoreMenuUI/MoreMenuUI.h b/services/MoreMenuUI/MoreMenuUI.h index cd3d6c1..a6df318 100644 --- a/services/MoreMenuUI/MoreMenuUI.h +++ b/services/MoreMenuUI/MoreMenuUI.h @@ -48,10 +48,10 @@ enum ItemType { #endif FOCUS_MODE, VIEW_MOBILE_WEB, + VIEW_DESKTOP_WEB, SHARE, SETTINGS, - EXIT_BROWSER, - END_OF_RANGE + EXIT_BROWSER } item; class BROWSER_EXPORT MoreMenuUI @@ -80,6 +80,8 @@ public: boost::signals2::signal historyUIClicked; boost::signals2::signal settingsClicked; boost::signals2::signal closeMoreMenuClicked; + boost::signals2::signal switchToMobileView; + boost::signals2::signal switchToDesktopView; private: static char* _grid_text_get(void *data, Evas_Object *obj, const char *part); static Evas_Object * _grid_content_get(void *data, Evas_Object *obj, const char *part); @@ -93,6 +95,8 @@ private: void AddBookmarkPopupCalled(); void addToBookmarks(int folder_id); + void refreshGengrid(); + static void _star_clicked(void *data, Evas_Object *obj, void *event_info); static void _close_clicked(void *data, Evas_Object *obj, void *event_info); @@ -113,6 +117,7 @@ private: std::string m_folderName; bool m_gengridSetup; Evas_Object *m_icon; + bool m_desktopView; }; } diff --git a/services/MoreMenuUI/edc/MoreMenu.edc b/services/MoreMenuUI/edc/MoreMenu.edc index 91dbe04..553416b 100644 --- a/services/MoreMenuUI/edc/MoreMenu.edc +++ b/services/MoreMenuUI/edc/MoreMenu.edc @@ -38,6 +38,7 @@ RESOURCE_IMAGE_LOSSY("ic_more_zoom_nor.png") RESOURCE_IMAGE_LOSSY("ic_more_minibrowser_nor.png") RESOURCE_IMAGE_LOSSY("ic_more_focusmode_nor.png") RESOURCE_IMAGE_LOSSY("ic_more_mobileview_nor.png") +RESOURCE_IMAGE_LOSSY("ic_more_desktopview_nor.png") RESOURCE_IMAGE_LOSSY("ic_more_share_nor.png") RESOURCE_IMAGE_LOSSY("ic_more_setting_nor.png") RESOURCE_IMAGE_LOSSY("ic_more_exit_nor.png") @@ -49,6 +50,7 @@ RESOURCE_IMAGE_LOSSY("ic_more_zoom_foc.png") RESOURCE_IMAGE_LOSSY("ic_more_minibrowser_foc.png") RESOURCE_IMAGE_LOSSY("ic_more_focusmode_foc.png") RESOURCE_IMAGE_LOSSY("ic_more_mobileview_foc.png") +RESOURCE_IMAGE_LOSSY("ic_more_desktopview_foc.png") RESOURCE_IMAGE_LOSSY("ic_more_share_foc.png") RESOURCE_IMAGE_LOSSY("ic_more_setting_foc.png") RESOURCE_IMAGE_LOSSY("ic_more_exit_foc.png") diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index 14ce4b8..951e86d 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -1169,6 +1169,8 @@ void SimpleUI::showMoreMenu() m_moreMenuUI->historyUIClicked.connect(boost::bind(&SimpleUI::showHistoryUI, this,_1)); m_moreMenuUI->settingsClicked.connect(boost::bind(&SimpleUI::showSettingsUI, this,_1)); m_moreMenuUI->closeMoreMenuClicked.connect(boost::bind(&SimpleUI::closeMoreMenu, this,_1)); + m_moreMenuUI->switchToMobileView.connect(boost::bind(&SimpleUI::switchToMobileView, this)); + m_moreMenuUI->switchToDesktopView.connect(boost::bind(&SimpleUI::switchToDesktopView, this)); m_moreMenuUI->addToBookmarkClicked.connect(boost::bind(&SimpleUI::addBookmarkFolders, this)); m_moreMenuUI->AddBookmarkInput.connect(boost::bind(&SimpleUI::addToBookmarks, this,_1)); m_moreMenuUI->BookmarkFolderCreated.connect(boost::bind(&SimpleUI::newFolderMoreMenu, this,_1,_2)); @@ -1188,6 +1190,15 @@ void SimpleUI::closeMoreMenu(const std::string& str) m_moreMenuUI.reset(); } +void SimpleUI::switchToMobileView() +{ + m_webEngine->switchToMobileView(); +} + +void SimpleUI::switchToDesktopView() { + m_webEngine->switchToDesktopView(); +} + void SimpleUI::showBookmarkManagerMenu() { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); diff --git a/services/SimpleUI/SimpleUI.h b/services/SimpleUI/SimpleUI.h index 82d03ee..e760b6f 100644 --- a/services/SimpleUI/SimpleUI.h +++ b/services/SimpleUI/SimpleUI.h @@ -229,6 +229,8 @@ private: void closeTabUI(const std::string& str); void showMoreMenu(); void closeMoreMenu(const std::string& str); + void switchToMobileView(); + void switchToDesktopView(); void showHistoryUI(const std::string& str); void closeHistoryUI(const std::string&); void showMainUI(); diff --git a/services/WebKitEngineService/WebKitEngineService.cpp b/services/WebKitEngineService/WebKitEngineService.cpp index 5d8f076..2506a63 100644 --- a/services/WebKitEngineService/WebKitEngineService.cpp +++ b/services/WebKitEngineService/WebKitEngineService.cpp @@ -45,6 +45,7 @@ WebKitEngineService::WebKitEngineService() , m_privateMode(false) , m_guiParent(nullptr) , m_currentTabId(TabId::NONE) + , m_desktopView(true) { m_mostRecentTab.clear(); m_tabs.clear(); @@ -286,9 +287,9 @@ TabId WebKitEngineService::addTab(const std::string & uri, const TabId * openerI TabId newTabId; WebViewPtr p = std::make_shared(reinterpret_cast(m_guiParent), newTabId); if (openerId) - p->init(getTabView(*openerId)); + p->init(m_desktopView, getTabView(*openerId)); else - p->init(); + p->init(m_desktopView); m_tabs[newTabId] = p; @@ -507,6 +508,22 @@ void WebKitEngineService::backButtonClicked() const } } +void WebKitEngineService::switchToDesktopView() +{ + m_desktopView = true; + for (auto it = m_tabs.begin(); it != m_tabs.end(); ++it) { + it->second->switchToDesktopView(); + } +} + +void WebKitEngineService::switchToMobileView() +{ + m_desktopView = false; + for (auto it = m_tabs.begin(); it != m_tabs.end(); ++it) { + it->second->switchToMobileView(); + } +} + } /* end of webkitengine_service */ } /* end of basic_webengine */ } /* end of tizen_browser */ diff --git a/services/WebKitEngineService/WebKitEngineService.h b/services/WebKitEngineService/WebKitEngineService.h index 6f47216..5c0f47d 100644 --- a/services/WebKitEngineService/WebKitEngineService.h +++ b/services/WebKitEngineService/WebKitEngineService.h @@ -159,6 +159,9 @@ public: */ void backButtonClicked() const; + void switchToMobileView(); + void switchToDesktopView(); + private: // callbacks from WebView void _favIconChanged(std::shared_ptr bi); @@ -206,6 +209,8 @@ private: std::list m_mostRecentTab; // recently added tabs first std::list m_chronoTabs; + // true if desktop view is enabled, false if mobile + bool m_desktopView; }; } /* end of webkitengine_service */ diff --git a/services/WebKitEngineService/WebView.cpp b/services/WebKitEngineService/WebView.cpp index f634541..603543c 100644 --- a/services/WebKitEngineService/WebView.cpp +++ b/services/WebKitEngineService/WebView.cpp @@ -51,6 +51,9 @@ #define APPLICATION_NAME_FOR_USER_AGENT "Mozilla/5.0 (X11; SMART-TV; Linux) AppleWebkit/538.1 (KHTML, like Gecko) Safari/538.1" #endif +//TODO: temporary user agent for mobile display, change to proper one +#define APPLICATION_NAME_FOR_USER_AGENT_MOBILE "Mozilla/5.0 (Linux; Tizen 3.0; SAMSUNG SM-Z130H) AppleWebKit/538.1 (KHTML, like Gecko) SamsungBrowser/1.0 Mobile Safari/538.1" + using namespace tizen_browser::tools; namespace tizen_browser { @@ -80,7 +83,7 @@ WebView::~WebView() ewk_context_delete(m_ewkContext); } -void WebView::init(Evas_Object * opener) +void WebView::init(bool desktopView, Evas_Object * opener) { #if defined(USE_EWEBKIT) m_ewkView = ewk_view_add_with_context(evas_object_evas_get(m_parent), m_ewkContext); @@ -91,7 +94,10 @@ void WebView::init(Evas_Object * opener) evas_object_color_set(m_ewkView, 255, 255, 255, 255); evas_object_size_hint_weight_set(m_ewkView, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(m_ewkView, EVAS_HINT_FILL, EVAS_HINT_FILL); - ewk_view_application_name_for_user_agent_set(m_ewkView, APPLICATION_NAME_FOR_USER_AGENT); + if (desktopView) + switchToDesktopView(); + else + switchToMobileView(); //\todo: when value is other than 1.0, scroller is located improperly // ewk_view_device_pixel_ratio_set(m_ewkView, 1.0f); @@ -871,6 +877,16 @@ void WebView::searchOnWebsite(const std::string & searchString, int flags) BROWSER_LOGD("Ewk search; word: %s, result: %d", searchString.c_str(), result); } +void WebView::switchToDesktopView() { + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + int res = ewk_view_user_agent_set(m_ewkView, APPLICATION_NAME_FOR_USER_AGENT); +} + +void WebView::switchToMobileView() { + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + int res = ewk_view_user_agent_set(m_ewkView, APPLICATION_NAME_FOR_USER_AGENT_MOBILE); +} + } /* namespace webkitengine_service */ } /* end of basic_webengine */ } /* end of tizen_browser */ diff --git a/services/WebKitEngineService/WebView.h b/services/WebKitEngineService/WebView.h index 9dd26dc..846af9c 100644 --- a/services/WebKitEngineService/WebView.h +++ b/services/WebKitEngineService/WebView.h @@ -41,7 +41,7 @@ class WebView public: WebView(Evas_Object *, TabId); virtual ~WebView(); - void init(Evas_Object * opener = NULL); + void init(bool desktopView = true, Evas_Object * opener = NULL); void setURI(const std::string &); @@ -110,9 +110,18 @@ public: void searchOnWebsite(const std::string &, int); /** - * @brief Get favicon of URL + * @brief Change user agent to desktop type + */ + void switchToDesktopView(); + + /** + * @brief Change user agent to mobile type */ + void switchToMobileView(); + /** + * @brief Get favicon of URL + */ std::shared_ptr getFavicon(); // signals -- 2.7.4 From 622feb619af062b48570575d21c99f299ccddff4 Mon Sep 17 00:00:00 2001 From: Dariusz Frankiewicz Date: Mon, 31 Aug 2015 09:13:00 +0200 Subject: [PATCH 05/16] Refactor SettingsUI [Issue#] https://bugs.tizen.org/jira/browse/TT-153 [Problem] Check boxes in settings menu can't be clicked. [Cause] Invisible platform rectangle covers this screen area. [Solution] Refactoring settings UI code by replacing unneded genlist, with layout inside scrooler. Also added possibility to click check box labels as a complementary fix for platform issue with invisible rectangle. [Verify] Open More menu -> Settings and check if check boxes: Cache, Cookies and History can be changed by clicking their labels. Change-Id: I49e2ea04054cb1efdecd3fed02d26914b1ecac48 Signed-off-by: Dariusz Frankiewicz --- services/SettingsUI/SettingsUI.cpp | 217 ++++++++++++++++------------------- services/SettingsUI/SettingsUI.h | 10 +- services/SettingsUI/edc/Settings.edc | 4 +- 3 files changed, 110 insertions(+), 121 deletions(-) diff --git a/services/SettingsUI/SettingsUI.cpp b/services/SettingsUI/SettingsUI.cpp index 9b897a2..2b68784 100644 --- a/services/SettingsUI/SettingsUI.cpp +++ b/services/SettingsUI/SettingsUI.cpp @@ -43,6 +43,8 @@ SettingsUI::SettingsUI() , m_itemClassActionBar(nullptr) , m_parent(nullptr) , m_item_class(nullptr) + , m_scroller(nullptr) + , m_items_layout(nullptr) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); m_edjFilePath = EDJE_DIR; @@ -65,7 +67,7 @@ void SettingsUI::show(Evas_Object* parent) evas_object_show(m_settings_layout); showActionBar(); - showSettingsGenlist(); + showSettingsPage(); } void SettingsUI::showActionBar() @@ -98,45 +100,91 @@ void SettingsUI::showActionBar() nullptr, nullptr //data passed to above function ); - id->e_item = elmItem; + id->e_item = elmItem; BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); } -void SettingsUI::showSettingsGenlist() +void SettingsUI::showSettingsPage() { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - elm_theme_extension_add(nullptr, m_edjFilePath.c_str()); - m_genList = elm_genlist_add(m_settings_layout); - elm_object_part_content_set(m_settings_layout, "settings_genlist_swallow", m_genList); - elm_genlist_homogeneous_set(m_genList, EINA_FALSE); - elm_genlist_multi_select_set(m_genList, EINA_FALSE); - elm_genlist_select_mode_set(m_genList, ELM_OBJECT_SELECT_MODE_ALWAYS); - elm_genlist_mode_set(m_genList, ELM_LIST_SCROLL); - elm_genlist_decorate_mode_set(m_genList, EINA_TRUE); - evas_object_size_hint_weight_set(m_genList, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_scroller_policy_set(m_genList, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_AUTO); - - m_item_class = elm_genlist_item_class_new(); - m_item_class->item_style = "settings_items"; - m_item_class->func.text_get = nullptr; - m_item_class->func.content_get = &listSettingsGenlistContentGet; - m_item_class->func.state_get = nullptr; - m_item_class->func.del = nullptr; ItemData *id = new ItemData; id->settingsUI = this; - Elm_Object_Item *elmItem = elm_genlist_item_append(m_genList, //genlist - m_item_class, //item Class - id, - nullptr, //parent item - ELM_GENLIST_ITEM_NONE, //item type - nullptr, - nullptr //data passed to above function - ); - id->e_item = elmItem; - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_scroller = elm_scroller_add(m_settings_layout); + m_items_layout = elm_layout_add(m_scroller); + elm_object_content_set(m_scroller, m_items_layout); + elm_layout_file_set(m_items_layout, m_edjFilePath.c_str(), "settings_items"); + elm_object_part_content_set(m_settings_layout, "settings_scroller_swallow", m_scroller); + evas_object_size_hint_weight_set(m_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(m_scroller, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_scroller_policy_set(m_items_layout, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_AUTO); + elm_scroller_bounce_set(m_scroller, EINA_TRUE, EINA_FALSE); + elm_scroller_propagate_events_set(m_scroller, EINA_TRUE); + evas_object_show(m_scroller); + evas_object_show(m_items_layout); + + Evas_Object *del_selected_data_button = elm_button_add(m_items_layout); + elm_object_style_set(del_selected_data_button, "basic_button"); + evas_object_smart_callback_add(del_selected_data_button, "clicked", _del_selected_data_clicked_cb, (void*)id); + elm_layout_content_set(m_items_layout, "del_selected_data_click", del_selected_data_button); + + Evas_Object *reset_mv_button = elm_button_add(m_items_layout); + elm_object_style_set(reset_mv_button, "basic_button"); + evas_object_smart_callback_add(reset_mv_button, "clicked", _reset_mv_clicked_cb, (void*)id); + elm_layout_content_set(m_items_layout, "reset_mv_click", reset_mv_button); + + Evas_Object *reset_browser_button = elm_button_add(m_items_layout); + elm_object_style_set(reset_browser_button, "basic_button"); + evas_object_smart_callback_add(reset_browser_button, "clicked", _reset_browser_clicked_cb, (void*)id); + elm_layout_content_set(m_items_layout, "reset_browser_click", reset_browser_button); + + + Evas_Object *cache_checkbox = elm_check_add(m_items_layout); + elm_layout_content_set(m_items_layout, "cache_cb", cache_checkbox); + elm_check_state_set(cache_checkbox, EINA_TRUE); + edje_object_signal_callback_add(elm_layout_edje_get(m_items_layout), "mouse,clicked,1", "cache_cb_text", __checkbox_label_click_cb, (void*)id); + + Evas_Object *cookies_checkbox = elm_check_add(m_items_layout); + elm_layout_content_set(m_items_layout, "cookies_cb", cookies_checkbox); + elm_check_state_set(cookies_checkbox, EINA_TRUE); + edje_object_signal_callback_add(elm_layout_edje_get(m_items_layout), "mouse,clicked,1", "cookies_cb_text", __checkbox_label_click_cb, (void*)id); + + Evas_Object *history_checkbox = elm_check_add(m_items_layout); + elm_layout_content_set(m_items_layout, "history_cb", history_checkbox); + elm_check_state_set(history_checkbox, EINA_TRUE); + edje_object_signal_callback_add(elm_layout_edje_get(m_items_layout), "mouse,clicked,1", "history_cb_text", __checkbox_label_click_cb, (void*)id); + + + Evas_Object *accept_all_rb = elm_radio_add(m_items_layout); + elm_object_style_set(accept_all_rb, "settings_radio"); + elm_layout_content_set(m_items_layout, "accept_all_rb", accept_all_rb); + + Evas_Object *ask_rb = elm_radio_add(m_items_layout); + elm_object_style_set(ask_rb, "settings_radio"); + elm_layout_content_set(m_items_layout, "ask_rb", ask_rb); + + Evas_Object *sr_disable_rb = elm_radio_add(m_items_layout); + elm_object_style_set(sr_disable_rb, "settings_radio"); + elm_layout_content_set(m_items_layout, "sr_disable_rb", sr_disable_rb); + + Evas_Object *bs_enable_rb = elm_radio_add(m_items_layout); + elm_object_style_set(bs_enable_rb, "settings_radio"); + elm_layout_content_set(m_items_layout, "bs_enable_rb", bs_enable_rb); + + Evas_Object *bs_disable_rb = elm_radio_add(m_items_layout); + elm_object_style_set(bs_disable_rb, "settings_radio"); + elm_layout_content_set(m_items_layout, "bs_disable_rb", bs_disable_rb); + + Evas_Object *ts_enable_rb = elm_radio_add(m_items_layout); + elm_object_style_set(ts_enable_rb, "settings_radio"); + elm_layout_content_set(m_items_layout, "ts_enable_rb", ts_enable_rb); + + Evas_Object *ts_disable_rb = elm_radio_add(m_items_layout); + elm_object_style_set(ts_disable_rb, "settings_radio"); + elm_layout_content_set(m_items_layout, "ts_disable_rb", ts_disable_rb); + } Evas_Object* SettingsUI::listActionBarContentGet(void* data, Evas_Object* obj , const char* part) @@ -155,88 +203,28 @@ Evas_Object* SettingsUI::listActionBarContentGet(void* data, Evas_Object* obj , return nullptr; } -Evas_Object* SettingsUI::listSettingsGenlistContentGet(void* data, Evas_Object* obj , const char* part) +void SettingsUI::__checkbox_label_click_cb(void *data, Evas_Object *obj, const char *emission, const char *source) { - BROWSER_LOGD("[%s:%d] Part %s", __PRETTY_FUNCTION__, __LINE__, part); - if (obj && part) { - const char * part_name1 = "del_selected_data_click"; - static const int part_name1_len = strlen(part_name1); - if (!strncmp(part_name1, part, part_name1_len)) { - Evas_Object *button = elm_button_add(obj); - elm_object_style_set(button, "basic_button"); - evas_object_smart_callback_add(button, "clicked", SettingsUI::_del_selected_data_clicked_cb, data); - return button; - } + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if (data) { + ItemData *id = static_cast(data); - const char * part_name2 = "reset_mv_click"; - static const int part_name2_len = strlen(part_name2); - if (!strncmp(part_name2, part, part_name2_len)) { - Evas_Object *button = elm_button_add(obj); - elm_object_style_set(button, "basic_button"); - evas_object_smart_callback_add(button, "clicked", SettingsUI::_reset_mv_clicked_cb, data); - return button; + if(strcmp(source, "cache_cb_text") == 0 ){ + Evas_Object *cache_check = elm_layout_content_get(id->settingsUI->m_items_layout, "cache_cb"); + elm_check_state_set(cache_check, !elm_check_state_get(cache_check)); } - - const char * part_name3 = "reset_browser_click"; - static const int part_name3_len = strlen(part_name3); - if (!strncmp(part_name3, part, part_name3_len)) { - Evas_Object *button = elm_button_add(obj); - elm_object_style_set(button, "basic_button"); - evas_object_smart_callback_add(button, "clicked", SettingsUI::_reset_browser_clicked_cb, data); - return button; + else if (strcmp(source, "cookies_cb_text") == 0 ){ + Evas_Object *cookies_check = elm_layout_content_get(id->settingsUI->m_items_layout, "cookies_cb"); + elm_check_state_set(cookies_check, !elm_check_state_get(cookies_check)); } - - const char * part_name4 = "cache_cb"; - static const int part_name4_len = strlen(part_name4); - const char * part_name5 = "cookies_cb"; - static const int part_name5_len = strlen(part_name5); - const char * part_name6 = "history_cb"; - static const int part_name6_len = strlen(part_name6); - if (!strncmp(part_name4, part, part_name4_len) || - !strncmp(part_name5, part, part_name5_len) || - !strncmp(part_name6, part, part_name6_len)) - { - Evas_Object *checkbox = elm_check_add(obj); - elm_object_style_set(checkbox, "on&off"); - evas_object_smart_callback_add(checkbox, "changed", __check_changed_cb, data); - elm_check_state_set(checkbox, EINA_TRUE); - return checkbox; + else if (strcmp(source, "history_cb_text") == 0 ){ + Evas_Object *history_check = elm_layout_content_get(id->settingsUI->m_items_layout, "history_cb"); + elm_check_state_set(history_check, !elm_check_state_get(history_check)); } - - const char * part_name7 = "accept_all_rb"; - static const int part_name7_len = strlen(part_name7); - const char * part_name8 = "ask_rb"; - static const int part_name8_len = strlen(part_name8); - const char * part_name9 = "sr_disable_rb"; - static const int part_name9_len = strlen(part_name9); - const char * part_name10 = "bs_enable_rb"; - static const int part_name10_len = strlen(part_name10); - const char * part_name11 = "bs_disable_rb"; - static const int part_name11_len = strlen(part_name11); - const char * part_name12 = "ts_enable_rb"; - static const int part_name12_len = strlen(part_name12); - const char * part_name13 = "ts_disable_rb"; - static const int part_name13_len = strlen(part_name13); - if (!strncmp(part_name7, part, part_name7_len) || - !strncmp(part_name8, part, part_name8_len) || - !strncmp(part_name9, part, part_name9_len) || - !strncmp(part_name10, part, part_name10_len) || - !strncmp(part_name11, part, part_name11_len) || - !strncmp(part_name12, part, part_name12_len) || - !strncmp(part_name13, part, part_name13_len)) - { - Evas_Object *rb = elm_radio_add(obj); - elm_object_style_set(rb, "on&off"); - //evas_object_smart_callback_add(rb, "changed", __radio_changed_cb, data); - return rb; + else{ + BROWSER_LOGD("[%s:%d] - no matched source", __PRETTY_FUNCTION__, __LINE__); } } - return nullptr; -} - -void SettingsUI::__check_changed_cb(void*, Evas_Object*, void*) -{ - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); } void SettingsUI::close_clicked_cb(void* data, Evas_Object*, void*) @@ -252,7 +240,7 @@ void SettingsUI::close_clicked_cb(void* data, Evas_Object*, void*) void SettingsUI::hide() { evas_object_hide(elm_layout_content_get(m_settings_layout, "action_bar_swallow")); - evas_object_hide(elm_layout_content_get(m_settings_layout, "settings_genlist_swallow")); + evas_object_hide(elm_layout_content_get(m_settings_layout, "settings_scroller_swallow")); evas_object_hide(m_settings_layout); } @@ -260,15 +248,15 @@ void SettingsUI::_del_selected_data_clicked_cb(void *data, Evas_Object*, void*) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); if (data) { - ItemData *itemData = static_cast(data); - Evas_Object *cb1 = elm_object_item_part_content_get(itemData->e_item, "cache_cb"); - Evas_Object *cb2 = elm_object_item_part_content_get(itemData->e_item, "cookies_cb"); - Evas_Object *cb3 = elm_object_item_part_content_get(itemData->e_item, "history_cb"); + ItemData *id = static_cast(data); + Evas_Object *cache_check = elm_layout_content_get(id->settingsUI->m_items_layout, "cache_cb"); + Evas_Object *cookies_check = elm_layout_content_get(id->settingsUI->m_items_layout, "cookies_cb"); + Evas_Object *history_check = elm_layout_content_get(id->settingsUI->m_items_layout, "history_cb"); std::string type; - elm_check_state_get(cb1) ? type += "_CACHE" : ""; - elm_check_state_get(cb2) ? type += "_COOKIES" : ""; - elm_check_state_get(cb3) ? type += "_HISTORY" : ""; - itemData->settingsUI->deleteSelectedDataClicked(type); + elm_check_state_get(cache_check) ? type += "_CACHE" : ""; + elm_check_state_get(cookies_check) ? type += "_COOKIES" : ""; + elm_check_state_get(history_check) ? type += "_HISTORY" : ""; + id->settingsUI->deleteSelectedDataClicked(type); } } @@ -295,7 +283,6 @@ void SettingsUI::clearItems() BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); hide(); elm_genlist_clear(m_genListActionBar); - elm_genlist_clear(m_genList); } } diff --git a/services/SettingsUI/SettingsUI.h b/services/SettingsUI/SettingsUI.h index c7e8e9f..8adbf4d 100644 --- a/services/SettingsUI/SettingsUI.h +++ b/services/SettingsUI/SettingsUI.h @@ -38,7 +38,7 @@ public: void show(Evas_Object *main_layout); virtual std::string getName(); void showActionBar(); - void showSettingsGenlist(); + void showSettingsPage(); void clearItems(); void hide(); @@ -55,7 +55,7 @@ private: static Evas_Object * _tab_grid_content_get(void *data, Evas_Object *obj, const char *part); static void _itemSelected(void * data, Evas_Object * obj, void * event_info); static void close_clicked_cb(void *data, Evas_Object *obj, void *event_info); - static void __check_changed_cb(void *data, Evas_Object *obj, void *event_info); + static void __checkbox_label_click_cb(void *data, Evas_Object *obj, const char *emission, const char *source); static void _del_selected_data_clicked_cb(void * data, Evas_Object * obj, void * event_info); static void _reset_mv_clicked_cb(void * data, Evas_Object * obj, void * event_info); @@ -66,12 +66,14 @@ private: private: Evas_Object *m_settings_layout; Evas_Object *m_genListActionBar; - Evas_Object *m_genList; + Evas_Object *m_scroller; + Evas_Object *m_items_layout; Elm_Genlist_Item_Class *m_itemClassActionBar; Evas_Object *m_parent; - + Elm_Gengrid_Item_Class * m_item_class; std::string m_edjFilePath; + }; } diff --git a/services/SettingsUI/edc/Settings.edc b/services/SettingsUI/edc/Settings.edc index 76e5dc2..603c8d0 100644 --- a/services/SettingsUI/edc/Settings.edc +++ b/services/SettingsUI/edc/Settings.edc @@ -161,7 +161,7 @@ group { name: "settings-layout"; rel2 { relative: 1.0 1.0; } } } - part { name: "settings_genlist_swallow"; + part { name: "settings_scroller_swallow"; type: SWALLOW; description { state: "default" 0.0; align: 0.0 0.0; @@ -179,7 +179,7 @@ group { name: "settings-layout"; } } -group { name: "elm/genlist/item/settings_items/default"; +group { name: "settings_items"; data.item: "contents" "del_selected_data_click reset_mv_click reset_browser_click cache_cb cookies_cb history_cb accept_all_rb ask_rb sr_disable_rb bs_enable_rb bs_disable_rb ts_enable_rb ts_disable_rb"; images { image: "web_frame_selected.png" COMP; -- 2.7.4 From 7e7c470d20cf96de850dccf6b415a6d460ad386c Mon Sep 17 00:00:00 2001 From: Albert Malewski Date: Thu, 3 Sep 2015 08:16:11 +0200 Subject: [PATCH 06/16] Fixed creating history list [Issue#] https://bugs.tizen.org/jira/browse/TT-159 [Problem] "Close Tabs" function is not implemented in Tab Manager. [Cause] N/A [Solution] Added closeAllTabs, closeTabsClicked functions. Added boolean 'editMode' variable that conditions action in _thumbSelected function. Added callback to make 'X' icon and '[OK] to close' visible. [Verify] Launch browser > Add tabs > Tab manager > Close Tabs Check if 'Close all' button works properly Check if closing selected item works properly Change-Id: I98453027ad3ccfa797ab94e1e2c3ffa67f65d28f --- services/SimpleUI/SimpleUI.cpp | 7 ++++ services/SimpleUI/SimpleUI.h | 1 + services/TabUI/TabUI.cpp | 69 ++++++++++++++++++++++++++---------- services/TabUI/TabUI.h | 6 ++-- services/TabUI/edc/TabUI.edc | 79 +++++++++++++++++++++++++++++++++++------- 5 files changed, 130 insertions(+), 32 deletions(-) diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index 951e86d..91bcecb 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -938,6 +938,7 @@ void SimpleUI::showTabUI() m_tabUI->closeTabUIClicked.connect(boost::bind(&SimpleUI::closeTabUI, this,_1)); m_tabUI->newTabClicked.connect(boost::bind(&SimpleUI::newTabClicked, this,_1)); m_tabUI->tabClicked.connect(boost::bind(&SimpleUI::tabClicked, this,_1)); + m_tabUI->closeTabsClicked.connect(boost::bind(&SimpleUI::closeTabsClicked, this,_1)); m_tabUI->newIncognitoTabClicked.connect(boost::bind(&SimpleUI::newTabClicked, this,_1)); m_tabUI->show(m_window.get()); m_tabUI->addTabItems(m_webEngine->getTabContents()); @@ -961,6 +962,12 @@ void SimpleUI::tabClicked(const tizen_browser::basic_webengine::TabId& tabId) switchToTab(tabId); } +void SimpleUI::closeTabsClicked(const tizen_browser::basic_webengine::TabId& tabId) +{ + BROWSER_LOGD("%s", __func__); + m_webEngine->closeTab(tabId); +} + void SimpleUI::handleConfirmationRequest(basic_webengine::WebConfirmationPtr webConfirmation) { BROWSER_LOGD("%s", __func__); diff --git a/services/SimpleUI/SimpleUI.h b/services/SimpleUI/SimpleUI.h index e760b6f..b8df3a1 100644 --- a/services/SimpleUI/SimpleUI.h +++ b/services/SimpleUI/SimpleUI.h @@ -116,6 +116,7 @@ private: void switchToTab(const tizen_browser::basic_webengine::TabId& tabId); void newTabClicked(const std::string &); void tabClicked(const tizen_browser::basic_webengine::TabId& tabId); + void closeTabsClicked(const tizen_browser::basic_webengine::TabId& tabId); void tabCreated(); void tabClosed(const tizen_browser::basic_webengine::TabId& id); diff --git a/services/TabUI/TabUI.cpp b/services/TabUI/TabUI.cpp index d92dd18..cfb9e36 100644 --- a/services/TabUI/TabUI.cpp +++ b/services/TabUI/TabUI.cpp @@ -50,6 +50,7 @@ TabUI::TabUI() m_edjFilePath.append("TabUI/TabUI.edj"); elm_theme_extension_add(nullptr, m_edjFilePath.c_str()); createTabItemClass(); + editMode = false; } TabUI::~TabUI() @@ -105,9 +106,9 @@ Evas_Object* TabUI::createTabUILayout(Evas_Object* parent) elm_gengrid_align_set(m_gengrid, 0, 0); elm_gengrid_select_mode_set(m_gengrid, ELM_OBJECT_SELECT_MODE_ALWAYS); elm_gengrid_multi_select_set(m_gengrid, EINA_FALSE); - elm_gengrid_horizontal_set(m_gengrid, EINA_FALSE); + elm_gengrid_horizontal_set(m_gengrid, EINA_TRUE); elm_gengrid_highlight_mode_set(m_gengrid, EINA_TRUE); - elm_scroller_policy_set(m_gengrid, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_scroller_policy_set(m_gengrid, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_OFF); elm_scroller_page_size_set(m_gengrid, 0, 327); evas_object_size_hint_weight_set(m_gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -115,6 +116,8 @@ Evas_Object* TabUI::createTabUILayout(Evas_Object* parent) double efl_scale = elm_config_scale_get() / elm_app_base_scale_get(); elm_gengrid_item_size_set(m_gengrid, 364 * efl_scale, 320 * efl_scale); + evas_object_event_callback_add(m_gengrid, EVAS_CALLBACK_MOUSE_IN, _focus_in, this); + return tab_layout; } @@ -160,6 +163,7 @@ void TabUI::_close_clicked(void* data, Evas_Object*, void*) TabUI * tabUI = static_cast(data); tabUI->closeTabUIClicked(std::string()); tabUI->clearItems(); + tabUI->editMode = false; } } @@ -203,6 +207,7 @@ void TabUI::_newtab_clicked(void * data, Evas_Object*, void*) TabUI* tabUI = static_cast(data); tabUI->clearItems(); tabUI->newTabClicked(std::string()); + tabUI->editMode = false; } } @@ -223,27 +228,34 @@ void TabUI::_newincognitotab_clicked(void* data, Evas_Object*, void*) TabUI* tabUI = static_cast(data); tabUI->clearItems(); tabUI->newIncognitoTabClicked(std::string()); + tabUI->editMode = false; } } -void TabUI::_closetabs_clicked(void* data, Evas_Object*, void*) +void TabUI::_closetabs_clicked(void* data, Evas_Object* obj, void*) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); if (data) { TabUI* tabUI = static_cast(data); - tabUI->closeTabsClicked(std::string()); + if (!tabUI->editMode) { + tabUI->editMode = true; + BROWSER_LOGD("[%s:%d] --------> edit mode: %d ", __PRETTY_FUNCTION__, __LINE__, tabUI->editMode); + elm_layout_text_set(elm_layout_content_get(tabUI->m_tab_layout, "action_bar"), "closetabs_text", "Close all"); + } else { + tabUI->closeAllTabs(); + elm_gengrid_realized_items_update(tabUI->m_gengrid); + } } + } void TabUI::addTabItem(std::shared_ptr hi) { BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); - if (m_map_tab_views.size() >= 10) - return; TabItemData *itemData = new TabItemData(); itemData->item = hi; itemData->tabUI = std::shared_ptr(this); - Elm_Object_Item* tabView = elm_gengrid_item_append(m_gengrid, m_item_class, itemData, nullptr, this); + Elm_Object_Item* tabView = elm_gengrid_item_append(m_gengrid, m_item_class, itemData, _thumbSelected, itemData); m_map_tab_views.insert(std::pair(hi->getTitle(),tabView)); // unselect by default @@ -254,9 +266,7 @@ void TabUI::addTabItem(std::shared_ptr>items) { BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); - //limiting number of added items to 10 - auto eit = std::min(items.end(), items.begin() + 10); - for (auto it = items.begin(); it != eit; ++it) { + for (auto it = items.begin(); it < items.end(); it++) { addTabItem(*it); } } @@ -292,12 +302,6 @@ Evas_Object * TabUI::_tab_grid_content_get(void *data, Evas_Object *obj, const c const char *part_name2 = "tab_thumbButton"; static const int part_name2_len = strlen(part_name2); - if (!strncmp(part_name2, part, part_name2_len)) { - Evas_Object *thumbButton = elm_button_add(obj); - elm_object_style_set(thumbButton, "tab_thumbButton"); - evas_object_smart_callback_add(thumbButton, "clicked", tizen_browser::base_ui::TabUI::_thumbSelected, data); - return thumbButton; - } if (!strncmp(part_name1, part, part_name1_len)) { if (itemData->item->getThumbnail()) { return tizen_browser::tools::EflTools::getEvasImage(itemData->item->getThumbnail(), itemData->tabUI->m_parent); @@ -317,8 +321,15 @@ void TabUI::_thumbSelected(void *data, Evas_Object*, void*) BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); if (data) { TabItemData *itemData = static_cast(data); - itemData->tabUI->clearItems(); - itemData->tabUI->tabClicked(itemData->item->getId()); + if (!itemData->tabUI->editMode) { + itemData->tabUI->clearItems(); + itemData->tabUI->tabClicked(itemData->item->getId()); + } else { + itemData->tabUI->closeTabsClicked(itemData->item->getId()); + Elm_Object_Item* it = elm_gengrid_selected_item_get(itemData->tabUI->m_gengrid); + elm_object_item_del(it); + elm_gengrid_realized_items_update(itemData->tabUI->m_gengrid); + } } } @@ -339,6 +350,18 @@ Evas_Object* TabUI::createNoHistoryLabel() return label; } +void TabUI::closeAllTabs() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Object_Item* it = elm_gengrid_first_item_get(m_gengrid); + while (it) { + TabItemData *item = (TabItemData *)elm_object_item_data_get(it); + item->tabUI->closeTabsClicked(item->item->getId()); + it = elm_gengrid_item_next_get(it); + } + hide(); +} + void TabUI::setEmptyGengrid(bool setEmpty) { if (setEmpty) { @@ -348,6 +371,16 @@ void TabUI::setEmptyGengrid(bool setEmpty) } } +void TabUI::_focus_in(void * data, Evas*, Evas_Object * obj, void * event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Evas_Event_Mouse_In* ee = (Evas_Event_Mouse_In*)event_info; + int x, y; + TabUI* tabUI = static_cast(data); + Elm_Object_Item* it = elm_gengrid_at_xy_item_get(tabUI->m_gengrid, ee->canvas.x, ee->canvas.y, &x, &y); + if(it && tabUI->editMode) + elm_object_item_signal_emit(it, "selected", "over3"); +} } } diff --git a/services/TabUI/TabUI.h b/services/TabUI/TabUI.h index 19d5507..b83f118 100644 --- a/services/TabUI/TabUI.h +++ b/services/TabUI/TabUI.h @@ -47,7 +47,7 @@ public: boost::signals2::signal tabClicked; boost::signals2::signal newTabClicked; boost::signals2::signal newIncognitoTabClicked; - boost::signals2::signal closeTabsClicked; + boost::signals2::signal closeTabsClicked; boost::signals2::signal openedTabsClicked; boost::signals2::signal onOtherDevicesClicked; boost::signals2::signal closeTabUIClicked; @@ -67,17 +67,19 @@ private: static void _newincognitotab_clicked(void * data, Evas_Object * obj, void * event_info); static void _closetabs_clicked(void * data, Evas_Object * obj, void * event_info); static void _onotherdevices_clicked(void * data, Evas_Object * obj, void * event_info); + static void _focus_in(void * data, Evas*, Evas_Object * obj, void * event_info); Evas_Object* createTabUILayout(Evas_Object* parent); Evas_Object* createActionBar(Evas_Object* parent); Evas_Object* createTopButtons(Evas_Object* parent); Evas_Object* createNoHistoryLabel(); void createTabItemClass(); + void closeAllTabs(); -private: Evas_Object *m_tab_layout; Evas_Object *m_gengrid; Evas_Object *m_parent; + bool editMode; Elm_Gengrid_Item_Class * m_item_class; std::map m_map_tab_views; diff --git a/services/TabUI/edc/TabUI.edc b/services/TabUI/edc/TabUI.edc index 0094215..07f5192 100644 --- a/services/TabUI/edc/TabUI.edc +++ b/services/TabUI/edc/TabUI.edc @@ -63,12 +63,12 @@ group { name: "elm/button/base/tab_thumbButton"; } parts { part { name: "elm.swallow.content"; - type: RECT; + type: RECT; mouse_events: 1; repeat_events: 1; description { state: "default" 0.0; color: 0 0 0 0; - visible: 1; + visible: 0; rel1.relative: 0.0 0.0; rel2.relative: 1.0 1.0; align: 0.0 0.0; @@ -536,14 +536,62 @@ group { name: "elm/gengrid/item/tab_item/default"; //color: highlightTextColor; } } + part { name: "click_ok_to_close_text"; + type: TEXT; + description { state: "default" 0.0; + color: 0 119 246 204; + min: 300 48; + max: 300 48; + align: 0 0.5; + rel1 { + to: "tab_thumbnail"; + offset: 10 150; + relative: 0.0 0.0; + } + rel2 { + to: "tab_thumbnail"; + relative: 1.0 1.0; + } + text { + text: "[OK] to close"; + font: "Sans"; + size: 20; + align: 0.5 0.8; + } + visible: 0; + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "tab_thumbButton"; - type: SWALLOW; - description { state: "default" 0.0; - rel1.to: "tab_thumbnail"; - rel2.to: "tab_thumbnail"; + type: IMAGE; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 119 246 204; + visible: 0; + rel1 { + to: "bg"; + offset: 274 14; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + offset: 324 64; + relative: 0.0 0.0; + } + align: 0.0 0.0; + image.normal: "ico_delete.png"; + } + description { state: "selected"; + inherit: "default" 0.0; + visible: 1; + } } - } part { name: "over2"; type: RECT; @@ -561,7 +609,7 @@ group { name: "elm/gengrid/item/tab_item/default"; repeat_events: 1; description { state: "default" 0.0; color: 0 0 0 0; - rel1.to: "background"; + rel1.to: "bg"; rel2.to: "background"; } } @@ -583,6 +631,15 @@ group { name: "elm/gengrid/item/tab_item/default"; target: "background"; target: "focus_highlight"; target: "bg"; + target: "tab_thumbButton"; + target: "click_ok_to_close_text"; + } + program { name: "close_icon_show"; + signal: "selected"; + source: "over3"; + action: STATE_SET "selected" 0.0; + target: "tab_thumbButton"; + target: "click_ok_to_close_text"; } } } @@ -900,7 +957,7 @@ group { name: "action_bar_layout"; visible: 1; } } - part{ + part { name: "closetabs_text"; type: TEXT; scale: 1; @@ -911,7 +968,7 @@ group { name: "action_bar_layout"; rel2 { relative: 1.0 1.0;to: "closetabs_button";} color: 0 0 0 255; text { - text: "Close all"; + text: "Close Tabs"; font: "Sans"; size: 27; align: 0.5 0.5; @@ -1108,7 +1165,6 @@ group { name: "action_bar_layout"; action: STATE_SET "highlight" 0.0; target: "closetabs_button"; target: "closetabs_over"; - target: "closetabs_text"; } program { name: "mouse_out_closetabs_click"; @@ -1117,7 +1173,6 @@ group { name: "action_bar_layout"; action: STATE_SET "default" 0.0; target: "closetabs_button"; target: "closetabs_over"; - target: "closetabs_text"; } program { name: "mouse_in_close_click"; -- 2.7.4 From 8bd8096777051f3025fff83bd36ac1ea092e2550 Mon Sep 17 00:00:00 2001 From: "t.dakowicz" Date: Thu, 3 Sep 2015 16:25:39 +0200 Subject: [PATCH 07/16] TT-158 Fixed 'Clear History' bug [Issue#] https://bugs.tizen.org/jira/browse/TT-158 [Problem] Browser's crash after clicking on 'clear history' button [Cause] 'm_historyUI' object was not freed after closing the HistoryUI, which caused multiple sending of the clearHistory signal [Solution] Provided proper object management and prevented multiple creation of the 'm_historyUI'. In addition, there is a problem with displaying NoHistoryLabel from the HistoryUI - currently, it is not available from there [Verify] Do some browsing -> MoreMenu -> History Manager -> Clear Check if this action causes browser's crash Change-Id: I8be4b31c67b901d241d0bafdd621b72d5ea4c5f4 --- services/HistoryUI/HistoryUI.cpp | 25 +------------------------ services/HistoryUI/HistoryUI.h | 3 --- services/SimpleUI/SimpleUI.cpp | 27 ++++++++++++++------------- 3 files changed, 15 insertions(+), 40 deletions(-) diff --git a/services/HistoryUI/HistoryUI.cpp b/services/HistoryUI/HistoryUI.cpp index a2dc558..f9c3a12 100644 --- a/services/HistoryUI/HistoryUI.cpp +++ b/services/HistoryUI/HistoryUI.cpp @@ -185,7 +185,6 @@ void HistoryUI::addHistoryItem(std::shared_ptr hi) itemData->item = hi; itemData->historyUI = std::shared_ptr(this); _history_item_data.push_back(itemData); - setEmptyGengrid(false); } void HistoryUI::addHistoryItems(std::shared_ptr items) @@ -253,33 +252,12 @@ void HistoryUI::removeHistoryItem(const std::string& uri) Elm_Object_Item* historyView = m_map_history_views.at(uri); elm_object_item_del(historyView); m_map_history_views.erase(uri); - - setEmptyGengrid(0 == m_map_history_views.size()); -} - -Evas_Object* HistoryUI::createNoHistoryLabel() -{ - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - Evas_Object *label = elm_label_add(m_parent); - elm_object_text_set(label, "No favorite websites."); - evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); - return label; -} - -void HistoryUI::setEmptyGengrid(bool setEmpty) -{ - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - Evas_Object *obj = (setEmpty ? createNoHistoryLabel() : nullptr); - elm_object_part_content_set(m_gengrid, "elm.swallow.empty", obj); } void HistoryUI::hide() { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - evas_object_hide(elm_layout_content_get(m_history_layout, "m_genListToday")); - evas_object_hide(elm_layout_content_get(m_history_layout, "m_gengrid")); - evas_object_hide(elm_layout_content_get(m_history_layout, "m_ActionBar")); + evas_object_hide(elm_layout_content_get(m_history_layout, "action_bar_history")); evas_object_hide(m_history_layout); } @@ -291,7 +269,6 @@ void HistoryUI::clearItems() elm_gengrid_clear(m_gengrid); m_map_history_views.clear(); _history_item_data.clear(); - setEmptyGengrid(true); } void HistoryUI::_history_item_clicked_cb(void *data, Evas_Object *obj, void *event_info) diff --git a/services/HistoryUI/HistoryUI.h b/services/HistoryUI/HistoryUI.h index 1eb4a24..83bd6f6 100644 --- a/services/HistoryUI/HistoryUI.h +++ b/services/HistoryUI/HistoryUI.h @@ -60,8 +60,6 @@ private: static void _close_clicked_cb(void *data, Evas_Object *obj, void *event_info); static void _history_item_clicked_cb(void *data, Evas_Object *obj, void *event_info); - void setEmptyGengrid(bool setEmpty); - Evas_Object *m_history_layout; Evas_Object *m_actionBar; Evas_Object *m_genListToday; @@ -71,7 +69,6 @@ private: Elm_Gengrid_Item_Class * m_item_class; std::map m_map_history_views; std::string m_edjFilePath; - Evas_Object *createNoHistoryLabel(); }; } diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index 91bcecb..de0e0d6 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -313,7 +313,6 @@ int SimpleUI::exec(const std::string& _url) m_mainUI->mostVisitedClicked.connect(boost::bind(&SimpleUI::onMostVisitedClicked, this,_1)); m_mainUI->bookmarkClicked.connect(boost::bind(&SimpleUI::onBookmarkButtonClicked, this,_1)); m_mainUI->bookmarkManagerClicked.connect(boost::bind(&SimpleUI::onBookmarkManagerButtonClicked, this,_1)); - } if (url.empty()) { @@ -621,8 +620,7 @@ void SimpleUI::onClearHistoryClicked(const std::string&) { BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); m_historyService->clearAllHistory(); - m_mainUI->clearHistoryGenlist(); - m_mainUI->showHistory(); + m_historyUI.reset(); } void SimpleUI::onMostVisitedClicked(const std::string&) @@ -1111,21 +1109,24 @@ void SimpleUI::showMainUI() void SimpleUI::showHistoryUI(const std::string& str) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - m_historyUI = - std::dynamic_pointer_cast - (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.historyui")); - M_ASSERT(m_historyUI); - m_historyUI->clearHistoryClicked.connect(boost::bind(&SimpleUI::onClearHistoryClicked, this,_1)); - m_historyUI->closeHistoryUIClicked.connect(boost::bind(&SimpleUI::closeHistoryUI, this,_1)); - m_historyUI->historyItemClicked.connect(boost::bind(&SimpleUI::onOpenURLInNewTab, this,_1)); - m_historyUI->addHistoryItems(getHistory()); - m_historyUI->show(m_window.get()); + if(!m_historyUI) + { + m_historyUI = + std::dynamic_pointer_cast + (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.historyui")); + M_ASSERT(m_historyUI); + m_historyUI->clearHistoryClicked.connect(boost::bind(&SimpleUI::onClearHistoryClicked, this,_1)); + m_historyUI->closeHistoryUIClicked.connect(boost::bind(&SimpleUI::closeHistoryUI, this,_1)); + m_historyUI->historyItemClicked.connect(boost::bind(&SimpleUI::onOpenURLInNewTab, this,_1)); + m_historyUI->addHistoryItems(getHistory()); + m_historyUI->show(m_window.get()); + } } void SimpleUI::closeHistoryUI(const std::string& str) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - m_historyUI = nullptr; + m_historyUI.reset(); } void SimpleUI::showSettingsUI(const std::string& str) -- 2.7.4 From f0d3a9e9e6a6a06069ed4b1b3d15e7103e336637 Mon Sep 17 00:00:00 2001 From: Albert Malewski Date: Fri, 4 Sep 2015 13:23:47 +0200 Subject: [PATCH 08/16] Added switching between 'Open Tabs' and 'On Other Devices' [Issue] https://bugs.tizen.org/jira/browse/TT-149 [Problem] "Opened Tabs" is not toggle with "On Other Devices" in Tab Manager. [Cause] Lack of implementation. [Solution] Added boolean onOtherDevicesSwitch variable, which allows to switch between 'Open Tabs' and 'On Other Devices' correctly. Changed type of onotherdevices_click and openedtabs_click from RECT to SWALLOW. Additionally, changed 'tab_gengird' to 'tab_gengrid'. [Verify] Launch browser > Open new tab > Tabs > On Other Devices > Obs Tabs should be hidden when 'On Other Devices' is clicked. Change-Id: I18529df81e274dcbc658e8db7ef038b4080e907d --- services/SimpleUI/SimpleUI.cpp | 6 +++++ services/SimpleUI/SimpleUI.h | 1 + services/TabUI/TabUI.cpp | 51 +++++++++++++++++++++++++++++++----------- services/TabUI/TabUI.h | 2 ++ services/TabUI/edc/TabUI.edc | 18 +++++---------- 5 files changed, 53 insertions(+), 25 deletions(-) diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index de0e0d6..1b0e8d5 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -938,6 +938,7 @@ void SimpleUI::showTabUI() m_tabUI->tabClicked.connect(boost::bind(&SimpleUI::tabClicked, this,_1)); m_tabUI->closeTabsClicked.connect(boost::bind(&SimpleUI::closeTabsClicked, this,_1)); m_tabUI->newIncognitoTabClicked.connect(boost::bind(&SimpleUI::newTabClicked, this,_1)); + m_tabUI->tabsCount.connect(boost::bind(&SimpleUI::tabsCount, this)); m_tabUI->show(m_window.get()); m_tabUI->addTabItems(m_webEngine->getTabContents()); } @@ -966,6 +967,11 @@ void SimpleUI::closeTabsClicked(const tizen_browser::basic_webengine::TabId& tab m_webEngine->closeTab(tabId); } +int SimpleUI::tabsCount() +{ + return m_webEngine->tabsCount(); +} + void SimpleUI::handleConfirmationRequest(basic_webengine::WebConfirmationPtr webConfirmation) { BROWSER_LOGD("%s", __func__); diff --git a/services/SimpleUI/SimpleUI.h b/services/SimpleUI/SimpleUI.h index b8df3a1..f8faab1 100644 --- a/services/SimpleUI/SimpleUI.h +++ b/services/SimpleUI/SimpleUI.h @@ -270,6 +270,7 @@ private: void tabLimitPopupButtonClicked(PopupButtons button, std::shared_ptr< PopupData > /*popupData*/); void openLinkFromPopup(const std::string &); void disableHistoryButton(bool flag); + int tabsCount(); void onNetworkError(); void onNetworkConnected(); diff --git a/services/TabUI/TabUI.cpp b/services/TabUI/TabUI.cpp index cfb9e36..e93f03e 100644 --- a/services/TabUI/TabUI.cpp +++ b/services/TabUI/TabUI.cpp @@ -51,6 +51,7 @@ TabUI::TabUI() elm_theme_extension_add(nullptr, m_edjFilePath.c_str()); createTabItemClass(); editMode = false; + onOtherDevicesSwitch = false; } TabUI::~TabUI() @@ -100,7 +101,7 @@ Evas_Object* TabUI::createTabUILayout(Evas_Object* parent) //create gengrid containing tabs m_gengrid = elm_gengrid_add(tab_layout); - elm_object_part_content_set(tab_layout, "tab_gengird", m_gengrid); + elm_object_part_content_set(tab_layout, "tab_gengrid", m_gengrid); M_ASSERT(m_parent); elm_gengrid_align_set(m_gengrid, 0, 0); @@ -155,7 +156,6 @@ Evas_Object* TabUI::createActionBar(Evas_Object* parent) return actionBarLayout; } - void TabUI::_close_clicked(void* data, Evas_Object*, void*) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); @@ -164,6 +164,7 @@ void TabUI::_close_clicked(void* data, Evas_Object*, void*) tabUI->closeTabUIClicked(std::string()); tabUI->clearItems(); tabUI->editMode = false; + tabUI->onOtherDevicesSwitch = false; } } @@ -171,7 +172,7 @@ void TabUI::hide() { evas_object_hide(elm_layout_content_get(m_tab_layout, "action_bar")); evas_object_hide(elm_layout_content_get(m_tab_layout, "top_bar")); - evas_object_hide(elm_layout_content_get(m_tab_layout, "tab_gengird")); + evas_object_hide(elm_layout_content_get(m_tab_layout, "tab_gengrid")); evas_object_hide(m_tab_layout); } @@ -188,14 +189,14 @@ Evas_Object* TabUI::createTopButtons(Evas_Object* parent) Evas_Object *button = elm_button_add(topLayout); elm_object_style_set(button, "tab_button"); evas_object_smart_callback_add(button, "clicked", _openedtabs_clicked, this); - //TODO: "openedtabs_button" is not swallow, change it when implementing callbacks - elm_object_part_content_set(topLayout, "openedtabs_button", button); + evas_object_show(button); + elm_layout_content_set(topLayout, "openedtabs_click", button); button = elm_button_add(topLayout); elm_object_style_set(button, "tab_button"); - //TODO: "onotherdevices_button" is not swallow, change it when implementing callbacks evas_object_smart_callback_add(button, "clicked", _onotherdevices_clicked, this); - elm_object_part_content_set(topLayout, "onotherdevices_button", button); + evas_object_show(button); + elm_layout_content_set(topLayout, "onotherdevices_click", button); return topLayout; } @@ -208,17 +209,36 @@ void TabUI::_newtab_clicked(void * data, Evas_Object*, void*) tabUI->clearItems(); tabUI->newTabClicked(std::string()); tabUI->editMode = false; + tabUI->onOtherDevicesSwitch = false; } } -void TabUI::_openedtabs_clicked(void*, Evas_Object*, void*) +void TabUI::_openedtabs_clicked(void* data, Evas_Object*, void*) { - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if (data) { + TabUI* tabUI = static_cast(data); + if(tabUI->onOtherDevicesSwitch) { + tabUI->onOtherDevicesSwitch = false; + evas_object_show(tabUI->m_gengrid); + elm_layout_text_set(elm_layout_content_get(tabUI->m_tab_layout, "action_bar"), "closetabs_text", "Close Tabs"); + tabUI->editMode = false; + } + } } -void TabUI::_onotherdevices_clicked(void*, Evas_Object*, void*) +void TabUI::_onotherdevices_clicked(void* data, Evas_Object*, void*) { - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if (data) { + TabUI* tabUI = static_cast(data); + if(!tabUI->onOtherDevicesSwitch) { + tabUI->onOtherDevicesSwitch = true; + evas_object_hide(tabUI->m_gengrid); + elm_layout_text_set(elm_layout_content_get(tabUI->m_tab_layout, "action_bar"), "closetabs_text", "Close Tabs"); + tabUI->editMode = false; + } + } } void TabUI::_newincognitotab_clicked(void* data, Evas_Object*, void*) @@ -229,6 +249,7 @@ void TabUI::_newincognitotab_clicked(void* data, Evas_Object*, void*) tabUI->clearItems(); tabUI->newIncognitoTabClicked(std::string()); tabUI->editMode = false; + tabUI->onOtherDevicesSwitch = false; } } @@ -237,11 +258,11 @@ void TabUI::_closetabs_clicked(void* data, Evas_Object* obj, void*) BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); if (data) { TabUI* tabUI = static_cast(data); - if (!tabUI->editMode) { + if (!tabUI->editMode && !tabUI->onOtherDevicesSwitch) { tabUI->editMode = true; BROWSER_LOGD("[%s:%d] --------> edit mode: %d ", __PRETTY_FUNCTION__, __LINE__, tabUI->editMode); elm_layout_text_set(elm_layout_content_get(tabUI->m_tab_layout, "action_bar"), "closetabs_text", "Close all"); - } else { + } else if (tabUI->editMode && !tabUI->onOtherDevicesSwitch) { tabUI->closeAllTabs(); elm_gengrid_realized_items_update(tabUI->m_gengrid); } @@ -329,6 +350,10 @@ void TabUI::_thumbSelected(void *data, Evas_Object*, void*) Elm_Object_Item* it = elm_gengrid_selected_item_get(itemData->tabUI->m_gengrid); elm_object_item_del(it); elm_gengrid_realized_items_update(itemData->tabUI->m_gengrid); + int tabsNumber = *(itemData->tabUI->tabsCount()); + BROWSER_LOGD("%s:%d %s, items: %d", __FILE__, __LINE__, __func__, tabsNumber); + if (!tabsNumber) + itemData->tabUI->hide(); } } } diff --git a/services/TabUI/TabUI.h b/services/TabUI/TabUI.h index b83f118..21cd5b2 100644 --- a/services/TabUI/TabUI.h +++ b/services/TabUI/TabUI.h @@ -51,6 +51,7 @@ public: boost::signals2::signal openedTabsClicked; boost::signals2::signal onOtherDevicesClicked; boost::signals2::signal closeTabUIClicked; + boost::signals2::signal tabsCount; private: static char* _grid_text_get(void *data, Evas_Object *obj, const char *part); @@ -80,6 +81,7 @@ private: Evas_Object *m_gengrid; Evas_Object *m_parent; bool editMode; + bool onOtherDevicesSwitch; Elm_Gengrid_Item_Class * m_item_class; std::map m_map_tab_views; diff --git a/services/TabUI/edc/TabUI.edc b/services/TabUI/edc/TabUI.edc index 07f5192..faa4dac 100644 --- a/services/TabUI/edc/TabUI.edc +++ b/services/TabUI/edc/TabUI.edc @@ -256,7 +256,7 @@ group { visible: 1; } } - part { name: "tab_gengird"; + part { name: "tab_gengrid"; type : SWALLOW; scale: 1; description { @@ -1317,11 +1317,8 @@ group { name: "top_buttons_layout"; visible: 1; align: 0 0; fixed: 1 1; - min: 348 65; - max: 348 65; - rel1 { relative: 0.0 0.0; to: "openedtabs_over";} - rel2 { relative: 1.0 1.0; to: "openedtabs_over";} - color_class: transparent; + rel1 { relative: 0.0 0.0; to: "openedtabs_button";} + rel2 { relative: 1.0 1.0; to: "openedtabs_button";} } } part { @@ -1400,7 +1397,7 @@ group { name: "top_buttons_layout"; } part { - name: "onotherdevicess_click"; + name: "onotherdevices_click"; scale:1; type: SWALLOW; description { @@ -1408,11 +1405,8 @@ group { name: "top_buttons_layout"; visible: 1; align: 0 0; fixed: 1 1; - min: 348 65; - max: 348 65; - rel1 { relative: 0.0 0.0; to: "onotherdevices_over";} - rel2 { relative: 1.0 1.0; to: "onotherdevices_over";} - color_class: transparent; + rel1 { relative: 0.0 0.0; to: "onotherdevices_button";} + rel2 { relative: 1.0 1.0; to: "onotherdevices_button";} } } } -- 2.7.4 From 22ed25f1896905d77d85e43726e7bebf932ff70d Mon Sep 17 00:00:00 2001 From: Maciej Skrzypkowski Date: Tue, 8 Sep 2015 10:39:46 +0200 Subject: [PATCH 09/16] Refactoring - deleted unused history SQLite classes. [Issue#] N/A [Problem] These history classes were not used. [Cause] N/A [Solution] Removed dead code. [Verify] Open few pages, check if they appeared in history. Change-Id: Ia996b2259a7cc8c6e5506eb707a4f0a89c494aae Signed-off-by: Maciej Skrzypkowski --- services/HistoryService/HistoryService.cpp | 7 - services/HistoryService/HistoryService.h | 37 -- services/StorageService/CMakeLists.txt | 6 - services/StorageService/HistoryException.h | 44 -- services/StorageService/HistorySQLite.h | 134 ---- services/StorageService/HistoryStorage.h | 92 --- services/StorageService/StorageService.h | 56 -- services/StorageService/src/HistoryException.cpp | 39 -- services/StorageService/src/HistorySQLite.cpp | 752 ----------------------- services/StorageService/src/HistoryStorage.cpp | 35 -- services/StorageService/src/StorageService.cpp | 99 --- 11 files changed, 1301 deletions(-) delete mode 100644 services/StorageService/HistoryException.h delete mode 100644 services/StorageService/HistorySQLite.h delete mode 100644 services/StorageService/HistoryStorage.h delete mode 100644 services/StorageService/src/HistoryException.cpp delete mode 100644 services/StorageService/src/HistorySQLite.cpp delete mode 100644 services/StorageService/src/HistoryStorage.cpp diff --git a/services/HistoryService/HistoryService.cpp b/services/HistoryService/HistoryService.cpp index e3d2a82..b5826ef 100644 --- a/services/HistoryService/HistoryService.cpp +++ b/services/HistoryService/HistoryService.cpp @@ -338,9 +338,6 @@ void HistoryService::insertOrRefresh(std::shared_ptr hi) { //getStorageManager()->insertOrRefresh(hi); } -/** - * @throws HistoryException on error - */ void HistoryService::clearAllHistory() { bp_history_adaptor_reset(); @@ -368,10 +365,6 @@ int HistoryService::getHistoryId(const std::string & url) return 0; } - -/** - * @throws HistoryException on error - */ void HistoryService::clearURLHistory(const std::string & url) { int id = getHistoryId(url); diff --git a/services/HistoryService/HistoryService.h b/services/HistoryService/HistoryService.h index f6fc91c..f8e10e1 100644 --- a/services/HistoryService/HistoryService.h +++ b/services/HistoryService/HistoryService.h @@ -26,7 +26,6 @@ #include "service_macros.h" #include "BrowserImage.h" #include "HistoryItem.h" -#include "HistoryStorage.h" #include "StorageService.h" #include #define DOMAIN_HISTORY_SERVICE "org.tizen.browser.historyservice" @@ -42,40 +41,13 @@ public: HistoryService(); virtual ~HistoryService(); virtual std::string getName(); - int getHistoryId(const std::string & url); - - /** - * @throws HistoryException on error - */ void addHistoryItem(std::shared_ptr hi, std::shared_ptr thumbnail=std::shared_ptr()); - - /** - * If hi->getUrl() exists on a table HISTORY update visit_counter and visit_date, unless insert hi to database. - * - * @throws HistoryException on error - */ void insertOrRefresh(std::shared_ptr hi); - - /** - * @throws HistoryException on error - */ void clearAllHistory(); - - /** - * @throws HistoryException on error - */ void clearURLHistory(const std::string & url); - - /** - * @throws HistoryException on error - */ std::shared_ptr getHistoryItem(const std::string & url); - - /** - * @throws HistoryException on error - */ std::shared_ptr getHistoryAll(); std::shared_ptr getHistoryToday(); std::shared_ptr getHistoryYesterday(); @@ -85,17 +57,8 @@ public: std::shared_ptr getCurrentTab(); std::shared_ptr getMostVisitedHistoryItems(); std::shared_ptr getHistoryItemsByURL(const std::string & url, int maxItems); - - /** - * @throws HistoryException on error - */ int getHistoryItemsCount(); - - /** - * @throws HistoryException on error - */ int getHistoryVisitCounter(const std::string & url); - void setStorageServiceTestMode(bool testmode = true); boost::signals2::signalhistoryEmpty; diff --git a/services/StorageService/CMakeLists.txt b/services/StorageService/CMakeLists.txt index bfd5488..0b6aaf3 100644 --- a/services/StorageService/CMakeLists.txt +++ b/services/StorageService/CMakeLists.txt @@ -8,9 +8,6 @@ set(StorageServiceSOURCES Storage/SQLDatabase.cpp src/BookmarksSorage.cpp src/BookmarksSQLite.cpp - src/HistoryException.cpp - src/HistorySQLite.cpp - src/HistoryStorage.cpp src/StorageService.cpp ) @@ -20,9 +17,6 @@ set(StorageService_HEADERS StorageService.h BookmarksStorage.h BookmarksSQLite.h - HistoryStorage.h - HistorySQLite.h - HistoryException.h Storage/include/Field.h Storage/include/DriverManager.h Storage/include/SQLDatabase.h diff --git a/services/StorageService/HistoryException.h b/services/StorageService/HistoryException.h deleted file mode 100644 index d6a5849..0000000 --- a/services/StorageService/HistoryException.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __HISTORY_EXCEPTION_H -#define __HISTORY_EXCEPTION_H - -#include -#include - -#include "ServiceFactory.h" -#include "service_macros.h" - -namespace tizen_browser -{ -namespace services -{ - -class BROWSER_EXPORT HistoryException : public std::exception -{ -public: - HistoryException(const std::string & message); - virtual ~HistoryException() throw (); - virtual const char * getMessage() const throw (); -protected: - std::string m_message; -}; - -} -} - -#endif diff --git a/services/StorageService/HistorySQLite.h b/services/StorageService/HistorySQLite.h deleted file mode 100644 index 451e2cd..0000000 --- a/services/StorageService/HistorySQLite.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __HISTORY_H -#define __HISTORY_H - -#include -#include -#include -#include - -#include "BrowserImage.h" -#include "Config.h" -#include "HistoryStorage.h" -#include "SQLDatabase.h" - -///\todo temporary dirty include -#include "../HistoryService/HistoryItem.h" - -namespace tizen_browser -{ -namespace services -{ - -class HistorySQLite: virtual public HistoryStorage -{ -public: - HistorySQLite(); - ~HistorySQLite(); - - /** - * @throws HistoryException on error - */ - void addHistoryItem(std::shared_ptr hi, storage::SQLTransactionScope * transactionScope); - - void addHistoryItem(std::shared_ptr hi); - - /** - * If hi->getUrl() exists on a table HISTORY update visit_counter and visit_date, unless insert hi to database. - * - * @throws HistoryException on error - */ - void insertOrRefresh(std::shared_ptr hi, storage::SQLTransactionScope * transactionScope); - - void insertOrRefresh(std::shared_ptr hi); - - /** - * @throws HistoryException on error - */ - std::shared_ptr getFavicon(const std::string & url, storage::SQLTransactionScope * transactionScope); - - std::shared_ptr getFavicon(const std::string & url); - - /** - * @throws HistoryException on error - */ - void deleteHistory(storage::SQLTransactionScope * transactionScope); - - void deleteHistory(); - - /** - * @throws HistoryException on error - */ - void deleteHistory(const std::string & url, storage::SQLTransactionScope * transactionScope); - - void deleteHistory(const std::string & url); - - /** - * @throws HistoryException on error - */ - std::shared_ptr getHistoryItem(const std::string & url, storage::SQLTransactionScope * transactionScope); - - std::shared_ptr getHistoryItem(const std::string & url); - - /** - * @throws HistoryException on error - */ - HistoryItemVector & getHistoryItems(storage::SQLTransactionScope * transactionScope, int historyDepthInDays, int maxItems); - - HistoryItemVector & getHistoryItems(int historyDepthInDays, int maxItems); - - /** - * @throws HistoryException on error - */ - int getHistoryItemsCount(storage::SQLTransactionScope * transactionScope); - - int getHistoryItemsCount(); - - /** - * @throws HistoryException on error - */ - int getHistoryVisitCounter(const std::string & url, storage::SQLTransactionScope * transactionScope); - - int getHistoryVisitCounter(const std::string & url); - - void init(bool testmode = false); - -private: - config::DefaultConfig config; - std::string DB_HISTORY; - bool m_dbHistoryInitialised; - - HistoryItemVector m_histItems; - /** - * @throws StorageExceptionInitialization on error - */ - void initDatabaseHistory(const std::string & db_str); - - /** - * @throws StorageException on error - */ - std::shared_ptr createHistoryItem(const storage::SQLQuery & query); - - bool m_isInitialized; - -}; - -} -} - -#endif diff --git a/services/StorageService/HistoryStorage.h b/services/StorageService/HistoryStorage.h deleted file mode 100644 index 0e55ff6..0000000 --- a/services/StorageService/HistoryStorage.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __HISTORYSTORAGE_H -#define __HISTORYSTORAGE_H - -#include -#include -#include - -#include "BrowserImage.h" - -///\todo temporary dirty include -#include "../HistoryService/HistoryItem.h" - -namespace tizen_browser -{ -namespace services -{ - -class HistoryStorage -{ -public: - HistoryStorage(); - virtual ~HistoryStorage(); - - /** - * @throws HistoryException on error - */ - virtual void addHistoryItem(std::shared_ptr hi) = 0; - - /** - * If hi->getUrl() exists on a table HISTORY update visit_counter and visit_date, unless insert hi to database. - * - * @throws HistoryException on error - */ - virtual void insertOrRefresh(std::shared_ptr hi) = 0; - - /** - * @throws HistoryException on error - */ - virtual std::shared_ptr getFavicon(const std::string & url) = 0; - - /** - * @throws HistoryException on error - */ - virtual void deleteHistory() = 0; - - /** - * @throws HistoryException on error - */ - virtual void deleteHistory(const std::string & url) = 0; - - /** - * @throws HistoryException on error - */ - virtual std::shared_ptr getHistoryItem(const std::string & url) = 0; - - /** - * @throws HistoryException on error - */ - virtual HistoryItemVector & getHistoryItems(int historyDepthInDays, int maxItems) = 0; - - /** - * @throws HistoryException on error - */ - virtual int getHistoryItemsCount() = 0; - - /** - * @throws HistoryException on error - */ - virtual int getHistoryVisitCounter(const std::string & url) = 0; - -}; - -} -} - -#endif diff --git a/services/StorageService/StorageService.h b/services/StorageService/StorageService.h index 96c2145..ad67a65 100644 --- a/services/StorageService/StorageService.h +++ b/services/StorageService/StorageService.h @@ -23,12 +23,8 @@ #include "service_macros.h" #include "BrowserImage.h" #include "Config.h" -#include "HistorySQLite.h" #include "BookmarksStorage.h" #include "BookmarksSQLite.h" -///\todo temporary dirty include -//#include "HistoryItem.h" -#include "../HistoryService/HistoryItem.h" #define DOMAIN_STORAGE_SERVICE "org.tizen.browser.storageservice" @@ -84,54 +80,6 @@ public: */ static void checkAndCreateTable(storage::SQLTransactionScope * transactionScope, const std::string & tablename, const std::string & ddl); - /** - * @throws HistoryException on error - */ - void addHistoryItem(std::shared_ptr hi); - - /** - * If hi->getUrl() exists on a table HISTORY update visit_counter and visit_date, unless insert hi to database. - * - * @throws HistoryException on error - */ - void insertOrRefresh(std::shared_ptr hi); - - /** - * @throws HistoryException on error - */ - std::shared_ptr getFavicon(const std::string & url); - - /** - * @throws HistoryException on error - */ - void deleteHistory(); - - /** - * @throws HistoryException on error - */ - void deleteHistory(const std::string & url); - - /** - * @throws HistoryException on error - */ - std::shared_ptr getHistoryItem(const std::string & url); - - /** - * @throws HistoryException on error - */ - HistoryItemVector & getHistoryItems(int historyDepthInDays, int maxItems); - - /** - * @throws HistoryException on error - */ - int getHistoryItemsCount(); - - /** - * @throws HistoryException on error - */ - int getHistoryVisitCounter(const std::string & url); - - void init(bool testmode = false); /** @@ -147,9 +95,6 @@ private: */ void initDatabaseSettings(const std::string & db_str); - - void initHistoryService(const std::string & storage, bool testmode); - /** * @throws StorageExceptionInitialization on error */ @@ -159,7 +104,6 @@ private: config::DefaultConfig config; std::string DB_SETTINGS; - std::shared_ptr m_history; // std::shared_ptr m_rssStorage; std::shared_ptr m_bookmarks; diff --git a/services/StorageService/src/HistoryException.cpp b/services/StorageService/src/HistoryException.cpp deleted file mode 100644 index 929fce7..0000000 --- a/services/StorageService/src/HistoryException.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "HistoryException.h" - -namespace tizen_browser -{ -namespace services -{ - -HistoryException::HistoryException(const std::string & message) -{ - this->m_message = message; -} - -HistoryException::~HistoryException() throw () -{ -} - -const char * HistoryException::getMessage() const throw () -{ - return m_message.c_str(); -} - -} -} diff --git a/services/StorageService/src/HistorySQLite.cpp b/services/StorageService/src/HistorySQLite.cpp deleted file mode 100644 index 1b232c9..0000000 --- a/services/StorageService/src/HistorySQLite.cpp +++ /dev/null @@ -1,752 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "HistorySQLite.h" - -#include - -#include "BrowserLogger.h" -#include "DriverManager.h" -#include "Blob.h" -#include "StorageException.h" -#include "StorageExceptionInitialization.h" -#include "HistoryException.h" -#include "EflTools.h" -#include "StorageService.h" - -namespace -{ -// ------ Database FAVICON ------ -const std::string TABLE_FAVICON = "FAVICON"; -//const std::string COL_FAVICON_ID = "id"; -const std::string COL_FAVICON_IMAGE_TYPE = "image_type"; -const std::string COL_FAVICON_WIDTH = "width"; -const std::string COL_FAVICON_HEIGHT = "height"; -const std::string COL_FAVICON_URI_PK = "uri"; - -const std::string COL_FAVICON_FAVICON = "fav_icon"; - -const std::string FAVICON_MODIFIERS = "DEFERRABLE INITIALLY DEFERRED"; - -const std::string DDL_CREATE_TABLE_FAVICON = "CREATE TABLE " + TABLE_FAVICON - + "(" + COL_FAVICON_URI_PK + " TEXT PRIMARY KEY, " - + COL_FAVICON_WIDTH + " INTEGER DEFAULT 0, " - + COL_FAVICON_HEIGHT + " INTEGER DEFAULT 0, " - + COL_FAVICON_IMAGE_TYPE + " INTEGER DEFAULT 0, " - + COL_FAVICON_FAVICON + " BLOB " - + ")"; - -const std::string INSERT_TABLE_FAVICON = "insert into " + TABLE_FAVICON + " (" - + COL_FAVICON_URI_PK + ", " - + COL_FAVICON_WIDTH + ", " - + COL_FAVICON_HEIGHT + ", " - + COL_FAVICON_IMAGE_TYPE + ", " - + COL_FAVICON_FAVICON - + ") values (?, ?, ?, ?, ?)"; - -//const std::string VIRTUAL_COL_FAVICON_ROWID = "rowid"; -//const std::string SELECT_FAVICON_LAST_ID = "SELECT last_insert_rowid() AS " + VIRTUAL_COL_FAVICON_ROWID + " FROM " + TABLE_FAVICON + " LIMIT 1"; -const std::string SELECT_FAVICON_EXISTS = - "select " + COL_FAVICON_URI_PK + " from " + TABLE_FAVICON - + " where " + COL_FAVICON_URI_PK + "=?"; - -const std::string DELETE_ALL_FAVICON = "delete from " + TABLE_FAVICON; -// ------ (end) Database FAVICON ------ - -// ------ Database HISTORY ------ -const std::string TABLE_HISTORY = "HISTORY"; -const std::string COL_HISTORY_URL = "url"; -const std::string COL_HISTORY_TITLE = "title"; -const std::string COL_HISTORY_VISIT_DATE = "visit_date"; -const std::string COL_HISTORY_VISIT_COUNTER = "visit_counter"; -const std::string COL_HISTORY_URI_FK = "uri_fk"; - -// foreign key -//const std::string COL_HISTORY_FAVICON_ID_FK = "favicon_id_fk"; - - -const std::string DDL_CREATE_TABLE_HISTORY = "CREATE TABLE " + TABLE_HISTORY - + "(" + COL_HISTORY_URL + " TEXT PRIMARY KEY, " - + COL_HISTORY_TITLE + " TEXT, " - + COL_HISTORY_VISIT_DATE + " DATETIME DEFAULT (datetime('now', 'localtime')), " - + COL_HISTORY_VISIT_COUNTER + " INTEGER DEFAULT 1, " - + COL_HISTORY_URI_FK + " TEXT REFERENCES " + TABLE_FAVICON + "(" + COL_FAVICON_URI_PK + ") " - + FAVICON_MODIFIERS - + ")"; - -const std::string INSERT_TABLE_HISTORY = "insert or replace into " + TABLE_HISTORY + " (" - + COL_HISTORY_URL + ", " - + COL_HISTORY_TITLE + ", " - + COL_HISTORY_VISIT_DATE + ", " - + COL_HISTORY_VISIT_COUNTER + ", " - + COL_HISTORY_URI_FK - + ") values (?,?,?,?,?)"; - -const std::string INSERT_TABLE_HISTORY_DEFAULT_VALUES = "insert or replace into " + TABLE_HISTORY + " (" - + COL_HISTORY_URL + ", " - + COL_HISTORY_TITLE + ", " - + COL_HISTORY_URI_FK - + ") values (?,?,?)"; - -const std::string VIRTUAL_COL_HISTORY_AMOUNT = "amount"; -const std::string SELECT_HISTORY_COUNT_ID = "select count(*) as " + VIRTUAL_COL_HISTORY_AMOUNT + " from " + TABLE_HISTORY; -const std::string SELECT_HISTORY_VISIT_COUNTER = "select " + COL_HISTORY_VISIT_COUNTER + " from " + TABLE_HISTORY + " where " + COL_HISTORY_URL + "=?"; - -const std::string DELETE_HISTORY_ITEM = "delete from " + TABLE_HISTORY + " where " + COL_HISTORY_URL + "=?"; -const std::string DELETE_ALL_HISTORY = "delete from " + TABLE_HISTORY; - -const std::string UPDATE_HISTORY_ITEM_COUNTER_DATE = - "update HISTORY set visit_counter=visit_counter+1, visit_date=(datetime('now', 'localtime')) where url=?"; - -// ------ (end) Database HISTORY ------ - -const std::string SELECT_FAVICON = - "select f." + COL_FAVICON_FAVICON + " as " + COL_FAVICON_FAVICON + "," - + "f." + COL_FAVICON_WIDTH + " as " + COL_FAVICON_WIDTH + "," - + "f." + COL_FAVICON_HEIGHT + " as " + COL_FAVICON_HEIGHT + "," - + "f." + COL_FAVICON_IMAGE_TYPE + " as " + COL_FAVICON_IMAGE_TYPE - + " from " - + TABLE_FAVICON + " f, " + TABLE_HISTORY + " h" - + " where f." + COL_FAVICON_URI_PK + "=h." + COL_HISTORY_URI_FK - + " and " + COL_HISTORY_URL + "=?"; - -const int SELECT_FAVICON_FAVICON = 0; -const int SELECT_FAVICON_WIDTH = 1; -const int SELECT_FAVICON_HEIGHT = 2; -const int SELECT_FAVICON_IMAGE_TYPE = 3; - -const std::string SELECT_FULL_HISTORY_ALL_ROW = - "select f." + COL_FAVICON_FAVICON + " as " + COL_FAVICON_FAVICON - + ", f." + COL_FAVICON_WIDTH + " as " + COL_FAVICON_WIDTH - + ", f." + COL_FAVICON_HEIGHT + " as " + COL_FAVICON_HEIGHT - + ", f." + COL_FAVICON_IMAGE_TYPE + " as " + COL_FAVICON_IMAGE_TYPE - + ", h." + COL_HISTORY_URL + " as " + COL_HISTORY_URL - + ", h." + COL_HISTORY_TITLE + " as " + COL_HISTORY_TITLE - + ", h." + COL_HISTORY_VISIT_DATE + " as " + COL_HISTORY_VISIT_DATE - + ", h." + COL_HISTORY_VISIT_COUNTER + " as " + COL_HISTORY_VISIT_COUNTER - + ", h." + COL_HISTORY_URI_FK + " as " + COL_HISTORY_URI_FK - + " from " - + TABLE_HISTORY + " h left outer join " + TABLE_FAVICON + " f" - + " on f." + COL_FAVICON_URI_PK + "=h." + COL_HISTORY_URI_FK; - -const int SELECT_FULL_HISTORY_ALL_ROW_URL = 4; -const int SELECT_FULL_HISTORY_FAVICON = 0; -const int SELECT_FULL_HISTORY_FAVICON_IMAGE_TYPE = 3; -const int SELECT_FULL_HISTORY_FAVICON_WIDTH = 1; -const int SELECT_FULL_HISTORY_FAVICON_HEIGHT = 2; -const int SELECT_FULL_HISTORY_TITLE = 5; -const int SELECT_FULL_HISTORY_VISIT_DATE = 6; -const int SELECT_FULL_HISTORY_VISIT_COUNTER = 7; -const int SELECT_FULL_HISTORY_URI_FK = 8; - -const std::string SELECT_HISTORY_BY_URL = - SELECT_FULL_HISTORY_ALL_ROW - + " where " + COL_HISTORY_URL + "=?"; - -} - - -namespace tizen_browser -{ -namespace services -{ - -HistorySQLite::HistorySQLite() - : m_dbHistoryInitialised(false) - , m_histItems() - , m_isInitialized(false) -{ -} - - -HistorySQLite::~HistorySQLite() -{ -} - -void HistorySQLite::init(bool testmode) -{ - if (m_isInitialized) { - return; - } - - config.load("whatever"); - - std::string resourceDbDir; - std::string dbHistory; - - if (!testmode) { - resourceDbDir = boost::any_cast < std::string > (config.get("resourcedb/dir")); - dbHistory = boost::any_cast < std::string > (config.get("DB_HISTORY")); - } else { - resourceDbDir = boost::any_cast < std::string > (config.get("resourcedb/dir")); - dbHistory = "history_test.db"; - } - - DB_HISTORY = resourceDbDir + dbHistory; - - try { - initDatabaseHistory(DB_HISTORY); - m_isInitialized = true; - } catch (storage::StorageExceptionInitialization & e) { - BROWSER_LOGE("Cannot initialize database: %s!", DB_HISTORY.c_str()); - } - -} - -std::string message(const std::string & text, int errcode, const std::string & errMsg) -{ - return text + std::to_string(errcode) + "; " + errMsg; -} - - -//void History::addHistoryItem( -// const std::string & url, -// const std::string & title, -// std::shared_ptr image, -// tizen_browser::tools::BrowserImage::ImageType outputImageType) -//{ -//} - -void HistorySQLite::addHistoryItem(std::shared_ptr hi) -{ - storage::SQLTransactionScope scope(storage::DriverManager::getDatabase(DB_HISTORY)); - addHistoryItem(hi, &scope); -} - -/** - * @throws HistoryException on error - */ -void HistorySQLite::addHistoryItem(std::shared_ptr hi, storage::SQLTransactionScope * transactionScope) -{ - BROWSER_LOGI("History::addHistoryItem begin"); - - std::unique_ptr blob; - if (hi->getFavIcon()) { - if (tizen_browser::tools::BrowserImage::ImageTypePNG == hi->getFavIcon()->imageType) { - blob = tizen_browser::tools::EflTools::getBlobPNG(hi->getFavIcon()); - } else { - std::vector < uint8_t > rawImageData = tizen_browser::tools::EflTools::rawEvasImageData(hi->getFavIcon()); - blob = std::unique_ptr(new tizen_browser::tools::Blob(rawImageData.data(), rawImageData.size())); - } - } - std::shared_ptr conIns = transactionScope->database(); - try { - storage::SQLQuery select(conIns->prepare(SELECT_FAVICON_EXISTS)); - select.bindText(1, hi->getUrl()); - select.exec(); - - if (!select.hasNext() && blob) { - BROWSER_LOGI("Favicon URI=%s - not found. Adding to database...", hi->getUriFavicon().c_str()); - storage::SQLQuery insertFavIcon(conIns->prepare(INSERT_TABLE_FAVICON)); - insertFavIcon.bindText(1, hi->getUrl()); - insertFavIcon.bindInt(2, hi->getFavIcon()->width); - insertFavIcon.bindInt(3, hi->getFavIcon()->height); - insertFavIcon.bindInt(4, hi->getFavIcon()->imageType); - insertFavIcon.bindBlob(5, std::move(blob)); - insertFavIcon.exec(); - BROWSER_LOGI("Favicon added"); - BROWSER_LOGI("History item: url: %s", hi->getUriFavicon().c_str()); - } else { - BROWSER_LOGI("Favicon URI=%s was found.", hi->getUriFavicon().c_str()); - } - - BROWSER_LOGI("A new record will be added to a table %s", TABLE_HISTORY.c_str()); - - storage::SQLQuery insertHist(conIns->prepare(INSERT_TABLE_HISTORY_DEFAULT_VALUES)); - insertHist.bindText(1, hi->getUrl()); - insertHist.bindText(2, hi->getTitle()); - insertHist.bindText(3, hi->getUrl()); - insertHist.exec(); - - BROWSER_LOGI("History::addHistoryItem - commited"); - } catch (storage::StorageException & e) { - BROWSER_LOGE("Cannot add a history item (url='%s', title='%s'): %s", - hi->getUrl().c_str(), hi->getTitle().c_str(), e.getMessage()); - - std::string msg = message("SQLite error (code = ", e.getErrorCode(), e.getMessage()); - - throw HistoryException(msg); - } - - BROWSER_LOGI("History::addHistoryItem end"); -} - - -/** - * If hi->getUrl() exists on a table HISTORY update visit_counter and visit_date, unless insert hi to database. - * - * @throws HistoryException on error - */ - -void HistorySQLite::insertOrRefresh(std::shared_ptr hi) -{ - storage::SQLTransactionScope scope(storage::DriverManager::getDatabase(DB_HISTORY)); - insertOrRefresh(hi, &scope); -} - -void HistorySQLite::insertOrRefresh(std::shared_ptr hi, storage::SQLTransactionScope * transactionScope) -{ - BROWSER_LOGI("History::insertOrRefresh begin"); - - - M_ASSERT(hi); - - std::shared_ptr con = transactionScope->database(); - - bool isUpdate = false; - - try { - storage::SQLQuery select(con->prepare(SELECT_HISTORY_VISIT_COUNTER)); - select.bindText(1, hi->getUrl()); - select.exec(); - - if (select.hasNext()) { - storage::SQLQuery update(con->prepare(UPDATE_HISTORY_ITEM_COUNTER_DATE)); - update.bindText(1, hi->getUrl()); - update.exec(); - isUpdate = true; - BROWSER_LOGI("visit_counter and visit_date has been updated"); - - } - - BROWSER_LOGI("[%s] - commited", __func__); - } catch (storage::StorageException & e) { - std::string msg = message("SQLite error (code = ", e.getErrorCode(), e.getMessage()); - - BROWSER_LOGE("%s - exception: %s", __PRETTY_FUNCTION__, msg.c_str()); - - throw HistoryException(msg); - } - - if (!isUpdate) { - addHistoryItem(hi, transactionScope); - BROWSER_LOGI("New HistoryItem object has been added."); - - } - - BROWSER_LOGI("History::insertOrRefresh end"); -} - -/** - * ... or just (better) use getHistoryItem method - * @throws HistoryException on error - */ -std::shared_ptr HistorySQLite::getFavicon(const std::string & url) -{ - storage::SQLTransactionScope scope(storage::DriverManager::getDatabase(DB_HISTORY)); - return getFavicon(url, &scope); -} - -std::shared_ptr HistorySQLite::getFavicon(const std::string & url, storage::SQLTransactionScope * transactionScope) -{ - BROWSER_LOGI("History::getFavicon begin"); - - std::shared_ptr rsBlob = std::make_shared(); - std::shared_ptr bi - = std::make_shared(); - - auto imageType = tizen_browser::tools::BrowserImage::ImageTypeNoImage; - - auto con = transactionScope->database(); - - try { - storage::SQLQuery select(con->prepare(SELECT_FAVICON)); - select.bindText(1, url); - select.exec(); - - if (select.hasNext()) { - rsBlob = select.getBlob(SELECT_FAVICON_FAVICON); - if (rsBlob.get()) { - bi->width = select.getInt(SELECT_FAVICON_WIDTH); - bi->height = select.getInt(SELECT_FAVICON_HEIGHT); - const auto autoimageType = select.getInt(SELECT_FAVICON_IMAGE_TYPE); - bi->imageType = static_cast(autoimageType); - if(rsBlob->getLength() > 0 ){ - bi->dataSize = rsBlob->transferData(&bi->imageData); - } else { - bi->dataSize = 0; - bi->imageData = 0; - } - BROWSER_LOGI("History::getFavicon - commited"); - } else { - BROWSER_LOGW("History::getFavicon - empty blob"); - } - } else { - BROWSER_LOGW("Can't find a favicon (url=%s)", url.c_str()); - } - - BROWSER_LOGI("History::getFavicon - commited"); - } catch (storage::StorageException & e) { - std::string msg = message("SQLite error (code = ", e.getErrorCode(), e.getMessage()); - - BROWSER_LOGE("%s - exception: %s", __PRETTY_FUNCTION__, msg.c_str()); - - throw HistoryException(msg.c_str()); - } - - BROWSER_LOGI("History::getFavicon end"); - - return bi; -} - -/** - * @throws HistoryException on error - */ -void HistorySQLite::deleteHistory() -{ - storage::SQLTransactionScope scope(storage::DriverManager::getDatabase(DB_HISTORY)); - deleteHistory(&scope); -} - -void HistorySQLite::deleteHistory(storage::SQLTransactionScope * transactionScope) -{ - BROWSER_LOGI("History::deleteHistory begin"); - - std::shared_ptr con = transactionScope->database(); - - try { - con->exec(DELETE_ALL_HISTORY); - con->exec(DELETE_ALL_FAVICON); - - BROWSER_LOGI("History::deleteHistory - commited"); - } catch (storage::StorageException & e) { - std::string msg = message("SQLite error (code = ", e.getErrorCode(), e.getMessage()); - - throw HistoryException(msg.c_str()); - } - m_histItems.clear(); - - BROWSER_LOGI("History::deleteHistory end"); -} - -/** - * @throws HistoryException on error - */ -void HistorySQLite::deleteHistory(const std::string & url) -{ - storage::SQLTransactionScope scope(storage::DriverManager::getDatabase(DB_HISTORY)); - deleteHistory(url, &scope); -} - -void HistorySQLite::deleteHistory(const std::string & url, storage::SQLTransactionScope * transactionScope) -{ - BROWSER_LOGI("History::deleteHistory (url: %s) - begin", url.c_str()); - - std::shared_ptr con = transactionScope->database(); - - try { - storage::SQLQuery deleteQuery(con->prepare(DELETE_HISTORY_ITEM)); - - deleteQuery.bindText(1, url); - deleteQuery.exec(); - - // consider delete a corresponding record from a table FAVICON if dangling - - BROWSER_LOGI("History::deleteHistory (url: %s) - commited", url.c_str()); - } catch (storage::StorageException & e) { - std::string msg = message("SQLite error (code = ", e.getErrorCode(), e.getMessage()); - - BROWSER_LOGE("%s - exception: %s", __PRETTY_FUNCTION__, msg.c_str()); - - throw HistoryException(msg.c_str()); - } - - for (HistoryItemVector::iterator it(m_histItems.begin()), end(m_histItems.end()); it != end; ++it) { - if ((*it)->getUrl() == url) { - m_histItems.erase(it); - break; - } - } - - BROWSER_LOGI("History::deleteHistory (url: %s) - end", url.c_str()); -} - -/** - * @throws StorageException on error - */ -/*private*/ std::shared_ptr HistorySQLite::createHistoryItem(const storage::SQLQuery & query) -{ - BROWSER_LOGI("History::createHistoryItem begin"); - - std::shared_ptr hi; - - try { - int len = 0; - std::shared_ptr rsBlob = std::make_shared(); - auto imageType = tizen_browser::tools::BrowserImage::ImageTypeNoImage; - - std::shared_ptr bi = std::make_shared(); - - std::string url = query.getString(SELECT_FULL_HISTORY_ALL_ROW_URL); - - hi = std::make_shared(url); - hi->setUrl(url); - hi->setTitle(query.getString(SELECT_FULL_HISTORY_TITLE)); - - std::string strVisitDate = query.getString(SELECT_FULL_HISTORY_VISIT_DATE); - BROWSER_LOGD("[%s:%d] VD!!!! %s", __PRETTY_FUNCTION__, __LINE__, strVisitDate.c_str()); - boost::posix_time::ptime visitDate = boost::posix_time::time_from_string(strVisitDate); - - BROWSER_LOGD("%s:%d\n", __FILE__, __LINE__); - - hi->setLastVisit(visitDate); - hi->setVisitCounter(query.getInt(SELECT_FULL_HISTORY_VISIT_COUNTER)); - hi->setUriFavicon(query.getString(SELECT_FULL_HISTORY_URI_FK)); - - rsBlob = query.getBlob(SELECT_FULL_HISTORY_FAVICON); - if (rsBlob.get()) { - const auto autoimageType = query.getInt(SELECT_FULL_HISTORY_FAVICON_IMAGE_TYPE); - imageType = static_cast(autoimageType); - - bi->imageType = imageType; - bi->width = query.getInt(SELECT_FULL_HISTORY_FAVICON_WIDTH); - bi->height = query.getInt(SELECT_FULL_HISTORY_FAVICON_HEIGHT); - bi->url = url; - - len = rsBlob->getLength(); - BROWSER_LOGI("History::createHistoryItem. I've got an icon. Length = %d, url = %s", len, url.c_str()); - } - - if (len > 0) { - bi->dataSize = rsBlob->transferData(&bi->imageData); - } else { - bi = std::make_shared(); - bi->imageData = NULL; - bi->dataSize = 0; - } - - if (bi.get()) { - hi->setFavIcon(bi); - } - - BROWSER_LOGI("Favicon uri: %s, visit_date: %s, title: %s", hi->getUriFavicon().c_str(), strVisitDate.c_str(), query.getString(SELECT_FULL_HISTORY_TITLE).c_str()); - } catch (storage::StorageException & e) { - std::string msg = message("SQLite error (code = ", e.getErrorCode(), e.getMessage()); - - BROWSER_LOGE("%s - exception: %s", __PRETTY_FUNCTION__, msg.c_str()); - - throw; - } - - BROWSER_LOGI("History::createHistoryItem end"); - - return hi; -} - -/** - * @throws HistoryException on error - */ -std::shared_ptr HistorySQLite::getHistoryItem(const std::string & url) -{ - storage::SQLTransactionScope scope(storage::DriverManager::getDatabase(DB_HISTORY)); - return getHistoryItem(url, &scope); -} - -std::shared_ptr HistorySQLite::getHistoryItem(const std::string & url, storage::SQLTransactionScope * transactionScope) -{ - BROWSER_LOGI("History::getHistoryItem begin"); - - std::shared_ptr hi; - - std::shared_ptr con = transactionScope->database(); - - try { - storage::SQLQuery select(con->prepare(SELECT_HISTORY_BY_URL)); - select.bindText(1, url); - select.exec(); - - if (select.hasNext()) { - hi = createHistoryItem(select); - } else { - BROWSER_LOGI("No records found for url %s.\n%s\n", url.c_str(), SELECT_HISTORY_BY_URL.c_str()); - hi = std::shared_ptr(new HistoryItem(url)); - } - - BROWSER_LOGI("History::getHistoryItem - commited"); - } catch (storage::StorageException & e) { - std::string msg = message("SQLite error (code = ", e.getErrorCode(), e.getMessage()); - - BROWSER_LOGE("%s - exception: %s", __PRETTY_FUNCTION__, msg.c_str()); - - throw HistoryException(msg.c_str()); - } - - BROWSER_LOGI("History::getHistoryItem end"); - return hi; -} - -/** - * @throws HistoryException on error - */ -HistoryItemVector & HistorySQLite::getHistoryItems(int historyDepthInDays, int maxItems) -{ - storage::SQLTransactionScope scope(storage::DriverManager::getDatabase(DB_HISTORY)); - return getHistoryItems(&scope, historyDepthInDays, maxItems); -} - -HistoryItemVector & HistorySQLite::getHistoryItems(storage::SQLTransactionScope * transactionScope, int historyDepthInDays, int maxItems) -{ - BROWSER_LOGI("History::getHistoryItems begin"); - m_histItems.clear(); - std::shared_ptr con = transactionScope->database(); - - const std::string historyNotOlderThan = COL_HISTORY_VISIT_DATE + ">=date('now','-" + std::to_string(historyDepthInDays) + " day')"; - const std::string historyItemsLimit = std::to_string(maxItems); - - const std::string SQL = SELECT_FULL_HISTORY_ALL_ROW + - " and " + historyNotOlderThan + - " order by " + COL_HISTORY_VISIT_DATE + - " desc limit " + historyItemsLimit; - - try { - storage::SQLQuery select(con->prepare(SQL)); - select.exec(); - - while (select.hasNext()) { - std::shared_ptr hi = createHistoryItem(select); - m_histItems.push_back(hi); - select.next(); - - } - BROWSER_LOGI("History::getHistoryItems - commited"); - } catch (storage::StorageException & e) { - std::string msg = message("SQLite error (code = ", e.getErrorCode(), e.getMessage()); - - BROWSER_LOGE("%s - exception: %s", __PRETTY_FUNCTION__, msg.c_str()); - - throw HistoryException(msg.c_str()); - } - - BROWSER_LOGI("History::getHistoryItems end"); - return m_histItems; -} - -/** - * @throws HistoryException on error - */ -int HistorySQLite::getHistoryItemsCount() -{ - storage::SQLTransactionScope scope(storage::DriverManager::getDatabase(DB_HISTORY)); - return getHistoryItemsCount(&scope); -} - -int HistorySQLite::getHistoryItemsCount(storage::SQLTransactionScope * transactionScope) -{ - BROWSER_LOGI("History::getHistoryItemsAmount begin"); - - int res = 0; - - std::shared_ptr con = transactionScope->database(); - - try { - storage::SQLQuery select(con->prepare(SELECT_HISTORY_COUNT_ID)); - select.exec(); - - bool isRecord = select.hasNext(); - - (void)isRecord; - M_ASSERT(isRecord); - - res = select.getInt(0); - - BROWSER_LOGI("History::getHistoryItemsAmount - commited"); - } catch (storage::StorageException & e) { - std::string msg = message("SQLite error (code = ", e.getErrorCode(), e.getMessage()); - - BROWSER_LOGE("%s - exception: %s", __PRETTY_FUNCTION__, msg.c_str()); - - throw HistoryException(msg.c_str()); - } - - BROWSER_LOGI("History::getHistoryItemsAmount end"); - - return res; -} - -/** - * @throws HistoryException on error - */ -int HistorySQLite::getHistoryVisitCounter(const std::string & url) -{ - storage::SQLTransactionScope scope(storage::DriverManager::getDatabase(DB_HISTORY)); - return getHistoryVisitCounter(url, &scope); -} - -int HistorySQLite::getHistoryVisitCounter(const std::string & url, storage::SQLTransactionScope * transactionScope) -{ - BROWSER_LOGI("History::getHistoryVisitCounter begin"); - - int res = 0; - - std::shared_ptr con = transactionScope->database(); - - try { - storage::SQLQuery select(con->prepare(SELECT_HISTORY_VISIT_COUNTER)); - select.bindText(1, url); - select.exec(); - - if (select.hasNext()) { - res = select.getInt(0); - } else { - res = -1; // no record was found - } - - BROWSER_LOGI("History::getHistoryVisitCounter - commited"); - } catch (storage::StorageException & e) { - std::string msg = message("SQLite error (code = ", e.getErrorCode(), e.getMessage()); - - BROWSER_LOGE("%s - exception: %s", __PRETTY_FUNCTION__, msg.c_str()); - - throw HistoryException(msg.c_str()); - } - - BROWSER_LOGI("History::getHistoryVisitCounter end"); - - return res; -} - -/** - * @throws StorageExceptionInitialization on error - */ -void HistorySQLite::initDatabaseHistory(const std::string & db_str) -{ - BROWSER_LOGI("History::initDatabaseHistory begin"); - - if (!m_dbHistoryInitialised) { - storage::SQLTransactionScope scope(storage::DriverManager::getDatabase(db_str)); - - try { - StorageService::checkAndCreateTable(&scope, TABLE_FAVICON, DDL_CREATE_TABLE_FAVICON); - StorageService::checkAndCreateTable(&scope, TABLE_HISTORY, DDL_CREATE_TABLE_HISTORY); - - BROWSER_LOGI("History::initDatabaseHistory - done"); - } catch (storage::StorageException & e) { - BROWSER_LOGE("[ERROR] History::initDatabaseHistory (error code - %d): %s", e.getErrorCode(), e.getMessage()); - throw storage::StorageExceptionInitialization(e.getMessage(), - e.getErrorCode()); - } - - m_dbHistoryInitialised = true; - } - - M_ASSERT(m_dbHistoryInitialised); - - BROWSER_LOGI("History::initDatabaseHistory end"); -} - -} -} - diff --git a/services/StorageService/src/HistoryStorage.cpp b/services/StorageService/src/HistoryStorage.cpp deleted file mode 100644 index 88983b6..0000000 --- a/services/StorageService/src/HistoryStorage.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "HistoryStorage.h" - -namespace tizen_browser -{ -namespace services -{ - -HistoryStorage::HistoryStorage() -{ -} - - -HistoryStorage::~HistoryStorage() -{ -} - - -} -} diff --git a/services/StorageService/src/StorageService.cpp b/services/StorageService/src/StorageService.cpp index e5ba582..45930d4 100644 --- a/services/StorageService/src/StorageService.cpp +++ b/services/StorageService/src/StorageService.cpp @@ -114,8 +114,6 @@ void StorageService::init(bool testmode) BROWSER_LOGE("Cannot initialize database %s!", DB_SETTINGS.c_str()); } - initHistoryService("SQLITE", testmode); - m_isInitialized = true; } @@ -290,102 +288,5 @@ void StorageService::setSettingsString(const std::string & key, std::string valu setSettingsValue(key, field); } -/** - * @throws HistoryException on error - */ -void StorageService::addHistoryItem(std::shared_ptr hi) -{ - M_ASSERT(m_history); - m_history->addHistoryItem(hi); -} - -/** - * If hi->getUrl() exists on a table HISTORY update visit_counter and visit_date, unless insert hi to database. - * - * @throws HistoryException on error - */ -void StorageService::insertOrRefresh(std::shared_ptr hi) -{ - M_ASSERT(m_history); - m_history->insertOrRefresh(hi); -} - -/** - * @throws HistoryException on error - */ -std::shared_ptr StorageService::getFavicon(const std::string & url) -{ - M_ASSERT(m_history); - return m_history->getFavicon(url); -} - -/** - * @throws HistoryException on error - */ -void StorageService::deleteHistory() -{ - M_ASSERT(m_history); - m_history->deleteHistory(); -} - -/** - * @throws HistoryException on error - */ -void StorageService::deleteHistory(const std::string & url) -{ - M_ASSERT(m_history); - m_history->deleteHistory(url); -} - -/** - * @throws HistoryException on error - */ -std::shared_ptr StorageService::getHistoryItem(const std::string & url) -{ - M_ASSERT(m_history); - return m_history->getHistoryItem(url); -} - -/** - * @throws HistoryException on error - */ -HistoryItemVector & StorageService::getHistoryItems(int historyDepthInDays, int maxItems) -{ - M_ASSERT(m_history); - return m_history->getHistoryItems(historyDepthInDays, maxItems); -} - -/** - * @throws HistoryException on error - */ -int StorageService::getHistoryItemsCount() -{ - M_ASSERT(m_history); - return m_history->getHistoryItemsCount(); -} - -/** - * @throws HistoryException on error - */ -int StorageService::getHistoryVisitCounter(const std::string & url) -{ - M_ASSERT(m_history); - return m_history->getHistoryVisitCounter(url); -} - -void StorageService::initHistoryService(const std::string & storage, bool testmode) -{ - // Depend on "storage" variable use an appropriate class as a storage. By default it's a HistorySQLite class. - if (m_history.get() == NULL) { - if (storage.compare("SQLITE") == 0) { - m_history = std::make_shared(); - m_history->init(testmode); - } - } -} - - - - } } -- 2.7.4 From a86c19d6af72a1abdb05a2ca61e19e18a485d1d2 Mon Sep 17 00:00:00 2001 From: Maciej Skrzypkowski Date: Tue, 8 Sep 2015 10:27:34 +0200 Subject: [PATCH 10/16] Switching between mobile/desktop mode per tab. [Issue#] https://bugs.tizen.org/jira/browse/TT-132 [Problem] View mode was set as global flag. [Cause] N/A [Solution] Added flag for each tab to remeber current mode. [Verify] Open new tab (google.com), open settings, switch to mobile mode, page should reload in mobile view. Change-Id: I19a6f1965938930b45f46b076ce030f2fe9c10ed Signed-off-by: Maciej Skrzypkowski --- core/AbstractWebEngine/AbstractWebEngine.h | 18 ++++++--- services/MainUI/DetailPopup.cpp | 7 +++- services/MainUI/DetailPopup.h | 2 +- services/MainUI/MainUI.cpp | 26 ++++++++----- services/MainUI/MainUI.h | 11 ++++-- services/MoreMenuUI/MoreMenuUI.cpp | 30 +++++++-------- services/MoreMenuUI/MoreMenuUI.h | 10 ++--- services/SimpleUI/SimpleUI.cpp | 44 ++++++++++++++-------- services/SimpleUI/SimpleUI.h | 8 ++-- .../WebKitEngineService/WebKitEngineService.cpp | 29 +++++++------- services/WebKitEngineService/WebKitEngineService.h | 9 ++--- services/WebKitEngineService/WebView.cpp | 21 +++++++---- services/WebKitEngineService/WebView.h | 17 ++++++--- 13 files changed, 137 insertions(+), 95 deletions(-) diff --git a/core/AbstractWebEngine/AbstractWebEngine.h b/core/AbstractWebEngine/AbstractWebEngine.h index 8416229..ea0e663 100644 --- a/core/AbstractWebEngine/AbstractWebEngine.h +++ b/core/AbstractWebEngine/AbstractWebEngine.h @@ -132,9 +132,10 @@ public: /** * Adds new tab * @param uri if not empty opens specified uri + * @param desktopMode true if desktop mode, false if mobile mode * @return TabId of created tab */ - virtual TabId addTab(const std::string & uri = std::string(), const TabId * openerId = NULL) = 0; + virtual TabId addTab(const std::string & uri = std::string(), const TabId * openerId = NULL, bool desktopMode = true) = 0; /** * @param tab id @@ -257,14 +258,21 @@ public: virtual void backButtonClicked() const = 0; /** - * @brief Switch view to mobile + * @brief Switch current view to mobile mode */ - virtual void switchToMobileView() = 0; + virtual void switchToMobileMode() = 0; /** - * @brief Switch view to desktop + * @brief Switch current view to desktop mode */ - virtual void switchToDesktopView() = 0; + virtual void switchToDesktopMode() = 0; + + /** + * @brief Check if desktop mode is enabled for current view + * + * @return true if desktop mode is enabled + */ + virtual bool isDesktopMode() const = 0; /** * FavIcon of current page changed diff --git a/services/MainUI/DetailPopup.cpp b/services/MainUI/DetailPopup.cpp index f3d2ced..4aa5604 100644 --- a/services/MainUI/DetailPopup.cpp +++ b/services/MainUI/DetailPopup.cpp @@ -75,7 +75,6 @@ void DetailPopup::createLayout(Evas_Object *parent) evas_object_show(m_layout); } - void DetailPopup::show(Evas_Object *parent, std::shared_ptr currItem, std::shared_ptr prevItems) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); @@ -86,6 +85,10 @@ void DetailPopup::show(Evas_Object *parent, std::shared_ptr(data); dp->hide(); - dp->m_mainUI->openURLInNewTab(dp->m_item); + dp->openURLInNewTab(dp->m_item, dp->m_mainUI->isDesktopMode()); } char* DetailPopup::_get_history_link_text(void* data, Evas_Object* obj, const char* part) diff --git a/services/MainUI/DetailPopup.h b/services/MainUI/DetailPopup.h index 8d24a51..1ad8a02 100644 --- a/services/MainUI/DetailPopup.h +++ b/services/MainUI/DetailPopup.h @@ -38,7 +38,7 @@ namespace base_ui{ */ void show(Evas_Object *parent, std::shared_ptr currItem, std::shared_ptr prevItems); - boost::signals2::signal)> openURLInNewTab; + boost::signals2::signal, bool)> openURLInNewTab; static const int HISTORY_ITEMS_NO; private: diff --git a/services/MainUI/MainUI.cpp b/services/MainUI/MainUI.cpp index 74a2c52..6dbdbbc 100644 --- a/services/MainUI/MainUI.cpp +++ b/services/MainUI/MainUI.cpp @@ -130,6 +130,7 @@ void MainUI::show(Evas_Object* parent) Evas_Object* MainUI::createQuickAccessLayout(Evas_Object* parent) { BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + m_desktopMode = true; Evas_Object* layout = elm_layout_add(parent); evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -429,16 +430,6 @@ Evas_Object * MainUI::_grid_bookmark_content_get(void *data, Evas_Object *obj, c return nullptr; } - -void MainUI::_itemSelected(void * data, Evas_Object * /* obj */, void * event_info) -{ - Elm_Object_Item * selected = reinterpret_cast(event_info); - HistoryItemData * itemData = reinterpret_cast(elm_object_item_data_get(selected)); - MainUI * self = reinterpret_cast(data); - - self->openURLInNewTab(itemData->item); -} - void MainUI::_thumbSelected(void * data, Evas_Object * /* obj */, void * /* event_info */) { HistoryItemData * itemData = reinterpret_cast(data); @@ -544,5 +535,20 @@ void MainUI::setEmptyView(bool empty) } } +bool MainUI::isDesktopMode() const +{ + return m_desktopMode; +} + +void MainUI::setDesktopMode(bool mode) +{ + m_desktopMode = mode; +} + +DetailPopup& MainUI::getDetailPopup() +{ + return m_detailPopup; +} + } } diff --git a/services/MainUI/MainUI.h b/services/MainUI/MainUI.h index 352051d..667a844 100644 --- a/services/MainUI/MainUI.h +++ b/services/MainUI/MainUI.h @@ -49,13 +49,15 @@ public: void showBookmarks(); void clearItems(); void openDetailPopup(std::shared_ptr currItem, std::shared_ptr prevItems); + bool isDesktopMode() const; + void setDesktopMode(bool mode); + DetailPopup & getDetailPopup(); void addHistoryItem(std::shared_ptr); void addHistoryItems(std::shared_ptr); void addBookmarkItem(std::shared_ptr); void addBookmarkItems(std::vector >); - boost::signals2::signal)> openURLInNewTab; boost::signals2::signal, int)> mostVisitedTileClicked; boost::signals2::signal mostVisitedClicked; boost::signals2::signal bookmarkClicked; @@ -63,8 +65,8 @@ public: static const int MAX_TILE_WIDTH; static const int MAX_TILE_HEIGHT; -private: +private: void createItemClasses(); Evas_Object* createQuickAccessLayout(Evas_Object *parent); @@ -82,11 +84,12 @@ private: static void _thumbSelected(void * data, Evas_Object * obj, void * event_info); static void _deleteBookmark(void *data, Evas_Object *obj, void *event_info); void setEmptyView(bool empty); + void showNoHistoryLabel(); static void _mostVisited_clicked(void * data, Evas_Object * obj, void * event_info); static void _bookmark_clicked(void * data, Evas_Object * obj, void * event_info); static void _bookmark_manager_clicked(void * data, Evas_Object * obj, void * event_info); -private: + Evas_Object *m_parent; Evas_Object *m_layout; Evas_Object *m_bookmarksView; @@ -107,7 +110,7 @@ private: std::map m_map_bookmark_views; bool m_gengridSetup; std::string edjFilePath; - void showNoHistoryLabel(); + bool m_desktopMode; }; } diff --git a/services/MoreMenuUI/MoreMenuUI.cpp b/services/MoreMenuUI/MoreMenuUI.cpp index 8279289..088ae44 100644 --- a/services/MoreMenuUI/MoreMenuUI.cpp +++ b/services/MoreMenuUI/MoreMenuUI.cpp @@ -48,7 +48,7 @@ MoreMenuUI::MoreMenuUI() : m_gengrid(NULL) , m_parent(NULL) , m_item_class(NULL) - , m_desktopView(true) + , m_desktopMode(true) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); m_edjFilePath = EDJE_DIR; @@ -59,10 +59,11 @@ MoreMenuUI::~MoreMenuUI() { } -void MoreMenuUI::show(Evas_Object* parent) +void MoreMenuUI::show(Evas_Object* parent, bool desktopMode) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); m_parent = parent; + m_desktopMode = desktopMode; elm_theme_extension_add(NULL, m_edjFilePath.c_str()); m_mm_layout = elm_layout_add(parent); elm_layout_file_set(m_mm_layout, m_edjFilePath.c_str(), "moremenu-layout"); @@ -234,9 +235,9 @@ void MoreMenuUI::addItems() for (int i = 0; i <= EXIT_BROWSER; i++) { ItemType type = static_cast(i); // take proper image for desktop/mobile view - if (type == ItemType::VIEW_DESKTOP_WEB && m_desktopView) + if (type == ItemType::VIEW_DESKTOP_WEB && m_desktopMode) continue; - if (type == ItemType::VIEW_MOBILE_WEB && !m_desktopView) + if (type == ItemType::VIEW_MOBILE_WEB && !m_desktopMode) continue; MoreMenuItemData *itemData = new MoreMenuItemData(); @@ -441,14 +442,16 @@ void MoreMenuUI::_thumbSelected(void* data, Evas_Object*, void*) case FOCUS_MODE: break; case VIEW_MOBILE_WEB: - itemData->moreMenuUI->switchToMobileView(); - itemData->moreMenuUI->m_desktopView = false; - itemData->moreMenuUI->refreshGengrid(); + itemData->moreMenuUI->switchToMobileMode(); + itemData->moreMenuUI->m_desktopMode = false; + itemData->moreMenuUI->closeMoreMenuClicked(std::string()); + itemData->moreMenuUI->clearItems(); break; case VIEW_DESKTOP_WEB: - itemData->moreMenuUI->switchToDesktopView(); - itemData->moreMenuUI->m_desktopView = true; - itemData->moreMenuUI->refreshGengrid(); + itemData->moreMenuUI->switchToDesktopMode(); + itemData->moreMenuUI->m_desktopMode = true; + itemData->moreMenuUI->closeMoreMenuClicked(std::string()); + itemData->moreMenuUI->clearItems(); break; case SHARE: break; @@ -477,13 +480,6 @@ void MoreMenuUI::clearItems() elm_cache_all_flush(); } -void MoreMenuUI::refreshGengrid() -{ - elm_gengrid_clear(m_gengrid); - m_map_menu_views.clear(); - addItems(); -} - void MoreMenuUI::_exitClicked() { BROWSER_LOGD("[%s:%d]", __PRETTY_FUNCTION__, __LINE__); diff --git a/services/MoreMenuUI/MoreMenuUI.h b/services/MoreMenuUI/MoreMenuUI.h index a6df318..4bbf489 100644 --- a/services/MoreMenuUI/MoreMenuUI.h +++ b/services/MoreMenuUI/MoreMenuUI.h @@ -61,7 +61,7 @@ class BROWSER_EXPORT MoreMenuUI public: MoreMenuUI(); ~MoreMenuUI(); - void show(Evas_Object *main_layout); + void show(Evas_Object *main_layout, bool desktopMode); void showCurrentTab(); virtual std::string getName(); void addItems(); @@ -80,8 +80,8 @@ public: boost::signals2::signal historyUIClicked; boost::signals2::signal settingsClicked; boost::signals2::signal closeMoreMenuClicked; - boost::signals2::signal switchToMobileView; - boost::signals2::signal switchToDesktopView; + boost::signals2::signal switchToMobileMode; + boost::signals2::signal switchToDesktopMode; private: static char* _grid_text_get(void *data, Evas_Object *obj, const char *part); static Evas_Object * _grid_content_get(void *data, Evas_Object *obj, const char *part); @@ -95,8 +95,6 @@ private: void AddBookmarkPopupCalled(); void addToBookmarks(int folder_id); - void refreshGengrid(); - static void _star_clicked(void *data, Evas_Object *obj, void *event_info); static void _close_clicked(void *data, Evas_Object *obj, void *event_info); @@ -117,7 +115,7 @@ private: std::string m_folderName; bool m_gengridSetup; Evas_Object *m_icon; - bool m_desktopView; + bool m_desktopMode; }; } diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index 1b0e8d5..d2f532e 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -48,6 +48,7 @@ #include "boost/date_time/posix_time/posix_time.hpp" #include "NetworkErrorHandler.h" #include "SqlStorage.h" +#include "DetailPopup.h" namespace tizen_browser{ @@ -308,7 +309,7 @@ int SimpleUI::exec(const std::string& _url) M_ASSERT(m_mainUI.get()); m_historyService->historyAllDeleted.connect(boost::bind(&tizen_browser::base_ui::MainUI::clearHistoryGenlist, m_mainUI.get())); - m_mainUI->openURLInNewTab.connect(boost::bind(&SimpleUI::onOpenURLInNewTab, this,_1)); + m_mainUI->getDetailPopup().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,_1)); m_mainUI->bookmarkClicked.connect(boost::bind(&SimpleUI::onBookmarkButtonClicked, this,_1)); @@ -486,7 +487,6 @@ void SimpleUI::switchToTab(const tizen_browser::basic_webengine::TabId& tabId) bool SimpleUI::isHomePageActive() { - BROWSER_LOGD("[%s:%d] isHomePageActive : %d", __PRETTY_FUNCTION__, __LINE__, m_isHomePageActive); return m_isHomePageActive; } @@ -540,9 +540,9 @@ void SimpleUI::checkTabId(const tizen_browser::basic_webengine::TabId& id){ } } -void SimpleUI::openNewTab(const std::string &uri) +void SimpleUI::openNewTab(const std::string &uri, bool desktopMode) { - switchToTab(m_webEngine->addTab(uri)); + switchToTab(m_webEngine->addTab(uri, nullptr, desktopMode)); } void SimpleUI::closeTab(){ @@ -595,8 +595,9 @@ void SimpleUI::onHistoryAdded(std::shared_ptr historyItem) +void SimpleUI::onOpenURLInNewTab(std::shared_ptr historyItem, bool desktopMode) { + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); std::string historyAddress = historyItem->getUrl(); if(m_historyUI) { // TODO: remove this section when naviframes will be available m_historyUI->clearItems(); @@ -607,7 +608,7 @@ void SimpleUI::onOpenURLInNewTab(std::shared_ptrclearItems(); m_moreMenuUI = nullptr; } - openNewTab(historyAddress); + openNewTab(historyAddress, desktopMode); } void SimpleUI::onMostVisitedTileClicked(std::shared_ptr< services::HistoryItem > historyItem, int itemsNumber) @@ -1123,7 +1124,7 @@ void SimpleUI::showHistoryUI(const std::string& str) M_ASSERT(m_historyUI); m_historyUI->clearHistoryClicked.connect(boost::bind(&SimpleUI::onClearHistoryClicked, this,_1)); m_historyUI->closeHistoryUIClicked.connect(boost::bind(&SimpleUI::closeHistoryUI, this,_1)); - m_historyUI->historyItemClicked.connect(boost::bind(&SimpleUI::onOpenURLInNewTab, this,_1)); + m_historyUI->historyItemClicked.connect(boost::bind(&SimpleUI::onOpenURLInNewTab, this, _1, true)); // desktop mode as default m_historyUI->addHistoryItems(getHistory()); m_historyUI->show(m_window.get()); } @@ -1166,7 +1167,7 @@ void SimpleUI::closeSettingsUI(const std::string& str) void SimpleUI::showMoreMenu() { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - bool current_tab_as_new_tab = isHomePageActive() || (m_historyService->getHistoryItemsCount() == 0); + bool desktopMode = isHomePageActive() ? m_mainUI->isDesktopMode() : m_webEngine->isDesktopMode(); if(!m_moreMenuUI){ m_moreMenuUI = std::dynamic_pointer_cast @@ -1183,13 +1184,13 @@ void SimpleUI::showMoreMenu() m_moreMenuUI->historyUIClicked.connect(boost::bind(&SimpleUI::showHistoryUI, this,_1)); m_moreMenuUI->settingsClicked.connect(boost::bind(&SimpleUI::showSettingsUI, this,_1)); m_moreMenuUI->closeMoreMenuClicked.connect(boost::bind(&SimpleUI::closeMoreMenu, this,_1)); - m_moreMenuUI->switchToMobileView.connect(boost::bind(&SimpleUI::switchToMobileView, this)); - m_moreMenuUI->switchToDesktopView.connect(boost::bind(&SimpleUI::switchToDesktopView, this)); + m_moreMenuUI->switchToMobileMode.connect(boost::bind(&SimpleUI::switchToMobileMode, this)); + m_moreMenuUI->switchToDesktopMode.connect(boost::bind(&SimpleUI::switchToDesktopMode, this)); m_moreMenuUI->addToBookmarkClicked.connect(boost::bind(&SimpleUI::addBookmarkFolders, this)); m_moreMenuUI->AddBookmarkInput.connect(boost::bind(&SimpleUI::addToBookmarks, this,_1)); m_moreMenuUI->BookmarkFolderCreated.connect(boost::bind(&SimpleUI::newFolderMoreMenu, this,_1,_2)); - m_moreMenuUI->show(m_window.get()); + m_moreMenuUI->show(m_window.get(), desktopMode); m_moreMenuUI->showCurrentTab(); m_moreMenuUI->setFavIcon(m_webEngine->getFavicon()); m_moreMenuUI->setWebTitle(m_webEngine->getTitle()); @@ -1204,13 +1205,26 @@ void SimpleUI::closeMoreMenu(const std::string& str) m_moreMenuUI.reset(); } -void SimpleUI::switchToMobileView() +void SimpleUI::switchToMobileMode() { - m_webEngine->switchToMobileView(); + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if (!isHomePageActive()) { + m_webEngine->switchToMobileMode(); + m_webEngine->reload(); + } else { + m_mainUI->setDesktopMode(false); + } } -void SimpleUI::switchToDesktopView() { - m_webEngine->switchToDesktopView(); +void SimpleUI::switchToDesktopMode() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if (!isHomePageActive()) { + m_webEngine->switchToDesktopMode(); + m_webEngine->reload(); + } else { + m_mainUI->setDesktopMode(true); + } } void SimpleUI::showBookmarkManagerMenu() diff --git a/services/SimpleUI/SimpleUI.h b/services/SimpleUI/SimpleUI.h index f8faab1..8c13280 100644 --- a/services/SimpleUI/SimpleUI.h +++ b/services/SimpleUI/SimpleUI.h @@ -112,7 +112,7 @@ private: void updateURIBarView(); void updateView(); - void openNewTab(const std::string &uri); + void openNewTab(const std::string &uri, bool desktopMode = true); void switchToTab(const tizen_browser::basic_webengine::TabId& tabId); void newTabClicked(const std::string &); void tabClicked(const tizen_browser::basic_webengine::TabId& tabId); @@ -133,7 +133,7 @@ private: void onHistoryAdded(std::shared_ptr historyItem); void onHistoryRemoved(const std::string& uri); - void onOpenURLInNewTab(std::shared_ptr historyItem); + void onOpenURLInNewTab(std::shared_ptr historyItem, bool desktopMode); void onMostVisitedTileClicked(std::shared_ptr historyItem, int itemsNumber); void onClearHistoryClicked(const std::string&); @@ -230,8 +230,8 @@ private: void closeTabUI(const std::string& str); void showMoreMenu(); void closeMoreMenu(const std::string& str); - void switchToMobileView(); - void switchToDesktopView(); + void switchToMobileMode(); + void switchToDesktopMode(); void showHistoryUI(const std::string& str); void closeHistoryUI(const std::string&); void showMainUI(); diff --git a/services/WebKitEngineService/WebKitEngineService.cpp b/services/WebKitEngineService/WebKitEngineService.cpp index 2506a63..f88b5da 100644 --- a/services/WebKitEngineService/WebKitEngineService.cpp +++ b/services/WebKitEngineService/WebKitEngineService.cpp @@ -45,7 +45,6 @@ WebKitEngineService::WebKitEngineService() , m_privateMode(false) , m_guiParent(nullptr) , m_currentTabId(TabId::NONE) - , m_desktopView(true) { m_mostRecentTab.clear(); m_tabs.clear(); @@ -279,7 +278,7 @@ std::vector > WebKitEngineService::getTabContents() return result; } -TabId WebKitEngineService::addTab(const std::string & uri, const TabId * openerId) +TabId WebKitEngineService::addTab(const std::string & uri, const TabId * openerId, bool desktopMode) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); @@ -287,9 +286,9 @@ TabId WebKitEngineService::addTab(const std::string & uri, const TabId * openerI TabId newTabId; WebViewPtr p = std::make_shared(reinterpret_cast(m_guiParent), newTabId); if (openerId) - p->init(m_desktopView, getTabView(*openerId)); + p->init(desktopMode, getTabView(*openerId)); else - p->init(m_desktopView); + p->init(desktopMode); m_tabs[newTabId] = p; @@ -508,20 +507,22 @@ void WebKitEngineService::backButtonClicked() const } } -void WebKitEngineService::switchToDesktopView() +void WebKitEngineService::switchToDesktopMode() { - m_desktopView = true; - for (auto it = m_tabs.begin(); it != m_tabs.end(); ++it) { - it->second->switchToDesktopView(); - } + M_ASSERT(m_currentWebView); + m_currentWebView->switchToDesktopMode(); } -void WebKitEngineService::switchToMobileView() +void WebKitEngineService::switchToMobileMode() { - m_desktopView = false; - for (auto it = m_tabs.begin(); it != m_tabs.end(); ++it) { - it->second->switchToMobileView(); - } + M_ASSERT(m_currentWebView); + m_currentWebView->switchToMobileMode(); +} + +bool WebKitEngineService::isDesktopMode() const +{ + M_ASSERT(m_currentWebView); + return m_currentWebView->isDesktopMode(); } } /* end of webkitengine_service */ diff --git a/services/WebKitEngineService/WebKitEngineService.h b/services/WebKitEngineService/WebKitEngineService.h index 5c0f47d..4f586cb 100644 --- a/services/WebKitEngineService/WebKitEngineService.h +++ b/services/WebKitEngineService/WebKitEngineService.h @@ -77,7 +77,7 @@ public: * @param uri * @return TabId of created tab */ - TabId addTab(const std::string & uri = std::string(), const TabId * openerId = NULL); + TabId addTab(const std::string & uri = std::string(), const TabId * openerId = NULL, bool desktopMode = true); Evas_Object* getTabView(TabId id); bool switchToTab(TabId); bool closeTab(); @@ -159,8 +159,9 @@ public: */ void backButtonClicked() const; - void switchToMobileView(); - void switchToDesktopView(); + void switchToMobileMode(); + void switchToDesktopMode(); + bool isDesktopMode() const; private: // callbacks from WebView @@ -209,8 +210,6 @@ private: std::list m_mostRecentTab; // recently added tabs first std::list m_chronoTabs; - // true if desktop view is enabled, false if mobile - bool m_desktopView; }; } /* end of webkitengine_service */ diff --git a/services/WebKitEngineService/WebView.cpp b/services/WebKitEngineService/WebView.cpp index 603543c..3c5c5d4 100644 --- a/services/WebKitEngineService/WebView.cpp +++ b/services/WebKitEngineService/WebView.cpp @@ -83,7 +83,7 @@ WebView::~WebView() ewk_context_delete(m_ewkContext); } -void WebView::init(bool desktopView, Evas_Object * opener) +void WebView::init(bool desktopMode, Evas_Object * opener) { #if defined(USE_EWEBKIT) m_ewkView = ewk_view_add_with_context(evas_object_evas_get(m_parent), m_ewkContext); @@ -94,10 +94,11 @@ void WebView::init(bool desktopView, Evas_Object * opener) evas_object_color_set(m_ewkView, 255, 255, 255, 255); evas_object_size_hint_weight_set(m_ewkView, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(m_ewkView, EVAS_HINT_FILL, EVAS_HINT_FILL); - if (desktopView) - switchToDesktopView(); - else - switchToMobileView(); + if (desktopMode) { + switchToDesktopMode(); + } else { + switchToMobileMode(); + } //\todo: when value is other than 1.0, scroller is located improperly // ewk_view_device_pixel_ratio_set(m_ewkView, 1.0f); @@ -877,14 +878,20 @@ void WebView::searchOnWebsite(const std::string & searchString, int flags) BROWSER_LOGD("Ewk search; word: %s, result: %d", searchString.c_str(), result); } -void WebView::switchToDesktopView() { +void WebView::switchToDesktopMode() { BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); int res = ewk_view_user_agent_set(m_ewkView, APPLICATION_NAME_FOR_USER_AGENT); + m_desktopMode = true; } -void WebView::switchToMobileView() { +void WebView::switchToMobileMode() { BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); int res = ewk_view_user_agent_set(m_ewkView, APPLICATION_NAME_FOR_USER_AGENT_MOBILE); + m_desktopMode = false; +} + +bool WebView::isDesktopMode() const { + return m_desktopMode; } } /* namespace webkitengine_service */ diff --git a/services/WebKitEngineService/WebView.h b/services/WebKitEngineService/WebView.h index 846af9c..98b3e65 100644 --- a/services/WebKitEngineService/WebView.h +++ b/services/WebKitEngineService/WebView.h @@ -41,7 +41,7 @@ class WebView public: WebView(Evas_Object *, TabId); virtual ~WebView(); - void init(bool desktopView = true, Evas_Object * opener = NULL); + void init(bool desktopMode, Evas_Object * opener = NULL); void setURI(const std::string &); @@ -112,12 +112,19 @@ public: /** * @brief Change user agent to desktop type */ - void switchToDesktopView(); + void switchToDesktopMode(); /** * @brief Change user agent to mobile type */ - void switchToMobileView(); + void switchToMobileMode(); + + /** + * @brief Check if desktop mode is enabled + * + * @return true if desktop mode is enabled + */ + bool isDesktopMode() const; /** * @brief Get favicon of URL @@ -194,8 +201,8 @@ private: bool m_isLoading; double m_loadProgress; bool m_loadError; - - + // true if desktop view is enabled, false if mobile + bool m_desktopMode; config::DefaultConfig config; -- 2.7.4 From 24206804e050da8f6e007a7a84ec48bea1f70492 Mon Sep 17 00:00:00 2001 From: Albert Malewski Date: Tue, 8 Sep 2015 09:44:29 +0200 Subject: [PATCH 11/16] Fixed radio selection in settings [Issue] https://bugs.tizen.org/jira/browse/TT-154 [Problem] Cannot select any item in radio list at Web contents Sharing section. [Cause] Every radio was set to one group. Missing state valuesof radios. [Solution] Added enums with state values and separate radio buttons within 3 lists. [Verify] Launch browser > More Menu > Settings > Obs You should be able to select any radio in settings. Change-Id: I894d6527770c51066be60372cc3e69646c21ff82 --- services/SettingsUI/SettingsUI.cpp | 16 ++++++++++++++-- services/SettingsUI/SettingsUI.h | 15 +++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/services/SettingsUI/SettingsUI.cpp b/services/SettingsUI/SettingsUI.cpp index 2b68784..0799958 100644 --- a/services/SettingsUI/SettingsUI.cpp +++ b/services/SettingsUI/SettingsUI.cpp @@ -156,35 +156,47 @@ void SettingsUI::showSettingsPage() elm_check_state_set(history_checkbox, EINA_TRUE); edje_object_signal_callback_add(elm_layout_edje_get(m_items_layout), "mouse,clicked,1", "history_cb_text", __checkbox_label_click_cb, (void*)id); - Evas_Object *accept_all_rb = elm_radio_add(m_items_layout); elm_object_style_set(accept_all_rb, "settings_radio"); elm_layout_content_set(m_items_layout, "accept_all_rb", accept_all_rb); + Evas_Object *sharingRequestGroup = accept_all_rb; + elm_radio_state_value_set(accept_all_rb, SR_ACCEPT_ALL); Evas_Object *ask_rb = elm_radio_add(m_items_layout); elm_object_style_set(ask_rb, "settings_radio"); elm_layout_content_set(m_items_layout, "ask_rb", ask_rb); + elm_radio_group_add(ask_rb, sharingRequestGroup); + elm_radio_state_value_set(ask_rb, SR_ASK); Evas_Object *sr_disable_rb = elm_radio_add(m_items_layout); elm_object_style_set(sr_disable_rb, "settings_radio"); elm_layout_content_set(m_items_layout, "sr_disable_rb", sr_disable_rb); + elm_radio_group_add(sr_disable_rb, sharingRequestGroup); + elm_radio_state_value_set(sr_disable_rb, SR_DISABLE); Evas_Object *bs_enable_rb = elm_radio_add(m_items_layout); elm_object_style_set(bs_enable_rb, "settings_radio"); elm_layout_content_set(m_items_layout, "bs_enable_rb", bs_enable_rb); + Evas_Object *bookmarkSyncGroup = bs_enable_rb; + elm_radio_state_value_set(bs_enable_rb, BS_ENABLE); Evas_Object *bs_disable_rb = elm_radio_add(m_items_layout); elm_object_style_set(bs_disable_rb, "settings_radio"); elm_layout_content_set(m_items_layout, "bs_disable_rb", bs_disable_rb); + elm_radio_group_add(bs_disable_rb, bookmarkSyncGroup); + elm_radio_state_value_set(bs_disable_rb, BS_DISABLE); Evas_Object *ts_enable_rb = elm_radio_add(m_items_layout); elm_object_style_set(ts_enable_rb, "settings_radio"); elm_layout_content_set(m_items_layout, "ts_enable_rb", ts_enable_rb); + Evas_Object *tabSyncGroup = ts_enable_rb; + elm_radio_state_value_set(ts_enable_rb, TS_ENABLE); Evas_Object *ts_disable_rb = elm_radio_add(m_items_layout); elm_object_style_set(ts_disable_rb, "settings_radio"); elm_layout_content_set(m_items_layout, "ts_disable_rb", ts_disable_rb); - + elm_radio_group_add(ts_disable_rb, tabSyncGroup); + elm_radio_state_value_set(ts_disable_rb, TS_DISABLE); } Evas_Object* SettingsUI::listActionBarContentGet(void* data, Evas_Object* obj , const char* part) diff --git a/services/SettingsUI/SettingsUI.h b/services/SettingsUI/SettingsUI.h index 8adbf4d..70ffab2 100644 --- a/services/SettingsUI/SettingsUI.h +++ b/services/SettingsUI/SettingsUI.h @@ -63,7 +63,6 @@ private: static void _closetabs_clicked(void * data, Evas_Object * obj, void * event_info); static void _onotherdevices_clicked(void * data, Evas_Object * obj, void * event_info); -private: Evas_Object *m_settings_layout; Evas_Object *m_genListActionBar; Evas_Object *m_scroller; @@ -73,7 +72,19 @@ private: Elm_Gengrid_Item_Class * m_item_class; std::string m_edjFilePath; - + enum SharingRequest { + SR_DISABLE = 0, + SR_ASK, + SR_ACCEPT_ALL, + }; + enum BookmarkSync { + BS_DISABLE = 0, + BS_ENABLE + }; + enum TabSync { + TS_DISABLE = 0, + TS_ENABLE + }; }; } -- 2.7.4 From 7d65e7f2db89b41bec2a6d89283921bf3515a95e Mon Sep 17 00:00:00 2001 From: Maciej Skrzypkowski Date: Tue, 8 Sep 2015 16:04:20 +0200 Subject: [PATCH 12/16] Fixed crash while loading page without title. [Issue] https://bugs.tizen.org/jira/browse/TT-162 [Problem] Browser crashed while loading page. [Cause] There was no check if page title is empty while comparing. [Solution] Changed compering to URL, added check if it's empty. [Verify] Launch browser > go to: http://jmajnert.github.io/tests/localStorage_test/localStoragePersistance.html refresh page > close browser > open again > go to previous site. Browser shouldn't crash. Change-Id: Icc19ad7a327d97fe6ff79777b0fc819189cf660a Signed-off-by: Maciej Skrzypkowski --- services/HistoryService/HistoryService.cpp | 64 ++++++++---------------------- services/HistoryService/HistoryService.h | 4 +- 2 files changed, 18 insertions(+), 50 deletions(-) diff --git a/services/HistoryService/HistoryService.cpp b/services/HistoryService/HistoryService.cpp index b5826ef..1d93507 100644 --- a/services/HistoryService/HistoryService.cpp +++ b/services/HistoryService/HistoryService.cpp @@ -88,24 +88,9 @@ int HistoryService::getHistoryItemsCount(){ return count; } -static int __get_duplicated_ids_p(int **ids, int *count, const int limit, const int offset, - const bp_history_offset order_column_offset, const int ordering, - const bp_history_offset check_column_offset, - const char *keyword, const int is_like) -{ - bp_history_rows_cond_fmt conds; - conds.limit = limit; - conds.offset = offset; - conds.ordering = ordering; - conds.order_offset = order_column_offset; - conds.period_offset = BP_HISTORY_O_DATE_CREATED; - conds.period_type = BP_HISTORY_DATE_ALL; - - return bp_history_adaptor_get_cond_ids_p(ids, count, &conds, check_column_offset, keyword, is_like); -} - -bool isDuplicate(const char* title) +bool HistoryService::isDuplicate(const char* url) const { + M_ASSERT(url); int *ids=nullptr; int count=0; bp_history_rows_cond_fmt conds; @@ -120,21 +105,22 @@ bool isDuplicate(const char* title) BROWSER_LOGD("Error! Could not get ids!"); } - bp_history_offset offset = (BP_HISTORY_O_URL | BP_HISTORY_O_TITLE | BP_HISTORY_O_FAVICON | BP_HISTORY_O_DATE_CREATED); + bp_history_offset offset = (BP_HISTORY_O_URL | BP_HISTORY_O_DATE_CREATED); - for(int i = 0; i< count; i++){ + for (int i = 0; i < count; i++) { bp_history_info_fmt history_info; - bp_history_adaptor_get_info(ids[i],offset,&history_info); - if(!strcmp(history_info.title, title)) { - int freq; - bp_history_adaptor_get_frequency(ids[i], &freq); - bp_history_adaptor_set_frequency(ids[i], freq + 1); - bp_history_adaptor_set_date_visited(ids[i],-1); - return true; + bp_history_adaptor_get_info(ids[i], offset, &history_info); + if (!history_info.url) { + BROWSER_LOGD("Warning: history entry without url!"); + } else if (!strcmp(history_info.url, url)) { + int freq; + bp_history_adaptor_get_frequency(ids[i], &freq); + bp_history_adaptor_set_frequency(ids[i], freq + 1); + bp_history_adaptor_set_date_visited(ids[i],-1); + return true; } } return false; - } std::shared_ptr HistoryService::getHistoryAll() @@ -284,7 +270,7 @@ void HistoryService::addHistoryItem(std::shared_ptr his,std::shared his->setFavIcon(his->getFavIcon()); his->setThumbnail(thumbnail); - if(isDuplicate(his->getTitle().c_str())) + if (isDuplicate(his->getUrl().c_str())) return; int id = -1; @@ -330,14 +316,6 @@ void HistoryService::addHistoryItem(std::shared_ptr his,std::shared historyAdded(his); } - -void HistoryService::insertOrRefresh(std::shared_ptr hi) { - /** - * No browser- provider implementation till now. Needs to be done - */ - //getStorageManager()->insertOrRefresh(hi); -} - void HistoryService::clearAllHistory() { bp_history_adaptor_reset(); @@ -357,7 +335,9 @@ int HistoryService::getHistoryId(const std::string & url) int *ids = nullptr; int ids_count = 0; int ret = bp_history_adaptor_get_cond_ids_p(&ids ,&ids_count, &conds, BP_HISTORY_O_URL, url.c_str(), 0); - if (ids_count!=0){ + if (ret < 0) { + BROWSER_LOGD("Error! Could not get ids!"); + } else if (ids_count != 0) { int i = *ids; free(ids); return i; @@ -390,9 +370,7 @@ std::shared_ptr HistoryService::getHistoryItem(int * ids, int idNum int m_year = item_time_info->tm_year; int m_month = item_time_info->tm_mon + 1; - int m_day = item_time_info->tm_yday; int m_month_day = item_time_info->tm_mday; - int m_date = date; int min = item_time_info->tm_min; int hour = item_time_info->tm_hour; int sec = item_time_info->tm_sec; @@ -465,13 +443,5 @@ std::shared_ptr HistoryService::getHistoryItems(bp_history_da return ret_history_list; } -int HistoryService::getHistoryVisitCounter(const std::string & url) -{ /** - * No browser- provider implementation till now. Needs to be done - */ -// return getStorageManager()->getHistoryVisitCounter(url); - -} - } } diff --git a/services/HistoryService/HistoryService.h b/services/HistoryService/HistoryService.h index f8e10e1..7764bd3 100644 --- a/services/HistoryService/HistoryService.h +++ b/services/HistoryService/HistoryService.h @@ -44,7 +44,6 @@ public: int getHistoryId(const std::string & url); void addHistoryItem(std::shared_ptr hi, std::shared_ptr thumbnail=std::shared_ptr()); - void insertOrRefresh(std::shared_ptr hi); void clearAllHistory(); void clearURLHistory(const std::string & url); std::shared_ptr getHistoryItem(const std::string & url); @@ -58,7 +57,6 @@ public: std::shared_ptr getMostVisitedHistoryItems(); std::shared_ptr getHistoryItemsByURL(const std::string & url, int maxItems); int getHistoryItemsCount(); - int getHistoryVisitCounter(const std::string & url); void setStorageServiceTestMode(bool testmode = true); boost::signals2::signalhistoryEmpty; @@ -79,7 +77,7 @@ private: std::shared_ptr getHistoryItem(int* ids, int idNumber = 0); std::shared_ptr getHistoryItems(bp_history_date_defs period = BP_HISTORY_DATE_TODAY); std::shared_ptr getStorageManager(); - + bool isDuplicate(const char* url) const; }; } -- 2.7.4 From 5b81863b07ce0a44a3edcf285155248b473bcd51 Mon Sep 17 00:00:00 2001 From: "t.dakowicz" Date: Thu, 10 Sep 2015 15:55:02 +0200 Subject: [PATCH 13/16] Fixed bookmark creation [Issue#] N/A [Problem] Bookmarks couldn't be created [Cause] Variables used in 'bp_bookmark_adaptor_easy_create()' had some not initialized values [Solution] std::memset before passing its reference [Verify] Check if bookmarks can be created Change-Id: I861e70a6f6fa8e980423eb2721899421de9c485b --- services/BookmarkService/BookmarkService.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/BookmarkService/BookmarkService.cpp b/services/BookmarkService/BookmarkService.cpp index 322e826..edb3469 100644 --- a/services/BookmarkService/BookmarkService.cpp +++ b/services/BookmarkService/BookmarkService.cpp @@ -102,6 +102,8 @@ std::shared_ptr BookmarkService::addToBookmarks( } bp_bookmark_info_fmt info; + + std::memset(&info, 0, sizeof(bp_bookmark_info_fmt)); info.type = 0; info.parent = dirId; info.sequence = -1; @@ -457,6 +459,8 @@ int BookmarkService::update_bookmark(int id, const char *title, const char *uri, } } bp_bookmark_info_fmt info; + + std::memset(&info, 0, sizeof(bp_bookmark_info_fmt)); info.type = -1; info.parent = parent_id; info.sequence = order; -- 2.7.4 From 3a188631e8fb54f91fb5f1f17d16f95af299b955 Mon Sep 17 00:00:00 2001 From: "t.dakowicz" Date: Wed, 9 Sep 2015 15:57:01 +0200 Subject: [PATCH 14/16] TT-101 Fixed URL bar update and added doc icon [Issue#] https://bugs.tizen.org/jira/browse/TT-101 [Problem] URL bar shows wrong URL after back/forward action [Cause] Multiple URL changes and lack of direct connection to proper SimpleURI method [Solution] Added direct connection to SimpleURI::changeUri and added doc icon for pages not loaded completely (placeholder) [Verify] Check if back/forward action causes correct URL update Change-Id: Ibc5cad20397328789d3bfcc07e0852d41d1a87b7 --- services/MoreMenuUI/MoreMenuUI.cpp | 22 ++++++++++++++++++++-- services/MoreMenuUI/MoreMenuUI.h | 2 +- services/MoreMenuUI/edc/MoreMenu.edc | 1 + services/MoreMenuUI/images/ico_url.png | Bin 0 -> 4317 bytes services/SimpleUI/SimpleUI.cpp | 20 ++++++++++++++------ services/SimpleUI/SimpleUI.h | 2 +- services/SimpleURI/SimpleURI.cpp | 2 +- services/SimpleURI/SimpleURI.h | 2 +- services/WebKitEngineService/WebView.cpp | 4 +--- services/WebKitEngineService/WebView.h | 2 +- 10 files changed, 41 insertions(+), 16 deletions(-) create mode 100755 services/MoreMenuUI/images/ico_url.png diff --git a/services/MoreMenuUI/MoreMenuUI.cpp b/services/MoreMenuUI/MoreMenuUI.cpp index 088ae44..7489ab6 100644 --- a/services/MoreMenuUI/MoreMenuUI.cpp +++ b/services/MoreMenuUI/MoreMenuUI.cpp @@ -119,15 +119,33 @@ void MoreMenuUI::showCurrentTab() void MoreMenuUI::setFavIcon(std::shared_ptr favicon) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - if(favicon && favicon->imageType != tools::BrowserImage::ImageTypeNoImage){ + if(favicon && favicon->imageType != tools::BrowserImage::ImageTypeNoImage) { + if(m_icon) + evas_object_del(m_icon); + m_icon = tizen_browser::tools::EflTools::getEvasImage(favicon, m_current_tab_bar); - if(m_icon){ + if(m_icon) { evas_object_size_hint_weight_set(m_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(m_icon, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_object_part_content_set(m_current_tab_bar, "favicon", m_icon); evas_object_show(m_icon); } } + else { + setDocIcon(); + } +} + +void MoreMenuUI::setDocIcon() +{ + if(m_icon) + evas_object_del(m_icon); + + m_icon = elm_icon_add(m_mm_layout); + elm_image_file_set(m_icon, m_edjFilePath.c_str(), "ico_url.png"); + evas_object_size_hint_weight_set(m_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(m_icon, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_part_content_set(m_current_tab_bar, "favicon", m_icon); } void MoreMenuUI::setWebTitle(const std::string& title) diff --git a/services/MoreMenuUI/MoreMenuUI.h b/services/MoreMenuUI/MoreMenuUI.h index 4bbf489..06e4017 100644 --- a/services/MoreMenuUI/MoreMenuUI.h +++ b/services/MoreMenuUI/MoreMenuUI.h @@ -88,6 +88,7 @@ private: static void _thumbSelected(void * data, Evas_Object * obj, void * event_info); static void _exitClicked(); + void setDocIcon(); void newFolderPopup(std::string); void NewFolderCreate(Evas_Object * popup_content); void CancelClicked(Evas_Object * popup_content); @@ -101,7 +102,6 @@ private: static void __cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info); static void __cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info); -private: Evas_Object *m_current_tab_bar; std::shared_ptr m_new_folder_popup; Evas_Object *m_mm_layout; diff --git a/services/MoreMenuUI/edc/MoreMenu.edc b/services/MoreMenuUI/edc/MoreMenu.edc index 553416b..fcfd99a 100644 --- a/services/MoreMenuUI/edc/MoreMenu.edc +++ b/services/MoreMenuUI/edc/MoreMenu.edc @@ -54,6 +54,7 @@ RESOURCE_IMAGE_LOSSY("ic_more_desktopview_foc.png") RESOURCE_IMAGE_LOSSY("ic_more_share_foc.png") RESOURCE_IMAGE_LOSSY("ic_more_setting_foc.png") RESOURCE_IMAGE_LOSSY("ic_more_exit_foc.png") +RESOURCE_IMAGE_LOSSY("ico_url.png") #define WIDTH 1920 #define HEIGHT 366 diff --git a/services/MoreMenuUI/images/ico_url.png b/services/MoreMenuUI/images/ico_url.png new file mode 100755 index 0000000000000000000000000000000000000000..fa4625fc1f1a8030525bc08442f52c814ee9ad1f GIT binary patch literal 4317 zcmV<35F+o1P)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^Ra2?+}vI|Pk#IRF3#4@pEp zRA}Dqo6C<}R}sd)ug<+a-EBJ)5<8IiDaT4A7AWjNV#NX}OI9q95MqG@2%O-6ADMWP z$i^fg2qB`ZS+Qk_6bXdHe}E7oi98C4lGC*A!qfRYpeFwI>bl9U#j?heU|wY9Z*lGkT0zqv4T<|lEa!0xf@?#BU~0^pKI z03azzwim$7BPhAty^wT`4$s|p?`_a0tPStgFpt$KjnXK&qDgYgKKU@_3r^>Q_^8DiJA3ue7aw0d z^W*Q=BLPkV5=d4gKQ^;}*LA(p?sT%ED5w~>2^=uhZtKS4yr!og&g;7F#uyI)FiDX# zHHK|~n^1-)?kSQ7J;op*zp*eM&c5`k#aCYZd9h>Q+X_vRR(HCc{_MHuYXJ4AMCwm} zey9G&-~Sd#Vz3bd0!ar@rA5!1kP-n3KycS109r-AAIvy);nmkay7-Y@14~P? zvM9r-Rk3PiZeEDnN{MI#w@GmpFN@A6yC;6tDZyU)r$uGJ4$r$7D zkmZlO`G-G-9Ru%Drm=Zv7>E=?$oTBnzbd+a5JLD5fH{yin=Eksi!m)*2f!hhPPqH= zxvTFUy!_j@v+ao1{aT6j)p+gFOnu?y*FNr*Wf7~g@2(R@J|uad*?Jldp#|tr^q3LI z=dWE0vsZq1z1{BCV-G9|d6uv5dl%20t^mxRf93UJb!EALbOhi*Nv$M$4v-LX$R7on zRaMnmUbRNY+6@SCU&c;{IaB#UcYB(igYa9x)FgUzb4t16nI+)2Kjg@X}MpD zM?DzbY%>5$x6siKN$pWe72BA~GWj?o2R zMbbiY@Oqf_{y!|0Lb#pEO&fOdVr+mzmPNDhUIM1O-*e4r78GMdmSrKv_%whgl84k| z3;g_#z9#?+X>NDV=ILL&^h7$PJeuNRoX6!i-U`wu$Nc9CxYz63r^Wr}3Rvr9@&f{F zBl-*;v_+W!Pk<-D6W|H(1b6~G0iFO)fG5Bc;0f>qcmg~Do&ZmP_iEfrgWNWoTKJ$? zSOB4rPgR#(;ib5RQj!L-&}tN!}VU%HaFn-uriChanged.connect(boost::bind(&SimpleUI::filterURL, this, _1)); + m_webEngine->uriChanged.connect(boost::bind(&SimpleURI::changeUri, m_simpleURI.get(), _1)); m_webEngine->uriChanged.connect(boost::bind(&SimpleUI::webEngineURLChanged, this, _1)); m_webEngine->uriOnTabChanged.connect(boost::bind(&SimpleUI::checkTabId,this,_1)); m_webEngine->webViewClicked.connect(boost::bind(&SimpleURI::clearFocus, m_simpleURI.get())); @@ -853,11 +854,9 @@ void SimpleUI::filterURL(const std::string& url) //addBookmarkEnable(false); } -void SimpleUI::webEngineURLChanged(const std::string& url) +void SimpleUI::webEngineURLChanged(const std::string url) { BROWSER_LOGD("webEngineURLChanged:%s", url.c_str()); - - m_simpleURI->changeUri(url); m_simpleURI->clearFocus(); bookmarkCheck(); } @@ -1174,11 +1173,8 @@ void SimpleUI::showMoreMenu() (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.moremenuui")); M_ASSERT(m_moreMenuUI); - m_webEngine->favIconChanged.disconnect_all_slots(); m_webEngine->favIconChanged.connect(boost::bind(&MoreMenuUI::setFavIcon, m_moreMenuUI.get(), _1)); - m_webEngine->titleChanged.disconnect_all_slots(); m_webEngine->titleChanged.connect(boost::bind(&MoreMenuUI::setWebTitle, m_moreMenuUI.get(), _1)); - m_webEngine->uriChanged.disconnect_all_slots(); m_webEngine->uriChanged.connect(boost::bind(&MoreMenuUI::setURL, m_moreMenuUI.get(), _1)); m_moreMenuUI->bookmarkManagerClicked.connect(boost::bind(&SimpleUI::onBookmarkManagerButtonClicked, this, _1)); m_moreMenuUI->historyUIClicked.connect(boost::bind(&SimpleUI::showHistoryUI, this,_1)); @@ -1202,6 +1198,18 @@ void SimpleUI::showMoreMenu() void SimpleUI::closeMoreMenu(const std::string& str) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_webEngine->favIconChanged.disconnect(boost::bind(&MoreMenuUI::setFavIcon, m_moreMenuUI.get(), _1)); + m_webEngine->titleChanged.disconnect(boost::bind(&MoreMenuUI::setWebTitle, m_moreMenuUI.get(), _1)); + m_webEngine->uriChanged.disconnect(boost::bind(&MoreMenuUI::setURL, m_moreMenuUI.get(), _1)); + m_moreMenuUI->bookmarkManagerClicked.disconnect(boost::bind(&SimpleUI::onBookmarkManagerButtonClicked, this, _1)); + m_moreMenuUI->historyUIClicked.disconnect(boost::bind(&SimpleUI::showHistoryUI, this,_1)); + m_moreMenuUI->settingsClicked.disconnect(boost::bind(&SimpleUI::showSettingsUI, this,_1)); + m_moreMenuUI->closeMoreMenuClicked.disconnect(boost::bind(&SimpleUI::closeMoreMenu, this,_1)); + m_moreMenuUI->switchToMobileMode.disconnect(boost::bind(&SimpleUI::switchToMobileMode, this)); + m_moreMenuUI->switchToDesktopMode.disconnect(boost::bind(&SimpleUI::switchToDesktopMode, this)); + m_moreMenuUI->addToBookmarkClicked.disconnect(boost::bind(&SimpleUI::addBookmarkFolders, this)); + m_moreMenuUI->AddBookmarkInput.disconnect(boost::bind(&SimpleUI::addToBookmarks, this,_1)); + m_moreMenuUI->BookmarkFolderCreated.disconnect(boost::bind(&SimpleUI::newFolderMoreMenu, this,_1,_2)); m_moreMenuUI.reset(); } diff --git a/services/SimpleUI/SimpleUI.h b/services/SimpleUI/SimpleUI.h index 8c13280..476d5dd 100644 --- a/services/SimpleUI/SimpleUI.h +++ b/services/SimpleUI/SimpleUI.h @@ -195,7 +195,7 @@ private: * For filtered addresses we need to hide real URI so the user would be confused. * and this is a back function that checks if address emited from browser should be changed. */ - void webEngineURLChanged(const std::string& url); + void webEngineURLChanged(const std::string url); void onmostHistoryvisitedClicked(); void onBookmarkvisitedClicked(); /** diff --git a/services/SimpleURI/SimpleURI.cpp b/services/SimpleURI/SimpleURI.cpp index cc07c13..2c5b9ba 100644 --- a/services/SimpleURI/SimpleURI.cpp +++ b/services/SimpleURI/SimpleURI.cpp @@ -96,7 +96,7 @@ Evas_Object * SimpleURI::getContent(Evas_Object *main_layout) return m_entry_layout; } -void SimpleURI::changeUri(const std::string &newUri) +void SimpleURI::changeUri(const std::string newUri) { BROWSER_LOGD("%s: newUri=%s", __func__, newUri.c_str()); elm_entry_entry_set(m_entry, elm_entry_utf8_to_markup(newUri.c_str())); diff --git a/services/SimpleURI/SimpleURI.h b/services/SimpleURI/SimpleURI.h index ad268c5..77ec107 100644 --- a/services/SimpleURI/SimpleURI.h +++ b/services/SimpleURI/SimpleURI.h @@ -50,7 +50,7 @@ public: Evas_Object * getContent() { return m_entry_layout;}; - void changeUri(const std::string&); + void changeUri(const std::string); boost::signals2::signal uriChanged; void setFavIcon(std::shared_ptr favicon); diff --git a/services/WebKitEngineService/WebView.cpp b/services/WebKitEngineService/WebView.cpp index 3c5c5d4..3355e32 100644 --- a/services/WebKitEngineService/WebView.cpp +++ b/services/WebKitEngineService/WebView.cpp @@ -616,7 +616,7 @@ void WebView::__urlChanged(void * data, Evas_Object * /* obj */, void * event_in m_webEngine = std::dynamic_pointer_cast, tizen_browser::core::AbstractService>( tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.webkitengineservice")); M_ASSERT(m_webEngine); - self->uriChanged(fromChar(reinterpret_cast(event_info))); + self->uriChanged(self->getURI()); self->tabIdChecker(self->m_tabId); } @@ -841,8 +841,6 @@ const TabId& WebView::getTabId(){ std::shared_ptr WebView::getFavicon() { BROWSER_LOGD("%s:%d, TabId: %s", __PRETTY_FUNCTION__, __LINE__, m_tabId.toString().c_str()); - if(faviconImage.get()) - return faviconImage; Evas_Object * favicon = ewk_context_icon_database_icon_object_add(ewk_view_context_get(m_ewkView), ewk_view_url_get(m_ewkView),evas_object_evas_get(m_ewkView)); faviconImage = EflTools::getBrowserImage(favicon); diff --git a/services/WebKitEngineService/WebView.h b/services/WebKitEngineService/WebView.h index 98b3e65..1672438 100644 --- a/services/WebKitEngineService/WebView.h +++ b/services/WebKitEngineService/WebView.h @@ -134,7 +134,7 @@ public: // signals boost::signals2::signal)> favIconChanged; boost::signals2::signal titleChanged; - boost::signals2::signal uriChanged; + boost::signals2::signal uriChanged; boost::signals2::signal tabIdChecker; boost::signals2::signal loadFinished; -- 2.7.4 From dbb8a09c87417077fe87ec3e8939ad8bd5dd918c Mon Sep 17 00:00:00 2001 From: Maciej Skrzypkowski Date: Thu, 10 Sep 2015 14:34:17 +0200 Subject: [PATCH 15/16] Added thubnail and history links clicking for detail popup. [Issue] https://bugs.tizen.org/jira/browse/TT-144 [Problem] Detail popup missed thumbnail. [Cause] N/A [Solution] Added thumbnail in proper size. [Verify] Launch browser > open few pages > check thubnails Most Visited view in detail popup, check if history links in popup are clickable. Change-Id: I50d3e2862fc672a41de8cdc50f790f48f19ff21d Signed-off-by: Maciej Skrzypkowski --- core/Tools/EflTools.cpp | 3 - services/HistoryService/HistoryItem.cpp | 2 +- services/HistoryService/HistoryItem.h | 2 +- services/MainUI/DetailPopup.cpp | 43 +++++++++++++-- services/MainUI/DetailPopup.h | 10 ++++ services/MainUI/MainUI.cpp | 14 ++--- services/MainUI/MainUI.h | 4 +- services/MainUI/edc/DetailPopup.edc | 73 +++++++++++++++++++++++-- services/MainUI/edc/MainUI.edc | 18 +++--- services/MainUI/images/ic_popup_list_arrow.png | Bin 0 -> 3070 bytes services/SimpleUI/SimpleUI.cpp | 2 +- 11 files changed, 133 insertions(+), 38 deletions(-) create mode 100644 services/MainUI/images/ic_popup_list_arrow.png diff --git a/core/Tools/EflTools.cpp b/core/Tools/EflTools.cpp index f6cf03d..b8e1f49 100644 --- a/core/Tools/EflTools.cpp +++ b/core/Tools/EflTools.cpp @@ -83,9 +83,6 @@ Evas_Object * getEvasImage(std::shared_ptr b_image, Evas_Object * } else { BROWSER_LOGD("Image loaded"); evas_object_image_fill_set(eo_image, 0, 0, b_image->width, b_image->height); - - //EFL BUG without resizing image is not displayed - evas_object_resize(eo_image, b_image->width, b_image->height); } return eo_image; }; diff --git a/services/HistoryService/HistoryItem.cpp b/services/HistoryService/HistoryItem.cpp index 1d9ce89..6808685 100644 --- a/services/HistoryService/HistoryItem.cpp +++ b/services/HistoryService/HistoryItem.cpp @@ -87,7 +87,7 @@ void HistoryItem::setUrl(const std::string & url) m_url = url; } -std::string HistoryItem::getUrl() +std::string HistoryItem::getUrl() const { return m_url; } diff --git a/services/HistoryService/HistoryItem.h b/services/HistoryService/HistoryItem.h index 1d1e7ab..98875b9 100644 --- a/services/HistoryService/HistoryItem.h +++ b/services/HistoryService/HistoryItem.h @@ -51,7 +51,7 @@ public: bool operator!=(const HistoryItem& other); void setUrl(const std::string & url); - std::string getUrl(); + std::string getUrl() const; void setTitle(const std::string & title); std::string getTitle() const; diff --git a/services/MainUI/DetailPopup.cpp b/services/MainUI/DetailPopup.cpp index 4aa5604..9d2f1ea 100644 --- a/services/MainUI/DetailPopup.cpp +++ b/services/MainUI/DetailPopup.cpp @@ -16,15 +16,19 @@ #include +#include +#include #include "BrowserAssert.h" #include "DetailPopup.h" #include "BrowserLogger.h" #include "Tools/GeneralTools.h" +#include "Tools/EflTools.h" #include "MainUI.h" namespace tizen_browser{ namespace base_ui{ +const char * DetailPopup::URL_SEPARATOR = " - "; const int DetailPopup::HISTORY_ITEMS_NO = 5; DetailPopup::DetailPopup(MainUI *mainUI) @@ -62,14 +66,20 @@ void DetailPopup::createLayout(Evas_Object *parent) 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())); + 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); + 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); + } evas_object_show(m_historyList); elm_object_part_content_set(m_layout, "history_list", m_historyList); - 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); + if (m_item->getThumbnail()) { + Evas_Object * thumb = tools::EflTools::getEvasImage(m_item->getThumbnail(), m_layout); + elm_object_part_content_set(m_layout, "thumbnail", thumb); } evas_object_show(m_layout); @@ -88,18 +98,19 @@ 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); 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); } -void DetailPopup::_bg_click(void* data, Evas_Object* obj, const char* emission, const char* source) +void DetailPopup::_bg_click(void* data, Evas_Object*, const char*, const char*) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); DetailPopup *dp = reinterpret_cast(data); dp->hide(); } -void DetailPopup::_url_click(void* data, Evas_Object* obj, const char* emission, const char* source) +void DetailPopup::_url_click(void* data, Evas_Object*, const char*, const char*) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); DetailPopup *dp = reinterpret_cast(data); @@ -107,14 +118,34 @@ void DetailPopup::_url_click(void* data, Evas_Object* obj, const char* emission, dp->openURLInNewTab(dp->m_item, dp->m_mainUI->isDesktopMode()); } -char* DetailPopup::_get_history_link_text(void* data, Evas_Object* obj, const char* part) +void DetailPopup::_history_url_click(void* data, Evas_Object*, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Object_Item *glit = reinterpret_cast(event_info); + void *itemData = elm_object_item_data_get(glit); + services::HistoryItem *item = reinterpret_cast(itemData); + + DetailPopup *dp = reinterpret_cast(data); + // find shared pointer pointed to HistoryItem object + auto it = std::find_if(dp->m_prevItems->begin(), + dp->m_prevItems->end(), + [item] (const std::shared_ptr i) + { return i.get() == item; } + ); + std::shared_ptr itemPtr= *it; + dp->hide(); + dp->openURLInNewTab(itemPtr, dp->m_mainUI->isDesktopMode()); +} + +char* DetailPopup::_get_history_link_text(void* data, Evas_Object*, const char* part) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); services::HistoryItem *item = reinterpret_cast(data); if (!strcmp(part, "page_dsc")) { if (item != nullptr) { - return strdup(tools::clearURL(item->getUrl())); + std::string text = item->getTitle() + URL_SEPARATOR + tools::clearURL(item->getUrl()); + return strdup(text.c_str()); } } return strdup(""); diff --git a/services/MainUI/DetailPopup.h b/services/MainUI/DetailPopup.h index 1ad8a02..953e9b8 100644 --- a/services/MainUI/DetailPopup.h +++ b/services/MainUI/DetailPopup.h @@ -53,10 +53,18 @@ namespace base_ui{ static void _url_click(void *data, Evas_Object *obj, const char *emission, const char *source); /** + * @brief History genlist item click callback + */ + 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); /** @@ -71,6 +79,8 @@ namespace base_ui{ std::string edjFilePath; std::shared_ptr m_item; std::shared_ptr m_prevItems; + + static const char * URL_SEPARATOR; }; } diff --git a/services/MainUI/MainUI.cpp b/services/MainUI/MainUI.cpp index 6dbdbbc..1367a87 100644 --- a/services/MainUI/MainUI.cpp +++ b/services/MainUI/MainUI.cpp @@ -33,8 +33,8 @@ namespace base_ui{ const int SMALL_TILES_ROWS = 2; const int MAX_TILES_NUMBER = 5; -const int MainUI::MAX_TILE_WIDTH = 784; -const int MainUI::MAX_TILE_HEIGHT = 498; +const int MainUI::MAX_THUMBNAIL_WIDTH = 840; +const int MainUI::MAX_THUMBNAIL_HEIGHT = 648; EXPORT_SERVICE(MainUI, "org.tizen.browser.mainui") @@ -50,12 +50,6 @@ typedef struct _BookmarkItemData std::shared_ptr mainUI; } BookmarkItemData; -struct ItemData{ - tizen_browser::base_ui::MainUI * mainUI; - const char* button_name; - Elm_Object_Item * e_item; -}; - MainUI::MainUI() : m_parent(nullptr) , m_layout(nullptr) @@ -360,7 +354,7 @@ void MainUI::addBookmarkItems(std::vector(data); if (!strcmp(part, "page_title")) { @@ -372,7 +366,7 @@ char* MainUI::_grid_text_get(void *data, Evas_Object *obj, const char *part) return strdup(""); } -char* MainUI::_grid_bookmark_text_get(void *data, Evas_Object *obj, const char *part) +char* MainUI::_grid_bookmark_text_get(void *data, Evas_Object *, const char *part) { BookmarkItemData *itemData = reinterpret_cast(data); if (!strcmp(part, "page_title")) { diff --git a/services/MainUI/MainUI.h b/services/MainUI/MainUI.h index 667a844..9814981 100644 --- a/services/MainUI/MainUI.h +++ b/services/MainUI/MainUI.h @@ -63,8 +63,8 @@ public: boost::signals2::signal bookmarkClicked; boost::signals2::signal bookmarkManagerClicked; - static const int MAX_TILE_WIDTH; - static const int MAX_TILE_HEIGHT; + static const int MAX_THUMBNAIL_WIDTH; + static const int MAX_THUMBNAIL_HEIGHT; private: void createItemClasses(); diff --git a/services/MainUI/edc/DetailPopup.edc b/services/MainUI/edc/DetailPopup.edc index 5a2ea1b..dd291d8 100644 --- a/services/MainUI/edc/DetailPopup.edc +++ b/services/MainUI/edc/DetailPopup.edc @@ -2,7 +2,9 @@ collections { group { name: "popup"; - + images { + image: "ic_popup_list_arrow.png" COMP; + } parts { part { name: "bg"; type: RECT; @@ -44,10 +46,8 @@ collections { } part { name: "thumbnail"; - //type: SWALLOW; TODO: change to swallow while adding thumbnail to Detail popup - type: RECT; + type: SWALLOW; description { - color: 113 128 147 255; min: 840 648; max: 840 648; visible: 1; @@ -90,8 +90,8 @@ collections { type: TEXT; description { visible: 1; - min: 428 122; - max: 428 122; + min: 408 122; + max: 408 122; align: 0.0 0.0; fixed: 1 1; color: 51 51 51 255; @@ -117,6 +117,29 @@ collections { } } + part { name: "url_arrow"; + type: IMAGE; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + visible: 1; + align: 0.0 0.5; + min: 38 38; + max: 38 38; + image.normal: "ic_popup_list_arrow.png"; + rel1 { + to: "url_bg"; + relative: 0.0 0.0; + offset: 442 0; + } + rel2 { + to: "url_bg"; + relative: 1.0 1.0; + } + } + } + part { name: "url_over"; type: RECT; mouse_events: 1; @@ -229,6 +252,10 @@ collections { color: 255 255 255 255; align: 0.0 0.0; } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 0 119 246 255; + } } part { name: "page_dsc"; @@ -253,8 +280,42 @@ collections { align: 0 0.5; } } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + + part { name: "dsc_over"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + visible: 1; + color: 0 0 0 0; + rel1.to: "bg"; + rel2.to: "bg"; + } } } + programs { + program { + name: "mouse_in_url"; + signal: "mouse,in"; + source: "dsc_over"; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "page_dsc"; + } + program { + name: "mouse_out_url"; + signal: "mouse,out"; + source: "dsc_over"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "page_dsc"; + } + } } } \ No newline at end of file diff --git a/services/MainUI/edc/MainUI.edc b/services/MainUI/edc/MainUI.edc index de77956..030e8dd 100644 --- a/services/MainUI/edc/MainUI.edc +++ b/services/MainUI/edc/MainUI.edc @@ -402,8 +402,8 @@ group { name: "elm/genlist/item/big_grid_item/default"; fixed: 1 0; align: 0.0 0.0; color : 231 231 231 255; - min: 784 498; - max: 784 498; + min: 784 577; // size adjusted to max thubnail with and height + max: 784 577; rel1 { relative: 0.0 0.0; to: "bg"; } @@ -494,8 +494,9 @@ group { name: "elm/genlist/item/big_grid_item/default"; color: 113 128 147 255; visible: 1; rel1 { - to: "elm.thumbnail"; - relative: 0.0 1.0; + to: "bg"; + relative: 0.0 0.0; + offset: 0 498; // thumbnail height } rel2 { relative: 1.0 1.0; @@ -666,8 +667,8 @@ group { name: "elm/genlist/item/small_grid_item/default"; fixed: 1 0; align: 0.0 0.0; color : 231 231 231 255; - min: 378 198; - max: 378 198; + min: 378 292; // size adjusted to max thubnail with and height + max: 378 292; rel1 { relative: 0.0 0.0; to: "bg"; } @@ -758,8 +759,9 @@ group { name: "elm/genlist/item/small_grid_item/default"; color: 113 128 147 255; visible: 1; rel1 { - to: "elm.thumbnail"; - relative: 0.0 1.0; + to: "bg"; + relative: 0.0 0.0; + offset: 0 198; // thumbnail height } rel2 { relative: 1.0 1.0; diff --git a/services/MainUI/images/ic_popup_list_arrow.png b/services/MainUI/images/ic_popup_list_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..d54f171ca0cb46306d4f82628944d8bbe99d2faf GIT binary patch literal 3070 zcmVKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0003gNklg1YgT% zP$bdcX4-(+-Giq%1H)E(_?UB>-AX0L=#Xg?Sb-JTjBx{O=LmZTMnEr_Os$)T>W{kL zV2r8Rbbx-~j&g&c_5yd78w_>zcmx)JVbcM-E$*WyU=q)H;3O9q zz)Mu_IdB8O9AE%%QMuQ^^=si$oI#N*>X$lFtN+@S({f4uQ154bH}xfMWGAPoTvk7$ zT64KfKd~*L6`TVC(8wy=sDL8@8cN)XSVM@y$S8NO!63va0-sDzE}8u)oFc0Ne&pRlMV%-v9sr M07*qoM6N<$f)5?NF8}}l literal 0 HcmV?d00001 diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index f4380d7..2747a12 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -801,7 +801,7 @@ void SimpleUI::loadFinished() if(!m_webEngine->isPrivateMode()){ m_historyService->addHistoryItem(std::make_shared (m_webEngine->getURI(), m_webEngine->getTitle(), - m_webEngine->getFavicon()), m_webEngine->getSnapshotData(MainUI::MAX_TILE_WIDTH, MainUI::MAX_TILE_HEIGHT)); + m_webEngine->getFavicon()), m_webEngine->getSnapshotData(MainUI::MAX_THUMBNAIL_WIDTH, MainUI::MAX_THUMBNAIL_HEIGHT)); } #if 0 if(!m_platformInputManager->getPointerModeEnabled()) -- 2.7.4 From 098dc33d176296cba8110a84b32fb99e4d75140e Mon Sep 17 00:00:00 2001 From: Albert Malewski Date: Thu, 10 Sep 2015 15:14:29 +0200 Subject: [PATCH 16/16] HistoryUI Refactor [Issue] https://bugs.tizen.org/jira/browse/TT-157 [Problem] Improper view navigation is used. [Cause] N/A [Solution] Implemented needed methods: void init(Evas_Object *parent) Evas_Object* getContent() void showUI() void hideUI() [Verify] Launch browser > More Menu > History > Obs History should be displayed correctly. It needs implementation on SimpleUI side - when it's done, show() function should removed. Change-Id: I83500ec9053f9ac9fc418f63f7b87f5a24a38c92 --- services/HistoryUI/HistoryUI.cpp | 139 ++++++++++++++++++++++++++++----------- services/HistoryUI/HistoryUI.h | 10 ++- 2 files changed, 107 insertions(+), 42 deletions(-) diff --git a/services/HistoryUI/HistoryUI.cpp b/services/HistoryUI/HistoryUI.cpp index f9c3a12..8443e04 100644 --- a/services/HistoryUI/HistoryUI.cpp +++ b/services/HistoryUI/HistoryUI.cpp @@ -53,80 +53,139 @@ HistoryUI::HistoryUI() , m_itemClassToday(nullptr) , m_gengrid(nullptr) , m_parent(nullptr) - , m_item_class(nullptr) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); m_edjFilePath = EDJE_DIR; m_edjFilePath.append("HistoryUI/History.edj"); + m_item_class = crateItemClass(); } HistoryUI::~HistoryUI() { + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if (m_itemClassToday) + elm_gengrid_item_class_free(m_itemClassToday); +} + +void HistoryUI::showUI() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + M_ASSERT(m_history_layout); + m_gengrid = createGengrid(m_history_layout); + addItems(); + evas_object_show(m_actionBar); + evas_object_show(m_history_layout); +} +void HistoryUI::hideUI() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + M_ASSERT(m_history_layout); + evas_object_del(m_genListToday); + m_genListToday = nullptr; + evas_object_del(m_gengrid); + m_gengrid = nullptr; + evas_object_hide(m_actionBar); + evas_object_hide(m_history_layout); } +// TODO: Remove this function when proper view handling will be introduced void HistoryUI::show(Evas_Object* parent) { - elm_theme_extension_add(nullptr, m_edjFilePath.c_str()); - m_history_layout = elm_layout_add(parent); - elm_layout_file_set(m_history_layout, m_edjFilePath.c_str(), "history-layout"); - evas_object_size_hint_weight_set(m_history_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(m_history_layout, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(m_history_layout); + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + init(parent); + m_history_layout = createHistoryUILayout(m_parent); + showUI(); +} + +void HistoryUI::init(Evas_Object* parent) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + M_ASSERT(parent); + m_parent = parent; +} - showActionBar(); +Evas_Object* HistoryUI::getContent() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + M_ASSERT(m_parent); + if (!m_history_layout) + m_history_layout = createHistoryUILayout(m_parent); + return m_history_layout; +} - m_gengrid = elm_gengrid_add(m_history_layout); - elm_object_part_content_set(m_history_layout, "history_gengird", m_gengrid); +Evas_Object* HistoryUI::createHistoryUILayout(Evas_Object* parent) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + elm_theme_extension_add(nullptr, m_edjFilePath.c_str()); + Evas_Object* history_layout = elm_layout_add(parent); + elm_layout_file_set(history_layout, m_edjFilePath.c_str(), "history-layout"); + evas_object_size_hint_weight_set(history_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(history_layout, EVAS_HINT_FILL, EVAS_HINT_FILL); - if (!m_item_class) { - m_item_class = elm_gengrid_item_class_new(); - m_item_class->item_style = "history_item"; - m_item_class->func.text_get = _grid_text_get; - m_item_class->func.content_get = _history_grid_content_get; - m_item_class->func.state_get = nullptr; - m_item_class->func.del = nullptr; - } + m_actionBar = createActionBar(history_layout); + m_gengrid = createGengrid(history_layout); - elm_gengrid_align_set(m_gengrid, 0, 0); - elm_gengrid_select_mode_set(m_gengrid, ELM_OBJECT_SELECT_MODE_ALWAYS); - elm_gengrid_multi_select_set(m_gengrid, EINA_FALSE); - elm_gengrid_horizontal_set(m_gengrid, EINA_TRUE); - elm_gengrid_highlight_mode_set(m_gengrid, EINA_TRUE); - elm_scroller_policy_set(m_gengrid, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON); - elm_scroller_page_size_set(m_gengrid, 0, 580); + return history_layout; +} - evas_object_size_hint_weight_set(m_gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(m_gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL); +Evas_Object* HistoryUI::createGengrid(Evas_Object* history_layout) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + M_ASSERT(history_layout); + elm_theme_extension_add(nullptr, m_edjFilePath.c_str()); + Evas_Object* gengrid = elm_gengrid_add(history_layout); + elm_object_part_content_set(history_layout, "history_gengird", gengrid); + + elm_gengrid_align_set(gengrid, 0, 0); + elm_gengrid_select_mode_set(gengrid, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_gengrid_multi_select_set(gengrid, EINA_FALSE); + elm_gengrid_horizontal_set(gengrid, EINA_TRUE); + elm_gengrid_highlight_mode_set(gengrid, EINA_TRUE); + elm_scroller_policy_set(gengrid, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON); + elm_scroller_page_size_set(gengrid, 0, 580); + evas_object_size_hint_weight_set(gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL); double efl_scale = elm_config_scale_get() / elm_app_base_scale_get(); - elm_gengrid_item_size_set(m_gengrid, 580 * efl_scale, 580 * efl_scale); + elm_gengrid_item_size_set(gengrid, 580 * efl_scale, 580 * efl_scale); + return gengrid; +} - addItems(); +Elm_Gengrid_Item_Class* HistoryUI::crateItemClass() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Gengrid_Item_Class* item_class = elm_gengrid_item_class_new(); + item_class->item_style = "history_item"; + item_class->func.text_get = _grid_text_get; + item_class->func.content_get = _history_grid_content_get; + item_class->func.state_get = nullptr; + item_class->func.del = nullptr; + return item_class; } -void HistoryUI::showActionBar() +Evas_Object* HistoryUI::createActionBar(Evas_Object* history_layout) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - m_actionBar = elm_layout_add(m_history_layout); - elm_object_part_content_set(m_history_layout, "action_bar_history", m_actionBar); - evas_object_size_hint_weight_set(m_actionBar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(m_actionBar, EVAS_HINT_FILL, EVAS_HINT_FILL); + Evas_Object* actionBar = elm_layout_add(history_layout); + elm_object_part_content_set(history_layout, "action_bar_history", actionBar); + evas_object_size_hint_weight_set(actionBar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(actionBar, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_layout_file_set(m_actionBar, m_edjFilePath.c_str(), "action_bar"); + elm_layout_file_set(actionBar, m_edjFilePath.c_str(), "action_bar"); - Evas_Object *button = elm_button_add(m_actionBar); + Evas_Object *button = elm_button_add(actionBar); elm_object_style_set(button, "history_button"); evas_object_smart_callback_add(button, "clicked", HistoryUI::_clearHistory_clicked, this); - elm_object_part_content_set(m_actionBar, "clearhistory_click", button); + elm_object_part_content_set(actionBar, "clearhistory_click", button); - button = elm_button_add(m_actionBar); + button = elm_button_add(actionBar); elm_object_style_set(button, "history_button"); evas_object_smart_callback_add(button, "clicked", HistoryUI::_close_clicked_cb, this); - elm_object_part_content_set(m_actionBar, "close_click", button); + elm_object_part_content_set(actionBar, "close_click", button); - evas_object_show(m_actionBar); + return actionBar; } void HistoryUI::_close_clicked_cb(void * data, Evas_Object*, void*) diff --git a/services/HistoryUI/HistoryUI.h b/services/HistoryUI/HistoryUI.h index 83bd6f6..c849f5f 100644 --- a/services/HistoryUI/HistoryUI.h +++ b/services/HistoryUI/HistoryUI.h @@ -36,14 +36,18 @@ class BROWSER_EXPORT HistoryUI public: HistoryUI(); ~HistoryUI(); - void init(Evas_Object *main_layout); + void init(Evas_Object *parent); + Evas_Object* getContent(); + void showUI(); + void hideUI(); + Evas_Object* createGengrid(Evas_Object* history_layout); virtual std::string getName(); void addHistoryItem(std::shared_ptr); void addHistoryItems(std::shared_ptr); void removeHistoryItem(const std::string& uri); void clearItems(); void hide(); - void showActionBar(); + Evas_Object* createActionBar(Evas_Object* history_layout); void show(Evas_Object *main_layout); void addItems(); boost::signals2::signal closeHistoryUIClicked; @@ -51,6 +55,8 @@ public: boost::signals2::signal)> historyItemClicked; boost::signals2::signal)> historyDeleteClicked; private: + Evas_Object* createHistoryUILayout(Evas_Object* parent); + Elm_Gengrid_Item_Class* crateItemClass(); static char* _grid_text_get(void *data, Evas_Object *obj, const char *part); static Evas_Object * _history_grid_content_get(void *data, Evas_Object *obj, const char *part); static Evas_Object * _grid_content_get(void *data, Evas_Object *obj, const char *part); -- 2.7.4