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