Fixed radio selection in settings
[profile/tv/apps/web/browser.git] / services / SettingsUI / SettingsUI.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <Elementary.h>
18 #include <boost/concept_check.hpp>
19 #include <string.h>
20 #include <vector>
21 #include <AbstractMainWindow.h>
22
23 #include "SettingsUI.h"
24 #include "ServiceManager.h"
25 #include "BrowserLogger.h"
26 #include "Tools/EflTools.h"
27
28 #define efl_scale       (elm_config_scale_get() / elm_app_base_scale_get())
29
30 namespace tizen_browser{
31 namespace base_ui{
32
33 EXPORT_SERVICE(SettingsUI, "org.tizen.browser.settingsui")
34
35 struct ItemData {
36     tizen_browser::base_ui::SettingsUI* settingsUI;
37     Elm_Object_Item * e_item;
38 };
39
40 SettingsUI::SettingsUI()
41     : m_settings_layout(nullptr)
42     , m_genListActionBar(nullptr)
43     , m_itemClassActionBar(nullptr)
44     , m_parent(nullptr)
45     , m_item_class(nullptr)
46     , m_scroller(nullptr)
47     , m_items_layout(nullptr)
48 {
49     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
50     m_edjFilePath = EDJE_DIR;
51     m_edjFilePath.append("SettingsUI/SettingsUI.edj");
52 }
53
54 SettingsUI::~SettingsUI()
55 {
56
57 }
58
59 void SettingsUI::show(Evas_Object* parent)
60 {
61     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
62     elm_theme_extension_add(nullptr, m_edjFilePath.c_str());
63     m_settings_layout = elm_layout_add(parent);
64     elm_layout_file_set(m_settings_layout, m_edjFilePath.c_str(), "settings-layout");
65     evas_object_size_hint_weight_set(m_settings_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
66     evas_object_size_hint_align_set(m_settings_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
67     evas_object_show(m_settings_layout);
68
69     showActionBar();
70     showSettingsPage();
71 }
72
73 void SettingsUI::showActionBar()
74 {
75     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
76     elm_theme_extension_add(nullptr, m_edjFilePath.c_str());
77     m_genListActionBar = elm_genlist_add(m_settings_layout);
78     elm_object_part_content_set(m_settings_layout, "actionbar_swallow", m_genListActionBar);
79     elm_genlist_homogeneous_set(m_genListActionBar, EINA_FALSE);
80     elm_genlist_multi_select_set(m_genListActionBar, EINA_FALSE);
81     elm_genlist_select_mode_set(m_genListActionBar, ELM_OBJECT_SELECT_MODE_ALWAYS);
82     elm_genlist_mode_set(m_genListActionBar, ELM_LIST_LIMIT);
83     elm_genlist_decorate_mode_set(m_genListActionBar, EINA_TRUE);
84     evas_object_size_hint_weight_set(m_genListActionBar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
85
86     m_itemClassActionBar = elm_genlist_item_class_new();
87     m_itemClassActionBar->item_style = "settings_action_bar_items";
88     m_itemClassActionBar->func.text_get = nullptr;
89     m_itemClassActionBar->func.content_get = &listActionBarContentGet;
90     m_itemClassActionBar->func.state_get = nullptr;
91     m_itemClassActionBar->func.del = nullptr;
92
93     ItemData *id = new ItemData;
94     id->settingsUI = this;
95     Elm_Object_Item *elmItem = elm_genlist_item_append(m_genListActionBar,    //genlist
96                                                        m_itemClassActionBar,  //item Class
97                                                        id,
98                                                        nullptr,               //parent item
99                                                        ELM_GENLIST_ITEM_NONE, //item type
100                                                        nullptr,
101                                                        nullptr                //data passed to above function
102                                                       );
103     id->e_item = elmItem;
104
105     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
106 }
107
108 void SettingsUI::showSettingsPage()
109 {
110     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
111
112     ItemData *id = new ItemData;
113     id->settingsUI = this;
114
115     m_scroller = elm_scroller_add(m_settings_layout);
116     m_items_layout = elm_layout_add(m_scroller);
117     elm_object_content_set(m_scroller, m_items_layout);
118     elm_layout_file_set(m_items_layout, m_edjFilePath.c_str(), "settings_items");
119     elm_object_part_content_set(m_settings_layout, "settings_scroller_swallow", m_scroller);
120     evas_object_size_hint_weight_set(m_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
121     evas_object_size_hint_align_set(m_scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
122     elm_scroller_policy_set(m_items_layout, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_AUTO);
123     elm_scroller_bounce_set(m_scroller, EINA_TRUE, EINA_FALSE);
124     elm_scroller_propagate_events_set(m_scroller, EINA_TRUE);
125     evas_object_show(m_scroller);
126     evas_object_show(m_items_layout);
127
128     Evas_Object *del_selected_data_button = elm_button_add(m_items_layout);
129     elm_object_style_set(del_selected_data_button, "basic_button");
130     evas_object_smart_callback_add(del_selected_data_button, "clicked", _del_selected_data_clicked_cb, (void*)id);
131     elm_layout_content_set(m_items_layout, "del_selected_data_click", del_selected_data_button);
132
133     Evas_Object *reset_mv_button = elm_button_add(m_items_layout);
134     elm_object_style_set(reset_mv_button, "basic_button");
135     evas_object_smart_callback_add(reset_mv_button, "clicked", _reset_mv_clicked_cb, (void*)id);
136     elm_layout_content_set(m_items_layout, "reset_mv_click", reset_mv_button);
137
138     Evas_Object *reset_browser_button = elm_button_add(m_items_layout);
139     elm_object_style_set(reset_browser_button, "basic_button");
140     evas_object_smart_callback_add(reset_browser_button, "clicked", _reset_browser_clicked_cb, (void*)id);
141     elm_layout_content_set(m_items_layout, "reset_browser_click", reset_browser_button);
142
143
144     Evas_Object *cache_checkbox = elm_check_add(m_items_layout);
145     elm_layout_content_set(m_items_layout, "cache_cb", cache_checkbox);
146     elm_check_state_set(cache_checkbox, EINA_TRUE);
147     edje_object_signal_callback_add(elm_layout_edje_get(m_items_layout), "mouse,clicked,1", "cache_cb_text", __checkbox_label_click_cb, (void*)id);
148
149     Evas_Object *cookies_checkbox = elm_check_add(m_items_layout);
150     elm_layout_content_set(m_items_layout, "cookies_cb", cookies_checkbox);
151     elm_check_state_set(cookies_checkbox, EINA_TRUE);
152     edje_object_signal_callback_add(elm_layout_edje_get(m_items_layout), "mouse,clicked,1", "cookies_cb_text", __checkbox_label_click_cb, (void*)id);
153
154     Evas_Object *history_checkbox = elm_check_add(m_items_layout);
155     elm_layout_content_set(m_items_layout, "history_cb", history_checkbox);
156     elm_check_state_set(history_checkbox, EINA_TRUE);
157     edje_object_signal_callback_add(elm_layout_edje_get(m_items_layout), "mouse,clicked,1", "history_cb_text", __checkbox_label_click_cb, (void*)id);
158
159     Evas_Object *accept_all_rb = elm_radio_add(m_items_layout);
160     elm_object_style_set(accept_all_rb, "settings_radio");
161     elm_layout_content_set(m_items_layout, "accept_all_rb", accept_all_rb);
162     Evas_Object *sharingRequestGroup = accept_all_rb;
163     elm_radio_state_value_set(accept_all_rb, SR_ACCEPT_ALL);
164
165     Evas_Object *ask_rb = elm_radio_add(m_items_layout);
166     elm_object_style_set(ask_rb, "settings_radio");
167     elm_layout_content_set(m_items_layout, "ask_rb", ask_rb);
168     elm_radio_group_add(ask_rb, sharingRequestGroup);
169     elm_radio_state_value_set(ask_rb, SR_ASK);
170
171     Evas_Object *sr_disable_rb = elm_radio_add(m_items_layout);
172     elm_object_style_set(sr_disable_rb, "settings_radio");
173     elm_layout_content_set(m_items_layout, "sr_disable_rb", sr_disable_rb);
174     elm_radio_group_add(sr_disable_rb, sharingRequestGroup);
175     elm_radio_state_value_set(sr_disable_rb, SR_DISABLE);
176
177     Evas_Object *bs_enable_rb = elm_radio_add(m_items_layout);
178     elm_object_style_set(bs_enable_rb, "settings_radio");
179     elm_layout_content_set(m_items_layout, "bs_enable_rb", bs_enable_rb);
180     Evas_Object *bookmarkSyncGroup = bs_enable_rb;
181     elm_radio_state_value_set(bs_enable_rb, BS_ENABLE);
182
183     Evas_Object *bs_disable_rb = elm_radio_add(m_items_layout);
184     elm_object_style_set(bs_disable_rb, "settings_radio");
185     elm_layout_content_set(m_items_layout, "bs_disable_rb", bs_disable_rb);
186     elm_radio_group_add(bs_disable_rb, bookmarkSyncGroup);
187     elm_radio_state_value_set(bs_disable_rb, BS_DISABLE);
188
189     Evas_Object *ts_enable_rb = elm_radio_add(m_items_layout);
190     elm_object_style_set(ts_enable_rb, "settings_radio");
191     elm_layout_content_set(m_items_layout, "ts_enable_rb", ts_enable_rb);
192     Evas_Object *tabSyncGroup = ts_enable_rb;
193     elm_radio_state_value_set(ts_enable_rb, TS_ENABLE);
194
195     Evas_Object *ts_disable_rb = elm_radio_add(m_items_layout);
196     elm_object_style_set(ts_disable_rb, "settings_radio");
197     elm_layout_content_set(m_items_layout, "ts_disable_rb", ts_disable_rb);
198     elm_radio_group_add(ts_disable_rb, tabSyncGroup);
199     elm_radio_state_value_set(ts_disable_rb, TS_DISABLE);
200 }
201
202 Evas_Object* SettingsUI::listActionBarContentGet(void* data, Evas_Object* obj , const char* part)
203 {
204     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
205     if (obj && part) {
206         const char *part_name = "close_click";
207         static const int part_name_len = strlen(part_name);
208         if (!strncmp(part_name, part, part_name_len)) {
209             Evas_Object *close_click = elm_button_add(obj);
210             elm_object_style_set(close_click, "basic_button");
211             evas_object_smart_callback_add(close_click, "clicked", SettingsUI::close_clicked_cb, data);
212             return close_click;
213         }
214     }
215     return nullptr;
216 }
217
218 void SettingsUI::__checkbox_label_click_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
219 {
220     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
221     if (data) {
222         ItemData *id = static_cast<ItemData*>(data);
223
224         if(strcmp(source, "cache_cb_text") == 0 ){
225             Evas_Object *cache_check = elm_layout_content_get(id->settingsUI->m_items_layout, "cache_cb");
226             elm_check_state_set(cache_check, !elm_check_state_get(cache_check));
227         }
228         else if (strcmp(source, "cookies_cb_text") == 0 ){
229             Evas_Object *cookies_check = elm_layout_content_get(id->settingsUI->m_items_layout, "cookies_cb");
230             elm_check_state_set(cookies_check, !elm_check_state_get(cookies_check));
231         }
232         else if (strcmp(source, "history_cb_text") == 0 ){
233             Evas_Object *history_check = elm_layout_content_get(id->settingsUI->m_items_layout, "history_cb");
234             elm_check_state_set(history_check, !elm_check_state_get(history_check));
235         }
236         else{
237             BROWSER_LOGD("[%s:%d] - no matched source", __PRETTY_FUNCTION__, __LINE__);
238         }
239     }
240 }
241
242 void SettingsUI::close_clicked_cb(void* data, Evas_Object*, void*)
243 {
244     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
245     if (data) {
246         ItemData * id = static_cast<ItemData*>(data);
247         id->settingsUI->closeSettingsUIClicked(std::string());
248         id->settingsUI->clearItems();
249     }
250 }
251
252 void SettingsUI::hide()
253 {
254     evas_object_hide(elm_layout_content_get(m_settings_layout, "action_bar_swallow"));
255     evas_object_hide(elm_layout_content_get(m_settings_layout, "settings_scroller_swallow"));
256     evas_object_hide(m_settings_layout);
257 }
258
259 void SettingsUI::_del_selected_data_clicked_cb(void *data, Evas_Object*, void*)
260 {
261     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
262     if (data) {
263         ItemData *id = static_cast<ItemData*>(data);
264         Evas_Object *cache_check = elm_layout_content_get(id->settingsUI->m_items_layout, "cache_cb");
265         Evas_Object *cookies_check = elm_layout_content_get(id->settingsUI->m_items_layout, "cookies_cb");
266         Evas_Object *history_check = elm_layout_content_get(id->settingsUI->m_items_layout, "history_cb");
267         std::string type;
268         elm_check_state_get(cache_check) ? type += "_CACHE" : "";
269         elm_check_state_get(cookies_check) ? type += "_COOKIES" : "";
270         elm_check_state_get(history_check) ? type += "_HISTORY" : "";
271         id->settingsUI->deleteSelectedDataClicked(type);
272     }
273 }
274
275 void SettingsUI::_reset_mv_clicked_cb(void *data, Evas_Object*, void*)
276 {
277     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
278     if (data) {
279         ItemData* itemData = static_cast<ItemData*>(data);
280         itemData->settingsUI->resetMostVisitedClicked(std::string());
281     }
282 }
283
284 void SettingsUI::_reset_browser_clicked_cb(void *data, Evas_Object*, void*)
285 {
286     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
287     if (data) {
288         ItemData* itemData = static_cast<ItemData*>(data);
289         itemData->settingsUI->resetBrowserClicked(std::string());
290     }
291 }
292
293 void SettingsUI::clearItems()
294 {
295     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
296     hide();
297     elm_genlist_clear(m_genListActionBar);
298 }
299
300 }
301 }