├── settings.gradle ├── chat-demo-android ├── lint.xml ├── src │ ├── main │ │ ├── res │ │ │ ├── values-v11 │ │ │ │ └── styles.xml │ │ │ ├── values-v14 │ │ │ │ └── styles.xml │ │ │ ├── values │ │ │ │ ├── styles.xml │ │ │ │ ├── dimens.xml │ │ │ │ └── strings.xml │ │ │ ├── drawable-mdpi │ │ │ │ ├── avatar1.png │ │ │ │ ├── avatar2.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_menu_stop.png │ │ │ │ ├── ic_notification.png │ │ │ │ ├── ic_action_settings.png │ │ │ │ ├── reachability_online.png │ │ │ │ ├── ic_action_content_add.png │ │ │ │ ├── ic_menu_info_details.png │ │ │ │ ├── reachability_disabled.png │ │ │ │ ├── reachability_offline.png │ │ │ │ └── reachability_notifiable.png │ │ │ ├── drawable-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_menu_stop.png │ │ │ │ ├── ic_action_settings.png │ │ │ │ ├── ic_action_content_add.png │ │ │ │ └── ic_menu_info_details.png │ │ │ ├── drawable-xhdpi │ │ │ │ ├── bubble_a.9.png │ │ │ │ ├── bubble_b.9.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_menu_stop.png │ │ │ │ ├── ic_action_settings.png │ │ │ │ ├── ic_menu_info_details.png │ │ │ │ └── ic_action_content_add.png │ │ │ ├── drawable-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_menu_stop.png │ │ │ │ ├── ic_action_settings.png │ │ │ │ ├── ic_action_content_add.png │ │ │ │ └── ic_menu_info_details.png │ │ │ ├── drawable-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_action_content_add.png │ │ │ ├── layout │ │ │ │ ├── member_list.xml │ │ │ │ ├── member_item_layout.xml │ │ │ │ ├── activity_channel.xml │ │ │ │ ├── activity_user_info.xml │ │ │ │ ├── activity_message.xml │ │ │ │ ├── channel_item_layout.xml │ │ │ │ ├── activity_login.xml │ │ │ │ └── message_item_layout.xml │ │ │ ├── values-w820dp │ │ │ │ └── dimens.xml │ │ │ └── menu │ │ │ │ ├── login.xml │ │ │ │ ├── message.xml │ │ │ │ └── channel.xml │ │ ├── assets │ │ │ └── fonts │ │ │ │ ├── Dosis-Light.ttf │ │ │ │ ├── Dosis-Regular.ttf │ │ │ │ ├── OpenSans-Light.ttf │ │ │ │ ├── Raleway-Light.ttf │ │ │ │ ├── Raleway-Thin.ttf │ │ │ │ ├── Dosis-ExtraLight.ttf │ │ │ │ ├── OpenSans-Regular.ttf │ │ │ │ ├── AlegreyaSans-Light.ttf │ │ │ │ ├── AlegreyaSans-Thin.ttf │ │ │ │ ├── PT_Sans-Web-Regular.ttf │ │ │ │ └── AlegreyaSans-Regular.ttf │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── twilio │ │ │ │ └── chat │ │ │ │ └── demo │ │ │ │ ├── models │ │ │ │ └── Media.kt │ │ │ │ ├── FCMPreferences.kt │ │ │ │ ├── Constants.kt │ │ │ │ ├── utils │ │ │ │ ├── ChatClientExtensions.kt │ │ │ │ └── callbacks.kt │ │ │ │ ├── views │ │ │ │ ├── MessageTextView.kt │ │ │ │ ├── MemberViewHolder.kt │ │ │ │ ├── ChannelViewHolder.kt │ │ │ │ └── MessageViewHolder.kt │ │ │ │ ├── services │ │ │ │ ├── FCMInstanceIDService.kt │ │ │ │ ├── RegistrationIntentService.kt │ │ │ │ ├── FCMListenerService.kt │ │ │ │ └── MediaService.kt │ │ │ │ ├── HttpHelper.kt │ │ │ │ ├── TwilioApplication.kt │ │ │ │ ├── ChannelModel.kt │ │ │ │ ├── activities │ │ │ │ ├── LoginActivity.kt │ │ │ │ ├── UserActivity.kt │ │ │ │ ├── ChannelActivity.kt │ │ │ │ └── MessageActivity.kt │ │ │ │ └── BasicChatClient.kt │ │ └── AndroidManifest.xml │ └── release │ │ └── res │ │ └── values │ │ └── strings.xml ├── ic_launcher-web.png ├── project.properties ├── proguard-rules.pro ├── proguard-project.txt └── build.gradle ├── SimulateCrashMenu.png ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── REPORT_BUGS.md ├── LICENSE ├── .github ├── ISSUE_TEMPLATE.md └── ISSUE_TEMPLATE │ └── bug_report.md ├── .clang-format ├── gradlew.bat ├── README.md └── gradlew /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':chat-demo-android' 2 | -------------------------------------------------------------------------------- /chat-demo-android/lint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/values-v11/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/values-v14/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /SimulateCrashMenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/SimulateCrashMenu.png -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx4096m 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /chat-demo-android/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/ic_launcher-web.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | #FFCC0000 3 | 4 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/assets/fonts/Dosis-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/assets/fonts/Dosis-Light.ttf -------------------------------------------------------------------------------- /chat-demo-android/src/main/assets/fonts/Dosis-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/assets/fonts/Dosis-Regular.ttf -------------------------------------------------------------------------------- /chat-demo-android/src/main/assets/fonts/OpenSans-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/assets/fonts/OpenSans-Light.ttf -------------------------------------------------------------------------------- /chat-demo-android/src/main/assets/fonts/Raleway-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/assets/fonts/Raleway-Light.ttf -------------------------------------------------------------------------------- /chat-demo-android/src/main/assets/fonts/Raleway-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/assets/fonts/Raleway-Thin.ttf -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-mdpi/avatar1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-mdpi/avatar1.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-mdpi/avatar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-mdpi/avatar2.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/assets/fonts/Dosis-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/assets/fonts/Dosis-ExtraLight.ttf -------------------------------------------------------------------------------- /chat-demo-android/src/main/assets/fonts/OpenSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/assets/fonts/OpenSans-Regular.ttf -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-xhdpi/bubble_a.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-xhdpi/bubble_a.9.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-xhdpi/bubble_b.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-xhdpi/bubble_b.9.png -------------------------------------------------------------------------------- /chat-demo-android/src/release/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Chat Quickstart 4 | 5 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/assets/fonts/AlegreyaSans-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/assets/fonts/AlegreyaSans-Light.ttf -------------------------------------------------------------------------------- /chat-demo-android/src/main/assets/fonts/AlegreyaSans-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/assets/fonts/AlegreyaSans-Thin.ttf -------------------------------------------------------------------------------- /chat-demo-android/src/main/assets/fonts/PT_Sans-Web-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/assets/fonts/PT_Sans-Web-Regular.ttf -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-hdpi/ic_menu_stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-hdpi/ic_menu_stop.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-mdpi/ic_menu_stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-mdpi/ic_menu_stop.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-xhdpi/ic_menu_stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-xhdpi/ic_menu_stop.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-xxhdpi/ic_menu_stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-xxhdpi/ic_menu_stop.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/assets/fonts/AlegreyaSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/assets/fonts/AlegreyaSans-Regular.ttf -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-mdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-mdpi/ic_notification.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-hdpi/ic_action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-hdpi/ic_action_settings.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-mdpi/ic_action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-mdpi/ic_action_settings.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-mdpi/reachability_online.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-mdpi/reachability_online.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-xhdpi/ic_action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-xhdpi/ic_action_settings.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-hdpi/ic_action_content_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-hdpi/ic_action_content_add.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-hdpi/ic_menu_info_details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-hdpi/ic_menu_info_details.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-mdpi/ic_action_content_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-mdpi/ic_action_content_add.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-mdpi/ic_menu_info_details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-mdpi/ic_menu_info_details.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-mdpi/reachability_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-mdpi/reachability_disabled.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-mdpi/reachability_offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-mdpi/reachability_offline.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-xhdpi/ic_menu_info_details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-xhdpi/ic_menu_info_details.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-xxhdpi/ic_action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-xxhdpi/ic_action_settings.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-mdpi/reachability_notifiable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-mdpi/reachability_notifiable.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-xhdpi/ic_action_content_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-xhdpi/ic_action_content_add.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-xxhdpi/ic_action_content_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-xxhdpi/ic_action_content_add.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-xxhdpi/ic_menu_info_details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-xxhdpi/ic_menu_info_details.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/drawable-xxxhdpi/ic_action_content_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twilio/twilio-chat-demo-android/HEAD/chat-demo-android/src/main/res/drawable-xxxhdpi/ic_action_content_add.png -------------------------------------------------------------------------------- /chat-demo-android/src/main/kotlin/com/twilio/chat/demo/models/Media.kt: -------------------------------------------------------------------------------- 1 | package com.twilio.chat.demo.models 2 | 3 | import java.io.InputStream 4 | 5 | data class Media(val name: String, val type: String, val stream: InputStream) 6 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/kotlin/com/twilio/chat/demo/FCMPreferences.kt: -------------------------------------------------------------------------------- 1 | package com.twilio.chat.demo 2 | 3 | object FCMPreferences { 4 | val SENT_TOKEN_TO_SERVER = "sentTokenToServer" 5 | val REGISTRATION_COMPLETE = "registrationComplete" 6 | } 7 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16dp 5 | 16dp 6 | 7 | 8 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/layout/member_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/kotlin/com/twilio/chat/demo/Constants.kt: -------------------------------------------------------------------------------- 1 | package com.twilio.chat.demo 2 | 3 | interface Constants { 4 | companion object { 5 | /** Key into an Intent's extras data that points to a [Channel] object. */ 6 | val EXTRA_CHANNEL = "com.twilio.chat.Channel" 7 | /** Key into an Intent's extras data that contains Channel SID. */ 8 | val EXTRA_CHANNEL_SID = "C_SID" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 64dp 9 | 10 | 11 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/menu/login.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 12 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/menu/message.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 12 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/kotlin/com/twilio/chat/demo/utils/ChatClientExtensions.kt: -------------------------------------------------------------------------------- 1 | package com.twilio.chat.demo.utils 2 | 3 | import com.twilio.chat.ChatClient 4 | 5 | /** Extension function to simulate native crash */ 6 | fun ChatClient.simulateCrash(where: Where) { 7 | val method = ChatClient::class.java.getDeclaredMethod("simulateCrash", Int::class.java) 8 | method.isAccessible = true 9 | method.invoke(this, where.value) 10 | } 11 | 12 | enum class Where(val value: Int) { 13 | CHAT_CLIENT_CPP(1), 14 | TM_CLIENT_CPP(2) 15 | } 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # Built application files 4 | *.apk 5 | *.ap_ 6 | 7 | # Files for the Dalvik VM 8 | *.dex 9 | 10 | # Java class files 11 | *.class 12 | 13 | # Generated files 14 | 15 | # Gradle files 16 | .gradle/ 17 | build/ 18 | output/ 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 | .idea/ 32 | *.iml 33 | 34 | # Android Studio captures folder 35 | captures/ 36 | -------------------------------------------------------------------------------- /chat-demo-android/project.properties: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by Android Tools. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must be checked in Version Control Systems. 5 | # 6 | # To customize properties used by the Ant build system edit 7 | # "ant.properties", and override values to adapt the script to your 8 | # project structure. 9 | # 10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): 11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 12 | 13 | # Project target. 14 | target=android-23 15 | android.library=false 16 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/kotlin/com/twilio/chat/demo/views/MessageTextView.kt: -------------------------------------------------------------------------------- 1 | package com.twilio.chat.demo.views 2 | 3 | import android.content.Context 4 | import android.graphics.Typeface 5 | import android.util.AttributeSet 6 | import android.widget.TextView 7 | 8 | class MessageTextView(context: Context, attrs: AttributeSet) : TextView(context, attrs) { 9 | 10 | init { 11 | var font: String? = attrs.getAttributeValue(androidNS, "fontFamily") 12 | if (font == null) { 13 | font = "AlegreyaSans-Light" 14 | } 15 | this.typeface = Typeface.createFromAsset(context.assets, "fonts/$font.ttf") 16 | } 17 | 18 | companion object { 19 | private val androidNS = "http://schemas.android.com/apk/res/android" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/layout/member_item_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/kotlin/com/twilio/chat/demo/services/FCMInstanceIDService.kt: -------------------------------------------------------------------------------- 1 | package com.twilio.chat.demo.services 2 | 3 | import com.google.firebase.messaging.FirebaseMessagingService 4 | import org.jetbrains.anko.AnkoLogger 5 | import org.jetbrains.anko.debug 6 | import org.jetbrains.anko.startService 7 | 8 | class FCMInstanceIDService : FirebaseMessagingService(), AnkoLogger { 9 | 10 | /** 11 | * Called if InstanceID token is updated. This may occur if the security of 12 | * the previous token had been compromised. This call is initiated by the 13 | * InstanceID provider. 14 | */ 15 | override fun onNewToken(token: String) { 16 | debug { "onNewToken" } 17 | 18 | // Fetch updated Instance ID token and notify our app's server of any changes. 19 | startService() 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/layout/activity_channel.xml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/kotlin/com/twilio/chat/demo/views/MemberViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.twilio.chat.demo.views 2 | 3 | import android.content.Context 4 | import com.twilio.chat.demo.R 5 | import com.twilio.chat.Member 6 | import android.view.ViewGroup 7 | import android.widget.TextView 8 | import kotterknife.bindView 9 | import eu.inloop.simplerecycleradapter.SettableViewHolder 10 | 11 | class MemberViewHolder : SettableViewHolder { 12 | private val memberIdentity: TextView by bindView(R.id.identity) 13 | // private val memberSid: TextView by bindView(R.id.member_sid) 14 | 15 | constructor(context: Context, parent: ViewGroup) 16 | : super(context, R.layout.member_item_layout, parent) 17 | {} 18 | 19 | override fun setData(member: Member) { 20 | memberIdentity.text = member.identity 21 | // memberSid.text = member.sid 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /REPORT_BUGS.md: -------------------------------------------------------------------------------- 1 | 1. Enable debug log 2 | 3 | ``` 4 | // Before creating a new ChatClient with ChatClient.create() add this line: 5 | ChatClient.setLogLevel(android.util.Log.VERBOSE); 6 | ... 7 | 8 | ChatClient.create(.... 9 | ``` 10 | 11 | 2. Run your application and reproduce the problem 12 | 13 | 3. Capture entire device log using 14 | 15 | ``` 16 | adb logcat -d > my_error_log 17 | ``` 18 | 19 | 4. Send my_error_log together with the problem description to Twilio 20 | 21 | 5. YES, we need the entire log to reconstruct order of events on the client side. 22 | 23 | 6. NO, only sending the lines with 24 | ``` 25 | Native thread exiting without having called DetachCurrentThread (maybe it's going to use a pthread_key_create destructor?): Thread[28,tid=22833,Native,Thread*=0xeec28600,peer=0x132c4a40,"EventThread - 2 - 22833"] 26 | ``` 27 | will not help - those are harmless and accounted for. 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Twilio 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 | -------------------------------------------------------------------------------- /chat-demo-android/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | #============================================== 2 | # Proguard rules for use with IP Messaging SDK 3 | #============================================== 4 | 5 | -keep class com.twilio.chat.** { *; } 6 | -keepattributes InnerClasses 7 | #-keep interface com.twilio.chat.** { *; } 8 | #-keep enum com.twilio.chat.** { *; } 9 | 10 | ## Keep native methods 11 | 12 | -keepclasseswithmembernames class com.twilio.chat.** { 13 | native ; 14 | } 15 | 16 | ## Keep callbacks from native 17 | # ? 18 | 19 | #====================================== 20 | # Local demo application configuration 21 | #====================================== 22 | 23 | -keepclassmembers class **.R$* { 24 | public static ; 25 | } 26 | 27 | ## EasyAdapter 28 | 29 | -dontwarn uk.co.ribot.easyadapter.** 30 | -keepattributes *Annotation* 31 | -keepclassmembers class * extends uk.co.ribot.easyadapter.ItemViewHolder { 32 | public (...); 33 | } 34 | 35 | ## Google libraries 36 | 37 | -dontwarn android.support.** 38 | -keep class com.google.ads.** { *; } 39 | -keep class com.google.android.gms.** { *; } 40 | -keep class com.google.firebase.** { *; } 41 | -keepattributes Signature 42 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | > Before filing an issue please check that the issue is not already addressed by the following: 3 | > * [Github Issues](https://github.com/twilio/twilio-chat-demo-android/issues) 4 | > * [Changelog](https://www.twilio.com/docs/api/chat/changelogs/android) 5 | 6 | ### Description 7 | 8 | [Description of the issue] 9 | 10 | ### Steps to Reproduce 11 | 12 | 1. [Step one] 13 | 2. [Step two] 14 | 3. [Insert as many steps as needed] 15 | 16 | #### Code (optional) 17 | 18 | ```java 19 | // Code that help reproduce the issue 20 | ``` 21 | 22 | #### Expected Behavior 23 | 24 | [What you expect to happen] 25 | 26 | #### Actual Behavior 27 | 28 | [What actually happens] 29 | 30 | #### Reproduces how Often 31 | 32 | [What percentage of the time does it reproduce?] 33 | 34 | #### Logs 35 | 36 | Please collect logs as described [here](https://github.com/twilio/twilio-chat-demo-android/blob/master/REPORT_BUGS.md). Full unedited logs help reproduce and fix issues faster. 37 | 38 | ``` 39 | // Log output when issue occurs 40 | ``` 41 | 42 | Or attach it as a file. 43 | 44 | ### Versions 45 | 46 | All relevant version information for issue. 47 | 48 | #### Chat Android SDK 49 | 50 | [eg. 2.0.8] 51 | 52 | #### Android API 53 | 54 | [eg. 18] 55 | 56 | #### Android Device 57 | 58 | [eg. Nexus 5] 59 | -------------------------------------------------------------------------------- /chat-demo-android/proguard-project.txt: -------------------------------------------------------------------------------- 1 | # To enable ProGuard in your project, edit project.properties 2 | # to define the proguard.config property as described in that file. 3 | # 4 | # Add project specific ProGuard rules here. 5 | # By default, the flags in this file are appended to flags specified 6 | # in ${sdk.dir}/tools/proguard/proguard-android.txt 7 | # You can edit the include path and order by changing the ProGuard 8 | # include property in project.properties. 9 | # 10 | # For more details, see 11 | # http://developer.android.com/guide/developing/tools/proguard.html 12 | 13 | # Add any project specific keep options here: 14 | 15 | # If your project uses WebView with JS, uncomment the following 16 | # and specify the fully qualified class name to the JavaScript interface 17 | # class: 18 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 19 | # public *; 20 | #} 21 | -keep class * extends java.util.ListResourceBundle { 22 | protected Object[][] getContents(); 23 | } 24 | 25 | -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { 26 | public static final *** NULL; 27 | } 28 | 29 | -keepnames @com.google.android.gms.common.annotation.KeepName class * 30 | -keepclassmembernames class * { 31 | @com.google.android.gms.common.annotation.KeepName *; 32 | } 33 | 34 | -keepnames class * implements android.os.Parcelable { 35 | public static final ** CREATOR; 36 | } -------------------------------------------------------------------------------- /chat-demo-android/src/main/kotlin/com/twilio/chat/demo/utils/callbacks.kt: -------------------------------------------------------------------------------- 1 | import com.twilio.chat.CallbackListener 2 | import com.twilio.chat.ErrorInfo 3 | import com.twilio.chat.StatusListener 4 | import com.twilio.chat.demo.TwilioApplication 5 | 6 | typealias SuccessStatus = () -> Unit 7 | typealias SuccessCallback = (T) -> Unit 8 | typealias ErrorCallback = (error: ErrorInfo) -> Unit 9 | 10 | class ChatCallbackListener(val fail: ErrorCallback = {}, 11 | val success: SuccessCallback = {}) : CallbackListener() { 12 | 13 | override fun onSuccess(p0: T) = success(p0) 14 | 15 | override fun onError(err: ErrorInfo) { 16 | TwilioApplication.instance.showError(err) 17 | fail(err) 18 | } 19 | } 20 | 21 | open class ChatStatusListener(val fail: ErrorCallback = {}, 22 | val success: SuccessStatus = {}) : StatusListener() { 23 | 24 | override fun onSuccess() = success() 25 | 26 | override fun onError(err: ErrorInfo) { 27 | TwilioApplication.instance.showError(err) 28 | fail(err) 29 | } 30 | } 31 | 32 | 33 | /** 34 | * Status listener that shows a toast with operation results. 35 | */ 36 | class ToastStatusListener(val okText: String, val errorText: String, fail: ErrorCallback = {}, 37 | success: SuccessStatus = {}) : ChatStatusListener(fail, success) { 38 | 39 | override fun onSuccess() { 40 | TwilioApplication.instance.showToast(okText) 41 | success() 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/kotlin/com/twilio/chat/demo/HttpHelper.kt: -------------------------------------------------------------------------------- 1 | package com.twilio.chat.demo 2 | 3 | import java.net.HttpURLConnection 4 | import java.net.URL 5 | import org.json.JSONObject 6 | import org.json.JSONException 7 | import org.jetbrains.anko.* 8 | 9 | object HttpHelper : AnkoLogger { 10 | @Throws(Exception::class) 11 | fun httpGet(url: String): String { 12 | val urlObj = URL(url) 13 | 14 | val conn = urlObj.openConnection() as HttpURLConnection 15 | 16 | conn.connectTimeout = 45000 17 | conn.readTimeout = 30000 18 | conn.doInput = true 19 | 20 | val responseCode = conn.responseCode 21 | 22 | if (responseCode == HttpURLConnection.HTTP_OK) { 23 | // Try to get access token from "token" field in the JSON format response 24 | // If response cannot be parsed as JSON, use it as-is. 25 | 26 | var accessToken = conn.inputStream.reader().readText() 27 | conn.inputStream.close() 28 | conn.disconnect() 29 | 30 | try { 31 | JSONObject(accessToken).apply { 32 | accessToken = this.getString("token") 33 | } 34 | } catch (xcp: JSONException) { 35 | // Do nothing 36 | } 37 | 38 | info { "Received Token: ${accessToken}" } 39 | 40 | return accessToken 41 | } else { 42 | conn.disconnect() 43 | throw Exception("Got error code $responseCode from server") 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | BasedOnStyle: Mozilla 3 | IndentWidth: 4 4 | TabWidth: 4 5 | ContinuationIndentWidth: 4 6 | ConstructorInitializerIndentWidth: 4 7 | UseTab: Never 8 | ColumnLimit: 100 9 | --- 10 | Language: Java 11 | AllowShortBlocksOnASingleLine: false 12 | AlignEscapedNewlinesLeft: true 13 | AlignAfterOpenBracket: true 14 | AlignConsecutiveAssignments: false 15 | AlignConsecutiveDeclarations: true 16 | AllowAllParametersOfDeclarationOnNextLine: true 17 | AllowShortFunctionsOnASingleLine: false 18 | AllowShortIfStatementsOnASingleLine: false 19 | AllowShortCaseLabelsOnASingleLine: true 20 | AllowShortLoopsOnASingleLine: false 21 | AlwaysBreakAfterDefinitionReturnType: TopLevel 22 | AlwaysBreakBeforeMultilineStrings: true 23 | AlwaysBreakTemplateDeclarations: true 24 | AlignOperands: true 25 | AlignTrailingComments: true 26 | BinPackArguments: false 27 | BinPackParameters: false 28 | BreakAfterJavaFieldAnnotations: true 29 | BreakBeforeBinaryOperators: NonAssignment 30 | BreakBeforeBraces: Linux 31 | BreakBeforeTernaryOperators: false 32 | ConstructorInitializerAllOnOneLineOrOnePerLine: true 33 | IndentCaseLabels: true 34 | IndentWrappedFunctionNames: false 35 | KeepEmptyLinesAtTheStartOfBlocks: true 36 | MaxEmptyLinesToKeep: 1 37 | NamespaceIndentation: Inner 38 | ReflowComments: true 39 | SortIncludes: true 40 | SpaceAfterCStyleCast: false 41 | SpacesInCStyleCastParentheses: false 42 | SpaceBeforeParens: ControlStatements 43 | SpaceInEmptyParentheses: false 44 | SpacesInAngles: false 45 | SpacesInContainerLiterals: true 46 | SpacesInParentheses: false 47 | SpacesInSquareBrackets: false 48 | -------------------------------------------------------------------------------- /chat-demo-android/src/main/res/layout/activity_user_info.xml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 18 | 24 | 30 | 31 |