diff --git a/Chatlin/.gitignore b/Chatlin/.gitignore new file mode 100644 index 00000000..aa724b77 --- /dev/null +++ b/Chatlin/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/Chatlin/.idea/.gitignore b/Chatlin/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/Chatlin/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/Chatlin/.idea/compiler.xml b/Chatlin/.idea/compiler.xml new file mode 100644 index 00000000..fb7f4a8a --- /dev/null +++ b/Chatlin/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Chatlin/.idea/deploymentTargetDropDown.xml b/Chatlin/.idea/deploymentTargetDropDown.xml new file mode 100644 index 00000000..28cccda2 --- /dev/null +++ b/Chatlin/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Chatlin/.idea/gradle.xml b/Chatlin/.idea/gradle.xml new file mode 100644 index 00000000..526b4c25 --- /dev/null +++ b/Chatlin/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/Chatlin/.idea/jarRepositories.xml b/Chatlin/.idea/jarRepositories.xml new file mode 100644 index 00000000..0380d8d3 --- /dev/null +++ b/Chatlin/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Chatlin/.idea/misc.xml b/Chatlin/.idea/misc.xml new file mode 100644 index 00000000..11465059 --- /dev/null +++ b/Chatlin/.idea/misc.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Chatlin/.idea/render.experimental.xml b/Chatlin/.idea/render.experimental.xml new file mode 100644 index 00000000..8ec256a5 --- /dev/null +++ b/Chatlin/.idea/render.experimental.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Chatlin/.idea/vcs.xml b/Chatlin/.idea/vcs.xml new file mode 100644 index 00000000..6c0b8635 --- /dev/null +++ b/Chatlin/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Chatlin/app/.gitignore b/Chatlin/app/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/Chatlin/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/Chatlin/app/build.gradle b/Chatlin/app/build.gradle new file mode 100644 index 00000000..1a03ff00 --- /dev/null +++ b/Chatlin/app/build.gradle @@ -0,0 +1,53 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +} + +android { + compileSdk 31 + + defaultConfig { + applicationId "com.yashacker.chatlin" + minSdk 21 + targetSdk 31 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'com.google.android.material:material:1.5.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + implementation 'com.google.firebase:firebase-auth:19.2.0' + implementation 'com.google.firebase:firebase-database-ktx:20.0.4' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + + implementation platform('com.google.firebase:firebase-bom:29.3.1') + implementation 'com.google.firebase:firebase-analytics-ktx' + implementation 'com.intuit.ssp:ssp-android:1.0.5' + implementation 'com.intuit.sdp:sdp-android:1.0.5' + implementation 'com.makeramen:roundedimageview:2.3.0' +} +apply plugin: 'com.android.application' +apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/Chatlin/app/google-services.json b/Chatlin/app/google-services.json new file mode 100644 index 00000000..53711d2c --- /dev/null +++ b/Chatlin/app/google-services.json @@ -0,0 +1,68 @@ +{ + "project_info": { + "project_number": "629207813547", + "project_id": "chatlin-2a78f", + "storage_bucket": "chatlin-2a78f.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:629207813547:android:076a7c160dba9c2c6116ee", + "android_client_info": { + "package_name": "com.example.chatlin" + } + }, + "oauth_client": [ + { + "client_id": "629207813547-016bbsofp26r5rp0avfp8v0vqu4v62sl.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyC3Bx8udgso9z0b3o1Xo_qe6466ihdBw-g" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "629207813547-016bbsofp26r5rp0avfp8v0vqu4v62sl.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:629207813547:android:31f09655c7a4d2596116ee", + "android_client_info": { + "package_name": "com.yashacker.chatlin" + } + }, + "oauth_client": [ + { + "client_id": "629207813547-016bbsofp26r5rp0avfp8v0vqu4v62sl.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyC3Bx8udgso9z0b3o1Xo_qe6466ihdBw-g" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "629207813547-016bbsofp26r5rp0avfp8v0vqu4v62sl.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/Chatlin/app/proguard-rules.pro b/Chatlin/app/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/Chatlin/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/Chatlin/app/src/androidTest/java/com/yashacker/chatlin/ExampleInstrumentedTest.kt b/Chatlin/app/src/androidTest/java/com/yashacker/chatlin/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..9e3cab05 --- /dev/null +++ b/Chatlin/app/src/androidTest/java/com/yashacker/chatlin/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.yashacker.chatlin + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.example.chatlin", appContext.packageName) + } +} \ No newline at end of file diff --git a/Chatlin/app/src/main/AndroidManifest.xml b/Chatlin/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..f67d1dc2 --- /dev/null +++ b/Chatlin/app/src/main/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Chatlin/app/src/main/ic_launcher-playstore.png b/Chatlin/app/src/main/ic_launcher-playstore.png new file mode 100644 index 00000000..833efbce Binary files /dev/null and b/Chatlin/app/src/main/ic_launcher-playstore.png differ diff --git a/Chatlin/app/src/main/java/com/yashacker/chatlin/ChatActivity.kt b/Chatlin/app/src/main/java/com/yashacker/chatlin/ChatActivity.kt new file mode 100644 index 00000000..55e89d41 --- /dev/null +++ b/Chatlin/app/src/main/java/com/yashacker/chatlin/ChatActivity.kt @@ -0,0 +1,117 @@ +package com.yashacker.chatlin + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.widget.EditText +import android.widget.ImageView +import android.widget.Toast +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.database.* +import com.google.firebase.ktx.Firebase +import com.yashacker.chatlin.adapter.MessageAdapter + +class ChatActivity : AppCompatActivity() { + private lateinit var chatRecyclerView: RecyclerView + private lateinit var messageBox: EditText + private lateinit var sendButton: ImageView + private lateinit var backButton: ImageView + private lateinit var infoButton: ImageView + private lateinit var messageAdapter: MessageAdapter + private lateinit var messageList: ArrayList + private lateinit var mDbRef : DatabaseReference + + + var receiverRoom: String? = null + var senderRoom: String? = null // used to create unique room for sender and listener pair + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_chat) + + val name = intent.getStringExtra("name") + val receiverUid = intent.getStringExtra("uid") + val senderUid = FirebaseAuth.getInstance().currentUser?.uid + mDbRef = FirebaseDatabase.getInstance().reference + + senderRoom = receiverUid + senderUid + receiverRoom = senderUid + receiverUid + + + + chatRecyclerView =findViewById(R.id.chatRecyclerView) + sendButton =findViewById(R.id.sendButton) + messageBox = findViewById(R.id.messageBox) + backButton = findViewById(R.id.backButton) + infoButton = findViewById(R.id.infoButton) + messageList = ArrayList() + messageAdapter = MessageAdapter(this,messageList) + chatRecyclerView.layoutManager = LinearLayoutManager(this) + chatRecyclerView.adapter = messageAdapter + + //logic for adding data to recyclerView + mDbRef.child("chats").child(senderRoom!!).child("messages") + .addValueEventListener(object: ValueEventListener{ + override fun onDataChange(snapshot: DataSnapshot) { + messageList.clear() + + + for(postSnapshot in snapshot.children){ + + val message = postSnapshot.getValue(Message::class.java) + messageList.add(message!!) + } + messageAdapter.notifyDataSetChanged() + + } + + override fun onCancelled(error: DatabaseError) { + + } + + }) + + infoButton.setOnClickListener { + Toast.makeText(this@ChatActivity, "Your are talking to $name ;) ", Toast.LENGTH_LONG).show() + } + backButton.setOnClickListener { + + Toast.makeText(this@ChatActivity, "Your were talking to $name ;) ", Toast.LENGTH_SHORT).show() + finish() + } + //adding the message to the database + sendButton.setOnClickListener { + + + + val message = messageBox.text.toString() + if (message == "") { + messageBox.error = " Enter a message Bruh!! 🤣" + messageBox.requestFocus()}else { + val messageObject = Message(message, senderUid) + + mDbRef.child("chats").child(senderRoom!!).child("messages").push() + .setValue(messageObject).addOnSuccessListener { + mDbRef.child("chats").child(receiverRoom!!).child("messages").push() + .setValue(messageObject) + } + } + messageBox.setText(""); + + + + + + + + } + + + + + } + + +} \ No newline at end of file diff --git a/Chatlin/app/src/main/java/com/yashacker/chatlin/Login_Activity.kt b/Chatlin/app/src/main/java/com/yashacker/chatlin/Login_Activity.kt new file mode 100644 index 00000000..028c092c --- /dev/null +++ b/Chatlin/app/src/main/java/com/yashacker/chatlin/Login_Activity.kt @@ -0,0 +1,108 @@ +package com.yashacker.chatlin + +import android.content.ContentValues.TAG +import android.content.Intent +import android.os.Bundle +import android.util.Log +import android.util.Patterns +import android.widget.* +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.isInvisible +import androidx.core.view.isVisible +import com.google.firebase.auth.FirebaseAuth + +class Login_Activity : AppCompatActivity() { + private lateinit var editEmail: EditText + private lateinit var editPassword : EditText + private lateinit var btnlogin : Button + private lateinit var textsignup : TextView + private lateinit var loginbacktowelcome : ImageView + private lateinit var mAuth : FirebaseAuth + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_login) + mAuth = FirebaseAuth.getInstance() + loginbacktowelcome = findViewById(R.id.loginbacktowelcome) + editEmail = findViewById(R.id.editEmail) + editPassword = findViewById(R.id.editPassword) + btnlogin = findViewById(R.id.btnlogin) + textsignup = findViewById(R.id.textsignup) + + + loginbacktowelcome.setOnClickListener { + val intent = Intent(this@Login_Activity, Welcome::class.java) + startActivity(intent) + } + btnlogin.setOnClickListener{ + + credential_check() + + } + textsignup.setOnClickListener{ + val intent = Intent(this@Login_Activity, SignUp_Activity::class.java) + startActivity(intent) + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out ) + } + + } + private fun login(email: String, password: String){ + //logic for logging in user + mAuth.signInWithEmailAndPassword(email, password) + .addOnCompleteListener(this) { task -> + if (task.isSuccessful) { + // Sign in success, update UI with the signed-in user's information + Log.d(TAG, "signInWithEmail:success") + val intent = Intent(this@Login_Activity, MainActivity::class.java) + + finish() + Toast.makeText(this@Login_Activity, "wait till the users load :)) ", Toast.LENGTH_SHORT).show() + + startActivity(intent) + + + overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right ) + + + + } else { + // If sign in fails, display a message to the user. + Log.w(TAG, "signInWithEmail:failure", task.exception) + Toast.makeText(this@Login_Activity, "User does not Exist!", + Toast.LENGTH_SHORT).show() + } + + } + + } + private fun credential_check() { + val email = editEmail.text.toString() + val password = editPassword.text.toString() + val emailAddress: String = email.trim() + if (password.length < 6) { + editPassword.error = "password minimum contain 6 character" + editPassword.requestFocus() + } + if (password == "") { + editPassword.error = "please enter password 🤣" + editPassword.requestFocus() + } + if (!Patterns.EMAIL_ADDRESS.matcher(emailAddress).matches()) { + editEmail.error = "please enter valid email address" + editEmail.requestFocus() + } + if (email == "") { + editEmail.error = "please enter email address 🤣" + editEmail.requestFocus() + } + if (emailAddress != "" && password.length >= 6 && + password.trim() != "" && + Patterns.EMAIL_ADDRESS.matcher(emailAddress).matches() + ) { + + login(email, password) + } + } + +} \ No newline at end of file diff --git a/Chatlin/app/src/main/java/com/yashacker/chatlin/MainActivity.kt b/Chatlin/app/src/main/java/com/yashacker/chatlin/MainActivity.kt new file mode 100644 index 00000000..ee42d0fd --- /dev/null +++ b/Chatlin/app/src/main/java/com/yashacker/chatlin/MainActivity.kt @@ -0,0 +1,90 @@ +package com.yashacker.chatlin + +import android.content.Intent +import android.os.Bundle + +import android.view.View +import android.view.View.INVISIBLE +import android.widget.ImageView +import android.widget.ProgressBar +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.isInvisible +import androidx.core.view.isVisible +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.database.* +import com.yashacker.chatlin.adapter.UserAdapter + +class MainActivity : AppCompatActivity() { + + + private lateinit var usersRecyclerView: RecyclerView + private lateinit var userList: ArrayList + private lateinit var adapter: UserAdapter + private lateinit var mAuth: FirebaseAuth + private lateinit var ImageLogout : ImageView + private lateinit var mDbRef: DatabaseReference + private lateinit var backButton: ImageView + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + ImageLogout = findViewById(R.id.ImageLogout) + backButton = findViewById(R.id.ImageBack) + mAuth = FirebaseAuth.getInstance() + + mDbRef = FirebaseDatabase.getInstance().reference + + + + userList = ArrayList() + adapter = UserAdapter(this,userList) + ImageLogout.setOnClickListener{ + mAuth.signOut() + finish() + } + backButton.setOnClickListener { + val intent = Intent(this@MainActivity, Login_Activity::class.java) + mAuth.signOut() + startActivity(intent) + } + usersRecyclerView =findViewById(R.id.usersRecyclerView) + + usersRecyclerView.layoutManager = LinearLayoutManager(this) + usersRecyclerView.adapter =adapter + mDbRef.child("user").addValueEventListener(object: ValueEventListener{ + override fun onDataChange(snapshot: DataSnapshot) { + userList.clear() + + + for(postSnapshot in snapshot.children){ + val currentUser = postSnapshot.getValue(User::class.java) + if(mAuth.currentUser?.uid != currentUser?.uid && mAuth.currentUser?.email != currentUser?.email && mDbRef.child("user").child("name").toString() != currentUser?.name){ + userList.add(currentUser!!) + } + + + + + + } + adapter.notifyDataSetChanged() + + + + } + + override fun onCancelled(error: DatabaseError) {} + + }) + + + + + } + + + + } diff --git a/Chatlin/app/src/main/java/com/yashacker/chatlin/Message.kt b/Chatlin/app/src/main/java/com/yashacker/chatlin/Message.kt new file mode 100644 index 00000000..313b9343 --- /dev/null +++ b/Chatlin/app/src/main/java/com/yashacker/chatlin/Message.kt @@ -0,0 +1,11 @@ +package com.yashacker.chatlin + +class Message { + var message: String? =null + var senderId:String? =null + constructor(){} + constructor(message: String?, senderId: String?){ + this.message = message + this.senderId = senderId + } +} \ No newline at end of file diff --git a/Chatlin/app/src/main/java/com/yashacker/chatlin/SignUp_Activity.kt b/Chatlin/app/src/main/java/com/yashacker/chatlin/SignUp_Activity.kt new file mode 100644 index 00000000..5ee3c071 --- /dev/null +++ b/Chatlin/app/src/main/java/com/yashacker/chatlin/SignUp_Activity.kt @@ -0,0 +1,118 @@ +package com.yashacker.chatlin + +import android.content.ContentValues.TAG +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.util.Log +import android.util.Patterns +import android.widget.* +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.database.DatabaseReference +import com.google.firebase.database.FirebaseDatabase + +class SignUp_Activity : AppCompatActivity() { + private lateinit var signupbacktowelcome : ImageView + private lateinit var textlogin : TextView + private lateinit var editEmail: EditText + private lateinit var editUsername: EditText + private lateinit var editPassword : EditText + private lateinit var btnsignup : Button + private lateinit var mAuth : FirebaseAuth + private lateinit var mDbRef: DatabaseReference + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_sign_up) + signupbacktowelcome = findViewById(R.id.signupbacktowelcome) + editEmail = findViewById(R.id.editEmail) + editPassword = findViewById(R.id.editPassword) + btnsignup = findViewById(R.id.btnsignup) + textlogin = findViewById(R.id.textlogin) + editUsername = findViewById(R.id.editUsername) + mAuth = FirebaseAuth.getInstance() + + signupbacktowelcome.setOnClickListener { + val intent = Intent(this@SignUp_Activity, Welcome::class.java) + startActivity(intent) + } + btnsignup.setOnClickListener { + credential_check() + } + textlogin.setOnClickListener{ + val intent = Intent(this@SignUp_Activity, Login_Activity::class.java) + startActivity(intent) + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out ) + } + } + private fun signUp(name: String, email: String, password: String){ + //logic for creating user + mAuth.createUserWithEmailAndPassword(email, password) + .addOnCompleteListener(this) { task -> + if (task.isSuccessful) { + Log.d(TAG, "createUserWithEmail:success") + addUserToDatabase(name,email,mAuth.currentUser?.uid!!) + + // Sign in success, update UI with the signed-in user's information + val intent = Intent(this@SignUp_Activity, MainActivity::class.java) + finish() + Toast.makeText(this@SignUp_Activity, "wait till the users load :)) ", Toast.LENGTH_SHORT).show() + startActivity(intent) + overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right ) + + + } else { + // If sign in fails, display a message to the user. + Log.w(TAG, "createUserWithEmail:failure", task.exception) + Toast.makeText(this@SignUp_Activity, "Authentication failed or User already exist.", Toast.LENGTH_SHORT).show() + + } + } + } + private fun credential_check() { + val email = editEmail.text.toString() + val password = editPassword.text.toString() + val username = editUsername.text.toString() + val emailAddress: String = email.trim() + if (password.length < 6) { + editPassword.error = "password minimum contain 6 character" + editPassword.requestFocus() + } + if (password == "") { + editPassword.error = "please enter password 🤣" + editPassword.requestFocus() + } + if (!Patterns.EMAIL_ADDRESS.matcher(emailAddress).matches()) { + editEmail.error = "please enter valid email address" + editEmail.requestFocus() + } + if (email == "") { + editEmail.error = "please enter email address 🤣" + editEmail.requestFocus() + } + if (username == "") { + editUsername.error = "please enter Username 😤" + editUsername.requestFocus() + } + if (emailAddress != "" && password.length >= 6 && + password.trim() != "" && + Patterns.EMAIL_ADDRESS.matcher(emailAddress).matches() + ) { + + signUp(username, email, password) + } + } + private fun addUserToDatabase(name: String, email: String, uid: String){ + mDbRef = FirebaseDatabase.getInstance().reference + + mDbRef.child("user").child(uid).setValue(User(name,email,uid)) + + + } + + + + + +} \ No newline at end of file diff --git a/Chatlin/app/src/main/java/com/yashacker/chatlin/User.kt b/Chatlin/app/src/main/java/com/yashacker/chatlin/User.kt new file mode 100644 index 00000000..d659979b --- /dev/null +++ b/Chatlin/app/src/main/java/com/yashacker/chatlin/User.kt @@ -0,0 +1,16 @@ +package com.yashacker.chatlin + +class User { + var name: String? =null + var email: String? = null + var uid : String? = null + constructor(){} + + + constructor(name: String?, email: String?, uid: String?){ + this.name = name + this.email = email + this.uid = uid + + } +} \ No newline at end of file diff --git a/Chatlin/app/src/main/java/com/yashacker/chatlin/Welcome.kt b/Chatlin/app/src/main/java/com/yashacker/chatlin/Welcome.kt new file mode 100644 index 00000000..92cdbe6a --- /dev/null +++ b/Chatlin/app/src/main/java/com/yashacker/chatlin/Welcome.kt @@ -0,0 +1,28 @@ +package com.yashacker.chatlin + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.widget.Button + +class Welcome : AppCompatActivity() { + private lateinit var btnwelcomesignup: Button + private lateinit var btnwelcomelogin : Button + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_welcome) + btnwelcomelogin = findViewById(R.id.btnwelcomelogin) + btnwelcomesignup = findViewById(R.id.btnwelcomesignup) + + btnwelcomesignup.setOnClickListener { + val intent = Intent(this, SignUp_Activity::class.java) + startActivity(intent) + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out ) + } + btnwelcomelogin.setOnClickListener { + val intent = Intent(this, Login_Activity::class.java) + startActivity(intent) + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out ) + } + } +} \ No newline at end of file diff --git a/Chatlin/app/src/main/java/com/yashacker/chatlin/adapter/MessageAdapter.kt b/Chatlin/app/src/main/java/com/yashacker/chatlin/adapter/MessageAdapter.kt new file mode 100644 index 00000000..6e204ee7 --- /dev/null +++ b/Chatlin/app/src/main/java/com/yashacker/chatlin/adapter/MessageAdapter.kt @@ -0,0 +1,77 @@ +package com.yashacker.chatlin.adapter + +import android.app.Notification +import android.content.Context +import android.os.Message +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.appcompat.view.menu.ActionMenuItemView +import androidx.recyclerview.widget.RecyclerView +import com.google.firebase.auth.FirebaseAuth +import com.yashacker.chatlin.R + +class MessageAdapter(val context: Context, val messageList: ArrayList): + RecyclerView.Adapter() { + val ITEM_RECEIVE = 1; + val ITEM_SENT = 2; + + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + + if(viewType == 1){ + //inflate receive + val view: View = LayoutInflater.from(context).inflate(R.layout.item_container_received_message, parent, false) + return ReceiveViewHolder(view) + + }else{ + //inflate sent + val view: View = LayoutInflater.from(context).inflate(R.layout.item_container_sent_message, parent, false) + return SentViewHolder(view) + } + + + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val currentMessage = messageList[position] + + if(holder.javaClass == SentViewHolder::class.java){ + //do he stuff for sent view holder + + val viewHolder = holder as SentViewHolder + holder.sentMessage.text = currentMessage.message + }else{ + //do the stuff receive view holder + val viewHolder = holder as ReceiveViewHolder + holder.receiveMessage.text = currentMessage.message + } + + } + + override fun getItemViewType(position: Int): Int { + val currentMessage = messageList[position] + //if else logic for same message + if(FirebaseAuth.getInstance().currentUser?.uid.equals((currentMessage.senderId))){ + return ITEM_SENT + }else{ + //NotLogged in other user message + return ITEM_RECEIVE + } + } + + override fun getItemCount(): Int { + return messageList.size + + } + class SentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ + val sentMessage = itemView.findViewById(R.id.text_sent_message) + + } + class ReceiveViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ + val receiveMessage = itemView.findViewById(R.id.text_receive_message) + + } +} \ No newline at end of file diff --git a/Chatlin/app/src/main/java/com/yashacker/chatlin/adapter/UserAdapter.kt b/Chatlin/app/src/main/java/com/yashacker/chatlin/adapter/UserAdapter.kt new file mode 100644 index 00000000..8e25d05d --- /dev/null +++ b/Chatlin/app/src/main/java/com/yashacker/chatlin/adapter/UserAdapter.kt @@ -0,0 +1,58 @@ +package com.yashacker.chatlin.adapter + +import android.content.Context +import android.content.Intent +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ProgressBar +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.google.firebase.auth.FirebaseAuth +import com.yashacker.chatlin.ChatActivity +import com.yashacker.chatlin.R +import com.yashacker.chatlin.User +import java.util.ArrayList + +class UserAdapter(val context: Context, val userList: ArrayList): + RecyclerView.Adapter() { + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder { + val view: View = LayoutInflater.from(context).inflate(R.layout.item_container_user, parent, false) + return UserViewHolder(view) + + } + + override fun onBindViewHolder(holder: UserViewHolder, position: Int) { + + val currentUser = userList[position] + holder.textName.text =currentUser.name + holder.textEmail.text =currentUser.email + + holder.itemView.setOnClickListener{ + val intent = Intent(context,ChatActivity::class.java) + + //name of the user been clicked + intent.putExtra("name",currentUser.name) + intent.putExtra("uid",currentUser.uid) + context.startActivity(intent) + } + + + } + + override fun getItemCount(): Int { + return userList.size + + } + class UserViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + val textName = itemView.findViewById(R.id.textName) + val textEmail = itemView.findViewById(R.id.textEmail) + + + + + } + +} \ No newline at end of file diff --git a/Chatlin/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Chatlin/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..2b068d11 --- /dev/null +++ b/Chatlin/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Chatlin/app/src/main/res/drawable/back_ic.xml b/Chatlin/app/src/main/res/drawable/back_ic.xml new file mode 100644 index 00000000..f6321601 --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/back_ic.xml @@ -0,0 +1,10 @@ + + + diff --git a/Chatlin/app/src/main/res/drawable/background.png b/Chatlin/app/src/main/res/drawable/background.png new file mode 100644 index 00000000..46d8b48d Binary files /dev/null and b/Chatlin/app/src/main/res/drawable/background.png differ diff --git a/Chatlin/app/src/main/res/drawable/background_btn.xml b/Chatlin/app/src/main/res/drawable/background_btn.xml new file mode 100644 index 00000000..0ac397d7 --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/background_btn.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Chatlin/app/src/main/res/drawable/background_btn2.xml b/Chatlin/app/src/main/res/drawable/background_btn2.xml new file mode 100644 index 00000000..e4a2edd4 --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/background_btn2.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Chatlin/app/src/main/res/drawable/background_btn3.xml b/Chatlin/app/src/main/res/drawable/background_btn3.xml new file mode 100644 index 00000000..0b3d8c6a --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/background_btn3.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Chatlin/app/src/main/res/drawable/background_chat_input.xml b/Chatlin/app/src/main/res/drawable/background_chat_input.xml new file mode 100644 index 00000000..e30e786b --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/background_chat_input.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/Chatlin/app/src/main/res/drawable/background_content_bottom.xml b/Chatlin/app/src/main/res/drawable/background_content_bottom.xml new file mode 100644 index 00000000..00b9aa15 --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/background_content_bottom.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/Chatlin/app/src/main/res/drawable/background_content_top.xml b/Chatlin/app/src/main/res/drawable/background_content_top.xml new file mode 100644 index 00000000..55031c25 --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/background_content_top.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/Chatlin/app/src/main/res/drawable/background_edittext.xml b/Chatlin/app/src/main/res/drawable/background_edittext.xml new file mode 100644 index 00000000..fb4b5da7 --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/background_edittext.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Chatlin/app/src/main/res/drawable/background_icon.xml b/Chatlin/app/src/main/res/drawable/background_icon.xml new file mode 100644 index 00000000..c9a8aca0 --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/background_icon.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/Chatlin/app/src/main/res/drawable/background_image.xml b/Chatlin/app/src/main/res/drawable/background_image.xml new file mode 100644 index 00000000..46b3eab2 --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/background_image.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/Chatlin/app/src/main/res/drawable/background_received_message.xml b/Chatlin/app/src/main/res/drawable/background_received_message.xml new file mode 100644 index 00000000..e4e890fa --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/background_received_message.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/Chatlin/app/src/main/res/drawable/background_sent_message.xml b/Chatlin/app/src/main/res/drawable/background_sent_message.xml new file mode 100644 index 00000000..a2687e8d --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/background_sent_message.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/Chatlin/app/src/main/res/drawable/background_user.xml b/Chatlin/app/src/main/res/drawable/background_user.xml new file mode 100644 index 00000000..22117c38 --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/background_user.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Chatlin/app/src/main/res/drawable/ic_add.xml b/Chatlin/app/src/main/res/drawable/ic_add.xml new file mode 100644 index 00000000..24877ee9 --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/ic_add.xml @@ -0,0 +1,10 @@ + + + diff --git a/Chatlin/app/src/main/res/drawable/ic_info.xml b/Chatlin/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 00000000..35f7f5f6 --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,10 @@ + + + diff --git a/Chatlin/app/src/main/res/drawable/ic_logout.xml b/Chatlin/app/src/main/res/drawable/ic_logout.xml new file mode 100644 index 00000000..b9c47300 --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/ic_logout.xml @@ -0,0 +1,10 @@ + + + diff --git a/Chatlin/app/src/main/res/drawable/ic_send.xml b/Chatlin/app/src/main/res/drawable/ic_send.xml new file mode 100644 index 00000000..ae931b57 --- /dev/null +++ b/Chatlin/app/src/main/res/drawable/ic_send.xml @@ -0,0 +1,11 @@ + + + diff --git a/Chatlin/app/src/main/res/drawable/illustration.png b/Chatlin/app/src/main/res/drawable/illustration.png new file mode 100644 index 00000000..13662927 Binary files /dev/null and b/Chatlin/app/src/main/res/drawable/illustration.png differ diff --git a/Chatlin/app/src/main/res/drawable/img.png b/Chatlin/app/src/main/res/drawable/img.png new file mode 100644 index 00000000..c1678fad Binary files /dev/null and b/Chatlin/app/src/main/res/drawable/img.png differ diff --git a/Chatlin/app/src/main/res/layout/activity_chat.xml b/Chatlin/app/src/main/res/layout/activity_chat.xml new file mode 100644 index 00000000..5e8828ab --- /dev/null +++ b/Chatlin/app/src/main/res/layout/activity_chat.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Chatlin/app/src/main/res/layout/activity_login.xml b/Chatlin/app/src/main/res/layout/activity_login.xml new file mode 100644 index 00000000..a6add0a6 --- /dev/null +++ b/Chatlin/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + +