diff --git a/.idea/navEditor.xml b/.idea/navEditor.xml index 95e3f92..0f602e7 100644 --- a/.idea/navEditor.xml +++ b/.idea/navEditor.xml @@ -146,10 +146,19 @@ + diff --git a/app/src/main/java/com/esp/localjobs/data/models/User.kt b/app/src/main/java/com/esp/localjobs/data/models/User.kt index b16667b..47e942b 100644 --- a/app/src/main/java/com/esp/localjobs/data/models/User.kt +++ b/app/src/main/java/com/esp/localjobs/data/models/User.kt @@ -1,14 +1,17 @@ package com.esp.localjobs.data.models +import android.os.Parcelable import com.google.firebase.auth.FirebaseUser +import kotlinx.android.parcel.Parcelize +@Parcelize data class User( val uid: String = "", val displayName: String = "", val phoneNumber: String = "", val photoUrl: String = "", val mail: String = "" -) +) : Parcelable fun FirebaseUser.toUser() = User( uid = uid, diff --git a/app/src/main/java/com/esp/localjobs/fragments/JobsFragment.kt b/app/src/main/java/com/esp/localjobs/fragments/JobsFragment.kt index 25f1f2e..4177794 100644 --- a/app/src/main/java/com/esp/localjobs/fragments/JobsFragment.kt +++ b/app/src/main/java/com/esp/localjobs/fragments/JobsFragment.kt @@ -8,15 +8,18 @@ import android.view.MenuInflater import android.view.View import android.view.ViewGroup import android.widget.SearchView +import androidx.core.view.forEach import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.Observer import androidx.navigation.fragment.FragmentNavigatorExtras import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.RecyclerView import com.esp.localjobs.R import com.esp.localjobs.adapters.JobItem import com.esp.localjobs.data.models.Location +import com.esp.localjobs.data.models.User import com.esp.localjobs.data.repository.JobsRepository import com.esp.localjobs.fragments.FiltersFragment.Companion.FILTER_FRAGMENT_TAG import com.esp.localjobs.fragments.map.LocationPickerFragment @@ -30,7 +33,8 @@ import kotlinx.android.synthetic.main.fragment_jobs.view.* import kotlinx.coroutines.InternalCoroutinesApi /** - * Fragment used to display a list of jobs + * Fragment used to display a list of jobs. If arguments include an User then the fragment + * shows the user's jobs/proposals */ @InternalCoroutinesApi class JobsFragment : Fragment(), LocationPickerFragment.OnLocationPickedListener { @@ -38,6 +42,8 @@ class JobsFragment : Fragment(), LocationPickerFragment.OnLocationPickedListener private val jobsViewModel: JobsViewModel by activityViewModels() private val filterViewModel: FilterViewModel by activityViewModels() + private val args: JobsFragmentArgs by navArgs() + val adapter = GroupAdapter() override fun onCreateView( @@ -56,7 +62,10 @@ class JobsFragment : Fragment(), LocationPickerFragment.OnLocationPickedListener setupAdapter() observeChangesInJobList() - observeFilters() + + args.user?.let { + setupUserJobsView(it) + } ?: observeFilters() } private fun setupUI(view: View) = with(view) { @@ -137,6 +146,11 @@ class JobsFragment : Fragment(), LocationPickerFragment.OnLocationPickedListener } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + // hide menu actions if we are showing some user's jobs/proposals + args.user?.let { + menu.forEach { it.isVisible = false } + return + } inflater.inflate(R.menu.menu_search, menu) val searchView = menu.findItem(R.id.action_search_item).actionView as SearchView setupSearchView(searchView) @@ -181,6 +195,40 @@ class JobsFragment : Fragment(), LocationPickerFragment.OnLocationPickedListener } } + private fun setupUserJobsView(user: User) { + activity?.title = getString(R.string.user_jobs_title, user.displayName) + val fromJobs = filterViewModel.filteringJobs ?: true + + val toCheck = if (fromJobs) + R.id.radio_job + else + R.id.radio_proposal + + jobs_type_radio_group.check(toCheck) + jobs_type_radio_group.setOnCheckedChangeListener { _, checkedId -> + if (checkedId == R.id.radio_job) { + loadJobs(JobsRepository.JobFilter( + uid = user.uid, + filteringJobs = true + )) + } else { + loadJobs(JobsRepository.JobFilter( + uid = user.uid, + filteringJobs = false + )) + } + } + + fabAdd.visibility = View.GONE + active_filters.visibility = View.GONE + jobs_type_radio_group.visibility = View.VISIBLE + + loadJobs(JobsRepository.JobFilter( + uid = user.uid, + filteringJobs = fromJobs + )) + } + override fun onLocationPicked(location: Location, distance: Int?) { Log.d(TAG, "location: $location") filterViewModel.setLocation(location) diff --git a/app/src/main/java/com/esp/localjobs/fragments/UserProfileFragment.kt b/app/src/main/java/com/esp/localjobs/fragments/UserProfileFragment.kt index b3fd2a5..264690e 100644 --- a/app/src/main/java/com/esp/localjobs/fragments/UserProfileFragment.kt +++ b/app/src/main/java/com/esp/localjobs/fragments/UserProfileFragment.kt @@ -13,6 +13,7 @@ import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.esp.localjobs.R +import com.esp.localjobs.data.models.User import com.esp.localjobs.data.repository.userFirebaseRepository import com.esp.localjobs.databinding.FragmentUserProfileBinding import com.esp.localjobs.viewModels.LoginViewModel @@ -60,21 +61,23 @@ class UserProfileFragment : Fragment(), CoroutineScope { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val userId = args.userID - if (userId == null) - setupCurrentUserProfile() - else - setupUserDetails(userId) + args.userID?.let { + setupUserDetails(it) + } ?: setupCurrentUserProfile() } private fun setupCurrentUserProfile() { - name.text = getString(R.string.not_logged_in) - logout.visibility = View.GONE - login.visibility = View.VISIBLE + val user = loginViewModel.getCurrentUser() + + if (user == null) { + name.text = getString(R.string.not_logged_in) + logout.visibility = View.GONE + login.visibility = View.VISIBLE + } else { + binding.user = user + setupUserJobsButton(user) - loginViewModel.getCurrentUser()?.let { - binding.user = it logout.visibility = View.VISIBLE login.visibility = View.GONE } @@ -93,7 +96,19 @@ class UserProfileFragment : Fragment(), CoroutineScope { if (!isActive) return@launch - binding.user = user + user?.let { + binding.user = it + setupUserJobsButton(it) + } + } + + private fun setupUserJobsButton(user: User) { + user_jobs.visibility = View.VISIBLE + user_jobs.setOnClickListener { + val action = + UserProfileFragmentDirections.actionDestinationUserProfileToDestinationJobs(user) + findNavController().navigate(action) + } } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { diff --git a/app/src/main/java/com/esp/localjobs/viewModels/FilterViewModel.kt b/app/src/main/java/com/esp/localjobs/viewModels/FilterViewModel.kt index c1cfc36..ec7b9ae 100644 --- a/app/src/main/java/com/esp/localjobs/viewModels/FilterViewModel.kt +++ b/app/src/main/java/com/esp/localjobs/viewModels/FilterViewModel.kt @@ -39,6 +39,9 @@ class FilterViewModel : ViewModel() { val query: String? get() = activeFilters.value?.query + val filteringJobs: Boolean? + get() = activeFilters.value?.filteringJobs + init { val context = LocalJobsApplication.applicationContext() val filter = retrieveLastUsedFilter(context) diff --git a/app/src/main/res/layout/fragment_jobs.xml b/app/src/main/res/layout/fragment_jobs.xml index 198b07e..f887bf4 100644 --- a/app/src/main/res/layout/fragment_jobs.xml +++ b/app/src/main/res/layout/fragment_jobs.xml @@ -20,6 +20,36 @@ android:layout_height="50dp" android:id="@+id/active_filters"/> + + + + + + + + + + @@ -57,5 +57,14 @@ android:visibility="gone" android:text="@string/login"/> + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 153ed5c..9aaf201 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -29,6 +29,11 @@ android:name="job" app:argType="com.esp.localjobs.data.models.Job"/> + + Interested people: Author: In the past + %1$s\'s stuff + Jobs and proposals