2 This file is part of Telegram application for tizen
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.
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.
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
23 #include <telegramtizen.h>
24 #include <app_preference.h>
25 #include "service_client.h"
26 #include <notification.h>
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"
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"
40 #define TELEGRAM_START_SCREEN_EDJ "edje/telegram_start_screen.edj"
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"
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"
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"
60 #define TG_SMILEY_ICON FM_ICON_PATH"/telegram_emotion.png"
62 //#define SEND_UNPRESSED_ICON FM_ICON_PATH"/ic_send_pressed.png"
63 //#define SEND_PRESSED_ICON FM_ICON_PATH"/ic_send_unpressed.png"
65 #define TG_SEND_ICON FM_ICON_PATH"/telegram_send.png"
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"
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"
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"
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"
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"
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"
105 #define TG_CHAT_DEFAULT_BG FM_ICON_PATH"background_hd.jpg"
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"
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"
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"
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"
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"
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"
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"
143 #define TG_CHAT_BG_PREFERENCE "chat_view_bg"
145 #define OLD_DIR "/opt/usr/media/telegram"
147 #define LIST_CONTACT_ROUND_MASK_ICON FM_ICON_PATH"/info_page_pic_mask.png"
149 #define BROKEN_IMAGE FM_ICON_PATH"/T01_Nocontents_broken.png"
151 #define TG_LIST_OF_COUNTIRES FM_ICON_PATH"countries.txt"
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"
157 #define FM_OK_BUTTON FM_ICON_PATH"ok_bn_press.png"
158 #define FM_CANCEL_BUTTON FM_ICON_PATH"cancel_bn_press.png"
160 #define TELEGRAM_DEBUG_LOG(fmt, args...) LOGD(" +++ LOG : "fmt, ##args)
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; }
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
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"}
189 #define COUNTRIES_SIZE 1000
191 #define NUMBER_OF_MENU_ITEMS 5
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"
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}
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;
214 #define CHAT_BUBBLE_SUB_TEXT_STYLE "<font_size=20 font_weight=Bold color=#000000>%s</font_size>"
218 static Elm_Entry_Filter_Limit_Size limit_filter_data;
219 static Elm_Entry_Filter_Accept_Set accept_set = {
220 .accepted = "0123456789",
224 #define MAX_NUM_LENGTH 10
225 #define MAX_CODE_LENGTH 5
226 #define MAX_USERNAME_LENGTH 15
227 #define MIN_USERNAME_LENGTH 5
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;
247 APP_STATE_IN_BACKGROUND = 0,
248 APP_STATE_IN_FOREGROUND
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;
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,
291 TG_BUDDY_LIST_SELECTION_STATE,
292 TG_GROUP_CHAT_NAME_ENTRY_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
310 enum tgl_typing_status {
311 tgl_typing_none = 10001,
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,
321 tgl_typing_choose_contact
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
335 typedef struct user_data {
336 tgl_peer_id_t user_id;
338 int structure_version;
345 char *real_first_name;
346 char *real_last_name;
350 Eina_Bool is_selected;
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;
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,
377 typedef struct tg_chat_info {
387 int user_list_version;
395 typedef struct tg_peer_info {
399 long long last_msg_id;
403 int no_of_unread_msgs;
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;
416 Eina_Bool is_out_message;
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;
424 typedef struct tg_message {
441 int is_marked_for_delete;
444 typedef struct tgl_media {
447 long long access_hash;
461 long long photo_loc_vol1;
463 long long photo_loc_sec1;
471 long long photo_loc_vol2;
473 long long photo_loc_sec2;
481 long long photo_loc_vol3;
483 long long photo_loc_sec3;
491 long long photo_loc_vol4;
493 long long photo_loc_sec4;
509 typedef struct tg_main_list_item {
510 char* peer_print_name;
517 int last_msg_service;
518 int number_of_unread_msgs;
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;
532 typedef struct appdata {
535 Evas_Object* conform;
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;
546 Eina_List *main_list;
548 Eina_List *search_peer_list;
550 int curtimezoneoffset;
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;
562 Eina_Bool is_last_msg_changed;
563 Evas_Object* loading_popup;
564 Eina_Bool is_tg_initilized;
566 char *chat_background;
567 //Eina_Bool is_long_pressed;
568 Evas_Object *msg_popup;
570 //user_data_with_pic_s *selected_buddy_item;
571 user_data_s *selected_buddy_item;
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;
579 int screen_mode_for_fb; // for floating button icon
580 Evas_Object *menu_popup;
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;
593 char *country_code_buffer;
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);
611 static char *trim(char *s) {
614 return NULL; // handle NULL string
616 return s; // handle empty string
617 for (ptr = s + strlen(s) - 1; (ptr >= s) && isspace(*ptr); --ptr);
623 static inline char* trim(const char * s)
631 while (isspace(s[l - 1])) {
635 while (*s && isspace(*s)) {
639 return strndup(s, l);
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);
646 static inline void telegram_image_mask_delete_cb(Evas_Object *obj)
651 void *mask = evas_object_image_data_get(obj, EINA_TRUE);
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);
663 static inline void buddy_icon_del_cb(void *data, Evas *e, Evas_Object *icon, void *event_info)
665 user_data_with_pic_s *item = data;
666 item->contact_icon = NULL;
669 static inline const char *ui_utils_get_resource(const char *res_name)
671 static char res_path[PATH_MAX] = {'\0'};
673 char *res_path_buff = app_get_resource_path();
674 if (!res_path_buff) {
677 snprintf(res_path, sizeof(res_path) - 1, "%s%s", res_path_buff, res_name);
683 static inline char *get_current_time()
685 Eina_Strbuf *strbuf = eina_strbuf_new();
686 time_t local_time = time(NULL);
689 struct tm *time_info = localtime(&local_time);
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);
698 static inline char *replace(const char *s, char ch, const char *repl)
703 for(t = s; *t; t++) {
707 size_t rlen = strlen(repl);
708 char *res = malloc(strlen(s) + (rlen - 1) * count + 1);
711 for(t = s; *t; t++) {
713 memcpy(ptr, repl, rlen);
724 static inline Evas_Object * create_scroller(Evas_Object *parent)
726 Evas_Object *scroller = elm_scroller_add(parent);
730 * Handling this exceptional cases.
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);
740 static inline int telegram_is_drm_file(const char *file_path)
745 static inline TELEGRAM_APP_FILE_TYPE_E __telegram_common_get_file_type_by_file_ext(const char *file_ext, const char *fullpath)
749 if (file_ext == NULL) {
750 LOGI("file_ext is NULL");
751 return TELEGRAM_APP_FILE_TYPE_ETC;
758 if (strcasecmp("SF", ptr) == 0) {
759 return TELEGRAM_APP_FILE_TYPE_VIDEO;
761 if (strcasecmp("MR", ptr) == 0) {
762 return TELEGRAM_APP_FILE_TYPE_VOICE;
764 if (strcasecmp("WB", ptr) == 0) {
765 return TELEGRAM_APP_FILE_TYPE_VOICE;
767 if (strcasecmp("AC", ptr) == 0) {
768 return TELEGRAM_APP_FILE_TYPE_MUSIC;
770 if (strcasecmp("VI", ptr) == 0) {
771 return TELEGRAM_APP_FILE_TYPE_VIDEO;
777 if (strcasecmp("MP", ptr) == 0) {
778 return TELEGRAM_APP_FILE_TYPE_IMAGE;
784 if (strcasecmp("OC", ptr) == 0) {
785 return TELEGRAM_APP_FILE_TYPE_DOC;
787 if (strcasecmp("OCX", ptr) == 0) {
788 return TELEGRAM_APP_FILE_TYPE_DOC;
790 if (strcasecmp("IVX", ptr) == 0) {
791 if (telegram_is_drm_file(fullpath) == 0) {
792 return TELEGRAM_APP_FILE_TYPE_DRM;
794 return TELEGRAM_APP_FILE_TYPE_VIDEO;
797 if (strcasecmp("CF", ptr) == 0) {
798 return TELEGRAM_APP_FILE_TYPE_DRM;
800 if (strcasecmp("M", ptr) == 0) {
801 return TELEGRAM_APP_FILE_TYPE_DRM;
807 if (strcasecmp("IF", ptr) == 0) {
808 return TELEGRAM_APP_FILE_TYPE_IMAGE;
810 if (strcasecmp("72", ptr) == 0) {
811 return TELEGRAM_APP_FILE_TYPE_MUSIC;
817 if (strcasecmp("TML", ptr) == 0) {
818 return TELEGRAM_APP_FILE_TYPE_HTML;
820 if (strcasecmp("TM", ptr) == 0) {
821 return TELEGRAM_APP_FILE_TYPE_HTML;
827 if (strcasecmp("MY", ptr) == 0) {
828 return TELEGRAM_APP_FILE_TYPE_MUSIC;
830 if (strcasecmp("CS", ptr) == 0) {
831 return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
837 if (strcasecmp("PG", ptr) == 0) {
838 return TELEGRAM_APP_FILE_TYPE_IMAGE;
840 if (strcasecmp("PEG", ptr) == 0) {
841 return TELEGRAM_APP_FILE_TYPE_IMAGE;
843 if (strcasecmp("PE", ptr) == 0) {
844 return TELEGRAM_APP_FILE_TYPE_IMAGE;
850 if (strcasecmp("MF", ptr) == 0) {
851 return TELEGRAM_APP_FILE_TYPE_MUSIC;
853 if (strcasecmp("P3", ptr) == 0) {
854 return TELEGRAM_APP_FILE_TYPE_MUSIC;
856 if (strcasecmp("ID", ptr) == 0) {
857 return TELEGRAM_APP_FILE_TYPE_MUSIC;
859 if (strcasecmp("IDI", ptr) == 0) {
860 return TELEGRAM_APP_FILE_TYPE_MUSIC;
862 if (strcasecmp("P4", ptr) == 0) {
863 return TELEGRAM_APP_FILE_TYPE_VIDEO;
865 if (strcasecmp("PG", ptr) == 0) {
866 return TELEGRAM_APP_FILE_TYPE_VIDEO;
868 if (strcasecmp("PEG", ptr) == 0) {
869 return TELEGRAM_APP_FILE_TYPE_VIDEO;
871 if (strcasecmp("4A", ptr) == 0) {
872 return TELEGRAM_APP_FILE_TYPE_MUSIC;
874 if (strcasecmp("3G", ptr) == 0) {
875 return TELEGRAM_APP_FILE_TYPE_FLASH;
877 if (strcasecmp("XMF", ptr) == 0) {
878 return TELEGRAM_APP_FILE_TYPE_MUSIC;
880 if (strcasecmp("KV", ptr) == 0) {
881 return TELEGRAM_APP_FILE_TYPE_VIDEO;
887 if (strcasecmp("pml", ptr) == 0) {
888 return TELEGRAM_APP_FILE_TYPE_RSS;
890 if (strcasecmp("DF", ptr) == 0) {
891 return TELEGRAM_APP_FILE_TYPE_DRM;
893 if (strcasecmp("RO", ptr) == 0) {
894 return TELEGRAM_APP_FILE_TYPE_DRM;
900 if (strcasecmp("NG", ptr) == 0) {
901 return TELEGRAM_APP_FILE_TYPE_IMAGE;
903 if (strcasecmp("JPEG", ptr) == 0) {
904 return TELEGRAM_APP_FILE_TYPE_IMAGE;
906 if (strcasecmp("DF", ptr) == 0) {
907 return TELEGRAM_APP_FILE_TYPE_PDF;
909 if (strcasecmp("PT", ptr) == 0) {
910 return TELEGRAM_APP_FILE_TYPE_PPT;
912 if (strcasecmp("PTX", ptr) == 0) {
913 return TELEGRAM_APP_FILE_TYPE_PPT;
919 if (strcasecmp("O", ptr) == 0) {
920 return TELEGRAM_APP_FILE_TYPE_DRM;
926 if (strcasecmp("DP", ptr) == 0) {
927 return TELEGRAM_APP_FILE_TYPE_VIDEO;
929 if (strcasecmp("PM", ptr) == 0) {
930 return TELEGRAM_APP_FILE_TYPE_MUSIC;
932 if (strcasecmp("MP", ptr) == 0) {
933 return TELEGRAM_APP_FILE_TYPE_MUSIC;
935 if (strcasecmp("PF", ptr) == 0) {
936 return TELEGRAM_APP_FILE_TYPE_MUSIC;
938 if (strcasecmp("WF", ptr) == 0) {
939 return TELEGRAM_APP_FILE_TYPE_FLASH;
941 if (strcasecmp("VG", ptr) == 0) {
942 return TELEGRAM_APP_FILE_TYPE_SVG;
944 if (strcasecmp("VGZ", ptr) == 0) {
945 return TELEGRAM_APP_FILE_TYPE_SVG;
951 if (strcasecmp("XT", ptr) == 0) {
952 return TELEGRAM_APP_FILE_TYPE_TXT;
954 if (strcasecmp("PK", ptr) == 0) {
955 return TELEGRAM_APP_FILE_TYPE_TPK;
961 if (strcasecmp("CF", ptr) == 0) {
962 return TELEGRAM_APP_FILE_TYPE_VCONTACT;
964 if (strcasecmp("TS", ptr) == 0) {
965 return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
967 if (strcasecmp("CS", ptr) == 0) {
968 return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
974 if (strcasecmp("AV", ptr) == 0) {
975 return TELEGRAM_APP_FILE_TYPE_MUSIC;
977 if (strcasecmp("BMP", ptr) == 0) {
978 return TELEGRAM_APP_FILE_TYPE_IMAGE;
980 if (strcasecmp("GT", ptr) == 0) {
981 return TELEGRAM_APP_FILE_TYPE_WGT;
983 if (strcasecmp("MA", ptr) == 0) {
984 return TELEGRAM_APP_FILE_TYPE_MUSIC;
986 if (strcasecmp("MV", ptr) == 0) {
987 return TELEGRAM_APP_FILE_TYPE_VIDEO;
993 if (strcasecmp("LS", ptr) == 0) {
994 return TELEGRAM_APP_FILE_TYPE_EXCEL;
996 if (strcasecmp("LSX", ptr) == 0) {
997 return TELEGRAM_APP_FILE_TYPE_EXCEL;
999 if (strcasecmp("MF", ptr) == 0) {
1000 return TELEGRAM_APP_FILE_TYPE_MUSIC;
1002 if (strcasecmp("HTML", ptr) == 0) {
1003 return TELEGRAM_APP_FILE_TYPE_HTML;
1008 if (strcasecmp("GP", ptr) == 0) {
1009 return TELEGRAM_APP_FILE_TYPE_VIDEO;
1011 if (strcasecmp("GPP", ptr) == 0) {
1012 return TELEGRAM_APP_FILE_TYPE_VIDEO;
1014 if (strcasecmp("G2", ptr) == 0) {
1015 return TELEGRAM_APP_FILE_TYPE_VIDEO;
1019 return TELEGRAM_APP_FILE_TYPE_ETC;
1022 static inline char* telegram_common_get_file_ext(const char *a_pszfile_name)
1024 if (a_pszfile_name != NULL) {
1025 int nlen = strlen(a_pszfile_name);
1026 char *psztemp = (char *)a_pszfile_name + nlen;
1030 if (*psztemp == '.') {
1042 static inline TELEGRAM_APP_FILE_TYPE_E telegram_common_get_file_type(const char *filepath)
1044 TELEGRAM_APP_FILE_TYPE_E file_type = TELEGRAM_APP_FILE_TYPE_NONE;
1045 if(filepath == NULL)
1047 return TELEGRAM_APP_FILE_TYPE_NONE;
1049 char *file_ext = telegram_common_get_file_ext(filepath);
1052 file_type = __telegram_common_get_file_type_by_file_ext(file_ext, filepath);
1054 LOGI("file_ext is NULL");
1060 extern uint64_t get_time_stamp_in_macro();
1062 extern void wait_for(unsigned int secs);
1064 typedef struct _telegram_Time
1068 int ampm; /* 0 for AM, 1 for PM */
1074 telegram_TIME_FORMAT_12H = 0,
1075 telegram_TIME_FORMAT_24H,
1076 telegram_TIME_FORMAT_UNKNOWN
1078 } telegram_time_format;
1080 typedef struct Buddy {
1084 char* initialConsonant;
1097 char relationHideFlag;
1099 char knownPhoneNumberFlag;
1100 char phoneNumberShowFlag;
1101 char whoBlindMeFlag;
1111 extern void load_list_of_countries(appdata_s *ad);
1113 extern void app_get_resource(const char *edj_file_in, char *edj_path_out, int edj_path_max);
1115 extern char* get_budy_state(appdata_s* ad, int buddy_id);
1117 extern Eina_Bool get_thumbnail_from_video_url(const char *file_path, char **thumbnail_path);
1119 extern void show_loading_popup(appdata_s* ad);
1121 extern void hide_loading_popup(appdata_s* ad);
1123 extern void free_user_data(user_data_s *user_data);
1125 extern void app_nf_back_cb(void *data, Evas_Object *obj, void *event_info);
1127 extern TelegramAppDirection tg_get_device_orientation();
1129 extern void update_ccurrent_view(appdata_s *ad);
1131 extern void tg_notification_create(appdata_s *app_data, char * icon_path, const char *title, char *content, char *sound_path, char *app_id);
1133 extern void create_floating_button(appdata_s* ad);
1135 extern void delete_floating_button(appdata_s* ad);
1137 extern void show_floating_button(appdata_s* ad);
1139 extern void update_floating_button(appdata_s* ad, int mode);
1141 extern void on_new_message_clicked(void *data, Evas_Object *obj, void *event_info);
1143 extern void on_floating_icon_clicked(void *data, Evas_Object *obj, void *event_info);
1145 extern char *str_replace(char *orig, char *rep, char *with);
1147 extern Eina_Bool on_load_main_view_requested(void *data);
1149 extern void launch_tg_server(void *data);
1151 extern void recursive_dir_copy(const char *src_dir, const char *tar_dir);
1153 extern char* get_peer_name(tg_peer_info_s* peer_info);
1155 extern void set_peer_names(tg_peer_info_s* peer_info, tg_main_list_item_s* main_list_item);
1157 #endif /* TG_COMMON_H_ */