2dd2767a8b41e1b575bd32c51710cf114ab70408
[profile/tv/apps/native/settings.git] / src / view_uigadget.c
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
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 <ui-gadget.h>
18 #include <Ecore_X.h>
19 #include "view_uigadget.h"
20 #include "dbg.h"
21 #include "def.h"
22
23 #define DATA_ID "ugdata"
24
25 struct _data {
26         Evas_Object *win;
27         Evas_Object *base;
28         Evas_Object *subbtn;
29         Evas_Object *main_item_box;
30         Evas_Object *subitem_box;
31
32         const char *display_name;
33         ui_gadget_h ug_handler;
34         Eina_Bool ug_is_existed;
35         struct setting_mgr *mgr;
36         struct settingview_data *view;
37 };
38
39 /**
40 *  This function is invoked to hide view layout.
41 *
42 *  @param base [in] The view layout evas object.
43 *  @return void.
44 */
45 static void _hide(Evas_Object *base)
46 {
47         if (!base)
48                 return;
49
50         evas_object_hide(base);
51 }
52
53 /**
54 *  Hide current ug launcher view, then pop this view from view list and return to main view.
55 *
56 *  @param data [in] The function specific data which hold _data pointer.
57 *  @return void.
58 */
59 static void _back_to_mainview(struct _data *data)
60 {
61         if (!data)
62                 return;
63
64         _hide(data->base);
65         settingmgr_view_pop(data->mgr);
66 }
67
68 /**
69 *  This callback function is invoked with base layout for layout arrangement
70 *  after UI Gadget create create operation is completed.
71 *
72 *  @param ug [in] The handler data representing a UI gadget.
73 *  @param mode [in] The UI gadget mode.
74 *  @param priv [in] The function specific data passed by UG caller.
75 *  @return void.
76 */
77 static void _ug_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv)
78 {
79 }
80
81 /**
82 *  After UG module invoke ug_send_message to send result,
83 *  UG library call this callback function registered by calling ug_create.
84 *
85 *  @param ug [in] The handler data representing a UI gadget.
86 *  @param result [in] The Service handler.
87 *  @param priv [in] The function specific data passed by UG caller.
88 *  @return void.
89 */
90 static void _ug_result_cb(ui_gadget_h ug, service_h result, void *priv)
91 {
92 }
93
94 /**
95 *  This function is invoked to show sub item buttons evas object.
96 *
97 *  @param box [in] The box evas object contained sub item buttons.
98 *  @return void.
99 */
100 static void _show_item_btns(Evas_Object *box)
101 {
102         Eina_List *list, *l;
103         Evas_Object *btn;
104
105         if (!box)
106                 return;
107
108         list = elm_box_children_get(box);
109         if (!list) {
110                 _ERR("button list is null.");
111                 return;
112         }
113
114         EINA_LIST_FOREACH(list, l, btn)
115                 evas_object_show(btn);
116
117         eina_list_free(list);
118 }
119
120 /**
121 *  Send the destroy request, use ug_destroy_me,
122 *  then UG library calls this callback function registered by UG caller.
123 *
124 *  @param ug [in] The handler data representing a UI gadget.
125 *  @param priv [in] The function specific data passed by UG caller.
126 *  @return void.
127 */
128 static void _ug_destroy_cb(ui_gadget_h ug, void *priv)
129 {
130         struct _data *data;
131
132         if (!ug || !priv) {
133                 _ERR("Invalid parameters in ug destroy callback.");
134                 return;
135         }
136
137         data = priv;
138
139         _show_item_btns(data->subitem_box);
140
141         elm_object_focus_set(data->subbtn, EINA_TRUE);
142         elm_object_part_text_set(data->base, UG_TITLE_TEXT, "");
143
144         ug_destroy(ug);
145         data->ug_is_existed = EINA_FALSE;
146         _back_to_mainview(data);
147 }
148
149 /**
150 *  This function is invoked to create UI Gadget with specific UG name.
151 *
152 *  @param data [in] The function specific data which hold _data pointer.
153 *  @return 0 if success, -1 if fail.
154 */
155 static int _load_uigadget(struct _data *data)
156 {
157         ui_gadget_h ug;
158         const char *name;
159         struct settingitem *parent;
160
161         struct ug_cbs cbs = {
162                 .layout_cb = _ug_layout_cb,
163                 .result_cb = _ug_result_cb,
164                 .destroy_cb = _ug_destroy_cb,
165                 .end_cb = NULL
166         };
167
168         if (!data) {
169                 _ERR("private data is null.");
170                 return -1;
171         }
172
173         cbs.priv = data;
174
175         parent = viewdata_get_parentitem(data->view);
176         name = settingitem_get_settingui_name(parent);
177         elm_object_part_text_set(data->base,
178                         UG_TITLE_TEXT, data->display_name);
179
180         ug = ug_create(NULL, name, UG_MODE_FRAMEVIEW, NULL, &cbs);
181         if (!ug) {
182                 _ERR("ug create failed.");
183                 return -1;
184         } else {
185                 data->ug_is_existed = EINA_TRUE;
186                 data->ug_handler = ug;
187                 settingmgr_freeze_timeout(data->mgr);
188         }
189
190         return 0;
191 }
192
193 /**
194 *  This function is invoked to hide sub item buttons evas object.
195 *
196 *  @param box [in] The box evas object contained sub item buttons.
197 *  @return void.
198 */
199 static void _hide_item_btns(Evas_Object *box)
200 {
201         Eina_List *list, *l;
202         Evas_Object *btn;
203
204         if (!box) {
205                 _ERR("item box is null.");
206                 return;
207         }
208
209         list = elm_box_children_get(box);
210         if (!list) {
211                 _ERR("button list is null.");
212                 return;
213         }
214
215         EINA_LIST_FOREACH(list, l, btn)
216                 evas_object_hide(btn);
217
218         eina_list_free(list);
219 }
220
221 /**
222 *  This function is invoked to create UG launcher view layout.
223 *
224 *  @param mgr [in] The setting_mgr data pointer passed by @settingmgr_view_push.
225 *  @param view [in] The settingview_data data pointer passed by @settingmgr_view_push.
226 *  @param prev [in] The parameter data which passed by prev view or NULL.
227 *  @return View layout evas object, NULL on error.
228 */
229 static Evas_Object *_create(struct setting_mgr *mgr,
230                 struct settingview_data *view, void *prev)
231 {
232         Evas_Object *win, *base;
233         struct _data *data;
234         struct evas_obj_data *param;
235         int r;
236
237         if (!mgr || !prev || !view) {
238                 _ERR("mgr is null.");
239                 return NULL;
240         }
241
242         param = prev;
243
244         _hide_item_btns(param->subitem_box);
245
246         win = settingmgr_get_win(mgr);
247         if (!win) {
248                 _ERR("Invalid argument");
249                 return NULL;
250         }
251
252         data = calloc(1, sizeof(struct _data));
253         if (!data) {
254                 _ERR("calloc struct _data failed.");
255                 return NULL;
256         }
257
258         base = elm_layout_add(win);
259         if (!base) {
260                 _ERR("add base layout failed.");
261                 free(data);
262                 return NULL;
263         }
264
265         elm_layout_file_set(base, EDJ_FILE, UG_GROUP);
266
267         data->win = win;
268         data->base = base;
269         data->mgr = mgr;
270         data->view = view;
271         data->subitem_box = param->subitem_box;
272         data->display_name = param->display_name;
273         data->subbtn = param->cur_btn;
274         data->ug_is_existed = EINA_FALSE;
275
276         evas_object_data_set(base, DATA_ID, data);
277
278         r = _load_uigadget(data);
279         if (r == -1) {
280                 _ERR("load ui gadget failed.");
281                 free(data);
282                 evas_object_del(base);
283                 return NULL;
284         }
285
286         return base;
287 }
288
289 /**
290 *  This function is invoked to show view layout.
291 *
292 *  @param base [in] The view layout evas object.
293 *  @return void.
294 */
295 static void _show(Evas_Object *base)
296 {
297         if (!base) {
298                 _ERR("Invalid argument!");
299                 return;
300         }
301
302         evas_object_show(base);
303 }
304
305 /**
306 *  This function is invoked to destroy view layout.
307 *
308 *  @param base [in] The view layout evas object.
309 *  @return void.
310 */
311 static void _destroy(Evas_Object *base)
312 {
313         struct _data *data;
314
315         if (!base) {
316                 _ERR("Invalid argument!");
317                 return;
318         }
319
320         data = evas_object_data_get(base, DATA_ID);
321         if (!data) {
322                 _ERR("Fail to get uglauncher data");
323                 return;
324         }
325
326         if (data->ug_is_existed == EINA_TRUE)
327                 ug_destroy(data->ug_handler);
328
329         if (data->view)
330                 viewdata_release(data->view);
331
332         evas_object_del(base);
333         free(data);
334 }
335
336 static struct setting_class _vclass = {
337         .title = VCLASS_TITLE_UG,
338         .create = _create,
339         .show = _show,
340         .destroy = _destroy,
341         .hide = _hide,
342         .hide_view = 0
343 };
344
345 /**
346 *  This function is invoked to get UI Gadget launcher view class object.
347 *
348 *  @return The setting_class data static pointer, NULL on error.
349 */
350 struct setting_class *view_uigadget_get_vclass(void)
351 {
352         return &_vclass;
353 }