[Store Issue] Fix invalid phone number limitation issue.
[apps/native/telegram-tizen.git] / TelegramTizen / tg_utils / tg_common.h
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 #ifndef TG_COMMON_H_
20 #define TG_COMMON_H_
21
22 #include <app.h>
23 #include <telegramtizen.h>
24 #include <app_preference.h>
25 #include "service_client.h"
26 #include <notification.h>
27
28 #define TELEGRAM_APP_ID "org.tizen.telegram_tizen_client"
29 #define EDJ_REG_FILE "edje/telegram_tizen_reg.edj"
30 #define EDJ_LOGIN_FILE "edje/telegram_tizen_login.edj"
31 #define EDJ_CHAT_LIST_FILE "edje/telegram_chat_list.edj"
32 #define EDJ_CHAT_CONV_FILE "edje/telegram_chat_conv.edj"
33
34 #define TELEGRAM_CUSTOM_WINSET_EDJ      "edje/telegram_theme.edj"
35 #define TELEGRAM_START_VIEW_EDJ  "edje/telegram_start_screen.edj"
36 #define TELEGRAM_INIT_VIEW_EDJ  "edje/telegram_init_screen.edj"
37 #define TELEGRAM_POPUP_VIEW_EDJ "edje/telegram_custom_popup.edj"
38 #define TELEGRAM_GENLIST_THEME_EDJ      "edje/telegram_genlist_theme.edj"
39
40 #define TELEGRAM_START_SCREEN_EDJ       "edje/telegram_start_screen.edj"
41
42
43
44 #define GRP_MAIN "main"
45 #define DB_FILENAME "tg_data_base.db"
46 #define FM_ICON_PATH "images/"
47 #define DEFAULT_PROFILE_PIC       FM_ICON_PATH"default_profile_pic.png"
48 #define DEFAULT_LIST_THUMB_SINGLE_PIC      FM_ICON_PATH"telegram_list_thumb_image_single.png"
49 #define DEFAULT_LIST_THUMB_MULTI_PIC       FM_ICON_PATH"telegram_list_thumb_image_multi.png"
50 #define FM_ICON_ROBO_BUDDY       FM_ICON_PATH"robo_buddy.png"
51 #define SEARCH_ICON FM_ICON_PATH"/search_icon.png"
52 #define TG_ATTACH_ICON FM_ICON_PATH"/telegram_add_object.png"
53
54 #define TG_EXPAND_OPEN       FM_ICON_PATH"telegram_icon_expand_close.png"
55 #define TG_EXPAND_CLOSE       FM_ICON_PATH"telegram_icon_expand_open.png"
56
57 //#define SMILEY_ICON_UNPRESSED FM_ICON_PATH"/ic_msg_panel_smiles_pressed.png"
58 //#define SMILEY_ICON_PRESSED FM_ICON_PATH"/ic_msg_panel_smiles_unpressed.png"
59
60 #define TG_SMILEY_ICON FM_ICON_PATH"/telegram_emotion.png"
61
62 //#define SEND_UNPRESSED_ICON FM_ICON_PATH"/ic_send_pressed.png"
63 //#define SEND_PRESSED_ICON FM_ICON_PATH"/ic_send_unpressed.png"
64
65 #define TG_SEND_ICON FM_ICON_PATH"/telegram_send.png"
66
67 #define CHAT_BG FM_ICON_PATH"/chat_bg.jpg"
68 #define BLUR_BG FM_ICON_PATH"/blur_img.png"
69 #define CAMERA_ICON FM_ICON_PATH"/camera-icon.png"
70 #define MESSAGE_READ_ICON FM_ICON_PATH"/telegram_bubble_read.png"
71 #define MESSAGE_SENDING_ICON FM_ICON_PATH"/telegram_icon_check.png"
72 #define MESSAGE_SENT_ICON FM_ICON_PATH"/telegram_icon_double_check.png"
73 #define MESSAGE_FAILED_ICON FM_ICON_PATH"/telegram_icon_check.png"
74 #define MESSAGE_DELIVERED_ICON FM_ICON_PATH"/telegram_icon_double_check.png"
75 #define FLOATING_MSG_ICON FM_ICON_PATH"/floating_message.png"
76
77 #define MEDIA_DOWNLOAD_ICON FM_ICON_PATH"/ic_attach_download.png"
78 #define MEDIA_MANUAL_DOWNLOAD_ICON FM_ICON_PATH"/ic_attach_manual_download.png"
79 //#define MEDIA_PLAY_ICON FM_ICON_PATH"/playvideo.png"
80 #define DEFAULT_TELEGRAM_ICON FM_ICON_PATH"/tg_icon.png"
81
82 #define TELEGRAM_BUTTON_ADD_ICON FM_ICON_PATH"/telegram_button_add.png"
83 #define TELEGRAM_CONTACT_ADD_ICON FM_ICON_PATH"/telegram_list_thumb_image_add.png"
84 #define TELEGRAM_THUMB_ADD_ICON FM_ICON_PATH"/telegram_thumb_add.png"
85
86 #define FM_ICON_CAMERA       FM_ICON_PATH"floating_camera.png"
87 #define FM_ICON_GALLERY       FM_ICON_PATH"ic_attach_gallery.png"
88 #define FM_ICON_VIDEO       FM_ICON_PATH"ic_attach_video.png"
89 #define FM_ICON_MIC       FM_ICON_PATH"ic_attach_mic.png"
90 #define FM_ICON_FILE       FM_ICON_PATH"ic_attach_doc.png"
91 #define FM_ICON_LOCATION       FM_ICON_PATH"ic_attach_location.png"
92
93 #define TG_ICON_FLOATING_PENCIL       FM_ICON_PATH"telegram_floating_btn_ic.png"
94 #define TG_ICON_FLOATING_BG       FM_ICON_PATH"floating_pressed.png"
95 #define TG_ICON_FLOATING_ADD    FM_ICON_PATH"telegram_button_add.png"
96 #define TG_SEARCH_ICON       FM_ICON_PATH"ic_ab_search.png"
97 #define TG_SEARCH_PRESSED_ICON       FM_ICON_PATH"ic_ab_search_pressed.png"
98
99 #define TG_MENU_GROUP       FM_ICON_PATH"menu_newgroup.png"
100 #define TG_MENU_INVITE       FM_ICON_PATH"menu_invite.png"
101 #define TG_MENU_CONTACTS       FM_ICON_PATH"menu_contacts.png"
102 #define TG_MENU_SECRET       FM_ICON_PATH"menu_secret.png"
103 #define TG_MENU_SETTINGS       FM_ICON_PATH"menu_settings.png"
104
105 #define TG_CHAT_DEFAULT_BG       FM_ICON_PATH"background_hd.jpg"
106
107 #define TG_VIDEO_ICON       FM_ICON_PATH"Video-Icon.jpg"
108 //#define TG_AUDIO_ICON       FM_ICON_PATH"Audio-Icon.png"
109 #define TG_AUDIO_ICON       FM_ICON_PATH"Audio-wave.png"
110
111 #define TG_PAUSE_DIM_ICON       FM_ICON_PATH"telegram_audio_player_pause_dim.png"
112 #define TG_PAUSE_NORMAL_ICON       FM_ICON_PATH"telegram_audio_player_pause_normal.png"
113 #define TG_PAUSE_PRESS_ICON       FM_ICON_PATH"telegram_audio_player_pause_press.png"
114
115 #define TG_PLAY_DIM_ICON       FM_ICON_PATH"telegram_audio_player_play_dim.png"
116 #define TG_PLAY_NORMAL_ICON       FM_ICON_PATH"telegram_audio_player_play_normal.png"
117 #define TG_PLAY_PRESS_ICON       FM_ICON_PATH"telegram_audio_player_play_press.png"
118
119 #define TG_CALLER_ID_BG      FM_ICON_PATH"Telegram_caller_id_default_bg_full.png"
120 #define TG_CALLER_ID_IMAGE      FM_ICON_PATH"telegram_caller_id_default_full.png"
121
122 #define TG_USER_INFO_CALL      FM_ICON_PATH"telegram_btn_ic_call.png"
123 #define TG_USER_INFO_MESSAGE      FM_ICON_PATH"telegram_btn_ic_message.png"
124
125
126 #define INIT_SCREEN_1       FM_ICON_PATH"screenshot_1.png"
127 #define INIT_SCREEN_2       FM_ICON_PATH"screenshot_2.png"
128 #define INIT_SCREEN_3       FM_ICON_PATH"screenshot_3.png"
129 #define INIT_SCREEN_4       FM_ICON_PATH"screenshot_4.png"
130 #define INIT_SCREEN_5       FM_ICON_PATH"screenshot_5.png"
131 #define INIT_SCREEN_6       FM_ICON_PATH"screenshot_6.png"
132 #define INIT_SCREEN_7       FM_ICON_PATH"screenshot_7.png"
133 #define TG_NO_CHAT_LIST       FM_ICON_PATH"no_chat.png"
134
135 #define POPUP_TEXT_TAKE_PHOTO "Take photo"
136 #define POPUP_TEXT_TAKE_GALLERY "Gallery"
137 #define POPUP_TEXT_TAKE_VIDEO "Video"
138 #define POPUP_TEXT_TAKE_AUDIO "Audio"
139 #define POPUP_TEXT_TAKE_FILE "File"
140 #define POPUP_TEXT_TAKE_LOCATION "Location"
141 #define POPUP_TEXT_TAKE_CONTACT "Contact"
142
143 #define TG_CHAT_BG_PREFERENCE "chat_view_bg"
144
145 #define OLD_DIR "/opt/usr/media/telegram"
146
147 #define LIST_CONTACT_ROUND_MASK_ICON FM_ICON_PATH"/info_page_pic_mask.png"
148
149 #define BROKEN_IMAGE FM_ICON_PATH"/T01_Nocontents_broken.png"
150
151 #define TG_LIST_OF_COUNTIRES FM_ICON_PATH"countries.txt"
152
153
154 #define FM_ICON_MSG_SENT       FM_ICON_PATH"bubble_sent_bg.#.png"
155 #define FM_ICON_MSG_RECEIVE       FM_ICON_PATH"bubble_rec_bg.#.png"
156
157 #define FM_OK_BUTTON       FM_ICON_PATH"ok_bn_press.png"
158 #define FM_CANCEL_BUTTON       FM_ICON_PATH"cancel_bn_press.png"
159
160 #define TELEGRAM_DEBUG_LOG(fmt, args...) LOGD(" +++ LOG : "fmt, ##args)
161
162 #define SAFE_STRCMP(str1, str2)   ((str1 && str2) ? strcmp(str1, str2) : -1)
163 #define SAFE_STRDUP(text)               (text == NULL ? NULL : strdup(text))    //what to use for strcpy?
164 #define SAFE_STRLEN(src)        \
165                 ((src != NULL)? strlen(src): 0)
166 #define ELM_OBJ_PART_TEXT_SET(obj, part, text)          elm_object_domain_translatable_part_text_set(obj, part, "telegram", text)
167 #define EVAS_OBJECT_DELIF(p)    if (p) { evas_object_del(p); p = NULL; }
168
169 #define TGL_PEER_USER 1
170 #define TGL_PEER_CHAT 2
171 #define TGL_PEER_GEO_CHAT 3
172 #define TGL_PEER_ENCR_CHAT 4
173 #define TGL_PEER_UNKNOWN 0
174
175 #define SIZE_CODE 11
176 static char *phone_codes[SIZE_CODE][2] = { {"Argentina (+54)", "+54"},
177                                                                                 {"Brazil (+55)", "+55"},
178                                                                                 {"China (+86)", "+86"},
179                                                                                 {"France (+33)", "+33"},
180                                                                                 {"India (+91)", "+91"},
181                                                                                 {"Malaysia (+60)", "+60"},
182                                                                                 {"Russia (+7)", "+7"},
183                                                                                 {"Singapore (+65)", "+65"},
184                                                                                 {"South Korea (+82)", "+82"},
185                                                                                 {"United States (+1)" , "+1"},
186                                                                                 {"Vietnam (+84)" , "+84"}
187                                                                              };
188
189 #define COUNTRIES_SIZE 1000
190
191 #define NUMBER_OF_MENU_ITEMS 5
192
193 #define MENU_NEW_GROUP "New Group"
194 #define MENU_SECRET_CHAT "New secret Chat"
195 #define MENU_CONTACTS "Contacts"
196 #define MENU_INVITE_FRIENDS "Invite Friends"
197 #define MENU_SETTINGS "settings"
198
199 static char* main_view_menu_items[NUMBER_OF_MENU_ITEMS][2] = { {MENU_NEW_GROUP, TG_MENU_GROUP},
200                                                                                 {MENU_SECRET_CHAT, TG_MENU_SECRET},
201                                                                                 {MENU_CONTACTS, TG_MENU_CONTACTS},
202                                                                                 {MENU_INVITE_FRIENDS, TG_MENU_INVITE},
203                                                                                 {MENU_SETTINGS, TG_MENU_SETTINGS}
204                                                                              };
205
206
207 typedef enum {
208         CHAT_MESSAGE_BUBBLE_NONE = 0,
209         CHAT_MESSAGE_BUBBLE_SENT,
210         CHAT_MESSAGE_BUBBLE_RECEIVE,
211         CHAT_MESSAGE_BUBBLE_LAST
212 } Chat_message_Bubble_Style;
213
214 #define CHAT_BUBBLE_SUB_TEXT_STYLE "<font_size=20 font_weight=Bold color=#000000>%s</font_size>"
215
216
217
218 static Elm_Entry_Filter_Limit_Size limit_filter_data;
219 static Elm_Entry_Filter_Accept_Set accept_set = {
220        .accepted = "0123456789",
221        .rejected = NULL
222  };
223
224 #define MAX_NUM_LENGTH 20
225 #define MIN_NUM_LENGTH 5
226 #define MAX_CODE_LENGTH 5
227 #define MAX_USERNAME_LENGTH 15
228 #define MIN_USERNAME_LENGTH 5
229
230 typedef struct {
231         int type;
232         int id;
233 } tgl_peer_id_t;
234
235
236 typedef enum _TelegramAppDirection {
237         TELEGRAM_TARGET_DIRECTION_INVAILD = -1,
238         TELEGRAM_TARGET_DIRECTION_PORTRAIT = 0,
239         TELEGRAM_TARGET_DIRECTION_LANDSCAPE_INVERSE = 90,
240         TELEGRAM_TARGET_DIRECTION_PORTRAIT_INVERSE = 180,
241         TELEGRAM_TARGET_DIRECTION_LANDSCAPE = 270,
242         TELEGRAM_TARGET_DIRECTION_MAX,
243 } TelegramAppDirection;
244
245
246
247 typedef enum {
248         APP_STATE_IN_BACKGROUND = 0,
249         APP_STATE_IN_FOREGROUND
250 }app_visible_state;
251
252 typedef enum {
253         TELEGRAM_APP_FILE_TYPE_NONE = 0,
254         TELEGRAM_APP_FILE_TYPE_IMAGE,      /**< Image category */
255         TELEGRAM_APP_FILE_TYPE_VIDEO,      /**< Video category */
256         TELEGRAM_APP_FILE_TYPE_MUSIC,      /**< Music category */
257         TELEGRAM_APP_FILE_TYPE_STICKER, /** Sticker / Anicon category */
258         TELEGRAM_APP_FILE_TYPE_PDF,                /**< Pdf category */
259         TELEGRAM_APP_FILE_TYPE_DOC,                /**< Word category */
260         TELEGRAM_APP_FILE_TYPE_PPT,                /**< Powerpoint category */
261         TELEGRAM_APP_FILE_TYPE_EXCEL,      /**< Excel category */
262         TELEGRAM_APP_FILE_TYPE_VOICE,      /**< Voice category */
263         TELEGRAM_APP_FILE_TYPE_HTML,               /**< Html category */
264         TELEGRAM_APP_FILE_TYPE_FLASH,      /**< Flash category */
265         TELEGRAM_APP_FILE_TYPE_TXT,                /**< Txt category */
266         TELEGRAM_APP_FILE_TYPE_VCONTACT,           /**< Vcontact category */
267         TELEGRAM_APP_FILE_TYPE_VCALENDAR,          /**< Vcalendar category */
268         TELEGRAM_APP_FILE_TYPE_VNOTE,      /**< Vnote category */
269         TELEGRAM_APP_FILE_TYPE_VBOOKMARK,          /**< Vbookmark category */
270         TELEGRAM_APP_FILE_TYPE_SNB,                /**< Snotes category */
271         TELEGRAM_APP_FILE_TYPE_SVG,                /**< Svg category */
272         TELEGRAM_APP_FILE_TYPE_RSS,                /**< Rss reader file, *.opml */
273         TELEGRAM_APP_FILE_TYPE_JAVA,               /**< java file, *.jad, *.jar */
274         TELEGRAM_APP_FILE_TYPE_WGT,                /**< wrt , *.wgt, *.wgt */
275         TELEGRAM_APP_FILE_TYPE_TPK,                     /**< *.tpk */
276         TELEGRAM_APP_FILE_TYPE_HWP,                     /**< *.hwp */
277         TELEGRAM_APP_FILE_TYPE_EMAIL,           /**< *.eml */
278         TELEGRAM_APP_FILE_TYPE_DRM,                     /**< drm file , *.dcf */
279         TELEGRAM_APP_FILE_TYPE_ZIP,                     /**< zip compressed file , *.zip */
280         TELEGRAM_APP_FILE_TYPE_ETC,                /**< Other files category */
281         TELEGRAM_APP_FILE_TYPE_MAX
282 } TELEGRAM_APP_FILE_TYPE_E;
283
284
285 typedef enum state_of_app {
286         TG_SPLASH_SCREEN_STATE,
287         TG_INIT_SCREEN_STATE,
288         TG_REGISTRATION_STATE,
289         TG_PROFILE_REGISTRATION_STATE,
290         TG_LOGIN_STATE,
291         TG_BUDDY_LIST_STATE,
292         TG_BUDDY_LIST_SELECTION_STATE,
293         TG_GROUP_CHAT_NAME_ENTRY_STATE,
294         TG_BUDDY_CHAT_STATE,
295         TG_BUDDY_CHAT_CONV_STATE,
296         TG_USER_MAIN_VIEW_STATE,
297         TG_USER_MAIN_VIEW_SELECTION_STATE,
298         TG_START_MESSAGING_VIEW_STATE,
299         TG_CHAT_MESSAGING_VIEW_STATE,
300         TG_PEER_SEARCH_VIEW_STATE,
301         TG_SETTINGS_SCREEN_STATE,
302         TG_SETTINGS_EDIT_NAME_STATE,
303         TG_SET_USERNAME_STATE,
304         TG_SET_USER_INFO_STATE,
305         TG_SET_CHAT_INFO_STATE,
306         TG_SELECT_BUDDY_VIEW,
307         TG_ADD_CONTACT_STATE,
308         TG_COUNTRY_SELECTION_VIEW
309 } state_of_app_s;
310
311 enum tgl_typing_status {
312         tgl_typing_none = 10001,
313         tgl_typing_typing,
314         tgl_typing_cancel,
315         tgl_typing_record_video,
316         tgl_typing_upload_video,
317         tgl_typing_record_audio,
318         tgl_typing_upload_audio,
319         tgl_typing_upload_photo,
320         tgl_typing_upload_document,
321         tgl_typing_geo,
322         tgl_typing_choose_contact
323 };
324
325 typedef enum MESSAGE_STATE {
326         TG_MESSAGE_STATE_SENDING = 1,
327         TG_MESSAGE_STATE_SENT,
328         TG_MESSAGE_STATE_DELIVERED,
329         TG_MESSAGE_STATE_FAILED,
330         TG_MESSAGE_STATE_RECEIVED,
331         TG_MESSAGE_STATE_READ,
332         TG_MESSAGE_STATE_UNKNOWN
333 } TG_MESSAGE_STATE;
334
335
336 typedef struct user_data {
337         tgl_peer_id_t user_id;
338         char *print_name;
339         int structure_version;
340         char *photo_path;
341         int photo_id;
342         char *first_name;
343         char *last_name;
344         char *phone;
345         int access_hash;
346         char *real_first_name;
347         char *real_last_name;
348         char *username;
349         char *highlight_name;
350         int online;
351         int last_seen;
352         Eina_Bool is_selected;
353         int is_blocked;
354         int is_deleted;
355         int is_unknown;
356 } user_data_s;
357
358 typedef struct user_data_with_pic {
359         user_data_s *use_data;
360         //char* pic_file_location;
361         Evas_Object *contact_icon;
362 } user_data_with_pic_s;
363
364 enum tgl_message_media_type {
365         tgl_message_media_none = 1001,
366         tgl_message_media_photo,
367         //tgl_message_media_video,
368         //tgl_message_media_audio,
369         tgl_message_media_document,
370         tgl_message_media_geo,
371         tgl_message_media_contact,
372         tgl_message_media_unsupported,
373         tgl_message_media_photo_encr,
374         //tgl_message_media_video_encr,
375         //tgl_message_media_audio_encr,
376         tgl_message_media_document_encr,
377 };
378
379 typedef struct tg_chat_info {
380         int chat_id;
381         int flags;
382         char* print_title;
383         int struct_version;
384         long long photo_id;
385         char* photo_path;
386         char* title;
387         int users_num;
388         int user_list_size;
389         int user_list_version;
390         int inviter_id;
391         int chat_users[100];
392         int date;
393         int version;
394         int admin_id;
395 } tg_chat_info_s;
396
397 typedef struct tg_peer_info {
398         int peer_id;
399         int peer_type;
400         int flags;
401         long long last_msg_id;
402         int last_msg_date;
403         char* print_name;
404         int struct_version;
405         int no_of_unread_msgs;
406         int last_seen_time;
407         char* photo_path;
408         long long photo_id;
409         int is_unknown;
410 } tg_peer_info_s;
411
412 typedef struct peer_with_pic {
413         tg_peer_info_s *use_data;
414         Evas_Object *contact_icon;
415         Evas_Object *name_object;
416         Evas_Object *msg_object;
417         char *last_message;
418         Eina_Bool is_out_message;
419 } peer_with_pic_s;
420
421 typedef struct group_chat_with_pic {
422         tg_chat_info_s *use_data;
423         Evas_Object *contact_icon;
424 } group_chat_with_pic_s;
425
426 typedef struct tg_message {
427         int msg_id;
428         int flags;
429         int fwd_from_id;
430         int fwd_date;
431         int from_id;
432         int to_id;
433         int out;
434         int unread;
435         int date;
436         int service;
437         char* message;
438         int msg_state;
439         int message_len;
440         int media_type;
441         char* media_id;
442         int unique_id;
443         int is_marked_for_delete;
444 } tg_message_s;
445
446 typedef struct tgl_media {
447         long long media_id;
448         int media_type;
449         long long access_hash;
450         int user_id;
451         int date;
452         char *caption;
453         char *longitude;
454         char *latitude;
455         int sizes;
456         char *phone_no;
457         char *first_name;
458         char *last_name;
459         char *file_path;
460
461         char *photo_type1;
462         int photo_loc_dc1;
463         long long photo_loc_vol1;
464         int photo_loc_id1;
465         long long photo_loc_sec1;
466         int photo_width1;
467         int photo_height1;
468         int photo_size1;
469         char *photo_data1;
470
471         char *photo_type2;
472         int photo_loc_dc2;
473         long long photo_loc_vol2;
474         int photo_loc_id2;
475         long long photo_loc_sec2;
476         int photo_width2;
477         int photo_height2;
478         int photo_size2;
479         char *photo_data2;
480
481         char *photo_type3;
482         int photo_loc_dc3;
483         long long photo_loc_vol3;
484         int photo_loc_id3;
485         long long photo_loc_sec3;
486         int photo_width3;
487         int photo_height3;
488         int photo_size3;
489         char *photo_data3;
490
491         char *photo_type4;
492         int photo_loc_dc4;
493         long long photo_loc_vol4;
494         int photo_loc_id4 ;
495         long long photo_loc_sec4;
496         int photo_width4;
497         int photo_height4;
498         int photo_size4;
499         char *photo_data4;
500
501
502         char* mime_type;
503         char* doc_type;
504         int doc_width;
505         int doc_height;
506         int doc_duration;
507         int doc_size;
508
509 } tgl_media_s;
510
511 typedef struct tg_main_list_item {
512         char* peer_print_name;
513         int peer_id;
514         int peer_type;
515         char* last_message;
516         int last_msg_id;
517         int last_msg_status;
518         int last_msg_type;
519         int last_msg_service;
520         int number_of_unread_msgs;
521         int last_seen_time;
522         Eina_Bool is_out_msg;
523         char* profile_pic_path;
524         Evas_Object* profile_pic;
525         Evas_Object* user_name_lbl;
526         Evas_Object* status_lbl;
527         Evas_Object* date_lbl;
528         Evas_Object* msg_status_lbl;
529         Evas_Object* main_item_layout;
530         Eina_Bool is_selected;
531         char *buddy_display_name;
532         char *highlight_text;
533 } tg_main_list_item_s;
534
535 typedef struct appdata {
536         Evas_Object* win;
537         Evas_Object* layout;
538         Evas_Object* conform;
539         Evas_Object* nf;
540         Evas_Object* panel;
541         char* phone_number;
542         char* sms_code;
543         Eina_List *buddy_list;
544         Eina_List *known_buddy_list;
545         Eina_List *unknown_buddy_list;
546         //Eina_List *group_chat_list;
547         Eina_List *peer_list;
548
549         Eina_List *main_list;
550
551         Eina_List *search_peer_list;
552
553         int curtimezoneoffset;
554         int curtimeformat;
555         tgl_peer_id_t user_id;
556         state_of_app_s current_app_state;
557         user_data_s *current_user_data;
558         tg_main_list_item_s* main_item_in_cahtting_data;
559         peer_with_pic_s* peer_in_cahtting_data;
560         user_data_with_pic_s* buddy_in_cahtting_data;
561         service_client* service_client;
562         Eina_Bool is_first_time_registration;
563         Eina_List *loaded_msg_list;
564         int timer_value;
565         Eina_Bool is_last_msg_changed;
566         Evas_Object* loading_popup;
567         Eina_Bool is_tg_initilized;
568
569         char *chat_background;
570         //Eina_Bool is_long_pressed;
571         Evas_Object *msg_popup;
572
573         //user_data_with_pic_s *selected_buddy_item;
574         user_data_s *selected_buddy_item;
575
576         app_visible_state s_app_visible_state;
577         notification_h s_notififcation;
578         Eina_Bool is_server_ready;
579         Eina_Bool is_waiting_for_phone_num;
580         Ecore_Timer *login_timer;
581         TelegramAppDirection target_direction;
582         Evas_Object *floating_btn;
583         Elm_Theme *theme;
584         int screen_mode_for_fb; // for floating button icon
585         Evas_Object *menu_popup;
586         //int msg_count;
587         Eina_List *contact_list;
588         Elm_Naviframe_Item *main_item;
589         Eina_Bool is_loading_from_msg_view;
590         Eina_Bool is_loading_from_profile_view;
591         //int size_of_listed_countries;
592         //char *country_names[COUNTRIES_SIZE];
593         //char *country_codes[COUNTRIES_SIZE];
594         Eina_List *country_names_list;
595         Eina_List *country_codes_list;
596         int selected_country_id;
597
598         char *country_code_buffer;
599 } appdata_s;
600
601 extern void show_toast(appdata_s* ad, char* value);
602 extern void layout_back_cb(void *data, Evas_Object *obj, void *event_info);
603 extern void tg_login_nf_back_cb(void *data, Evas_Object *obj, void *event_info);
604 extern void detail_list_nf_back_cb(void *data, Evas_Object *obj, void *event_info);
605 extern void create_buddy_msg_table(const char* table_name);
606 extern void load_buddy_list_data(appdata_s *ad);
607 extern void load_unknown_buddy_list_data(appdata_s *ad);
608 //extern void load_group_chat_data(appdata_s *ad);
609 extern void load_peer_data(appdata_s *ad);
610 extern void load_registered_user_data(appdata_s *ad);
611 extern void load_main_list_data(appdata_s *ad);
612 extern void launch_app_control(appdata_s *ad, char *media_type, char *url);
613 extern void free_message(tg_message_s **message);
614
615 #if 0
616 static char *trim(char *s) {
617     char *ptr;
618     if (!s)
619         return NULL;   // handle NULL string
620     if (!*s)
621         return s;      // handle empty string
622     for (ptr = s + strlen(s) - 1; (ptr >= s) && isspace(*ptr); --ptr);
623     ptr[1] = '\0';
624     return s;
625 }
626 #endif
627
628 static inline char* trim(const char * s)
629 {
630         if (!s) {
631                 return NULL;
632         }
633
634         int l = strlen(s);
635
636         while (isspace(s[l - 1])) {
637                 --l;
638         }
639
640         while (*s && isspace(*s)) {
641                 ++s, --l;
642         }
643
644         return strndup(s, l);
645 }
646
647 extern Evas_Object* create_circle_button(Evas_Object *parent, char* text, char* filepath);
648 extern Evas_Object* create_button(Evas_Object *parent, char *style, char *text);
649 extern int numbers_only(const char *s);
650
651 static inline void telegram_image_mask_delete_cb(Evas_Object *obj)
652 {
653         if (obj == NULL)
654                 return;
655
656         void *mask = evas_object_image_data_get(obj, EINA_TRUE);
657         if (mask) {
658                 free(mask);
659                 mask = NULL;
660         }
661 }
662
663 extern tg_main_list_item_s* get_latest_item(appdata_s *ad, peer_with_pic_s *item);
664 //static char* get_table_name_from_number(const char* phone_no)
665 extern char* get_table_name_from_number(const int id);
666 extern Eina_Bool compare_date_with_current_date(int rtime);
667
668 static inline void buddy_icon_del_cb(void *data, Evas *e, Evas_Object *icon, void *event_info)
669 {
670         user_data_with_pic_s *item  = data;
671         item->contact_icon = NULL;
672 }
673
674 static inline  const char *ui_utils_get_resource(const char *res_name)
675 {
676         static char res_path[PATH_MAX] = {'\0'};
677
678         char *res_path_buff = app_get_resource_path();
679         if (!res_path_buff) {
680                 return NULL;
681         }
682         snprintf(res_path, sizeof(res_path) - 1, "%s%s", res_path_buff, res_name);
683         free(res_path_buff);
684
685         return res_path;
686 }
687
688 static inline char *get_current_time()
689 {
690         Eina_Strbuf *strbuf = eina_strbuf_new();
691         time_t local_time = time(NULL);
692         char buf[200] = {0};
693         char *ret = NULL;
694         struct tm *time_info = localtime(&local_time);
695
696         strftime(buf, 200, "%l:%M", time_info);
697         eina_strbuf_append_printf(strbuf, "%s %s", buf, (time_info->tm_hour >= 12) ? "PM":"AM");
698         ret = eina_strbuf_string_steal(strbuf);
699         eina_strbuf_free(strbuf);
700         return ret;
701 }
702
703 static inline char *replace(const char *s, char ch, const char *repl)
704 {
705         int count = 0;
706         const char *t;
707
708         for(t = s; *t; t++) {
709                 count += (*t == ch);
710         }
711
712         size_t rlen = strlen(repl);
713         char *res = malloc(strlen(s) + (rlen - 1) * count + 1);
714         char *ptr = res;
715
716         for(t = s; *t; t++) {
717                 if(*t == ch) {
718                         memcpy(ptr, repl, rlen);
719                         ptr += rlen;
720                 } else {
721                         *ptr++ = *t;
722                 }
723         }
724
725         *ptr = 0;
726         return res;
727 }
728
729 static inline Evas_Object * create_scroller(Evas_Object *parent)
730 {
731         Evas_Object *scroller = elm_scroller_add(parent);
732         if (!scroller) {
733                 /**
734                  * @todo
735                  * Handling this exceptional cases.
736                  */
737                 return NULL;
738         }
739         elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_FALSE);
740         elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
741         evas_object_show(scroller);
742         return scroller;
743 }
744
745 static inline int telegram_is_drm_file(const char *file_path)
746 {
747         return 0;
748 }
749
750 static inline TELEGRAM_APP_FILE_TYPE_E __telegram_common_get_file_type_by_file_ext(const char *file_ext, const char *fullpath)
751 {
752         const char *ptr;
753
754         if (file_ext == NULL) {
755                 LOGI("file_ext is NULL");
756                 return TELEGRAM_APP_FILE_TYPE_ETC;
757         }
758
759         ptr = file_ext + 1;
760         switch (*file_ext) {
761         case 'a':
762         case 'A':
763                 if (strcasecmp("SF", ptr) == 0) {
764                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
765                 }
766                 if (strcasecmp("MR", ptr) == 0) {
767                         return TELEGRAM_APP_FILE_TYPE_VOICE;
768                 }
769                 if (strcasecmp("WB", ptr) == 0) {
770                         return TELEGRAM_APP_FILE_TYPE_VOICE;
771                 }
772                 if (strcasecmp("AC", ptr) == 0) {
773                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
774                 }
775                 if (strcasecmp("VI", ptr) == 0) {
776                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
777                 }
778                 break;
779
780         case 'b':
781         case 'B':
782                 if (strcasecmp("MP", ptr) == 0) {
783                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
784                 }
785                 break;
786
787         case 'd':
788         case 'D':
789                 if (strcasecmp("OC", ptr) == 0) {
790                         return TELEGRAM_APP_FILE_TYPE_DOC;
791                 }
792                 if (strcasecmp("OCX", ptr) == 0) {
793                         return TELEGRAM_APP_FILE_TYPE_DOC;
794                 }
795                 if (strcasecmp("IVX", ptr) == 0) {
796                         if (telegram_is_drm_file(fullpath) == 0) {
797                                 return TELEGRAM_APP_FILE_TYPE_DRM;
798                         } else {
799                                 return TELEGRAM_APP_FILE_TYPE_VIDEO;
800                         }
801                 }
802                 if (strcasecmp("CF", ptr) == 0) {
803                         return TELEGRAM_APP_FILE_TYPE_DRM;
804                 }
805                 if (strcasecmp("M", ptr) == 0) {
806                         return TELEGRAM_APP_FILE_TYPE_DRM;
807                 }
808                 break;
809
810         case 'g':
811         case 'G':
812                 if (strcasecmp("IF", ptr) == 0) {
813                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
814                 }
815                 if (strcasecmp("72", ptr) == 0) {
816                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
817                 }
818                 break;
819
820         case 'h':
821         case 'H':
822                 if (strcasecmp("TML", ptr) == 0) {
823                         return TELEGRAM_APP_FILE_TYPE_HTML;
824                 }
825                 if (strcasecmp("TM", ptr) == 0) {
826                         return TELEGRAM_APP_FILE_TYPE_HTML;
827                 }
828                 break;
829
830         case 'i':
831         case 'I':
832                 if (strcasecmp("MY", ptr) == 0) {
833                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
834                 }
835                 if (strcasecmp("CS", ptr) == 0) {
836                         return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
837                 }
838                 break;
839
840         case 'j':
841         case 'J':
842                 if (strcasecmp("PG", ptr) == 0) {
843                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
844                 }
845                 if (strcasecmp("PEG", ptr) == 0) {
846                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
847                 }
848                 if (strcasecmp("PE", ptr) == 0) {
849                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
850                 }
851                 break;
852
853         case 'm':
854         case 'M':
855                 if (strcasecmp("MF", ptr) == 0) {
856                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
857                 }
858                 if (strcasecmp("P3", ptr) == 0) {
859                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
860                 }
861                 if (strcasecmp("ID", ptr) == 0) {
862                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
863                 }
864                 if (strcasecmp("IDI", ptr) == 0) {
865                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
866                 }
867                 if (strcasecmp("P4", ptr) == 0) {
868                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
869                 }
870                 if (strcasecmp("PG", ptr) == 0) {
871                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
872                 }
873                 if (strcasecmp("PEG", ptr) == 0) {
874                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
875                 }
876                 if (strcasecmp("4A", ptr) == 0) {
877                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
878                 }
879                 if (strcasecmp("3G", ptr) == 0) {
880                         return TELEGRAM_APP_FILE_TYPE_FLASH;
881                 }
882                 if (strcasecmp("XMF", ptr) == 0) {
883                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
884                 }
885                 if (strcasecmp("KV", ptr) == 0) {
886                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
887                 }
888                 break;
889
890         case 'o':
891         case 'O':
892                 if (strcasecmp("pml", ptr) == 0) {
893                         return TELEGRAM_APP_FILE_TYPE_RSS;
894                 }
895                 if (strcasecmp("DF", ptr) == 0) {
896                         return TELEGRAM_APP_FILE_TYPE_DRM;
897                 }
898                 if (strcasecmp("RO", ptr) == 0) {
899                         return TELEGRAM_APP_FILE_TYPE_DRM;
900                 }
901                 break;
902
903         case 'p':
904         case 'P':
905                 if (strcasecmp("NG", ptr) == 0) {
906                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
907                 }
908                 if (strcasecmp("JPEG", ptr) == 0) {
909                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
910                 }
911                 if (strcasecmp("DF", ptr) == 0) {
912                         return TELEGRAM_APP_FILE_TYPE_PDF;
913                 }
914                 if (strcasecmp("PT", ptr) == 0) {
915                         return TELEGRAM_APP_FILE_TYPE_PPT;
916                 }
917                 if (strcasecmp("PTX", ptr) == 0) {
918                         return TELEGRAM_APP_FILE_TYPE_PPT;
919                 }
920                 break;
921
922         case 'r':
923         case 'R':
924                 if (strcasecmp("O", ptr) == 0) {
925                         return TELEGRAM_APP_FILE_TYPE_DRM;
926                 }
927                 break;
928
929         case 's':
930         case 'S':
931                 if (strcasecmp("DP", ptr) == 0) {
932                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
933                 }
934                 if (strcasecmp("PM", ptr) == 0) {
935                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
936                 }
937                 if (strcasecmp("MP", ptr) == 0) {
938                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
939                 }
940                 if (strcasecmp("PF", ptr) == 0) {
941                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
942                 }
943                 if (strcasecmp("WF", ptr) == 0) {
944                         return TELEGRAM_APP_FILE_TYPE_FLASH;
945                 }
946                 if (strcasecmp("VG", ptr) == 0) {
947                         return TELEGRAM_APP_FILE_TYPE_SVG;
948                 }
949                 if (strcasecmp("VGZ", ptr) == 0) {
950                         return TELEGRAM_APP_FILE_TYPE_SVG;
951                 }
952                 break;
953
954         case 't':
955         case 'T':
956                 if (strcasecmp("XT", ptr) == 0) {
957                         return TELEGRAM_APP_FILE_TYPE_TXT;
958                 }
959                 if (strcasecmp("PK", ptr) == 0) {
960                         return TELEGRAM_APP_FILE_TYPE_TPK;
961                 }
962                 break;
963
964         case 'v':
965         case 'V':
966                 if (strcasecmp("CF", ptr) == 0) {
967                         return TELEGRAM_APP_FILE_TYPE_VCONTACT;
968                 }
969                 if (strcasecmp("TS", ptr) == 0) {
970                         return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
971                 }
972                 if (strcasecmp("CS", ptr) == 0) {
973                         return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
974                 }
975                 break;
976
977         case 'w':
978         case 'W':
979                 if (strcasecmp("AV", ptr) == 0) {
980                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
981                 }
982                 if (strcasecmp("BMP", ptr) == 0) {
983                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
984                 }
985                 if (strcasecmp("GT", ptr) == 0) {
986                         return TELEGRAM_APP_FILE_TYPE_WGT;
987                 }
988                 if (strcasecmp("MA", ptr) == 0) {
989                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
990                 }
991                 if (strcasecmp("MV", ptr) == 0) {
992                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
993                 }
994                 break;
995
996         case 'x':
997         case 'X':
998                 if (strcasecmp("LS", ptr) == 0) {
999                         return TELEGRAM_APP_FILE_TYPE_EXCEL;
1000                 }
1001                 if (strcasecmp("LSX", ptr) == 0) {
1002                         return TELEGRAM_APP_FILE_TYPE_EXCEL;
1003                 }
1004                 if (strcasecmp("MF", ptr) == 0) {
1005                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
1006                 }
1007                 if (strcasecmp("HTML", ptr) == 0) {
1008                         return TELEGRAM_APP_FILE_TYPE_HTML;
1009                 }
1010                 break;
1011
1012         case '3':
1013                 if (strcasecmp("GP", ptr) == 0) {
1014                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
1015                 }
1016                 if (strcasecmp("GPP", ptr) == 0) {
1017                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
1018                 }
1019                 if (strcasecmp("G2", ptr) == 0) {
1020                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
1021                 }
1022                 break;
1023         }
1024         return TELEGRAM_APP_FILE_TYPE_ETC;
1025 }
1026
1027 static inline char* telegram_common_get_file_ext(const char *a_pszfile_name)
1028 {
1029         if (a_pszfile_name != NULL) {
1030                 int nlen = strlen(a_pszfile_name);
1031                 char *psztemp = (char *)a_pszfile_name + nlen;
1032
1033                 while (nlen--) {
1034                         psztemp--;
1035                         if (*psztemp == '.') {
1036                                 psztemp++;
1037                                 break;
1038                         }
1039                 }
1040                 return psztemp;
1041         }
1042
1043         return NULL;
1044 }
1045
1046
1047 static inline TELEGRAM_APP_FILE_TYPE_E telegram_common_get_file_type(const char *filepath)
1048 {
1049         TELEGRAM_APP_FILE_TYPE_E file_type = TELEGRAM_APP_FILE_TYPE_NONE;
1050         if(filepath == NULL)
1051         {
1052                 return TELEGRAM_APP_FILE_TYPE_NONE;
1053         }
1054         char *file_ext = telegram_common_get_file_ext(filepath);
1055
1056         if (file_ext) {
1057                 file_type = __telegram_common_get_file_type_by_file_ext(file_ext, filepath);
1058         } else {
1059                 LOGI("file_ext is NULL");
1060         }
1061
1062         return file_type;
1063 }
1064
1065 extern uint64_t get_time_stamp_in_macro();
1066
1067 extern void wait_for(unsigned int secs);
1068
1069 typedef struct _telegram_Time
1070 {
1071         int hours;
1072         int minutes;
1073         int ampm; /* 0 for AM, 1 for PM */
1074         int days;
1075
1076 } telegram_time;
1077
1078 typedef enum {
1079         telegram_TIME_FORMAT_12H = 0,
1080         telegram_TIME_FORMAT_24H,
1081         telegram_TIME_FORMAT_UNKNOWN
1082
1083 } telegram_time_format;
1084
1085 typedef struct Buddy {
1086         int buddyNO;
1087         char* buddyID;
1088         char* name;
1089         char* initialConsonant;
1090         char* statusMsg;
1091         char favoriteFlag;
1092         char friendStatus;
1093         char* profilePath;
1094         char* birthday;
1095         char* email;
1096         int rank;
1097         long updateTime;
1098         char* phoneNumber;
1099         char* orgNums;
1100         int grade;
1101         char* emailAccount;
1102         char relationHideFlag;
1103         char updateStatus;
1104         char knownPhoneNumberFlag;
1105         char phoneNumberShowFlag;
1106         char whoBlindMeFlag;
1107         char voipFlag;
1108         char isBlindedFlag;
1109         char* extraInfo ;
1110         int nameInfo ;
1111         char* msisdns;
1112         char* smsContacts;
1113
1114 } Buddy;
1115
1116 extern void load_list_of_countries(appdata_s *ad);
1117
1118 extern void app_get_resource(const char *edj_file_in, char *edj_path_out, int edj_path_max);
1119
1120 extern char* get_budy_state(appdata_s* ad, int buddy_id);
1121
1122 extern Eina_Bool get_thumbnail_from_video_url(const char *file_path, char **thumbnail_path);
1123
1124 extern void show_loading_popup(appdata_s* ad);
1125
1126 extern void hide_loading_popup(appdata_s* ad);
1127
1128 extern void free_user_data(user_data_s *user_data);
1129
1130 extern void app_nf_back_cb(void *data, Evas_Object *obj, void *event_info);
1131
1132 extern TelegramAppDirection tg_get_device_orientation();
1133
1134 extern void update_ccurrent_view(appdata_s *ad);
1135
1136 extern void display_badge_with_notification(int unread_msg_cnt, appdata_s *app);
1137
1138 extern void display_badge(int unread_msg_cnt, appdata_s *app, Eina_Bool is_need_notification);
1139
1140 extern void create_floating_button(appdata_s* ad);
1141
1142 extern void delete_floating_button(appdata_s* ad);
1143
1144 extern void show_floating_button(appdata_s* ad);
1145
1146 extern void update_floating_button(appdata_s* ad, int mode);
1147
1148 extern void on_new_message_clicked(void *data, Evas_Object *obj, void *event_info);
1149
1150 extern void on_floating_icon_clicked(void *data, Evas_Object *obj, void *event_info);
1151
1152 extern char *str_replace(char *orig, char *rep, char *with);
1153
1154 extern char *str_case_replace(char *orig, char *rep, char *with_pre, char *with_fi);
1155
1156 extern Eina_Bool on_load_main_view_requested(void *data);
1157
1158 extern void launch_tg_server(void *data);
1159
1160 extern void recursive_dir_copy(const char *src_dir, const char *tar_dir);
1161
1162 extern char* get_peer_name(tg_peer_info_s* peer_info);
1163
1164 extern void set_peer_names(tg_peer_info_s* peer_info, tg_main_list_item_s* main_list_item);
1165
1166 #endif /* TG_COMMON_H_ */