[Store Issue] Fix invalid phone number limitation issue.
[apps/native/telegram-tizen.git] / TelegramTizen / src / tg_registration.c
1 /*
2     This file is part of Telegram application for tizen
3
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Lesser General Public
6     License as published by the Free Software Foundation; either
7     version 2.1 of the License, or (at your option) any later version.
8
9     This library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12     Lesser General Public License for more details.
13
14     You should have received a copy of the GNU Lesser General Public
15     License along with this library; if not, write to the Free Software
16     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #include "tg_registration.h"
20 #include "tg_db_manager.h"
21 #include "server_requests.h"
22 #include "tg_login.h"
23 #include "tg_country_selection_view.h"
24
25 static void on_text_change_enable_ok_button(void *data, Evas_Object *obj, void *event_info)
26 {
27         appdata_s* ad = data;
28         if (!ad)
29                 return;
30
31         Evas_Object* country_name_btn = evas_object_data_get(ad->nf, "country_name_btn");
32         Evas_Object* done_btn = evas_object_data_get(ad->nf, "reg_done_btn");
33         Evas_Object *layout = NULL;
34         char buf[256];
35         char code_buf[256];
36
37         if (!country_name_btn || !done_btn)
38                 return;
39
40         snprintf(buf, sizeof(buf), "%s", elm_object_text_get(obj));
41         snprintf(code_buf, sizeof(code_buf), "%s", elm_object_text_get(country_name_btn));
42
43         layout = evas_object_data_get(ad->nf, "regi,layout");
44         if (strcasecmp(buf, "") != 0)
45                 elm_object_signal_emit(layout, "show", "delete");
46         else
47                 elm_object_signal_emit(layout, "hide", "delete");
48
49         if (strlen(buf) >= MIN_NUM_LENGTH && strcasecmp(code_buf, "Select your country") != 0)
50                 elm_object_disabled_set(done_btn, EINA_FALSE);
51         else
52                 elm_object_disabled_set(done_btn, EINA_TRUE);
53 }
54
55 Eina_Bool on_login_timer_expired(void *data)
56 {
57         appdata_s *ad = data;
58         if (!ad)
59                 return ECORE_CALLBACK_CANCEL;
60                 
61         hide_loading_popup(ad);
62         send_request_for_restart_server(ad, ad->service_client);
63     return ECORE_CALLBACK_CANCEL;
64 }
65
66
67 static void on_naviframe_done_clicked(void *data, Evas_Object *obj, void *event_info)
68 {
69         appdata_s* ad = data;
70         if (!ad)
71                 return;
72
73         Evas_Object* country_name_btn = evas_object_data_get(ad->nf, "country_name_btn");
74         Evas_Object* country_code_btn = evas_object_data_get(ad->nf, "country_code_btn");
75         Evas_Object* pn_number_entry = evas_object_data_get(ad->nf, "pn_number_entry");
76         char* phone_num = elm_entry_markup_to_utf8(elm_object_text_get(pn_number_entry));
77         char* cunt_code = elm_entry_markup_to_utf8(elm_object_text_get(country_code_btn));
78         char code_buf[256];
79
80         if (!country_name_btn || !country_code_btn || !pn_number_entry)
81                 return;
82
83         snprintf(code_buf, sizeof(code_buf), "%s", elm_object_text_get(country_name_btn));
84
85         if (strlen(phone_num) >= MIN_NUM_LENGTH && strcasecmp(code_buf, "Select your country") != 0 && ad->is_server_ready) {
86                 char phone_number[256];
87                 snprintf(phone_number, sizeof(phone_number), "%s%s", cunt_code, phone_num);
88                 ad->phone_number = strdup(phone_number);
89                 send_request_for_registration(ad, ad->service_client, ad->phone_number, EINA_TRUE);
90
91                 if (!ad->is_waiting_for_phone_num)
92                         ad->login_timer = ecore_timer_add(60, on_login_timer_expired, ad);
93                 show_loading_popup(ad);
94         } else {
95                 launch_tg_server(ad);
96                 show_toast(ad, i18n_get_text("IDS_NFC_POP_INITIALISING_PLEASE_WAIT_ING"));
97         }
98         free(phone_num);
99         free(cunt_code);
100 }
101
102 static void on_naviframe_cancel_clicked(void *data, Evas_Object *obj, void *event_info)
103 {
104         appdata_s* ad = data;
105         elm_win_lower(ad->win);
106         elm_exit();
107 }
108
109 void country_name_selected_cb(appdata_s *ad, Eina_List *count_name_list, Eina_List *country_code_list)
110 {
111         int country_code_idx;
112         Evas_Object* country_name_btn;
113         Evas_Object* country_code_btn;
114         Evas_Object* pn_number_entry;
115         Evas_Object* done_btn;
116         char *country_name;
117         char *country_code;
118         char temp_str[32];
119         const char *number_text;
120
121         if (!ad || !count_name_list || !country_code_list)
122                 return;
123
124         country_name_btn = evas_object_data_get(ad->nf, "country_name_btn");
125         country_code_btn = evas_object_data_get(ad->nf, "country_code_btn");
126         pn_number_entry = evas_object_data_get(ad->nf, "pn_number_entry");
127         country_name = eina_list_nth(count_name_list, ad->selected_country_id);
128
129         if (ad->country_codes_list != country_code_list) {
130                 country_code_idx = (int)eina_list_nth(country_code_list, ad->selected_country_id);
131                 country_code = eina_list_nth(ad->country_codes_list, country_code_idx);
132         } else {
133                 country_code = eina_list_nth(country_code_list, ad->selected_country_id);
134         }
135
136         elm_object_text_set(country_name_btn, country_name);
137
138         snprintf(temp_str, sizeof(temp_str), "<align=center>%s<align>", country_code);
139         elm_object_text_set(country_code_btn, temp_str);
140
141         done_btn = evas_object_data_get(ad->nf, "reg_done_btn");
142         number_text = elm_object_text_get(pn_number_entry);
143         if (pn_number_entry)
144                 elm_object_focus_set(pn_number_entry, EINA_TRUE);
145
146         if (number_text && strlen(number_text) >= MIN_NUM_LENGTH)
147                 elm_object_disabled_set(done_btn, EINA_FALSE);
148         else
149                 elm_object_disabled_set(done_btn, EINA_TRUE);
150 }
151
152 static void delete_btn_clicked(void *data, Evas_Object *obj, void *event_info)
153 {
154         Evas_Object *pn_number_entry = data;
155         elm_object_text_set(pn_number_entry, "");
156 }
157
158 static void on_country_name_list_clicked(void *data, Evas_Object *obj, void *event_info)
159 {
160         appdata_s *ad = data;
161         launch_country_selection_view(ad);
162 }
163
164 void launch_registration_cb(appdata_s *ad)
165 {
166         if (!ad)
167                 return;
168
169         launch_tg_server(ad);
170         ad->current_app_state = TG_REGISTRATION_STATE;
171         eina_list_free(ad->country_codes_list);
172         eina_list_free(ad->country_names_list);
173         free(ad->country_code_buffer);
174
175         load_list_of_countries(ad);
176
177         char edj_path[PATH_MAX] = {0, };
178         app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
179
180         Evas_Object* scroller = elm_scroller_add(ad->nf);
181         elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_TRUE);
182         elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
183
184         Evas_Object* layout = elm_layout_add(ad->nf);
185         elm_layout_file_set(layout, edj_path, "registration_screen");
186         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
187         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
188         evas_object_show(layout);
189         elm_object_content_set(scroller, layout);
190         evas_object_data_set(ad->nf, "regi,layout", layout);
191
192         Evas_Object* country_name_btn = elm_button_add(layout);
193         elm_object_text_set(country_name_btn, "Select your country");
194         elm_object_style_set(country_name_btn, "dropdown");
195         evas_object_size_hint_weight_set(country_name_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
196         evas_object_size_hint_align_set(country_name_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
197         evas_object_smart_callback_add(country_name_btn, "clicked", on_country_name_list_clicked, ad);
198         elm_object_part_content_set(layout, "country_name", country_name_btn);
199
200         evas_object_data_set(ad->nf, "country_name_btn", (void*)country_name_btn);
201
202         Evas_Object* country_code_btn = elm_entry_add(layout);
203         elm_object_text_set(country_code_btn, "<align=center>--<align>");
204         evas_object_size_hint_weight_set(country_code_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
205         evas_object_size_hint_align_set(country_code_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
206         elm_entry_single_line_set(country_code_btn,  EINA_TRUE);
207         elm_entry_editable_set(country_code_btn, EINA_FALSE);
208         evas_object_show(country_code_btn);
209         elm_object_part_content_set(layout, "country_code", country_code_btn);
210
211         evas_object_data_set(ad->nf, "country_code_btn", (void*)country_code_btn);
212
213         Evas_Object* pn_number_entry = elm_entry_add(layout);
214         elm_object_part_text_set(pn_number_entry, "elm.guide", i18n_get_text("IDS_TGRAM_BODY_PHONE_NUMBER_ABB"));
215         elm_entry_cursor_end_set(pn_number_entry);
216         evas_object_size_hint_weight_set(pn_number_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
217         evas_object_size_hint_align_set(pn_number_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
218         elm_entry_single_line_set(pn_number_entry,  EINA_TRUE);
219         elm_entry_scrollable_set(pn_number_entry, EINA_FALSE);
220         elm_entry_cnp_mode_set(pn_number_entry, ELM_CNP_MODE_NO_IMAGE);
221         elm_entry_context_menu_disabled_set(pn_number_entry, EINA_TRUE);
222         elm_entry_text_style_user_push(pn_number_entry, "DEFAULT='color=#000000'");
223         evas_object_show(pn_number_entry);
224         elm_object_part_content_set(layout, "phone_number_entry", pn_number_entry);
225
226         evas_object_data_set(ad->nf, "pn_number_entry", (void*)pn_number_entry);
227
228         limit_filter_data.max_char_count = MAX_NUM_LENGTH;
229
230         elm_entry_markup_filter_append(pn_number_entry, elm_entry_filter_limit_size, &limit_filter_data);
231         elm_entry_markup_filter_append(pn_number_entry, elm_entry_filter_accept_set, &accept_set);
232
233         Ecore_IMF_Context *imf_context;
234         imf_context = elm_entry_imf_context_get(pn_number_entry);
235         ecore_imf_context_input_panel_layout_set(imf_context, ECORE_IMF_INPUT_PANEL_LAYOUT_PHONENUMBER);
236         evas_object_smart_callback_add(pn_number_entry, "changed", on_text_change_enable_ok_button, ad);
237
238         Evas_Object* delete_btn = elm_button_add(layout);
239         elm_object_style_set(delete_btn, "icon_expand_delete");
240         evas_object_size_hint_weight_set(delete_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
241         evas_object_size_hint_align_set(delete_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
242         evas_object_size_hint_max_set(delete_btn, 80, 80);
243         evas_object_smart_callback_add(delete_btn, "clicked", delete_btn_clicked, pn_number_entry);
244         elm_object_part_content_set(layout, "phone_number_delete", delete_btn);
245         evas_object_show(delete_btn);
246
247         elm_object_part_text_set(layout, "text_display", i18n_get_text("IDS_TGRAM_BODY_CONFIRM_YOUR_COUNTRY_CODE_MSG"));
248
249         Elm_Object_Item* navi_item = elm_naviframe_item_push(ad->nf, i18n_get_text("IDS_TGRAM_HEADER_ENTER_NUMBER_ABB"), NULL, NULL, scroller, NULL);
250
251         Evas_Object *cancel_btn = elm_button_add(ad->nf);
252         elm_object_style_set(cancel_btn, "naviframe/title_left");
253         elm_object_text_set(cancel_btn, i18n_get_text("IDS_TGRAM_ACBUTTON_CANCEL_ABB"));
254         evas_object_smart_callback_add(cancel_btn, "clicked", on_naviframe_cancel_clicked, ad);
255
256         Evas_Object *done_btn = elm_button_add(ad->nf);
257         elm_object_style_set(done_btn, "naviframe/title_right");
258         elm_object_text_set(done_btn, i18n_get_text("IDS_TGRAM_ACBUTTON_DONE_ABB"));
259         evas_object_smart_callback_add(done_btn, "clicked", on_naviframe_done_clicked, ad);
260
261
262         elm_object_item_part_content_set(navi_item, "title_left_btn", cancel_btn);
263         elm_object_item_part_content_set(navi_item, "title_right_btn", done_btn);
264
265         evas_object_data_set(ad->nf, "reg_done_btn", (void*)done_btn);
266         evas_object_data_set(ad->nf, "reg_cancel_btn", (void*)cancel_btn);
267         elm_object_disabled_set(done_btn, EINA_TRUE);
268 }