diff --git a/app/src/main/java/com/isanz/inmomarket/ui/chat/ChatFragment.kt b/app/src/main/java/com/isanz/inmomarket/ui/chat/ChatFragment.kt index 829b5ae..8eef719 100644 --- a/app/src/main/java/com/isanz/inmomarket/ui/chat/ChatFragment.kt +++ b/app/src/main/java/com/isanz/inmomarket/ui/chat/ChatFragment.kt @@ -11,8 +11,10 @@ import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.bumptech.glide.Glide import com.isanz.inmomarket.InmoMarket +import com.isanz.inmomarket.R import com.isanz.inmomarket.databinding.FragmentChatBinding import com.isanz.inmomarket.rv.chatItem.ChatListAdapter +import com.isanz.inmomarket.utils.entities.User import kotlinx.coroutines.launch class ChatFragment : Fragment() { @@ -49,8 +51,7 @@ class ChatFragment : Fragment() { } private fun setUpOtherUser() = lifecycleScope.launch { - val users = chatViewModel.getUsersInConversation(idChat).await() - val otherUser = users.find { it.uid != InmoMarket.getAuth().currentUser!!.uid } + val otherUser = retrieveOtherUser() mBinding.tvNameChat.text = otherUser?.displayName otherUser?.photoUrl?.let { loadImage(it) } } @@ -89,6 +90,27 @@ class ChatFragment : Fragment() { mBinding.ibBack.setOnClickListener { navigateBack() } + mBinding.llProfileChat.setOnClickListener { + navigateToProfile() + } + } + + + private suspend fun retrieveOtherUser(): User? { + val users = chatViewModel.getUsersInConversation(idChat).await() + return users.find { it.uid != InmoMarket.getAuth().currentUser!!.uid } + } + + private fun navigateToProfile() { + val bundle = Bundle() + lifecycleScope.launch { + val otherUser = retrieveOtherUser() + bundle.putString("profileId", otherUser?.uid) + this@ChatFragment.findNavController().navigate( + R.id.action_navigation_chat_to_navigation_profile, bundle + ) + + } } private fun sendMessage() { diff --git a/app/src/main/java/com/isanz/inmomarket/ui/profile/ProfileFragment.kt b/app/src/main/java/com/isanz/inmomarket/ui/profile/ProfileFragment.kt index 2890606..ee937a6 100644 --- a/app/src/main/java/com/isanz/inmomarket/ui/profile/ProfileFragment.kt +++ b/app/src/main/java/com/isanz/inmomarket/ui/profile/ProfileFragment.kt @@ -30,6 +30,8 @@ class ProfileFragment : Fragment() { private lateinit var mBinding: FragmentProfileBinding private lateinit var navView: NavigationView private lateinit var drawerLayout: DrawerLayout + private lateinit var profileUserId: String + private val profileViewModel: ProfileViewModel by lazy { ViewModelProvider(this)[ProfileViewModel::class.java] } @@ -38,6 +40,9 @@ class ProfileFragment : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { mBinding = FragmentProfileBinding.inflate(inflater, container, false) + arguments?.let { + profileUserId = it.getString("profileId") ?: "" + } setUp() return mBinding.root } @@ -46,11 +51,21 @@ class ProfileFragment : Fragment() { lifecycleScope.launch { setUpView() } + setUpButtons() setUpDrawer() setUpTabs() setUpProfileImagePicker() } + private fun setUpButtons() { + mBinding.profileLayout.ibDrawer.setOnClickListener { + mBinding.drawerLayout.openDrawer(GravityCompat.START) + } + mBinding.profileLayout.ibBack.setOnClickListener { + findNavController().popBackStack() + } + } + private fun setUpProfileImagePicker() { mBinding.profileLayout.ivProfile.setOnClickListener { launchImagePicker() @@ -63,12 +78,13 @@ class ProfileFragment : Fragment() { imagePickerResultLauncher.launch(intent) } - private val imagePickerResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - if (result.resultCode == Activity.RESULT_OK) { - val imageUri = result.data?.data - handleImagePicked(imageUri) + private val imagePickerResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK) { + val imageUri = result.data?.data + handleImagePicked(imageUri) + } } - } private fun handleImagePicked(imageUri: Uri?) { if (imageUri != null) { @@ -82,24 +98,24 @@ class ProfileFragment : Fragment() { val viewPager = mBinding.profileLayout.viewPager - val adapter = ViewPagerAdapter(requireActivity()) - viewPager.adapter = adapter + + if (profileUserId.isEmpty()) { + viewPager.adapter = ViewPagerAdapter(requireActivity()) + } else { + viewPager.adapter = ViewPagerAdapter(requireActivity(), profileUserId) + } TabLayoutMediator(tabLayout, viewPager) { tab, position -> when (position) { 0 -> tab.text = getString(R.string.tab_favorites) - 1 -> tab.text = getString(R.string.tab_your_uploads) + 1 -> tab.text = getString(R.string.tab_uploads) else -> error("Invalid position") } }.attach() } private fun setUpDrawer() { - mBinding.profileLayout.ibDrawer.setOnClickListener { - mBinding.drawerLayout.openDrawer(GravityCompat.START) - } - navView.setNavigationItemSelectedListener { when (it.itemId) { R.id.nav_logout -> { @@ -142,6 +158,16 @@ class ProfileFragment : Fragment() { private fun setUpView() { navView = mBinding.navView drawerLayout = mBinding.drawerLayout + if (profileUserId.isEmpty()) { + viewProfileForOther() + } else { + viewProfileForSelf() + } + } + + private fun viewProfileForOther() { + mBinding.profileLayout.ibDrawer.visibility = View.VISIBLE + mBinding.profileLayout.ibBack.visibility = View.GONE profileViewModel.retrieveProfile { user -> if (user != null) { loadImage(mBinding.profileLayout.ivProfile, user.photoUrl!!) @@ -150,6 +176,17 @@ class ProfileFragment : Fragment() { } } + private fun viewProfileForSelf() { + mBinding.profileLayout.ibDrawer.visibility = View.GONE + mBinding.profileLayout.ibBack.visibility = View.VISIBLE + profileViewModel.retrieveProfile(profileUserId) { user -> + if (user != null) { + loadImage(mBinding.profileLayout.ivProfile, user.photoUrl!!) + mBinding.profileLayout.tvName.text = user.displayName + } + } + } + private fun loadImage(view: ImageView, url: String) { try { Glide.with(view.context).load(url).circleCrop().into(view) diff --git a/app/src/main/java/com/isanz/inmomarket/ui/profile/ProfileViewModel.kt b/app/src/main/java/com/isanz/inmomarket/ui/profile/ProfileViewModel.kt index d727119..73d95ce 100644 --- a/app/src/main/java/com/isanz/inmomarket/ui/profile/ProfileViewModel.kt +++ b/app/src/main/java/com/isanz/inmomarket/ui/profile/ProfileViewModel.kt @@ -18,11 +18,10 @@ class ProfileViewModel : ViewModel() { private val db = InmoMarket.getDb() - fun retrieveProfile(callback: (User?) -> Unit) { + fun retrieveProfile(profileUserId: String = FirebaseAuth.getInstance().currentUser!!.uid, callback: (User?) -> Unit) { viewModelScope.launch { try { - val userId = InmoMarket.getAuth().currentUser!!.uid - val user = getUserFromDb(userId) + val user = getUserFromDb(profileUserId) callback(user) } catch (e: Exception) { Log.e(Constants.TAG, "retrieveProfile:failure", e) diff --git a/app/src/main/java/com/isanz/inmomarket/ui/profile/ViewPagerAdapter.kt b/app/src/main/java/com/isanz/inmomarket/ui/profile/ViewPagerAdapter.kt index 6560ea4..425585b 100644 --- a/app/src/main/java/com/isanz/inmomarket/ui/profile/ViewPagerAdapter.kt +++ b/app/src/main/java/com/isanz/inmomarket/ui/profile/ViewPagerAdapter.kt @@ -3,10 +3,11 @@ package com.isanz.inmomarket.ui.profile import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.viewpager2.adapter.FragmentStateAdapter +import com.google.firebase.auth.FirebaseAuth import com.isanz.inmomarket.ui.profile.tabs.favorites.FavoritesProfileFragment import com.isanz.inmomarket.ui.profile.tabs.uploads.YourUploadsProfileFragment -class ViewPagerAdapter(fragmentActivity: FragmentActivity) : +class ViewPagerAdapter(fragmentActivity: FragmentActivity, private val userId: String = FirebaseAuth.getInstance().currentUser!!.uid) : FragmentStateAdapter(fragmentActivity) { override fun getItemCount(): Int { return 2 @@ -14,9 +15,9 @@ class ViewPagerAdapter(fragmentActivity: FragmentActivity) : override fun createFragment(position: Int): Fragment { return when (position) { - 0 -> FavoritesProfileFragment() - 1 -> YourUploadsProfileFragment() + 0 -> FavoritesProfileFragment(userId) + 1 -> YourUploadsProfileFragment(userId) else -> error("Invalid position") } } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/favorites/FavoritesProfileFragment.kt b/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/favorites/FavoritesProfileFragment.kt index 3d4664f..bafdf78 100644 --- a/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/favorites/FavoritesProfileFragment.kt +++ b/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/favorites/FavoritesProfileFragment.kt @@ -15,12 +15,13 @@ import com.isanz.inmomarket.utils.entities.Property import com.isanz.inmomarket.utils.interfaces.OnItemClickListener -class FavoritesProfileFragment : Fragment(), OnItemClickListener { +class FavoritesProfileFragment(userId: String ): Fragment(), OnItemClickListener { private lateinit var mBinging: FragmentFavoritesProfileBinding private val favoritesProfileViewModel: FavoritesProfileViewModel by lazy { - ViewModelProvider(this)[FavoritesProfileViewModel::class.java] + val factory = FavoritesProfileViewModelFactory(userId) + ViewModelProvider(this, factory)[FavoritesProfileViewModel::class.java] } override fun onCreateView( diff --git a/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/favorites/FavoritesProfileViewModel.kt b/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/favorites/FavoritesProfileViewModel.kt index cc89bf2..b7277fb 100644 --- a/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/favorites/FavoritesProfileViewModel.kt +++ b/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/favorites/FavoritesProfileViewModel.kt @@ -6,6 +6,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.google.firebase.auth.FirebaseAuth import com.google.firebase.firestore.DocumentSnapshot import com.google.firebase.firestore.QuerySnapshot import com.isanz.inmomarket.InmoMarket @@ -15,7 +16,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class FavoritesProfileViewModel(private val dispatcher: CoroutineDispatcher = Dispatchers.IO) : ViewModel() { +class FavoritesProfileViewModel(userId: String = FirebaseAuth.getInstance().currentUser!!.uid , private val dispatcher: CoroutineDispatcher = Dispatchers.IO) : ViewModel() { val db = InmoMarket.getDb() private val _listfavorites = MutableLiveData>() @@ -24,14 +25,14 @@ class FavoritesProfileViewModel(private val dispatcher: CoroutineDispatcher = Di init { viewModelScope.launch { try { - listenForFavorites() + listenForFavorites(userId) } catch (e: Exception) { Log.w(ContentValues.TAG, "listenFavorites:failure.", e) } } } - private suspend fun listenForFavorites() = withContext(dispatcher) { + private suspend fun listenForFavorites(userId: String = FirebaseAuth.getInstance().currentUser!!.uid) = withContext(dispatcher) { db.collection("properties").addSnapshotListener { snapshot, e -> if (e != null) { logFailure(e) @@ -40,7 +41,7 @@ class FavoritesProfileViewModel(private val dispatcher: CoroutineDispatcher = Di try { snapshot?.let { - handleSnapshot(it) + handleSnapshot(it, userId) } ?: logNullData() } catch (e: Exception) { logFailure(e) @@ -56,12 +57,11 @@ class FavoritesProfileViewModel(private val dispatcher: CoroutineDispatcher = Di Log.d(ContentValues.TAG, "Current data: null") } - private fun handleSnapshot(snapshot: QuerySnapshot) { + private fun handleSnapshot(snapshot: QuerySnapshot, userId: String = InmoMarket.getAuth().currentUser!!.uid) { val properties = mutableListOf() - val currentUserId = InmoMarket.getAuth().currentUser!!.uid for (document in snapshot.documents) { if (document.exists()) { - handleDocument(document, currentUserId, properties) + handleDocument(document, userId, properties) } } _listfavorites.postValue(properties) diff --git a/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/favorites/FavoritesProfileViewModelFactory.kt b/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/favorites/FavoritesProfileViewModelFactory.kt new file mode 100644 index 0000000..f71eab6 --- /dev/null +++ b/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/favorites/FavoritesProfileViewModelFactory.kt @@ -0,0 +1,14 @@ +package com.isanz.inmomarket.ui.profile.tabs.favorites + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider + +class FavoritesProfileViewModelFactory(private val userId: String) : ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + if (modelClass.isAssignableFrom(FavoritesProfileViewModel::class.java)) { + @Suppress("UNCHECKED_CAST") + return FavoritesProfileViewModel(userId) as T + } + throw IllegalArgumentException("Unknown ViewModel class") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/favorites/UploadsProfileViewModelFactory.kt b/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/favorites/UploadsProfileViewModelFactory.kt new file mode 100644 index 0000000..080447f --- /dev/null +++ b/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/favorites/UploadsProfileViewModelFactory.kt @@ -0,0 +1,15 @@ +package com.isanz.inmomarket.ui.profile.tabs.favorites + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.isanz.inmomarket.ui.profile.tabs.uploads.YourUploadsProfileViewModel + +class UploadsProfileViewModelFactory(private val userId: String) : ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + if (modelClass.isAssignableFrom(YourUploadsProfileViewModel::class.java)) { + @Suppress("UNCHECKED_CAST") + return YourUploadsProfileViewModel(userId) as T + } + throw IllegalArgumentException("Unknown ViewModel class") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/uploads/YourUploadsProfileFragment.kt b/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/uploads/YourUploadsProfileFragment.kt index 1f645a1..0a4527d 100644 --- a/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/uploads/YourUploadsProfileFragment.kt +++ b/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/uploads/YourUploadsProfileFragment.kt @@ -11,16 +11,18 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.isanz.inmomarket.R import com.isanz.inmomarket.databinding.FragmentYourUploadsProfileBinding import com.isanz.inmomarket.rv.propertyItem.PropertyItemListAdapter +import com.isanz.inmomarket.ui.profile.tabs.favorites.UploadsProfileViewModelFactory import com.isanz.inmomarket.utils.entities.Property import com.isanz.inmomarket.utils.interfaces.OnItemClickListener -class YourUploadsProfileFragment : Fragment(), OnItemClickListener { +class YourUploadsProfileFragment(userId: String) : Fragment(), OnItemClickListener { private lateinit var mBinging: FragmentYourUploadsProfileBinding private val yourUploadsProfileViewModel: YourUploadsProfileViewModel by lazy { - ViewModelProvider(this)[YourUploadsProfileViewModel::class.java] + val factory = UploadsProfileViewModelFactory(userId) + ViewModelProvider(this, factory)[YourUploadsProfileViewModel::class.java] } override fun onCreateView( diff --git a/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/uploads/YourUploadsProfileViewModel.kt b/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/uploads/YourUploadsProfileViewModel.kt index b2a3d00..5d04fed 100644 --- a/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/uploads/YourUploadsProfileViewModel.kt +++ b/app/src/main/java/com/isanz/inmomarket/ui/profile/tabs/uploads/YourUploadsProfileViewModel.kt @@ -6,6 +6,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.google.firebase.auth.FirebaseAuth import com.google.firebase.firestore.DocumentSnapshot import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.QuerySnapshot @@ -16,7 +17,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class YourUploadsProfileViewModel(private val dispatcher: CoroutineDispatcher = Dispatchers.IO) : ViewModel() { +class YourUploadsProfileViewModel(userId: String = FirebaseAuth.getInstance().currentUser!!.uid, private val dispatcher: CoroutineDispatcher = Dispatchers.IO) : ViewModel() { private val _listParcelas = MutableLiveData>() val listParcelas: LiveData> = _listParcelas @@ -25,14 +26,14 @@ class YourUploadsProfileViewModel(private val dispatcher: CoroutineDispatcher = init { viewModelScope.launch { try { - listenForParcelasUpdates() + listenForParcelasUpdates(userId) } catch (e: Exception) { Log.w(ContentValues.TAG, "listenForParcelasUpdates:failure", e) } } } - private suspend fun listenForParcelasUpdates() { + private suspend fun listenForParcelasUpdates(userId: String = FirebaseAuth.getInstance().currentUser!!.uid) { withContext(dispatcher){ db.collection("properties").addSnapshotListener { snapshot, e -> if (e != null) { @@ -42,7 +43,7 @@ class YourUploadsProfileViewModel(private val dispatcher: CoroutineDispatcher = try { snapshot?.let { - handleSnapshot(it) + handleSnapshot(it, userId) } ?: logNullData() } catch (e: Exception) { logFailure(e) @@ -59,12 +60,11 @@ class YourUploadsProfileViewModel(private val dispatcher: CoroutineDispatcher = Log.d(ContentValues.TAG, "Current data: null") } - private fun handleSnapshot(snapshot: QuerySnapshot) { + private fun handleSnapshot(snapshot: QuerySnapshot, userId: String = InmoMarket.getAuth().currentUser!!.uid) { val properties = mutableListOf() - val currentUserId = InmoMarket.getAuth().currentUser!!.uid for (document in snapshot.documents) { if (document.exists()) { - handleDocument(document, currentUserId, properties) + handleDocument(document, userId, properties) } } _listParcelas.postValue(properties) diff --git a/app/src/main/java/com/isanz/inmomarket/ui/property/PropertyFragment.kt b/app/src/main/java/com/isanz/inmomarket/ui/property/PropertyFragment.kt index d79ffd1..5c9f22a 100644 --- a/app/src/main/java/com/isanz/inmomarket/ui/property/PropertyFragment.kt +++ b/app/src/main/java/com/isanz/inmomarket/ui/property/PropertyFragment.kt @@ -49,6 +49,15 @@ class PropertyFragment : Fragment() { } } + mBinding.llProfile.setOnClickListener{ + val bundle = Bundle().apply { + putString("profileId", property.userId) + } + this.findNavController().navigate(R.id.action_navigation_property_to_navigation_profile, bundle) + } + + + mBinding.ibBack.setOnClickListener { this.findNavController().popBackStack() } diff --git a/app/src/main/res/layout/fragment_chat.xml b/app/src/main/res/layout/fragment_chat.xml index 19c58e2..f96f120 100644 --- a/app/src/main/res/layout/fragment_chat.xml +++ b/app/src/main/res/layout/fragment_chat.xml @@ -19,39 +19,50 @@ - - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:tint="@color/md_theme_light_background" /> - + android:orientation="horizontal" + android:layout_marginStart="@dimen/common_margin" + app:layout_constraintStart_toEndOf="@id/ibBack" + app:layout_constraintTop_toTopOf="parent"> + + + + + + @@ -66,7 +77,7 @@ android:paddingBottom="8dp" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layout_constraintBottom_toTopOf="@id/tilMessage" - app:layout_constraintTop_toBottomOf="@id/clToolbar"/> + app:layout_constraintTop_toBottomOf="@id/clToolbar" /> + + + android:layout_gravity="center_vertical" + /> + + + + + android:textStyle="bold" /> @@ -80,7 +89,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" app:tabMode="scrollable" - android:text="@string/tab_your_uploads" /> + android:text="@string/tab_uploads" /> + + + Zurück Standort erlauben Passwort ändern - Deine Uploads + Uploads Favoriten Keine Favoriten gefunden Keine Unterhaltungen gefunden diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 77a860f..9b85da6 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -70,7 +70,7 @@ Volver Permitir ubicación Cambiar contraseña - Tus Cargas + Subidas Favoritos No se encontraron favoritos No se encontraron conversaciones diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e7c47d1..08af3e4 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -70,7 +70,7 @@ Revenir en arrière Autoriser la localisation Changer le mot de passe - Vos téléchargements + Téléchargements Favoris Aucun favori trouvé Aucune conversation trouvée diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index e829083..006225c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -70,7 +70,7 @@ Torna indietro Consenti ubicazione Modifica password - I tuoi caricamenti + Upload Preferiti Nessun preferito trovato Nessuna conversazione trovata diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 726ffda..eadaad1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -70,7 +70,7 @@ Go Back Allow ubication Change password - Your Uploads + Uploads Favorites No Favorites Found No conversations found