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