Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add Location,Type, time filters #1680

Merged
merged 2 commits into from
Apr 30, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -9,21 +8,30 @@ 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
import kotlinx.android.synthetic.main.fragment_search_filter.view.dateRadioButton
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<SearchViewModel>()
private val safeArgs: SearchFilterFragmentArgs by navArgs()
private lateinit var sortBy: String
override fun onCreateView(
Expand All @@ -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
}
Expand All @@ -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 {
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<SearchViewModel>()
private lateinit var rootView: View
Expand All @@ -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())
Expand Down Expand Up @@ -74,15 +77,15 @@ 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())
}
}

rootView.eventTypeTextView.setOnClickListener {
SearchLocationFragmentArgs(fromSearchFragment = true)
SearchLocationFragmentArgs(fromFragmentName = SEARCH_FRAGMENT)
.toBundle()
.also { bundle ->
Navigation.findNavController(rootView).navigate(R.id.searchTypeFragment, bundle, getAnimSlide())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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?) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
4 changes: 0 additions & 4 deletions app/src/main/res/drawable/ic_close.xml

This file was deleted.

4 changes: 4 additions & 0 deletions app/src/main/res/drawable/ic_star_border.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:viewportHeight="24.0" android:viewportWidth="24.0" android:width="24dp">
<path android:fillColor="#545454" android:pathData="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z"/>
</vector>
4 changes: 4 additions & 0 deletions app/src/main/res/drawable/ic_time.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:viewportHeight="24.0" android:viewportWidth="24.0" android:width="24dp">
<path android:fillColor="#545454" android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM12.5,7H11v6l5.25,3.15 0.75,-1.23 -4.5,-2.67z"/>
</vector>
Loading