tizen 2.3 release
[apps/home/b2-clocksetting.git] / src / setting-motion.c
1 /*
2  * Copyright (c) 2010 Samsung Electronics, Inc.
3  * All rights reserved.
4  *
5  * This software is a confidential and proprietary information
6  * of Samsung Electronics, Inc. ("Confidential Information").  You
7  * shall not disclose such Confidential Information and shall use
8  * it only in accordance with the terms of the license agreement
9  * you entered into with Samsung Electronics.
10  */
11 /*
12  * setting-motion.c
13  *
14  *  Created on: Oct 9, 2013
15  *      Author: min-hoyun
16  */
17
18 //#include <capability_manager.h>
19 #include "setting-motion.h"
20
21
22 static struct _motion_menu_item motion_menu_its[] = {
23         { "IDS_WMGR_MBODY_SMART_RELAY",          0, _motion_gl_smart_relay_cb },
24         { "IDS_WMGR_MBODY_WAKE_UP_GESTURE",  0, _motion_gl_wake_up_cb     },
25         { NULL, 0, NULL }
26 };
27
28 static char * wake_up_gesture_str[] = {
29                 "IDS_ST_BODY_OFF_M_STATUS",
30                 "IDS_ST_BUTTON_CLOCK",
31                 "IDS_WMGR_OPT_LAST_VIEWED_SCREEN"
32 };
33
34 static struct _motion_data motion_data;
35 static int is_called_myself;
36
37
38 static void init_motion_value()
39 {
40         motion_data.is_enable_smart_relay = 0;
41         motion_data.is_enable_wake_up_gesture = 0;
42         motion_data.wake_up_gesture_type = SETTING_WAKE_UP_GESTURE_LAST_VIEWED_SCREEN;
43
44         motion_data.temp_ad = NULL;
45         motion_data.g_motion_genlist = NULL;
46         is_called_myself = 0;
47 }
48
49 void _initialize_motion()
50 {
51         init_motion_value();
52
53         /* motion vconf changed callback */
54         register_vconf_changing(VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING, motion_vconf_changed_cb, NULL);
55         register_vconf_changing(VCONFKEY_WMS_SMART_RELAY, motion_vconf_changed_cb, NULL);
56 }
57
58 void motion_vconf_changed_cb(keynode_t * key, void * data)
59 {
60         DBG("Setting - motion_vconf_changed_cb() is called!");
61
62         char * vconf_name = vconf_keynode_get_name(key);
63         if(!vconf_name || is_called_myself) {
64                 is_called_myself = 0;
65                 return;
66         }
67
68         if( !strcmp(vconf_name, VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING) )
69         {
70                 vconf_get_int(VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING, &motion_data.wake_up_gesture_type);
71
72                 DBG("Setting - wake_up_gesture_type : %d", motion_data.wake_up_gesture_type);
73         }
74         else if( !strcmp(vconf_name, VCONFKEY_WMS_SMART_RELAY) )
75         {
76                 vconf_get_bool(VCONFKEY_WMS_SMART_RELAY, &motion_data.is_enable_smart_relay);
77
78                 DBG("Setting - is_enable_smart_relay : %d", motion_data.is_enable_smart_relay);
79         }
80
81         if(motion_data.g_motion_genlist) {
82                 //elm_genlist_realized_items_update(motion_data.g_motion_genlist);
83                 elm_radio_value_set(motion_data.temp_ad->wake_up_guesture_rdg, motion_data.wake_up_gesture_type);
84         }
85 }
86
87 Eina_Bool _clear_motion_cb(void *data, Elm_Object_Item *it)
88 {
89         init_motion_value();
90
91         /* unregister motion vconf changed callback */
92         unregister_vconf_changing(VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING, motion_vconf_changed_cb);
93         unregister_vconf_changing(VCONFKEY_WMS_SMART_RELAY, motion_vconf_changed_cb);
94
95         return EINA_TRUE;
96 }
97
98 void _motion_gl_smart_relay_cb(void *data, Evas_Object *obj, void *event_info)
99 {
100         Elm_Object_Item* it = (Elm_Object_Item *)event_info;
101         appdata *ad = data;
102
103         if( ad == NULL )
104         {
105                 DBG("%s", "_motion_gl_smart_relay_cb - ad or check is null");
106                 return;
107         }
108
109         is_called_myself = 1;
110
111         motion_data.is_enable_smart_relay = (motion_data.is_enable_smart_relay) ? 0 : 1;
112
113         vconf_set_bool(VCONFKEY_WMS_SMART_RELAY, motion_data.is_enable_smart_relay);
114
115         elm_genlist_item_selected_set(it, EINA_FALSE);
116         elm_genlist_item_update(it);
117 }
118
119 void _motion_gl_wake_up_guesture_radio_cb(void *data, Evas_Object *obj, void *event_info)
120 {
121         Elm_Object_Item* it = (Elm_Object_Item *)event_info;
122         elm_genlist_item_selected_set(it, EINA_FALSE);
123
124         int wake_up_mode = (int)data;
125
126         is_called_myself = 1;
127
128         vconf_set_int(VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING, wake_up_mode);
129
130         elm_genlist_item_update(it);
131
132         elm_naviframe_item_pop(motion_data.temp_ad->nf);
133         if( motion_data.temp_ad && motion_data.temp_ad->wake_up_guesture_rdg ) {
134                 evas_object_del(motion_data.temp_ad->wake_up_guesture_rdg);
135                 motion_data.temp_ad->wake_up_guesture_rdg = NULL;
136         }
137
138         if( motion_data.g_motion_genlist ) {
139                 elm_genlist_realized_items_update(motion_data.g_motion_genlist);
140         }
141 }
142
143 char * _get_wake_up_gesture_sub_title()
144 {
145         int gusture_mode = 0;
146         vconf_get_int(VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING, &gusture_mode);
147
148         DBG("VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING : %d", gusture_mode);
149
150         return _(wake_up_gesture_str[gusture_mode % 3]);
151 }
152
153 char * _gl_wake_up_guesture_mode_title_get(void *data, Evas_Object *obj, const char *part)
154 {
155         char buf[1024];
156         Motion_Item_Data *id = data;
157         int index = id->index;
158
159         if( !strcmp(part, "elm.text") || !strcmp(part, "elm.text.1") )
160         {
161                 snprintf(buf, sizeof(buf)-1, "%s", _(wake_up_gesture_str[index % 3]));
162         }
163         return strdup(buf);
164 }
165
166 Evas_Object * _gl_wake_up_guesture_ridio_get(void *data, Evas_Object *obj, const char *part)
167 {
168         Evas_Object *radio = NULL;
169         Evas_Object *radio_main = evas_object_data_get(obj, "radio_main");
170         Item_Data *id = data;
171         int index = id->index;
172         int wake_up_mode = 0;
173
174         if( !strcmp(part, "elm.icon") )
175         {
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         {
209                 DBG("%s", "_show_wake_up_guesture_list - appdata is null");
210                 return;
211         }
212
213         Evas_Object *genlist  = NULL;
214         Elm_Object_Item *nf_it = NULL;
215
216         Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
217         itc->item_style = "1text.1icon.1";
218         itc->func.text_get = _gl_wake_up_guesture_mode_title_get;
219         itc->func.content_get = _gl_wake_up_guesture_ridio_get;
220         itc->func.del = _wake_up_guesture_gl_del;
221
222         Evas_Object * layout = elm_layout_add(ad->nf);
223         elm_layout_file_set(layout, EDJE_PATH, "setting/genlist/layout");
224         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
225
226         genlist = elm_genlist_add(layout);
227         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
228         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
229
230         int idx;
231         for( idx = 0; idx < MOTION_WAKE_UP_ITEM_COUNT; idx++ ) {
232                 Item_Data *id = calloc(sizeof(Item_Data), 1);
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         motion_data.g_motion_genlist = genlist;
239         ad->wake_up_guesture_rdg = elm_radio_add(genlist);
240         elm_radio_state_value_set(ad->wake_up_guesture_rdg, MOTION_WAKE_UP_ITEM_COUNT);
241         elm_radio_value_set(ad->wake_up_guesture_rdg, 0);
242
243         evas_object_data_set(genlist, "radio_main", ad->wake_up_guesture_rdg);
244
245         elm_genlist_item_class_free(itc);
246
247         motion_data.temp_ad = ad;
248
249         elm_object_part_content_set(layout, "elm.genlist", genlist);
250
251         nf_it = elm_naviframe_item_push(ad->nf, NULL, NULL, NULL, layout, NULL);
252         elm_naviframe_item_pop_cb_set(nf_it, _clear_motion_cb, ad);
253         elm_naviframe_item_title_enabled_set(nf_it, EINA_FALSE, EINA_FALSE);
254 }
255
256 void _motion_gl_wake_up_cb(void *data, Evas_Object *obj, void *event_info)
257 {
258         Elm_Object_Item* it = (Elm_Object_Item *)event_info;
259         elm_genlist_item_selected_set(it, EINA_FALSE);
260
261         _initialize_motion();
262
263         appdata *ad = data;
264
265         if( ad == NULL )
266         {
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         {
293                 bool is_operator_dcm = 0;
294                 char *salescode = vconf_get_str(VCONFKEY_CSC_SALESCODE);
295                 if(salescode && (!strcmp(salescode, "DCM") || !strcmp(salescode, "KDI") || !strcmp(salescode, "XJP")))
296                         is_operator_dcm = 1;
297                 FREE(salescode);
298
299                 if(is_operator_dcm && !strcmp(motion_menu_its[index % 3].name, "IDS_WMGR_MBODY_SMART_RELAY"))
300                 {
301                         strncpy(buf, _("IDS_WMGR_MBODY_SMART_TOSS_JPN"), sizeof(buf)-1);
302                 }
303                 else
304                 {
305                         snprintf(buf, sizeof(buf)-1, "%s", _(motion_menu_its[index % 3].name));
306                 }
307         }
308         else if( !strcmp(part, "elm.text.2") )
309         {
310                 if( index == 0 )
311                 {
312                         vconf_get_bool(VCONFKEY_WMS_SMART_RELAY, &motion_data.is_enable_smart_relay);
313                         snprintf(buf, sizeof(buf)-1, "%s", (motion_data.is_enable_smart_relay) ? _("IDS_ST_BODY_ON_M_STATUS") : _("IDS_ST_BODY_OFF_M_STATUS"));
314                 }
315                 else
316                 {
317                         snprintf(buf, sizeof(buf)-1, "%s", _get_wake_up_gesture_sub_title());
318                 }
319                 index++;
320         }
321         return strdup(buf);
322 }
323
324 Evas_Object * _gl_motion_check_get(void *data, Evas_Object *obj, const char *part)
325 {
326         Evas_Object *check = NULL;
327         Motion_Item_Data *id = data;
328         int index = id->index;
329
330         if( !strcmp(part, "elm.icon") )
331         {
332                 check = elm_check_add(obj);
333                 vconf_get_bool(VCONFKEY_WMS_SMART_RELAY, &motion_data.is_enable_smart_relay);
334                 elm_check_state_set(check, (motion_data.is_enable_smart_relay) ? EINA_TRUE : EINA_FALSE);
335                 evas_object_smart_callback_add(check, "changed", _motion_chk_changed_cb, (void *)1);
336                 evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
337                 evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
338
339                 index++;
340         }
341
342         return check;
343 }
344
345 static void _motion_gl_del(void *data, Evas_Object *obj)
346 {
347         // FIXME: Unrealized callback can be called after this.
348         // Accessing Item_Data can be dangerous on unrealized callback.
349         Motion_Item_Data *id = data;
350         if (id)
351                 free(id);
352 }
353
354 Evas_Object* _create_motion_list(void* data)
355 {
356         appdata *ad = data;
357         if( ad == NULL )
358         {
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
388 #if 0
389         device_info_h* device_info = NULL;
390         bundle *b = NULL;
391         char *val = NULL;
392         capability_manager_create_device_info(&device_info);
393         capability_manager_get_device_features(device_info, &b);
394         val = bundle_get_val(b, "smartrelay");
395         capability_manager_destroy_device_info(device_info);
396 #else
397         char *val = NULL;
398 #endif
399
400         for (idx = 0; idx < MOTION_ITEM_COUNT; idx++)
401         {
402                 if( idx == 0 ) {
403                         if (val && strcmp(val, "true")) {
404                                 continue;
405                         }
406
407                         temp_itc = itc;
408                 } else {
409                         temp_itc = itc_wake_up;
410                 }
411
412                 Motion_Item_Data *id = calloc(sizeof(Motion_Item_Data), 1);
413                 id->index = idx;
414                 id->item = elm_genlist_item_append(
415                                 genlist,                                // genlist object
416                                 temp_itc,                               // item class
417                                 id,                             // data
418                                 NULL,
419                                 ELM_GENLIST_ITEM_NONE,
420                                 menu_its[ idx ].func,   // call back
421                                 ad);
422         }
423         elm_genlist_item_class_free(itc);
424         elm_genlist_item_class_free(itc_wake_up);
425
426         motion_data.g_motion_genlist = genlist;
427
428         elm_object_part_content_set(layout, "elm.genlist", genlist);
429
430         return layout;
431 }