add telegram account, fix db insert error.
[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"
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 10
225 #define MAX_CODE_LENGTH 5
226 #define MAX_USERNAME_LENGTH 15
227 #define MIN_USERNAME_LENGTH 5
228
229 typedef struct {
230         int type;
231         int id;
232 } tgl_peer_id_t;
233
234
235 typedef enum _TelegramAppDirection {
236         TELEGRAM_TARGET_DIRECTION_INVAILD = -1,
237         TELEGRAM_TARGET_DIRECTION_PORTRAIT = 0,
238         TELEGRAM_TARGET_DIRECTION_LANDSCAPE_INVERSE = 90,
239         TELEGRAM_TARGET_DIRECTION_PORTRAIT_INVERSE = 180,
240         TELEGRAM_TARGET_DIRECTION_LANDSCAPE = 270,
241         TELEGRAM_TARGET_DIRECTION_MAX,
242 } TelegramAppDirection;
243
244
245
246 typedef enum {
247         APP_STATE_IN_BACKGROUND = 0,
248         APP_STATE_IN_FOREGROUND
249 }app_visible_state;
250
251 typedef enum {
252         TELEGRAM_APP_FILE_TYPE_NONE = 0,
253         TELEGRAM_APP_FILE_TYPE_IMAGE,      /**< Image category */
254         TELEGRAM_APP_FILE_TYPE_VIDEO,      /**< Video category */
255         TELEGRAM_APP_FILE_TYPE_MUSIC,      /**< Music category */
256         TELEGRAM_APP_FILE_TYPE_STICKER, /** Sticker / Anicon category */
257         TELEGRAM_APP_FILE_TYPE_PDF,                /**< Pdf category */
258         TELEGRAM_APP_FILE_TYPE_DOC,                /**< Word category */
259         TELEGRAM_APP_FILE_TYPE_PPT,                /**< Powerpoint category */
260         TELEGRAM_APP_FILE_TYPE_EXCEL,      /**< Excel category */
261         TELEGRAM_APP_FILE_TYPE_VOICE,      /**< Voice category */
262         TELEGRAM_APP_FILE_TYPE_HTML,               /**< Html category */
263         TELEGRAM_APP_FILE_TYPE_FLASH,      /**< Flash category */
264         TELEGRAM_APP_FILE_TYPE_TXT,                /**< Txt category */
265         TELEGRAM_APP_FILE_TYPE_VCONTACT,           /**< Vcontact category */
266         TELEGRAM_APP_FILE_TYPE_VCALENDAR,          /**< Vcalendar category */
267         TELEGRAM_APP_FILE_TYPE_VNOTE,      /**< Vnote category */
268         TELEGRAM_APP_FILE_TYPE_VBOOKMARK,          /**< Vbookmark category */
269         TELEGRAM_APP_FILE_TYPE_SNB,                /**< Snotes category */
270         TELEGRAM_APP_FILE_TYPE_SVG,                /**< Svg category */
271         TELEGRAM_APP_FILE_TYPE_RSS,                /**< Rss reader file, *.opml */
272         TELEGRAM_APP_FILE_TYPE_JAVA,               /**< java file, *.jad, *.jar */
273         TELEGRAM_APP_FILE_TYPE_WGT,                /**< wrt , *.wgt, *.wgt */
274         TELEGRAM_APP_FILE_TYPE_TPK,                     /**< *.tpk */
275         TELEGRAM_APP_FILE_TYPE_HWP,                     /**< *.hwp */
276         TELEGRAM_APP_FILE_TYPE_EMAIL,           /**< *.eml */
277         TELEGRAM_APP_FILE_TYPE_DRM,                     /**< drm file , *.dcf */
278         TELEGRAM_APP_FILE_TYPE_ZIP,                     /**< zip compressed file , *.zip */
279         TELEGRAM_APP_FILE_TYPE_ETC,                /**< Other files category */
280         TELEGRAM_APP_FILE_TYPE_MAX
281 } TELEGRAM_APP_FILE_TYPE_E;
282
283
284 typedef enum state_of_app {
285         TG_SPLASH_SCREEN_STATE,
286         TG_INIT_SCREEN_STATE,
287         TG_REGISTRATION_STATE,
288         TG_PROFILE_REGISTRATION_STATE,
289         TG_LOGIN_STATE,
290         TG_BUDDY_LIST_STATE,
291         TG_BUDDY_LIST_SELECTION_STATE,
292         TG_GROUP_CHAT_NAME_ENTRY_STATE,
293         TG_BUDDY_CHAT_STATE,
294         TG_BUDDY_CHAT_CONV_STATE,
295         TG_USER_MAIN_VIEW_STATE,
296         TG_USER_MAIN_VIEW_SELECTION_STATE,
297         TG_START_MESSAGING_VIEW_STATE,
298         TG_CHAT_MESSAGING_VIEW_STATE,
299         TG_PEER_SEARCH_VIEW_STATE,
300         TG_SETTINGS_SCREEN_STATE,
301         TG_SETTINGS_EDIT_NAME_STATE,
302         TG_SET_USERNAME_STATE,
303         TG_SET_USER_INFO_STATE,
304         TG_SET_CHAT_INFO_STATE,
305         TG_SELECT_BUDDY_VIEW,
306         TG_ADD_CONTACT_STATE,
307         TG_COUNTRY_SELECTION_VIEW
308 } state_of_app_s;
309
310 enum tgl_typing_status {
311         tgl_typing_none = 10001,
312         tgl_typing_typing,
313         tgl_typing_cancel,
314         tgl_typing_record_video,
315         tgl_typing_upload_video,
316         tgl_typing_record_audio,
317         tgl_typing_upload_audio,
318         tgl_typing_upload_photo,
319         tgl_typing_upload_document,
320         tgl_typing_geo,
321         tgl_typing_choose_contact
322 };
323
324 typedef enum MESSAGE_STATE {
325         TG_MESSAGE_STATE_SENDING = 1,
326         TG_MESSAGE_STATE_SENT,
327         TG_MESSAGE_STATE_DELIVERED,
328         TG_MESSAGE_STATE_FAILED,
329         TG_MESSAGE_STATE_RECEIVED,
330         TG_MESSAGE_STATE_READ,
331         TG_MESSAGE_STATE_UNKNOWN
332 } TG_MESSAGE_STATE;
333
334
335 typedef struct user_data {
336         tgl_peer_id_t user_id;
337         char *print_name;
338         int structure_version;
339         char *photo_path;
340         int photo_id;
341         char *first_name;
342         char *last_name;
343         char *phone;
344         int access_hash;
345         char *real_first_name;
346         char *real_last_name;
347         char *username;
348         int online;
349         int last_seen;
350         Eina_Bool is_selected;
351         int is_blocked;
352         int is_deleted;
353         int is_unknown;
354 } user_data_s;
355
356 typedef struct user_data_with_pic {
357         user_data_s *use_data;
358         //char* pic_file_location;
359         Evas_Object *contact_icon;
360 } user_data_with_pic_s;
361
362 enum tgl_message_media_type {
363         tgl_message_media_none = 1001,
364         tgl_message_media_photo,
365         //tgl_message_media_video,
366         //tgl_message_media_audio,
367         tgl_message_media_document,
368         tgl_message_media_geo,
369         tgl_message_media_contact,
370         tgl_message_media_unsupported,
371         tgl_message_media_photo_encr,
372         //tgl_message_media_video_encr,
373         //tgl_message_media_audio_encr,
374         tgl_message_media_document_encr,
375 };
376
377 typedef struct tg_chat_info {
378         int chat_id;
379         int flags;
380         char* print_title;
381         int struct_version;
382         long long photo_id;
383         char* photo_path;
384         char* title;
385         int users_num;
386         int user_list_size;
387         int user_list_version;
388         int inviter_id;
389         int chat_users[100];
390         int date;
391         int version;
392         int admin_id;
393 } tg_chat_info_s;
394
395 typedef struct tg_peer_info {
396         int peer_id;
397         int peer_type;
398         int flags;
399         long long last_msg_id;
400         int last_msg_date;
401         char* print_name;
402         int struct_version;
403         int no_of_unread_msgs;
404         int last_seen_time;
405         char* photo_path;
406         long long photo_id;
407         int is_unknown;
408 } tg_peer_info_s;
409
410 typedef struct peer_with_pic {
411         tg_peer_info_s *use_data;
412         Evas_Object *contact_icon;
413         Evas_Object *name_object;
414         Evas_Object *msg_object;
415         char *last_message;
416         Eina_Bool is_out_message;
417 } peer_with_pic_s;
418
419 typedef struct group_chat_with_pic {
420         tg_chat_info_s *use_data;
421         Evas_Object *contact_icon;
422 } group_chat_with_pic_s;
423
424 typedef struct tg_message {
425         int msg_id;
426         int flags;
427         int fwd_from_id;
428         int fwd_date;
429         int from_id;
430         int to_id;
431         int out;
432         int unread;
433         int date;
434         int service;
435         char* message;
436         int msg_state;
437         int message_len;
438         int media_type;
439         char* media_id;
440         int unique_id;
441         int is_marked_for_delete;
442 } tg_message_s;
443
444 typedef struct tgl_media {
445         long long media_id;
446         int media_type;
447         long long access_hash;
448         int user_id;
449         int date;
450         char *caption;
451         char *longitude;
452         char *latitude;
453         int sizes;
454         char *phone_no;
455         char *first_name;
456         char *last_name;
457         char *file_path;
458
459         char *photo_type1;
460         int photo_loc_dc1;
461         long long photo_loc_vol1;
462         int photo_loc_id1;
463         long long photo_loc_sec1;
464         int photo_width1;
465         int photo_height1;
466         int photo_size1;
467         char *photo_data1;
468
469         char *photo_type2;
470         int photo_loc_dc2;
471         long long photo_loc_vol2;
472         int photo_loc_id2;
473         long long photo_loc_sec2;
474         int photo_width2;
475         int photo_height2;
476         int photo_size2;
477         char *photo_data2;
478
479         char *photo_type3;
480         int photo_loc_dc3;
481         long long photo_loc_vol3;
482         int photo_loc_id3;
483         long long photo_loc_sec3;
484         int photo_width3;
485         int photo_height3;
486         int photo_size3;
487         char *photo_data3;
488
489         char *photo_type4;
490         int photo_loc_dc4;
491         long long photo_loc_vol4;
492         int photo_loc_id4 ;
493         long long photo_loc_sec4;
494         int photo_width4;
495         int photo_height4;
496         int photo_size4;
497         char *photo_data4;
498
499
500         char* mime_type;
501         char* doc_type;
502         int doc_width;
503         int doc_height;
504         int doc_duration;
505         int doc_size;
506
507 } tgl_media_s;
508
509 typedef struct tg_main_list_item {
510         char* peer_print_name;
511         int peer_id;
512         int peer_type;
513         char* last_message;
514         int last_msg_id;
515         int last_msg_status;
516         int last_msg_type;
517         int last_msg_service;
518         int number_of_unread_msgs;
519         int last_seen_time;
520         Eina_Bool is_out_msg;
521         char* profile_pic_path;
522         Evas_Object* profile_pic;
523         Evas_Object* user_name_lbl;
524         Evas_Object* status_lbl;
525         Evas_Object* date_lbl;
526         Evas_Object* msg_status_lbl;
527         Evas_Object* main_item_layout;
528         Eina_Bool is_selected;
529         char *buddy_display_name;
530 } tg_main_list_item_s;
531
532 typedef struct appdata {
533         Evas_Object* win;
534         Evas_Object* layout;
535         Evas_Object* conform;
536         Evas_Object* nf;
537         Evas_Object* panel;
538         char* phone_number;
539         char* sms_code;
540         Eina_List *buddy_list;
541         Eina_List *known_buddy_list;
542         Eina_List *unknown_buddy_list;
543         //Eina_List *group_chat_list;
544         Eina_List *peer_list;
545
546         Eina_List *main_list;
547
548         Eina_List *search_peer_list;
549
550         int curtimezoneoffset;
551         int curtimeformat;
552         tgl_peer_id_t user_id;
553         state_of_app_s current_app_state;
554         user_data_s *current_user_data;
555         tg_main_list_item_s* main_item_in_cahtting_data;
556         peer_with_pic_s* peer_in_cahtting_data;
557         user_data_with_pic_s* buddy_in_cahtting_data;
558         service_client* service_client;
559         Eina_Bool is_first_time_registration;
560         Eina_List *loaded_msg_list;
561         int timer_value;
562         Eina_Bool is_last_msg_changed;
563         Evas_Object* loading_popup;
564         Eina_Bool is_tg_initilized;
565
566         char *chat_background;
567         //Eina_Bool is_long_pressed;
568         Evas_Object *msg_popup;
569
570         //user_data_with_pic_s *selected_buddy_item;
571         user_data_s *selected_buddy_item;
572
573         app_visible_state s_app_visible_state;
574         notification_h s_notififcation;
575         Eina_Bool is_server_ready;
576         TelegramAppDirection target_direction;
577         Evas_Object *floating_btn;
578         Elm_Theme *theme;
579         int screen_mode_for_fb; // for floating button icon
580         Evas_Object *menu_popup;
581         //int msg_count;
582         Eina_List *contact_list;
583         Elm_Naviframe_Item *main_item;
584         Eina_Bool is_loading_from_msg_view;
585         Eina_Bool is_loading_from_profile_view;
586         //int size_of_listed_countries;
587         //char *country_names[COUNTRIES_SIZE];
588         //char *country_codes[COUNTRIES_SIZE];
589         Eina_List *country_names_list;
590         Eina_List *country_codes_list;
591         int selected_country_id;
592
593         char *country_code_buffer;
594 } appdata_s;
595
596 extern void show_toast(appdata_s* ad, char* value);
597 extern void layout_back_cb(void *data, Evas_Object *obj, void *event_info);
598 extern void tg_login_nf_back_cb(void *data, Evas_Object *obj, void *event_info);
599 extern void detail_list_nf_back_cb(void *data, Evas_Object *obj, void *event_info);
600 extern void create_buddy_msg_table(const char* table_name);
601 extern void load_buddy_list_data(appdata_s *ad);
602 extern void load_unknown_buddy_list_data(appdata_s *ad);
603 //extern void load_group_chat_data(appdata_s *ad);
604 extern void load_peer_data(appdata_s *ad);
605 extern void load_registered_user_data(appdata_s *ad);
606 extern void load_main_list_data(appdata_s *ad);
607 extern void launch_app_control(appdata_s *ad, char *media_type, char *url);
608 extern void free_message(tg_message_s **message);
609
610 #if 0
611 static char *trim(char *s) {
612     char *ptr;
613     if (!s)
614         return NULL;   // handle NULL string
615     if (!*s)
616         return s;      // handle empty string
617     for (ptr = s + strlen(s) - 1; (ptr >= s) && isspace(*ptr); --ptr);
618     ptr[1] = '\0';
619     return s;
620 }
621 #endif
622
623 static inline char* trim(const char * s)
624 {
625         if (!s) {
626                 return NULL;
627         }
628
629         int l = strlen(s);
630
631         while (isspace(s[l - 1])) {
632                 --l;
633         }
634
635         while (*s && isspace(*s)) {
636                 ++s, --l;
637         }
638
639         return strndup(s, l);
640 }
641
642 extern Evas_Object* create_circle_button(Evas_Object *parent, char* text, char* filepath);
643 extern Evas_Object* create_button(Evas_Object *parent, char *style, char *text);
644 extern int numbers_only(const char *s);
645
646 static inline void telegram_image_mask_delete_cb(Evas_Object *obj)
647 {
648         if (obj == NULL)
649                 return;
650
651         void *mask = evas_object_image_data_get(obj, EINA_TRUE);
652         if (mask) {
653                 free(mask);
654                 mask = NULL;
655         }
656 }
657
658 extern tg_main_list_item_s* get_latest_item(appdata_s *ad, peer_with_pic_s *item);
659 //static char* get_table_name_from_number(const char* phone_no)
660 extern char* get_table_name_from_number(const int id);
661 extern Eina_Bool compare_date_with_current_date(int rtime);
662
663 static inline void buddy_icon_del_cb(void *data, Evas *e, Evas_Object *icon, void *event_info)
664 {
665         user_data_with_pic_s *item  = data;
666         item->contact_icon = NULL;
667 }
668
669 static inline  const char *ui_utils_get_resource(const char *res_name)
670 {
671         static char res_path[PATH_MAX] = {'\0'};
672
673         char *res_path_buff = app_get_resource_path();
674         if (!res_path_buff) {
675                 return NULL;
676         }
677         snprintf(res_path, sizeof(res_path) - 1, "%s%s", res_path_buff, res_name);
678         free(res_path_buff);
679
680         return res_path;
681 }
682
683 static inline char *get_current_time()
684 {
685         Eina_Strbuf *strbuf = eina_strbuf_new();
686         time_t local_time = time(NULL);
687         char buf[200] = {0};
688         char *ret = NULL;
689         struct tm *time_info = localtime(&local_time);
690
691         strftime(buf, 200, "%l:%M", time_info);
692         eina_strbuf_append_printf(strbuf, "%s %s", buf, (time_info->tm_hour >= 12) ? "PM":"AM");
693         ret = eina_strbuf_string_steal(strbuf);
694         eina_strbuf_free(strbuf);
695         return ret;
696 }
697
698 static inline char *replace(const char *s, char ch, const char *repl)
699 {
700         int count = 0;
701         const char *t;
702
703         for(t = s; *t; t++) {
704                 count += (*t == ch);
705         }
706
707         size_t rlen = strlen(repl);
708         char *res = malloc(strlen(s) + (rlen - 1) * count + 1);
709         char *ptr = res;
710
711         for(t = s; *t; t++) {
712                 if(*t == ch) {
713                         memcpy(ptr, repl, rlen);
714                         ptr += rlen;
715                 } else {
716                         *ptr++ = *t;
717                 }
718         }
719
720         *ptr = 0;
721         return res;
722 }
723
724 static inline Evas_Object * create_scroller(Evas_Object *parent)
725 {
726         Evas_Object *scroller = elm_scroller_add(parent);
727         if (!scroller) {
728                 /**
729                  * @todo
730                  * Handling this exceptional cases.
731                  */
732                 return NULL;
733         }
734         elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_FALSE);
735         elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
736         evas_object_show(scroller);
737         return scroller;
738 }
739
740 static inline int telegram_is_drm_file(const char *file_path)
741 {
742         return 0;
743 }
744
745 static inline TELEGRAM_APP_FILE_TYPE_E __telegram_common_get_file_type_by_file_ext(const char *file_ext, const char *fullpath)
746 {
747         const char *ptr;
748
749         if (file_ext == NULL) {
750                 LOGI("file_ext is NULL");
751                 return TELEGRAM_APP_FILE_TYPE_ETC;
752         }
753
754         ptr = file_ext + 1;
755         switch (*file_ext) {
756         case 'a':
757         case 'A':
758                 if (strcasecmp("SF", ptr) == 0) {
759                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
760                 }
761                 if (strcasecmp("MR", ptr) == 0) {
762                         return TELEGRAM_APP_FILE_TYPE_VOICE;
763                 }
764                 if (strcasecmp("WB", ptr) == 0) {
765                         return TELEGRAM_APP_FILE_TYPE_VOICE;
766                 }
767                 if (strcasecmp("AC", ptr) == 0) {
768                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
769                 }
770                 if (strcasecmp("VI", ptr) == 0) {
771                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
772                 }
773                 break;
774
775         case 'b':
776         case 'B':
777                 if (strcasecmp("MP", ptr) == 0) {
778                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
779                 }
780                 break;
781
782         case 'd':
783         case 'D':
784                 if (strcasecmp("OC", ptr) == 0) {
785                         return TELEGRAM_APP_FILE_TYPE_DOC;
786                 }
787                 if (strcasecmp("OCX", ptr) == 0) {
788                         return TELEGRAM_APP_FILE_TYPE_DOC;
789                 }
790                 if (strcasecmp("IVX", ptr) == 0) {
791                         if (telegram_is_drm_file(fullpath) == 0) {
792                                 return TELEGRAM_APP_FILE_TYPE_DRM;
793                         } else {
794                                 return TELEGRAM_APP_FILE_TYPE_VIDEO;
795                         }
796                 }
797                 if (strcasecmp("CF", ptr) == 0) {
798                         return TELEGRAM_APP_FILE_TYPE_DRM;
799                 }
800                 if (strcasecmp("M", ptr) == 0) {
801                         return TELEGRAM_APP_FILE_TYPE_DRM;
802                 }
803                 break;
804
805         case 'g':
806         case 'G':
807                 if (strcasecmp("IF", ptr) == 0) {
808                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
809                 }
810                 if (strcasecmp("72", ptr) == 0) {
811                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
812                 }
813                 break;
814
815         case 'h':
816         case 'H':
817                 if (strcasecmp("TML", ptr) == 0) {
818                         return TELEGRAM_APP_FILE_TYPE_HTML;
819                 }
820                 if (strcasecmp("TM", ptr) == 0) {
821                         return TELEGRAM_APP_FILE_TYPE_HTML;
822                 }
823                 break;
824
825         case 'i':
826         case 'I':
827                 if (strcasecmp("MY", ptr) == 0) {
828                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
829                 }
830                 if (strcasecmp("CS", ptr) == 0) {
831                         return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
832                 }
833                 break;
834
835         case 'j':
836         case 'J':
837                 if (strcasecmp("PG", ptr) == 0) {
838                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
839                 }
840                 if (strcasecmp("PEG", ptr) == 0) {
841                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
842                 }
843                 if (strcasecmp("PE", ptr) == 0) {
844                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
845                 }
846                 break;
847
848         case 'm':
849         case 'M':
850                 if (strcasecmp("MF", ptr) == 0) {
851                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
852                 }
853                 if (strcasecmp("P3", ptr) == 0) {
854                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
855                 }
856                 if (strcasecmp("ID", ptr) == 0) {
857                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
858                 }
859                 if (strcasecmp("IDI", ptr) == 0) {
860                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
861                 }
862                 if (strcasecmp("P4", ptr) == 0) {
863                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
864                 }
865                 if (strcasecmp("PG", ptr) == 0) {
866                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
867                 }
868                 if (strcasecmp("PEG", ptr) == 0) {
869                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
870                 }
871                 if (strcasecmp("4A", ptr) == 0) {
872                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
873                 }
874                 if (strcasecmp("3G", ptr) == 0) {
875                         return TELEGRAM_APP_FILE_TYPE_FLASH;
876                 }
877                 if (strcasecmp("XMF", ptr) == 0) {
878                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
879                 }
880                 if (strcasecmp("KV", ptr) == 0) {
881                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
882                 }
883                 break;
884
885         case 'o':
886         case 'O':
887                 if (strcasecmp("pml", ptr) == 0) {
888                         return TELEGRAM_APP_FILE_TYPE_RSS;
889                 }
890                 if (strcasecmp("DF", ptr) == 0) {
891                         return TELEGRAM_APP_FILE_TYPE_DRM;
892                 }
893                 if (strcasecmp("RO", ptr) == 0) {
894                         return TELEGRAM_APP_FILE_TYPE_DRM;
895                 }
896                 break;
897
898         case 'p':
899         case 'P':
900                 if (strcasecmp("NG", ptr) == 0) {
901                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
902                 }
903                 if (strcasecmp("JPEG", ptr) == 0) {
904                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
905                 }
906                 if (strcasecmp("DF", ptr) == 0) {
907                         return TELEGRAM_APP_FILE_TYPE_PDF;
908                 }
909                 if (strcasecmp("PT", ptr) == 0) {
910                         return TELEGRAM_APP_FILE_TYPE_PPT;
911                 }
912                 if (strcasecmp("PTX", ptr) == 0) {
913                         return TELEGRAM_APP_FILE_TYPE_PPT;
914                 }
915                 break;
916
917         case 'r':
918         case 'R':
919                 if (strcasecmp("O", ptr) == 0) {
920                         return TELEGRAM_APP_FILE_TYPE_DRM;
921                 }
922                 break;
923
924         case 's':
925         case 'S':
926                 if (strcasecmp("DP", ptr) == 0) {
927                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
928                 }
929                 if (strcasecmp("PM", ptr) == 0) {
930                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
931                 }
932                 if (strcasecmp("MP", ptr) == 0) {
933                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
934                 }
935                 if (strcasecmp("PF", ptr) == 0) {
936                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
937                 }
938                 if (strcasecmp("WF", ptr) == 0) {
939                         return TELEGRAM_APP_FILE_TYPE_FLASH;
940                 }
941                 if (strcasecmp("VG", ptr) == 0) {
942                         return TELEGRAM_APP_FILE_TYPE_SVG;
943                 }
944                 if (strcasecmp("VGZ", ptr) == 0) {
945                         return TELEGRAM_APP_FILE_TYPE_SVG;
946                 }
947                 break;
948
949         case 't':
950         case 'T':
951                 if (strcasecmp("XT", ptr) == 0) {
952                         return TELEGRAM_APP_FILE_TYPE_TXT;
953                 }
954                 if (strcasecmp("PK", ptr) == 0) {
955                         return TELEGRAM_APP_FILE_TYPE_TPK;
956                 }
957                 break;
958
959         case 'v':
960         case 'V':
961                 if (strcasecmp("CF", ptr) == 0) {
962                         return TELEGRAM_APP_FILE_TYPE_VCONTACT;
963                 }
964                 if (strcasecmp("TS", ptr) == 0) {
965                         return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
966                 }
967                 if (strcasecmp("CS", ptr) == 0) {
968                         return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
969                 }
970                 break;
971
972         case 'w':
973         case 'W':
974                 if (strcasecmp("AV", ptr) == 0) {
975                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
976                 }
977                 if (strcasecmp("BMP", ptr) == 0) {
978                         return TELEGRAM_APP_FILE_TYPE_IMAGE;
979                 }
980                 if (strcasecmp("GT", ptr) == 0) {
981                         return TELEGRAM_APP_FILE_TYPE_WGT;
982                 }
983                 if (strcasecmp("MA", ptr) == 0) {
984                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
985                 }
986                 if (strcasecmp("MV", ptr) == 0) {
987                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
988                 }
989                 break;
990
991         case 'x':
992         case 'X':
993                 if (strcasecmp("LS", ptr) == 0) {
994                         return TELEGRAM_APP_FILE_TYPE_EXCEL;
995                 }
996                 if (strcasecmp("LSX", ptr) == 0) {
997                         return TELEGRAM_APP_FILE_TYPE_EXCEL;
998                 }
999                 if (strcasecmp("MF", ptr) == 0) {
1000                         return TELEGRAM_APP_FILE_TYPE_MUSIC;
1001                 }
1002                 if (strcasecmp("HTML", ptr) == 0) {
1003                         return TELEGRAM_APP_FILE_TYPE_HTML;
1004                 }
1005                 break;
1006
1007         case '3':
1008                 if (strcasecmp("GP", ptr) == 0) {
1009                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
1010                 }
1011                 if (strcasecmp("GPP", ptr) == 0) {
1012                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
1013                 }
1014                 if (strcasecmp("G2", ptr) == 0) {
1015                         return TELEGRAM_APP_FILE_TYPE_VIDEO;
1016                 }
1017                 break;
1018         }
1019         return TELEGRAM_APP_FILE_TYPE_ETC;
1020 }
1021
1022 static inline char* telegram_common_get_file_ext(const char *a_pszfile_name)
1023 {
1024         if (a_pszfile_name != NULL) {
1025                 int nlen = strlen(a_pszfile_name);
1026                 char *psztemp = (char *)a_pszfile_name + nlen;
1027
1028                 while (nlen--) {
1029                         psztemp--;
1030                         if (*psztemp == '.') {
1031                                 psztemp++;
1032                                 break;
1033                         }
1034                 }
1035                 return psztemp;
1036         }
1037
1038         return NULL;
1039 }
1040
1041
1042 static inline TELEGRAM_APP_FILE_TYPE_E telegram_common_get_file_type(const char *filepath)
1043 {
1044         TELEGRAM_APP_FILE_TYPE_E file_type = TELEGRAM_APP_FILE_TYPE_NONE;
1045         if(filepath == NULL)
1046         {
1047                 return TELEGRAM_APP_FILE_TYPE_NONE;
1048         }
1049         char *file_ext = telegram_common_get_file_ext(filepath);
1050
1051         if (file_ext) {
1052                 file_type = __telegram_common_get_file_type_by_file_ext(file_ext, filepath);
1053         } else {
1054                 LOGI("file_ext is NULL");
1055         }
1056
1057         return file_type;
1058 }
1059
1060 extern uint64_t get_time_stamp_in_macro();
1061
1062 extern void wait_for(unsigned int secs);
1063
1064 typedef struct _telegram_Time
1065 {
1066         int hours;
1067         int minutes;
1068         int ampm; /* 0 for AM, 1 for PM */
1069         int days;
1070
1071 } telegram_time;
1072
1073 typedef enum {
1074         telegram_TIME_FORMAT_12H = 0,
1075         telegram_TIME_FORMAT_24H,
1076         telegram_TIME_FORMAT_UNKNOWN
1077
1078 } telegram_time_format;
1079
1080 typedef struct Buddy {
1081         int buddyNO;
1082         char* buddyID;
1083         char* name;
1084         char* initialConsonant;
1085         char* statusMsg;
1086         char favoriteFlag;
1087         char friendStatus;
1088         char* profilePath;
1089         char* birthday;
1090         char* email;
1091         int rank;
1092         long updateTime;
1093         char* phoneNumber;
1094         char* orgNums;
1095         int grade;
1096         char* emailAccount;
1097         char relationHideFlag;
1098         char updateStatus;
1099         char knownPhoneNumberFlag;
1100         char phoneNumberShowFlag;
1101         char whoBlindMeFlag;
1102         char voipFlag;
1103         char isBlindedFlag;
1104         char* extraInfo ;
1105         int nameInfo ;
1106         char* msisdns;
1107         char* smsContacts;
1108
1109 } Buddy;
1110
1111 extern void load_list_of_countries(appdata_s *ad);
1112
1113 extern void app_get_resource(const char *edj_file_in, char *edj_path_out, int edj_path_max);
1114
1115 extern char* get_budy_state(appdata_s* ad, int buddy_id);
1116
1117 extern Eina_Bool get_thumbnail_from_video_url(const char *file_path, char **thumbnail_path);
1118
1119 extern void show_loading_popup(appdata_s* ad);
1120
1121 extern void hide_loading_popup(appdata_s* ad);
1122
1123 extern void free_user_data(user_data_s *user_data);
1124
1125 extern void app_nf_back_cb(void *data, Evas_Object *obj, void *event_info);
1126
1127 extern TelegramAppDirection tg_get_device_orientation();
1128
1129 extern void update_ccurrent_view(appdata_s *ad);
1130
1131 extern void tg_notification_create(appdata_s *app_data, char * icon_path, const char *title, char *content, char *sound_path, char *app_id);
1132
1133 extern void create_floating_button(appdata_s* ad);
1134
1135 extern void delete_floating_button(appdata_s* ad);
1136
1137 extern void show_floating_button(appdata_s* ad);
1138
1139 extern void update_floating_button(appdata_s* ad, int mode);
1140
1141 extern void on_new_message_clicked(void *data, Evas_Object *obj, void *event_info);
1142
1143 extern void on_floating_icon_clicked(void *data, Evas_Object *obj, void *event_info);
1144
1145 extern char *str_replace(char *orig, char *rep, char *with);
1146
1147 extern Eina_Bool on_load_main_view_requested(void *data);
1148
1149 extern void launch_tg_server(void *data);
1150
1151 extern void recursive_dir_copy(const char *src_dir, const char *tar_dir);
1152
1153 extern char* get_peer_name(tg_peer_info_s* peer_info);
1154
1155 extern void set_peer_names(tg_peer_info_s* peer_info, tg_main_list_item_s* main_list_item);
1156
1157 #endif /* TG_COMMON_H_ */