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 <Elementary.h>
24 #include <system_settings.h>
25 #include <efl_extension.h>
27 #include <app_preference.h>
28 #include "service_client.h"
29 #include <notification.h>
34 #define LOG_TAG "telegram_tizen"
37 #define PACKAGE "org.tizen.telegram_tizen"
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"
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"
51 #define TELEGRAM_START_SCREEN_EDJ "edje/telegram_start_screen.edj"
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"
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"
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"
71 #define TG_SMILEY_ICON FM_ICON_PATH"/telegram_emotion.png"
73 //#define SEND_UNPRESSED_ICON FM_ICON_PATH"/ic_send_pressed.png"
74 //#define SEND_PRESSED_ICON FM_ICON_PATH"/ic_send_unpressed.png"
76 #define TG_SEND_ICON FM_ICON_PATH"/telegram_send.png"
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"
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"
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"
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"
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"
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"
116 #define TG_CHAT_DEFAULT_BG FM_ICON_PATH"background_hd.jpg"
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"
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"
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"
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"
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"
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"
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"
154 #define TG_CHAT_BG_PREFERENCE "chat_view_bg"
156 #define OLD_DIR "/opt/usr/media/telegram"
158 #define LIST_CONTACT_ROUND_MASK_ICON FM_ICON_PATH"/info_page_pic_mask.png"
160 #define TG_LIST_OF_COUNTIRES FM_ICON_PATH"countries.txt"
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"
166 #define FM_OK_BUTTON FM_ICON_PATH"ok_bn_press.png"
167 #define FM_CANCEL_BUTTON FM_ICON_PATH"cancel_bn_press.png"
169 #define TELEGRAM_DEBUG_LOG(fmt, args...) LOGD(" +++ LOG : "fmt, ##args)
171 #define retv_if (expr, val) do { \
173 TELEGRAM_DEBUG_LOG("(%s) -> %s() return", #expr, __func__); \
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; }
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
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"}
206 #define COUNTRIES_SIZE 1000
208 #define NUMBER_OF_MENU_ITEMS 5
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"
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}
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;
231 #define CHAT_BUBBLE_SUB_TEXT_STYLE "<font_size=20 font_weight=Bold color=#000000>%s</font_size>"
235 static Elm_Entry_Filter_Limit_Size limit_filter_data;
236 static Elm_Entry_Filter_Accept_Set accept_set = {
237 .accepted = "0123456789",
241 #define MAX_NUM_LENGTH 10
242 #define MAX_CODE_LENGTH 5
243 #define MAX_USERNAME_LENGTH 15
244 #define MIN_USERNAME_LENGTH 5
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;
264 APP_STATE_IN_BACKGROUND = 0,
265 APP_STATE_IN_FOREGROUND
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;
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,
308 TG_BUDDY_LIST_SELECTION_STATE,
309 TG_GROUP_CHAT_NAME_ENTRY_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
327 enum tgl_typing_status {
328 tgl_typing_none = 10001,
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,
338 tgl_typing_choose_contact
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
352 typedef struct user_data {
353 tgl_peer_id_t user_id;
355 int structure_version;
362 char *real_first_name;
363 char *real_last_name;
367 Eina_Bool is_selected;
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;
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,
394 typedef struct tg_chat_info {
404 int user_list_version;
412 typedef struct tg_peer_info {
416 long long last_msg_id;
420 int no_of_unread_msgs;
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;
433 Eina_Bool is_out_message;
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;
441 typedef struct tg_message {
458 int is_marked_for_delete;
461 typedef struct tgl_media {
464 long long access_hash;
478 long long photo_loc_vol1;
480 long long photo_loc_sec1;
488 long long photo_loc_vol2;
490 long long photo_loc_sec2;
498 long long photo_loc_vol3;
500 long long photo_loc_sec3;
508 long long photo_loc_vol4;
510 long long photo_loc_sec4;
526 typedef struct tg_main_list_item {
527 char* peer_print_name;
534 int last_msg_service;
535 int number_of_unread_msgs;
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;
549 typedef struct appdata {
552 Evas_Object* conform;
557 Eina_List* buddy_list;
558 Eina_List* unknown_buddy_list;
559 //Eina_List* group_chat_list;
560 Eina_List* peer_list;
562 Eina_List* main_list;
564 Eina_List* search_peer_list;
566 int curtimezoneoffset;
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;
578 Eina_Bool is_last_msg_changed;
579 Evas_Object* loading_popup;
580 Eina_Bool is_tg_initilized;
582 char *chat_background;
583 //Eina_Bool is_long_pressed;
584 Evas_Object *msg_popup;
586 //user_data_with_pic_s *selected_buddy_item;
587 user_data_s *selected_buddy_item;
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;
595 int screen_mode_for_fb; // for floating button icon
596 Evas_Object *menu_popup;
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;
608 char *country_code_buffer;
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);
626 static char *trim(char *s) {
629 return NULL; // handle NULL string
631 return s; // handle empty string
632 for (ptr = s + strlen(s) - 1; (ptr >= s) && isspace(*ptr); --ptr);
638 static inline char* trim(const char * s)
646 while (isspace(s[l - 1])) {
650 while (*s && isspace(*s)) {
654 return strndup(s, l);
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);
661 static inline void telegram_image_mask_delete_cb(Evas_Object *obj)
666 void *mask = evas_object_image_data_get(obj, EINA_TRUE);
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);
678 static inline void buddy_icon_del_cb(void *data, Evas *e, Evas_Object *icon, void *event_info)
680 user_data_with_pic_s *item = data;
681 item->contact_icon = NULL;
684 static inline const char *ui_utils_get_resource(const char *res_name)
686 static char res_path[PATH_MAX] = {'\0'};
688 char *res_path_buff = app_get_resource_path();
689 if (!res_path_buff) {
692 snprintf(res_path, sizeof(res_path) - 1, "%s%s", res_path_buff, res_name);
698 static inline char *get_current_time()
700 Eina_Strbuf *strbuf = eina_strbuf_new();
701 time_t local_time = time(NULL);
704 struct tm *time_info = localtime(&local_time);
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);
713 static inline char *replace(const char *s, char ch, const char *repl)
718 for(t = s; *t; t++) {
722 size_t rlen = strlen(repl);
723 char *res = malloc(strlen(s) + (rlen - 1) * count + 1);
726 for(t = s; *t; t++) {
728 memcpy(ptr, repl, rlen);
739 static inline Evas_Object * create_scroller(Evas_Object *parent)
741 Evas_Object *scroller = elm_scroller_add(parent);
745 * Handling this exceptional cases.
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);
755 static inline int telegram_is_drm_file(const char *file_path)
760 static inline TELEGRAM_APP_FILE_TYPE_E __telegram_common_get_file_type_by_file_ext(const char *file_ext, const char *fullpath)
764 if (file_ext == NULL) {
765 LOGI("file_ext is NULL");
766 return TELEGRAM_APP_FILE_TYPE_ETC;
773 if (strcasecmp("SF", ptr) == 0) {
774 return TELEGRAM_APP_FILE_TYPE_VIDEO;
776 if (strcasecmp("MR", ptr) == 0) {
777 return TELEGRAM_APP_FILE_TYPE_VOICE;
779 if (strcasecmp("WB", ptr) == 0) {
780 return TELEGRAM_APP_FILE_TYPE_VOICE;
782 if (strcasecmp("AC", ptr) == 0) {
783 return TELEGRAM_APP_FILE_TYPE_MUSIC;
785 if (strcasecmp("VI", ptr) == 0) {
786 return TELEGRAM_APP_FILE_TYPE_VIDEO;
792 if (strcasecmp("MP", ptr) == 0) {
793 return TELEGRAM_APP_FILE_TYPE_IMAGE;
799 if (strcasecmp("OC", ptr) == 0) {
800 return TELEGRAM_APP_FILE_TYPE_DOC;
802 if (strcasecmp("OCX", ptr) == 0) {
803 return TELEGRAM_APP_FILE_TYPE_DOC;
805 if (strcasecmp("IVX", ptr) == 0) {
806 if (telegram_is_drm_file(fullpath) == 0) {
807 return TELEGRAM_APP_FILE_TYPE_DRM;
809 return TELEGRAM_APP_FILE_TYPE_VIDEO;
812 if (strcasecmp("CF", ptr) == 0) {
813 return TELEGRAM_APP_FILE_TYPE_DRM;
815 if (strcasecmp("M", ptr) == 0) {
816 return TELEGRAM_APP_FILE_TYPE_DRM;
822 if (strcasecmp("IF", ptr) == 0) {
823 return TELEGRAM_APP_FILE_TYPE_IMAGE;
825 if (strcasecmp("72", ptr) == 0) {
826 return TELEGRAM_APP_FILE_TYPE_MUSIC;
832 if (strcasecmp("TML", ptr) == 0) {
833 return TELEGRAM_APP_FILE_TYPE_HTML;
835 if (strcasecmp("TM", ptr) == 0) {
836 return TELEGRAM_APP_FILE_TYPE_HTML;
842 if (strcasecmp("MY", ptr) == 0) {
843 return TELEGRAM_APP_FILE_TYPE_MUSIC;
845 if (strcasecmp("CS", ptr) == 0) {
846 return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
852 if (strcasecmp("PG", ptr) == 0) {
853 return TELEGRAM_APP_FILE_TYPE_IMAGE;
855 if (strcasecmp("PEG", ptr) == 0) {
856 return TELEGRAM_APP_FILE_TYPE_IMAGE;
858 if (strcasecmp("PE", ptr) == 0) {
859 return TELEGRAM_APP_FILE_TYPE_IMAGE;
865 if (strcasecmp("MF", ptr) == 0) {
866 return TELEGRAM_APP_FILE_TYPE_MUSIC;
868 if (strcasecmp("P3", ptr) == 0) {
869 return TELEGRAM_APP_FILE_TYPE_MUSIC;
871 if (strcasecmp("ID", ptr) == 0) {
872 return TELEGRAM_APP_FILE_TYPE_MUSIC;
874 if (strcasecmp("IDI", ptr) == 0) {
875 return TELEGRAM_APP_FILE_TYPE_MUSIC;
877 if (strcasecmp("P4", ptr) == 0) {
878 return TELEGRAM_APP_FILE_TYPE_VIDEO;
880 if (strcasecmp("PG", ptr) == 0) {
881 return TELEGRAM_APP_FILE_TYPE_VIDEO;
883 if (strcasecmp("PEG", ptr) == 0) {
884 return TELEGRAM_APP_FILE_TYPE_VIDEO;
886 if (strcasecmp("4A", ptr) == 0) {
887 return TELEGRAM_APP_FILE_TYPE_MUSIC;
889 if (strcasecmp("3G", ptr) == 0) {
890 return TELEGRAM_APP_FILE_TYPE_FLASH;
892 if (strcasecmp("XMF", ptr) == 0) {
893 return TELEGRAM_APP_FILE_TYPE_MUSIC;
895 if (strcasecmp("KV", ptr) == 0) {
896 return TELEGRAM_APP_FILE_TYPE_VIDEO;
902 if (strcasecmp("pml", ptr) == 0) {
903 return TELEGRAM_APP_FILE_TYPE_RSS;
905 if (strcasecmp("DF", ptr) == 0) {
906 return TELEGRAM_APP_FILE_TYPE_DRM;
908 if (strcasecmp("RO", ptr) == 0) {
909 return TELEGRAM_APP_FILE_TYPE_DRM;
915 if (strcasecmp("NG", ptr) == 0) {
916 return TELEGRAM_APP_FILE_TYPE_IMAGE;
918 if (strcasecmp("JPEG", ptr) == 0) {
919 return TELEGRAM_APP_FILE_TYPE_IMAGE;
921 if (strcasecmp("DF", ptr) == 0) {
922 return TELEGRAM_APP_FILE_TYPE_PDF;
924 if (strcasecmp("PT", ptr) == 0) {
925 return TELEGRAM_APP_FILE_TYPE_PPT;
927 if (strcasecmp("PTX", ptr) == 0) {
928 return TELEGRAM_APP_FILE_TYPE_PPT;
934 if (strcasecmp("O", ptr) == 0) {
935 return TELEGRAM_APP_FILE_TYPE_DRM;
941 if (strcasecmp("DP", ptr) == 0) {
942 return TELEGRAM_APP_FILE_TYPE_VIDEO;
944 if (strcasecmp("PM", ptr) == 0) {
945 return TELEGRAM_APP_FILE_TYPE_MUSIC;
947 if (strcasecmp("MP", ptr) == 0) {
948 return TELEGRAM_APP_FILE_TYPE_MUSIC;
950 if (strcasecmp("PF", ptr) == 0) {
951 return TELEGRAM_APP_FILE_TYPE_MUSIC;
953 if (strcasecmp("WF", ptr) == 0) {
954 return TELEGRAM_APP_FILE_TYPE_FLASH;
956 if (strcasecmp("VG", ptr) == 0) {
957 return TELEGRAM_APP_FILE_TYPE_SVG;
959 if (strcasecmp("VGZ", ptr) == 0) {
960 return TELEGRAM_APP_FILE_TYPE_SVG;
966 if (strcasecmp("XT", ptr) == 0) {
967 return TELEGRAM_APP_FILE_TYPE_TXT;
969 if (strcasecmp("PK", ptr) == 0) {
970 return TELEGRAM_APP_FILE_TYPE_TPK;
976 if (strcasecmp("CF", ptr) == 0) {
977 return TELEGRAM_APP_FILE_TYPE_VCONTACT;
979 if (strcasecmp("TS", ptr) == 0) {
980 return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
982 if (strcasecmp("CS", ptr) == 0) {
983 return TELEGRAM_APP_FILE_TYPE_VCALENDAR;
989 if (strcasecmp("AV", ptr) == 0) {
990 return TELEGRAM_APP_FILE_TYPE_MUSIC;
992 if (strcasecmp("BMP", ptr) == 0) {
993 return TELEGRAM_APP_FILE_TYPE_IMAGE;
995 if (strcasecmp("GT", ptr) == 0) {
996 return TELEGRAM_APP_FILE_TYPE_WGT;
998 if (strcasecmp("MA", ptr) == 0) {
999 return TELEGRAM_APP_FILE_TYPE_MUSIC;
1001 if (strcasecmp("MV", ptr) == 0) {
1002 return TELEGRAM_APP_FILE_TYPE_VIDEO;
1008 if (strcasecmp("LS", ptr) == 0) {
1009 return TELEGRAM_APP_FILE_TYPE_EXCEL;
1011 if (strcasecmp("LSX", ptr) == 0) {
1012 return TELEGRAM_APP_FILE_TYPE_EXCEL;
1014 if (strcasecmp("MF", ptr) == 0) {
1015 return TELEGRAM_APP_FILE_TYPE_MUSIC;
1017 if (strcasecmp("HTML", ptr) == 0) {
1018 return TELEGRAM_APP_FILE_TYPE_HTML;
1023 if (strcasecmp("GP", ptr) == 0) {
1024 return TELEGRAM_APP_FILE_TYPE_VIDEO;
1026 if (strcasecmp("GPP", ptr) == 0) {
1027 return TELEGRAM_APP_FILE_TYPE_VIDEO;
1029 if (strcasecmp("G2", ptr) == 0) {
1030 return TELEGRAM_APP_FILE_TYPE_VIDEO;
1034 return TELEGRAM_APP_FILE_TYPE_ETC;
1037 static inline char* telegram_common_get_file_ext(const char *a_pszfile_name)
1039 if (a_pszfile_name != NULL) {
1040 int nlen = strlen(a_pszfile_name);
1041 char *psztemp = (char *)a_pszfile_name + nlen;
1045 if (*psztemp == '.') {
1057 static inline TELEGRAM_APP_FILE_TYPE_E telegram_common_get_file_type(const char *filepath)
1059 TELEGRAM_APP_FILE_TYPE_E file_type = TELEGRAM_APP_FILE_TYPE_NONE;
1060 if(filepath == NULL)
1062 return TELEGRAM_APP_FILE_TYPE_NONE;
1064 char *file_ext = telegram_common_get_file_ext(filepath);
1067 file_type = __telegram_common_get_file_type_by_file_ext(file_ext, filepath);
1069 LOGI("file_ext is NULL");
1075 static uint64_t get_time_stamp_in_macro()
1078 gettimeofday(&tv,NULL);
1079 return tv.tv_sec*(uint64_t)1000000+tv.tv_usec;
1082 static void wait_for(unsigned int secs)
1084 int retTime = time(0) + secs;
1085 while (time(0) < retTime);
1088 typedef struct _telegram_Time
1092 int ampm; /* 0 for AM, 1 for PM */
1098 telegram_TIME_FORMAT_12H = 0,
1099 telegram_TIME_FORMAT_24H,
1100 telegram_TIME_FORMAT_UNKNOWN
1102 } telegram_time_format;
1104 typedef struct Buddy {
1108 char* initialConsonant;
1121 char relationHideFlag;
1123 char knownPhoneNumberFlag;
1124 char phoneNumberShowFlag;
1125 char whoBlindMeFlag;
1135 extern void load_list_of_countries(appdata_s *ad);
1137 extern void app_get_resource(const char *edj_file_in, char *edj_path_out, int edj_path_max);
1139 extern char* get_budy_state(appdata_s* ad, int buddy_id);
1141 extern Eina_Bool get_thumbnail_from_video_url(const char *file_path, char **thumbnail_path);
1143 extern void show_loading_popup(appdata_s* ad);
1145 extern void hide_loading_popup(appdata_s* ad);
1147 extern void free_user_data(user_data_s *user_data);
1149 extern void app_nf_back_cb(void *data, Evas_Object *obj, void *event_info);
1151 extern TelegramAppDirection tg_get_device_orientation();
1153 extern void update_ccurrent_view(appdata_s *ad);
1155 extern void tg_notification_create(appdata_s *app_data, char * icon_path, const char *title, char *content, char *sound_path, char *app_id);
1157 extern void create_floating_button(appdata_s* ad);
1159 extern void delete_floating_button(appdata_s* ad);
1161 extern void show_floating_button(appdata_s* ad);
1163 extern void update_floating_button(appdata_s* ad, int mode);
1165 extern void on_new_message_clicked(void *data, Evas_Object *obj, void *event_info);
1167 extern void on_floating_icon_clicked(void *data, Evas_Object *obj, void *event_info);
1169 extern char *str_replace(char *orig, char *rep, char *with);
1171 extern Eina_Bool on_load_main_view_requested(void *data);
1173 extern void launch_tg_server(void *data);
1175 extern void recursive_dir_copy(const char *src_dir, const char *tar_dir);
1177 #endif /* TG_COMMON_H_ */