diff --git a/app/src/main/java/org/fossasia/openevent/general/search/SearchFilterFragment.kt b/app/src/main/java/org/fossasia/openevent/general/search/SearchFilterFragment.kt index 09c66a4b79..82f90dc8ee 100644 --- a/app/src/main/java/org/fossasia/openevent/general/search/SearchFilterFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/search/SearchFilterFragment.kt @@ -1,6 +1,5 @@ package org.fossasia.openevent.general.search -import android.graphics.drawable.Drawable import android.os.Bundle import android.view.LayoutInflater import android.view.Menu @@ -9,7 +8,6 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.RadioButton -import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.navigation.Navigation import androidx.navigation.fragment.navArgs @@ -17,13 +15,23 @@ import kotlinx.android.synthetic.main.fragment_search_filter.view.dateRadioButto import kotlinx.android.synthetic.main.fragment_search_filter.view.freeStuffCheckBox import kotlinx.android.synthetic.main.fragment_search_filter.view.nameRadioButton import kotlinx.android.synthetic.main.fragment_search_filter.view.radioGroup +import kotlinx.android.synthetic.main.fragment_search_filter.view.tvSelectCategory +import kotlinx.android.synthetic.main.fragment_search_filter.view.tvSelectDate +import kotlinx.android.synthetic.main.fragment_search_filter.view.tvSelectLocation import org.fossasia.openevent.general.R import org.fossasia.openevent.general.utils.Utils.getAnimFade import org.fossasia.openevent.general.utils.Utils.setToolbar +import org.koin.androidx.viewmodel.ext.android.viewModel + +const val SEARCH_FILTER_FRAGMENT = "SearchFilterFragment" class SearchFilterFragment : Fragment() { private lateinit var rootView: View private var isFreeStuffChecked = false + private lateinit var selectedTime: String + private lateinit var selectedLocation: String + private lateinit var selectedCategory: String + private val searchViewModel by viewModel() private val safeArgs: SearchFilterFragmentArgs by navArgs() private lateinit var sortBy: String override fun onCreateView( @@ -34,8 +42,8 @@ class SearchFilterFragment : Fragment() { setToolbar(activity) setHasOptionsMenu(true) rootView = inflater.inflate(R.layout.fragment_search_filter, container, false) - setFilterToolbar() - setFreeStuffCheckBox() + setFilterParams() + setFilters() setSortByRadioGroup() return rootView } @@ -62,33 +70,22 @@ class SearchFilterFragment : Fragment() { super.onCreateOptionsMenu(menu, inflater) } - private fun setFilterToolbar() { - val close = resources.getDrawable(R.drawable.ic_close) - setBackIndicator(close) - } - - private fun setBackIndicator(indicator: Drawable? = null) { - (activity as? AppCompatActivity)?.supportActionBar?.setHomeAsUpIndicator(indicator) - } - override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { android.R.id.home -> { - setBackIndicator() activity?.onBackPressed() true } R.id.filter_set -> { - setBackIndicator() val navigator = Navigation.findNavController(rootView) navigator.popBackStack(R.id.searchResultsFragment, true) - SearchFilterFragmentArgs( - date = safeArgs.date, + SearchResultsFragmentArgs( + date = selectedTime, freeEvents = isFreeStuffChecked, - location = safeArgs.location, - sort = sortBy, - type = safeArgs.type, - query = safeArgs.query + location = selectedLocation, + type = selectedCategory, + query = safeArgs.query, + sort = sortBy ) .toBundle() .also { @@ -100,7 +97,60 @@ class SearchFilterFragment : Fragment() { } } - private fun setFreeStuffCheckBox() { + private fun setFilterParams() { + with(searchViewModel) { + loadSavedLocation() + selectedLocation = savedLocation ?: getString(R.string.anywhere) + loadSavedTime() + selectedTime = savedTime ?: getString(R.string.anytime) + loadSavedType() + selectedCategory = savedType ?: getString(R.string.anything) + } + } + private fun setFilters() { + + rootView.tvSelectDate.text = selectedTime + rootView.tvSelectDate.setOnClickListener { + SearchTimeFragmentArgs( + time = selectedTime, + fromFragmentName = SEARCH_FILTER_FRAGMENT, + query = safeArgs.query + ) + .toBundle() + .also { + Navigation.findNavController(rootView) + .navigate(R.id.searchTimeFragment, it, getAnimFade()) + } + } + + rootView.tvSelectLocation.text = selectedLocation + rootView.tvSelectLocation.setOnClickListener { + SearchTimeFragmentArgs( + time = selectedLocation, + fromFragmentName = SEARCH_FILTER_FRAGMENT, + query = safeArgs.query + ) + .toBundle() + .also { + Navigation.findNavController(rootView) + .navigate(R.id.searchLocationFragment, it, getAnimFade()) + } + } + + rootView.tvSelectCategory.text = selectedCategory + rootView.tvSelectCategory.setOnClickListener { + SearchTimeFragmentArgs( + time = selectedCategory, + fromFragmentName = SEARCH_FILTER_FRAGMENT, + query = safeArgs.query + ) + .toBundle() + .also { + Navigation.findNavController(rootView) + .navigate(R.id.searchTypeFragment, it, getAnimFade()) + } + } + rootView.freeStuffCheckBox.isChecked = safeArgs.freeEvents rootView.freeStuffCheckBox.setOnCheckedChangeListener { _, isChecked -> isFreeStuffChecked = isChecked diff --git a/app/src/main/java/org/fossasia/openevent/general/search/SearchFragment.kt b/app/src/main/java/org/fossasia/openevent/general/search/SearchFragment.kt index d40048dfe5..cf9980a552 100644 --- a/app/src/main/java/org/fossasia/openevent/general/search/SearchFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/search/SearchFragment.kt @@ -29,6 +29,8 @@ import org.threeten.bp.format.DateTimeParseException import java.util.Calendar import org.fossasia.openevent.general.utils.Utils.setToolbar +const val SEARCH_FRAGMENT = "SearchFragment" + class SearchFragment : Fragment() { private val searchViewModel by viewModel() private lateinit var rootView: View @@ -45,7 +47,8 @@ class SearchFragment : Fragment() { setHasOptionsMenu(true) rootView.timeTextView.setOnClickListener { - SearchTimeFragmentArgs(rootView.timeTextView.text.toString()) + SearchTimeFragmentArgs(rootView.timeTextView.text.toString(), + fromFragmentName = SEARCH_FRAGMENT) .toBundle() .also { bundle -> Navigation.findNavController(rootView).navigate(R.id.searchTimeFragment, bundle, getAnimSlide()) @@ -74,7 +77,7 @@ class SearchFragment : Fragment() { rootView.locationTextView.text = searchViewModel.savedLocation rootView.locationTextView.setOnClickListener { - SearchLocationFragmentArgs(fromSearchFragment = true) + SearchLocationFragmentArgs(fromFragmentName = SEARCH_FRAGMENT) .toBundle() .also { bundle -> Navigation.findNavController(rootView).navigate(R.id.searchLocationFragment, bundle, getAnimSlide()) @@ -82,7 +85,7 @@ class SearchFragment : Fragment() { } rootView.eventTypeTextView.setOnClickListener { - SearchLocationFragmentArgs(fromSearchFragment = true) + SearchLocationFragmentArgs(fromFragmentName = SEARCH_FRAGMENT) .toBundle() .also { bundle -> Navigation.findNavController(rootView).navigate(R.id.searchTypeFragment, bundle, getAnimSlide()) diff --git a/app/src/main/java/org/fossasia/openevent/general/search/SearchLocationFragment.kt b/app/src/main/java/org/fossasia/openevent/general/search/SearchLocationFragment.kt index df8d020692..bf8fb539aa 100644 --- a/app/src/main/java/org/fossasia/openevent/general/search/SearchLocationFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/search/SearchLocationFragment.kt @@ -106,7 +106,11 @@ class SearchLocationFragment : Fragment() { } private fun redirectToMain() { - val fragmentId = if (safeArgs.fromSearchFragment) R.id.searchFragment else R.id.eventsFragment + val fragmentId = when (safeArgs.fromFragmentName) { + SEARCH_FRAGMENT -> R.id.searchFragment + SEARCH_FILTER_FRAGMENT -> R.id.searchFilterFragment + else -> R.id.eventsFragment + } Navigation.findNavController(rootView).popBackStack(fragmentId, false) } diff --git a/app/src/main/java/org/fossasia/openevent/general/search/SearchResultsFragment.kt b/app/src/main/java/org/fossasia/openevent/general/search/SearchResultsFragment.kt index e058e72bbe..e51d2f552f 100644 --- a/app/src/main/java/org/fossasia/openevent/general/search/SearchResultsFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/search/SearchResultsFragment.kt @@ -274,6 +274,7 @@ class SearchResultsFragment : Fragment(), CompoundButton.OnCheckedChangeListener rootView.noSearchResults.isVisible = false favoriteEventsRecyclerAdapter.submitList(null) searchViewModel.clearEvents() + searchViewModel.clearTimeAndType() if (searchViewModel.isConnected()) performSearch() else showNoInternetError(true) setChips() diff --git a/app/src/main/java/org/fossasia/openevent/general/search/SearchTimeFragment.kt b/app/src/main/java/org/fossasia/openevent/general/search/SearchTimeFragment.kt index d29a485eea..91b1bcff75 100644 --- a/app/src/main/java/org/fossasia/openevent/general/search/SearchTimeFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/search/SearchTimeFragment.kt @@ -48,27 +48,27 @@ class SearchTimeFragment : Fragment() { calendar.set(Calendar.MONTH, monthOfYear) calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth) calendar.add(Calendar.DATE, 1) - redirectToSearch(getSimpleFormattedDate(calendar.time)) + redirectToCaller(getSimpleFormattedDate(calendar.time)) } rootView.anytimeTextView.setOnClickListener { - redirectToSearch(ANYTIME) + redirectToCaller(ANYTIME) } rootView.todayTextView.setOnClickListener { - redirectToSearch(TODAY) + redirectToCaller(TODAY) } rootView.tomorrowTextView.setOnClickListener { - redirectToSearch(TOMORROW) + redirectToCaller(TOMORROW) } rootView.thisWeekendTextView.setOnClickListener { - redirectToSearch(THIS_WEEKEND) + redirectToCaller(THIS_WEEKEND) } rootView.nextMonthTextView.setOnClickListener { - redirectToSearch(NEXT_MONTH) + redirectToCaller(NEXT_MONTH) } rootView.timeTextView.setOnClickListener { @@ -80,10 +80,22 @@ class SearchTimeFragment : Fragment() { return rootView } - private fun redirectToSearch(time: String) { + private fun redirectToCaller(time: String) { searchTimeViewModel.saveTime(time) - val navOptions = NavOptions.Builder().setPopUpTo(R.id.eventsFragment, false).build() - Navigation.findNavController(rootView).navigate(R.id.searchFragment, null, navOptions) + val (destFragId, popUpId) = if (safeArgs.fromFragmentName == SEARCH_FILTER_FRAGMENT) + R.id.searchFilterFragment to R.id.searchResultsFragment + else + R.id.searchFragment to R.id.eventsFragment + + val navOptions = NavOptions.Builder().setPopUpTo(popUpId, false).build() + + val navArgs = if (safeArgs.fromFragmentName == SEARCH_FILTER_FRAGMENT) { + SearchFilterFragmentArgs( + query = safeArgs.query + ).toBundle() + } else + null + Navigation.findNavController(rootView).navigate(destFragId, navArgs, navOptions) } override fun onOptionsItemSelected(item: MenuItem): Boolean { diff --git a/app/src/main/java/org/fossasia/openevent/general/search/SearchTypeFragment.kt b/app/src/main/java/org/fossasia/openevent/general/search/SearchTypeFragment.kt index 870a7b3b80..cec4a633bc 100644 --- a/app/src/main/java/org/fossasia/openevent/general/search/SearchTypeFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/search/SearchTypeFragment.kt @@ -101,8 +101,20 @@ class SearchTypeFragment : Fragment() { private fun redirectToSearch(type: String) { searchTypeViewModel.saveType(type) - val navOptions = NavOptions.Builder().setPopUpTo(R.id.eventsFragment, false).build() - Navigation.findNavController(rootView).navigate(R.id.searchFragment, null, navOptions) + val (destFragId, popUpId) = if (safeArgs.fromFragmentName == SEARCH_FILTER_FRAGMENT) + R.id.searchFilterFragment to R.id.searchResultsFragment + else + R.id.searchFragment to R.id.eventsFragment + + val navOptions = NavOptions.Builder().setPopUpTo(popUpId, false).build() + Navigation.findNavController(rootView).navigate(destFragId, null, navOptions) + val navArgs = if (safeArgs.fromFragmentName == SEARCH_FILTER_FRAGMENT) { + SearchFilterFragmentArgs( + query = safeArgs.query + ).toBundle() + } else + null + Navigation.findNavController(rootView).navigate(destFragId, navArgs, navOptions) } private fun setCurrentChoice(value: String?) { diff --git a/app/src/main/java/org/fossasia/openevent/general/search/SearchViewModel.kt b/app/src/main/java/org/fossasia/openevent/general/search/SearchViewModel.kt index 839bf69545..15f1bf2b8d 100644 --- a/app/src/main/java/org/fossasia/openevent/general/search/SearchViewModel.kt +++ b/app/src/main/java/org/fossasia/openevent/general/search/SearchViewModel.kt @@ -306,6 +306,13 @@ class SearchViewModel( mutableEvents.value = null } + fun clearTimeAndType() { + preference.apply { + putString(SAVED_TYPE, "Anything") + putString(SAVED_TIME, "Anytime") + } + } + override fun onCleared() { super.onCleared() compositeDisposable.clear() diff --git a/app/src/main/res/drawable/ic_close.xml b/app/src/main/res/drawable/ic_close.xml deleted file mode 100644 index 4881cf5be2..0000000000 --- a/app/src/main/res/drawable/ic_close.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_star_border.xml b/app/src/main/res/drawable/ic_star_border.xml new file mode 100644 index 0000000000..9adf648401 --- /dev/null +++ b/app/src/main/res/drawable/ic_star_border.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/main/res/drawable/ic_time.xml b/app/src/main/res/drawable/ic_time.xml new file mode 100644 index 0000000000..05bef95cd3 --- /dev/null +++ b/app/src/main/res/drawable/ic_time.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/main/res/layout/fragment_search_filter.xml b/app/src/main/res/layout/fragment_search_filter.xml index 55ddda8776..efcbdbafb9 100644 --- a/app/src/main/res/layout/fragment_search_filter.xml +++ b/app/src/main/res/layout/fragment_search_filter.xml @@ -4,9 +4,99 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/rootView" + android:padding="@dimen/padding_medium" android:orientation="vertical" tools:context="org.fossasia.openevent.general.search.SearchFilterFragment"> + + + + + + + + + + + + + + + + + + + + + - + android:name="fromFragmentName" + app:argType="string" + app:nullable="true" + android:defaultValue="@null"/> + + + + + name starts-at Sort By + Category