2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://www.tizenopensource.org/license
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.
21 #define UG_MODULE_API __attribute__ ((visibility("default")))
25 #include <ui-gadget-module.h>
28 #include <vconf-keys.h>
29 #include <Efreet_Mime.h>
31 #include "setting-theme-efl.h"
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;
38 struct ug_down_theme_property
41 char name[SETTING_THEME_NAME_MAX_LEN];
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;
68 typedef struct _Item_Data Item_Data;
69 typedef struct _View_Data View_Data;
74 Evas_Object *delete_btn; // 'Delete'/'Cancel' button
75 Evas_Object *more_btn;
77 Elm_Object_Item *del_btn_item; // 'Delete' button
80 Elm_Object_Item *renamed_it;
82 Evas_Object *select_all_layout;
83 Evas_Object *select_all_checkbox;
84 Eina_Bool select_all_checked;
87 int default_theme_count;
91 Elm_Object_Item *it; // Genlist Item pointer
92 Eina_Bool checked; // Check status
99 Eina_List *theme_list;
100 struct ui_gadget *ug;
101 struct ug_theme_list theme;
105 static Evas_Object* _create_layout_main( Evas_Object* parent, View_Data* vd )
107 Evas_Object *layout = elm_layout_add( parent );
108 if( layout == NULL ) return NULL;
110 elm_layout_theme_set( layout, "layout", "application", "default" );
111 evas_object_size_hint_weight_set( layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
114 Evas_Object *bg = elm_bg_add( layout );
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 );
123 evas_object_show( layout );
128 static void _setting_theme_def_response_cb( void *data, Evas_Object *obj, void *event_info )
130 evas_object_del(obj);
133 static void _block_clicked_cb(void *data, Evas_Object *obj, void *event_info)
135 // Popup remove code...ex
137 evas_object_del(conformant);
141 ecore_timer_del(del_timer);
144 evas_object_del(obj);*/
147 static int _load_index_file(struct ug_data* ugd, struct ug_theme_info* selected_theme)
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;
155 eina_strbuf_append_printf( temp_str_buf, "%s/%s/%s", DOWNLOAD_THEME_FOLDER_PATH, selected_theme->name, DOWNLOAD_THEME_INDEX_FILE_NAME);
157 if( !( fp = fopen( eina_strbuf_string_steal( temp_str_buf ), "r" ) ) ) {
159 //make error popup : file not found
160 Evas_Object *popup = elm_popup_add( ugd->base );
162 if( popup == NULL ) {
163 eina_strbuf_free(temp_str_buf);
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);
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 );
175 eina_strbuf_free(temp_str_buf);
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));
189 EINA_LIST_FOREACH( index_list, elist, meta_theme ) {
192 char *meta = strtok_r( meta_theme, "=", &ptr);
196 char *theme = strtok_r( NULL, "\n", &ptr);
197 if( theme == NULL ) continue;
199 if( !strncmp( DOWNLOAD_THEME_ICON_THEME_KEYWORD,
201 strlen( DOWNLOAD_THEME_ICON_THEME_KEYWORD)) ) {
203 ugd->theme.icon_theme.ext = 1;
204 strncpy(ugd->theme.icon_theme.name,theme,strlen(theme));
207 else if( !strncmp( DOWNLOAD_THEME_BOOT_ANIMATOR_THEME_KEYWORD,
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));
213 else if( !strncmp( DOWNLOAD_THEME_KEY_SOUND_THEME_KEYWORD,
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));
220 else if( !strncmp( DOWNLOAD_THEME_EFL_THEME_KEYWORD,
222 strlen( DOWNLOAD_THEME_EFL_THEME_KEYWORD ) ) ) {
223 ugd->theme.efl_theme.ext = 1;
224 strncpy(ugd->theme.efl_theme.name,theme,strlen(theme));
227 else if( !strncmp( DOWNLOAD_THEME_GTK_THEME_KEYWORD,
229 strlen( DOWNLOAD_THEME_GTK_THEME_KEYWORD ) ) ) {
230 ugd->theme.gtk_theme.ext = 1;
231 strncpy(ugd->theme.gtk_theme.name,theme,strlen(theme));
233 else if( !strncmp( DOWNLOAD_THEME_SCREEN_IMG_THEME_KEYWORD,
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));
240 else if( !strncmp( DOWNLOAD_THEME_FONT_THEME_KEYWORD,
242 strlen( DOWNLOAD_THEME_FONT_THEME_KEYWORD )) ) {
243 ugd->theme.font_theme.ext = 1;
244 strncpy(ugd->theme.font_theme.name,theme,strlen(theme));
246 else if( !strncmp( DOWNLOAD_THEME_VIBRATION_THEME_KEYWORD,
248 strlen( DOWNLOAD_THEME_VIBRATION_THEME_KEYWORD )) ) {
249 ugd->theme.vibrate_theme.ext = 1;
250 strncpy(ugd->theme.vibrate_theme.name,theme,strlen(theme));
256 eina_strbuf_free(temp_str_buf);
258 EINA_LIST_FOREACH( index_list, elist, meta_theme ) {
259 index_list = eina_list_remove( index_list, meta_theme );
265 static Evas_Object* _create_naviframe( Evas_Object* parent )
267 if( parent == NULL ) return NULL;
269 Evas_Object *nf = elm_naviframe_add( parent );
270 evas_object_show( nf );
275 static void _remove_files_in_dir( const char *folder_path )
278 char path_buf[ PATH_MAX ];
280 struct dirent *entry = NULL;
282 char *splitter = NULL;
283 char *env = getenv( "UI_IDLECAPTURE_IMG_TYPE" );
289 dp = opendir( folder_path );
295 if( chdir( folder_path ) != 0 ) {
296 fprintf( stderr, "Failed to change directory!\n" );
299 while( ( entry = readdir( dp ) ) != NULL ) {
301 stat( entry->d_name, &statbuf );
303 strcpy( path_buf, folder_path );
305 if( path_buf[ strlen( path_buf ) - 1 ] != '/' ) {
306 strcat( path_buf, "/" );
309 strcat( path_buf, entry->d_name );
312 if( S_ISDIR( statbuf.st_mode ) ) {
314 if( strcmp( ".", entry->d_name ) == 0 || strcmp( "..", entry->d_name ) == 0 ) {
318 _remove_files_in_dir( path_buf );
322 //Check is it jpeg type.
323 mime = (char *) efreet_mime_type_get( path_buf );
329 while( (splitter = strpbrk( mime, "/" )) ) {
330 if( strncmp( mime, env, splitter - mime ) == 0 ) {
338 if( strncmp( mime, env, strlen( mime ) ) == 0 ) {
345 if( chdir( ".." ) != 0 ) {
346 fprintf( stderr, "Failed to change directory!\n" );
352 static int _strncmp( const char *s1, const char *s2)
354 const char *longer = NULL;
355 const char *shorter = NULL;
357 if( strlen( s1 ) > strlen ( s2 ) ) {
365 return strncmp( longer, shorter, strlen( longer ) );
368 static void _get_default_theme_list( const char *folder_path, Eina_List **theme_list )
371 char path_buf[ PATH_MAX ];
373 struct dirent *entry = NULL;
375 dp = opendir( folder_path );
381 if( chdir( folder_path ) != 0 ) {
382 fprintf( stderr, "Failed to change directory!\n" );
385 while( ( entry = readdir( dp ) ) != NULL ) {
387 stat( entry->d_name, &statbuf );
388 strcpy( path_buf, folder_path );
390 if( path_buf[ strlen( path_buf ) - 1 ] != '/' ) {
391 strcat( path_buf, "/" );
394 strcat( path_buf, entry->d_name );
397 if( S_ISDIR( statbuf.st_mode ) ) {
399 if( strcmp( ".", entry->d_name ) == 0 || strcmp( "..", entry->d_name ) == 0 ) {
403 _get_default_theme_list( path_buf, theme_list );
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") ) {
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 );
420 *theme_list = eina_list_append( *theme_list, new_info );
425 if( chdir( ".." ) != 0 ) {
426 fprintf( stderr, "Failed to change directory!\n" );
432 static void _get_theme_list( const char *folder_path, Eina_List **theme_list )
435 char path_buf[ PATH_MAX ];
437 struct dirent *entry = NULL;
439 dp = opendir( folder_path );
445 if( chdir( folder_path ) != 0 ) {
446 fprintf( stderr, "Failed to change directory!\n" );
449 while( ( entry = readdir( dp ) ) != NULL ) {
451 stat( entry->d_name, &statbuf );
453 strcpy( path_buf, folder_path );
455 if( path_buf[ strlen( path_buf ) - 1 ] != '/' ) {
456 strcat( path_buf, "/" );
459 strcat( path_buf, entry->d_name );
461 //in case of directory, add folder name to list.
462 if( S_ISDIR( statbuf.st_mode ) ) {
464 if( strcmp( ".", entry->d_name ) == 0 || strcmp( "..", entry->d_name ) == 0 ) {
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);
477 static int _selected_theme_idx_get()
479 Eina_List *elist = NULL;
480 struct ug_theme_info *theme_info = NULL;
482 // set selected theme
483 char *theme_name = vconf_get_str(SETTING_THEME_SELECTED_THEME);
486 EINA_LIST_FOREACH( gtheme_list, elist, theme_info ) {
488 if( _strncmp( theme_info->name, theme_name ) == 0 ) {
498 static int exit_apps_iterfunc( const aul_app_info *info, void *data )
500 if( !info || !info->pkg_name) return 0;
502 char *except_pkgs = (char *) getenv("SETTING_THEME_EXCEPT_PKGS");
506 //TODO: should remove pkgs here!!
507 //It can be skipped setting app by using aul with pid.
510 char* curr_menu = vconf_get_str("db/menuscreen/pkgname");
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) ) {
528 aul_terminate_pid( info->pid );
533 static void _popup_default_theme_response_no_cb( void *data, Evas_Object *obj, void *event_info )
538 static void _popup_default_theme_response_yes_cb( void *data, Evas_Object *obj, void *event_info )
540 Item_Data *item_data = (Item_Data *)data;
541 if(item_data == NULL) return;
543 struct ug_theme_info *theme_info = NULL;
544 theme_info = eina_list_nth(gtheme_list, item_data->idx);
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;
549 elm_radio_value_set(rdg, item_data->idx);
552 Eina_Strbuf* efl_path = eina_strbuf_new();
553 eina_strbuf_append_printf( efl_path, "%s/%s.edj",
554 DEFAULT_THEME_FOLDER_PATH,
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);
561 // Change Selected Theme Value
562 vconf_set_str(SETTING_THEME_SELECTED_THEME, item_data->label);
564 aul_app_get_running_app_info( exit_apps_iterfunc, NULL );
568 static void _cancel_button_clicked(void *data, Evas_Object *obj, void *event_info)
571 Evas_Object *nf = (Evas_Object *) data;
572 elm_naviframe_item_pop(nf);
575 static void _done_button_clicked(void *data, Evas_Object *obj, void *event_info)
577 Evas_Object *btn1, *btn2;
578 Item_Data *item_data = (Item_Data *)data;
579 if(item_data == NULL) return;
581 struct ug_theme_info *theme_info = NULL;
582 theme_info = eina_list_nth(gtheme_list, item_data->idx);
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;
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) {
590 if (THEME_TYPE_DEFAULT == theme_info->type){
592 Evas_Object *popup = elm_popup_add( vd->nf );
593 if( popup == NULL ) {
597 //TODO: Apply Multi Lanaguage to this string.
598 elm_object_text_set( popup, _("All Apps will be closed<br> to change theme") );
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);
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);
610 evas_object_show( popup );
613 //TODO: Download Winset Setting
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,
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);
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)
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;
642 if (item_data->checked) vd->checked_count++;
643 else vd->checked_count--;
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;
650 vd->select_all_checked = EINA_FALSE;
652 elm_check_state_pointer_set(vd->select_all_checkbox, &vd->select_all_checked);
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)
660 if ( !_strncmp(origin, "tizen-hd") ) {
661 return strdup("White");
662 } else if ( !_strncmp(origin, "tizen-black-hd") ) {
663 return strdup("Black");
665 else return strdup(origin);
668 static void _reveal_button_clicked(void *data, Evas_Object *obj, void *event_info)
672 Evas_Object *cancel_btn;
673 Evas_Object *done_btn;
677 Item_Data *item_data = (Item_Data *)data;
678 if (item_data == NULL) return;
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;
686 cbar = elm_toolbar_add(nf);
687 if (cbar == NULL) return;
688 elm_object_style_set(cbar, "naviframe");
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);
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);
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);
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);
717 nf_title = _rename_theme(item_data->label);
719 box = elm_box_add(nf);
720 evas_object_show(box);
722 // TODO: Preview Image Should Get From Theme
723 if (item_data->idx < vd->default_theme_count) {
726 icon = elm_icon_add(nf);
729 if (!_strncmp(item_data->label, "tizen-hd"))
731 else if (!_strncmp(item_data->label, "tizen-black-hd"))
734 fn = item_data->label;
736 Eina_Strbuf* efl_path = eina_strbuf_new();
737 eina_strbuf_append_printf( efl_path, "%s/%s.png",
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);
747 eina_strbuf_free(efl_path);
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);
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);
759 static void _gl_sel( void *data, Evas_Object *obj, void *event_info)
761 Item_Data *item_data;
762 Elm_Object_Item *genlist_item = (Elm_Object_Item *) event_info;
763 if( genlist_item == NULL ) return;
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);
770 static char* _gl_label_get(void *data, Evas_Object *obj, const char *part)
772 Item_Data *item_data = (Item_Data *) data;
773 if(item_data == NULL) return NULL;
775 if( strcmp(part, "elm.text") == 0 ) {
776 return _rename_theme(item_data->label);
781 Evas_Object *_load_edj(Evas_Object *parent, const char *file, const char *group) {
785 eo = elm_layout_add(parent);
787 r = elm_layout_file_set(eo, file, group);
797 static Evas_Object *_gl_icon_get(void *data, Evas_Object *obj, const char *part)
799 if(obj == NULL) return NULL;
801 Item_Data *item_data = (Item_Data *) data;
802 if(item_data == NULL) return NULL;
806 if (!elm_genlist_decorate_mode_get(obj)) {
807 if ( !strncmp( part, "elm.icon.1", strlen(part) ) ) {
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 );
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);
819 } else if ( !strncmp( part, "elm.icon.2", strlen(part) ) ) {
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);
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);
838 static void _clear_theme_list(Eina_List *theme_list)
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 );
849 static void _base_object_del_cb(void * data, Evas *e, Evas_Object *obj, void *event_info)
851 struct ug_data *ugd = (struct ug_data *) data;
855 static void _back_button_clicked( void *data, Evas_Object *obj, void *event_info )
857 struct ug_data * ugd = (struct ug_data *) data;
859 ug_destroy_me(ugd->ug);
862 static void _check_select_all(View_Data *vd)
867 if (vd->select_all_checked) vd->checked_count = (vd->total_count - vd->default_theme_count);
868 else vd->checked_count = 0;
870 it = elm_genlist_first_item_get(vd->genlist);
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);
876 // Update all realized items
877 elm_genlist_realized_items_update(vd->genlist);
880 static void _select_all_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
882 _check_select_all(data);
885 static void _genlist_to_normal(View_Data *data)
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;
897 // Change background color to default background color
898 elm_object_style_set(vd->bg, "group_list");
900 // Change button label
901 elm_object_text_set(delete_btn, _("Delete"));
902 elm_object_text_set(more_btn, _("More winsets"));
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;
910 elm_genlist_decorate_mode_set(genlist, EINA_FALSE);
911 elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
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;
921 item_data->it = elm_genlist_item_insert_before(genlist, &itc, (void *) item_data, NULL, it, ELM_GENLIST_ITEM_NONE, _gl_sel, NULL);
923 item_data->it = elm_genlist_item_append(genlist, &itc, (void *) item_data, NULL, ELM_GENLIST_ITEM_NONE, _gl_sel, NULL);
927 if (idx >= vd->default_theme_count) break;
930 // Remove 'Delete' button
932 it = elm_genlist_first_item_get(genlist);
935 it = elm_genlist_item_next_get(it);
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);
944 // Change Genlist Item Class
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);
949 it = elm_genlist_first_item_get(genlist);
952 elm_genlist_item_item_class_update(it, &itc);
954 it = elm_genlist_item_next_get(it);
959 static void _delete_button_clicked(void *data, Evas_Object *obj, void *event_info)
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;
969 if (!elm_genlist_decorate_mode_get(genlist)) {
970 // Genlist will be in Edit Mode
972 // Change background color to edit_mode color
973 elm_object_style_set(vd->bg, "edit_mode");
975 // Change button label
976 elm_object_text_set(delete_btn, _("Cancel"));
977 elm_object_text_set(more_btn, _("Done"));
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);
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);
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);
997 // Delete Seperator Item
998 it = elm_genlist_first_item_get(genlist);
999 elm_object_item_del(it);
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);
1009 elm_object_item_del(item_data->it);
1014 // Change Genlist Item Class
1015 it = elm_genlist_first_item_get(genlist);
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);
1022 vd->checked_count = 0;
1024 elm_genlist_decorate_mode_set(genlist, EINA_TRUE);
1026 // Genlist will be in Normal Mode
1027 _genlist_to_normal(vd);
1031 static void response_cb(void *data, Evas_Object *obj, void *event_info)
1034 evas_object_del(obj);
1037 static void _more_button_clicked(void *data, Evas_Object *obj, void *event_info)
1039 struct ug_data *ugd = (struct ug_data *) data;
1040 if (ugd == NULL) return;
1042 View_Data *vd = ugd->vd;
1043 if (vd == NULL) return;
1046 Elm_Object_Item *it;
1047 Evas_Object *genlist = vd->genlist;
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);
1060 // Done - Delete Selected Winset
1061 it = elm_genlist_first_item_get(genlist);
1063 it_data = elm_object_item_data_get(it);
1064 it = elm_genlist_item_next_get(it);
1066 if ((it_data) && (it_data->checked)) {
1067 elm_object_item_del(it_data->it);
1069 vd->checked_count--;
1072 _genlist_to_normal(vd);
1077 static void _set_genlist_item_styles(View_Data *vd)
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";
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;
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";
1100 // Create genlist and append items
1101 static Evas_Object *_create_genlist(struct ug_data *ugd)
1103 if( ugd == NULL ) return NULL;
1104 View_Data *vd = ugd->vd;
1105 Item_Data *item_data;
1106 Evas_Object *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);
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);
1118 // Get Download Theme
1119 _get_theme_list( DOWNLOAD_THEME_FOLDER_PATH , &theme_list );
1121 //TODO: Test Code - START, Should be removed
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 );
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 );
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 );
1138 //TODO: Test Code - END, Should be removed
1139 ugd->theme_list = theme_list;
1140 gtheme_list = eina_list_clone( ugd->theme_list );
1142 Eina_List *elist = NULL;
1143 struct ug_theme_info *theme_info = NULL;
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);
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);
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);
1163 vd->total_count = idx;
1165 // Check selected theme
1166 idx = _selected_theme_idx_get();
1167 if (idx < 0) return genlist;
1169 // Create radio group
1170 rdg = elm_radio_add( genlist );
1171 elm_radio_value_set( rdg, idx );
1176 static Evas_Object *create_fullview( Evas_Object *parent, struct ug_data *ugd )
1179 Elm_Object_Item *ti;
1181 if(parent == NULL) return NULL;
1183 // Create layout data
1185 vd = calloc(1, sizeof(View_Data));
1189 Evas_Object *layout = _create_layout_main( parent, vd );
1190 if( layout == NULL ) return NULL;
1192 vd->nf = _create_naviframe( layout );
1193 if( vd->nf == NULL ) {
1194 evas_object_del( layout );
1198 _set_genlist_item_styles(vd);
1199 vd->genlist = _create_genlist(ugd);
1201 // Need by Item Check Changed Callback , Reveal Button Clicked Callback
1202 evas_object_data_set(vd->genlist, "view_data", vd);
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);
1209 elm_box_pack_end(vd->box, vd->genlist);
1210 evas_object_show(vd->genlist);
1212 elm_object_part_content_set( layout, "elm.swallow.content", vd->nf );
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");
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);
1226 //If there is download winset, then enable delete button
1227 if(vd->default_theme_count < vd->total_count)
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);
1240 ti = elm_toolbar_item_append(cbar, NULL, NULL, NULL, NULL);
1241 elm_object_item_part_content_set(ti, "object", NULL);
1243 ti = elm_toolbar_item_append(cbar, NULL, NULL, NULL, NULL);
1244 elm_object_item_part_content_set(ti, "object", vd->more_btn);
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 );
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", "");
1255 evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, _base_object_del_cb, ugd);
1260 static Evas_Object *create_frameview(Evas_Object *parent, struct ug_data *ugd)
1262 Evas_Object *base = NULL;
1264 // Create Frame view
1269 static void *on_create(struct ui_gadget *ug, enum ug_mode mode, bundle *data, void *priv)
1271 Evas_Object *parent;
1272 struct ug_data *ugd;
1279 bindtextdomain(PKGNAME, MO_FILE_PATH);
1281 parent = ug_get_parent_layout(ug);
1285 if (mode == UG_MODE_FULLVIEW)
1286 ugd->base = create_fullview(parent, ugd);
1288 ugd->base = create_frameview(parent, ugd);
1295 static void on_start(struct ui_gadget *ug, bundle *data, void *priv)
1299 static void on_pause(struct ui_gadget *ug, bundle *data, void *priv)
1304 static void on_resume(struct ui_gadget *ug, bundle *data, void *priv)
1310 static void on_destroy(struct ui_gadget *ug, bundle *data, void *priv)
1312 struct ug_data *ugd;
1322 evas_object_del(ugd->vd->bg);
1325 evas_object_data_set(ugd->vd->genlist, "view_data", NULL);
1330 _clear_theme_list( ugd->theme_list );
1331 ugd->theme_list = NULL;
1334 evas_object_del(ugd->base);
1338 eina_list_free( gtheme_list );
1342 evas_object_del( rdg );
1347 static void on_message(struct ui_gadget *ug, bundle *msg, bundle *data, void *priv)
1351 static void on_event(struct ui_gadget *ug, enum ug_event event, bundle *data, void *priv)
1354 case UG_EVENT_LOW_MEMORY:
1356 case UG_EVENT_LOW_BATTERY:
1358 case UG_EVENT_LANG_CHANGE:
1360 case UG_EVENT_ROTATE_PORTRAIT:
1362 case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
1364 case UG_EVENT_ROTATE_LANDSCAPE:
1366 case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
1373 static void on_key_event(struct ui_gadget *ug, enum ug_key_event event, bundle *data, void *priv)
1379 case UG_KEY_EVENT_END:
1387 UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
1389 struct ug_data *ugd;
1394 ugd = calloc(1, sizeof(struct ug_data));
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;
1407 ops->opt = UG_OPT_INDICATOR_ENABLE;
1412 UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
1414 struct ug_data *ugd;
1424 // For Reset Operation
1425 UG_MODULE_API int setting_plugin_reset(bundle *data, void *priv)
1427 //FIXME: Need to avoid hard coding for default theme name
1428 char *value = vconf_get_str(SETTING_THEME_SELECTED_THEME);
1430 if (value && !strcmp(value, "tizen-black-hd"))
1432 vconf_set_bool(SETTING_THEME_IS_THEME_CHANGED, 0);
1436 vconf_set_bool(SETTING_THEME_IS_THEME_CHANGED, 1);
1441 // Change Selected Theme Value
1442 vconf_set_str(SETTING_THEME_SELECTED_THEME, "tizen-black-hd");
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);
1451 aul_app_get_running_app_info( exit_apps_iterfunc, NULL );