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' } }