Fix prevent issues
[apps/core/preloaded/settings.git] / setting-font / src / setting-font-main.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-font-main.h>
22 #include <sysman.h>
23 #include <fontconfig/fontconfig.h>
24 #include <unicode/uloc.h>
25 #include <libxml/xmlmemory.h>
26 #include <libxml/parser.h>
27 #include <Ecore_X.h>
28 #include <system_settings.h>
29
30 #define SETTING_FONT_MAX_LEN 10
31
32 static int setting_font_main_create(void *cb);
33 static int setting_font_main_destroy(void *cb);
34 static int setting_font_main_update(void *cb);
35 static int setting_font_main_cleanup(void *cb);
36
37 static void __setting_font_main_click_softkey_back_cb(void *data, Evas_Object *obj,
38                                         void *event_info);
39
40 setting_view setting_view_font_main = {
41         .create = setting_font_main_create,
42         .destroy = setting_font_main_destroy,
43         .update = setting_font_main_update,
44         .cleanup = setting_font_main_cleanup,
45 };
46
47 static char* __setting_font_main_get_font_size(int value)
48 {
49         const char* font_size_arr[] = {
50                                         _("IDS_ST_BODY_SMALL_M_TEXTSIZE"), // 0
51                                         _("IDS_ST_BODY_NORMAL_T_PROFILE"), // 1
52                                         _("IDS_ST_BODY_TEXTSTYLE_LARGE"),  // 2
53                                         _("IDS_EMAIL_OPT_HUGE_M_TEXTSIZE"),                        // 3
54                                         _("IDS_EMAIL_POP_GIANT_M_TEXTSIZE"),                       // 4
55                                 };
56         switch (value)
57         {
58                 case SYSTEM_SETTINGS_FONT_SIZE_SMALL:
59                         return (char *)font_size_arr[0];
60                 case SYSTEM_SETTINGS_FONT_SIZE_NORMAL:
61                         return (char *)font_size_arr[1];
62                 case SYSTEM_SETTINGS_FONT_SIZE_LARGE:
63                         return (char *)font_size_arr[2];
64                 case SYSTEM_SETTINGS_FONT_SIZE_HUGE:
65                         return (char *)font_size_arr[3];
66                 case SYSTEM_SETTINGS_FONT_SIZE_GIANT:
67                         return (char *)font_size_arr[4];
68                 default:
69                         return (char *)font_size_arr[1];
70         }
71 }
72
73 static Eina_List *__setting_font_main_available_list_get()
74 {
75         SETTING_TRACE_BEGIN
76         FcObjectSet *os = NULL;
77         FcFontSet *fs = NULL;
78         FcPattern *pat = NULL;
79         Eina_List *list = NULL;
80         FcConfig *font_config = NULL;
81
82         font_config = FcInitLoadConfigAndFonts();
83
84         setting_retvm_if(font_config == NULL, NULL, "Failed: FcInitLoadConfigAndFonts");
85
86         pat = FcPatternCreate();
87
88         os = FcObjectSetBuild(FC_FAMILY, FC_FILE, (char *) 0);
89
90         if (os) {
91                 fs = FcFontList(font_config, pat, os);
92                 FcObjectSetDestroy(os);
93                 os = NULL;
94         }
95
96         if (pat) {
97                 FcPatternDestroy(pat);
98                 pat = NULL;
99         }
100
101         if (fs) {
102                 int j;
103                 SETTING_TRACE_DEBUG("fs->nfont = %d", fs->nfont);
104
105                 for (j = 0; j < fs->nfont; j++) {
106                         FcChar8 *family = NULL;
107                         FcChar8 *file = NULL;
108
109                         if (FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) {
110                                 //SETTING_TRACE_DEBUG("FC_FILE : %s\n", file);
111                                 int preload_path_len = safeStrLen(SETTING_FONT_PRELOAD_FONT_PATH);
112                                 int download_path_len = safeStrLen(SETTING_FONT_DOWNLOADED_FONT_PATH);
113                                 if (!safeStrNCmp((const char*)file, SETTING_FONT_PRELOAD_FONT_PATH, preload_path_len) ||
114                                         !safeStrNCmp((const char*)file, SETTING_FONT_DOWNLOADED_FONT_PATH, download_path_len)) {
115                                         if (FcPatternGetString(fs->fonts[j], FC_FAMILY, 0, &family) != FcResultMatch) {
116                                                 SETTING_TRACE_DEBUG("Family name is invalid");
117                                                 continue;
118                                         }
119
120                                         //SETTING_TRACE_DEBUG("family = %s", (char *)family);
121                                         if (eina_list_data_find(list, family) == NULL) {
122                                                 list = eina_list_append(list, family);
123                                                 /* list = eina_list_append(list, family); */
124                                                 // for TEST because there's 1 font on target.
125                                         }
126                                 }
127                         }
128                 }
129                 FcFontSetDestroy(fs);
130                 fs = NULL;
131         }
132
133         FcConfigDestroy(font_config);
134         font_config = NULL;
135         return list;
136 }
137
138 static void __setting_font_main_genlist_sel_cb(void *data, Evas_Object * obj, void *event_info)
139 {
140         //error check
141         setting_retm_if(data == NULL, "Data parameter is NULL");
142
143         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
144         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
145         elm_genlist_item_selected_set(item, 0);
146         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *)elm_object_item_data_get(item);
147
148         SettingFontUG *ad = (SettingFontUG *)data;
149
150         if (ad->font_size == list_item) {
151                 setting_view_change(&setting_view_font_main, &setting_view_font_font_size, ad);
152         }
153 }
154
155 static void __setting_font_main_genlist_item_create(void *data)
156 {
157         SETTING_TRACE_BEGIN;
158         setting_retm_if(NULL == data, "data is NULL");
159
160         SettingFontUG *ad = (SettingFontUG *)data;
161         Elm_Object_Item *item = NULL;
162
163         if (ad->viewmode == FONT_SIZE_AND_FONT_SEL_UG || ad->viewmode == FONT_SEL_VIEW_APPCONTROL)              // font type only
164         {
165                 // [UI] Font Type
166                 item = elm_genlist_item_append(ad->genlist, &(ad->itc_seperator), NULL, NULL,
167                                         ELM_GENLIST_ITEM_NONE, NULL, NULL);
168                 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
169                 char *font_type_name = NULL;
170                 font_type_name = cur_font_get();
171
172                 char trans_font_type_name[256] = {0,};          
173                 if(safeStrCmp(font_type_name, "Choco cooky") == 0)
174                         snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_CHOCO_COOKY"));
175                 else if(safeStrCmp(font_type_name, "Cool jazz") == 0)
176                         snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_COOL_JAZZ"));
177                 else
178                         snprintf(trans_font_type_name, 256, "%s", _("IDS_ST_BODY_HELVETICA_NEUE_M_FONT_NAME"));
179
180                 SETTING_TRACE_DEBUG("current font : %s, trans font name: %s", font_type_name, trans_font_type_name);
181
182                 ad->font_type = setting_create_Gendial_exp_parent_field(ad->genlist,
183                                                                 &(ad->itc_2text_3_parent),
184                                                                 NULL, NULL,
185                                                                 SWALLOW_Type_INVALID,
186                                                                 SETTING_FONT_TYPE_STR,
187                                                                 trans_font_type_name);
188                 if (ad->font_type) {
189                         ad->font_type->userdata = ad;
190                 } else {
191                         SETTING_TRACE_ERROR("ad->font_type is NULL");
192                 }
193                 G_FREE(ad->font_name);
194                 ad->font_name = g_strdup(font_type_name);
195                 G_FREE(font_type_name);
196         }
197
198         if (ad->viewmode == FONT_SIZE_AND_FONT_SEL_UG || ad->viewmode == FONT_SIZE_VIEW_APPCONTROL)             // font size only
199         {
200                 int err = -1;
201                 // [UI] Font Size
202                 int ret = setting_get_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, &ad->ret_font_size, &err);
203                 if (ret != 0) {
204                         SETTING_TRACE_ERROR("get vconf failed");
205                 }
206
207                 ad->font_size = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_2),
208                                         __setting_font_main_genlist_sel_cb,
209                                         ad, SWALLOW_Type_INVALID, NULL,
210                                         NULL, ad->ret_font_size, SETTING_FONT_SIZE_STR,
211                                         __setting_font_main_get_font_size(ad->ret_font_size), NULL);
212                 if (ad->font_size) {
213                         ad->font_size->userdata = ad;
214                 } else {
215                         SETTING_TRACE_ERROR("ad->font_size is NULL");
216                 }
217
218 #if DISABlED_CODE
219         setting_create_Gendial_field_def(ad->genlist, &(ad->itc_bg_1icon), NULL,
220                                          ad, SWALLOW_Type_LAYOUT_SPECIALIZTION_X,
221                                          NULL, NULL, 0, SETTING_FONT_SIZE_DESC, NULL,
222                                          NULL);
223 #endif
224         }
225 }
226
227
228 /**
229  * font change
230  */
231 static void __setting_font_main_font_set(char *font_name)
232 {
233         retm_if(font_name == NULL, "Invalid argument: font_name is NULL");
234         xmlDocPtr doc = (xmlDocPtr)font_conf_doc_parse(SETTING_FONT_CONF_FILE, font_name);
235
236         if(doc != NULL) {
237                 xmlSaveFormatFile(SETTING_FONT_CONF_FILE, doc, 0);
238                 xmlFreeDoc(doc);
239                 doc = NULL;
240         }
241
242         font_config_set(font_name);
243
244         /* notification */
245         Ecore_X_Window ecore_win = ecore_x_window_root_first_get();
246         Ecore_X_Atom atom = ecore_x_atom_get("FONT_TYPE_change");
247         ecore_x_window_prop_string_set(ecore_win, atom, "slp");
248 }
249
250 static void __setting_font_main_popup_cb(void *data, Evas_Object *obj, void *event_info)
251 {
252         SETTING_TRACE_BEGIN;
253         setting_retm_if(data == NULL, "Data parameter is NULL");
254         SettingFontUG *ad = (SettingFontUG *) data;
255
256         switch (btn_type(obj)) {
257         case POPUP_RESPONSE_OK:
258                 {
259                         /* extract font name from tag mixed string */
260                         char *temp = NULL;
261                         temp = strchr(ad->subitem->keyStr, '>');
262                         temp += 1;
263                         char *last = NULL;
264                         last = strrchr(temp, '<');
265
266                         char font_name[64] = {0,};
267                         safeCopyStr(font_name, temp, (int)(last-temp));
268
269                         /* set font name to font main and font config */
270                         ad->font_type->sub_desc = (char *)g_strdup(_(font_name));
271                         elm_object_item_data_set(ad->font_type->item, ad->font_type);
272                         elm_genlist_item_update(ad->font_type->item);
273
274                         ad->prev_font = ad->subitem->chk_status;
275                         G_FREE(ad->font_name);
276                         ad->font_name = (char *)g_strdup(_(font_name));
277                         SETTING_TRACE("ad->subitem->keyStr = %s", font_name);
278
279                         __setting_font_main_font_set(font_name);
280                         ug_destroy_me(ad->ug);
281                         break;
282                 }
283         case POPUP_RESPONSE_CANCEL:
284                 {
285                         elm_radio_value_set(ad->subitem->rgd, ad->prev_font);
286
287                         break;
288                 }
289         default:
290                 {
291                         break;
292                 }
293         }
294
295         if (ad->popup) {
296                 evas_object_del(ad->popup);
297                 ad->popup = NULL;
298         }
299 }
300
301 static void __setting_font_main_popup(void *data)
302 {
303         SETTING_TRACE_BEGIN;
304         setting_retm_if(data == NULL, "Data parameter is NULL");
305         SettingFontUG *ad = (SettingFontUG *) data;
306
307         char popup_desc[SETTING_STR_SLP_LEN + 1] = {0,};
308         snprintf(popup_desc, SETTING_STR_SLP_LEN, "%s %s?", _(SETTING_FONT_POPUP_DESC), ad->subitem->keyStr);
309
310         ad->popup = setting_create_popup_with_btn(ad, ad->win_get, NULL,
311                                          popup_desc,
312                                          __setting_font_main_popup_cb, 0,
313                                          2, _("IDS_COM_SK_YES"),_("IDS_COM_SK_NO"));
314 }
315
316
317 /**
318  * [UI][expandable list][event handler:selection][font change]
319  */
320 void __setting_font_main_sub_list_sel_cb(void *data, Evas_Object *obj, void *event_info)
321 {
322         SETTING_TRACE_BEGIN;
323         /* error check */
324         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
325         Elm_Object_Item *subitem = (Elm_Object_Item *) event_info;
326         elm_genlist_item_selected_set(subitem, 0);
327         Setting_GenGroupItem_Data *data_subItem = elm_object_item_data_get(subitem);
328         ret_if(NULL == data_subItem);
329
330         SettingFontUG *ad = (SettingFontUG *) data;
331
332         /*  if not change, return */
333         if (ad->prev_font == data_subItem->chk_status) {
334                 SETTING_TRACE("NOT CHANGED ");
335                 return;
336         }
337
338         ad->subitem = data_subItem;
339         elm_radio_value_set(ad->subitem->rgd, ad->subitem->chk_status);
340
341         __setting_font_main_popup(ad);
342 }
343
344 static void __setting_font_main_exp_cb(void *data, Evas_Object *obj, void *event_info)
345 {
346         ret_if(NULL == data || NULL == event_info);
347         SETTING_TRACE_BEGIN;
348         SettingFontUG *ad = (SettingFontUG *) data;
349         Elm_Object_Item *parentItem = event_info;       /* parent item */
350         Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem);      /* parent data */
351         Evas_Object *scroller = elm_object_item_widget_get(parentItem);
352
353         Evas_Object *rgd = NULL;
354         if (data_parentItem == ad->font_type) {
355                 rgd = elm_radio_add(scroller);
356                 elm_radio_value_set(rgd, -1);
357
358                 Eina_List *font_list = NULL;
359                 Eina_List *l = NULL;
360                 FcChar8 *font_data = NULL;
361                 font_list = __setting_font_main_available_list_get();
362
363                 int i = 0;
364                 int matched_font = -1;
365                 Setting_GenGroupItem_Data *item = NULL;
366                 EINA_LIST_FOREACH(font_list, l, font_data)
367                 {
368                         SETTING_TRACE_DEBUG("font data : %s", (char*)font_data);
369                         char temp[256] = {0,};
370                         if(safeStrCmp(font_data, "Choco cooky") == 0)
371                                 snprintf(temp, 256, "<font=%s>%s</font>", "Chococooky", _("IDS_ST_BODY_CHOCO_COOKY"));
372                         else if(safeStrCmp(font_data, "Cool jazz") == 0)
373                                 snprintf(temp, 256, "<font=%s>%s</font>", "Cooljazz", _("IDS_ST_BODY_COOL_JAZZ"));
374                         else
375                                 snprintf(temp, 256, "<font=%s>%s</font>", "HelveticaNeue", _("IDS_ST_BODY_HELVETICA_NEUE_M_FONT_NAME"));
376
377                         item = setting_create_Gendial_exp_sub_field(scroller, &(ad->itc_1text_1icon_2),
378                                                      __setting_font_main_sub_list_sel_cb, ad,
379                                                      parentItem, SWALLOW_Type_1RADIO, rgd,
380                                                      i, temp,
381                                                      NULL);
382
383                         if (item) {
384                                 item->userdata = ad;
385                                 if (!safeStrCmp(ad->font_name, (const char*)font_data)) {
386                                         matched_font = i;
387                                 }
388                         }
389
390                         i++;
391                 }
392
393                 /* update check status */
394                 if (matched_font != -1) {
395                         elm_radio_value_set(rgd, matched_font);
396                 }
397
398                 ad->prev_font = matched_font;
399         }
400 }
401
402
403 /* ***************************************************
404  *
405  *basic func
406  *
407  ***************************************************/
408 static int setting_font_main_create(void *cb)
409 {
410         SETTING_TRACE_BEGIN;
411         /* error check */
412         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
413
414         SettingFontUG *ad = (SettingFontUG *) cb;
415
416         retvm_if(ad->win_main_layout == NULL, SETTING_DRAW_ERR_FAIL_LOAD_EDJ,
417                  "win_main_layout is NULL");
418
419         ad->ly_main =
420             setting_create_layout_navi_bar_genlist(ad->win_main_layout,
421                                                    ad->win_get,
422                                                    _(KeyStr_Font),
423                                                    _("IDS_COM_BODY_BACK"),
424                                                    NULL,
425                                                    __setting_font_main_click_softkey_back_cb,
426                                                    NULL,
427                                                    ad, &ad->genlist, &ad->navibar);
428
429         setting_enable_expandable_genlist(ad->genlist, ad,
430                                 __setting_font_main_exp_cb, NULL);
431
432         __setting_font_main_genlist_item_create(ad);
433
434         setting_view_font_main.is_create = 1;
435         return SETTING_RETURN_SUCCESS;
436 }
437
438 static int setting_font_main_destroy(void *cb)
439 {
440         SETTING_TRACE_BEGIN;
441         /* error check */
442         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
443
444         SettingFontUG *ad = (SettingFontUG *) cb;
445
446         if(ad->font_name)
447         {
448                 G_FREE(ad->font_name);
449                 ad->font_name = NULL;
450         }
451
452         if (ad->popup) {
453                 evas_object_del(ad->popup);
454                 ad->popup = NULL;
455         }
456
457         if (ad->ly_main != NULL) {
458                 evas_object_del(ad->ly_main);
459                 ad->ly_main = NULL;
460         }
461
462         setting_view_font_main.is_create = 0;
463         SETTING_TRACE_END;
464         return SETTING_RETURN_SUCCESS;
465 }
466
467 static int setting_font_main_update(void *cb)
468 {
469         SETTING_TRACE_BEGIN;
470         /* error check */
471         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
472
473         SettingFontUG *ad = (SettingFontUG *) cb;
474
475         if (ad->ly_main != NULL) {
476                 evas_object_show(ad->ly_main);
477
478                 int value = -1;
479                 int err = -1;
480                 int ret = setting_get_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, &value, &err);
481                 if (ret != 0) {
482                         SETTING_TRACE_ERROR("get vconf failed");
483                 }
484
485                 if (ad->font_size) {
486                         G_FREE(ad->font_size->sub_desc);
487                         ad->font_size->sub_desc = (char *)g_strdup(__setting_font_main_get_font_size(value));
488                         elm_object_item_data_set(ad->font_size->item, ad->font_size);
489                         elm_genlist_item_update(ad->font_size->item);
490                 }
491
492                 setting_font_update_vconf_key(ad, SETTING_VCONF_INT_TYPE,
493                                               INT_SLP_SETTING_LCD_TIMEOUT_NORMAL);
494         }
495
496         return SETTING_RETURN_SUCCESS;
497 }
498
499 static int setting_font_main_cleanup(void *cb)
500 {
501         /* error check */
502         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
503
504         SettingFontUG *ad = (SettingFontUG *) cb;
505
506         if (ad->ly_main != NULL) {
507                 evas_object_hide(ad->ly_main);
508         }
509
510         return SETTING_RETURN_SUCCESS;
511 }
512
513 /* ***************************************************
514  *
515  *call back func
516  *
517  ***************************************************/
518
519 static void __setting_font_main_click_softkey_back_cb(void *data, Evas_Object *obj,
520                                         void *event_info)
521 {
522         SETTING_TRACE_BEGIN;
523         /* error check */
524         ret_if(data == NULL);
525
526         SettingFontUG *ad = (SettingFontUG *) data;
527
528         if (ad->viewmode == FONT_SEL_VIEW_APPCONTROL)
529         {
530                 service_h svc;
531                 if (service_create(&svc))
532                         return;
533
534                 service_add_extra_data(svc, "category", "FontType");
535                 service_add_extra_data(svc, "FontType", ad->font_name);
536
537                 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","category", "FontType");
538                 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","FontType", ad->font_name);
539
540
541                 ug_send_result(ad->ug, svc);
542                 service_destroy(svc);
543         }
544         else if (ad->viewmode == FONT_SIZE_VIEW_APPCONTROL)
545         {
546                 service_h svc;
547
548                 int err;
549                 int ret = setting_set_int_slp_key(INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, ad->ret_font_size, &err);
550                 setting_retm_if(ret == -1, "Failed to set vconf");
551
552                 if (service_create(&svc))
553                         return;
554
555                 char font_size[SETTING_FONT_MAX_LEN] = {0,};
556                 snprintf(font_size, SETTING_FONT_MAX_LEN, "%d", ad->ret_font_size);
557
558                 service_add_extra_data(svc, "category", "FontSize");
559                 service_add_extra_data(svc, "FontSize", font_size);
560
561                 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","category", "FontSize");
562                 SETTING_TRACE(" SERVICE_ADD_EXTRA : %s %s","FontSize", font_size);
563
564
565                 ug_send_result(ad->ug, svc);
566                 service_destroy(svc);
567         }
568         /* Send destroy request */
569         ug_destroy_me(ad->ug);
570 }