d8dd3f59e5ff56b6a5991f49b4082a688a67221e
[apps/home/wrt-setting.git] / webapp-detail / exceptionsview.cpp
1 /*
2   * Copyright 2012  Samsung Electronics Co., Ltd
3   *
4   * Licensed under the Flora License, Version 1.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://floralicense.org/license/
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 "exceptionsview.h"
18
19 #include <vector>
20 #include <string>
21 #include <cstring>
22 #include <Elementary.h>
23
24 #include <dpl/foreach.h>
25 #include <dpl/assert.h>
26 #include <dpl/string.h>
27 #include <dpl/wrt-dao-ro/widget_dao_read_only.h>
28 #include <wrt-commons/security-origin-dao/security_origin_dao.h>
29
30 //#include <ui-gadget.h>
31 #include "util.h"
32
33 namespace WebAppDetailSetting {
34
35 namespace  {
36 // ELM
37 const char* const ELM_PART_TEXT_1 = "elm.text.1";
38 const char* const ELM_PART_TEXT_2 = "elm.text.2";
39 const char* const ELM_PART_TEXT_3 = "elm.text.3";
40 const char* const ELM_PART_DEFAULT = "default";
41 const char* const ELM_PART_BUTTON1 = "button1";
42 const char* const ELM_PART_BUTTON2 = "button2";
43 const char* const ELM_WIDGET_TYPE_POPUP = "elm_popup";
44 const char* const ELM_GENLIST_ITEM_CLASS_STYLE_DEFAULT = "default";
45 const char* const ELM_GENLIST_ITEM_CLASS_STYLE_3TEXT_1ICON = "3text.1icon";
46 const char* const EVAS_SMART_CALLBACK_CLICKED = "clicked";
47 // TEXT
48 std::vector<std::string> featureText =
49     {"Geolocation", "Web Notification", "Web database", "FileSystem API"};
50 std::vector<std::string> resultText = {"Allow", "Deny"};
51 const unsigned int INDEX_TEXT_ALLOW = 0;
52 const unsigned int INDEX_TEXT_DENY = 1;
53 const char* const SCHEME_FILE = "file";
54 const char* const TEXT_LOCAL = "local";
55 const char* const TEXT_EMPTY = "No exceptions data";
56 const char* const TEXT_POPUP_CONTENT = "Do you want to remove data?";
57 const char* const TEXT_POPUP_L_BUTTON = "YES";
58 const char* const TEXT_POPUP_R_BUTTON = "NO";
59 const char* const TEXT_NAVIFRAME_TITLE = "Exceptions Settings";
60
61 }
62
63 ExceptionsView::ExceptionsView(Evas_Object* navi, DPL::String appID) :
64     m_naviframe(navi)
65 {
66     WrtDB::WidgetDAOReadOnly dao(appID);
67     WrtDB::TizenPkgId pkgName = dao.getTizenPkgId();
68     m_securityOriginDao =
69         SecurityOriginDB::SecurityOriginDAOPtr(
70             new SecurityOriginDB::SecurityOriginDAO(pkgName));
71 }
72
73 ExceptionsView::~ExceptionsView(void)
74 {
75 }
76
77 bool ExceptionsView::loadView(void)
78 {
79     using namespace SecurityOriginDB;
80     resetBase();
81
82     Evas_Object* genlist = NULL;
83     genlist = elm_genlist_add(m_naviframe);
84
85     SecurityOriginDB::SecurityOriginDataList securityOriginDataList =
86         m_securityOriginDao->getSecurityOriginDataList();
87
88     if (securityOriginDataList.empty()) {
89         loadEmptyView(genlist);
90     } else {
91         loadExceptionsSettingsView(genlist, securityOriginDataList);
92     }
93
94     elm_naviframe_item_push(m_naviframe,
95                             TEXT_NAVIFRAME_TITLE,
96                             NULL,
97                             NULL,
98                             genlist,
99                             NULL);
100     resetBase(genlist);
101     return true;
102 }
103
104 void ExceptionsView::loadEmptyView(Evas_Object* genlist)
105 {
106     using namespace SecurityOriginDB;
107
108     Assert(genlist);
109     elm_genlist_block_count_set(genlist, 1);
110
111     // create Security Settings menu
112     static Elm_Genlist_Item_Class itcData = {0,};
113     itcData.item_style = ELM_GENLIST_ITEM_CLASS_STYLE_DEFAULT;
114     itcData.func.text_get = getEmptyTextCallback;
115     itcData.func.content_get = NULL;
116     itcData.func.state_get = NULL;
117     itcData.func.del = NULL;
118
119     Elm_Object_Item* emptyItem =
120         elm_genlist_item_append(genlist,
121                                 &itcData,
122                                 NULL,
123                                 NULL,
124                                 ELM_GENLIST_ITEM_NONE,
125                                 NULL,
126                                 NULL);
127     elm_genlist_item_select_mode_set(emptyItem,
128                                      ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
129 }
130
131 void ExceptionsView::loadExceptionsSettingsView(
132     Evas_Object* genlist,
133     SecurityOriginDB::SecurityOriginDataList securityOriginDataList)
134 {
135     using namespace SecurityOriginDB;
136
137     Assert(genlist);
138     elm_genlist_block_count_set(genlist, securityOriginDataList.size());
139     // create Security Settings menu
140     static Elm_Genlist_Item_Class itcExceptionsSettings = {0,};
141     FOREACH(it, securityOriginDataList) {
142         itcExceptionsSettings.item_style =
143             ELM_GENLIST_ITEM_CLASS_STYLE_3TEXT_1ICON;
144         itcExceptionsSettings.func.text_get = getTextCallback;
145         itcExceptionsSettings.func.content_get = NULL;
146         itcExceptionsSettings.func.state_get = NULL;
147         itcExceptionsSettings.func.del = delCallback;
148
149         ExceptionsSettingsData* data =
150             new ExceptionsSettingsData(m_securityOriginDao.get(),
151                                        *(*it));
152         Elm_Object_Item *objectItem;
153         objectItem = elm_genlist_item_append(genlist,
154                                              &itcExceptionsSettings,
155                                              static_cast<void*>(data),
156                                              NULL,
157                                              ELM_GENLIST_ITEM_NONE,
158                                              selectedCallback,
159                                              NULL);
160         if (m_securityOriginDao->isReadOnly(*(*it))) {
161             elm_object_item_disabled_set(objectItem, EINA_TRUE);
162         }
163     }
164 }
165
166 char* ExceptionsView::getEmptyTextCallback(
167     void* /*data*/,
168     Evas_Object* /*obj*/,
169     const char* /*part*/)
170 {
171     return strdup(TEXT_EMPTY);
172 }
173
174 char* ExceptionsView::getTextCallback(
175     void* data,
176     Evas_Object* obj,
177     const char* part)
178 {
179     using namespace SecurityOriginDB;
180     Assert(data);
181     ExceptionsSettingsData* settingsData =
182         static_cast<ExceptionsSettingsData*>(data);
183     Assert(part);
184     std::string partStr = part;
185
186     if (partStr == ELM_PART_TEXT_1) {
187         // display feature text
188         return strdup(
189             featureText[settingsData->m_originData.feature].c_str());
190     } else if (partStr == ELM_PART_TEXT_2) {
191         // display host text
192         if (DPL::ToUTF8String(settingsData->m_originData.origin.scheme) ==
193                 SCHEME_FILE)
194         {
195             // in case of file scheme, display "local"
196             return strdup(TEXT_LOCAL);
197         } else {
198             return strdup(
199                 DPL::ToUTF8String(
200                     settingsData->m_originData.origin.host).c_str());
201         }
202     } else if (partStr == ELM_PART_TEXT_3) {
203         // display result text
204         Result result =
205             settingsData->m_originDao->getResult(
206                 settingsData->m_originData);
207         if (result == RESULT_ALLOW_ALWAYS) {
208             return strdup(resultText[INDEX_TEXT_ALLOW].c_str());
209         } else if (result == RESULT_DENY_ALWAYS) {
210             return strdup(resultText[INDEX_TEXT_DENY].c_str());
211         } else {
212             return NULL;
213         }
214     }
215
216     return NULL;
217 }
218
219 void ExceptionsView::delCallback(void* data, Evas_Object* /*obj*/)
220 {
221     Assert(data);
222     ExceptionsSettingsData* exceptionsSettingsData =
223         static_cast<ExceptionsSettingsData*>(data);
224     delete exceptionsSettingsData;
225 }
226
227 void ExceptionsView::selectedCallback(
228     void* data,
229     Evas_Object* obj,
230     void* eventInfo)
231 {
232     Assert(eventInfo);
233     Elm_Object_Item* item = static_cast<Elm_Object_Item*>(eventInfo);
234     elm_genlist_item_selected_set(item, EINA_FALSE);
235
236     // create popup
237     Evas_Object* topObject = elm_object_top_widget_get(obj);
238
239     Evas_Object* popup = elm_popup_add(topObject);
240     if (!popup) {
241         return;
242     }
243     evas_object_size_hint_align_set(popup, EVAS_HINT_FILL, EVAS_HINT_FILL);
244     evas_object_size_hint_weight_set(popup,
245                                      EVAS_HINT_EXPAND,
246                                      EVAS_HINT_EXPAND);
247     elm_object_part_text_set(popup, ELM_PART_DEFAULT, TEXT_POPUP_CONTENT);
248
249     Evas_Object* lButton = elm_button_add(popup);
250     elm_object_text_set(lButton, TEXT_POPUP_L_BUTTON);
251     evas_object_smart_callback_add(lButton,
252                                    EVAS_SMART_CALLBACK_CLICKED,
253                                    removeItemCallback,
254                                    static_cast<void*>(item));
255     elm_object_part_content_set(popup, ELM_PART_BUTTON1, lButton);
256     evas_object_show(lButton);
257
258     Evas_Object* rButton = elm_button_add(popup);
259     elm_object_text_set(rButton, TEXT_POPUP_R_BUTTON);
260     evas_object_smart_callback_add(rButton,
261                                    EVAS_SMART_CALLBACK_CLICKED,
262                                    closePopupCallback,
263                                    static_cast<void*>(popup));
264     elm_object_part_content_set(popup, ELM_PART_BUTTON2, rButton);
265     evas_object_show(rButton);
266     evas_object_show(popup);
267 }
268
269 void ExceptionsView::removeItemCallback(
270     void* data,
271     Evas_Object* obj,
272     void* eventInfo)
273 {
274     Assert(data);
275     Elm_Object_Item* item = static_cast<Elm_Object_Item*>(data);
276     ExceptionsSettingsData* settingsData =
277         static_cast<ExceptionsSettingsData*>(elm_object_item_data_get(item));
278     Assert(settingsData);
279
280     // remove data in the security origin dao
281     settingsData ->m_originDao->removeSecurityOriginData(
282         settingsData->m_originData);
283
284     // remove item in the genlist
285     elm_object_item_del(item);
286
287     // remove popup
288     Evas_Object* popup = obj;
289     const char* type = elm_object_widget_type_get(popup);
290     while (type != NULL && strcmp(type, ELM_WIDGET_TYPE_POPUP)) {
291         popup = elm_object_parent_widget_get(popup);
292         type = elm_object_widget_type_get(popup);
293     }
294     evas_object_del(popup);
295 }
296
297 void ExceptionsView::closePopupCallback(
298     void* data,
299     Evas_Object* /*obj*/,
300     void* /*eventInfo*/)
301 {
302     Assert(data);
303     evas_object_del(static_cast<Evas_Object*>(data));
304 }
305 } /* WebAppDetailSetting */