Tizen 2.4 SDK Rev5
[apps/home/b2-clocksetting.git] / src / setting-motion.c
1 /*
2  *  Copyright (c) 2014 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 /*
18  * setting-motion.c
19  *
20  *  Created on: Oct 9, 2013
21  *      Author: min-hoyun
22  */
23
24 /*#include <capability_manager.h> */
25 #include "setting-motion.h"
26
27
28 static struct _motion_menu_item motion_menu_its[] = {
29         { "IDS_WMGR_MBODY_SMART_RELAY",          0, _motion_gl_smart_relay_cb },
30         { "IDS_WMGR_MBODY_WAKE_UP_GESTURE",  0, _motion_gl_wake_up_cb     },
31         { NULL, 0, NULL }
32 };
33
34 static char *wake_up_gesture_str[] = {
35         "IDS_ST_BODY_OFF_M_STATUS",
36         "IDS_ST_BUTTON_CLOCK",
37         "IDS_WMGR_OPT_LAST_VIEWED_SCREEN"
38 };
39
40 static struct _motion_data motion_data;
41 static int is_called_myself;
42
43
44 static void init_motion_value()
45 {
46         motion_data.is_enable_smart_relay = 0;
47         motion_data.is_enable_wake_up_gesture = 0;
48         motion_data.wake_up_gesture_type = SETTING_WAKE_UP_GESTURE_LAST_VIEWED_SCREEN;
49
50         motion_data.temp_ad = NULL;
51         motion_data.g_motion_genlist = NULL;
52         is_called_myself = 0;
53 }
54
55 void _initialize_motion()
56 {
57         init_motion_value();
58
59         /* motion vconf changed callback */
60         register_vconf_changing(VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING, motion_vconf_changed_cb, NULL);
61         register_vconf_changing(VCONFKEY_WMS_SMART_RELAY, motion_vconf_changed_cb, NULL);
62 }
63
64 void motion_vconf_changed_cb(keynode_t *key, void *data)
65 {
66         DBG("Setting - motion_vconf_changed_cb() is called!");
67
68         char *vconf_name = vconf_keynode_get_name(key);
69         if (!vconf_name || is_called_myself) {
70                 is_called_myself = 0;
71                 return;
72         }
73
74         if (!strcmp(vconf_name, VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING)) {
75                 vconf_get_int(VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING, &motion_data.wake_up_gesture_type);
76
77                 DBG("Setting - wake_up_gesture_type : %d", motion_data.wake_up_gesture_type);
78         } else if (!strcmp(vconf_name, VCONFKEY_WMS_SMART_RELAY)) {
79                 vconf_get_bool(VCONFKEY_WMS_SMART_RELAY, &motion_data.is_enable_smart_relay);
80
81                 DBG("Setting - is_enable_smart_relay : %d", motion_data.is_enable_smart_relay);
82         }
83
84         if (motion_data.g_motion_genlist) {
85                 /*elm_genlist_realized_items_update(motion_data.g_motion_genlist); */
86                 elm_radio_value_set(motion_data.temp_ad->wake_up_guesture_rdg, motion_data.wake_up_gesture_type);
87         }
88 }
89
90 Eina_Bool _clear_motion_cb(void *data, Elm_Object_Item *it)
91 {
92         init_motion_value();
93
94         /* unregister motion vconf changed callback */
95         unregister_vconf_changing(VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING, motion_vconf_changed_cb);
96         unregister_vconf_changing(VCONFKEY_WMS_SMART_RELAY, motion_vconf_changed_cb);
97
98         return EINA_TRUE;
99 }
100
101 void _motion_gl_smart_relay_cb(void *data, Evas_Object *obj, void *event_info)
102 {
103         Elm_Object_Item *it = (Elm_Object_Item *)event_info;
104         appdata *ad = data;
105
106         if (ad == NULL) {
107                 DBG("%s", "_motion_gl_smart_relay_cb - ad or check is null");
108                 return;
109         }
110
111         is_called_myself = 1;
112
113         motion_data.is_enable_smart_relay = (motion_data.is_enable_smart_relay) ? 0 : 1;
114
115         vconf_set_bool(VCONFKEY_WMS_SMART_RELAY, motion_data.is_enable_smart_relay);
116
117         elm_genlist_item_selected_set(it, EINA_FALSE);
118         elm_genlist_item_update(it);
119 }
120
121 void _motion_gl_wake_up_guesture_radio_cb(void *data, Evas_Object *obj, void *event_info)
122 {
123         Elm_Object_Item *it = (Elm_Object_Item *)event_info;
124         elm_genlist_item_selected_set(it, EINA_FALSE);
125
126         int wake_up_mode = (int)data;
127
128         is_called_myself = 1;
129
130         vconf_set_int(VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING, wake_up_mode);
131
132         elm_genlist_item_update(it);
133
134         elm_naviframe_item_pop(motion_data.temp_ad->nf);
135         if (motion_data.temp_ad && motion_data.temp_ad->wake_up_guesture_rdg) {
136                 evas_object_del(motion_data.temp_ad->wake_up_guesture_rdg);
137                 motion_data.temp_ad->wake_up_guesture_rdg = NULL;
138         }
139
140         if (motion_data.g_motion_genlist) {
141                 elm_genlist_realized_items_update(motion_data.g_motion_genlist);
142         }
143 }
144
145 char *_get_wake_up_gesture_sub_title()
146 {
147         int gusture_mode = 0;
148         vconf_get_int(VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING, &gusture_mode);
149
150         DBG("VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING : %d", gusture_mode);
151
152         return _(wake_up_gesture_str[gusture_mode % 3]);
153 }
154
155 char *_gl_wake_up_guesture_mode_title_get(void *data, Evas_Object *obj, const char *part)
156 {
157         char buf[1024] = {0,};
158         Motion_Item_Data *id = data;
159         int index = id->index;
160
161         if (!strcmp(part, "elm.text") || !strcmp(part, "elm.text.1")) {
162                 snprintf(buf, sizeof(buf) - 1, "%s", _(wake_up_gesture_str[index % 3]));
163         }
164         return strdup(buf);
165 }
166
167 Evas_Object *_gl_wake_up_guesture_ridio_get(void *data, Evas_Object *obj, const char *part)
168 {
169         Evas_Object *radio = NULL;
170         Evas_Object *radio_main = evas_object_data_get(obj, "radio_main");
171         Item_Data *id = data;
172         int index = id->index;
173         int wake_up_mode = 0;
174
175         if (!strcmp(part, "elm.icon")) {
176                 DBG("radio get");
177                 radio = elm_radio_add(obj);
178                 elm_object_style_set(radio, "list");
179                 elm_radio_state_value_set(radio, id->index);
180                 evas_object_size_hint_align_set(radio, EVAS_HINT_FILL, EVAS_HINT_FILL);
181                 evas_object_size_hint_weight_set(radio, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
182                 elm_radio_group_add(radio, radio_main);
183                 evas_object_propagate_events_set(radio, EINA_FALSE);
184                 evas_object_repeat_events_set(radio, EINA_TRUE);
185                 evas_object_smart_callback_add(radio, "changed", NULL, (void *)id->index);
186
187                 vconf_get_int(VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING, &wake_up_mode);
188                 if (wake_up_mode == id->index) {
189                         elm_radio_value_set(radio_main, wake_up_mode);
190                 }
191         }
192         return radio;
193 }
194
195 static void _wake_up_guesture_gl_del(void *data, Evas_Object *obj)
196 {
197         /* FIXME: Unrealized callback can be called after this. */
198         /* Accessing Item_Data can be dangerous on unrealized callback. */
199         struct _motion_wake_up_guesture_item *id = data;
200         if (id)
201                 free(id);
202 }
203
204 void _show_wake_up_guesture_list(void *data)
205 {
206         appdata *ad = data;
207         if (ad == NULL) {
208                 DBG("%s", "_show_wake_up_guesture_list - appdata is null");
209                 return;
210         }
211
212         Evas_Object *genlist  = NULL;
213         Elm_Object_Item *nf_it = NULL;
214
215         Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
216         itc->item_style = "1text.1icon.1";
217         itc->func.text_get = _gl_wake_up_guesture_mode_title_get;
218         itc->func.content_get = _gl_wake_up_guesture_ridio_get;
219         itc->func.del = _wake_up_guesture_gl_del;
220
221         Evas_Object *layout = elm_layout_add(ad->nf);
222         elm_layout_file_set(layout, EDJE_PATH, "setting/genlist/layout");
223         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
224
225         genlist = elm_genlist_add(layout);
226         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
227         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
228
229         int idx;
230         for (idx = 0; idx < MOTION_WAKE_UP_ITEM_COUNT; idx++) {
231                 Item_Data *id = calloc(sizeof(Item_Data), 1);
232                 if (id) {
233                         id->index = idx;
234                         id->item = elm_genlist_item_append(genlist,     itc, id, NULL, ELM_GENLIST_ITEM_NONE,
235                                                                                            _motion_gl_wake_up_guesture_radio_cb,
236                                                                                            (void *)idx);
237                 }
238         }
239         motion_data.g_motion_genlist = genlist;
240         ad->wake_up_guesture_rdg = elm_radio_add(genlist);
241         elm_radio_state_value_set(ad->wake_up_guesture_rdg, MOTION_WAKE_UP_ITEM_COUNT);
242         elm_radio_value_set(ad->wake_up_guesture_rdg, 0);
243
244         evas_object_data_set(genlist, "radio_main", ad->wake_up_guesture_rdg);
245
246         elm_genlist_item_class_free(itc);
247
248         motion_data.temp_ad = ad;
249
250         elm_object_part_content_set(layout, "elm.genlist", genlist);
251
252         nf_it = elm_naviframe_item_push(ad->nf, NULL, NULL, NULL, layout, NULL);
253         elm_naviframe_item_pop_cb_set(nf_it, _clear_motion_cb, ad);
254         elm_naviframe_item_title_enabled_set(nf_it, EINA_FALSE, EINA_FALSE);
255 }
256
257 void _motion_gl_wake_up_cb(void *data, Evas_Object *obj, void *event_info)
258 {
259         Elm_Object_Item *it = (Elm_Object_Item *)event_info;
260         elm_genlist_item_selected_set(it, EINA_FALSE);
261
262         _initialize_motion();
263
264         appdata *ad = data;
265
266         if (ad == NULL) {
267                 DBG("%s", "_motion_gl_smart_relay_cb - ad or check is null");
268                 return;
269         }
270
271         _show_wake_up_guesture_list(ad);
272 }
273
274 void _motion_chk_changed_cb(void *data, Evas_Object *obj, void *event_info)
275 {
276         Evas_Object *check = obj;
277
278         if (check == NULL)
279                 return;
280
281         /* check state callback */
282         DBG("%s : %d", "_motion_chk_changed_cb - current state", elm_check_state_get(check));
283 }
284
285 char *_gl_motion_title_get(void *data, Evas_Object *obj, const char *part)
286 {
287         char buf[1024] = {0,};
288         Motion_Item_Data *id = data;
289         int index = id->index;
290
291         if (!strcmp(part, "elm.text.1")) {
292                 bool is_operator_dcm = 0;
293                 char *salescode = vconf_get_str(VCONFKEY_CSC_SALESCODE);
294                 if (salescode && (!strcmp(salescode, "DCM") || !strcmp(salescode, "KDI") || !strcmp(salescode, "XJP")))
295                         is_operator_dcm = 1;
296                 FREE(salescode);
297
298                 if (is_operator_dcm && !strcmp(motion_menu_its[index % 3].name, "IDS_WMGR_MBODY_SMART_RELAY")) {
299                         strncpy(buf, _("IDS_WMGR_MBODY_SMART_TOSS_JPN"), sizeof(buf) - 1);
300                 } else {
301                         snprintf(buf, sizeof(buf) - 1, "%s", _(motion_menu_its[index % 3].name));
302                 }
303         } else if (!strcmp(part, "elm.text.2")) {
304                 if (index == 0) {
305                         vconf_get_bool(VCONFKEY_WMS_SMART_RELAY, &motion_data.is_enable_smart_relay);
306                         snprintf(buf, sizeof(buf) - 1, "%s", (motion_data.is_enable_smart_relay) ? _("IDS_ST_BODY_ON_M_STATUS") : _("IDS_ST_BODY_OFF_M_STATUS"));
307                 } else {
308                         snprintf(buf, sizeof(buf) - 1, "%s", _get_wake_up_gesture_sub_title());
309                 }
310                 index++;
311         }
312         return strdup(buf);
313 }
314
315 Evas_Object *_gl_motion_check_get(void *data, Evas_Object *obj, const char *part)
316 {
317         Evas_Object *check = NULL;
318         Motion_Item_Data *id = data;
319         int index = id->index;
320
321         if (!strcmp(part, "elm.icon")) {
322                 check = elm_check_add(obj);
323                 vconf_get_bool(VCONFKEY_WMS_SMART_RELAY, &motion_data.is_enable_smart_relay);
324                 elm_check_state_set(check, (motion_data.is_enable_smart_relay) ? EINA_TRUE : EINA_FALSE);
325                 evas_object_smart_callback_add(check, "changed", _motion_chk_changed_cb, (void *)1);
326                 evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
327                 evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
328
329                 index++;
330         }
331
332         return check;
333 }
334
335 static void _motion_gl_del(void *data, Evas_Object *obj)
336 {
337         /* FIXME: Unrealized callback can be called after this. */
338         /* Accessing Item_Data can be dangerous on unrealized callback. */
339         Motion_Item_Data *id = data;
340         if (id)
341                 free(id);
342 }
343
344 #ifdef O_TYPE
345 static char *
346 _gl_menu_title_text_get(void *data, Evas_Object *obj, const char *part)
347 {
348         char buf[1024];
349
350         snprintf(buf, 1023, "%s", _("IDS_WMGR_HEADER_MOTIONS"));
351         return strdup(buf);
352 }
353 #endif
354
355 Evas_Object *_create_motion_list(void *data)
356 {
357         appdata *ad = data;
358         if (ad == NULL) {
359                 DBG("%s", "_create_motion_list - appdata is null");
360                 return NULL;
361         }
362         Evas_Object *genlist  = NULL;
363         Elm_Genlist_Item_Class *temp_itc = NULL;
364         struct _motion_menu_item *menu_its = NULL;
365         int idx;
366
367         Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
368         itc->item_style = "2text.1icon.1";
369         itc->func.text_get = _gl_motion_title_get;
370         itc->func.content_get = _gl_motion_check_get;
371         itc->func.del = _motion_gl_del;
372
373         Elm_Genlist_Item_Class *itc_wake_up = elm_genlist_item_class_new();
374         itc_wake_up->item_style = "2text";
375         itc_wake_up->func.text_get = _gl_motion_title_get;
376         itc_wake_up->func.del = _motion_gl_del;
377
378         Evas_Object *layout = elm_layout_add(ad->nf);
379         elm_layout_file_set(layout, EDJE_PATH, "setting/genlist/layout");
380         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
381
382         genlist = elm_genlist_add(layout);
383         elm_genlist_block_count_set(genlist, 14);
384         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
385
386         menu_its = motion_menu_its;
387 #ifdef _CIRCLE
388         Elm_Genlist_Item_Class *title_item = elm_genlist_item_class_new();
389         title_item ->func.text_get = _gl_menu_title_text_get;
390         title_item->item_style = "title";
391         title_item->func.del = _motion_gl_del;
392
393         elm_genlist_item_append(genlist, title_item, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
394
395         elm_genlist_item_class_free(title_item);
396 #endif
397
398         char *val = NULL;
399
400         for (idx = 0; idx < MOTION_ITEM_COUNT; idx++) {
401                 if (idx == 0) {
402                         temp_itc = itc;
403                 } else {
404                         temp_itc = itc_wake_up;
405                 }
406
407                 Motion_Item_Data *id = calloc(sizeof(Motion_Item_Data), 1);
408                 if (id) {
409                         id->index = idx;
410                         id->item = elm_genlist_item_append(
411                                                    genlist,                             /* genlist object */
412                                                    temp_itc,                            /* item class */
413                                                    id,                          /* data */
414                                                    NULL,
415                                                    ELM_GENLIST_ITEM_NONE,
416                                                    menu_its[idx].func,  /* call back */
417                                                    ad);
418                 }
419         }
420         elm_genlist_item_class_free(itc);
421         elm_genlist_item_class_free(itc_wake_up);
422
423 #ifdef _CIRCLE
424         Elm_Genlist_Item_Class *padding = elm_genlist_item_class_new();
425         padding->item_style = "padding";
426         padding->func.del = _motion_gl_del;
427
428         elm_genlist_item_append(genlist, padding, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
429         elm_genlist_item_class_free(padding);
430 #endif
431         motion_data.g_motion_genlist = genlist;
432
433         elm_object_part_content_set(layout, "elm.genlist", genlist);
434
435         return layout;
436 }