├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── inscripts │ │ └── cometchatsample │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── inscripts │ │ │ └── cometchatsample │ │ │ └── MainActivity.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── cometchat_logo.png │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ └── content_main.xml │ │ ├── menu │ │ └── menu_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── inscripts │ └── cometchatsample │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/android 3 | 4 | ### Android ### 5 | # Built application files 6 | *.apk 7 | *.ap_ 8 | 9 | # Files for the ART/Dalvik VM 10 | *.dex 11 | 12 | # Java class files 13 | *.class 14 | 15 | # Generated files 16 | bin/ 17 | gen/ 18 | out/ 19 | 20 | # Gradle files 21 | .gradle/ 22 | build/ 23 | 24 | # Local configuration file (sdk path, etc) 25 | local.properties 26 | 27 | # Proguard folder generated by Eclipse 28 | proguard/ 29 | 30 | # Log Files 31 | *.log 32 | 33 | # Android Studio Navigation editor temp files 34 | .navigation/ 35 | 36 | # Android Studio captures folder 37 | captures/ 38 | 39 | # Intellij 40 | *.iml 41 | .idea/workspace.xml 42 | .idea/tasks.xml 43 | .idea/gradle.xml 44 | .idea/dictionaries 45 | .idea/libraries 46 | 47 | # External native build folder generated in Android Studio 2.2 and later 48 | .externalNativeBuild 49 | 50 | # Freeline 51 | freeline.py 52 | freeline/ 53 | freeline_project_description.json 54 | 55 | ### Android Patch ### 56 | gen-external-apklibs 57 | 58 | 59 | # End of https://www.gitignore.io/api/android 60 | .idea 61 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | CometChat enables you to add voice, video and text chat to your Android app in minutes! That's not all, CometChat has whiteboard, writeboard, real-time translation and more. 2 | 3 | # For New Customers 4 | If you would like to add CometChat to your app, please use CometChat Pro: 5 | 6 | Step 1- Signup for CometChat Pro at https://app.cometchat.com 7 | 8 | Step 2- View the CometChat Pro documentation at https://prodocs.cometchat.com 9 | 10 | # For Existing Customers 11 | 12 | ## Quick Start 13 | 14 | 1. Download the sample Android project from this repository. 15 | 2. Open the `MainActivity.java` file and replace the CometChat License Key and API Key values. These values can be found the `CometChat Admin Panel`, under the `Settings` -> `API Keys` section. 16 | 3. Build and Run the sample app 17 | 18 | 19 | For more information regarding the CometChat Android SDK , please refer to the [developer documentation](https://developer.cometchat.com/docs/android-quick-start). 20 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 27 5 | defaultConfig { 6 | applicationId "com.inscripts.cometchatsample" 7 | minSdkVersion 16 8 | targetSdkVersion 27 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | multiDexEnabled true 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled true 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | 21 | 22 | 23 | dexOptions { 24 | javaMaxHeapSize "2048M" 25 | } 26 | 27 | packagingOptions { 28 | exclude 'META-INF/DEPENDENCIES.txt' 29 | exclude 'META-INF/LICENSE.txt' 30 | exclude 'META-INF/NOTICE.txt' 31 | exclude 'META-INF/NOTICE' 32 | exclude 'META-INF/LICENSE' 33 | exclude 'META-INF/DEPENDENCIES' 34 | exclude 'META-INF/notice.txt' 35 | exclude 'META-INF/license.txt' 36 | exclude 'META-INF/dependencies.txt' 37 | exclude 'META-INF/LGPL2.1' 38 | } 39 | } 40 | 41 | dependencies { 42 | implementation fileTree(include: ['*.jar'], dir: 'libs') 43 | implementation 'com.android.support:appcompat-v7:27.1.1' 44 | implementation 'com.android.support.constraint:constraint-layout:1.1.0' 45 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 46 | implementation 'com.android.support:design:27.1.1' 47 | testImplementation 'junit:junit:4.12' 48 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 49 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 50 | implementation 'com.inscripts:CometChat:7.46.2' 51 | implementation 'com.inscripts:CometChatUI:7.46.2' 52 | 53 | } 54 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/inscripts/cometchatsample/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.inscripts.cometchatsample; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.inscripts.cometchatsample", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 13 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/inscripts/cometchatsample/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.inscripts.cometchatsample; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.text.TextUtils; 6 | import android.util.Log; 7 | import android.view.View; 8 | import android.view.WindowManager; 9 | import android.widget.Button; 10 | import android.widget.ProgressBar; 11 | import android.widget.Toast; 12 | 13 | import com.android.volley.AuthFailureError; 14 | import com.android.volley.Request; 15 | import com.android.volley.RequestQueue; 16 | import com.android.volley.Response; 17 | import com.android.volley.VolleyError; 18 | import com.android.volley.toolbox.StringRequest; 19 | import com.android.volley.toolbox.Volley; 20 | import com.inscripts.interfaces.Callbacks; 21 | import com.inscripts.interfaces.LaunchCallbacks; 22 | import com.inscripts.keys.CometChatKeys; 23 | 24 | import org.json.JSONObject; 25 | 26 | import java.util.HashMap; 27 | import java.util.Map; 28 | 29 | import cometchat.inscripts.com.cometchatcore.coresdk.CometChat; 30 | 31 | public class MainActivity extends AppCompatActivity implements View.OnClickListener { 32 | 33 | private static final String TAG = MainActivity.class.getSimpleName(); 34 | private static final String createUserApiEndpoint = "https://api.cometondemand.net/api/v2/createUser"; 35 | 36 | private String licenseKey = "COMETCHAT-XXXXX-XXXXX-XXXXX-XXXXX"; // Replace the value with your CometChat License Key here 37 | private String apiKey = "xxxxxxxxxxxxxxxxxxxxxx"; // Replace the value with your CometChat Api Key here 38 | private String UID1 = "SUPERHERO1"; 39 | private String UID2 = "SUPERHERO2"; 40 | private boolean isCometOnDemand = true; 41 | private CometChat cometChat; 42 | 43 | 44 | private Button btnLoginSuperHero1, btnLoginSuperHero2, btnLaunchChat, btnInitializeChat, btnCreateUser; 45 | private ProgressBar pbLoading; 46 | 47 | 48 | @Override 49 | protected void onCreate(Bundle savedInstanceState) { 50 | super.onCreate(savedInstanceState); 51 | setContentView(R.layout.activity_main); 52 | cometChat = CometChat.getInstance(MainActivity.this); 53 | setUpFields(); 54 | 55 | } 56 | 57 | private void setUpFields() { 58 | btnLoginSuperHero1 = findViewById(R.id.btnLoginSuperHero1); 59 | btnLoginSuperHero2 = findViewById(R.id.btnLoginSuperHero2); 60 | btnLaunchChat = findViewById(R.id.btnLaunchChat); 61 | btnInitializeChat = findViewById(R.id.btnInitialize); 62 | pbLoading = findViewById(R.id.pb_loading); 63 | btnCreateUser = findViewById(R.id.btnCreateUser); 64 | 65 | btnLoginSuperHero1.setOnClickListener(this); 66 | btnLoginSuperHero2.setOnClickListener(this); 67 | btnLaunchChat.setOnClickListener(this); 68 | btnInitializeChat.setOnClickListener(this); 69 | btnCreateUser.setOnClickListener(this); 70 | } 71 | 72 | @Override 73 | public void onClick(View view) { 74 | switch (view.getId()) { 75 | case R.id.btnInitialize: 76 | initializeChat(); 77 | break; 78 | 79 | case R.id.btnLoginSuperHero1: 80 | login(UID1); 81 | break; 82 | 83 | case R.id.btnLoginSuperHero2: 84 | login(UID2); 85 | break; 86 | 87 | case R.id.btnLaunchChat: 88 | launchChat(); 89 | 90 | case R.id.btnCreateUser: 91 | createUser(); 92 | break; 93 | } 94 | } 95 | 96 | /** 97 | * Initializes the Chat SDK.Initialization binds the SDK to your app and syncs the various basic parameters required for the CometChat SDK to function. 98 | */ 99 | private void initializeChat() { 100 | 101 | if (licenseKey != null && !TextUtils.isEmpty(licenseKey)) { 102 | 103 | if (apiKey != null && !TextUtils.isEmpty(apiKey)) { 104 | showLoading(true); 105 | cometChat.initializeCometChat("", licenseKey, apiKey, isCometOnDemand, new Callbacks() { 106 | @Override 107 | public void successCallback(JSONObject jsonObject) { 108 | Log.d(TAG, "Initialize Success : " + jsonObject.toString()); 109 | Toast.makeText(MainActivity.this, "CometChat initialized successfully", Toast.LENGTH_LONG).show(); 110 | btnLoginSuperHero1.setEnabled(true); 111 | btnLoginSuperHero2.setEnabled(true); 112 | showLoading(false); 113 | } 114 | 115 | @Override 116 | public void failCallback(JSONObject jsonObject) { 117 | Log.d(TAG, "Initialize Fail : " + jsonObject.toString()); 118 | Toast.makeText(MainActivity.this, "Initialize Failed with error: " + jsonObject.toString(), Toast.LENGTH_LONG).show(); 119 | showLoading(false); 120 | } 121 | }); 122 | } else { 123 | Toast.makeText(MainActivity.this, "API Key cannot be null or empty", Toast.LENGTH_LONG).show(); 124 | } 125 | } else { 126 | Toast.makeText(MainActivity.this, "License Key cannot be null or empty", Toast.LENGTH_LONG).show(); 127 | } 128 | 129 | } 130 | /** 131 | * Logs the user in to chat. 132 | * 133 | * @param UID - ID of the user to log in to the chat. 134 | * 135 | */ 136 | private void login(String UID) { 137 | if (UID != null && !TextUtils.isEmpty(UID)) { 138 | showLoading(true); 139 | cometChat.loginWithUID(MainActivity.this, UID, new Callbacks() { 140 | @Override 141 | public void successCallback(JSONObject jsonObject) { 142 | Log.d(TAG, "Login Success : " + jsonObject.toString()); 143 | Toast.makeText(MainActivity.this, jsonObject.toString(), Toast.LENGTH_LONG).show(); 144 | btnLaunchChat.setEnabled(true); 145 | showLoading(false); 146 | } 147 | 148 | @Override 149 | public void failCallback(JSONObject jsonObject) { 150 | Log.d(TAG, "Login Fail : " + jsonObject.toString()); 151 | Toast.makeText(MainActivity.this, jsonObject.toString(), Toast.LENGTH_LONG).show(); 152 | showLoading(false); 153 | } 154 | }); 155 | } else { 156 | Toast.makeText(MainActivity.this, "UID be null or empty", Toast.LENGTH_LONG).show(); 157 | } 158 | 159 | } 160 | 161 | /** 162 | * Launches the chat. 163 | */ 164 | private void launchChat() { 165 | 166 | cometChat.launchCometChat(MainActivity.this, true, new LaunchCallbacks() { 167 | @Override 168 | public void successCallback(JSONObject jsonObject) { 169 | Log.d(TAG, "Launch Success : " + jsonObject.toString()); 170 | } 171 | 172 | @Override 173 | public void failCallback(JSONObject jsonObject) { 174 | Log.d(TAG, "Launch Fail : " + jsonObject.toString()); 175 | } 176 | 177 | @Override 178 | public void userInfoCallback(JSONObject jsonObject) { 179 | Log.d(TAG, "User Info Received : " + jsonObject.toString()); 180 | } 181 | 182 | @Override 183 | public void chatroomInfoCallback(JSONObject jsonObject) { 184 | Log.d(TAG, "Chatroom Info Received : " + jsonObject.toString()); 185 | } 186 | 187 | @Override 188 | public void onMessageReceive(JSONObject jsonObject) { 189 | Log.d(TAG, "Message Received : " + jsonObject.toString()); 190 | } 191 | 192 | @Override 193 | public void error(JSONObject jsonObject) { 194 | Log.d(TAG, "Error : " + jsonObject.toString()); 195 | } 196 | 197 | @Override 198 | public void onWindowClose(JSONObject jsonObject) { 199 | Log.d(TAG, "Chat Window Closed : " + jsonObject.toString()); 200 | } 201 | 202 | @Override 203 | public void onLogout() { 204 | Log.d(TAG, "Logout"); 205 | } 206 | }); 207 | 208 | } 209 | 210 | /** 211 | * Method to create user using restful API and SDK. 212 | */ 213 | private void createUser() { 214 | 215 | // Code to create user via simple volley request 216 | 217 | RequestQueue queue = Volley.newRequestQueue(this); 218 | 219 | StringRequest request = new StringRequest(Request.Method.POST, createUserApiEndpoint, new Response.Listener() { 220 | @Override 221 | public void onResponse(String response) { 222 | Log.e(TAG, "createUser() : success : response : " + response); 223 | Toast.makeText(MainActivity.this,response.toString(),Toast.LENGTH_LONG).show(); 224 | } 225 | }, new Response.ErrorListener() { 226 | @Override 227 | public void onErrorResponse(VolleyError error) { 228 | Log.d("createUser() : error : ",error.toString()); 229 | } 230 | }){ 231 | 232 | @Override 233 | protected Map getParams() throws AuthFailureError { 234 | HashMap nameValuePair = new HashMap<>(); 235 | nameValuePair.put("UID", "UIDComet101"); 236 | nameValuePair.put("name", "Comet 101"); 237 | return nameValuePair; 238 | } 239 | 240 | @Override 241 | public Map getHeaders() throws AuthFailureError { 242 | Map headers = new HashMap<>(); 243 | headers.put("accept", "application/json"); 244 | headers.put(CometChatKeys.AjaxKeys.API_KEY, "xxxxxxxxxxxxxxxxxxxxxx"); 245 | return headers; 246 | } 247 | }; 248 | queue.add(request); 249 | 250 | // code to create user using SDK. Please call initializeChat() method first, before using the below code. 251 | 252 | /*cometChat.createUser(MainActivity.this, "UIDComet101", "Comet 101", 253 | "", "", "", new Callbacks() { 254 | @Override 255 | public void successCallback(JSONObject jsonObject) { 256 | Log.e(TAG, "createUser() : success : response : " + jsonObject); 257 | } 258 | 259 | @Override 260 | public void failCallback(JSONObject jsonObject) { 261 | Log.e(TAG, "createUser() : failure : response : " + jsonObject); 262 | } 263 | });*/ 264 | } 265 | 266 | private void showLoading(boolean show) { 267 | if (show) { 268 | pbLoading.setVisibility(View.VISIBLE); 269 | getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, 270 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 271 | } else { 272 | pbLoading.setVisibility(View.GONE); 273 | getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 274 | } 275 | } 276 | } 277 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/cometchat_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cometchat-go/android-chat-sdk-demo/5fd1a8fe4badf1202aa4071e5732f3a5ece70433/app/src/main/res/drawable/cometchat_logo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | 26 | 27 | 30 | 31 |