Add net.stc-popup application with syspopup_launch and PO files
[platform/core/connectivity/stc-manager.git] / plugin / net.stc-popup / src / stc-popup-ui.c
1 #include <glib.h>
2
3 #include <syspopup.h>
4 #include <syspopup_caller.h>
5 #include <bundle.h>
6 #include <bundle_internal.h>
7 #include <app_control_internal.h>
8
9 #include "stc-popup-ui.h"
10 #include "stc-popup-util.h"
11
12 static void win_delete_request_cb(void *data, Evas_Object *obj,
13                                   void *event_info)
14 {
15         ui_app_exit();
16 }
17
18 static void win_back_cb(void *data, Evas_Object *obj, void *event_info)
19 {
20         appdata_s *ad = data;
21         /* Let window go to hide state. */
22         elm_win_lower(ad->win);
23 }
24
25 static void _response_button1_cb(void *data, Evas_Object *obj, void *event_info)
26 {
27         Evas_Object *popup = (Evas_Object *)data;
28
29         if (popup)
30                 evas_object_del(popup);
31         if (obj)
32                 evas_object_del(obj);
33
34         elm_exit();
35 }
36
37 static void _response_button2_cb(void *data, Evas_Object *obj, void *event_info)
38 {
39         Evas_Object *popup = (Evas_Object *)data;
40
41         if (popup)
42                 evas_object_del(popup);
43         if (obj)
44                 evas_object_del(obj);
45
46         elm_exit();
47 }
48
49 static void _popup_hide_cb(void *data, Evas_Object *obj, void *event_info)
50 {
51         if (!obj)
52                 return;
53         elm_popup_dismiss(obj);
54         win_back_cb(data, obj, event_info);
55 }
56
57 static void _popup_hide_finished_cb(void *data, Evas_Object *obj,
58                                     void *event_info)
59 {
60         if (!obj)
61                 return;
62         evas_object_del(obj);
63         win_back_cb(data, obj, event_info);
64 }
65
66 static void _popup_title_text_2button(appdata_s *ad, const char *title,
67                                       const char *body)
68 {
69         Evas_Object *popup;
70         Evas_Object *btn;
71         Evas_Object *icon;
72         Evas_Object *layout;
73
74         popup = elm_popup_add(ad->win);
75         elm_object_style_set(popup, "circle");
76         evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
77         eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, _popup_hide_cb, ad);
78         evas_object_smart_callback_add(popup, "dismissed", _popup_hide_finished_cb, ad);
79
80         layout = elm_layout_add(popup);
81         elm_layout_theme_set(layout, "layout", "popup", "content/circle/buttons2");
82         elm_object_part_text_set(layout, "elm.text.title", title);
83
84         elm_object_part_text_set(layout, "elm.text", body);
85         elm_object_content_set(popup, layout);
86
87         btn = elm_button_add(popup);
88         elm_object_style_set(btn, "popup/circle/left");
89         evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
90         elm_object_part_content_set(popup, "button1", btn);
91         evas_object_smart_callback_add(btn, "clicked", _response_button1_cb, popup);
92
93         icon = elm_image_add(btn);
94         elm_image_file_set(icon, IMAGEDIR"/popup_btn_delete.png", NULL);
95         evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
96         elm_object_part_content_set(btn, "elm.swallow.content", icon);
97         evas_object_show(icon);
98
99         btn = elm_button_add(popup);
100         elm_object_style_set(btn, "popup/circle/right");
101         evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
102         elm_object_part_content_set(popup, "button2", btn);
103         evas_object_smart_callback_add(btn, "clicked", _response_button2_cb, popup);
104
105         icon = elm_image_add(btn);
106         elm_image_file_set(icon, IMAGEDIR"/popup_btn_check.png", NULL);
107         evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
108         elm_object_part_content_set(btn, "elm.swallow.content", icon);
109         evas_object_show(icon);
110
111         evas_object_show(popup);
112 }
113
114 static void create_window(appdata_s *ad)
115 {
116         /*
117          * Widget Tree
118          * Window
119          *  - conform
120          *   - layout main */
121
122         /* Window */
123         ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
124         elm_win_conformant_set(ad->win, EINA_TRUE);
125         elm_win_autodel_set(ad->win, EINA_TRUE);
126
127         if (elm_win_wm_rotation_supported_get(ad->win)) {
128                 int rots[4] = { 0, 90, 180, 270 };
129                 elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
130         }
131
132         evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
133         eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
134
135         /* Conformant */
136         ad->conform = elm_conformant_add(ad->win);
137         evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
138         elm_win_resize_object_add(ad->win, ad->conform);
139         evas_object_show(ad->conform);
140
141         /* Base Layout */
142         ad->layout = elm_layout_add(ad->conform);
143         evas_object_size_hint_weight_set(ad->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
144         elm_layout_theme_set(ad->layout, "layout", "application", "default");
145         evas_object_show(ad->layout);
146
147         elm_object_content_set(ad->conform, ad->layout);
148
149         /* Show window after base gui is set up */
150         evas_object_show(ad->win);
151 }
152
153 static void remove_window(appdata_s *ad)
154 {
155         if (ad->layout) {
156                 evas_object_del(ad->layout);
157                 ad->layout = NULL;
158         }
159
160         if (ad->conform) {
161                 evas_object_del(ad->conform);
162                 ad->conform = NULL;
163         }
164
165         if (ad->win) {
166                 evas_object_del(ad->win);
167                 ad->win = NULL;
168         }
169 }
170
171 void create_popup(appdata_s *ad, popup_type_e type, const char *app_id)
172 {
173         if (ad->win != NULL)
174                 elm_win_raise(ad->win);
175         else
176                 create_window(ad);
177
178         switch (type) {
179         case POPUP_TYPE_RSTN:
180                 _popup_title_text_2button(ad, DATA_USAGE_RSTN_TITLE,
181                                           DATA_USAGE_RSTN_BODY);
182                 break;
183         case POPUP_TYPE_WARN:
184                 _popup_title_text_2button(ad, DATA_USAGE_WARN_TITLE,
185                                           DATA_USAGE_WARN_BODY);
186                 break;
187         default:
188                 STC_LOGE("Unhandled popup type");
189         };
190 }
191
192 static bool app_create(void *data)
193 {
194         /* Handle the app create request. */
195         return true;
196 }
197
198 static void app_control(app_control_h app_control, void *data)
199 {
200         __STC_LOG_FUNC_ENTER__;
201         /* Handle the launch request. */
202         const char *syspopup_content = NULL;
203         const char *syspopup_type = NULL;
204         const char *app_id = NULL;
205         const char *if_type = NULL;
206         const char *limit = NULL;
207
208         appdata_s *ad = data;
209         bundle *b = NULL;
210
211         /* Start Main UI */
212         app_control_to_bundle(app_control, &b);
213
214         if (syspopup_has_popup(b)) {
215                 /* Destroy the existing popup*/
216                 STC_LOGE("A popup is already present!");
217                 remove_window(ad);
218         }
219
220         syspopup_content = bundle_get_val(b, "_SYSPOPUP_CONTENT_");
221         if (syspopup_content == NULL) {
222                 STC_LOGE("syspopup_content is NULL!");
223                 return;
224         }
225
226         syspopup_type = bundle_get_val(b, "_SYSPOPUP_TYPE_");
227         if (syspopup_type == NULL) {
228                 STC_LOGE("syspopup_type is NULL!");
229                 return;
230         }
231
232         app_id = bundle_get_val(b, "_APP_ID_");
233         if (app_id == NULL) {
234                 STC_LOGE("app_id is NULL!");
235                 return;
236         }
237
238         if_type = bundle_get_val(b, "_IF_TYPE_");
239         if (if_type == NULL) {
240                 STC_LOGE("if_type is NULL!");
241                 return;
242         }
243
244         if (g_strcmp0(syspopup_type, "restriction_noti") == 0) {
245
246                 limit = bundle_get_val(b, "_RESTRICTION_LIMIT_");
247                 if (limit == NULL) {
248                         STC_LOGE("limit is NULL!");
249                         return;
250                 }
251
252                 create_popup(ad, POPUP_TYPE_RSTN, app_id); //, limit);
253
254         } else if (g_strcmp0(syspopup_type, "warning_noti") == 0) {
255
256                 limit = bundle_get_val(b, "_WARN_LIMIT_");
257                 if (limit == NULL) {
258                         STC_LOGE("limit is NULL!");
259                         return;
260                 }
261
262                 create_popup(ad, POPUP_TYPE_WARN, app_id); //, limit);
263
264         } else {
265                 STC_LOGE("Unknown event");
266         }
267         __STC_LOG_FUNC_EXIT__;
268 }
269
270 static void app_pause(void *data)
271 {
272         /* Take necessary actions when application becomes invisible. */
273 }
274
275 static void app_resume(void *data)
276 {
277         /* Take necessary actions when application becomes visible. */
278 }
279
280 static void app_terminate(void *data)
281 {
282         /* Release all resources. */
283 }
284
285 static void ui_app_lang_changed(app_event_info_h event_info, void *user_data)
286 {
287         /*APP_EVENT_LANGUAGE_CHANGED*/
288         char *locale = NULL;
289         system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &locale);
290         elm_language_set(locale);
291         free(locale);
292         return;
293 }
294
295 static void ui_app_orient_changed(app_event_info_h event_info, void *user_data)
296 {
297         /*APP_EVENT_DEVICE_ORIENTATION_CHANGED*/
298         return;
299 }
300
301 static void ui_app_region_changed(app_event_info_h event_info, void *user_data)
302 {
303         /*APP_EVENT_REGION_FORMAT_CHANGED*/
304 }
305
306 static void ui_app_low_battery(app_event_info_h event_info, void *user_data)
307 {
308         /*APP_EVENT_LOW_BATTERY*/
309 }
310
311 static void ui_app_low_memory(app_event_info_h event_info, void *user_data)
312 {
313         /*APP_EVENT_LOW_MEMORY*/
314 }
315
316 int stc_popup_app_init(int argc, char *argv[], appdata_s *ad)
317 {
318         int ret = 0;
319
320         ui_app_lifecycle_callback_s event_callback = {0,};
321         app_event_handler_h handlers[5] = {NULL, };
322
323         event_callback.create = app_create;
324         event_callback.terminate = app_terminate;
325         event_callback.pause = app_pause;
326         event_callback.resume = app_resume;
327         event_callback.app_control = app_control;
328
329         ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, ad);
330         ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, ad);
331         ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, ad);
332         ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, ad);
333         ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, ad);
334
335         ret = ui_app_main(argc, argv, &event_callback, ad);
336         if (ret != APP_ERROR_NONE) {
337                 STC_LOGE("app_main() is failed. err = %d", ret);
338         }
339
340         return ret;
341 }
342
343 int main(int argc, char *argv[])
344 {
345         appdata_s ad = {0,};
346
347         STC_LOGI("Smart Traffic Control Popup");
348
349         return stc_popup_app_init(argc, argv, &ad);
350 }