Merge "rename Redwood -> Magnolia" into 2.0_beta
[apps/home/settings.git] / setting-display / src / setting-display-smart-screen.c
1 /*
2  * setting
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
5  *
6  * Contact: MyoungJune Park <mj2004.park@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21 #include <setting-display-smart-screen.h>
22
23 #define SETTING_DISPLAY_SMART_STAY              "IDS_ST_MBODY_SMART_STAY"
24 #define SETTING_DISPLAY_SMART_STAY_DESC         "Screen stays on as long as you are looking at it"
25
26 #define SETTING_DISPLAY_SMART_ROTATION          "IDS_ST_MBODY_SMART_ROTATION"
27 #define SETTING_DISPLAY_SMART_ROTATION_DESC     "Screen display direction adjusts to your angle of sights"
28
29 #define SETTING_DISPLAY_SMART_STAY_DLG_STR1     "Smart stay detects your eyes with the front camera so that the screen stays on when you are looking at it"
30
31 #define SETTING_DISPLAY_SMART_STAY_DLG_STR2     "Smart stay may not work in these situations:<br>"\
32                                                 " .When front camera fails to detect face and eyes<br>"\
33                                                 " .When the source of light is behind you or when using device in the dark<br>"\
34                                                 " .When front camera is used for the application"
35
36 #define SETTING_DISPLAY_SMART_ROTATION_DLG_STR1 "Smart rotation disables auto screen rotation by checking the orientation of your face and the device by its front camera."
37
38 #define SETTING_DISPLAY_SMART_ROTATION_DLG_STR2 "Smart rotation may not work in these situations:<br>"\
39                                                 " .When front camera fails to detect face and eyes<br>"\
40                                                 " .When the source of light is behind you or when using device in the dark<br>"\
41                                                 " .When front camera is used for the application<br>"\
42                                                 "Screen rotation can be slower if Smart rotation enabled"
43 #define DO_NOT_ASK_AGAIN "Don't ask again"
44
45 static int setting_display_smart_screen_create(void *cb);
46 static int setting_display_smart_screen_destroy(void *cb);
47 static int setting_display_smart_screen_update(void *cb);
48 static int setting_display_smart_screen_cleanup(void *cb);
49
50 setting_view setting_view_display_smart_screen = {
51         .create = setting_display_smart_screen_create,
52         .destroy = setting_display_smart_screen_destroy,
53         .update = setting_display_smart_screen_update,
54         .cleanup = setting_display_smart_screen_cleanup,
55 };
56
57 static void
58 __smart_stay_on_resp_cb(void *data, Evas_Object *obj, void *event_info)
59 {
60         SETTING_TRACE_BEGIN;
61         setting_retm_if(NULL == data, "NULL == data");
62         int response_type = btn_type(obj);
63         SettingDisplayUG *ad = (SettingDisplayUG *) data;
64         if (POPUP_RESPONSE_OK == response_type) {       //need set vconf
65                 ret_if (!ad->data_smart_stay);
66                 int err = vconf_set_int(VCONFKEY_PM_SMARTSTAY_STATUS, ad->data_smart_stay->chk_status);
67                 if (0 != err) { //if set failed, need rollback
68                         SETTING_TRACE_ERROR("Set vconf Failed");
69                         if (ad->data_smart_stay) {
70                                 ad->data_smart_stay->chk_status = !ad->data_smart_stay->chk_status;
71                                 elm_check_state_set(ad->data_smart_stay->eo_check, ad->data_smart_stay->chk_status);
72                         }
73                         return;
74                 }
75
76                 if (ad->popup_chk && elm_check_state_get(ad->popup_chk)) {
77                         vconf_set_bool(VCONFKEY_SETAPPL_SMARTSCREEN_SMARTSTAY_STATUS_REMINDER, FALSE);
78                 }
79
80         } else if (POPUP_RESPONSE_CANCEL == response_type) {    //need rollback
81                 if (ad->data_smart_stay) {
82                         ad->data_smart_stay->chk_status = !ad->data_smart_stay->chk_status;
83                         elm_check_state_set(ad->data_smart_stay->eo_check, ad->data_smart_stay->chk_status);
84                 }
85         }
86
87         evas_object_del(ad->popup);
88         ad->popup = NULL;
89         ad->popup_chk = NULL;
90 }
91
92 static void
93 __smart_rotate_on_resp_cb(void *data, Evas_Object *obj, void *event_info)
94 {
95         SETTING_TRACE_BEGIN;
96         setting_retm_if(NULL == data, "NULL == data");
97         int response_type = btn_type(obj);
98         SettingDisplayUG *ad = (SettingDisplayUG *) data;
99         if (POPUP_RESPONSE_OK == response_type) {       //need set vconf
100                 ret_if (!ad->data_smart_rotation);
101                 int err = vconf_set_bool(VCONFKEY_SETAPPL_SMARTSCREEN_SMART_ROTATION, ad->data_smart_rotation->chk_status);
102                 if (0 != err) { //if set failed, need rollback
103                         SETTING_TRACE_ERROR("Set vconf Failed");
104                         if (ad->data_smart_rotation) {
105                                 ad->data_smart_rotation->chk_status = !ad->data_smart_rotation->chk_status;
106                                 elm_check_state_set(ad->data_smart_rotation->eo_check, ad->data_smart_rotation->chk_status);
107                         }
108                         return;
109                 }
110
111                 if (ad->popup_chk && elm_check_state_get(ad->popup_chk)) {
112                         vconf_set_bool(VCONFKEY_SETAPPL_SMARTSCREEN_SMARTROTATE_STATUS_REMINDER, FALSE);
113                 }
114
115         } else if (POPUP_RESPONSE_CANCEL == response_type) {    //need rollback
116                 if (ad->data_smart_rotation) {
117                         ad->data_smart_rotation->chk_status = !ad->data_smart_rotation->chk_status;
118                         elm_check_state_set(ad->data_smart_rotation->eo_check, ad->data_smart_rotation->chk_status);
119                 }
120         }
121
122         evas_object_del(ad->popup);
123         ad->popup = NULL;
124         ad->popup_chk = NULL;
125 }
126
127
128 static void __handle_via_check_status(void *data)
129 {
130         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
131         retm_if(!list_item || !list_item->userdata, "list_item == NULL || list_item->userdata");
132         SettingDisplayUG *ad = list_item->userdata;
133
134         SETTING_TRACE("list_item->chk_status = %d", list_item->chk_status);
135         if (!safeStrCmp(SETTING_DISPLAY_SMART_STAY, list_item->keyStr)) {
136                 int reminder_flag = TRUE;
137                 int ret = vconf_get_bool(VCONFKEY_SETAPPL_SMARTSCREEN_SMARTSTAY_STATUS_REMINDER, &reminder_flag);
138                 if (0 != ret) {
139                         SETTING_TRACE_ERROR("Failed to get vconf value");
140                 }
141                 SETTING_TRACE("reminder_flag:%d", reminder_flag);
142                 if (list_item->chk_status && reminder_flag) {
143                         ad->popup =
144                             setting_create_popup_with_image_check(ad, ad->win_get,
145                                                             _(SETTING_DISPLAY_SMART_STAY),
146                                                             _(SETTING_DISPLAY_SMART_STAY_DLG_STR1),
147                                                             _(SETTING_DISPLAY_SMART_STAY_DLG_STR2),
148                                                             SETTING_ICON_PATH_CFG"SmartScreen.png",
149                                                             _(DO_NOT_ASK_AGAIN),
150                                                             &(ad->popup_chk),
151                                                             __smart_stay_on_resp_cb,
152                                                             0,
153                                                             2, _("IDS_COM_SK_OK"),
154                                                             _("IDS_COM_SK_CANCEL"));
155                         return;
156                 }
157                 ret =
158                     vconf_set_int(VCONFKEY_PM_SMARTSTAY_STATUS, list_item->chk_status);
159                 if (0 != ret) { /* rollback */
160                         SETTING_TRACE_ERROR("Set vconf Failed");
161                         list_item->chk_status = !list_item->chk_status;
162                         elm_check_state_set(list_item->eo_check,
163                                             list_item->chk_status);
164                         return;
165                 }
166
167         } else if(!safeStrCmp(SETTING_DISPLAY_SMART_ROTATION, list_item->keyStr)) {
168                 int reminder_flag = TRUE;
169                 int ret = vconf_get_bool(VCONFKEY_SETAPPL_SMARTSCREEN_SMARTROTATE_STATUS_REMINDER, &reminder_flag);
170                 if (0 != ret) {
171                         SETTING_TRACE_ERROR("Failed to get vconf value");
172                 }
173                 SETTING_TRACE("reminder_flag:%d", reminder_flag);
174                 if (list_item->chk_status && reminder_flag) {
175                         ad->popup =
176                             setting_create_popup_with_image_check(ad, ad->win_get,
177                                                             _(SETTING_DISPLAY_SMART_ROTATION),
178                                                             _(SETTING_DISPLAY_SMART_ROTATION_DLG_STR1),
179                                                             _(SETTING_DISPLAY_SMART_ROTATION_DLG_STR2),
180                                                             SETTING_ICON_PATH_CFG"SmartScreen.png",
181                                                             _(DO_NOT_ASK_AGAIN),
182                                                             &(ad->popup_chk),
183                                                             __smart_rotate_on_resp_cb,
184                                                             0,
185                                                             2, _("IDS_COM_SK_OK"),
186                                                             _("IDS_COM_SK_CANCEL"));
187                         return;
188                 }
189                 ret =
190                     vconf_set_bool(VCONFKEY_SETAPPL_SMARTSCREEN_SMART_ROTATION, list_item->chk_status);
191                 if (0 != ret) { /* rollback */
192                         SETTING_TRACE_ERROR("Set vconf Failed");
193                         list_item->chk_status = !list_item->chk_status;
194                         elm_check_state_set(list_item->eo_check,
195                                             list_item->chk_status);
196                         return;
197                 }
198
199         }
200 }
201
202 static void __setting_display_smart_screen_mouse_up_Gendial_list_cb(void *data, Evas_Object *obj,
203                                               void *event_info)
204 {
205         /* error check */
206         setting_retm_if(data == NULL, "Data parameter is NULL");
207         setting_retm_if(event_info == NULL, "Invalid argument: event info is NULL");
208         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
209         elm_genlist_item_selected_set(item, 0);
210         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
211         int old_status = elm_check_state_get(list_item->eo_check);
212         list_item->chk_status = !old_status;
213         elm_check_state_set(list_item->eo_check, list_item->chk_status);
214         __handle_via_check_status(list_item);
215 }
216
217 static void __setting_display_smart_screen_chk_btn_cb(void *data, Evas_Object *obj, void *event_info)
218 {
219         SETTING_TRACE_BEGIN;
220         /* error check */
221         retm_if(data == NULL, "Data parameter is NULL");
222         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
223         list_item->chk_status = elm_check_state_get(obj);       /*  for genlist update status */
224         __handle_via_check_status(list_item);
225 }
226
227 /* ***************************************************
228  *
229  *basic func
230  *
231  ***************************************************/
232 static int setting_display_smart_screen_create(void *cb)
233 {
234         SETTING_TRACE_BEGIN;
235         /* error check */
236         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
237         SettingDisplayUG *ad = (SettingDisplayUG *) cb;
238
239         Evas_Object *scroller = NULL;
240         setting_push_layout_navi_bar_genlist(ad->win_main_layout,
241                                            ad->win_get,
242                                            _(Keystr_SmartScreen), _("IDS_COM_BODY_BACK"),
243                                            NULL,
244                                            __setting_display_smart_screen_click_softkey_back_cb,
245                                            NULL, ad, &scroller,
246                                            ad->navi_bar);
247
248         Elm_Object_Item *item = NULL;
249         item = elm_genlist_item_append(scroller, &(ad->itc_seperator), NULL, NULL,
250                         ELM_GENLIST_ITEM_NONE, NULL, NULL);
251         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
252
253         int ret = 0;
254         int value = 0;
255         ret = vconf_get_int(VCONFKEY_PM_SMARTSTAY_STATUS, &value);
256         SETTING_TRACE("value = %d", value);
257         setting_retvm_if(ret != 0, SETTING_RETURN_FAIL, "fail to get vconf");
258
259         ad->data_smart_stay = setting_create_Gendial_field_def(scroller, &(ad->itc_1text_1icon),
260                                              __setting_display_smart_screen_mouse_up_Gendial_list_cb,
261                                              ad, SWALLOW_Type_1TOGGLE, NULL,
262                                              NULL, value,
263                                              SETTING_DISPLAY_SMART_STAY, NULL,
264                                              __setting_display_smart_screen_chk_btn_cb);
265         if (ad->data_smart_stay) {
266                 ad->data_smart_stay->userdata = ad;
267         } else {
268                 SETTING_TRACE_ERROR("ad->data_launch_image is NULL");
269         }
270
271         setting_create_Gendial_field_def(scroller, &itc_multiline_text, NULL,
272                                         ad, SWALLOW_Type_LAYOUT_SPECIALIZTION_X,
273                                         NULL, NULL, 0, SETTING_DISPLAY_SMART_STAY_DESC, NULL, NULL);
274         elm_genlist_item_select_mode_set(elm_genlist_item_append(scroller, &(itc_seperator), NULL, NULL,ELM_GENLIST_ITEM_NONE, NULL, NULL),
275                                          ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
276
277         ret = vconf_get_bool(VCONFKEY_SETAPPL_SMARTSCREEN_SMART_ROTATION, &value);
278         SETTING_TRACE("value = %d", value);
279         setting_retvm_if(ret != 0, SETTING_RETURN_FAIL, "fail to get vconf");
280
281         ad->data_smart_rotation = setting_create_Gendial_field_def(scroller, &(ad->itc_1text_1icon),
282                                              __setting_display_smart_screen_mouse_up_Gendial_list_cb,
283                                              ad, SWALLOW_Type_1TOGGLE, NULL,
284                                              NULL, value,
285                                              SETTING_DISPLAY_SMART_ROTATION, NULL,
286                                              __setting_display_smart_screen_chk_btn_cb);
287         if (ad->data_smart_rotation) {
288                 ad->data_smart_rotation->userdata = ad;
289         } else {
290                 SETTING_TRACE_ERROR("ad->data_launch_image is NULL");
291         }
292
293         setting_create_Gendial_field_def(scroller, &itc_multiline_text, NULL,
294                                         ad, SWALLOW_Type_LAYOUT_SPECIALIZTION_X,
295                                         NULL, NULL, 0, SETTING_DISPLAY_SMART_ROTATION_DESC, NULL, NULL);
296         elm_genlist_item_select_mode_set(elm_genlist_item_append(scroller, &(itc_bottom_seperator), NULL, NULL,ELM_GENLIST_ITEM_NONE, NULL, NULL),
297                                          ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
298
299         setting_view_display_smart_screen.is_create = 1;
300         return SETTING_RETURN_SUCCESS;
301 }
302
303 static int setting_display_smart_screen_destroy(void *cb)
304 {
305         SETTING_TRACE_BEGIN;
306         /* error check */
307         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
308         SettingDisplayUG *ad = (SettingDisplayUG *) cb;
309
310         elm_naviframe_item_pop(ad->navi_bar);
311         setting_view_display_smart_screen.is_create = 0;
312
313         return SETTING_RETURN_SUCCESS;
314 }
315
316 static int setting_display_smart_screen_update(void *cb)
317 {
318         SETTING_TRACE_BEGIN;
319         /* error check */
320         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
321
322         return SETTING_RETURN_SUCCESS;
323 }
324
325 static int setting_display_smart_screen_cleanup(void *cb)
326 {
327         SETTING_TRACE_BEGIN;
328         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
329
330         SettingDisplayUG *ad = (SettingDisplayUG *) cb;
331
332         setting_display_smart_screen_destroy(ad);
333
334         return SETTING_RETURN_SUCCESS;
335 }
336
337 /* ***************************************************
338  *
339  *general func
340  *
341  ***************************************************/
342
343 static void __setting_display_smart_screen_click_softkey_back_cb(void *data, Evas_Object *obj, void *event_info)
344 {
345         SETTING_TRACE_BEGIN;
346         /* error check */
347         setting_retm_if(data == NULL,
348                         "[Setting > Display] Data parameter is NULL");
349
350         SettingDisplayUG *ad = (SettingDisplayUG *) data;
351
352         setting_view_change(&setting_view_display_smart_screen, &setting_view_display_main, ad);
353 }