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_client"
29 #define EDJ_REG_FILE "edje/telegram_tizen_reg.edj"
30 #define EDJ_LOGIN_FILE "edje/telegram_tizen_login.edj"
31 #define EDJ_CHAT_LIST_FILE "edje/telegram_chat_list.edj"
32 #define EDJ_CHAT_CONV_FILE "edje/telegram_chat_conv.edj"
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 20
225 #define MIN_NUM_LENGTH 5
226 #define MAX_CODE_LENGTH 5
227 #define MAX_USERNAME_LENGTH 15
228 #define MIN_USERNAME_LENGTH 5
236 typedef enum _TelegramAppDirection {
237 TELEGRAM_TARGET_DIRECTION_INVAILD = -1,
238 TELEGRAM_TARGET_DIRECTION_PORTRAIT = 0,
239 TELEGRAM_TARGET_DIRECTION_LANDSCAPE_INVERSE = 90,
240 TELEGRAM_TARGET_DIRECTION_PORTRAIT_INVERSE = 180,
241 TELEGRAM_TARGET_DIRECTION_LANDSCAPE = 270,
242 TELEGRAM_TARGET_DIRECTION_MAX,
243 } TelegramAppDirection;
248 APP_STATE_IN_BACKGROUND = 0,
249 APP_STATE_IN_FOREGROUND
253 TELEGRAM_APP_FILE_TYPE_NONE = 0,
254 TELEGRAM_APP_FILE_TYPE_IMAGE, /**< Image category */
255 TELEGRAM_APP_FILE_TYPE_VIDEO, /**< Video category */
256 TELEGRAM_APP_FILE_TYPE_MUSIC, /**< Music category */
257 TELEGRAM_APP_FILE_TYPE_STICKER, /** Sticker / Anicon category */
258 TELEGRAM_APP_FILE_TYPE_PDF, /**< Pdf category */
259 TELEGRAM_APP_FILE_TYPE_DOC, /**< Word category */
260 TELEGRAM_APP_FILE_TYPE_PPT, /**< Powerpoint category */
261 TELEGRAM_APP_FILE_TYPE_EXCEL, /**< Excel category */
262 TELEGRAM_APP_FILE_TYPE_VOICE, /**< Voice category */
263 TELEGRAM_APP_FILE_TYPE_HTML, /**< Html category */
264 TELEGRAM_APP_FILE_TYPE_FLASH, /**< Flash category */
265 TELEGRAM_APP_FILE_TYPE_TXT, /**< Txt category */
266 TELEGRAM_APP_FILE_TYPE_VCONTACT, /**< Vcontact category */
267 TELEGRAM_APP_FILE_TYPE_VCALENDAR, /**< Vcalendar category */
268 TELEGRAM_APP_FILE_TYPE_VNOTE, /**< Vnote category */
269 TELEGRAM_APP_FILE_TYPE_VBOOKMARK, /**< Vbookmark category */
270 TELEGRAM_APP_FILE_TYPE_SNB, /**< Snotes category */
271 TELEGRAM_APP_FILE_TYPE_SVG, /**< Svg category */
272 TELEGRAM_APP_FILE_TYPE_RSS, /**< Rss reader file, *.opml */
273 TELEGRAM_APP_FILE_TYPE_JAVA, /**< java file, *.jad, *.jar */
274 TELEGRAM_APP_FILE_TYPE_WGT, /**< wrt , *.wgt, *.wgt */
275 TELEGRAM_APP_FILE_TYPE_TPK, /**< *.tpk */
276 TELEGRAM_APP_FILE_TYPE_HWP, /**< *.hwp */
277 TELEGRAM_APP_FILE_TYPE_EMAIL, /**< *.eml */
278 TELEGRAM_APP_FILE_TYPE_DRM, /**< drm file , *.dcf */
279 TELEGRAM_APP_FILE_TYPE_ZIP, /**< zip compressed file , *.zip */
280 TELEGRAM_APP_FILE_TYPE_ETC, /**< Other files category */
281 TELEGRAM_APP_FILE_TYPE_MAX
282 } TELEGRAM_APP_FILE_TYPE_E;
285 typedef enum state_of_app {
286 TG_SPLASH_SCREEN_STATE,
287 TG_INIT_SCREEN_STATE,
288 TG_REGISTRATION_STATE,
289 TG_PROFILE_REGISTRATION_STATE,
292 TG_BUDDY_LIST_SELECTION_STATE,
293 TG_GROUP_CHAT_NAME_ENTRY_STATE,
295 TG_BUDDY_CHAT_CONV_STATE,
296 TG_USER_MAIN_VIEW_STATE,
297 TG_USER_MAIN_VIEW_SELECTION_STATE,
298 TG_START_MESSAGING_VIEW_STATE,
299 TG_CHAT_MESSAGING_VIEW_STATE,
300 TG_PEER_SEARCH_VIEW_STATE,
301 TG_SETTINGS_SCREEN_STATE,
302 TG_SETTINGS_EDIT_NAME_STATE,
303 TG_SET_USERNAME_STATE,
304 TG_SET_USER_INFO_STATE,
305 TG_SET_CHAT_INFO_STATE,
306 TG_SELECT_BUDDY_VIEW,
307 TG_ADD_CONTACT_STATE,
308 TG_COUNTRY_SELECTION_VIEW
311 enum tgl_typing_status {
312 tgl_typing_none = 10001,
315 tgl_typing_record_video,
316 tgl_typing_upload_video,
317 tgl_typing_record_audio,
318 tgl_typing_upload_audio,
319 tgl_typing_upload_photo,
320 tgl_typing_upload_document,
322 tgl_typing_choose_contact
325 typedef enum MESSAGE_STATE {
326 TG_MESSAGE_STATE_SENDING = 1,
327 TG_MESSAGE_STATE_SENT,
328 TG_MESSAGE_STATE_DELIVERED,
329 TG_MESSAGE_STATE_FAILED,
330 TG_MESSAGE_STATE_RECEIVED,
331 TG_MESSAGE_STATE_READ,
332 TG_MESSAGE_STATE_UNKNOWN
336 typedef struct user_data {
337 tgl_peer_id_t user_id;
339 int structure_version;
346 char *real_first_name;
347 char *real_last_name;
349 char *highlight_name;
352 Eina_Bool is_selected;
358 typedef struct user_data_with_pic {
359 user_data_s *use_data;
360 //char* pic_file_location;
361 Evas_Object *contact_icon;
362 } user_data_with_pic_s;
364 enum tgl_message_media_type {
365 tgl_message_media_none = 1001,
366 tgl_message_media_photo,
367 //tgl_message_media_video,
368 //tgl_message_media_audio,
369 tgl_message_media_document,
370 tgl_message_media_geo,
371 tgl_message_media_contact,
372 tgl_message_media_unsupported,
373 tgl_message_media_photo_encr,
374 //tgl_message_media_video_encr,
375 //tgl_message_media_audio_encr,
376 tgl_message_media_document_encr,
379 typedef struct tg_chat_info {
389 int user_list_version;
397 typedef struct tg_peer_info {
401 long long last_msg_id;
405 int no_of_unread_msgs;
412 typedef struct peer_with_pic {
413 tg_peer_info_s *use_data;
414 Evas_Object *contact_icon;
415 Evas_Object *name_object;
416 Evas_Object *msg_object;
418 Eina_Bool is_out_message;
421 typedef struct group_chat_with_pic {
422 tg_chat_info_s *use_data;
423 Evas_Object *contact_icon;
424 } group_chat_with_pic_s;
426 typedef struct tg_message {
443 int is_marked_for_delete;
446 typedef struct tgl_media {
449 long long access_hash;
463 long long photo_loc_vol1;
465 long long photo_loc_sec1;
473 long long photo_loc_vol2;
475 long long photo_loc_sec2;
483 long long photo_loc_vol3;
485 long long photo_loc_sec3;
493 long long photo_loc_vol4;
495 long long photo_loc_sec4;
511 typedef struct tg_main_list_item {
512 char* peer_print_name;
519 int last_msg_service;
520 int number_of_unread_msgs;
522 Eina_Bool is_out_msg;
523 char* profile_pic_path;
524 Evas_Object* profile_pic;
525 Evas_Object* user_name_lbl;
526 Evas_Object* status_lbl;
527 Evas_Object* date_lbl;
528 Evas_Object* msg_status_lbl;
529 Evas_Object* main_item_layout;
530 Eina_Bool is_selected;
531 char *buddy_display_name;
532 char *highlight_text;
533 } tg_main_list_item_s;
535 typedef struct appdata {
538 Evas_Object* conform;
543 Eina_List *buddy_list;
544 Eina_List *known_buddy_list;
545 Eina_List *unknown_buddy_list;
546 //Eina_List *group_chat_list;
547 Eina_List *peer_list;
549 Eina_List *main_list;
551 Eina_List *search_peer_list;
553 int curtimezoneoffset;
555 tgl_peer_id_t user_id;
556 state_of_app_s current_app_state;
557 user_data_s *current_user_data;
558 tg_main_list_item_s* main_item_in_cahtting_data;
559 peer_with_pic_s* peer_in_cahtting_data;
560 user_data_with_pic_s* buddy_in_cahtting_data;
561 service_client* service_client;
562 Eina_Bool is_first_time_registration;
563 Eina_List *loaded_msg_list;
565 Eina_Bool is_last_msg_changed;
566 Evas_Object* loading_popup;
567 Eina_Bool is_tg_initilized;
569 char *chat_background;
570 //Eina_Bool is_long_pressed;
571 Evas_Object *msg_popup;
573 //user_data_with_pic_s *selected_buddy_item;
574 user_data_s *selected_buddy_item;
576 app_visible_state s_app_visible_state;
577 notification_h s_notififcation;
578 Eina_Bool is_server_ready;
579 Eina_Bool is_waiting_for_phone_num;
580 Ecore_Timer *login_timer;
581 TelegramAppDirection target_direction;
582 Evas_Object *floating_btn;
584 int screen_mode_for_fb; // for floating button icon
585 Evas_Object *menu_popup;
587 Eina_List *contact_list;
588 Elm_Naviframe_Item *main_item;
589 Eina_Bool is_loading_from_msg_view;
590 Eina_Bool is_loading_from_profile_view;
591 //int size_of_listed_countries;
592 //char *country_names[COUNTRIES_SIZE];
593 //char *country_codes[COUNTRIES_SIZE];
594 Eina_List *country_names_list;
595 Eina_List *country_codes_list;
596 int selected_country_id;
598 char *country_code_buffer;
601 extern void show_toast(appdata_s* ad, char* value);
602 extern void layout_back_cb(void *data, Evas_Object *obj, void *event_info);
603 extern void tg_login_nf_back_cb(void *data, Evas_Object *obj, void *event_info);
604 extern void detail_list_nf_back_cb(void *data, Evas_Object *obj, void *event_info);
605 extern void create_buddy_msg_table(const char* table_name);
606 extern void load_buddy_list_data(appdata_s *ad);
607 extern void load_unknown_buddy_list_data(appdata_s *ad);
608 //extern void load_group_chat_data(appdata_s *ad);
609 extern void load_peer_data(appdata_s *ad);
610 extern void load_registered_user_data(appdata_s *ad);
611 extern void load_main_list_data(appdata_s *ad);
612 extern void launch_app_control(appdata_s *ad, char *media_type, char *url);
613 extern void free_message(tg_message_s **message);
616 static char *trim(char *s) {
619 return NULL; // handle NULL string
621 return s; // handle empty string
622 for (ptr = s + strlen(s) - 1; (ptr >= s) && isspace(*ptr); --ptr);
628 static inline char* trim(const char * s)
636 while (isspace(s[l - 1])) {
640 while (*s && isspace(*s)) {
644 return strndup(s, l);
647 extern Evas_Object* create_circle_button(Evas_Object *parent, char* text, char* filepath);
648 extern Evas_Object* create_button(Evas_Object *parent, char *style, char *text);
649 extern int numbers_only(const char *s);
651 static inline void telegram_image_mask_delete_cb(Evas_Object *obj)
656 void *mask = evas_object_image_data_get(obj, EINA_TRUE);
663 extern tg_main_list_item_s* get_latest_item(appdata_s *ad, peer_with_pic_s *item);
664 //static char* get_table_name_from_number(const char* phone_no)
665 extern char* get_table_name_from_number(const int id);
666 extern Eina_Bool compare_date_with_current_date(int rtime);
668 static inline void buddy_icon_del_cb(void *data, Evas *e, Evas_Object *icon, void *event_info)
670 user_data_with_pic_s *item = data;
671 item->contact_icon = NULL;
674 static inline const char *ui_utils_get_resource(const char *res_name)
676 static char res_path[PATH_MAX] = {'\0'};
678 char *res_path_buff = app_get_resource_path();
679 if (!res_path_buff) {
682 snprintf(res_path, sizeof(res_path) - 1, "%s%s", res_path_buff, res_name);
688 static inline char *get_current_time()
690 Eina_Strbuf *strbuf = eina_strbuf_new();
691 time_t local_time = time(NULL);
694 struct tm *time_info = localtime(&local_time);
696 strftime(buf, 200, "%l:%M", time_info);
697 eina_strbuf_append_printf(strbuf, "%s %s", buf, (time_info->tm_hour >= 12) ? "PM":"AM");
698 ret = eina_strbuf_string_steal(strbuf);
699 eina_strbuf_free(strbuf);
703 static inline char *replace(const char *s, char ch, const char *repl)
708 for(t = s; *t; t++) {
712 size_t rlen = strlen(repl);
713 char *res = malloc(strlen(s) + (rlen - 1) * count + 1);
716 for(t = s; *t; t++) {
718 memcpy(ptr, repl, rlen);
729 static inline Evas_Object * create_scroller(Evas_Object *parent)
731 Evas_Object *scroller = elm_scroller_add(parent);
735 * Handling this exceptional cases.
739 elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_FALSE);
740 elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
741 evas_object_show(scroller);
745 static inline int telegram_is_drm_file(const char *file_path)
750 static inline TELEGRAM_APP_FILE_TYPE_E __telegram_common_get_file_type_by_file_ext(const char *file_ext, const char *fullpath)
754 if (file_ext == NULL) {
755 LOGI("file_ext is NULL");
756 return TELEGRAM_APP_FILE_TYPE_ETC;
763 if (strcasecmp("SF", ptr) == 0) {
764 return TELEGRAM_APP_FILE_TYPE_VIDEO;
766 if (strcasecmp("MR", ptr) == 0) {
767 return TELEGRAM_APP_FILE_TYPE_VOICE;
769 if (strcasecmp("WB", ptr) == 0) {
770 return TELEGRAM_APP_FILE_TYPE_VOICE;
772 if (strcasecmp("AC", ptr) == 0) {
773 return TELEGRAM_APP_FILE_TYPE_MUSIC;
775 if (strcasecmp("VI", ptr) == 0) {
776 return TELEGRAM_APP_FILE_TYPE_VIDEO;
782 if (strcasecmp("MP", ptr) == 0) {
783 return TELEGRAM_APP_FILE_TYPE_IMAGE;
789 if (strcasecmp("OC", ptr) == 0) {
790 return TELEGRAM_APP_FILE_TYPE_DOC;
792 if (strcasecmp("OCX", ptr) == 0) {
793 return TELEGRAM_APP_FILE_TYPE_DOC;
795 if (strcasecmp("IVX", ptr) == 0) {
796 if (telegram_is_drm_file(fullpath) == 0) {
797 return TELEGRAM_APP_FILE_TYPE_DRM;
799 return TELEGRAM_APP_FILE_TYPE_VIDEO;
802 if (strcasecmp("CF", ptr) == 0) {
803 return TELEGRAM_APP_FILE_TYPE_DRM;
805 if (strcasecmp("M", ptr) == 0) {
806 return TELEGRAM_APP_FILE_TYPE_DRM;
812 if (strcasecmp("IF", ptr) == 0) {
813 return TELEGRAM_APP_FILE_TYPE_IMAGE;
815 if (strcasecmp("72", ptr) == 0) {
816 return TELEGRAM_APP_FILE_TYPE_MUSIC;
822 if (strcasecmp("TML", ptr) == 0) {
823 return TELEGRAM_APP_FILE_TYPE_HTML;
825 if (strcasecmp("TM", ptr) == 0) {
826 return TELEGRAM_APP_FILE_TYPE_HTML;
832 if (strcasecmp("MY", ptr) == 0) {
833 return TELEGRAM_APP_FILE_TYPE_MUSIC;
835 if (strcasecmp("CS", ptr) == 0) {
836 return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
842 if (strcasecmp("PG", ptr) == 0) {
843 return TELEGRAM_APP_FILE_TYPE_IMAGE;
845 if (strcasecmp("PEG", ptr) == 0) {
846 return TELEGRAM_APP_FILE_TYPE_IMAGE;
848 if (strcasecmp("PE", ptr) == 0) {
849 return TELEGRAM_APP_FILE_TYPE_IMAGE;
855 if (strcasecmp("MF", ptr) == 0) {
856 return TELEGRAM_APP_FILE_TYPE_MUSIC;
858 if (strcasecmp("P3", ptr) == 0) {
859 return TELEGRAM_APP_FILE_TYPE_MUSIC;
861 if (strcasecmp("ID", ptr) == 0) {
862 return TELEGRAM_APP_FILE_TYPE_MUSIC;
864 if (strcasecmp("IDI", ptr) == 0) {
865 return TELEGRAM_APP_FILE_TYPE_MUSIC;
867 if (strcasecmp("P4", ptr) == 0) {
868 return TELEGRAM_APP_FILE_TYPE_VIDEO;
870 if (strcasecmp("PG", ptr) == 0) {
871 return TELEGRAM_APP_FILE_TYPE_VIDEO;
873 if (strcasecmp("PEG", ptr) == 0) {
874 return TELEGRAM_APP_FILE_TYPE_VIDEO;
876 if (strcasecmp("4A", ptr) == 0) {
877 return TELEGRAM_APP_FILE_TYPE_MUSIC;
879 if (strcasecmp("3G", ptr) == 0) {
880 return TELEGRAM_APP_FILE_TYPE_FLASH;
882 if (strcasecmp("XMF", ptr) == 0) {
883 return TELEGRAM_APP_FILE_TYPE_MUSIC;
885 if (strcasecmp("KV", ptr) == 0) {
886 return TELEGRAM_APP_FILE_TYPE_VIDEO;
892 if (strcasecmp("pml", ptr) == 0) {
893 return TELEGRAM_APP_FILE_TYPE_RSS;
895 if (strcasecmp("DF", ptr) == 0) {
896 return TELEGRAM_APP_FILE_TYPE_DRM;
898 if (strcasecmp("RO", ptr) == 0) {
899 return TELEGRAM_APP_FILE_TYPE_DRM;
905 if (strcasecmp("NG", ptr) == 0) {
906 return TELEGRAM_APP_FILE_TYPE_IMAGE;
908 if (strcasecmp("JPEG", ptr) == 0) {
909 return TELEGRAM_APP_FILE_TYPE_IMAGE;
911 if (strcasecmp("DF", ptr) == 0) {
912 return TELEGRAM_APP_FILE_TYPE_PDF;
914 if (strcasecmp("PT", ptr) == 0) {
915 return TELEGRAM_APP_FILE_TYPE_PPT;
917 if (strcasecmp("PTX", ptr) == 0) {
918 return TELEGRAM_APP_FILE_TYPE_PPT;
924 if (strcasecmp("O", ptr) == 0) {
925 return TELEGRAM_APP_FILE_TYPE_DRM;
931 if (strcasecmp("DP", ptr) == 0) {
932 return TELEGRAM_APP_FILE_TYPE_VIDEO;
934 if (strcasecmp("PM", ptr) == 0) {
935 return TELEGRAM_APP_FILE_TYPE_MUSIC;
937 if (strcasecmp("MP", ptr) == 0) {
938 return TELEGRAM_APP_FILE_TYPE_MUSIC;
940 if (strcasecmp("PF", ptr) == 0) {
941 return TELEGRAM_APP_FILE_TYPE_MUSIC;
943 if (strcasecmp("WF", ptr) == 0) {
944 return TELEGRAM_APP_FILE_TYPE_FLASH;
946 if (strcasecmp("VG", ptr) == 0) {
947 return TELEGRAM_APP_FILE_TYPE_SVG;
949 if (strcasecmp("VGZ", ptr) == 0) {
950 return TELEGRAM_APP_FILE_TYPE_SVG;
956 if (strcasecmp("XT", ptr) == 0) {
957 return TELEGRAM_APP_FILE_TYPE_TXT;
959 if (strcasecmp("PK", ptr) == 0) {
960 return TELEGRAM_APP_FILE_TYPE_TPK;
966 if (strcasecmp("CF", ptr) == 0) {
967 return TELEGRAM_APP_FILE_TYPE_VCONTACT;
969 if (strcasecmp("TS", ptr) == 0) {
970 return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
972 if (strcasecmp("CS", ptr) == 0) {
973 return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
979 if (strcasecmp("AV", ptr) == 0) {
980 return TELEGRAM_APP_FILE_TYPE_MUSIC;
982 if (strcasecmp("BMP", ptr) == 0) {
983 return TELEGRAM_APP_FILE_TYPE_IMAGE;
985 if (strcasecmp("GT", ptr) == 0) {
986 return TELEGRAM_APP_FILE_TYPE_WGT;
988 if (strcasecmp("MA", ptr) == 0) {
989 return TELEGRAM_APP_FILE_TYPE_MUSIC;
991 if (strcasecmp("MV", ptr) == 0) {
992 return TELEGRAM_APP_FILE_TYPE_VIDEO;
998 if (strcasecmp("LS", ptr) == 0) {
999 return TELEGRAM_APP_FILE_TYPE_EXCEL;
1001 if (strcasecmp("LSX", ptr) == 0) {
1002 return TELEGRAM_APP_FILE_TYPE_EXCEL;
1004 if (strcasecmp("MF", ptr) == 0) {
1005 return TELEGRAM_APP_FILE_TYPE_MUSIC;
1007 if (strcasecmp("HTML", ptr) == 0) {
1008 return TELEGRAM_APP_FILE_TYPE_HTML;
1013 if (strcasecmp("GP", ptr) == 0) {
1014 return TELEGRAM_APP_FILE_TYPE_VIDEO;
1016 if (strcasecmp("GPP", ptr) == 0) {
1017 return TELEGRAM_APP_FILE_TYPE_VIDEO;
1019 if (strcasecmp("G2", ptr) == 0) {
1020 return TELEGRAM_APP_FILE_TYPE_VIDEO;
1024 return TELEGRAM_APP_FILE_TYPE_ETC;
1027 static inline char* telegram_common_get_file_ext(const char *a_pszfile_name)
1029 if (a_pszfile_name != NULL) {
1030 int nlen = strlen(a_pszfile_name);
1031 char *psztemp = (char *)a_pszfile_name + nlen;
1035 if (*psztemp == '.') {
1047 static inline TELEGRAM_APP_FILE_TYPE_E telegram_common_get_file_type(const char *filepath)
1049 TELEGRAM_APP_FILE_TYPE_E file_type = TELEGRAM_APP_FILE_TYPE_NONE;
1050 if(filepath == NULL)
1052 return TELEGRAM_APP_FILE_TYPE_NONE;
1054 char *file_ext = telegram_common_get_file_ext(filepath);
1057 file_type = __telegram_common_get_file_type_by_file_ext(file_ext, filepath);
1059 LOGI("file_ext is NULL");
1065 extern uint64_t get_time_stamp_in_macro();
1067 extern void wait_for(unsigned int secs);
1069 typedef struct _telegram_Time
1073 int ampm; /* 0 for AM, 1 for PM */
1079 telegram_TIME_FORMAT_12H = 0,
1080 telegram_TIME_FORMAT_24H,
1081 telegram_TIME_FORMAT_UNKNOWN
1083 } telegram_time_format;
1085 typedef struct Buddy {
1089 char* initialConsonant;
1102 char relationHideFlag;
1104 char knownPhoneNumberFlag;
1105 char phoneNumberShowFlag;
1106 char whoBlindMeFlag;
1116 extern void load_list_of_countries(appdata_s *ad);
1118 extern void app_get_resource(const char *edj_file_in, char *edj_path_out, int edj_path_max);
1120 extern char* get_budy_state(appdata_s* ad, int buddy_id);
1122 extern Eina_Bool get_thumbnail_from_video_url(const char *file_path, char **thumbnail_path);
1124 extern void show_loading_popup(appdata_s* ad);
1126 extern void hide_loading_popup(appdata_s* ad);
1128 extern void free_user_data(user_data_s *user_data);
1130 extern void app_nf_back_cb(void *data, Evas_Object *obj, void *event_info);
1132 extern TelegramAppDirection tg_get_device_orientation();
1134 extern void update_ccurrent_view(appdata_s *ad);
1136 extern void display_badge_with_notification(int unread_msg_cnt, appdata_s *app);
1138 extern void display_badge(int unread_msg_cnt, appdata_s *app, Eina_Bool is_need_notification);
1140 extern void create_floating_button(appdata_s* ad);
1142 extern void delete_floating_button(appdata_s* ad);
1144 extern void show_floating_button(appdata_s* ad);
1146 extern void update_floating_button(appdata_s* ad, int mode);
1148 extern void on_new_message_clicked(void *data, Evas_Object *obj, void *event_info);
1150 extern void on_floating_icon_clicked(void *data, Evas_Object *obj, void *event_info);
1152 extern char *str_replace(char *orig, char *rep, char *with);
1154 extern char *str_case_replace(char *orig, char *rep, char *with_pre, char *with_fi);
1156 extern Eina_Bool on_load_main_view_requested(void *data);
1158 extern void launch_tg_server(void *data);
1160 extern void recursive_dir_copy(const char *src_dir, const char *tar_dir);
1162 extern char* get_peer_name(tg_peer_info_s* peer_info);
1164 extern void set_peer_names(tg_peer_info_s* peer_info, tg_main_list_item_s* main_list_item);
1166 #endif /* TG_COMMON_H_ */