├── .gitignore ├── LICENSE ├── README.md ├── build.gradle ├── chat21 ├── CHANGELOG.md ├── build.gradle ├── build.gradle.orig ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── ic_launcher-web.png │ ├── java │ └── org │ │ └── chat21 │ │ └── android │ │ ├── connectivity │ │ ├── AbstractNetworkReceiver.java │ │ ├── NetworkReceiver.java │ │ └── ObservableNetwork.java │ │ ├── core │ │ ├── ChatManager.java │ │ ├── authentication │ │ │ ├── ChatAuthentication.java │ │ │ ├── bk_ChatAuthentication.java │ │ │ └── task │ │ │ │ ├── GetCustomTokenTask.java │ │ │ │ ├── OnCustomAuthTokenCallback.java │ │ │ │ ├── OnCustomAuthTokenRefreshCallback.java │ │ │ │ ├── RefreshFirebaseInstanceIdTask.java │ │ │ │ └── bk_RefreshFirebaseInstanceIdTask.java │ │ ├── chat_groups │ │ │ ├── listeners │ │ │ │ ├── ChatGroupCreatedListener.java │ │ │ │ └── ChatGroupsListener.java │ │ │ ├── models │ │ │ │ └── ChatGroup.java │ │ │ └── syncronizers │ │ │ │ └── GroupsSyncronizer.java │ │ ├── contacts │ │ │ ├── listeners │ │ │ │ ├── ContactListener.java │ │ │ │ └── OnContactCreatedCallback.java │ │ │ └── synchronizers │ │ │ │ ├── ContactsFirestoreSynchronizer.java │ │ │ │ └── ContactsSynchronizer.java │ │ ├── conversations │ │ │ ├── ArchivedConversationsHandler.java │ │ │ ├── ConversationsHandler.java │ │ │ ├── listeners │ │ │ │ ├── ConversationsListener.java │ │ │ │ ├── OnConversationRetrievedCallback.java │ │ │ │ ├── OnConversationTreeChangeListener.java │ │ │ │ └── UnreadConversationsListener.java │ │ │ └── models │ │ │ │ └── Conversation.java │ │ ├── exception │ │ │ ├── ChatFieldNotFoundException.java │ │ │ └── ChatRuntimeException.java │ │ ├── messages │ │ │ ├── handlers │ │ │ │ └── ConversationMessagesHandler.java │ │ │ ├── listeners │ │ │ │ ├── ConversationMessagesListener.java │ │ │ │ └── SendMessageListener.java │ │ │ └── models │ │ │ │ └── Message.java │ │ ├── presence │ │ │ ├── MyPresenceHandler.java │ │ │ ├── PresenceHandler.java │ │ │ └── listeners │ │ │ │ ├── MyPresenceListener.java │ │ │ │ └── PresenceListener.java │ │ ├── receivers │ │ │ └── ShutdownReceiver.java │ │ └── users │ │ │ └── models │ │ │ ├── ChatUser.java │ │ │ ├── IChatUser.java │ │ │ └── exception │ │ │ └── ChatUserIdException.java │ │ ├── instanceid │ │ ├── receiver │ │ │ └── TokenBroadcastReceiver.java │ │ └── service │ │ │ ├── SaveFirebaseInstanceIdService.java │ │ │ └── bk_SaveFirebaseInstanceIdService.java │ │ ├── notifications │ │ └── ChatFirebaseMessagingService.java │ │ ├── storage │ │ ├── OnUploadedCallback.java │ │ └── StorageHandler.java │ │ ├── ui │ │ ├── ChatUI.java │ │ ├── adapters │ │ │ └── AbstractRecyclerAdapter.java │ │ ├── archived_conversations │ │ │ ├── activities │ │ │ │ └── ArchivedConversationListActivity.java │ │ │ ├── adapters │ │ │ │ └── ArchivedConversationsListAdapter.java │ │ │ ├── fragments │ │ │ │ ├── ArchivedConversationListFragment.java │ │ │ │ └── BSArchivedConversationsListFragmentLongPress.java │ │ │ └── listeners │ │ │ │ └── OnSwipeMenuReopenClickListener.java │ │ ├── chat_groups │ │ │ ├── WizardNewGroup.java │ │ │ ├── activities │ │ │ │ ├── AddMemberToChatGroupActivity.java │ │ │ │ ├── ChatGroupsListActivity.java │ │ │ │ ├── GroupAdminPanelActivity.java │ │ │ │ └── NewGroupActivity.java │ │ │ ├── adapters │ │ │ │ ├── ChatGroupsListAdapter.java │ │ │ │ ├── GroupMembersListAdapter.java │ │ │ │ └── SelectedContactListAdapter.java │ │ │ ├── fragments │ │ │ │ ├── BottomSheetGroupAdminPanelMember.java │ │ │ │ └── ChatGroupsListFragment.java │ │ │ └── listeners │ │ │ │ ├── OnGroupClickListener.java │ │ │ │ ├── OnGroupMemberClickListener.java │ │ │ │ └── OnRemoveClickListener.java │ │ ├── contacts │ │ │ ├── activites │ │ │ │ └── ContactListActivity.java │ │ │ ├── adapters │ │ │ │ └── ContactListAdapter.java │ │ │ ├── fragments │ │ │ │ └── ContactsListFragment.java │ │ │ └── listeners │ │ │ │ ├── OnContactClickListener.java │ │ │ │ └── OnCreateGroupClickListener.java │ │ ├── conversations │ │ │ ├── activities │ │ │ │ └── ConversationListActivity.java │ │ │ ├── adapters │ │ │ │ └── ConversationsListAdapter.java │ │ │ ├── fragments │ │ │ │ ├── BottomSheetConversationsListFragmentLongPress.java │ │ │ │ └── ConversationListFragment.java │ │ │ └── listeners │ │ │ │ ├── OnConversationClickListener.java │ │ │ │ ├── OnConversationLongClickListener.java │ │ │ │ ├── OnNewConversationClickListener.java │ │ │ │ ├── OnSwipeMenuCloseClickListener.java │ │ │ │ └── OnSwipeMenuUnreadClickListener.java │ │ ├── decorations │ │ │ └── ItemDecoration.java │ │ ├── login │ │ │ ├── activities │ │ │ │ ├── ChatLoginActivity.java │ │ │ │ ├── ChatSignUpActivity.java │ │ │ │ └── ChatSplashActivity.java │ │ │ └── listeners │ │ │ │ └── OnLogoutClickListener.java │ │ ├── messages │ │ │ ├── activities │ │ │ │ ├── ImageDetailsActivity.java │ │ │ │ ├── MessageListActivity.java │ │ │ │ └── bk_MessageListActivity.java │ │ │ ├── adapters │ │ │ │ ├── MessageListAdapter.java │ │ │ │ ├── RecipientViewHolder.java │ │ │ │ ├── SenderViewHolder.java │ │ │ │ └── SystemViewHolder.java │ │ │ ├── fragments │ │ │ │ └── BottomSheetAttach.java │ │ │ └── listeners │ │ │ │ ├── OnAttachClickListener.java │ │ │ │ ├── OnAttachDocumentsClickListener.java │ │ │ │ └── OnMessageClickListener.java │ │ └── users │ │ │ └── activities │ │ │ └── PublicProfileActivity.java │ │ └── utils │ │ ├── ChatUtils.java │ │ ├── DebugConstants.java │ │ ├── IOUtils.java │ │ ├── StringUtils.java │ │ ├── TimeUtils.java │ │ ├── bk_TimeUtils.java │ │ ├── http_manager │ │ ├── HttpDELETETask.java │ │ ├── HttpGETTask.java │ │ ├── HttpManager.java │ │ ├── HttpPOSTTask.java │ │ ├── HttpPUTTask.java │ │ └── OnResponseRetrievedCallback.java │ │ ├── image │ │ ├── CropCircleTransformation.java │ │ ├── ImageCompressor.java │ │ └── ImageUtils.java │ │ └── views │ │ ├── TextViewLinkHandler.java │ │ └── TouchImageView.java │ └── res │ ├── drawable-hdpi-v11 │ └── ic_notification_small.png │ ├── drawable-hdpi-v9 │ └── ic_notification_small.png │ ├── drawable-hdpi │ ├── balloon_recipient.9.png │ ├── balloon_recipient_block.9.png │ ├── balloon_sender.9.png │ ├── balloon_sender_block.9.png │ ├── baseline_history_white_24.png │ ├── chat_background.png │ ├── error_view_cloud.png │ ├── ic_add_member_grey_36dp.png │ ├── ic_add_member_white_24dp.png │ ├── ic_attachment_24dp.png │ ├── ic_chat_white_48dp.png │ ├── ic_contact_already_added_24dp.png │ ├── ic_group_avatar.png │ ├── ic_keyboard_24dp.png │ ├── ic_message_receipt_16dp.png │ ├── ic_message_sending_16dp.png │ ├── ic_message_sent_16dp.png │ ├── ic_notification_foreground.png │ ├── ic_notification_small.png │ ├── ic_person_avatar.png │ ├── ic_placeholder_file_recipient_24dp.png │ ├── ic_remove_selected_contact_24dp.png │ ├── ic_search_white_24dp.png │ └── ic_send_24dp.png │ ├── drawable-ldpi │ ├── chat_background.png │ ├── ic_add_member_grey_36dp.png │ ├── ic_add_member_white_24dp.png │ ├── ic_attachment_24dp.png │ ├── ic_chat_white_48dp.png │ ├── ic_contact_already_added_24dp.png │ ├── ic_group_avatar.png │ ├── ic_keyboard_24dp.png │ ├── ic_message_receipt_16dp.png │ ├── ic_message_sending_16dp.png │ ├── ic_message_sent_16dp.png │ ├── ic_person_avatar.png │ ├── ic_placeholder_file_recipient_24dp.png │ ├── ic_remove_selected_contact_24dp.png │ ├── ic_search_white_24dp.png │ └── ic_send_24dp.png │ ├── drawable-mdpi-v11 │ └── ic_notification_small.png │ ├── drawable-mdpi-v9 │ └── ic_notification_small.png │ ├── drawable-mdpi │ ├── balloon_recipient.9.png │ ├── balloon_recipient_block.9.png │ ├── balloon_sender.9.png │ ├── balloon_sender_block.9.png │ ├── baseline_history_white_24.png │ ├── chat_background.png │ ├── error_view_cloud.png │ ├── ic_add_member_grey_36dp.png │ ├── ic_add_member_white_24dp.png │ ├── ic_attachment_24dp.png │ ├── ic_chat_white_48dp.png │ ├── ic_contact_already_added_24dp.png │ ├── ic_group_avatar.png │ ├── ic_keyboard_24dp.png │ ├── ic_message_receipt_16dp.png │ ├── ic_message_sending_16dp.png │ ├── ic_message_sent_16dp.png │ ├── ic_notification_foreground.png │ ├── ic_notification_small.png │ ├── ic_person_avatar.png │ ├── ic_placeholder_file_recipient_24dp.png │ ├── ic_remove_selected_contact_24dp.png │ ├── ic_search_white_24dp.png │ └── ic_send_24dp.png │ ├── drawable-xhdpi-v11 │ └── ic_notification_small.png │ ├── drawable-xhdpi-v9 │ └── ic_notification_small.png │ ├── drawable-xhdpi │ ├── balloon_recipient.9.png │ ├── balloon_recipient_block.9.png │ ├── balloon_sender.9.png │ ├── balloon_sender_block.9.png │ ├── baseline_history_white_24.png │ ├── chat_background.png │ ├── error_view_cloud.png │ ├── ic_add_member_grey_36dp.png │ ├── ic_add_member_white_24dp.png │ ├── ic_attachment_24dp.png │ ├── ic_chat_white_48dp.png │ ├── ic_contact_already_added_24dp.png │ ├── ic_group_avatar.png │ ├── ic_keyboard_24dp.png │ ├── ic_message_receipt_16dp.png │ ├── ic_message_sending_16dp.png │ ├── ic_message_sent_16dp.png │ ├── ic_notification_foreground.png │ ├── ic_notification_small.png │ ├── ic_person_avatar.png │ ├── ic_placeholder_file_recipient_24dp.png │ ├── ic_remove_selected_contact_24dp.png │ ├── ic_search_white_24dp.png │ └── ic_send_24dp.png │ ├── drawable-xxhdpi-v11 │ └── ic_notification_small.png │ ├── drawable-xxhdpi-v9 │ └── ic_notification_small.png │ ├── drawable-xxhdpi │ ├── balloon_recipient.9.png │ ├── balloon_recipient_block.9.png │ ├── balloon_sender.9.png │ ├── balloon_sender_block.9.png │ ├── baseline_history_white_24.png │ ├── chat_background.png │ ├── error_view_cloud.png │ ├── ic_add_member_grey_36dp.png │ ├── ic_add_member_white_24dp.png │ ├── ic_attachment_24dp.png │ ├── ic_chat_white_48dp.png │ ├── ic_contact_already_added_24dp.png │ ├── ic_group_avatar.png │ ├── ic_keyboard_24dp.png │ ├── ic_message_receipt_16dp.png │ ├── ic_message_sending_16dp.png │ ├── ic_message_sent_16dp.png │ ├── ic_notification_foreground.png │ ├── ic_notification_small.png │ ├── ic_person_avatar.png │ ├── ic_placeholder_file_recipient_24dp.png │ ├── ic_remove_selected_contact_24dp.png │ ├── ic_search_white_24dp.png │ └── ic_send_24dp.png │ ├── drawable-xxxhdpi │ ├── balloon_recipient.9.png │ ├── balloon_recipient_block.9.png │ ├── balloon_sender.9.png │ ├── balloon_sender_block.9.png │ ├── baseline_history_white_24.png │ ├── chat_background.png │ ├── ic_add_member_grey_36dp.png │ ├── ic_add_member_white_24dp.png │ ├── ic_attachment_24dp.png │ ├── ic_chat_white_48dp.png │ ├── ic_contact_already_added_24dp.png │ ├── ic_group_avatar.png │ ├── ic_keyboard_24dp.png │ ├── ic_message_receipt_16dp.png │ ├── ic_message_sending_16dp.png │ ├── ic_message_sent_16dp.png │ ├── ic_notification_foreground.png │ ├── ic_person_avatar.png │ ├── ic_placeholder_file_recipient_24dp.png │ ├── ic_remove_selected_contact_24dp.png │ ├── ic_search_white_24dp.png │ └── ic_send_24dp.png │ ├── drawable │ ├── activity_message_list_background_rounded_error_view.xml │ ├── border_group_admin.xml │ ├── border_row_closed_archived_conversation.xml │ ├── circle_shape.xml │ ├── circle_shape_green.xml │ ├── decorator_activity_add_members_to_groups.xml │ ├── decorator_activity_contact_list.xml │ ├── decorator_activity_group_admin_panel_members_list.xml │ ├── decorator_activity_my_groups_list.xml │ ├── decorator_add_filtered_member.xml │ ├── decorator_fragment_archived_conversation_list.xml │ ├── decorator_fragment_conversation_list.xml │ ├── ic_launcher_background.xml │ ├── ic_launcher_foreground.xml │ └── shape_row_chat_timestamp.xml │ ├── layout │ ├── acticvity_public_profile.xml │ ├── activity_add_member_to_chat_group.xml │ ├── activity_archived_conversation_list.xml │ ├── activity_chat_groups_list.xml │ ├── activity_chat_login.xml │ ├── activity_chat_signup.xml │ ├── activity_chat_splash.xml │ ├── activity_contact_list.xml │ ├── activity_conversation_list.xml │ ├── activity_group_admin_panel.xml │ ├── activity_image_details.xml │ ├── activity_message_list.xml │ ├── activity_my_groups_list.xml │ ├── activity_new_group.xml │ ├── bak_row_conversation.xml │ ├── fragment_archived_conversation_list.xml │ ├── fragment_bottom_sheet_archived_conversation_list_long_press.xml │ ├── fragment_bottom_sheet_attach.xml │ ├── fragment_bottom_sheet_conversation_list_long_press.xml │ ├── fragment_bottom_sheet_group_admin_panel_member.xml │ ├── fragment_chat_groups_list.xml │ ├── fragment_contacts_list.xml │ ├── fragment_conversation_list.xml │ ├── layout_custom_notification.xml │ ├── layout_no_contacts.xml │ ├── layout_no_conversations.xml │ ├── layout_no_groups.xml │ ├── layout_toolbar_message_list.xml │ ├── row_add_member.xml │ ├── row_archived_conversation.xml │ ├── row_contact_list.xml │ ├── row_conversation.xml │ ├── row_group.xml │ ├── row_group_members.xml │ ├── row_recipient.xml │ ├── row_selected_contact_list.xml │ ├── row_sender.xml │ └── row_system.xml │ ├── menu │ ├── menu_activity_add_members.xml │ ├── menu_activity_contacts_list.xml │ ├── menu_activity_new_group.xml │ └── menu_fragment_conversations_list.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── values-en │ └── strings.xml │ ├── values-it │ └── strings.xml │ ├── values │ ├── chat_settings.xml │ ├── color_palette.xml │ ├── colors.xml │ ├── dimens.xml │ ├── ic_launcher_background.xml │ ├── login_signup_colors.xml │ ├── login_signup_dimens.xml │ ├── login_signup_strings.xml │ ├── strings.xml │ ├── styles.xml │ └── transitions.xml │ └── xml │ └── searchable_contacts.xml ├── resources ├── ic_open_in_new_white_24px.svg ├── icon.png ├── screen1.png ├── screen2.png ├── screen3.png ├── screen4.png └── screen5.png └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.ap_ 3 | *.apk 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # Intellij 36 | *.iml 37 | .idea 38 | .idea/workspace.xml 39 | .idea/tasks.xml 40 | .idea/gradle.xml 41 | .idea/dictionaries 42 | .idea/libraries 43 | 44 | # Keystore files 45 | *.jks 46 | 47 | # External native build folder generated in Android Studio 2.2 and later 48 | .externalNativeBuild 49 | 50 | # Google Services (e.g. APIs or Firebase) 51 | google-services.json 52 | 53 | # Freeline 54 | freeline.py 55 | freeline/ 56 | freeline_project_description.json 57 | 58 | #gradlew 59 | gradlew 60 | gradlew.bat 61 | 62 | #gradle wrapper 63 | gradle/wrapper 64 | 65 | Database.java 66 | DbContentProvider.java 67 | IUserDao.java 68 | IUserSchema.java 69 | UserDao.java 70 | ChatManagerWithContactSyncronizer.java 71 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020-present Tiledesk 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | mavenCentral() 7 | google() 8 | } 9 | 10 | dependencies { 11 | classpath 'com.android.tools.build:gradle:3.0.1' 12 | 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | 16 | classpath 'com.google.gms:google-services:3.1.2' 17 | classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1' 18 | 19 | classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4' 20 | classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1' 21 | } 22 | } 23 | 24 | allprojects { 25 | repositories { 26 | jcenter() 27 | mavenCentral() 28 | maven { url "https://maven.google.com" } 29 | google() 30 | } 31 | 32 | // source : 33 | // https://stackoverflow.com/questions/34828426/disable-javadoc-check-for-bintray-upload 34 | tasks.withType(Javadoc) { 35 | options.addStringOption('Xdoclint:none', '-quiet') 36 | options.addStringOption('encoding', 'UTF-8') 37 | } 38 | } 39 | 40 | task clean(type: Delete) { 41 | delete rootProject.buildDir 42 | } -------------------------------------------------------------------------------- /chat21/build.gradle.orig: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "25.0.2" 6 | 7 | defaultConfig { 8 | minSdkVersion 16 9 | targetSdkVersion 22 10 | 11 | versionCode 2 12 | versionName "0.0.2" 13 | } 14 | 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | } 22 | 23 | dependencies { 24 | compile fileTree(dir: 'libs', include: ['*.jar']) 25 | 26 | // android framework 27 | compile 'com.android.support:appcompat-v7:25.+' 28 | compile 'com.android.support:design:25.+' 29 | compile 'com.android.support:cardview-v7:25.+' 30 | 31 | // firebase sdk 32 | compile 'com.google.firebase:firebase-core:10.0.1' 33 | compile 'com.google.firebase:firebase-database:10.0.1' 34 | compile 'com.google.firebase:firebase-storage:10.0.1' 35 | compile 'com.google.firebase:firebase-crash:10.0.1' 36 | compile 'com.google.firebase:firebase-messaging:10.0.1' 37 | // compile 'com.google.firebase:firebase-auth:10.0.1' 38 | compile 'com.firebaseui:firebase-ui:0.6.2' 39 | compile 'com.fasterxml.jackson.core:jackson-annotations:2.+' 40 | 41 | // image loading and caching 42 | compile 'com.github.bumptech.glide:glide:3.6.1' 43 | 44 | // annotations 45 | compile 'com.jakewharton:butterknife:7.0.1' 46 | 47 | // notification 48 | compile 'com.parse:parse-android:1.+' 49 | compile 'com.parse.bolts:bolts-android:1.+' 50 | 51 | compile 'org.ocpsoft.prettytime:prettytime:4.0.1.Final' 52 | compile 'org.apache.httpcomponents:httpcore:4.3' 53 | 54 | compile project(':emoji') 55 | } 56 | apply plugin: 'com.google.gms.google-services' -------------------------------------------------------------------------------- /chat21/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:\Program Files\Android SDK/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # firebase-ui rules 20 | # https://github.com/firebase/FirebaseUI-Android/issues/397 21 | -dontwarn retrofit2.** 22 | -dontwarn okio.** 23 | 24 | # Jackson 25 | -keep @com.fasterxml.jackson.annotation.JsonIgnoreProperties class * { *; } 26 | -keep class com.fasterxml.** { *; } 27 | -keep class org.codehaus.** { *; } 28 | -keepnames class com.fasterxml.jackson.** { *; } 29 | -keepclassmembers public final enum com.fasterxml.jackson.annotation.JsonAutoDetect$Visibility { 30 | public static final com.fasterxml.jackson.annotation.JsonAutoDetect$Visibility *; 31 | } 32 | 33 | # Generell 34 | -keepattributes SourceFile,LineNumberTable,*Annotation*,EnclosingMethod,Signature,Exceptions,InnerClasses 35 | 36 | # glide 37 | -keep public class * implements com.bumptech.glide.module.GlideModule 38 | -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { 39 | **[] $VALUES; 40 | public *; 41 | } 42 | 43 | # butterknife 44 | # Retain generated class which implement Unbinder. 45 | -keep public class * implements butterknife.Unbinder { public (**, android.view.View); } 46 | -dontwarn butterknife.internal.** 47 | -keep class **$$ViewInjector { *; } 48 | -keepnames class * { @butterknife.InjectView *;} 49 | 50 | # Prevent obfuscation of types which use ButterKnife annotations since the simple name 51 | # is used to reflectively look up the generated ViewBinding. 52 | -keep class butterknife.* 53 | -keepclasseswithmembernames class * { @butterknife.* ; } 54 | -keepclasseswithmembernames class * { @butterknife.* ; } 55 | 56 | # prettytime 57 | -keep class org.ocpsoft.prettytime.i18n.** 58 | 59 | # httpcomponents 60 | -dontwarn org.apache.commons.** 61 | -keep class org.apache.http.** { *; } 62 | -dontwarn org.apache.http.** -------------------------------------------------------------------------------- /chat21/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/connectivity/AbstractNetworkReceiver.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.connectivity; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.net.ConnectivityManager; 7 | import android.net.NetworkInfo; 8 | 9 | /** 10 | * Created by stefanodp91 on 13/09/17. 11 | */ 12 | 13 | public abstract class AbstractNetworkReceiver extends BroadcastReceiver { 14 | public AbstractNetworkReceiver() { 15 | // required to avoid 16 | // Unable to instantiate receiver: 17 | // java.lang.InstantiationException: has no zero argument constructor 18 | } 19 | 20 | @Override 21 | public void onReceive(Context context, Intent intent) { 22 | if (null != intent) { 23 | NetworkInfo.State wifiState = null; 24 | NetworkInfo.State mobileState = null; 25 | ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 26 | wifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState(); 27 | mobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState(); 28 | if (wifiState != null && mobileState != null 29 | && NetworkInfo.State.CONNECTED != wifiState 30 | && NetworkInfo.State.CONNECTED == mobileState) { 31 | // phone network connect success 32 | mobileNetwork(); 33 | } else if (wifiState != null && mobileState != null 34 | && NetworkInfo.State.CONNECTED != wifiState 35 | && NetworkInfo.State.CONNECTED != mobileState) { 36 | // no network 37 | noNetwork(); 38 | } else if (wifiState != null && NetworkInfo.State.CONNECTED == wifiState) { 39 | // wify connect success 40 | WIFINetwork(); 41 | } 42 | } 43 | } 44 | 45 | public abstract void noNetwork(); 46 | 47 | public abstract void mobileNetwork(); 48 | 49 | public abstract void WIFINetwork(); 50 | 51 | /** 52 | * Check the connectivity status and detect which connection type is in use (mobile, wifi.. ) 53 | * 54 | * @return true if is connected, false otherwise 55 | */ 56 | public static boolean isConnected(Context context) { 57 | 58 | boolean isConnected = false; 59 | 60 | NetworkInfo.State wifiState; 61 | NetworkInfo.State mobileState; 62 | ConnectivityManager cm = 63 | (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 64 | wifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState(); 65 | mobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState(); 66 | if (wifiState != null && mobileState != null 67 | && NetworkInfo.State.CONNECTED != wifiState 68 | && NetworkInfo.State.CONNECTED == mobileState) { 69 | // phone network connect success 70 | isConnected = true; 71 | } else if (wifiState != null && NetworkInfo.State.CONNECTED == wifiState) { 72 | // wifi connect success 73 | isConnected = true; 74 | } else if (wifiState != null && mobileState != null 75 | && NetworkInfo.State.CONNECTED != wifiState 76 | && NetworkInfo.State.CONNECTED != mobileState) { 77 | isConnected = false; 78 | } 79 | 80 | return isConnected; 81 | } 82 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/connectivity/NetworkReceiver.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.connectivity; 2 | 3 | import android.util.Log; 4 | 5 | /** 6 | * Created by stefanodp91 on 13/09/17. 7 | */ 8 | 9 | public class NetworkReceiver extends AbstractNetworkReceiver { 10 | private static final String TAG = NetworkReceiver.class.getName(); 11 | 12 | public NetworkReceiver() { 13 | // required to avoid 14 | // Unable to instantiate receiver: 15 | // java.lang.InstantiationException: has no zero argument constructor 16 | } 17 | 18 | @Override 19 | public void noNetwork() { 20 | Log.d(TAG, "noNetwork"); 21 | } 22 | 23 | @Override 24 | public void mobileNetwork() { 25 | Log.d(TAG, "mobileNetwork"); 26 | } 27 | 28 | @Override 29 | public void WIFINetwork() { 30 | Log.d(TAG, "WIFINetwork"); 31 | } 32 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/connectivity/ObservableNetwork.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.connectivity; 2 | 3 | import java.util.Observable; 4 | 5 | /** 6 | * Created by stefanodp91 on 14/09/17. 7 | */ 8 | 9 | //bugfix Issue #61 10 | public class ObservableNetwork extends Observable { 11 | private static ObservableNetwork instance = new ObservableNetwork(); 12 | 13 | public static ObservableNetwork getInstance() { 14 | return instance; 15 | } 16 | 17 | private ObservableNetwork() { 18 | } 19 | 20 | public void updateValue(Object data) { 21 | synchronized (this) { 22 | setChanged(); 23 | notifyObservers(data); 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/authentication/task/OnCustomAuthTokenCallback.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.authentication.task; 2 | 3 | /** 4 | * Created by andrea on 10/04/17. 5 | */ 6 | 7 | public interface OnCustomAuthTokenCallback { 8 | 9 | void onCustomAuthRetrievedSuccess(String token); 10 | 11 | void onCustomAuthRetrievedWithError(Exception e); 12 | } 13 | 14 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/authentication/task/OnCustomAuthTokenRefreshCallback.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.authentication.task; 2 | 3 | /** 4 | * Created by stefanodp91 on 29/05/17. 5 | */ 6 | 7 | public interface OnCustomAuthTokenRefreshCallback { 8 | void onRefreshSuccess(T data); 9 | 10 | void onRefreshError(Exception e); 11 | } 12 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/authentication/task/RefreshFirebaseInstanceIdTask.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.authentication.task; 2 | 3 | import android.os.AsyncTask; 4 | import android.util.Log; 5 | 6 | import com.google.firebase.iid.FirebaseInstanceId; 7 | 8 | import java.io.IOException; 9 | 10 | import static org.chat21.android.utils.DebugConstants.DEBUG_LOGIN; 11 | 12 | /** 13 | * Created by andrealeo 14 | */ 15 | public class RefreshFirebaseInstanceIdTask extends AsyncTask { 16 | private static final String TAG_TOKEN = "TAG_TOKEN"; 17 | 18 | public RefreshFirebaseInstanceIdTask() { 19 | Log.d(DEBUG_LOGIN, "RefreshFirebaseInstanceIdTask"); 20 | } 21 | 22 | @Override 23 | protected Void doInBackground(Object... params) { 24 | try { 25 | FirebaseInstanceId.getInstance().deleteInstanceId(); 26 | Log.i(DEBUG_LOGIN, "RefreshFirebaseInstanceIdTask.doInBackground: instanceId deleted with success."); 27 | 28 | // Now manually call onTokenRefresh() 29 | Log.d(DEBUG_LOGIN, "RefreshFirebaseInstanceIdTask.doInBackground: Getting new token"); 30 | String token = FirebaseInstanceId.getInstance().getToken(); 31 | Log.i(TAG_TOKEN, "RefreshFirebaseInstanceIdTask: token == " + token); 32 | 33 | } catch (IOException e) { 34 | Log.e(DEBUG_LOGIN, "RefreshFirebaseInstanceIdTask.doInBackground: deleteInstanceIdCatch: " + e.getMessage()); 35 | } 36 | 37 | return null; 38 | } 39 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/authentication/task/bk_RefreshFirebaseInstanceIdTask.java: -------------------------------------------------------------------------------- 1 | //package org.chat21.android.core.authentication.task; 2 | // 3 | //import android.os.AsyncTask; 4 | //import android.util.Log; 5 | // 6 | //import com.google.firebase.iid.FirebaseInstanceId; 7 | // 8 | //import java.io.IOException; 9 | // 10 | //import static org.chat21.android.utils.DebugConstants.DEBUG_LOGIN; 11 | // 12 | ///** 13 | // * Created by andrealeo 14 | // */ 15 | //public class bk_RefreshFirebaseInstanceIdTask extends AsyncTask { 16 | // 17 | // public bk_RefreshFirebaseInstanceIdTask() { 18 | // Log.d(DEBUG_LOGIN, "RefreshFirebaseInstanceIdTask"); 19 | // } 20 | // 21 | // @Override 22 | // protected Void doInBackground(Object... params) { 23 | // try { 24 | // FirebaseInstanceId.getInstance().deleteInstanceId(); 25 | // Log.i(DEBUG_LOGIN, "RefreshFirebaseInstanceIdTask.doInBackground: instanceId deleted with success."); 26 | // 27 | // // Now manually call onTokenRefresh() 28 | // Log.d(DEBUG_LOGIN, "RefreshFirebaseInstanceIdTask.doInBackground: Getting new token"); 29 | // FirebaseInstanceId.getInstance().getToken(); 30 | // 31 | // } catch (IOException e) { 32 | // Log.e(DEBUG_LOGIN, "RefreshFirebaseInstanceIdTask.doInBackground: deleteInstanceIdCatch: " + e.getMessage()); 33 | // } 34 | // 35 | // return null; 36 | // } 37 | //} -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/chat_groups/listeners/ChatGroupCreatedListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.chat_groups.listeners; 2 | 3 | import org.chat21.android.core.chat_groups.models.ChatGroup; 4 | import org.chat21.android.core.exception.ChatRuntimeException; 5 | 6 | /** 7 | * Created by stefanodp91 on 29/01/18. 8 | */ 9 | 10 | public interface ChatGroupCreatedListener { 11 | void onChatGroupCreated(ChatGroup chatGroup, ChatRuntimeException chatException); 12 | } 13 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/chat_groups/listeners/ChatGroupsListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.chat_groups.listeners; 2 | 3 | import org.chat21.android.core.exception.ChatRuntimeException; 4 | import org.chat21.android.core.chat_groups.models.ChatGroup; 5 | 6 | /** 7 | * Created by stefanodp91 on 24/01/18. 8 | */ 9 | 10 | public interface ChatGroupsListener { 11 | 12 | void onGroupAdded(ChatGroup chatGroup, ChatRuntimeException e); 13 | 14 | void onGroupChanged(ChatGroup chatGroup, ChatRuntimeException e); 15 | 16 | void onGroupRemoved(ChatRuntimeException e); 17 | } 18 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/contacts/listeners/ContactListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.contacts.listeners; 2 | 3 | import org.chat21.android.core.exception.ChatRuntimeException; 4 | import org.chat21.android.core.users.models.IChatUser; 5 | 6 | /** 7 | * Created by andrealeo on 06/12/17. 8 | */ 9 | 10 | public interface ContactListener { 11 | 12 | public void onContactReceived(IChatUser contact, ChatRuntimeException e); 13 | public void onContactChanged(IChatUser contact, ChatRuntimeException e); 14 | public void onContactRemoved(IChatUser contact, ChatRuntimeException e); 15 | 16 | } 17 | 18 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/contacts/listeners/OnContactCreatedCallback.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.contacts.listeners; 2 | 3 | import org.chat21.android.core.exception.ChatRuntimeException; 4 | 5 | /** 6 | * Created by stefanodp91 on 28/02/18. 7 | */ 8 | 9 | public interface OnContactCreatedCallback { 10 | void onContactCreatedSuccess(ChatRuntimeException exception); 11 | } 12 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/contacts/synchronizers/ContactsFirestoreSynchronizer.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.contacts.synchronizers; 2 | 3 | import android.support.annotation.NonNull; 4 | import android.util.Log; 5 | 6 | import com.google.android.gms.tasks.OnCompleteListener; 7 | import com.google.android.gms.tasks.Task; 8 | import com.google.firebase.firestore.CollectionReference; 9 | import com.google.firebase.firestore.DocumentSnapshot; 10 | import com.google.firebase.firestore.FirebaseFirestore; 11 | import com.google.firebase.firestore.QuerySnapshot; 12 | 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | import org.chat21.android.core.users.models.IChatUser; 17 | 18 | /** 19 | * Created by andrealeo on 03/01/18. 20 | */ 21 | 22 | public class ContactsFirestoreSynchronizer { 23 | 24 | FirebaseFirestore contactStore; 25 | CollectionReference contactsCollReference; 26 | 27 | private static final String TAG = ContactsFirestoreSynchronizer.class.getName(); 28 | 29 | public ContactsFirestoreSynchronizer() { 30 | contactStore = FirebaseFirestore.getInstance(); 31 | 32 | contactsCollReference = contactStore.collection("contacts"); 33 | } 34 | 35 | public List getAllContacts() { 36 | final List contacts = new ArrayList<>(); 37 | 38 | contactsCollReference.get().addOnCompleteListener(new OnCompleteListener() { 39 | @Override 40 | public void onComplete(@NonNull Task task) { 41 | if (task.isSuccessful()) { 42 | for (DocumentSnapshot document : task.getResult()) { 43 | Log.d(TAG, document.getId() + " => " + document.getData()); 44 | // contacts.add(document.toObject(ChatUser.class)); 45 | } 46 | } else { 47 | Log.d(TAG, "Error getting documents: ", task.getException()); 48 | } 49 | } 50 | }); 51 | return null; 52 | 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/conversations/listeners/ConversationsListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.conversations.listeners; 2 | 3 | import org.chat21.android.core.conversations.models.Conversation; 4 | import org.chat21.android.core.exception.ChatRuntimeException; 5 | 6 | /** 7 | * Created by andrealeo on 06/12/17. 8 | */ 9 | 10 | public interface ConversationsListener { 11 | 12 | public void onConversationAdded(Conversation conversation, ChatRuntimeException e); 13 | 14 | public void onConversationChanged(Conversation conversation, ChatRuntimeException e); 15 | 16 | public void onConversationRemoved(ChatRuntimeException e); 17 | 18 | } 19 | 20 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/conversations/listeners/OnConversationRetrievedCallback.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.conversations.listeners; 2 | 3 | import org.chat21.android.core.conversations.models.Conversation; 4 | 5 | /** 6 | * Created by stefanodp91 on 19/10/17. 7 | */ 8 | 9 | public interface OnConversationRetrievedCallback { 10 | 11 | void onConversationRetrievedSuccess(Conversation conversation); 12 | 13 | void onNewConversationCreated(String conversationId); 14 | 15 | void onConversationRetrievedError(Exception e); 16 | } 17 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/conversations/listeners/OnConversationTreeChangeListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.conversations.listeners; 2 | 3 | import com.google.firebase.database.DataSnapshot; 4 | import com.google.firebase.database.DatabaseReference; 5 | 6 | import org.chat21.android.core.conversations.models.Conversation; 7 | 8 | /** 9 | * Created by stefanodp91 on 11/01/17. 10 | */ 11 | 12 | public interface OnConversationTreeChangeListener { 13 | void onTreeDataChanged(DatabaseReference node, DataSnapshot dataSnapshot, int childrenCount); 14 | 15 | void onTreeChildAdded(DatabaseReference node, DataSnapshot dataSnapshot, Conversation conversation); 16 | 17 | void onTreeChildChanged(DatabaseReference node, DataSnapshot dataSnapshot, Conversation conversation); 18 | 19 | void onTreeChildRemoved(); 20 | 21 | void onTreeChildMoved(); 22 | 23 | void onTreeCancelled(); 24 | } 25 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/conversations/listeners/UnreadConversationsListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.conversations.listeners; 2 | 3 | import org.chat21.android.core.conversations.models.Conversation; 4 | import org.chat21.android.core.exception.ChatRuntimeException; 5 | 6 | /** 7 | * Created by andrealeo on 06/12/17. 8 | */ 9 | 10 | public interface UnreadConversationsListener { 11 | 12 | void onUnreadConversationCounted(int count, ChatRuntimeException e); 13 | 14 | } 15 | 16 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/exception/ChatFieldNotFoundException.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.exception; 2 | 3 | /** 4 | * Created by andrealeo on 22/12/17. 5 | */ 6 | 7 | public class ChatFieldNotFoundException extends Exception { 8 | 9 | public ChatFieldNotFoundException() { 10 | super(); 11 | } 12 | 13 | public ChatFieldNotFoundException(String message) { 14 | super(message); 15 | } 16 | 17 | public ChatFieldNotFoundException(String message, Throwable cause) { 18 | super(message, cause); 19 | } 20 | 21 | public ChatFieldNotFoundException(Throwable cause) { 22 | super(cause); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/exception/ChatRuntimeException.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.exception; 2 | 3 | /** 4 | * Created by andrealeo on 05/12/17. 5 | */ 6 | 7 | public class ChatRuntimeException extends RuntimeException { 8 | 9 | public ChatRuntimeException() { 10 | super(); 11 | } 12 | 13 | public ChatRuntimeException(String message) { 14 | super(message); 15 | } 16 | 17 | public ChatRuntimeException(String message, Throwable cause) { 18 | super(message, cause); 19 | } 20 | 21 | public ChatRuntimeException(Throwable cause) { 22 | super(cause); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/messages/listeners/ConversationMessagesListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.messages.listeners; 2 | 3 | import org.chat21.android.core.exception.ChatRuntimeException; 4 | import org.chat21.android.core.messages.models.Message; 5 | 6 | /** 7 | * Created by andrealeo on 06/12/17. 8 | */ 9 | 10 | public interface ConversationMessagesListener { 11 | 12 | public void onConversationMessageReceived(Message message, ChatRuntimeException e); 13 | public void onConversationMessageChanged(Message message, ChatRuntimeException e); 14 | 15 | } 16 | 17 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/messages/listeners/SendMessageListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.messages.listeners; 2 | 3 | import org.chat21.android.core.exception.ChatRuntimeException; 4 | import org.chat21.android.core.messages.models.Message; 5 | 6 | /** 7 | * Created by andrealeo on 24/11/17. 8 | */ 9 | 10 | public interface SendMessageListener { 11 | 12 | void onBeforeMessageSent(Message message, ChatRuntimeException chatException); 13 | 14 | void onMessageSentComplete(Message message, ChatRuntimeException chatException); 15 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/presence/listeners/MyPresenceListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.presence.listeners; 2 | 3 | /** 4 | * Created by stefanodp91 on 09/01/18. 5 | */ 6 | 7 | public interface MyPresenceListener { 8 | 9 | /** 10 | * Return the user connection status 11 | * 12 | * @param isConnected true if the user is online, false otherwise 13 | * @param deviceId the id associated to the connected device 14 | */ 15 | void isLoggedUserOnline(boolean isConnected, String deviceId); 16 | 17 | void onMyPresenceError(Exception e); 18 | } 19 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/presence/listeners/PresenceListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.presence.listeners; 2 | 3 | /** 4 | * Created by stefanodp91 on 09/01/18. 5 | */ 6 | 7 | public interface PresenceListener { 8 | 9 | /** 10 | * Return the user connection status 11 | * 12 | * @param isConnected true if the user is online, false otherwise 13 | */ 14 | void isUserOnline(boolean isConnected); 15 | 16 | /** 17 | * Return the user last online timestamp 18 | * 19 | * @param lastOnline the last online timestamp 20 | */ 21 | void userLastOnline(long lastOnline); 22 | 23 | void onPresenceError(Exception e); 24 | } 25 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/receivers/ShutdownReceiver.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.receivers; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.util.Log; 7 | 8 | import org.chat21.android.core.ChatManager; 9 | 10 | /** 11 | * Created by stefanodp91 on 19/02/18. 12 | */ 13 | 14 | public class ShutdownReceiver extends BroadcastReceiver { 15 | private static final String TAG = ShutdownReceiver.class.getName(); 16 | 17 | @Override 18 | public void onReceive(Context context, Intent intent) { 19 | if (Intent.ACTION_SHUTDOWN.equals(intent.getAction())) { 20 | Log.i(TAG, "System shutting down"); 21 | 22 | // disconnect the current user when the phone shutdown 23 | if(ChatManager.getInstance() != null) { 24 | ChatManager.getInstance().getMyPresenceHandler().dispose(); 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/users/models/ChatUser.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.users.models; 2 | 3 | import java.io.Serializable; 4 | 5 | import org.chat21.android.core.users.models.exception.ChatUserIdException; 6 | 7 | /** 8 | * Created by stefano on 21/09/2015. 9 | */ 10 | public class ChatUser implements IChatUser, Serializable, Comparable { 11 | private String fullName; 12 | private String email; 13 | private String id; 14 | private String profilePictureUrl; 15 | // private String auth; 16 | // private String password; 17 | 18 | 19 | public ChatUser() { 20 | 21 | } 22 | 23 | public ChatUser(String id, String fullname) { 24 | 25 | if (id.contains(".")){ 26 | throw new ChatUserIdException("Id Field contains invalid char"); 27 | } 28 | 29 | this.id = id; 30 | this.fullName = fullname; 31 | } 32 | 33 | @Override 34 | public String getFullName() { 35 | return fullName; 36 | } 37 | 38 | @Override 39 | public String getEmail() { 40 | return email; 41 | } 42 | 43 | @Override 44 | public String getId() { 45 | return id; 46 | } 47 | 48 | @Override 49 | public void setFullName(String fullName) { 50 | this.fullName = fullName; 51 | } 52 | 53 | @Override 54 | public void setEmail(String email) { 55 | this.email = email; 56 | } 57 | 58 | @Override 59 | public void setId(String id) { 60 | if (id.contains(".")){ 61 | throw new ChatUserIdException("Id Field contains invalid char"); 62 | } 63 | this.id = id; 64 | } 65 | 66 | @Override 67 | public String getProfilePictureUrl() { 68 | return profilePictureUrl; 69 | } 70 | 71 | @Override 72 | public void setProfilePictureUrl(String profilePictureUrl) { 73 | this.profilePictureUrl = profilePictureUrl; 74 | } 75 | 76 | 77 | private static int compare(String x, String y) { 78 | return x.compareTo(y) < 0 ? -1 : x.compareTo(y) > 0 ? 1 : 0; 79 | } 80 | 81 | @Override 82 | public int compareTo(IChatUser another) { 83 | return compare(this.getFullName(), another.getFullName()); 84 | } 85 | 86 | @Override 87 | public boolean equals(Object obj) { 88 | boolean isEqual = false; 89 | 90 | if (obj instanceof IChatUser) { 91 | IChatUser user = (IChatUser) obj; 92 | 93 | isEqual = user.getId().compareTo(this.getId()) == 0; 94 | } 95 | 96 | return isEqual; 97 | } 98 | 99 | @Override 100 | public String toString() { 101 | return "ChatUser{" + 102 | "id='" + id + '\'' + 103 | ", email='" + email + '\'' + 104 | ", fullName='" + fullName + '\'' + 105 | ", profilePictureUrl='" + profilePictureUrl + '\'' + 106 | '}'; 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/users/models/IChatUser.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.users.models; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * Created by frontiere21 on 27/09/16. 7 | */ 8 | public interface IChatUser extends Serializable { 9 | void setId(String id); 10 | 11 | String getId(); 12 | 13 | void setFullName(String fullName); 14 | 15 | String getFullName(); 16 | 17 | void setEmail(String email); 18 | 19 | String getEmail(); 20 | 21 | // void setPassword(String password); 22 | // 23 | // String getPassword(); 24 | 25 | String getProfilePictureUrl(); 26 | 27 | void setProfilePictureUrl(String profilePictureUrl); 28 | 29 | // String getAuth(); 30 | // 31 | // void setAuth(String auth); 32 | 33 | @Override 34 | String toString(); 35 | 36 | int compareTo(IChatUser another); 37 | } 38 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/core/users/models/exception/ChatUserIdException.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.core.users.models.exception; 2 | 3 | /** 4 | * Created by andrealeo on 24/01/18. 5 | */ 6 | 7 | public class ChatUserIdException extends RuntimeException { 8 | 9 | public ChatUserIdException() { 10 | super(); 11 | } 12 | 13 | public ChatUserIdException(String message) { 14 | super(message); 15 | } 16 | 17 | public ChatUserIdException(String message, Throwable cause) { 18 | super(message, cause); 19 | } 20 | 21 | public ChatUserIdException(Throwable cause) { 22 | super(cause); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/instanceid/receiver/TokenBroadcastReceiver.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2016 Google Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package org.chat21.android.instanceid.receiver; 18 | 19 | import android.content.BroadcastReceiver; 20 | import android.content.Context; 21 | import android.content.Intent; 22 | import android.content.IntentFilter; 23 | import android.util.Log; 24 | 25 | /** 26 | * Receiver to capture tokens broadcast via ADB and insert them into the 27 | * running application to facilitate easy testing of custom authentication. 28 | */ 29 | public abstract class TokenBroadcastReceiver extends BroadcastReceiver { 30 | 31 | private static final String TAG = "TokenBroadcastReceiver"; 32 | 33 | public static final String ACTION_TOKEN = "com.google.example.ACTION_TOKEN"; 34 | public static final String EXTRA_KEY_TOKEN = "key_token"; 35 | 36 | @Override 37 | public void onReceive(Context context, Intent intent) { 38 | Log.d(TAG, "onReceive"); 39 | 40 | if (ACTION_TOKEN.equals(intent.getAction())) { 41 | String token = intent.getExtras().getString(EXTRA_KEY_TOKEN); 42 | onNewToken(token); 43 | } 44 | } 45 | 46 | public static IntentFilter getFilter() { 47 | Log.d(TAG, "getFilter"); 48 | 49 | IntentFilter filter = new IntentFilter(ACTION_TOKEN); 50 | return filter; 51 | } 52 | 53 | public abstract void onNewToken(String token); 54 | 55 | } 56 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/instanceid/service/SaveFirebaseInstanceIdService.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.instanceid.service; 2 | 3 | import android.util.Log; 4 | 5 | import com.google.firebase.auth.FirebaseAuth; 6 | import com.google.firebase.auth.FirebaseUser; 7 | import com.google.firebase.database.DatabaseReference; 8 | import com.google.firebase.database.FirebaseDatabase; 9 | import com.google.firebase.iid.FirebaseInstanceId; 10 | import com.google.firebase.iid.FirebaseInstanceIdService; 11 | 12 | import org.chat21.android.core.ChatManager; 13 | import org.chat21.android.utils.ChatUtils; 14 | import org.chat21.android.utils.StringUtils; 15 | 16 | import java.util.HashMap; 17 | import java.util.Map; 18 | 19 | import static org.chat21.android.utils.DebugConstants.DEBUG_LOGIN; 20 | 21 | /* 22 | * Created by stefanodp91 on 15/01/18. 23 | */ 24 | 25 | //https://github.com/MahmoudAlyuDeen/FirebaseIM/blob/master/app/src/main/java/afterapps/com/firebaseim/login/LoginActivity.java 26 | public class SaveFirebaseInstanceIdService extends FirebaseInstanceIdService { 27 | private static final String TAG_TOKEN = "TAG_TOKEN"; 28 | 29 | @Override 30 | public void onTokenRefresh() { 31 | super.onTokenRefresh(); 32 | 33 | Log.d(DEBUG_LOGIN, "SaveFirebaseInstanceIdService.onTokenRefresh"); 34 | 35 | String token = FirebaseInstanceId.getInstance().getToken(); 36 | Log.d(DEBUG_LOGIN, "SaveFirebaseInstanceIdService.onTokenRefresh:" + 37 | " called with instanceId: " + token); 38 | Log.i(TAG_TOKEN, "SaveFirebaseInstanceIdService: token == " + token); 39 | 40 | FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); 41 | 42 | String appId = ChatManager.Configuration.appId; 43 | 44 | if (firebaseUser != null && StringUtils.isValid(appId)) { 45 | 46 | DatabaseReference root; 47 | if (StringUtils.isValid(ChatManager.Configuration.firebaseUrl)) { 48 | root = FirebaseDatabase.getInstance() 49 | .getReferenceFromUrl(ChatManager.Configuration.firebaseUrl); 50 | } else { 51 | root = FirebaseDatabase.getInstance().getReference(); 52 | } 53 | 54 | DatabaseReference firebaseUsersPath = root 55 | .child("apps/" + ChatManager.Configuration.appId + 56 | "/users/" + firebaseUser.getUid() + "/instances/" + token); 57 | 58 | Map device = new HashMap<>(); 59 | device.put("device_model", ChatUtils.getDeviceModel()); 60 | device.put("platform", "Android"); 61 | device.put("platform_version", ChatUtils.getSystemVersion()); 62 | device.put("language", ChatUtils.getSystemLanguage(getResources())); 63 | 64 | firebaseUsersPath.setValue(device); // placeholder value 65 | 66 | Log.i(DEBUG_LOGIN, "SaveFirebaseInstanceIdService.onTokenRefresh: " + 67 | "saved with token: " + token + 68 | ", appId: " + appId + ", firebaseUsersPath: " + firebaseUsersPath); 69 | } else { 70 | Log.i(DEBUG_LOGIN, "SaveFirebaseInstanceIdService.onTokenRefresh:" + 71 | "user is null. token == " + token + ", appId == " + appId); 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/storage/OnUploadedCallback.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.storage; 2 | 3 | import android.net.Uri; 4 | 5 | /** 6 | * Created by stefanodp91 on 07/09/17. 7 | */ 8 | public interface OnUploadedCallback { 9 | void onUploadSuccess(String uid, Uri downloadUrl, String type); 10 | 11 | void onProgress(double progress); 12 | 13 | void onUploadFailed(Exception e); 14 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/archived_conversations/activities/ArchivedConversationListActivity.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.archived_conversations.activities; 2 | 3 | 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.support.v7.widget.Toolbar; 7 | 8 | import org.chat21.android.R; 9 | import org.chat21.android.ui.archived_conversations.fragments.ArchivedConversationListFragment; 10 | 11 | /** 12 | * Created by stefano on 02/08/2018. 13 | */ 14 | public class ArchivedConversationListActivity extends AppCompatActivity { 15 | 16 | @Override 17 | public void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | 20 | setContentView(R.layout.activity_archived_conversation_list); 21 | 22 | // #### BEGIN TOOLBAR #### 23 | Toolbar toolbar = findViewById(R.id.toolbar); 24 | setSupportActionBar(toolbar); 25 | getSupportActionBar().setDisplayHomeAsUpEnabled(false); 26 | // #### END TOOLBAR #### 27 | 28 | // #### BEGIN CONTAINER #### 29 | getSupportFragmentManager() 30 | .beginTransaction() 31 | .replace(R.id.container, new ArchivedConversationListFragment()) 32 | .commit(); 33 | // #### BEGIN CONTAINER #### 34 | } 35 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/archived_conversations/listeners/OnSwipeMenuReopenClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.archived_conversations.listeners; 2 | 3 | import org.chat21.android.core.conversations.models.Conversation; 4 | 5 | public interface OnSwipeMenuReopenClickListener { 6 | void onSwipeMenuReopened(Conversation conversation, int position); 7 | } 8 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/chat_groups/WizardNewGroup.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.chat_groups; 2 | 3 | import org.chat21.android.core.chat_groups.models.ChatGroup; 4 | 5 | /** 6 | * Created by stefanodp91 on 26/01/18. 7 | */ 8 | 9 | public class WizardNewGroup { 10 | // private static final String PRIVATE_NEW_GROUP_WIZARD_SERIALIZABLE_CHAT_GROUP = 11 | // "PRIVATE_NEW_GROUP_WIZARD_SERIALIZABLE_CHAT_GROUP"; 12 | 13 | private ChatGroup tempChatGroup = new ChatGroup(); 14 | 15 | // singleton 16 | // source : https://android.jlelse.eu/how-to-make-the-perfect-singleton-de6b951dfdb0 17 | private static volatile WizardNewGroup instance; 18 | 19 | //private constructor. 20 | private WizardNewGroup() { 21 | 22 | // Prevent form the reflection api. 23 | if (instance != null) { 24 | throw new RuntimeException("Use getInstance() method to get the single instance of this class."); 25 | } 26 | } 27 | 28 | public static WizardNewGroup getInstance() { 29 | if (instance == null) { //if there is no instance available... create new one 30 | synchronized (WizardNewGroup.class) { 31 | if (instance == null) instance = new WizardNewGroup(); 32 | } 33 | } 34 | 35 | return instance; 36 | } 37 | 38 | // // Make singleton from serialize and deserialize operation. 39 | // protected WizardNewGroup readResolve() { 40 | // return getInstance(); 41 | // } 42 | // end singleton 43 | 44 | public ChatGroup getTempChatGroup() { 45 | return tempChatGroup; 46 | } 47 | 48 | public void dispose() { 49 | clearTempGroup(); 50 | } 51 | 52 | private void clearTempGroup() { 53 | tempChatGroup.setGroupId(""); 54 | tempChatGroup.getCreatedOn(); 55 | tempChatGroup.setTimestamp(0L); 56 | tempChatGroup.setIconURL(""); 57 | tempChatGroup.getMembers().clear(); 58 | tempChatGroup.getMembersList().clear(); 59 | tempChatGroup.setName(""); 60 | tempChatGroup.setOwner(""); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/chat_groups/activities/ChatGroupsListActivity.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.chat_groups.activities; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.support.v7.widget.Toolbar; 7 | import android.util.Log; 8 | import android.view.MenuItem; 9 | 10 | import org.chat21.android.R; 11 | import org.chat21.android.core.chat_groups.models.ChatGroup; 12 | import org.chat21.android.core.messages.models.Message; 13 | import org.chat21.android.core.users.models.ChatUser; 14 | import org.chat21.android.core.users.models.IChatUser; 15 | import org.chat21.android.ui.ChatUI; 16 | import org.chat21.android.ui.chat_groups.fragments.ChatGroupsListFragment; 17 | import org.chat21.android.ui.chat_groups.listeners.OnGroupClickListener; 18 | import org.chat21.android.ui.messages.activities.MessageListActivity; 19 | 20 | import static org.chat21.android.ui.ChatUI.BUNDLE_CHANNEL_TYPE; 21 | 22 | /** 23 | * Created by stefano on 25/08/2015. 24 | */ 25 | public class ChatGroupsListActivity extends AppCompatActivity implements OnGroupClickListener { 26 | private static final String TAG = ChatGroupsListActivity.class.getSimpleName(); 27 | 28 | private ChatGroupsListFragment contactsListFragment; 29 | 30 | @Override 31 | protected void onCreate(Bundle savedInstanceState) { 32 | super.onCreate(savedInstanceState); 33 | setContentView(R.layout.activity_chat_groups_list); 34 | 35 | contactsListFragment = new ChatGroupsListFragment(); 36 | contactsListFragment.setOnChatGroupClickListener(this); 37 | 38 | // #### BEGIN TOOLBAR #### 39 | Toolbar toolbar = findViewById(R.id.toolbar); 40 | setSupportActionBar(toolbar); 41 | getSupportActionBar().setDisplayHomeAsUpEnabled(true); 42 | // #### END TOOLBAR #### 43 | 44 | // #### BEGIN CONTAINER #### 45 | getSupportFragmentManager() 46 | .beginTransaction() 47 | .replace(R.id.container, contactsListFragment) 48 | .commit(); 49 | // #### BEGIN CONTAINER #### 50 | } 51 | 52 | @Override 53 | public boolean onOptionsItemSelected(MenuItem item) { 54 | Log.d(TAG, "ContactListActivity.onOptionsItemSelected"); 55 | 56 | int id = item.getItemId(); 57 | 58 | if (id == android.R.id.home) { 59 | onBackPressed(); 60 | return true; 61 | } 62 | 63 | return super.onOptionsItemSelected(item); 64 | } 65 | 66 | @Override 67 | public void onGroupClicked(ChatGroup chatGroup, int position) { 68 | IChatUser groupRecipient = new ChatUser(chatGroup.getGroupId(), chatGroup.getName()); 69 | 70 | // start the message list activity 71 | Intent intent = new Intent(ChatGroupsListActivity.this, MessageListActivity.class); 72 | intent.putExtra(ChatUI.BUNDLE_RECIPIENT, groupRecipient); 73 | intent.putExtra(BUNDLE_CHANNEL_TYPE, Message.GROUP_CHANNEL_TYPE); 74 | startActivity(intent); 75 | finish(); 76 | } 77 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/chat_groups/listeners/OnGroupClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.chat_groups.listeners; 2 | 3 | import org.chat21.android.core.chat_groups.models.ChatGroup; 4 | 5 | /** 6 | * Created by stefanodp91 on 07/12/17. 7 | */ 8 | 9 | public interface OnGroupClickListener { 10 | void onGroupClicked(ChatGroup chatGroup, int position); 11 | } 12 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/chat_groups/listeners/OnGroupMemberClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.chat_groups.listeners; 2 | 3 | import org.chat21.android.core.users.models.IChatUser; 4 | 5 | /** 6 | * Created by stefanodp91 on 07/12/17. 7 | */ 8 | 9 | public interface OnGroupMemberClickListener { 10 | void onGroupMemberClicked(IChatUser groupMember, int position); 11 | } 12 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/chat_groups/listeners/OnRemoveClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.chat_groups.listeners; 2 | 3 | /** 4 | * Created by stefanodp91 on 17/01/17. 5 | */ 6 | 7 | public interface OnRemoveClickListener { 8 | void onRemoveClickListener(int position); 9 | } 10 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/contacts/listeners/OnContactClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.contacts.listeners; 2 | 3 | import java.io.Serializable; 4 | 5 | import org.chat21.android.core.users.models.IChatUser; 6 | 7 | /** 8 | * Created by stefanodp91 on 29/03/17. 9 | */ 10 | public interface OnContactClickListener extends Serializable { 11 | void onContactClicked(IChatUser contact, int position); 12 | } 13 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/contacts/listeners/OnCreateGroupClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.contacts.listeners; 2 | 3 | /** 4 | * Created by stefanodp91 on 04/01/18. 5 | */ 6 | 7 | public interface OnCreateGroupClickListener { 8 | void onCreateGroupClicked(); 9 | } 10 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/conversations/activities/ConversationListActivity.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.conversations.activities; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.support.v7.widget.Toolbar; 6 | 7 | import org.chat21.android.R; 8 | import org.chat21.android.ui.conversations.fragments.ConversationListFragment; 9 | 10 | /** 11 | * Created by stefano on 15/10/2016. 12 | */ 13 | public class ConversationListActivity extends AppCompatActivity { 14 | 15 | @Override 16 | public void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | 19 | setContentView(R.layout.activity_conversation_list); 20 | 21 | // #### BEGIN TOOLBAR #### 22 | Toolbar toolbar = findViewById(R.id.toolbar); 23 | setSupportActionBar(toolbar); 24 | getSupportActionBar().setDisplayHomeAsUpEnabled(false); 25 | // #### END TOOLBAR #### 26 | 27 | // #### BEGIN CONTAINER #### 28 | getSupportFragmentManager() 29 | .beginTransaction() 30 | .replace(R.id.container, new ConversationListFragment()) 31 | .commit(); 32 | // #### BEGIN CONTAINER #### 33 | } 34 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/conversations/listeners/OnConversationClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.conversations.listeners; 2 | 3 | import org.chat21.android.core.conversations.models.Conversation; 4 | 5 | /** 6 | * Created by stefanodp91 on 07/12/17. 7 | */ 8 | 9 | public interface OnConversationClickListener { 10 | void onConversationClicked(Conversation conversation, int position); 11 | } 12 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/conversations/listeners/OnConversationLongClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.conversations.listeners; 2 | 3 | import org.chat21.android.core.conversations.models.Conversation; 4 | 5 | /** 6 | * Created by stefanodp91 on 07/12/17. 7 | */ 8 | 9 | public interface OnConversationLongClickListener { 10 | void onConversationLongClicked(Conversation conversation, int position); 11 | } 12 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/conversations/listeners/OnNewConversationClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.conversations.listeners; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * Created by stefanodp91 on 29/03/17. 7 | */ 8 | public interface OnNewConversationClickListener extends Serializable { 9 | void onNewConversationClicked(); 10 | } 11 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/conversations/listeners/OnSwipeMenuCloseClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.conversations.listeners; 2 | 3 | import org.chat21.android.core.conversations.models.Conversation; 4 | 5 | public interface OnSwipeMenuCloseClickListener { 6 | void onSwipeMenuClosed(Conversation conversation, int position); 7 | } 8 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/conversations/listeners/OnSwipeMenuUnreadClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.conversations.listeners; 2 | 3 | import org.chat21.android.core.conversations.models.Conversation; 4 | 5 | public interface OnSwipeMenuUnreadClickListener { 6 | void onSwipeMenuUnread(Conversation conversation, int position); 7 | } 8 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/decorations/ItemDecoration.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.decorations; 2 | 3 | import android.content.Context; 4 | import android.graphics.Canvas; 5 | import android.graphics.Rect; 6 | import android.graphics.drawable.Drawable; 7 | import android.support.v4.view.ViewCompat; 8 | import android.support.v7.widget.DividerItemDecoration; 9 | import android.support.v7.widget.RecyclerView; 10 | import android.util.DisplayMetrics; 11 | import android.view.View; 12 | 13 | /** 14 | * Created by stefanodp91 on 27/02/18. 15 | */ 16 | 17 | public class ItemDecoration extends DividerItemDecoration { 18 | 19 | private Context mContext; 20 | private Drawable mDivider; 21 | private final Rect mBounds = new Rect(); 22 | 23 | /** 24 | * Creates a divider {@link RecyclerView.ItemDecoration} that can be used with a 25 | * {@link android.support.v7.widget.LinearLayoutManager}. 26 | * 27 | * @param context Current context, it will be used to access resources. 28 | * @param orientation Divider orientation. Should be {@link #HORIZONTAL} or {@link #VERTICAL}. 29 | */ 30 | public ItemDecoration(Context context, int orientation, Drawable divider) { 31 | super(context, orientation); 32 | mContext = context; 33 | mDivider = divider; 34 | } 35 | 36 | @Override 37 | public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { 38 | canvas.save(); 39 | final int leftWithMargin = convertDpToPx(56); 40 | final int right = parent.getWidth(); 41 | 42 | final int childCount = parent.getChildCount(); 43 | for (int i = 0; i < childCount; i++) { 44 | final View child = parent.getChildAt(i); 45 | parent.getDecoratedBoundsWithMargins(child, mBounds); 46 | final int bottom = mBounds.bottom + Math.round(ViewCompat.getTranslationY(child)); 47 | final int top = bottom - mDivider.getIntrinsicHeight(); 48 | mDivider.setBounds(leftWithMargin, top, right, bottom); 49 | mDivider.draw(canvas); 50 | } 51 | canvas.restore(); 52 | } 53 | 54 | private int convertDpToPx(int dp) { 55 | return Math.round(dp * 56 | (mContext.getResources().getDisplayMetrics().xdpi / DisplayMetrics.DENSITY_DEFAULT)); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/login/listeners/OnLogoutClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.login.listeners; 2 | 3 | /** 4 | * Created by stefanodp91 on 07/12/17. 5 | */ 6 | 7 | public interface OnLogoutClickListener { 8 | void onLogoutClicked(); 9 | } 10 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/messages/listeners/OnAttachClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.messages.listeners; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * Created by stefanodp91 on 29/03/17. 7 | */ 8 | public interface OnAttachClickListener extends Serializable { 9 | void onAttachClicked(Object object); 10 | } 11 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/messages/listeners/OnAttachDocumentsClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.messages.listeners; 2 | 3 | import org.chat21.android.core.users.models.IChatUser; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * Created by stefanodp91 on 29/03/17. 9 | */ 10 | public interface OnAttachDocumentsClickListener extends Serializable { 11 | void onAttachDocumentsClicked(IChatUser recipient, String channelType, T data); 12 | } 13 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/ui/messages/listeners/OnMessageClickListener.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.ui.messages.listeners; 2 | 3 | import android.text.style.ClickableSpan; 4 | import android.widget.TextView; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * Created by stefanodp91 on 29/03/17. 10 | */ 11 | public interface OnMessageClickListener extends Serializable { 12 | void onMessageLinkClick(TextView message,ClickableSpan clickableSpan); 13 | // void onMessageLinkClick(TextView message); 14 | 15 | // String getUrlToListenTo(); 16 | } 17 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/utils/ChatUtils.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.utils; 2 | 3 | import android.content.Context; 4 | import android.content.pm.ApplicationInfo; 5 | import android.content.pm.PackageInfo; 6 | import android.content.pm.PackageManager; 7 | import android.content.res.Resources; 8 | import android.os.Build; 9 | 10 | 11 | /** 12 | * Created by stefano on 25/08/2015. 13 | */ 14 | public class ChatUtils { 15 | // private static final String TAG = ChatUtils.class.getName(); 16 | 17 | // // check if the group creation enabled or disabled 18 | // public static boolean areGroupsEnabled(Context context) { 19 | // Log.d(TAG, "areGroupsEnabled"); 20 | // boolean isEnabled = false; 21 | // if (context.getString(R.string.enable_groups).trim().compareToIgnoreCase("true") == 0) { 22 | // isEnabled = true; 23 | // } else if (context.getString(R.string.enable_groups).trim().compareToIgnoreCase("false") == 0) { 24 | // isEnabled = false; 25 | // } 26 | // return isEnabled; 27 | // } 28 | 29 | /** 30 | * @return Application's version code from the {@code PackageManager}. 31 | */ 32 | public static int getVersionCode(Context context) { 33 | // Log.d(TAG, "getVersionCode"); 34 | try { 35 | PackageInfo packageInfo = context.getPackageManager() 36 | .getPackageInfo(context.getPackageName(), 0); 37 | return packageInfo.versionCode; 38 | } catch (PackageManager.NameNotFoundException e) { 39 | // should never happen 40 | throw new RuntimeException("Could not get package name: " + e); 41 | } 42 | } 43 | 44 | /** 45 | * @return Application's version name from the {@code PackageManager}. 46 | */ 47 | public static String getVersionName(Context context) { 48 | // Log.d(TAG, "getVersionName"); 49 | try { 50 | PackageInfo packageInfo = context.getPackageManager() 51 | .getPackageInfo(context.getPackageName(), 0); 52 | return packageInfo.versionName; 53 | } catch (PackageManager.NameNotFoundException e) { 54 | // should never happen 55 | throw new RuntimeException("Could not get package name: " + e); 56 | } 57 | } 58 | 59 | public static String getApplicationName(Context context) { 60 | ApplicationInfo applicationInfo = context.getApplicationInfo(); 61 | int stringId = applicationInfo.labelRes; 62 | return stringId == 0 ? applicationInfo.nonLocalizedLabel.toString() : context.getString(stringId); 63 | } 64 | 65 | // /** 66 | // * Returns the device language code 67 | // * 68 | // * @return 69 | // */ 70 | // public static String getLanguage() { 71 | // Log.d(TAG, "getLanguage"); 72 | //// Locale locale = Locale.getDefault(); 73 | // String lang = Locale.getDefault().getLanguage(); 74 | // Log.d(TAG, "Language: " + lang); 75 | // return lang; 76 | // } 77 | 78 | public static String getDeviceModel() { 79 | return android.os.Build.MANUFACTURER + " " + android.os.Build.MODEL; 80 | } 81 | 82 | public static String getSystemVersion() { 83 | String release = Build.VERSION.RELEASE; 84 | // int sdkVersion = Build.VERSION.SDK_INT; 85 | // return release + " - " + sdkVersion; 86 | return release; 87 | } 88 | 89 | public static String getSystemLanguage(Resources resources) { 90 | return resources.getConfiguration().locale.toString(); 91 | } 92 | 93 | @Deprecated 94 | public static String normalizeUsername(String username) { 95 | return username.replace(".", "_"); 96 | } 97 | 98 | @Deprecated 99 | public static String deNormalizeUsername(String username) { 100 | return username.replace("_", "."); 101 | } 102 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/utils/DebugConstants.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.utils; 2 | 3 | /** 4 | * Created by stefanodp91 on 12/09/17. 5 | */ 6 | 7 | public class DebugConstants { 8 | public static final String DEBUG_CORE = "CHAT21_D_CORE"; 9 | public static final String DEBUG_LOGIN = "CHAT21_D_LOGIN"; 10 | public static final String DEBUG_SIGNUP = "CHAT21_D_SIGNUP"; 11 | 12 | public static final String DEBUG_NOTIFICATION = "CHAT21_D_NOTIFICATION"; 13 | public static final String DEBUG_CONTACTS_SYNC = "CHAT21_D_CONTACTS_SYNC"; 14 | public static final String DEBUG_GROUPS = "CHAT21_D_GROUPS"; 15 | public static final String DEBUG_USER_PRESENCE = "CHAT21_D_USER_PRESENCE"; 16 | public static final String DEBUG_MY_PRESENCE = "CHAT21_D_MY_PRESENCE"; 17 | } 18 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/utils/IOUtils.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.utils; 2 | 3 | import android.content.Context; 4 | import android.util.Log; 5 | 6 | import java.io.FileInputStream; 7 | import java.io.FileOutputStream; 8 | import java.io.ObjectInputStream; 9 | import java.io.ObjectOutputStream; 10 | 11 | public class IOUtils { 12 | private static final String TAG = IOUtils.class.getName(); 13 | 14 | /** 15 | * Serializes to the sdcard an object 16 | * 17 | * @param context 18 | * @param filename the object unique filename 19 | * @param object the objectì 20 | * @return true if success, false otherwise 21 | */ 22 | public static boolean saveObjectToFile(Context context, String filename, Object object) { 23 | // Log.d(TAG, "saveObjectToFile"); 24 | try { 25 | //Open a private file associated with this Context's application package 26 | //for writing. Creates the file if it doesn't already exist. 27 | FileOutputStream fStream = context.openFileOutput(filename, Context.MODE_PRIVATE); 28 | //Select where you wish to save the file... 29 | ObjectOutputStream oStream = new ObjectOutputStream(fStream); 30 | 31 | oStream.writeObject(object); 32 | oStream.flush(); 33 | oStream.close(); 34 | 35 | Log.d(TAG, filename + " serialized to disk with success"); 36 | } catch (Exception e) { 37 | Log.e(TAG, "cannot serialize " + filename + " to disk. " + e.getMessage()); 38 | return false; 39 | } 40 | return true; 41 | } 42 | 43 | /** 44 | * Funzione che permette di recuperare un oggetto dal file salvato 45 | * in modo persistente su disco. 46 | */ 47 | 48 | /** 49 | * Retrieves a serialized obejct from the disk 50 | * 51 | * @param context 52 | * @param filename the object unique filename 53 | * @return the serialized object 54 | */ 55 | public static Object getObjectFromFile(Context context, String filename) { 56 | // Log.d(TAG, "getObjectFromFile"); 57 | // Log.d(TAG, "context: " + context); 58 | 59 | try { 60 | FileInputStream inputStream = context.openFileInput(filename); 61 | ObjectInputStream ois = new ObjectInputStream(inputStream); 62 | Object object = ois.readObject(); 63 | ois.close(); 64 | Log.d(TAG, filename + " retrieved from disk with success"); 65 | return object; 66 | } catch (Exception e) { 67 | Log.e(TAG, "cannot retrieve the serialize " + filename + " from disk. " + e.getMessage()); 68 | } 69 | return null; 70 | } 71 | 72 | 73 | /** 74 | * Funzione che permette di cancellare un oggetto precedentemente salvato in un file su disco. 75 | * 76 | * @param context 77 | * @param filename the object unique filename 78 | * @return true if success, false otherwise 79 | */ 80 | public static boolean deleteObject(Context context, String filename) { 81 | // Log.d(TAG, "deleteObject"); 82 | boolean success = context.deleteFile(filename); 83 | 84 | if (success) { 85 | Log.d(TAG, filename + " deleted from disk with success"); 86 | } else { 87 | Log.e(TAG, "cannot delete object " + filename + " from disk"); 88 | } 89 | return success; 90 | } 91 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/utils/StringUtils.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.utils; 2 | 3 | import java.util.regex.Pattern; 4 | 5 | /** 6 | * Created by stefano on 18/05/2016. 7 | */ 8 | public class StringUtils { 9 | // private static final String TAG = StringUtils.class.getName(); 10 | 11 | // Sort two strings alphabetically 12 | public static String[] sort(String x, String y) { 13 | // Log.d(TAG, "sort"); 14 | String[] results = new String[2]; 15 | 16 | if (x.compareToIgnoreCase(y) <= 0) { 17 | results[0] = x; 18 | results[1] = y; 19 | } else { 20 | results[0] = y; 21 | results[1] = x; 22 | } 23 | 24 | return results; 25 | } 26 | 27 | public static boolean isValid(String string) { 28 | // Log.d(TAG, "isValid"); 29 | return (string != null && !string.trim().isEmpty()) ? true : false; 30 | } 31 | 32 | /** 33 | * Replaces all the Firebase forbidden character with a custom string 34 | * 35 | * @param text the text to normalize 36 | * @param toReplace the custom string 37 | * @return the normalized string 38 | */ 39 | public static String removeFirebaseForbiddenChars(String text, String toReplace) { 40 | // Log.d(TAG, "removeFirebaseForbiddenChars"); 41 | text = text.replace(".", toReplace); 42 | text = text.replace("$", toReplace); 43 | text = text.replace("#", toReplace); 44 | text = text.replace("[", toReplace); 45 | text = text.replace("]", toReplace); 46 | text = text.replace("/", toReplace); 47 | return text; 48 | } 49 | 50 | public static String[] splitByChar(String toSplit, String criteria) { 51 | return toSplit.split(criteria); 52 | } 53 | 54 | public static boolean validateEmail(String email) { 55 | Pattern pattern = Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE); 56 | 57 | return pattern.matcher(email).matches() ? true : false; 58 | 59 | } 60 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/utils/TimeUtils.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.utils; 2 | 3 | import android.content.Context; 4 | 5 | import org.chat21.android.R; 6 | 7 | import java.text.DateFormat; 8 | import java.text.SimpleDateFormat; 9 | import java.util.Calendar; 10 | import java.util.Date; 11 | import java.util.Locale; 12 | 13 | /** 14 | * Created by stefano on 05/09/2015. 15 | */ 16 | public class TimeUtils { 17 | 18 | public static boolean isDateToday(long milliSeconds) { 19 | Calendar toCheck = Calendar.getInstance(); 20 | toCheck.setTimeInMillis(milliSeconds); 21 | 22 | Date toCheckDate = toCheck.getTime(); 23 | 24 | toCheck.setTimeInMillis(System.currentTimeMillis()); 25 | toCheck.set(Calendar.HOUR_OF_DAY, 0); 26 | toCheck.set(Calendar.MINUTE, 0); 27 | toCheck.set(Calendar.SECOND, 0); 28 | 29 | Date startDate = toCheck.getTime(); 30 | 31 | return toCheckDate.compareTo(startDate) > 0; 32 | } 33 | 34 | public static boolean isYesterday(long milliSeconds) { 35 | 36 | Calendar toCheck = Calendar.getInstance(); 37 | toCheck.setTimeInMillis(milliSeconds); // your date 38 | 39 | Calendar yesterday = Calendar.getInstance(); // today 40 | yesterday.add(Calendar.DAY_OF_YEAR, -1); // yesterday 41 | 42 | boolean isYesterday = yesterday.get(Calendar.YEAR) == toCheck.get(Calendar.YEAR) 43 | && yesterday.get(Calendar.DAY_OF_YEAR) == toCheck.get(Calendar.DAY_OF_YEAR); 44 | 45 | return isYesterday ? true : false; 46 | } 47 | 48 | public static boolean isDateInCurrentWeek(long milliSeconds) { 49 | Calendar currentCalendar = Calendar.getInstance(); 50 | int week = currentCalendar.get(Calendar.WEEK_OF_YEAR); 51 | int year = currentCalendar.get(Calendar.YEAR); 52 | 53 | Calendar targetCalendar = Calendar.getInstance(); 54 | targetCalendar.setTimeInMillis(milliSeconds); 55 | int targetWeek = targetCalendar.get(Calendar.WEEK_OF_YEAR); 56 | int targetYear = targetCalendar.get(Calendar.YEAR); 57 | 58 | return week == targetWeek && year == targetYear; 59 | } 60 | 61 | // https://www.ibm.com/support/knowledgecenter/en/SSMKHH_9.0.0/com.ibm.etools.mft.doc/ak05616_.htm 62 | public static String getFormattedTimestamp(Context context, long milliSeconds) { 63 | if (isDateToday(milliSeconds)) { 64 | return formatTimestamp(milliSeconds, "HH:mm"); 65 | } else if (isYesterday(milliSeconds)) { 66 | return context.getString(R.string.yesterday); 67 | } else if (isDateInCurrentWeek(milliSeconds)) { 68 | return formatTimestamp(milliSeconds, "EEEE"); 69 | } else { 70 | return formatTimestamp(milliSeconds, "dd/MM/yy"); 71 | } 72 | } 73 | 74 | public static String formatTimestamp(Long timestamp, String pattern) { 75 | DateFormat dateFormat = new SimpleDateFormat(pattern); 76 | return dateFormat.format(timestamp); 77 | } 78 | 79 | public static String getDayOfWeek(Date date) { 80 | Calendar cal = Calendar.getInstance(); 81 | cal.setTime(date); 82 | return cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault()); 83 | } 84 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/utils/http_manager/HttpGETTask.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.utils.http_manager; 2 | 3 | import android.os.AsyncTask; 4 | import android.util.Base64; 5 | import android.util.Log; 6 | 7 | import java.io.BufferedReader; 8 | import java.io.InputStreamReader; 9 | import java.net.HttpURLConnection; 10 | import java.net.URL; 11 | 12 | /** 13 | * Created by stefanodp91 on 09/05/17. 14 | */ 15 | class HttpGETTask extends AsyncTask { 16 | private static final String TAG = HttpGETTask.class.getName(); 17 | 18 | private OnResponseRetrievedCallback callback; 19 | 20 | private Exception exception = null; 21 | 22 | private String mContentType = "application/x-www-form-urlencoded"; 23 | private int mTimeout = 5000; 24 | 25 | private String mAuth; 26 | 27 | public HttpGETTask(OnResponseRetrievedCallback callback) { 28 | Log.d(TAG, "HttpGETTask.constructor"); 29 | 30 | this.callback = callback; 31 | } 32 | 33 | public void setCurlCredentials(String username, String password) { 34 | Log.d(TAG, "setCurlCredentials"); 35 | 36 | mAuth = username + ":" + password; 37 | mAuth = Base64.encodeToString(mAuth.getBytes(), Base64.DEFAULT); 38 | } 39 | 40 | @Override 41 | protected void onPreExecute() { 42 | super.onPreExecute(); 43 | } 44 | 45 | @Override 46 | protected String doInBackground(String... params) { 47 | Log.d(TAG, "doInBackground"); 48 | 49 | StringBuilder sb = null; 50 | BufferedReader reader = null; 51 | String response = null; 52 | try { 53 | 54 | URL url = new URL(params[0]); 55 | Log.d(TAG, "HttpGETTask.doInBackground: url == " + url.toString()); 56 | 57 | HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 58 | connection.setRequestProperty("Content-Type", mContentType); 59 | connection.setRequestProperty("Authorization", "Basic " + mAuth); 60 | connection.setConnectTimeout(mTimeout); 61 | connection.setRequestMethod("GET"); 62 | connection.connect(); 63 | int statusCode = connection.getResponseCode(); 64 | //Log.e("statusCode", "" + statusCode); 65 | if (statusCode == 200) { 66 | sb = new StringBuilder(); 67 | reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 68 | String line; 69 | while ((line = reader.readLine()) != null) { 70 | sb.append(line + "\n"); 71 | } 72 | } 73 | 74 | connection.disconnect(); 75 | if (sb != null) 76 | response = sb.toString(); 77 | } catch (Exception e) { 78 | Log.e(TAG, e.getMessage()); 79 | exception = e; 80 | } finally { 81 | if (reader != null) { 82 | try { 83 | reader.close(); 84 | } catch (Exception e) { 85 | Log.e(TAG, e.getMessage()); 86 | exception = e; 87 | } 88 | } 89 | } 90 | return response; 91 | } 92 | 93 | @Override 94 | protected void onPostExecute(String response) { 95 | Log.d(TAG, "onPostExecute"); 96 | 97 | if (exception == null) { 98 | callback.onSuccess(response); 99 | } else { 100 | callback.onError(exception); 101 | } 102 | } 103 | 104 | public void setContentType(String contentType) { 105 | Log.d(TAG, "setContentType"); 106 | 107 | mContentType = contentType; 108 | } 109 | 110 | public String getContentType() { 111 | Log.d(TAG, "getContentType"); 112 | 113 | return mContentType; 114 | } 115 | 116 | public void setTimeout(int timeout) { 117 | Log.d(TAG, "setTimeout"); 118 | 119 | mTimeout = timeout; 120 | } 121 | 122 | public int getTimeout() { 123 | Log.d(TAG, "getTimeout"); 124 | 125 | return mTimeout; 126 | } 127 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/utils/http_manager/OnResponseRetrievedCallback.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.utils.http_manager; 2 | 3 | /** 4 | * Created by stefanodp91 on 09/05/17. 5 | */ 6 | public interface OnResponseRetrievedCallback { 7 | void onSuccess(T response); 8 | 9 | void onError(Exception e); 10 | } 11 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/utils/image/CropCircleTransformation.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.utils.image; 2 | import android.content.Context; 3 | import android.graphics.Bitmap; 4 | import android.graphics.BitmapShader; 5 | import android.graphics.Canvas; 6 | import android.graphics.Matrix; 7 | import android.graphics.Paint; 8 | import com.bumptech.glide.Glide; 9 | import com.bumptech.glide.load.Transformation; 10 | import com.bumptech.glide.load.engine.Resource; 11 | import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; 12 | import com.bumptech.glide.load.resource.bitmap.BitmapResource; 13 | 14 | /** 15 | * Created by stefano on 19/04/2016. 16 | */ 17 | public class CropCircleTransformation implements Transformation { 18 | 19 | private BitmapPool mBitmapPool; 20 | 21 | public CropCircleTransformation(Context context) { 22 | this(Glide.get(context).getBitmapPool()); 23 | } 24 | 25 | public CropCircleTransformation(BitmapPool pool) { 26 | this.mBitmapPool = pool; 27 | } 28 | 29 | @Override 30 | public Resource transform(Resource resource, int outWidth, int outHeight) { 31 | Bitmap source = resource.get(); 32 | int size = Math.min(source.getWidth(), source.getHeight()); 33 | 34 | int width = (source.getWidth() - size) / 2; 35 | int height = (source.getHeight() - size) / 2; 36 | 37 | Bitmap bitmap = mBitmapPool.get(size, size, Bitmap.Config.ARGB_8888); 38 | if (bitmap == null) { 39 | bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); 40 | } 41 | 42 | Canvas canvas = new Canvas(bitmap); 43 | Paint paint = new Paint(); 44 | BitmapShader shader = 45 | new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP); 46 | if (width != 0 || height != 0) { 47 | // source isn't square, move viewport to center 48 | Matrix matrix = new Matrix(); 49 | matrix.setTranslate(-width, -height); 50 | shader.setLocalMatrix(matrix); 51 | } 52 | paint.setShader(shader); 53 | paint.setAntiAlias(true); 54 | 55 | float r = size / 2f; 56 | canvas.drawCircle(r, r, r, paint); 57 | 58 | return BitmapResource.obtain(bitmap, mBitmapPool); 59 | } 60 | 61 | @Override public String getId() { 62 | return "CropCircleTransformation()"; 63 | } 64 | } -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/utils/image/ImageUtils.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.utils.image; 2 | 3 | import android.content.ContentResolver; 4 | import android.content.Context; 5 | import android.database.Cursor; 6 | import android.graphics.Bitmap; 7 | import android.graphics.BitmapFactory; 8 | import android.graphics.PorterDuff; 9 | import android.graphics.drawable.Drawable; 10 | import android.net.Uri; 11 | import android.provider.MediaStore; 12 | import android.support.annotation.ColorRes; 13 | import android.support.annotation.DrawableRes; 14 | 15 | import java.io.ByteArrayOutputStream; 16 | import java.io.FileNotFoundException; 17 | import java.io.IOException; 18 | import java.io.InputStream; 19 | 20 | /** 21 | * Created by frontiere21 on 30/09/16. 22 | */ 23 | 24 | public class ImageUtils { 25 | // private static final String TAG = ImageUtils.class.getName(); 26 | 27 | /** 28 | * returns a drawable with the new color 29 | * 30 | * @param context 31 | * @param colorToId the id of the new color to change 32 | * @param drawableToChangeId the id of the drawable to color 33 | * @return the colored drawable 34 | */ 35 | public static Drawable changeDrawableColor(Context context, @ColorRes int colorToId, 36 | @DrawableRes int drawableToChangeId) { 37 | // Log.v(TAG, "changeDrawableColor"); 38 | int color = context.getResources().getColor(colorToId); 39 | Drawable drawable = context.getResources().getDrawable(drawableToChangeId); 40 | drawable.setColorFilter(color, PorterDuff.Mode.MULTIPLY); 41 | 42 | return drawable; 43 | } 44 | 45 | // source : 46 | // https://stackoverflow.com/questions/30527045/choosing-photo-using-new-google-photos-app-is-broken 47 | public static Uri getImageUrlWithAuthority(Context context, Uri uri) { 48 | InputStream is = null; 49 | if (uri.getAuthority() != null) { 50 | try { 51 | is = context.getContentResolver().openInputStream(uri); 52 | Bitmap bmp = BitmapFactory.decodeStream(is); 53 | return writeToTempImageAndGetPathUri(context, bmp); 54 | } catch (FileNotFoundException e) { 55 | e.printStackTrace(); 56 | } catch (Exception e) { 57 | e.printStackTrace(); 58 | } finally { 59 | try { 60 | is.close(); 61 | } catch (IOException e) { 62 | e.printStackTrace(); 63 | } 64 | } 65 | } 66 | return null; 67 | } 68 | 69 | private static Uri writeToTempImageAndGetPathUri(Context inContext, Bitmap inImage) { 70 | ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 71 | inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 72 | String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 73 | return Uri.parse(path); 74 | } 75 | 76 | public static String getRealPathFromURI(ContentResolver contentResolver, Uri contentUri) { 77 | Cursor cursor = contentResolver.query(contentUri, null, null, null, null); 78 | if (cursor == null) { 79 | return contentUri.getPath(); 80 | } else { 81 | cursor.moveToFirst(); 82 | int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 83 | return cursor.getString(index); 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /chat21/src/main/java/org/chat21/android/utils/views/TextViewLinkHandler.java: -------------------------------------------------------------------------------- 1 | package org.chat21.android.utils.views; 2 | 3 | import android.text.Layout; 4 | import android.text.Selection; 5 | import android.text.Spannable; 6 | import android.text.method.LinkMovementMethod; 7 | import android.text.style.ClickableSpan; 8 | import android.view.MotionEvent; 9 | import android.widget.TextView; 10 | 11 | /** 12 | * Created by andrea on 12/04/17. 13 | */ 14 | 15 | public abstract class TextViewLinkHandler extends LinkMovementMethod { 16 | 17 | // private String urlStartWith; 18 | // 19 | // public TextViewLinkHandler(String urlStartWith) { 20 | // super(); 21 | // this.urlStartWith = urlStartWith; 22 | // } 23 | 24 | @Override 25 | public boolean onTouchEvent(TextView widget, Spannable buffer, 26 | MotionEvent event) { 27 | int action = event.getAction(); 28 | 29 | if (action == MotionEvent.ACTION_UP || 30 | action == MotionEvent.ACTION_DOWN) { 31 | int x = (int) event.getX(); 32 | int y = (int) event.getY(); 33 | 34 | x -= widget.getTotalPaddingLeft(); 35 | y -= widget.getTotalPaddingTop(); 36 | 37 | x += widget.getScrollX(); 38 | y += widget.getScrollY(); 39 | 40 | Layout layout = widget.getLayout(); 41 | int line = layout.getLineForVertical(y); 42 | int off = layout.getOffsetForHorizontal(line, x); 43 | 44 | ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class); 45 | 46 | if (link.length != 0) { 47 | if (action == MotionEvent.ACTION_UP) { 48 | onLinkClick(link[0]); 49 | // URLSpan[] linkUrlSpan = buffer.getSpans(off, off, URLSpan.class); 50 | // if (linkUrlSpan[0].getURL().toString().startsWith(urlStartWith)) { 51 | //onLinkClick(linkUrlSpan[0].getURL()); 52 | // }else { 53 | // link[0].onClick(widget); 54 | // } 55 | } else if (action == MotionEvent.ACTION_DOWN) { 56 | Selection.setSelection(buffer, 57 | buffer.getSpanStart(link[0]), 58 | buffer.getSpanEnd(link[0])); 59 | } 60 | 61 | return true; 62 | } else { 63 | Selection.removeSelection(buffer); 64 | } 65 | } 66 | 67 | return super.onTouchEvent(widget, buffer, event); 68 | } 69 | 70 | abstract public void onLinkClick(ClickableSpan clickableSpan); 71 | 72 | 73 | //abstract public void onLinkClick(String url); 74 | 75 | 76 | // public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { 77 | // if (event.getAction() != MotionEvent.ACTION_UP) 78 | // return super.onTouchEvent(widget, buffer, event); 79 | // 80 | // int x = (int) event.getX(); 81 | // int y = (int) event.getY(); 82 | // 83 | // x -= widget.getTotalPaddingLeft(); 84 | // y -= widget.getTotalPaddingTop(); 85 | // 86 | // x += widget.getScrollX(); 87 | // y += widget.getScrollY(); 88 | // 89 | // Layout layout = widget.getLayout(); 90 | // int line = layout.getLineForVertical(y); 91 | // int off = layout.getOffsetForHorizontal(line, x); 92 | // 93 | // URLSpan[] link = buffer.getSpans(off, off, URLSpan.class); 94 | // if (link.length != 0) { 95 | // onLinkClick(link[0].getURL()); 96 | // } 97 | // return true; 98 | // } 99 | 100 | } -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi-v11/ic_notification_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi-v11/ic_notification_small.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi-v9/ic_notification_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi-v9/ic_notification_small.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/balloon_recipient.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/balloon_recipient.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/balloon_recipient_block.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/balloon_recipient_block.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/balloon_sender.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/balloon_sender.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/balloon_sender_block.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/balloon_sender_block.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/baseline_history_white_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/baseline_history_white_24.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/chat_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/chat_background.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/error_view_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/error_view_cloud.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_add_member_grey_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_add_member_grey_36dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_add_member_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_add_member_white_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_attachment_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_attachment_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_chat_white_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_chat_white_48dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_contact_already_added_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_contact_already_added_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_group_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_group_avatar.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_keyboard_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_keyboard_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_message_receipt_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_message_receipt_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_message_sending_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_message_sending_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_message_sent_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_message_sent_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_notification_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_notification_foreground.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_notification_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_notification_small.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_person_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_person_avatar.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_placeholder_file_recipient_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_placeholder_file_recipient_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_remove_selected_contact_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_remove_selected_contact_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-hdpi/ic_send_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-hdpi/ic_send_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/chat_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/chat_background.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_add_member_grey_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_add_member_grey_36dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_add_member_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_add_member_white_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_attachment_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_attachment_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_chat_white_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_chat_white_48dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_contact_already_added_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_contact_already_added_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_group_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_group_avatar.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_keyboard_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_keyboard_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_message_receipt_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_message_receipt_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_message_sending_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_message_sending_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_message_sent_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_message_sent_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_person_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_person_avatar.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_placeholder_file_recipient_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_placeholder_file_recipient_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_remove_selected_contact_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_remove_selected_contact_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-ldpi/ic_send_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-ldpi/ic_send_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi-v11/ic_notification_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi-v11/ic_notification_small.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi-v9/ic_notification_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi-v9/ic_notification_small.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/balloon_recipient.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/balloon_recipient.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/balloon_recipient_block.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/balloon_recipient_block.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/balloon_sender.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/balloon_sender.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/balloon_sender_block.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/balloon_sender_block.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/baseline_history_white_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/baseline_history_white_24.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/chat_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/chat_background.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/error_view_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/error_view_cloud.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_add_member_grey_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_add_member_grey_36dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_add_member_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_add_member_white_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_attachment_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_attachment_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_chat_white_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_chat_white_48dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_contact_already_added_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_contact_already_added_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_group_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_group_avatar.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_keyboard_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_keyboard_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_message_receipt_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_message_receipt_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_message_sending_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_message_sending_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_message_sent_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_message_sent_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_notification_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_notification_foreground.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_notification_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_notification_small.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_person_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_person_avatar.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_placeholder_file_recipient_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_placeholder_file_recipient_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_remove_selected_contact_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_remove_selected_contact_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-mdpi/ic_send_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-mdpi/ic_send_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi-v11/ic_notification_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi-v11/ic_notification_small.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi-v9/ic_notification_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi-v9/ic_notification_small.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/balloon_recipient.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/balloon_recipient.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/balloon_recipient_block.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/balloon_recipient_block.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/balloon_sender.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/balloon_sender.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/balloon_sender_block.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/balloon_sender_block.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/baseline_history_white_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/baseline_history_white_24.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/chat_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/chat_background.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/error_view_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/error_view_cloud.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_add_member_grey_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_add_member_grey_36dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_add_member_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_add_member_white_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_attachment_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_attachment_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_chat_white_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_chat_white_48dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_contact_already_added_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_contact_already_added_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_group_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_group_avatar.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_keyboard_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_keyboard_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_message_receipt_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_message_receipt_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_message_sending_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_message_sending_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_message_sent_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_message_sent_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_notification_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_notification_foreground.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_notification_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_notification_small.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_person_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_person_avatar.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_placeholder_file_recipient_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_placeholder_file_recipient_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_remove_selected_contact_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_remove_selected_contact_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xhdpi/ic_send_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xhdpi/ic_send_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi-v11/ic_notification_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi-v11/ic_notification_small.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi-v9/ic_notification_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi-v9/ic_notification_small.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/balloon_recipient.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/balloon_recipient.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/balloon_recipient_block.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/balloon_recipient_block.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/balloon_sender.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/balloon_sender.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/balloon_sender_block.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/balloon_sender_block.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/baseline_history_white_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/baseline_history_white_24.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/chat_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/chat_background.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/error_view_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/error_view_cloud.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_add_member_grey_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_add_member_grey_36dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_add_member_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_add_member_white_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_attachment_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_attachment_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_chat_white_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_chat_white_48dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_contact_already_added_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_contact_already_added_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_group_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_group_avatar.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_keyboard_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_keyboard_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_message_receipt_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_message_receipt_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_message_sending_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_message_sending_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_message_sent_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_message_sent_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_notification_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_notification_foreground.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_notification_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_notification_small.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_person_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_person_avatar.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_placeholder_file_recipient_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_placeholder_file_recipient_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_remove_selected_contact_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_remove_selected_contact_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxhdpi/ic_send_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxhdpi/ic_send_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/balloon_recipient.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/balloon_recipient.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/balloon_recipient_block.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/balloon_recipient_block.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/balloon_sender.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/balloon_sender.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/balloon_sender_block.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/balloon_sender_block.9.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/baseline_history_white_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/baseline_history_white_24.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/chat_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/chat_background.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_add_member_grey_36dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_add_member_grey_36dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_add_member_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_add_member_white_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_attachment_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_attachment_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_chat_white_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_chat_white_48dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_contact_already_added_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_contact_already_added_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_group_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_group_avatar.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_keyboard_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_keyboard_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_message_receipt_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_message_receipt_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_message_sending_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_message_sending_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_message_sent_16dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_message_sent_16dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_notification_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_notification_foreground.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_person_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_person_avatar.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_placeholder_file_recipient_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_placeholder_file_recipient_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_remove_selected_contact_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_remove_selected_contact_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable-xxxhdpi/ic_send_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chat21/chat21-android-sdk/067437cb8293cb2a362d8ecaa8d6e51a01da6367/chat21/src/main/res/drawable-xxxhdpi/ic_send_24dp.png -------------------------------------------------------------------------------- /chat21/src/main/res/drawable/activity_message_list_background_rounded_error_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /chat21/src/main/res/drawable/border_group_admin.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /chat21/src/main/res/drawable/border_row_closed_archived_conversation.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | -------------------------------------------------------------------------------- /chat21/src/main/res/drawable/circle_shape.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /chat21/src/main/res/drawable/circle_shape_green.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /chat21/src/main/res/drawable/decorator_activity_add_members_to_groups.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /chat21/src/main/res/drawable/decorator_activity_contact_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /chat21/src/main/res/drawable/decorator_activity_group_admin_panel_members_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /chat21/src/main/res/drawable/decorator_activity_my_groups_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /chat21/src/main/res/drawable/decorator_add_filtered_member.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /chat21/src/main/res/drawable/decorator_fragment_archived_conversation_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /chat21/src/main/res/drawable/decorator_fragment_conversation_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /chat21/src/main/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /chat21/src/main/res/drawable/shape_row_chat_timestamp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 15 | -------------------------------------------------------------------------------- /chat21/src/main/res/layout/activity_add_member_to_chat_group.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 22 | 23 | 24 | 29 | 30 | 36 | 37 | 41 | 42 | 49 | 50 | 54 | 55 | 56 | 57 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /chat21/src/main/res/layout/activity_archived_conversation_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 17 | 18 | 24 | 25 | 26 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /chat21/src/main/res/layout/activity_chat_groups_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 17 | 18 | 23 | 24 | 25 | 30 | 31 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /chat21/src/main/res/layout/activity_chat_splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 18 | 19 | 31 | -------------------------------------------------------------------------------- /chat21/src/main/res/layout/activity_contact_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 17 | 18 | 23 | 24 | 25 | 30 | 31 | 32 | 38 | 39 | 43 | 44 | 50 | 51 | 57 | 58 | 59 | 60 | 61 | 65 | 66 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /chat21/src/main/res/layout/activity_conversation_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 17 | 18 | 24 | 25 | 26 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /chat21/src/main/res/layout/activity_my_groups_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 16 | 17 | 23 | 24 | 25 | 31 | 32 | 36 | 37 | -------------------------------------------------------------------------------- /chat21/src/main/res/layout/bak_row_conversation.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 15 | 16 | 17 | 23 | 24 | 25 | 31 | 32 | 39 | 40 | 41 | 45 | 46 | 57 | 58 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /chat21/src/main/res/layout/fragment_archived_conversation_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 24 | 25 | 30 | 31 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /chat21/src/main/res/layout/fragment_bottom_sheet_archived_conversation_list_long_press.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 15 | 16 | 20 | 21 |