4 * Copyright 2012 Samsung Electronics Co., Ltd
6 * Licensed under the Flora License, Version 1.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.tizenopensource.org/license
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include <Elementary.h>
22 #include <wifi-direct.h>
23 #include <efl_extension.h>
26 #include "wfd_ug_view.h"
27 #include "wfd_client.h"
29 #define WSC_SPEC_DEVICE_NAME_MAX_LEN 32
30 static char special_char[30] = "'!@$%^&*()-_=+[];:,<.>/?";
32 static bool is_space_str(const char *str)
35 if (*str != '\0' && *str != ' ') {
37 } else if (*str == '\0') {
46 * This function check the max length of the device name
48 * @param[in] data the pointer to the main data structure
50 static void _rename_popop_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
53 struct ug_data *ugd = (struct ug_data *) data;
54 WFD_RET_IF(ugd == NULL || obj == NULL, "Incorrect parameter(NULL)\n");
55 WFD_RET_IF(ugd->rename_button == NULL, "ugd->rename_button(NULL)\n");
57 const char *entry_text = NULL;
58 char *input_str = NULL;
59 bool is_space_string = FALSE;
61 entry_text = elm_entry_entry_get(obj);
62 input_str = elm_entry_markup_to_utf8(entry_text);
64 if (elm_object_part_content_get(obj, "elm.swallow.clear")) {
65 if (elm_object_focus_get(obj)) {
66 if (elm_entry_is_empty(obj))
67 elm_object_signal_emit(obj, "elm,state,clear,hidden", "");
69 elm_object_signal_emit(obj, "elm,state,clear,visible", "");
73 if (input_str == NULL || (strlen(input_str) == 0)) {
74 elm_object_disabled_set(ugd->rename_button, TRUE);
75 elm_entry_input_panel_return_key_disabled_set(ugd->rename_entry, TRUE);
76 WFD_IF_FREE_MEM(input_str);
80 is_space_string = is_space_str(input_str);
81 if (is_space_string) {
82 elm_object_disabled_set(ugd->rename_button, TRUE);
83 elm_entry_input_panel_return_key_disabled_set(ugd->rename_entry, TRUE);
84 WFD_IF_FREE_MEM(input_str);
88 if (strlen(input_str) > 0) {
89 elm_object_disabled_set(ugd->rename_button, FALSE);
90 elm_entry_input_panel_return_key_disabled_set(ugd->rename_entry, FALSE);
93 WFD_IF_FREE_MEM(input_str);
97 static void _rename_popup_cancel_cb(void *data, Evas_Object *obj, void *event_info)
100 struct ug_data *ugd = (struct ug_data *) data;
102 WFD_IF_DEL_OBJ(ugd->rename_popup);
103 WFD_IF_DEL_OBJ(ugd->rename_entry);
108 int _check_device_name(const char *device_name)
114 bool is_unavailable_char_found = true;
116 if ((device_name == NULL) || (strlen(device_name) == 0)) {
120 for (i = 0; i < strlen(device_name); i++) {
121 if ((device_name[i] >= '0' && device_name[i] <= '9') ||
122 (device_name[i] >= 'a' && device_name[i] <= 'z') ||
123 (device_name[i] >= 'A' && device_name[i] <= 'Z') ||
124 device_name[i] == ' ') {
127 is_unavailable_char_found = true;
128 for (j = 0; j < strlen(special_char); j++) {
129 if (special_char[j] == device_name[i]) {
130 is_unavailable_char_found = false;
135 if (is_unavailable_char_found) {
136 DBG(LOG_ERROR, "Unavailable char:[%c]\n", device_name[i]);
145 static void _rename_popup_ok_cb(void *data, Evas_Object *obj, void *event_info)
148 struct ug_data *ugd = (struct ug_data *) data;
150 const char *entry_str = elm_entry_entry_get(ugd->rename_entry);
151 char *device_name_str = NULL;
152 device_name_str = elm_entry_markup_to_utf8(entry_str);
154 DBG(LOG_INFO, "New device name:[%s]\n", device_name_str);
155 _check_device_name(device_name_str);
157 if (0 != vconf_set_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR, device_name_str)) {
158 DBG(LOG_ERROR, "Set vconf[%s] failed\n",VCONFKEY_SETAPPL_DEVICE_NAME_STR);
160 #ifdef WFD_ON_OFF_GENLIST
161 wfd_ug_view_refresh_glitem(ugd->item_wifi_onoff);
163 wfd_ug_view_refresh_glitem(ugd->device_name_item);
164 WFD_IF_DEL_OBJ(ugd->rename_popup);
165 WFD_IF_DEL_OBJ(ugd->rename_entry);
166 WFD_IF_FREE_MEM(device_name_str);
170 static void _eraser_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
173 struct ug_data *ugd = (struct ug_data *) data;
174 WFD_RET_IF(ugd == NULL, "Incorrect parameter(NULL)\n");
175 WFD_RET_IF(ugd->rename_entry == NULL, "ugd->rename_entry(NULL)\n");
176 elm_entry_entry_set(ugd->rename_entry, "");
177 elm_object_domain_translatable_part_text_set(ugd->rename_entry, "elm.guide",
178 PACKAGE, "IDS_STU_HEADER_ENTER_DEVICE_NAME");
180 WFD_RET_IF(ugd->rename_button == NULL, "ugd->rename_button(NULL)\n");
181 elm_object_disabled_set(ugd->rename_button, TRUE);
182 elm_entry_input_panel_return_key_disabled_set(ugd->rename_entry, TRUE);
186 static void __device_name_maxlength_reached_cb(void *data, Evas_Object *obj,
191 if (data == NULL || obj == NULL) {
192 DBG(LOG_ERROR, "The param is NULL\n");
196 int ret = notification_status_message_post(
197 _("IDS_COM_POP_MAXIMUM_NUMBER_OF_CHARACTERS_REACHED"));
198 if (ret != NOTIFICATION_ERROR_NONE) {
199 DBG(LOG_ERROR, "notification_status_message_post() ERROR [%d]", ret);
205 static void _entry_focused_cb(void *data, Evas_Object *obj, void *event_info)
207 if (elm_object_part_content_get(obj, "elm.swallow.clear")) {
208 if (!elm_entry_is_empty(obj))
209 elm_object_signal_emit(obj, "elm,state,clear,visible", "");
211 elm_object_signal_emit(obj, "elm,state,clear,hidden", "");
213 elm_object_signal_emit(obj, "elm,state,focus,on", "");
216 static void _rename_entry_keydown_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
220 Evas_Event_Key_Down *ev;
221 Evas_Object *entry = obj;
223 WFD_RET_IF(data == NULL, "Incorrect parameter data(NULL)\n");
224 WFD_RET_IF(event_info == NULL, "Incorrect parameter event_info(NULL)\n");
225 WFD_RET_IF(entry == NULL, "Incorrect parameter entry(NULL)\n");
227 ev = (Evas_Event_Key_Down *)event_info;
228 DBG(LOG_INFO, "ENTER ev->key:%s", ev->key);
230 if (g_strcmp0(ev->key, "KP_Enter") == 0 || g_strcmp0(ev->key, "Return") == 0) {
231 Ecore_IMF_Context *imf_context;
233 imf_context = (Ecore_IMF_Context*)elm_entry_imf_context_get(entry);
235 ecore_imf_context_input_panel_hide(imf_context);
238 elm_object_focus_set(entry, EINA_FALSE);
241 static char *__wfd_main_rename_desc_label_get(void *data, Evas_Object *obj,
246 DBG(LOG_INFO,"Part = %s", part);
247 if (obj == NULL || part == NULL) {
251 if (!strcmp(part, "elm.text.multiline")) {
252 return g_strdup(_("IDS_ST_POP_DEVICE_NAMES_ARE_DISPLAYED_TO_DISTINGUISH_EACH_OF_THE_DEVICES_AVAILABLE_MSG"));
258 static Evas_Object *__wfd_main_rename_entry_icon_get(
259 void *data, Evas_Object *obj, const char *part)
262 struct ug_data *ugd = (struct ug_data *)data;
263 WFD_RETV_IF(ugd == NULL, NULL, "Incorrect parameter(NULL)\n");
264 Evas_Object *entry = NULL;
265 Evas_Object *layout = NULL;
266 Evas_Object *button = NULL;
267 Ecore_IMF_Context *imf_context;
268 char *name_value = NULL;
270 static Elm_Entry_Filter_Limit_Size limit_filter_data;
272 if (!strcmp(part, "elm.icon.entry")) {
274 name_value = elm_entry_utf8_to_markup(ugd->dev_name);
275 entry = elm_entry_add(obj);
276 elm_entry_single_line_set(entry, EINA_TRUE);
277 elm_object_style_set(entry, "editfield");
278 elm_entry_scrollable_set(entry, EINA_TRUE);
279 limit_filter_data.max_char_count = WSC_SPEC_DEVICE_NAME_MAX_LEN;
280 elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data);
282 evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
283 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
284 eext_entry_selection_back_event_allow_set(entry, EINA_TRUE);
285 elm_object_signal_emit(entry, "elm,action,hide,search_icon", "");
286 elm_object_domain_translatable_part_text_set(entry, "elm.guide",
287 PACKAGE, "IDS_STU_HEADER_ENTER_DEVICE_NAME");
289 imf_context = (Ecore_IMF_Context*)elm_entry_imf_context_get(entry);
291 ecore_imf_context_input_panel_return_key_type_set(imf_context,
292 ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_DONE);
295 ugd->rename_entry = entry;
296 elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT);
297 elm_entry_entry_set(entry, name_value);
298 WFD_IF_FREE_MEM(name_value);
299 elm_entry_cursor_end_set(entry);
301 evas_object_smart_callback_add(entry, "changed,user", _rename_popop_entry_changed_cb, ugd);
302 evas_object_smart_callback_add(entry, "changed", _rename_popop_entry_changed_cb, ugd);
303 evas_object_smart_callback_add(entry, "preedit,changed", _rename_popop_entry_changed_cb, ugd);
304 evas_object_smart_callback_add(entry, "maxlength,reached",
305 __device_name_maxlength_reached_cb, ugd);
307 button = elm_button_add(obj);
308 elm_object_style_set(button, "search_clear");
309 elm_object_focus_allow_set(button, EINA_FALSE);
310 elm_object_part_content_set(entry, "elm.swallow.clear", button);
311 evas_object_smart_callback_add(button, "clicked", _eraser_btn_clicked_cb, ugd);
313 evas_object_smart_callback_add(entry, "focused", _entry_focused_cb, NULL);
314 evas_object_event_callback_add(entry, EVAS_CALLBACK_KEY_DOWN, _rename_entry_keydown_cb, ugd);
315 elm_object_part_content_set(layout, "entry_part", entry);
316 evas_object_show(entry);
317 elm_object_focus_set(entry, EINA_TRUE);
328 * This function let the ug create rename popup
330 * @param[in] data the pointer to the main data structure
331 * @param[in] obj the pointer to the evas object
332 * @param[in] event_info the pointer to the event information
334 void _gl_rename_device_sel(void *data, Evas_Object *obj, void *event_info)
337 struct ug_data *ugd = (struct ug_data *) data;
338 WFD_RET_IF(ugd == NULL, "The param is NULL\n");
339 WFD_IF_DEL_OBJ(ugd->ctxpopup);
340 WFD_IF_DEL_OBJ(ugd->rename_popup);
343 Evas_Object *genlist = NULL;
344 Evas_Object *layout = NULL;
345 Elm_Object_Item *git = NULL;
347 popup = elm_popup_add(ugd->base);
348 elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
349 eext_object_event_callback_add(popup, EA_CALLBACK_BACK, _rename_popup_cancel_cb, ugd);
350 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
351 elm_object_domain_translatable_part_text_set(popup, "title,text",
352 PACKAGE, "IDS_ST_HEADER_RENAME_DEVICE");
354 layout = elm_layout_add(popup);
355 elm_layout_file_set(layout, WFD_UG_EDJ_PATH, "main_rename_device_ly");
356 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
358 genlist = elm_genlist_add(layout);
359 evas_object_size_hint_weight_set(genlist,
360 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
361 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
362 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
363 elm_scroller_content_min_limit(genlist, EINA_FALSE, EINA_TRUE);
365 /* Entry genlist item */
366 ugd->rename_entry_itc = elm_genlist_item_class_new();
367 if(ugd->rename_entry_itc != NULL) {
368 ugd->rename_entry_itc->item_style = "entry";
369 ugd->rename_entry_itc->func.text_get = NULL;
370 ugd->rename_entry_itc->func.content_get = __wfd_main_rename_entry_icon_get;
371 ugd->rename_entry_itc->func.state_get = NULL;
372 ugd->rename_entry_itc->func.del = NULL;
374 elm_genlist_item_append(genlist, ugd->rename_entry_itc, ugd,
375 NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
378 ugd->rename_desc_itc = elm_genlist_item_class_new();
379 if(ugd->rename_desc_itc != NULL) {
380 ugd->rename_desc_itc->item_style = "multiline_sub";
381 ugd->rename_desc_itc->func.text_get = __wfd_main_rename_desc_label_get;
382 ugd->rename_desc_itc->func.content_get = NULL;
383 ugd->rename_desc_itc->func.state_get = NULL;
384 ugd->rename_desc_itc->func.del = NULL;
386 git = elm_genlist_item_append(genlist, ugd->rename_desc_itc, NULL, NULL,
387 ELM_GENLIST_ITEM_NONE, NULL, NULL);
389 elm_genlist_item_select_mode_set(git,
390 ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
393 button = elm_button_add(popup);
394 elm_object_style_set(button, "popup");
395 elm_object_domain_translatable_text_set(button, PACKAGE,
397 elm_object_part_content_set(popup, "button1", button);
398 evas_object_smart_callback_add(button, "clicked", _rename_popup_cancel_cb, ugd);
400 button = elm_button_add(popup);
401 elm_object_style_set(button, "popup");
402 elm_object_domain_translatable_text_set(button, PACKAGE,
404 elm_object_part_content_set(popup, "button2", button);
405 evas_object_smart_callback_add(button, "clicked", _rename_popup_ok_cb, ugd);
406 ugd->rename_button = button;
408 #if defined(GENLIST_REALIZATION_MOTE_SET)
409 elm_genlist_realization_mode_set(genlist, EINA_TRUE);
411 evas_object_show(genlist);
412 elm_object_part_content_set(layout, "elm.swallow.layout", genlist);
413 evas_object_show(layout);
414 elm_object_content_set(popup, layout);
415 evas_object_show(popup);
416 elm_object_focus_set(ugd->rename_entry, EINA_TRUE);
417 ugd->rename_popup = popup;