diff --git a/.idea/misc.xml b/.idea/misc.xml
index c2c534b..705eb91 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -7,6 +7,8 @@
+
+
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 94a25f7..609b4fa 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,5 +1,8 @@
+
+
+
diff --git a/app/build.gradle b/app/build.gradle
index ed68a6d..f098d63 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -42,6 +42,7 @@ dependencies {
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.google.firebase:firebase-auth:19.2.0'
+ implementation 'com.google.firebase:firebase-database-ktx:20.1.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
diff --git a/app/google-services.json b/app/google-services.json
index 711de57..4b861c1 100644
--- a/app/google-services.json
+++ b/app/google-services.json
@@ -1,6 +1,7 @@
{
"project_info": {
"project_number": "233851758467",
+ "firebase_url": "https://chatapplication-4eb49-default-rtdb.europe-west1.firebasedatabase.app",
"project_id": "chatapplication-4eb49",
"storage_bucket": "chatapplication-4eb49.appspot.com"
},
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index dfb7078..6327779 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -14,11 +14,15 @@
android:theme="@style/Theme.ChatApplication"
tools:targetApi="31">
+
+ android:exported="true">
@@ -27,7 +31,7 @@
+ android:exported="false" />
\ No newline at end of file
diff --git a/app/src/main/java/com/lsm/chatapplication/ChatActivity.kt b/app/src/main/java/com/lsm/chatapplication/ChatActivity.kt
new file mode 100644
index 0000000..ad902b2
--- /dev/null
+++ b/app/src/main/java/com/lsm/chatapplication/ChatActivity.kt
@@ -0,0 +1,11 @@
+package com.lsm.chatapplication
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+
+class ChatActivity : AppCompatActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_chat)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/lsm/chatapplication/LogIn.kt b/app/src/main/java/com/lsm/chatapplication/LogIn.kt
index 2b04bc9..91fd34c 100644
--- a/app/src/main/java/com/lsm/chatapplication/LogIn.kt
+++ b/app/src/main/java/com/lsm/chatapplication/LogIn.kt
@@ -3,6 +3,7 @@ package com.lsm.chatapplication
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
+import android.widget.Toast
import com.google.firebase.auth.FirebaseAuth
import com.lsm.chatapplication.databinding.ActivityLogInBinding
@@ -17,6 +18,8 @@ class LogIn : AppCompatActivity() {
val view = binding.root
setContentView(view)
+// supportActionBar?.hide()
+
mAuth = FirebaseAuth.getInstance()
binding.logInBtn.setOnClickListener{
@@ -31,6 +34,17 @@ class LogIn : AppCompatActivity() {
}
}
private fun logIn(email: String, password: String){
-
+ mAuth.signInWithEmailAndPassword(email, password)
+ .addOnCompleteListener(this) { task ->
+ if (task.isSuccessful) {
+ // Move to home
+ val intent = Intent(this@LogIn, MainActivity::class.java)
+ finish()
+ startActivity(intent)
+ } else {
+ // Logging error message
+ Toast.makeText(this@LogIn,"User doest not exits",Toast.LENGTH_SHORT).show()
+ }
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/lsm/chatapplication/MainActivity.kt b/app/src/main/java/com/lsm/chatapplication/MainActivity.kt
index 778444b..0ff0973 100644
--- a/app/src/main/java/com/lsm/chatapplication/MainActivity.kt
+++ b/app/src/main/java/com/lsm/chatapplication/MainActivity.kt
@@ -1,11 +1,82 @@
package com.lsm.chatapplication
+import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
+import android.view.Menu
+import android.view.MenuItem
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.google.firebase.auth.FirebaseAuth
+import com.google.firebase.database.DataSnapshot
+import com.google.firebase.database.DatabaseError
+import com.google.firebase.database.ValueEventListener
+import com.google.firebase.database.ktx.database
+import com.google.firebase.ktx.Firebase
+import com.lsm.chatapplication.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
+ private lateinit var binding: ActivityMainBinding
+ private lateinit var userList: ArrayList
+ private lateinit var adapter: UserAdapter
+ private lateinit var mAuth: FirebaseAuth
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
+ binding = ActivityMainBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ mAuth = FirebaseAuth.getInstance()
+
+ userList = ArrayList()
+ adapter = UserAdapter()
+// adapter.submitList(userList)
+
+ binding.userRecyclerView.layoutManager = LinearLayoutManager(this)
+ binding.userRecyclerView.adapter = adapter
+
+ readUsersFromDatabase()
+ }
+
+ private fun readUsersFromDatabase(){
+ val mDbRef = Firebase.database("https://chatapplication-4eb49-default-rtdb.europe-west1.firebasedatabase.app/").reference
+ 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)
+// userList.add(currentUser!!)
+// }
+ snapshot.children.forEach {
+ val currentUser = it.getValue(User::class.java)
+ userList.add(currentUser!!)
+ }
+ userList.removeAll(
+ userList.filter{it.uid == mAuth.currentUser?.uid}.toSet()
+ )
+// userList.removeIf{it.uid == mAuth.currentUser?.uid}
+ adapter.submitList(userList)
+ }
+
+ override fun onCancelled(error: DatabaseError) {
+ TODO("Not yet implemented")
+ }
+
+ })
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
+ menuInflater.inflate(R.menu.main_menu,menu)
+ return super.onCreateOptionsMenu(menu)
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ if(item.itemId == R.id.Logout){
+ mAuth.signOut()
+ finish()
+ val intent = Intent(this, LogIn::class.java)
+ startActivity(intent)
+ }
+ return true
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/lsm/chatapplication/SignUp.kt b/app/src/main/java/com/lsm/chatapplication/SignUp.kt
index 8c41d01..7b90991 100644
--- a/app/src/main/java/com/lsm/chatapplication/SignUp.kt
+++ b/app/src/main/java/com/lsm/chatapplication/SignUp.kt
@@ -1,13 +1,20 @@
package com.lsm.chatapplication
+import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
+import android.widget.Toast
import com.google.firebase.auth.FirebaseAuth
+import com.google.firebase.database.DatabaseReference
+import com.google.firebase.database.FirebaseDatabase
+import com.google.firebase.database.ktx.database
+import com.google.firebase.ktx.Firebase
import com.lsm.chatapplication.databinding.ActivitySignUpBinding
class SignUp : AppCompatActivity() {
private lateinit var binding: ActivitySignUpBinding
private lateinit var mAuth: FirebaseAuth
+// private lateinit var mDbRef: DatabaseReference
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -15,16 +22,37 @@ class SignUp : AppCompatActivity() {
val view = binding.root
setContentView(view)
+// supportActionBar?.hide()
+
mAuth = FirebaseAuth.getInstance()
+// mDbRef = Firebase.database("https://chatapplication-4eb49-default-rtdb.europe-west1.firebasedatabase.app/").reference
binding.signUpBtn.setOnClickListener{
val usrName = binding.edtUserName.text.toString()
val email = binding.edtEmail.text.toString()
val password = binding.edtPassword.text.toString()
- signUp(email,password)
+ signUp(usrName, email,password)
}
}
- private fun signUp(email: String, password: String){
+ private fun signUp(name:String, email: String, password: String){
+ mAuth.createUserWithEmailAndPassword(email, password)
+ .addOnCompleteListener(this) { task ->
+ if (task.isSuccessful) {
+ // Jumping to home
+ addUserToDatabase(name, email, mAuth.currentUser?.uid!!)
+ val intent = Intent(this@SignUp,MainActivity::class.java)
+ finish()
+ startActivity(intent)
+ } else {
+ // Account creation error message
+ Toast.makeText(this@SignUp,task.exception?.toString(),Toast.LENGTH_LONG).show()
+ //Toast.makeText(this@SignUp,"Some error occurred",Toast.LENGTH_SHORT).show()
+ }
+ }
+ }
+ private fun addUserToDatabase(name: String, email: String, uid: String){
+ val mDbRef = Firebase.database("https://chatapplication-4eb49-default-rtdb.europe-west1.firebasedatabase.app/").reference
+ mDbRef.child("user").child(uid).setValue(User(name,email,uid))
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/lsm/chatapplication/User.kt b/app/src/main/java/com/lsm/chatapplication/User.kt
new file mode 100644
index 0000000..0d1316c
--- /dev/null
+++ b/app/src/main/java/com/lsm/chatapplication/User.kt
@@ -0,0 +1,17 @@
+package com.lsm.chatapplication
+
+class User (var name: String?, var email: String?, var uid: String?){
+
+ constructor() : this(null,null,null) {}
+
+ override fun equals(other: Any?): Boolean {
+ return super.equals(other)
+ }
+
+ override fun hashCode(): Int {
+ var result = name?.hashCode() ?: 0
+ result = 31 * result + (email?.hashCode() ?: 0)
+ result = 31 * result + (uid?.hashCode() ?: 0)
+ return result
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/lsm/chatapplication/UserAdapter.kt b/app/src/main/java/com/lsm/chatapplication/UserAdapter.kt
new file mode 100644
index 0000000..c3475ad
--- /dev/null
+++ b/app/src/main/java/com/lsm/chatapplication/UserAdapter.kt
@@ -0,0 +1,53 @@
+package com.lsm.chatapplication
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView
+import com.lsm.chatapplication.databinding.UserLayoutBinding
+
+//class UserAdapter(val userList: ArrayList):
+// RecyclerView.Adapter() {
+//
+// class UserViewHolder(val binding: UserLayoutBinding): RecyclerView.ViewHolder(binding.root)
+//
+// override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
+// return UserViewHolder(UserLayoutBinding.inflate(LayoutInflater.from(parent.context), parent, false))
+// }
+//
+// override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
+// val currentUser = userList[position]
+// holder.binding.userName.text = currentUser.name
+// }
+//
+// override fun getItemCount(): Int {
+// return userList.size
+// }
+//}
+class UserAdapter():
+ ListAdapter(TaskDiffCallBack()){
+
+ class TaskDiffCallBack: DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(oldItem: User, newItem: User): Boolean {
+ return oldItem.uid == newItem.uid
+ }
+
+ override fun areContentsTheSame(oldItem: User, newItem: User): Boolean {
+ return oldItem == newItem
+ }
+ }
+
+ class UserViewHolder(val binding: UserLayoutBinding): RecyclerView.ViewHolder(binding.root)
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
+ return UserViewHolder(UserLayoutBinding.inflate(LayoutInflater.from(parent.context), parent, false))
+ }
+
+ override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
+ val currentUser = getItem(position)
+ holder.binding.userName.text = currentUser.name
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml
new file mode 100644
index 0000000..99d07ff
--- /dev/null
+++ b/app/src/main/res/layout/activity_chat.xml
@@ -0,0 +1,9 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 0b15a20..ae9993c 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -6,4 +6,13 @@
android:layout_height="match_parent"
tools:context=".MainActivity">
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/user_layout.xml b/app/src/main/res/layout/user_layout.xml
new file mode 100644
index 0000000..d8216f3
--- /dev/null
+++ b/app/src/main/res/layout/user_layout.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml
new file mode 100644
index 0000000..0edb90f
--- /dev/null
+++ b/app/src/main/res/menu/main_menu.xml
@@ -0,0 +1,7 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2a79815..3ad994b 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -6,4 +6,5 @@
User Name
Create new account
Or
+ Log Out
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 39215c9..73ffe6e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
dependencies {
- classpath 'com.google.gms:google-services:4.3.13'
+ classpath 'com.google.gms:google-services:4.3.14'
}
}