diff --git a/TalkIn/.idea/appInsightsSettings.xml b/TalkIn/.idea/appInsightsSettings.xml new file mode 100644 index 0000000..719888c --- /dev/null +++ b/TalkIn/.idea/appInsightsSettings.xml @@ -0,0 +1,26 @@ + + + + + + \ No newline at end of file diff --git a/TalkIn/.idea/deploymentTargetSelector.xml b/TalkIn/.idea/deploymentTargetSelector.xml index b268ef3..fc8303f 100644 --- a/TalkIn/.idea/deploymentTargetSelector.xml +++ b/TalkIn/.idea/deploymentTargetSelector.xml @@ -5,6 +5,9 @@ + + \ No newline at end of file diff --git a/TalkIn/app/build.gradle b/TalkIn/app/build.gradle index 58cbff9..89dd653 100644 --- a/TalkIn/app/build.gradle +++ b/TalkIn/app/build.gradle @@ -39,7 +39,10 @@ android { } dependencies { - + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.1" + implementation 'androidx.activity:activity-ktx' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx' implementation 'androidx.core:core-ktx:1.13.1' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.12.0' diff --git a/TalkIn/app/src/main/java/com/example/talk_in/MainActivity.kt b/TalkIn/app/src/main/java/com/example/talk_in/MainActivity.kt index 75c86b9..4e124da 100644 --- a/TalkIn/app/src/main/java/com/example/talk_in/MainActivity.kt +++ b/TalkIn/app/src/main/java/com/example/talk_in/MainActivity.kt @@ -4,69 +4,47 @@ import android.content.Intent import android.os.Bundle import android.util.Log import android.widget.Toast +import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.SearchView import androidx.recyclerview.widget.LinearLayoutManager +import com.example.talk_in.MainViewModel import com.example.talk_in.databinding.ActivityMainBinding -import com.google.firebase.auth.FirebaseAuth -import com.google.firebase.database.* - class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding - private lateinit var userList: ArrayList + private val mainViewModel: MainViewModel by viewModels() private lateinit var adapter: UserAdapter - private lateinit var tempUserList: ArrayList private lateinit var tempAdapter: UserAdapter - private lateinit var mAuth: FirebaseAuth - private lateinit var mDbRef: DatabaseReference override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - mAuth = FirebaseAuth.getInstance() - mDbRef = FirebaseDatabase.getInstance().getReference() - - userList = ArrayList() - adapter = UserAdapter(this, userList) - - tempUserList = ArrayList() - tempAdapter = UserAdapter(this, tempUserList) + adapter = UserAdapter(this, ArrayList()) + tempAdapter = UserAdapter(this, ArrayList()) binding.userRecyclerView.layoutManager = LinearLayoutManager(this) binding.userRecyclerView.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 (currentUser != null && mAuth.currentUser?.uid != currentUser.uid && currentUser.verified == true) { - userList.add(currentUser) - } - } - adapter.notifyDataSetChanged() - } - - override fun onCancelled(error: DatabaseError) { - // Handle possible errors. - } - }) + mainViewModel.userList.observe(this) { users -> + adapter.updateUsers(users) + } binding.userSearchBar.setOnQueryTextListener(object : SearchView.OnQueryTextListener { - override fun onQueryTextSubmit(query: String): Boolean { - return false - } - override fun onQueryTextChange(newText: String): Boolean { - filterList(newText) + val filteredList = mainViewModel.filterList(newText) + adapter.updateUsers(filteredList) // Update the main adapter directly + if (filteredList.isEmpty()) { + Toast.makeText(this@MainActivity, "No data found", Toast.LENGTH_SHORT).show() + } return true } }) + binding.bottomNavigation.setOnItemSelectedListener { item -> when (item.itemId) { R.id.menu_chat -> true @@ -83,22 +61,6 @@ class MainActivity : AppCompatActivity() { } } - private fun filterList(text: String) { - tempUserList.clear() - binding.userRecyclerView.adapter = tempAdapter - for (user in userList) { - if (user.name?.startsWith(text, ignoreCase = true) == true) { - tempUserList.add(user) - } - } - if (tempUserList.isEmpty()) { - tempAdapter.notifyDataSetChanged() - Toast.makeText(this@MainActivity, "No data found", Toast.LENGTH_SHORT).show() - } else { - tempAdapter.notifyDataSetChanged() - } - } - override fun onBackPressed() { super.onBackPressed() val intent = Intent(Intent.ACTION_MAIN) diff --git a/TalkIn/app/src/main/java/com/example/talk_in/MainViewModel.kt b/TalkIn/app/src/main/java/com/example/talk_in/MainViewModel.kt new file mode 100644 index 0000000..8984ba8 --- /dev/null +++ b/TalkIn/app/src/main/java/com/example/talk_in/MainViewModel.kt @@ -0,0 +1,50 @@ +package com.example.talk_in + +import android.widget.Toast +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.example.talk_in.databinding.ActivityMainBinding +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.database.DataSnapshot +import com.google.firebase.database.DatabaseError +import com.google.firebase.database.DatabaseReference +import com.google.firebase.database.FirebaseDatabase +import com.google.firebase.database.ValueEventListener + +class MainViewModel { + private val _userList = MutableLiveData>() + val userList: LiveData> get()=_userList + + private val mAuth: FirebaseAuth=FirebaseAuth.getInstance() + private val mDbRef: DatabaseReference=FirebaseDatabase.getInstance().reference + + init { + fetchUsers() + } + + // Firebase Fetch + + private fun fetchUsers(){ + mDbRef.child("user").addValueEventListener(object :ValueEventListener{ + override fun onDataChange(snapshot: DataSnapshot) { + val tempList = mutableListOf() + for (postSnapshot in snapshot.children){ + val currentUser =postSnapshot.getValue(User::class.java) + if (currentUser != null && mAuth.currentUser?.uid !=currentUser.uid&¤tUser.verified==true){ + tempList.add(currentUser) + } + } + _userList.value=tempList + } + + override fun onCancelled(error: DatabaseError) { + + } + }) + + } + fun filterList(query: String):List{ + return _userList.value?.filter { it.name?.startsWith(query,ignoreCase = true)==true }?: emptyList() + } + +} \ No newline at end of file diff --git a/TalkIn/app/src/main/java/com/example/talk_in/UserAdapter.kt b/TalkIn/app/src/main/java/com/example/talk_in/UserAdapter.kt index 83d60cf..4fc14d4 100644 --- a/TalkIn/app/src/main/java/com/example/talk_in/UserAdapter.kt +++ b/TalkIn/app/src/main/java/com/example/talk_in/UserAdapter.kt @@ -21,8 +21,9 @@ import com.google.firebase.storage.StorageReference import java.io.File import java.io.IOException -class UserAdapter(val context: Context, val userList: ArrayList) : +class UserAdapter(val context: Context, private var userList: ArrayList) : RecyclerView.Adapter() { + private lateinit var mAuth: FirebaseAuth private lateinit var storageReference: StorageReference private lateinit var mDbRef: DatabaseReference @@ -61,14 +62,13 @@ class UserAdapter(val context: Context, val userList: ArrayList) : override fun onDataChange(snapshot: DataSnapshot) { if (snapshot.exists()) { val lastMessage = snapshot.children.first().getValue(Message::class.java) - holder.txt_last_message.setText(lastMessage?.message.toString()) - } - else{ + holder.txt_last_message.text = lastMessage?.message.toString() + } else { var aboutUser = currentUser.aboutMe.toString().trim() - if (aboutUser.length > 30){ + if (aboutUser.length > 30) { aboutUser = aboutUser.substring(0, minOf(currentUser.aboutMe.toString().length, 30)).trim() + "..." } - holder.txt_last_message.setText(aboutUser) + holder.txt_last_message.text = aboutUser } } @@ -83,9 +83,9 @@ class UserAdapter(val context: Context, val userList: ArrayList) : } class UserViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - val textName = itemView.findViewById(R.id.txt_name) - val userprofileImage = itemView.findViewById(R.id.user_profile_image) - val txt_last_message = itemView.findViewById(R.id.txt_last_message) + val textName: TextView = itemView.findViewById(R.id.txt_name) + val userprofileImage: ImageView = itemView.findViewById(R.id.user_profile_image) + val txt_last_message: TextView = itemView.findViewById(R.id.txt_last_message) } private fun setProfileImage(uid: String, holder: UserViewHolder) { @@ -97,11 +97,18 @@ class UserAdapter(val context: Context, val userList: ArrayList) : .addOnSuccessListener { val bitmap = BitmapFactory.decodeFile(localFile.absolutePath) holder.userprofileImage.setImageBitmap(bitmap) - }.addOnFailureListener{ + }.addOnFailureListener { holder.userprofileImage.setImageResource(R.drawable.user_profile_icon) } } catch (e: IOException) { e.printStackTrace() } } -} \ No newline at end of file + + // Add updateUsers method + fun updateUsers(newUserList: List) { + userList.clear() + userList.addAll(newUserList) + notifyDataSetChanged() + } +}