Updating license in spec file
[pkgs/l/libug-setting-theme-efl.git] / setting-theme-efl.c
1 /*
2   * Copyright 2012  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://www.tizenopensource.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
19
20 #ifndef UG_MODULE_API
21 #define UG_MODULE_API __attribute__ ((visibility("default")))
22 #endif
23
24 #include <Eina.h>
25 #include <ui-gadget-module.h>
26 #include <aul.h>
27 #include <vconf.h>
28 #include <vconf-keys.h>
29 #include <Efreet_Mime.h>
30
31 #include "setting-theme-efl.h"
32
33 static Evas_Object *_parent = NULL;
34 static Elm_Genlist_Item_Class itc, itc2, edit_mode_itc;
35 static Eina_List *gtheme_list = NULL;
36 static Evas_Object *rdg = NULL;
37
38 struct ug_down_theme_property
39 {
40    int ext;
41    char name[SETTING_THEME_NAME_MAX_LEN];
42 };
43
44 struct ug_theme_list
45 {
46    struct ug_down_theme_property icon_theme;
47    struct ug_down_theme_property boot_ani_theme;
48    struct ug_down_theme_property key_snd_theme;
49    struct ug_down_theme_property efl_theme;
50    struct ug_down_theme_property gtk_theme;
51    struct ug_down_theme_property screen_image_theme;
52    struct ug_down_theme_property font_theme;
53    struct ug_down_theme_property vibrate_theme;
54 };
55
56 typedef enum
57 {
58    THEME_TYPE_DEFAULT,
59    THEME_TYPE_DOWNLOAD,
60 } ug_theme_type;
61
62 struct ug_theme_info
63 {
64    ug_theme_type type;
65    char* name;
66 };
67
68 typedef struct _Item_Data Item_Data;
69 typedef struct _View_Data View_Data;
70 struct _View_Data {
71    Evas_Object *bg;
72    Evas_Object *nf;
73    Evas_Object *box;
74    Evas_Object *delete_btn;             // 'Delete'/'Cancel' button
75    Evas_Object *more_btn;
76    Evas_Object *cbar;
77    Elm_Object_Item *del_btn_item; // 'Delete' button
78
79    Evas_Object *genlist;
80    Elm_Object_Item *renamed_it;
81
82    Evas_Object *select_all_layout;
83    Evas_Object *select_all_checkbox;
84    Eina_Bool select_all_checked;
85    int total_count;
86    int checked_count;
87    int default_theme_count;
88 };
89
90 struct _Item_Data {
91    Elm_Object_Item *it;  // Genlist Item pointer
92    Eina_Bool checked;     // Check status
93    char *label;
94    int idx;
95 };
96
97 struct ug_data {
98    Evas_Object *base;
99    Eina_List *theme_list;
100    struct ui_gadget *ug;
101    struct ug_theme_list theme;
102    View_Data *vd;
103 };
104
105 static Evas_Object* _create_layout_main( Evas_Object* parent, View_Data* vd )
106 {
107    Evas_Object *layout = elm_layout_add( parent );
108    if( layout == NULL ) return NULL;
109
110    elm_layout_theme_set( layout, "layout", "application", "default" );
111    evas_object_size_hint_weight_set( layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
112
113    //Background
114    Evas_Object *bg = elm_bg_add( layout );
115    vd->bg = bg;
116
117    if ( bg ) {
118       elm_object_style_set( bg, "group_list");
119       evas_object_size_hint_weight_set( bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND );
120       elm_object_part_content_set( layout, "elm.swallow.bg", bg );
121    }
122
123    evas_object_show( layout );
124
125    return layout;
126 }
127
128 static void _setting_theme_def_response_cb( void *data, Evas_Object *obj, void *event_info )
129 {
130    evas_object_del(obj);
131 }
132
133 static void _block_clicked_cb(void *data, Evas_Object *obj, void *event_info)
134 {
135     // Popup remove code...ex
136     /*if (conformant) {
137       evas_object_del(conformant);
138       conformant = NULL;
139       }
140       if (del_timer) {
141       ecore_timer_del(del_timer);
142       del_timer = NULL;
143       }
144       evas_object_del(obj);*/
145 }
146
147 static int _load_index_file(struct ug_data* ugd, struct ug_theme_info* selected_theme)
148 {
149    FILE* fp = NULL;
150    Eina_Strbuf* temp_str_buf = eina_strbuf_new();
151    Eina_List *index_list = NULL;
152    Eina_List *elist = NULL;
153    char* meta_theme = NULL;
154
155    eina_strbuf_append_printf( temp_str_buf, "%s/%s/%s", DOWNLOAD_THEME_FOLDER_PATH, selected_theme->name, DOWNLOAD_THEME_INDEX_FILE_NAME);
156
157    if( !( fp = fopen( eina_strbuf_string_steal( temp_str_buf ), "r" ) ) ) {
158
159       //make error popup : file not found
160       Evas_Object *popup = elm_popup_add( ugd->base );
161
162       if( popup == NULL ) {
163          eina_strbuf_free(temp_str_buf);
164          return -1;
165       }
166
167       //TODO: Apply Strings to Multi Languange
168       elm_object_text_set( popup, _("No Theme Contents") );
169       evas_object_smart_callback_add(popup, "block,clicked", _block_clicked_cb, NULL);
170
171       elm_popup_timeout_set( popup, POPUP_ALERT_TIMOUT_DURATION );
172       evas_object_smart_callback_add( popup, "response", _setting_theme_def_response_cb, NULL );
173       evas_object_show( popup );
174
175       eina_strbuf_free(temp_str_buf);
176       return -1;
177    }
178
179    // Read File
180    while( !feof( fp ) ) {
181       char temp_buffer[ SETTING_THEME_NAME_MAX_LEN ] = {0,};
182       fgets( temp_buffer, SETTING_THEME_NAME_MAX_LEN, fp );
183       index_list = eina_list_append( index_list, strdup(temp_buffer));
184    }
185
186    fclose(fp);
187
188    // Parsing
189    EINA_LIST_FOREACH( index_list, elist, meta_theme ) {
190
191       char *ptr;
192       char *meta = strtok_r( meta_theme, "=", &ptr);
193
194       if(meta) {
195
196          char *theme = strtok_r( NULL, "\n", &ptr);
197          if( theme == NULL ) continue;
198
199          if( !strncmp( DOWNLOAD_THEME_ICON_THEME_KEYWORD,
200                   meta,
201                   strlen( DOWNLOAD_THEME_ICON_THEME_KEYWORD)) ) {
202
203             ugd->theme.icon_theme.ext = 1;
204             strncpy(ugd->theme.icon_theme.name,theme,strlen(theme));
205
206          }
207          else if( !strncmp( DOWNLOAD_THEME_BOOT_ANIMATOR_THEME_KEYWORD,
208                   meta,
209                   strlen( DOWNLOAD_THEME_BOOT_ANIMATOR_THEME_KEYWORD)) ) {
210             ugd->theme.boot_ani_theme.ext = 1;
211             strncpy(ugd->theme.boot_ani_theme.name,theme,strlen(theme));
212          }
213          else if( !strncmp( DOWNLOAD_THEME_KEY_SOUND_THEME_KEYWORD,
214                   meta,
215                   strlen( DOWNLOAD_THEME_KEY_SOUND_THEME_KEYWORD )) ) {
216             ugd->theme.key_snd_theme.ext = 1;
217             strncpy(ugd->theme.key_snd_theme.name,theme,strlen(theme));
218
219          }
220          else if( !strncmp( DOWNLOAD_THEME_EFL_THEME_KEYWORD,
221                   meta,
222                   strlen( DOWNLOAD_THEME_EFL_THEME_KEYWORD ) ) ) {
223             ugd->theme.efl_theme.ext = 1;
224             strncpy(ugd->theme.efl_theme.name,theme,strlen(theme));
225
226          }
227          else if( !strncmp( DOWNLOAD_THEME_GTK_THEME_KEYWORD,
228                   meta,
229                   strlen( DOWNLOAD_THEME_GTK_THEME_KEYWORD ) ) ) {
230             ugd->theme.gtk_theme.ext = 1;
231             strncpy(ugd->theme.gtk_theme.name,theme,strlen(theme));
232          }
233          else if( !strncmp( DOWNLOAD_THEME_SCREEN_IMG_THEME_KEYWORD,
234                   meta,
235                   strlen( DOWNLOAD_THEME_SCREEN_IMG_THEME_KEYWORD ) ) ) {
236             ugd->theme.screen_image_theme.ext = 1;
237             strncpy(ugd->theme.screen_image_theme.name,theme,strlen(theme));
238
239          }
240          else if( !strncmp( DOWNLOAD_THEME_FONT_THEME_KEYWORD,
241                   meta,
242                   strlen( DOWNLOAD_THEME_FONT_THEME_KEYWORD )) ) {
243             ugd->theme.font_theme.ext = 1;
244             strncpy(ugd->theme.font_theme.name,theme,strlen(theme));
245          }
246          else if( !strncmp( DOWNLOAD_THEME_VIBRATION_THEME_KEYWORD,
247                   meta,
248                   strlen( DOWNLOAD_THEME_VIBRATION_THEME_KEYWORD )) ) {
249             ugd->theme.vibrate_theme.ext = 1;
250             strncpy(ugd->theme.vibrate_theme.name,theme,strlen(theme));
251          }
252       }
253    }
254
255    // clear
256    eina_strbuf_free(temp_str_buf);
257
258    EINA_LIST_FOREACH( index_list, elist, meta_theme ) {
259       index_list = eina_list_remove( index_list, meta_theme );
260       free( meta_theme );
261    }
262    return 0;
263 }
264
265 static Evas_Object* _create_naviframe( Evas_Object* parent )
266 {
267    if( parent == NULL ) return NULL;
268
269    Evas_Object *nf = elm_naviframe_add( parent );
270    evas_object_show( nf );
271
272    return nf;
273 }
274
275 static void _remove_files_in_dir( const char *folder_path )
276 {
277    struct stat statbuf;
278    char path_buf[ PATH_MAX ];
279    DIR* dp = NULL;
280    struct dirent *entry = NULL;
281    char *mime = NULL;
282    char *splitter = NULL;
283    char *env = getenv( "UI_IDLECAPTURE_IMG_TYPE" );
284
285    if( !env ) {
286       return ;
287    }
288
289    dp = opendir( folder_path );
290
291    if( dp == 0 ) {
292       return ;
293    }
294
295    if( chdir( folder_path ) != 0 ) {
296       fprintf( stderr, "Failed to change directory!\n" );
297    }
298
299    while( ( entry = readdir( dp ) ) != NULL ) {
300
301       stat( entry->d_name, &statbuf );
302
303       strcpy( path_buf, folder_path );
304
305       if( path_buf[ strlen( path_buf ) - 1 ]  != '/' ) {
306          strcat( path_buf, "/" );
307       }
308
309       strcat( path_buf, entry->d_name );
310
311       //case of directory
312       if( S_ISDIR( statbuf.st_mode ) ) {
313
314          if( strcmp( ".", entry->d_name ) == 0 || strcmp( "..", entry->d_name ) == 0 ) {
315             continue;
316          }
317
318          _remove_files_in_dir( path_buf );
319          continue;
320          //case of file
321       }else {
322          //Check is it jpeg type.
323          mime = (char *) efreet_mime_type_get( path_buf );
324
325          if( mime == 0 ) {
326             continue;
327          }
328
329          while( (splitter = strpbrk( mime, "/" )) ) {
330             if( strncmp( mime, env, splitter - mime ) == 0 ) {
331                unlink( path_buf );
332                continue;
333             }else {
334                mime = ++splitter;
335             }
336          }
337
338          if( strncmp( mime, env, strlen( mime ) ) == 0 ) {
339             unlink( path_buf );
340          }
341       }
342
343    }
344
345    if( chdir( ".." ) != 0 ) {
346       fprintf( stderr, "Failed to change directory!\n" );
347    }
348
349    closedir( dp );
350 }
351
352 static int _strncmp( const char *s1, const char *s2)
353 {
354    const char *longer = NULL;
355    const char *shorter = NULL;
356
357    if( strlen( s1 ) > strlen ( s2 ) ) {
358       longer = s1;
359       shorter = s2;
360    } else {
361       longer = s2;
362       shorter = s1;
363    }
364
365    return strncmp( longer, shorter, strlen( longer ) );
366 }
367
368 static void _get_default_theme_list( const char *folder_path, Eina_List **theme_list )
369 {
370    struct stat statbuf;
371    char path_buf[ PATH_MAX ];
372    DIR* dp = NULL;
373    struct dirent *entry = NULL;
374
375    dp = opendir( folder_path );
376
377    if( dp == 0 ) {
378       return ;
379    }
380
381    if( chdir( folder_path ) != 0 ) {
382       fprintf( stderr, "Failed to change directory!\n" );
383    }
384
385    while( ( entry = readdir( dp ) ) != NULL ) {
386
387       stat( entry->d_name, &statbuf );
388       strcpy( path_buf, folder_path );
389
390       if( path_buf[ strlen( path_buf ) - 1 ]  != '/' ) {
391          strcat( path_buf, "/" );
392       }
393
394       strcat( path_buf, entry->d_name );
395
396       //case of directory
397       if( S_ISDIR( statbuf.st_mode ) ) {
398
399          if( strcmp( ".", entry->d_name ) == 0 || strcmp( "..", entry->d_name ) == 0 ) {
400             continue;
401          }
402
403          _get_default_theme_list( path_buf, theme_list );
404          continue;
405
406          //case of file
407       }else {
408          //TODO: TEMPORARY COMPARE. SHOULD BE REMOVED!
409          if( !_strncmp( entry->d_name, "tizen.edj") ||
410                !_strncmp( entry->d_name, "tizen-black.edj") ||
411                !_strncmp( entry->d_name, "default.edj") ||
412                !_strncmp( entry->d_name, "default-desktop.edj") ) {
413             continue;
414          }
415
416          struct ug_theme_info *new_info = (struct ug_theme_info*)calloc(1,sizeof(struct ug_theme_info));
417          new_info->type = THEME_TYPE_DEFAULT;
418          new_info->name = strndup(entry->d_name, strpbrk( entry->d_name, ".") - entry->d_name );
419
420          *theme_list = eina_list_append( *theme_list, new_info );
421
422       }
423    }
424
425    if( chdir( ".." ) != 0 ) {
426       fprintf( stderr, "Failed to change directory!\n" );
427    }
428
429    closedir( dp );
430 }
431
432 static void _get_theme_list( const char *folder_path, Eina_List **theme_list )
433 {
434    struct stat statbuf;
435    char path_buf[ PATH_MAX ];
436    DIR* dp = NULL;
437    struct dirent *entry = NULL;
438
439    dp = opendir( folder_path );
440
441    if( dp == 0 ) {
442       return ;
443    }
444
445    if( chdir( folder_path ) != 0 ) {
446       fprintf( stderr, "Failed to change directory!\n" );
447    }
448
449    while( ( entry = readdir( dp ) ) != NULL ) {
450
451       stat( entry->d_name, &statbuf );
452
453       strcpy( path_buf, folder_path );
454
455       if( path_buf[ strlen( path_buf ) - 1 ]  != '/' ) {
456          strcat( path_buf, "/" );
457       }
458
459       strcat( path_buf, entry->d_name );
460
461       //in case of directory, add folder name to list.
462       if( S_ISDIR( statbuf.st_mode ) ) {
463
464          if( strcmp( ".", entry->d_name ) == 0 || strcmp( "..", entry->d_name ) == 0 ) {
465             continue;
466          }
467
468          struct ug_theme_info *new_info = (struct ug_theme_info*)calloc(1,sizeof(struct ug_theme_info));
469          new_info->type = THEME_TYPE_DOWNLOAD;
470          new_info->name = strdup(entry->d_name);
471          *theme_list = eina_list_append( *theme_list, new_info);
472       }
473    }
474    closedir( dp );
475 }
476
477 static int _selected_theme_idx_get()
478 {
479    Eina_List *elist = NULL;
480    struct ug_theme_info *theme_info = NULL;
481
482    // set selected theme
483    char *theme_name = vconf_get_str(SETTING_THEME_SELECTED_THEME);
484    int idx = 0;
485
486    EINA_LIST_FOREACH( gtheme_list, elist, theme_info ) {
487
488       if( _strncmp( theme_info->name, theme_name ) == 0 ) {
489          FREE(theme_name);
490          return idx;
491       }
492       idx++;
493    }
494    FREE(theme_name);
495    return -1;
496 }
497
498 static int exit_apps_iterfunc( const aul_app_info *info, void *data )
499 {
500    if( !info  || !info->pkg_name) return 0;
501
502    char *except_pkgs = (char *) getenv("SETTING_THEME_EXCEPT_PKGS");
503
504    if( except_pkgs ) {
505
506         //TODO: should remove pkgs here!!
507         //It can be skipped setting app by using aul with pid.
508
509    }else {
510         char* curr_menu = vconf_get_str("db/menuscreen/pkgname");
511
512         //TODO: Temporary comparison. Please remove this and implement above.
513         if( !_strncmp(info->pkg_name, "com.samsung.menu-screen") ||
514             !_strncmp(info->pkg_name, "com.samsung.setting") ||
515             !_strncmp(info->pkg_name, "com.samsung.live-magazine") ||
516             !_strncmp(info->pkg_name, "com.samsung.live-data-provider") ||
517             !_strncmp(info->pkg_name, "com.samsung.quickpanel") ||
518             !_strncmp(info->pkg_name, "com.samsung.vtmain") ||
519             !_strncmp(info->pkg_name, "com.samsung.call") ||
520             !_strncmp(info->pkg_name, curr_menu) ) {
521            FREE(curr_menu);
522            return 0;
523         }
524
525         FREE(curr_menu);
526    }
527
528    aul_terminate_pid( info->pid );
529
530    return 0;
531 }
532
533 static void _popup_default_theme_response_no_cb( void *data, Evas_Object *obj, void *event_info )
534 {
535       return;
536 }
537
538 static void _popup_default_theme_response_yes_cb( void *data, Evas_Object *obj, void *event_info )
539 {
540    Item_Data *item_data = (Item_Data *)data;
541    if(item_data == NULL) return;
542
543    struct ug_theme_info *theme_info = NULL;
544    theme_info = eina_list_nth(gtheme_list, item_data->idx);
545
546    View_Data *vd = (View_Data *)evas_object_data_get(elm_object_item_widget_get(item_data->it), "view_data");
547    if(vd == NULL) return;
548
549    elm_radio_value_set(rdg, item_data->idx);
550
551    // Change EFL Theme
552    Eina_Strbuf* efl_path = eina_strbuf_new();
553    eina_strbuf_append_printf( efl_path, "%s/%s.edj",
554                DEFAULT_THEME_FOLDER_PATH,
555                item_data->label);
556    elm_theme_set(NULL, eina_strbuf_string_get(efl_path));
557    elm_config_all_flush();
558    vconf_set_str(VCONFKEY_SETAPPL_WIDGET_THEME_STR, eina_strbuf_string_get(efl_path) );
559    eina_strbuf_free(efl_path);
560
561    // Change Selected Theme Value
562    vconf_set_str(SETTING_THEME_SELECTED_THEME, item_data->label);
563
564    aul_app_get_running_app_info( exit_apps_iterfunc, NULL );
565    elm_exit();
566 }
567
568 static void _cancel_button_clicked(void *data, Evas_Object *obj, void *event_info)
569 {
570    if (!data) return;
571    Evas_Object *nf = (Evas_Object *) data;
572    elm_naviframe_item_pop(nf);
573 }
574
575 static void _done_button_clicked(void *data, Evas_Object *obj, void *event_info)
576 {
577    Evas_Object *btn1, *btn2;
578    Item_Data *item_data = (Item_Data *)data;
579    if(item_data == NULL) return;
580
581    struct ug_theme_info *theme_info = NULL;
582    theme_info = eina_list_nth(gtheme_list, item_data->idx);
583
584    View_Data *vd = (View_Data *)evas_object_data_get(elm_object_item_widget_get(item_data->it), "view_data");
585    if(vd == NULL) return;
586
587    //TODO: Test Code Should be removed - View_Data and && item_data->idx <= vd->default_theme_count
588    if (item_data->idx != _selected_theme_idx_get() && item_data->idx < vd->default_theme_count) {
589
590       if (THEME_TYPE_DEFAULT == theme_info->type){
591          // Show popup
592          Evas_Object *popup = elm_popup_add( vd->nf );
593          if( popup == NULL ) {
594               return ;
595          }
596
597          //TODO: Apply Multi Lanaguage to this string.
598          elm_object_text_set( popup, _("All Apps will be closed<br> to change theme") );
599
600          btn1 = elm_button_add(popup);
601          elm_object_text_set(btn1, _("IDS_COM_POP_YES"));
602          elm_object_part_content_set(popup, "button1", btn1);
603          evas_object_smart_callback_add(btn1, "clicked", _popup_default_theme_response_yes_cb, popup);
604
605          btn2 = elm_button_add(popup);
606          elm_object_text_set(btn2, _("IDS_COM_POP_NO"));
607          elm_object_part_content_set(popup, "button2", btn2);
608          evas_object_smart_callback_add(btn2, "clicked", _popup_default_theme_response_no_cb, popup);
609
610          evas_object_show( popup );
611       }
612
613       //TODO: Download Winset Setting
614 #if 0
615       else {
616          if (_load_index_file(ugd,theme_info) == 0) {
617             Eina_Strbuf* efl_path = eina_strbuf_new();
618             eina_strbuf_append_printf( efl_path, "%s/%s/%s/%s.edj",
619                   DOWNLOAD_THEME_FOLDER_PATH,
620                   theme_info->name,
621                   DOWNLOAD_THEME_EFL_FOLDER_NAME,
622                   ugd->theme.efl_theme.name);
623             vconf_set_str(VCONFKEY_SETAPPL_WIDGET_THEME_STR, eina_strbuf_string_get(efl_path));
624             elm_theme_set(NULL, eina_strbuf_string_get(efl_path));
625             elm_config_all_flush();
626             eina_strbuf_free(efl_path);
627          }
628       }
629 #endif
630
631    }
632
633 }
634
635 // This is called when check box status is changed
636 static void _item_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
637 {
638    Item_Data *item_data = (Item_Data *)data;
639    View_Data *vd = (View_Data *)evas_object_data_get(elm_object_item_widget_get(item_data->it), "view_data");
640    if (vd == NULL) return;
641
642    if (item_data->checked) vd->checked_count++;
643    else vd->checked_count--;
644
645    // update select all check button
646    if (vd->select_all_layout) {
647       if ((vd->total_count - vd->default_theme_count) == vd->checked_count)
648          vd->select_all_checked = EINA_TRUE;
649       else
650          vd->select_all_checked = EINA_FALSE;
651
652       elm_check_state_pointer_set(vd->select_all_checkbox, &vd->select_all_checked);
653    }
654 }
655
656 // FIXME: Need proper method.
657 // FIXME: This would be only available for our theme but not 3rd parties'
658 static char* _rename_theme(const char * origin)
659 {
660    if ( !_strncmp(origin, "tizen-hd") ) {
661      return strdup("White");
662    } else if ( !_strncmp(origin, "tizen-black-hd") ) {
663       return strdup("Black");
664    }
665    else return strdup(origin);
666 }
667
668 static void _reveal_button_clicked(void *data, Evas_Object *obj, void *event_info)
669 {
670    char *nf_title;
671    Evas_Object *cbar;
672    Evas_Object *cancel_btn;
673    Evas_Object *done_btn;
674    Evas_Object *nf;
675    Evas_Object *box;
676    Elm_Object_Item *ti;
677    Item_Data *item_data = (Item_Data *)data;
678    if (item_data == NULL) return;
679
680    View_Data *vd = (View_Data *)evas_object_data_get(elm_object_item_widget_get(item_data->it), "view_data");
681    if (vd == NULL) return;
682
683    nf = vd->nf;
684
685    // Create Controlbar
686    cbar = elm_toolbar_add(nf);
687    if (cbar == NULL) return;
688    elm_object_style_set(cbar, "naviframe");
689
690    cancel_btn = elm_button_add(cbar);
691    elm_object_style_set(cancel_btn, "naviframe_control/default");
692    evas_object_size_hint_align_set(cancel_btn, EVAS_HINT_FILL, 0.5);
693    elm_object_text_set(cancel_btn, _("Cancel"));
694    evas_object_show(cancel_btn);
695    evas_object_smart_callback_add(cancel_btn, "clicked", _cancel_button_clicked, nf);
696
697    done_btn = elm_button_add(cbar);
698    elm_object_style_set(done_btn, "naviframe_control/default");
699    evas_object_size_hint_align_set(done_btn, EVAS_HINT_FILL, 0.5);
700    elm_object_text_set(done_btn, _("Done"));
701    evas_object_show(done_btn);
702    evas_object_smart_callback_add(done_btn, "clicked", _done_button_clicked, item_data);
703
704    // Disable Button, If Currently Set
705    char *theme_name = vconf_get_str(SETTING_THEME_SELECTED_THEME);
706    if( _strncmp( item_data->label, theme_name ) == 0 ) {
707       elm_object_disabled_set(done_btn, 1);
708    }
709    FREE(theme_name);
710
711    // For Consistent Look
712    ti = elm_toolbar_item_append(cbar, NULL, NULL, NULL, NULL);
713    elm_object_item_part_content_set(ti, "object", cancel_btn);
714    ti = elm_toolbar_item_append(cbar, NULL, NULL, NULL, NULL);
715    elm_object_item_part_content_set(ti, "object", done_btn);
716
717    nf_title = _rename_theme(item_data->label);
718
719    box = elm_box_add(nf);
720    evas_object_show(box);
721
722    // TODO: Preview Image Should Get From Theme
723    if (item_data->idx < vd->default_theme_count) {
724
725       Evas_Object* icon;
726       icon = elm_icon_add(nf);
727
728       char* fn;
729       if (!_strncmp(item_data->label, "tizen-hd"))
730          fn = "tizen";
731       else if (!_strncmp(item_data->label, "tizen-black-hd"))
732          fn = "tizen-black";
733       else
734          fn = item_data->label;
735
736       Eina_Strbuf* efl_path = eina_strbuf_new();
737       eina_strbuf_append_printf( efl_path, "%s/%s.png",
738             IMG_DIR,
739             fn);
740
741       elm_icon_file_set(icon, eina_strbuf_string_get(efl_path), NULL);
742       elm_icon_resizable_set(icon, 0, 0);
743       evas_object_size_hint_align_set(icon, 0.5, 0.5);
744       elm_box_pack_end(box, icon);
745       evas_object_show(icon);
746
747       eina_strbuf_free(efl_path);
748    }
749
750    Elm_Object_Item *navi_it = elm_naviframe_item_push(nf, nf_title, NULL, NULL, box, NULL);
751    elm_object_item_part_content_set(navi_it, "optionheader", cbar);
752    FREE(nf_title);
753
754    // Remove Prev Button
755    Evas_Object *prev_btn = elm_object_item_part_content_get(navi_it, "prev_btn");
756    evas_object_del(prev_btn);
757 }
758
759 static void _gl_sel( void *data, Evas_Object *obj, void *event_info)
760 {
761    Item_Data *item_data;
762    Elm_Object_Item *genlist_item = (Elm_Object_Item *) event_info;
763    if( genlist_item == NULL ) return;
764
765    elm_genlist_item_selected_set(genlist_item, EINA_FALSE);
766    item_data = elm_object_item_data_get(genlist_item);
767    _done_button_clicked(item_data, NULL, NULL);
768 }
769
770 static char* _gl_label_get(void *data, Evas_Object *obj, const char *part)
771 {
772    Item_Data *item_data = (Item_Data *) data;
773    if(item_data == NULL) return NULL;
774
775    if( strcmp(part, "elm.text") == 0 ) {
776       return _rename_theme(item_data->label);
777    }
778    return NULL;
779 }
780
781 Evas_Object *_load_edj(Evas_Object *parent, const char *file, const char *group) {
782    Evas_Object *eo;
783    int r;
784
785    eo = elm_layout_add(parent);
786    if (eo) {
787       r = elm_layout_file_set(eo, file, group);
788       if (!r) {
789          evas_object_del(eo);
790          return NULL;
791       }
792    }
793
794    return eo;
795 }
796
797 static Evas_Object *_gl_icon_get(void *data, Evas_Object *obj, const char *part)
798 {
799    if(obj == NULL) return NULL;
800
801    Item_Data *item_data = (Item_Data *) data;
802    if(item_data == NULL) return NULL;
803
804    Evas_Object *icon;
805
806    if (!elm_genlist_decorate_mode_get(obj)) {
807       if ( !strncmp( part, "elm.icon.1", strlen(part) ) ) {
808          // radio button
809          icon = elm_radio_add(obj);
810          elm_radio_state_value_set(icon, (int) item_data->idx);
811          evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
812          elm_radio_group_add( icon, rdg );
813
814          // For avoidng user click
815          Evas_Object* fake_icon = _load_edj(obj, SETTING_THEME_EDJ, "fake_icon");
816          elm_object_part_content_set(fake_icon, "icon", icon);
817
818          return fake_icon;
819       } else if ( !strncmp( part, "elm.icon.2", strlen(part) ) ) {
820          // preview button
821          icon = elm_button_add(obj);
822          elm_object_style_set(icon, "reveal");
823          evas_object_smart_callback_add(icon, "clicked", _reveal_button_clicked, item_data);
824          evas_object_propagate_events_set(icon, EINA_FALSE);
825          return icon;
826       }
827    } else {
828       if (!strcmp(part, "elm.edit.icon.1")) {  // swallow checkbox or radio button
829          icon = elm_check_add(obj);
830          elm_check_state_pointer_set(icon, &item_data->checked);
831          evas_object_smart_callback_add(icon, "changed", _item_check_changed_cb, item_data);
832          return icon;
833       }
834    }
835    return NULL;
836 }
837
838 static void _clear_theme_list(Eina_List *theme_list)
839 {
840    Eina_List *elist = NULL;
841    struct ug_theme_info  *theme_info = NULL;
842    EINA_LIST_FOREACH( theme_list, elist, theme_info ) {
843       theme_list = eina_list_remove( theme_list, theme_info );
844       free( theme_info->name );
845       free( theme_info );
846    }
847 }
848
849 static void _base_object_del_cb(void * data, Evas *e, Evas_Object *obj, void *event_info)
850 {
851    struct ug_data *ugd = (struct ug_data *) data;
852    ugd->base = NULL;
853 }
854
855 static void _back_button_clicked( void *data, Evas_Object *obj, void *event_info )
856 {
857    struct ug_data * ugd = (struct ug_data *) data;
858
859    ug_destroy_me(ugd->ug);
860 }
861
862 static void _check_select_all(View_Data *vd)
863 {
864    Item_Data *it_data;
865    Elm_Object_Item *it;
866
867    if (vd->select_all_checked) vd->checked_count = (vd->total_count - vd->default_theme_count);
868    else vd->checked_count = 0;
869
870    it = elm_genlist_first_item_get(vd->genlist);
871    while(it) {
872       it_data = elm_object_item_data_get(it);
873       if (it_data) it_data->checked = vd->select_all_checked;
874       it = elm_genlist_item_next_get(it);
875    }
876    // Update all realized items
877    elm_genlist_realized_items_update(vd->genlist);
878 }
879
880 static void _select_all_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
881 {
882    _check_select_all(data);
883 }
884
885 static void _genlist_to_normal(View_Data *data)
886 {
887    if (!data) return;
888    View_Data *vd = data;
889    Item_Data *item_data;
890    Evas_Object *genlist = vd->genlist;
891    Evas_Object *delete_btn = vd->delete_btn, *more_btn = vd->more_btn;
892    Elm_Object_Item *it, *ti;
893    Eina_List *elist = NULL;
894    struct ug_theme_info *theme_info = NULL;
895    int idx = 0;
896
897    // Change background color to default background color
898    elm_object_style_set(vd->bg, "group_list");
899
900    // Change button label
901    elm_object_text_set(delete_btn, _("Delete"));
902    elm_object_text_set(more_btn, _("More winsets"));
903
904    // Remove 'Select All' layout.
905    elm_box_unpack(vd->box, vd->select_all_layout);
906    evas_object_del(vd->select_all_layout);
907    vd->select_all_layout = NULL;
908
909    // Unset edit mode
910    elm_genlist_decorate_mode_set(genlist, EINA_FALSE);
911    elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
912
913    // Add Default Theme
914    idx = 0;
915    it = elm_genlist_first_item_get(genlist);
916    EINA_LIST_FOREACH( gtheme_list, elist, theme_info ) {
917       item_data = calloc(1, sizeof(Item_Data));
918       item_data->label = theme_info->name;
919       item_data->idx = idx;
920       if (it)
921          item_data->it = elm_genlist_item_insert_before(genlist, &itc, (void *) item_data, NULL, it, ELM_GENLIST_ITEM_NONE, _gl_sel, NULL);
922       else {
923          item_data->it = elm_genlist_item_append(genlist, &itc, (void *) item_data, NULL, ELM_GENLIST_ITEM_NONE, _gl_sel, NULL);
924       }
925
926       idx++;
927       if (idx >= vd->default_theme_count) break;
928    }
929
930    // Remove 'Delete' button
931    idx = 0;
932    it = elm_genlist_first_item_get(genlist);
933    while(it) {
934       idx++;
935       it = elm_genlist_item_next_get(it);
936    }
937
938    if (idx <= vd->default_theme_count) {
939       elm_object_item_del(vd->del_btn_item);
940       ti = elm_toolbar_item_prepend(vd->cbar, NULL, NULL, NULL, NULL);
941       elm_object_item_part_content_set(ti, "object", NULL);
942    }
943
944    // Change Genlist Item Class
945    idx = 0;
946    it = elm_genlist_item_prepend(genlist, &itc2, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
947    elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
948
949    it = elm_genlist_first_item_get(genlist);
950    while(it) {
951       if(idx != 0) {
952          elm_genlist_item_item_class_update(it, &itc);
953       }
954       it = elm_genlist_item_next_get(it);
955       ++idx;
956    }
957 }
958
959 static void _delete_button_clicked(void *data, Evas_Object *obj, void *event_info)
960 {
961    if (!data) return;
962    View_Data *vd = data;
963    Item_Data *item_data;
964    Evas_Object *genlist = vd->genlist, *layout, *check;
965    Evas_Object *delete_btn = vd->delete_btn, *more_btn = vd->more_btn;
966    Elm_Object_Item *it;
967    int idx = 0;
968
969    if (!elm_genlist_decorate_mode_get(genlist)) {
970       // Genlist will be in Edit Mode
971
972       // Change background color to edit_mode color
973       elm_object_style_set(vd->bg, "edit_mode");
974
975       // Change button label
976       elm_object_text_set(delete_btn, _("Cancel"));
977       elm_object_text_set(more_btn, _("Done"));
978
979       // Append 'Select All' layout
980       layout = vd->select_all_layout = elm_layout_add(vd->box);
981       elm_layout_theme_set(layout, "genlist", "item", "select_all/default");
982       evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
983       evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
984
985       check = vd->select_all_checkbox = elm_check_add(vd->select_all_layout);
986       elm_check_state_pointer_set(check, &vd->select_all_checked);
987       evas_object_smart_callback_add(check, "changed", _select_all_check_changed_cb, vd);
988       elm_check_state_set(check, EINA_FALSE);
989       vd->select_all_checked = EINA_FALSE;
990       evas_object_propagate_events_set(check, EINA_FALSE);
991       elm_object_part_content_set(layout, "elm.icon", check);
992
993       elm_object_part_text_set(vd->select_all_layout, "elm.text", "Select All");
994       elm_box_pack_start(vd->box, vd->select_all_layout);
995       evas_object_show(vd->select_all_layout);
996
997       // Delete Seperator Item
998       it = elm_genlist_first_item_get(genlist);
999       elm_object_item_del(it);
1000
1001       // Delete Default Theme Item
1002       idx = vd->default_theme_count;
1003       it = elm_genlist_first_item_get(genlist);
1004       while(it && idx > 0) {
1005          item_data = elm_object_item_data_get(it);
1006          it = elm_genlist_item_next_get(it);
1007
1008          if (item_data) {
1009             elm_object_item_del(item_data->it);
1010             idx--;
1011          }
1012       }
1013
1014       // Change Genlist Item Class
1015       it = elm_genlist_first_item_get(genlist);
1016       while(it) {
1017          elm_genlist_item_item_class_update(it, &edit_mode_itc);
1018          item_data = elm_object_item_data_get(it);
1019          item_data->checked = EINA_FALSE;
1020          it = elm_genlist_item_next_get(it);
1021       }
1022       vd->checked_count = 0;
1023
1024       elm_genlist_decorate_mode_set(genlist, EINA_TRUE);
1025    } else {
1026       // Genlist will be in Normal Mode
1027       _genlist_to_normal(vd);
1028    }
1029 }
1030
1031 static void response_cb(void *data, Evas_Object *obj, void *event_info)
1032 {
1033    if (obj != NULL)
1034       evas_object_del(obj);
1035 }
1036
1037 static void _more_button_clicked(void *data, Evas_Object *obj, void *event_info)
1038 {
1039    struct ug_data *ugd = (struct ug_data *) data;
1040    if (ugd == NULL) return;
1041
1042    View_Data *vd = ugd->vd;
1043    if (vd == NULL) return;
1044
1045    Item_Data *it_data;
1046    Elm_Object_Item *it;
1047    Evas_Object *genlist = vd->genlist;
1048
1049    if (!elm_genlist_decorate_mode_get(genlist)) {
1050       if(aul_launch_app("com.samsung.samsungapps", NULL) < 0) {
1051          // Error Handling, Cannot Launch Samsung Apps
1052          Evas_Object *popup = elm_popup_add(vd->nf);
1053          elm_object_text_set(popup, "Samsung Apps is not installed");
1054          evas_object_smart_callback_add(popup, "block,clicked", _block_clicked_cb, NULL);
1055          elm_popup_timeout_set(popup, 3.0);
1056          evas_object_smart_callback_add(popup, "response", response_cb, NULL);
1057          evas_object_show(popup);
1058       }
1059    } else {
1060       // Done - Delete Selected Winset
1061       it = elm_genlist_first_item_get(genlist);
1062       while (it) {
1063          it_data = elm_object_item_data_get(it);
1064          it = elm_genlist_item_next_get(it);
1065
1066          if ((it_data) && (it_data->checked)) {
1067             elm_object_item_del(it_data->it);
1068             vd->total_count--;
1069             vd->checked_count--;
1070          }
1071       }
1072       _genlist_to_normal(vd);
1073    }
1074
1075 }
1076
1077 static void _set_genlist_item_styles(View_Data *vd)
1078 {
1079    itc.item_style = "dialogue/1text.2icon.2";
1080    itc.func.text_get = _gl_label_get;
1081    itc.func.content_get = _gl_icon_get;
1082    itc.func.state_get = NULL;
1083    itc.func.del = NULL;
1084    itc.decorate_item_style = "edit_default";
1085
1086    itc2.item_style = "dialogue/seperator";
1087    itc2.func.text_get = NULL;
1088    itc2.func.content_get = NULL;
1089    itc2.func.state_get = NULL;
1090    itc2.func.del = NULL;
1091
1092    edit_mode_itc.item_style = "1text";
1093    edit_mode_itc.func.text_get = _gl_label_get;
1094    edit_mode_itc.func.content_get = _gl_icon_get;
1095    edit_mode_itc.func.state_get = NULL;
1096    edit_mode_itc.func.del = NULL;
1097    edit_mode_itc.decorate_item_style = "edit_default";
1098 }
1099
1100 // Create genlist and append items
1101 static Evas_Object *_create_genlist(struct ug_data *ugd)
1102 {
1103    if( ugd == NULL ) return NULL;
1104    View_Data *vd = ugd->vd;
1105    Item_Data *item_data;
1106    Evas_Object *genlist;
1107
1108    // Create genlist
1109    genlist = elm_genlist_add(vd->nf);
1110    evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1111    evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
1112
1113    // Get Default Theme
1114    Eina_List *theme_list = ugd->theme_list;
1115    _get_default_theme_list( DEFAULT_THEME_FOLDER_PATH, &theme_list);
1116    vd->default_theme_count = eina_list_count(theme_list);
1117
1118    // Get Download Theme
1119    _get_theme_list( DOWNLOAD_THEME_FOLDER_PATH , &theme_list );
1120
1121    //TODO: Test Code - START, Should be removed
1122 #if 0
1123    struct ug_theme_info *new_info_r = (struct ug_theme_info*)calloc(1,sizeof(struct ug_theme_info));
1124    new_info_r->type = THEME_TYPE_DOWNLOAD;
1125    new_info_r->name = strndup("Red", strlen("Red"));
1126    eina_list_append( theme_list, new_info_r );
1127
1128    struct ug_theme_info *new_info_g = (struct ug_theme_info*)calloc(1,sizeof(struct ug_theme_info));
1129    new_info_g->type = THEME_TYPE_DOWNLOAD;
1130    new_info_g->name = strndup("Green", strlen("Green"));
1131    eina_list_append( theme_list, new_info_g );
1132
1133    struct ug_theme_info *new_info_b = (struct ug_theme_info*)calloc(1,sizeof(struct ug_theme_info));
1134    new_info_b->type = THEME_TYPE_DOWNLOAD;
1135    new_info_b->name = strndup("Blue", strlen("Blue"));
1136    eina_list_append( theme_list, new_info_b );
1137 #endif
1138    //TODO: Test Code - END, Should be removed
1139    ugd->theme_list = theme_list;
1140    gtheme_list = eina_list_clone( ugd->theme_list );
1141
1142    Eina_List *elist = NULL;
1143    struct ug_theme_info *theme_info = NULL;
1144    int idx = 0;
1145
1146    item_data = calloc(1, sizeof(Item_Data));
1147    item_data->label = NULL;
1148    item_data->idx = idx;
1149    item_data->it = elm_genlist_item_append(genlist, &itc2, (void *) item_data, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
1150    elm_genlist_item_select_mode_set(item_data->it, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1151
1152    EINA_LIST_FOREACH( gtheme_list, elist, theme_info ) {
1153       item_data = calloc(1, sizeof(Item_Data));
1154       item_data->label = theme_info->name;
1155       item_data->idx = idx;
1156       item_data->it = elm_genlist_item_append(genlist, &itc, (void *) item_data, NULL, ELM_GENLIST_ITEM_NONE, _gl_sel, NULL);
1157       idx++;
1158    }
1159
1160    evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1161    evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
1162
1163    vd->total_count = idx;
1164
1165    // Check selected theme
1166    idx = _selected_theme_idx_get();
1167    if (idx < 0) return genlist;
1168
1169    // Create radio group
1170    rdg = elm_radio_add( genlist );
1171    elm_radio_value_set( rdg, idx );
1172
1173    return genlist;
1174 }
1175
1176 static Evas_Object *create_fullview( Evas_Object *parent, struct ug_data *ugd )
1177 {
1178    Evas_Object *cbar;
1179    Elm_Object_Item *ti;
1180
1181    if(parent == NULL) return NULL;
1182
1183    // Create layout data
1184    View_Data *vd;
1185    vd = calloc(1, sizeof(View_Data));
1186    ugd->vd = vd;
1187
1188    // Create layout
1189    Evas_Object *layout = _create_layout_main( parent, vd );
1190    if( layout == NULL ) return NULL;
1191
1192    vd->nf = _create_naviframe( layout );
1193    if( vd->nf == NULL ) {
1194       evas_object_del( layout );
1195       return NULL;
1196    }
1197    // Create Genlist
1198    _set_genlist_item_styles(vd);
1199    vd->genlist = _create_genlist(ugd);
1200
1201    // Need by Item Check Changed Callback , Reveal Button Clicked Callback
1202    evas_object_data_set(vd->genlist, "view_data", vd);
1203
1204    // Create Box
1205    vd->box = elm_box_add(vd->nf);
1206    evas_object_size_hint_weight_set(vd->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1207    evas_object_show(vd->box);
1208
1209    elm_box_pack_end(vd->box, vd->genlist);
1210    evas_object_show(vd->genlist);
1211
1212    elm_object_part_content_set( layout, "elm.swallow.content", vd->nf );
1213
1214    // Create Controlbar
1215    vd->cbar = cbar = elm_toolbar_add(vd->nf);
1216    if (cbar == NULL) return NULL;
1217    elm_object_style_set(cbar, "naviframe");
1218
1219    vd->more_btn = elm_button_add(cbar);
1220    elm_object_style_set(vd->more_btn, "naviframe_control/default");
1221    evas_object_size_hint_align_set(vd->more_btn, EVAS_HINT_FILL, 0.5);
1222    elm_object_text_set(vd->more_btn, _("More winsets"));
1223    evas_object_show(vd->more_btn);
1224    evas_object_smart_callback_add(vd->more_btn, "clicked", _more_button_clicked, ugd);
1225
1226    //If there is download winset, then enable delete button
1227    if(vd->default_theme_count < vd->total_count)
1228      {
1229         vd->delete_btn = elm_button_add(cbar);
1230         elm_object_style_set(vd->delete_btn, "naviframe_control/default");
1231         evas_object_size_hint_align_set(vd->delete_btn, EVAS_HINT_FILL, 0.5);
1232         elm_object_text_set(vd->delete_btn, _("Delete"));
1233         evas_object_show(vd->delete_btn);
1234         evas_object_smart_callback_add(vd->delete_btn, "clicked", _delete_button_clicked, vd);
1235         vd->del_btn_item = elm_toolbar_item_append(cbar, NULL, NULL, NULL, NULL);
1236         elm_object_item_part_content_set(vd->del_btn_item, "object", vd->delete_btn);
1237      }
1238    else
1239      {
1240         ti = elm_toolbar_item_append(cbar, NULL, NULL, NULL, NULL);
1241         elm_object_item_part_content_set(ti, "object", NULL);
1242      }
1243    ti = elm_toolbar_item_append(cbar, NULL, NULL, NULL, NULL);
1244    elm_object_item_part_content_set(ti, "object", vd->more_btn);
1245
1246    Evas_Object *back_btn = elm_button_add( vd->nf );
1247    elm_object_style_set(back_btn, "naviframe/back_btn/default");
1248    evas_object_smart_callback_add( back_btn, "clicked", _back_button_clicked, ugd );
1249    Elm_Object_Item *navi_it = elm_naviframe_item_push( vd->nf, _("IDS_ST_BODY_THEME"), back_btn, NULL, vd->box, NULL );
1250
1251    // add controlbar to naviframe
1252    elm_object_item_part_content_set(navi_it, "optionheader", cbar);
1253    elm_object_item_signal_emit(navi_it, "elm,state,optionheader,instant_close", "");
1254
1255    evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, _base_object_del_cb, ugd);
1256
1257    return layout;
1258 }
1259
1260 static Evas_Object *create_frameview(Evas_Object *parent, struct ug_data *ugd)
1261 {
1262    Evas_Object *base = NULL;
1263
1264    // Create Frame view
1265
1266    return base;
1267 }
1268
1269 static void *on_create(struct ui_gadget *ug, enum ug_mode mode, bundle *data, void *priv)
1270 {
1271    Evas_Object *parent;
1272    struct ug_data *ugd;
1273    if (!ug || !priv)
1274       return NULL;
1275
1276    ugd = priv;
1277    ugd->ug = ug;
1278
1279    bindtextdomain(PKGNAME, MO_FILE_PATH);
1280
1281    parent = ug_get_parent_layout(ug);
1282    if (!parent)
1283       return NULL;
1284
1285    if (mode == UG_MODE_FULLVIEW)
1286       ugd->base = create_fullview(parent, ugd);
1287    else
1288       ugd->base = create_frameview(parent, ugd);
1289
1290    _parent = parent;
1291
1292    return ugd->base;
1293 }
1294
1295 static void on_start(struct ui_gadget *ug, bundle *data, void *priv)
1296 {
1297 }
1298
1299 static void on_pause(struct ui_gadget *ug, bundle *data, void *priv)
1300 {
1301
1302 }
1303
1304 static void on_resume(struct ui_gadget *ug, bundle *data, void *priv)
1305 {
1306
1307 }
1308
1309
1310 static void on_destroy(struct ui_gadget *ug, bundle *data, void *priv)
1311 {
1312    struct ug_data *ugd;
1313
1314    if (!ug || !priv)
1315       return;
1316
1317    ugd = priv;
1318
1319    // Free View Data
1320    if (ugd->vd) {
1321       if (ugd->vd->bg) {
1322          evas_object_del(ugd->vd->bg);
1323          ugd->vd->bg = NULL;
1324       }
1325       evas_object_data_set(ugd->vd->genlist, "view_data", NULL);
1326       free(ugd->vd);
1327       ugd->vd = NULL;
1328    }
1329
1330    _clear_theme_list( ugd->theme_list );
1331    ugd->theme_list = NULL;
1332
1333    if( ugd->base ) {
1334       evas_object_del(ugd->base);
1335       ugd->base = NULL;
1336    }
1337
1338    eina_list_free( gtheme_list );
1339    gtheme_list = NULL;
1340
1341    if( rdg != NULL ) {
1342       evas_object_del( rdg );
1343       rdg = NULL;
1344    }
1345 }
1346
1347 static void on_message(struct ui_gadget *ug, bundle *msg, bundle *data, void *priv)
1348 {
1349 }
1350
1351 static void on_event(struct ui_gadget *ug, enum ug_event event, bundle *data, void *priv)
1352 {
1353    switch (event) {
1354       case UG_EVENT_LOW_MEMORY:
1355          break;
1356       case UG_EVENT_LOW_BATTERY:
1357          break;
1358       case UG_EVENT_LANG_CHANGE:
1359          break;
1360       case UG_EVENT_ROTATE_PORTRAIT:
1361          break;
1362       case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
1363          break;
1364       case UG_EVENT_ROTATE_LANDSCAPE:
1365          break;
1366       case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
1367          break;
1368       default:
1369          break;
1370    }
1371 }
1372
1373 static void on_key_event(struct ui_gadget *ug, enum ug_key_event event, bundle *data, void *priv)
1374 {
1375    if (!ug)
1376       return;
1377
1378    switch (event) {
1379       case UG_KEY_EVENT_END:
1380          ug_destroy_me(ug);
1381          break;
1382       default:
1383          break;
1384    }
1385 }
1386
1387 UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
1388 {
1389    struct ug_data *ugd;
1390
1391    if (!ops)
1392       return -1;
1393
1394    ugd = calloc(1, sizeof(struct ug_data));
1395    if (!ugd)
1396       return -1;
1397
1398    ops->create = on_create;
1399    ops->start = on_start;
1400    ops->pause = on_pause;
1401    ops->resume = on_resume;
1402    ops->destroy = on_destroy;
1403    ops->message = on_message;
1404    ops->event = on_event;
1405    ops->key_event = on_key_event;
1406    ops->priv = ugd;
1407    ops->opt = UG_OPT_INDICATOR_ENABLE;
1408
1409    return 0;
1410 }
1411
1412 UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
1413 {
1414    struct ug_data *ugd;
1415
1416    if (!ops)
1417       return;
1418
1419    ugd = ops->priv;
1420    if (ugd)
1421       free(ugd);
1422 }
1423
1424 // For Reset Operation
1425 UG_MODULE_API int setting_plugin_reset(bundle *data, void *priv)
1426 {
1427    //FIXME: Need to avoid hard coding for default theme name
1428    char *value = vconf_get_str(SETTING_THEME_SELECTED_THEME);
1429
1430    if (value && !strcmp(value, "tizen-black-hd"))
1431      {
1432         vconf_set_bool(SETTING_THEME_IS_THEME_CHANGED, 0);
1433      }
1434    else
1435      {
1436         vconf_set_bool(SETTING_THEME_IS_THEME_CHANGED, 1);
1437      }
1438
1439    FREE(value);
1440
1441    // Change Selected Theme Value
1442    vconf_set_str(SETTING_THEME_SELECTED_THEME, "tizen-black-hd");
1443
1444    // Change EFL Theme
1445    Eina_Strbuf* efl_path = eina_strbuf_new();
1446    eina_strbuf_append_printf( efl_path, "%s/tizen-black-hd.edj",
1447                DEFAULT_THEME_FOLDER_PATH);
1448    vconf_set_str(VCONFKEY_SETAPPL_WIDGET_THEME_STR, eina_strbuf_string_get(efl_path) );
1449    eina_strbuf_free(efl_path);
1450
1451    aul_app_get_running_app_info( exit_apps_iterfunc, NULL );
1452
1453    return 0;
1454 }