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