From cb72ddf1b03244c7653c5ffc16962124a034b8e2 Mon Sep 17 00:00:00 2001 From: Duc Le Tran Date: Mon, 17 Jun 2019 09:35:48 +0200 Subject: [PATCH] Summary: Improve UI Search Section Details: - Improve UI Search Section (Add toolbar, background image,...) Fixes: #1948 --- .../openevent/general/MainActivity.kt | 6 +- .../openevent/general/event/EventsFragment.kt | 6 +- .../general/favorite/FavoriteFragment.kt | 6 +- .../general/order/OrdersUnderUserFragment.kt | 6 +- .../general/search/SearchFilterFragment.kt | 58 +++--- .../general/search/SearchFragment.kt | 138 +++++++------ .../general/search/SearchLocationFragment.kt | 21 +- .../general/search/SearchResultsFragment.kt | 69 +++---- .../general/search/SearchTimeFragment.kt | 19 +- .../general/search/SearchTypeFragment.kt | 19 +- .../general/search/SearchViewModel.kt | 1 - .../drawable/background_fragment_search.xml | 48 +++++ .../main/res/drawable/ic_arrow_back_black.xml | 9 + .../main/res/drawable/ic_baseline_tick.xml | 2 +- app/src/main/res/drawable/ic_search_white.xml | 5 + .../main/res/layout-land/fragment_search.xml | 188 ++++++++++++++++++ app/src/main/res/layout/event_type_list.xml | 2 +- app/src/main/res/layout/fragment_search.xml | 122 ++++++++---- .../res/layout/fragment_search_filter.xml | 115 +++++++---- .../res/layout/fragment_search_location.xml | 46 ++--- .../res/layout/fragment_search_results.xml | 83 +++++--- .../main/res/layout/fragment_search_time.xml | 17 +- .../main/res/layout/fragment_search_type.xml | 17 +- app/src/main/res/menu/search_filter.xml | 9 - app/src/main/res/menu/search_results.xml | 9 - .../main/res/navigation/navigation_graph.xml | 32 +-- app/src/main/res/values/dimens.xml | 1 + app/src/main/res/values/strings.xml | 2 +- 28 files changed, 698 insertions(+), 358 deletions(-) create mode 100644 app/src/main/res/drawable/background_fragment_search.xml create mode 100644 app/src/main/res/drawable/ic_arrow_back_black.xml create mode 100644 app/src/main/res/drawable/ic_search_white.xml create mode 100644 app/src/main/res/layout-land/fragment_search.xml delete mode 100644 app/src/main/res/menu/search_filter.xml delete mode 100644 app/src/main/res/menu/search_results.xml diff --git a/app/src/main/java/org/fossasia/openevent/general/MainActivity.kt b/app/src/main/java/org/fossasia/openevent/general/MainActivity.kt index dea748ec63..44f2574c28 100644 --- a/app/src/main/java/org/fossasia/openevent/general/MainActivity.kt +++ b/app/src/main/java/org/fossasia/openevent/general/MainActivity.kt @@ -63,7 +63,7 @@ class MainActivity : AppCompatActivity() { val hostFragment = supportFragmentManager.findFragmentById(R.id.frameContainer) if (hostFragment is NavHostFragment) { val currentFragment = hostFragment.childFragmentManager.fragments.first() - if (currentFragment is ScrollToTop) currentFragment.scrollToTop() + if (currentFragment is BottomIconDoubleClick) currentFragment.doubleClick() } } } @@ -122,8 +122,8 @@ class MainActivity : AppCompatActivity() { } } -interface ScrollToTop { - fun scrollToTop() +interface BottomIconDoubleClick { + fun doubleClick() } interface ComplexBackPressFragment { diff --git a/app/src/main/java/org/fossasia/openevent/general/event/EventsFragment.kt b/app/src/main/java/org/fossasia/openevent/general/event/EventsFragment.kt index a7e046189a..b50e2d64bd 100644 --- a/app/src/main/java/org/fossasia/openevent/general/event/EventsFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/event/EventsFragment.kt @@ -24,7 +24,7 @@ import kotlinx.android.synthetic.main.fragment_events.view.scrollView import kotlinx.android.synthetic.main.fragment_events.view.notification import kotlinx.android.synthetic.main.fragment_events.view.swiperefresh import org.fossasia.openevent.general.R -import org.fossasia.openevent.general.ScrollToTop +import org.fossasia.openevent.general.BottomIconDoubleClick import org.fossasia.openevent.general.common.EventClickListener import org.fossasia.openevent.general.common.FavoriteFabClickListener import org.fossasia.openevent.general.data.Preference @@ -39,7 +39,7 @@ import org.jetbrains.anko.design.longSnackbar const val BEEN_TO_WELCOME_SCREEN = "beenToWelcomeScreen" -class EventsFragment : Fragment(), ScrollToTop { +class EventsFragment : Fragment(), BottomIconDoubleClick { private val eventsViewModel by viewModel() private lateinit var rootView: View private val preference = Preference() @@ -226,5 +226,5 @@ class EventsFragment : Fragment(), ScrollToTop { super.onStop() } - override fun scrollToTop() = rootView.scrollView.smoothScrollTo(0, 0) + override fun doubleClick() = rootView.scrollView.smoothScrollTo(0, 0) } diff --git a/app/src/main/java/org/fossasia/openevent/general/favorite/FavoriteFragment.kt b/app/src/main/java/org/fossasia/openevent/general/favorite/FavoriteFragment.kt index 88456d4bf4..38f3748837 100644 --- a/app/src/main/java/org/fossasia/openevent/general/favorite/FavoriteFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/favorite/FavoriteFragment.kt @@ -22,7 +22,7 @@ import kotlinx.android.synthetic.main.fragment_favorite.view.monthChip import kotlinx.android.synthetic.main.fragment_favorite.view.likesNumber import kotlinx.android.synthetic.main.fragment_favorite.view.scrollView import org.fossasia.openevent.general.R -import org.fossasia.openevent.general.ScrollToTop +import org.fossasia.openevent.general.BottomIconDoubleClick import org.fossasia.openevent.general.event.Event import org.fossasia.openevent.general.common.EventClickListener import org.fossasia.openevent.general.common.FavoriteFabClickListener @@ -37,7 +37,7 @@ import org.fossasia.openevent.general.utils.extensions.setStartPostponedEnterTra import org.jetbrains.anko.design.longSnackbar import org.jetbrains.anko.design.snackbar -class FavoriteFragment : Fragment(), ScrollToTop { +class FavoriteFragment : Fragment(), BottomIconDoubleClick { private val favoriteEventViewModel by viewModel() private lateinit var rootView: View private val favoriteEventsRecyclerAdapter = FavoriteEventsRecyclerAdapter() @@ -140,7 +140,7 @@ class FavoriteFragment : Fragment(), ScrollToTop { setToolbar(activity, show = false) } - override fun scrollToTop() = rootView.scrollView.smoothScrollTo(0, 0) + override fun doubleClick() = rootView.scrollView.smoothScrollTo(0, 0) private fun showEmptyMessage(itemCount: Int) { rootView.noLikedLL.isVisible = (itemCount == 0) diff --git a/app/src/main/java/org/fossasia/openevent/general/order/OrdersUnderUserFragment.kt b/app/src/main/java/org/fossasia/openevent/general/order/OrdersUnderUserFragment.kt index e03b54c5a5..11e2ee0563 100644 --- a/app/src/main/java/org/fossasia/openevent/general/order/OrdersUnderUserFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/order/OrdersUnderUserFragment.kt @@ -19,7 +19,7 @@ import kotlinx.android.synthetic.main.fragment_orders_under_user.view.scrollView import kotlinx.android.synthetic.main.fragment_orders_under_user.view.pastEvent import kotlinx.android.synthetic.main.fragment_orders_under_user.view.ticketsNumber import org.fossasia.openevent.general.R -import org.fossasia.openevent.general.ScrollToTop +import org.fossasia.openevent.general.BottomIconDoubleClick import org.fossasia.openevent.general.event.EventUtils import org.fossasia.openevent.general.utils.Utils import org.fossasia.openevent.general.utils.extensions.nonNull @@ -30,7 +30,7 @@ import org.jetbrains.anko.design.longSnackbar const val ORDERS_FRAGMENT = "ordersFragment" -class OrdersUnderUserFragment : Fragment(), ScrollToTop { +class OrdersUnderUserFragment : Fragment(), BottomIconDoubleClick { private lateinit var rootView: View private val ordersUnderUserVM by viewModel() @@ -128,7 +128,7 @@ class OrdersUnderUserFragment : Fragment(), ScrollToTop { .actionOrderUserToAuth(getString(R.string.log_in_first), ORDERS_FRAGMENT)) } - override fun scrollToTop() = rootView.scrollView.smoothScrollTo(0, 0) + override fun doubleClick() = rootView.scrollView.smoothScrollTo(0, 0) override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { 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 285bf53390..1ecc16e766 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 @@ -2,12 +2,10 @@ package org.fossasia.openevent.general.search import android.os.Bundle import android.view.LayoutInflater -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.RadioButton +import androidx.core.widget.NestedScrollView import androidx.fragment.app.Fragment import androidx.navigation.Navigation.findNavController import androidx.navigation.fragment.navArgs @@ -20,6 +18,10 @@ 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 kotlinx.android.synthetic.main.fragment_search_filter.view.toolbar +import kotlinx.android.synthetic.main.fragment_search_filter.view.toolbarLayout +import kotlinx.android.synthetic.main.fragment_search_filter.view.tick +import kotlinx.android.synthetic.main.fragment_search_filter.view.scrollView import org.fossasia.openevent.general.R import org.fossasia.openevent.general.utils.Utils.setToolbar import org.koin.androidx.viewmodel.ext.android.viewModel @@ -40,9 +42,8 @@ class SearchFilterFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View? { - setToolbar(activity) - setHasOptionsMenu(true) rootView = inflater.inflate(R.layout.fragment_search_filter, container, false) + setupToolbar() setFilterParams() setFilters() setSortByRadioGroup() @@ -67,31 +68,28 @@ class SearchFilterFragment : Fragment() { } } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.search_filter, menu) - super.onCreateOptionsMenu(menu, inflater) - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - android.R.id.home -> { - activity?.onBackPressed() - true - } - R.id.filter_set -> { - findNavController(rootView).navigate(SearchFilterFragmentDirections.actionSearchFilterToSearchResults( - date = selectedTime, - freeEvents = rootView.freeStuffCheckBox.isChecked, - location = selectedLocation, - type = selectedCategory, - query = safeArgs.query, - sort = sortBy, - sessionsAndSpeakers = rootView.sessionsAndSpeakerCheckBox.isChecked, - callForSpeakers = rootView.callForSpeakerCheckBox.isChecked - )) - true - } - else -> super.onOptionsItemSelected(item) + private fun setupToolbar() { + setToolbar(activity, show = false) + rootView.toolbar.setNavigationOnClickListener { + activity?.onBackPressed() + } + rootView.tick.setOnClickListener { + findNavController(rootView).navigate(SearchFilterFragmentDirections.actionSearchFilterToSearchResults( + date = selectedTime, + freeEvents = rootView.freeStuffCheckBox.isChecked, + location = selectedLocation, + type = selectedCategory, + query = safeArgs.query, + sort = sortBy, + sessionsAndSpeakers = rootView.sessionsAndSpeakerCheckBox.isChecked, + callForSpeakers = rootView.callForSpeakerCheckBox.isChecked + )) + } + rootView.scrollView.setOnScrollChangeListener { _: NestedScrollView?, _: Int, scrollY: Int, _: Int, _: Int -> + if (scrollY > 0) + rootView.toolbarLayout.elevation = resources.getDimension(R.dimen.custom_toolbar_elevation) + else + rootView.toolbarLayout.elevation = 0F } } 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 4eb6f186a6..15512850c2 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 @@ -1,38 +1,45 @@ package org.fossasia.openevent.general.search +import android.content.res.Configuration import android.os.Bundle +import android.view.KeyEvent import android.view.LayoutInflater -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem import android.view.View import android.view.ViewGroup -import androidx.appcompat.widget.SearchView +import android.view.inputmethod.EditorInfo +import androidx.core.view.isVisible import androidx.fragment.app.Fragment import kotlinx.android.synthetic.main.fragment_search.view.fabSearch import kotlinx.android.synthetic.main.fragment_search.view.locationTextView import kotlinx.android.synthetic.main.fragment_search.view.timeTextView import kotlinx.android.synthetic.main.fragment_search.view.eventTypeTextView +import kotlinx.android.synthetic.main.fragment_search.view.searchText +import kotlinx.android.synthetic.main.fragment_search.view.searchInfoContainer +import kotlinx.android.synthetic.main.fragment_search.view.toolbar +import kotlinx.android.synthetic.main.fragment_search.view.backgroundImage import org.fossasia.openevent.general.R import org.fossasia.openevent.general.utils.nullToEmpty import org.koin.androidx.viewmodel.ext.android.viewModel import androidx.navigation.Navigation.findNavController -import org.fossasia.openevent.general.MainActivity +import com.squareup.picasso.Picasso +import org.fossasia.openevent.general.BottomIconDoubleClick +import org.fossasia.openevent.general.ComplexBackPressFragment import org.fossasia.openevent.general.event.EventUtils.getFormattedDate import org.fossasia.openevent.general.event.EventUtils.getFormattedDateWithoutYear +import org.fossasia.openevent.general.utils.Utils.hideSoftKeyboard import org.threeten.bp.LocalDate import org.threeten.bp.ZoneId import org.threeten.bp.format.DateTimeFormatter import org.threeten.bp.format.DateTimeParseException import java.util.Calendar import org.fossasia.openevent.general.utils.Utils.setToolbar +import org.fossasia.openevent.general.utils.Utils.showSoftKeyboard const val SEARCH_FRAGMENT = "SearchFragment" -class SearchFragment : Fragment() { +class SearchFragment : Fragment(), ComplexBackPressFragment, BottomIconDoubleClick { private val searchViewModel by viewModel() private lateinit var rootView: View - private lateinit var searchView: SearchView override fun onCreateView( inflater: LayoutInflater, @@ -40,9 +47,7 @@ class SearchFragment : Fragment() { savedInstanceState: Bundle? ): View? { rootView = inflater.inflate(R.layout.fragment_search, container, false) - - setToolbar(activity, getString(R.string.search), false) - setHasOptionsMenu(true) + setToolbar() rootView.timeTextView.setOnClickListener { findNavController(rootView).navigate(SearchFragmentDirections.actionSearchToSearchTime( @@ -84,68 +89,89 @@ class SearchFragment : Fragment() { )) } + if (searchViewModel.isQuerying) + startQuerying() + else + stopQuerying() + return rootView } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - R.id.search_item -> { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + rootView.fabSearch.setOnClickListener { + makeSearch() + } + rootView.searchText.setOnClickListener { + if (!searchViewModel.isQuerying) + startQuerying() + } + rootView.searchText.setOnEditorActionListener { v, actionId, event -> + if (actionId == EditorInfo.IME_ACTION_SEARCH || + actionId == EditorInfo.IME_ACTION_DONE || + event.action == KeyEvent.ACTION_DOWN && + event.keyCode == KeyEvent.KEYCODE_ENTER) { + makeSearch() + true + } else { false } - - else -> super.onOptionsItemSelected(item) } } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.search, menu) - super.onCreateOptionsMenu(menu, inflater) + override fun handleBackPress() { + if (searchViewModel.isQuerying) + stopQuerying() + else + findNavController(rootView).popBackStack() } - override fun onPrepareOptionsMenu(menu: Menu) { - val searchItem = menu.findItem(R.id.search_item) - val thisActivity = activity - if (thisActivity is MainActivity) searchView = SearchView(thisActivity.supportActionBar?.themedContext) - searchView.maxWidth = Int.MAX_VALUE - searchItem.actionView = searchView - val queryListener = object : SearchView.OnQueryTextListener { - override fun onQueryTextSubmit(query: String): Boolean { - findNavController(rootView).navigate(SearchFragmentDirections.actionSearchToSearchResults( - query = query, - location = rootView.locationTextView.text.toString().nullToEmpty(), - date = (searchViewModel.savedTime ?: getString(R.string.anytime)).nullToEmpty(), - type = (searchViewModel.savedType ?: getString(R.string.anything)).nullToEmpty() - )) - return false - } + override fun doubleClick() { + startQuerying() + } - override fun onQueryTextChange(newText: String): Boolean { - return false - } - } - searchView.setOnQueryTextListener(queryListener) - rootView.fabSearch.setOnClickListener { - queryListener.onQueryTextSubmit(searchView.query.toString()) + private fun setToolbar() { + setToolbar(activity, show = false) + rootView.toolbar.setNavigationOnClickListener { + if (searchViewModel.isQuerying) + stopQuerying() + else + startQuerying() } + } - if (searchViewModel.isQuerying) { - searchItem.expandActionView() - searchView.setQuery(searchViewModel.searchViewQuery, false) - searchView.clearFocus() - } - super.onPrepareOptionsMenu(menu) + private fun makeSearch() { + searchViewModel.isQuerying = false + findNavController(rootView).navigate(SearchFragmentDirections.actionSearchToSearchResults( + query = rootView.searchText.text.toString(), + location = rootView.locationTextView.text.toString().nullToEmpty(), + date = (searchViewModel.savedTime ?: getString(R.string.anytime)).nullToEmpty(), + type = (searchViewModel.savedType ?: getString(R.string.anything)).nullToEmpty() + )) + rootView.searchText.setText("") } - override fun onDestroyView() { - super.onDestroyView() - searchViewModel.isQuerying = !searchView.isIconified - searchViewModel.searchViewQuery = searchView.query.toString() - searchView.isSaveEnabled = false + private fun startQuerying() { + searchViewModel.isQuerying = true + rootView.searchInfoContainer.isVisible = false + Picasso.get() + .load(R.color.colorPrimary) + .placeholder(R.color.colorPrimary) + .into(rootView.backgroundImage) + rootView.toolbar.navigationIcon = resources.getDrawable(R.drawable.ic_arrow_back_white_cct) + rootView.searchText.requestFocus() + showSoftKeyboard(context, rootView) } - override fun onDestroy() { - super.onDestroy() - if (this::searchView.isInitialized) - searchView.setOnQueryTextListener(null) + private fun stopQuerying() { + searchViewModel.isQuerying = false + rootView.searchInfoContainer.isVisible = true + val background = if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) + R.drawable.background_fragment else R.drawable.background_fragment_search + Picasso.get() + .load(background) + .placeholder(background) + .into(rootView.backgroundImage) + rootView.toolbar.navigationIcon = resources.getDrawable(R.drawable.ic_search_white) + hideSoftKeyboard(context, rootView) } } 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 b5c54817f9..e2c24da0ca 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 @@ -4,7 +4,6 @@ import android.Manifest import android.content.pm.PackageManager import android.os.Bundle import android.view.LayoutInflater -import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter @@ -26,6 +25,7 @@ import kotlinx.android.synthetic.main.fragment_search_location.view.eventLocatio import kotlinx.android.synthetic.main.fragment_search_location.view.locationProgressBar import kotlinx.android.synthetic.main.fragment_search_location.view.locationSearchView import kotlinx.android.synthetic.main.fragment_search_location.view.rvAutoPlaces +import kotlinx.android.synthetic.main.fragment_search_location.view.toolbar import kotlinx.android.synthetic.main.fragment_search_location.view.shimmerSearchEventTypes import org.fossasia.openevent.general.R import org.fossasia.openevent.general.utils.Utils @@ -47,8 +47,7 @@ class SearchLocationFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { rootView = inflater.inflate(R.layout.fragment_search_location, container, false) - setToolbar(activity, hasUpEnabled = true, show = true) - setHasOptionsMenu(true) + setToolbar(activity, show = false) searchLocationViewModel.loadEventsLocation() setupPopularLocations() @@ -77,6 +76,11 @@ class SearchLocationFragment : Fragment() { toggleSuggestionVisibility(it.isNotEmpty() && locationSearchView.query.isNotEmpty()) }) + rootView.toolbar.setNavigationOnClickListener { + Utils.hideSoftKeyboard(context, rootView) + activity?.onBackPressed() + } + return rootView } @@ -85,17 +89,6 @@ class SearchLocationFragment : Fragment() { Utils.showSoftKeyboard(context, rootView.locationSearchView) } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - android.R.id.home -> { - Utils.hideSoftKeyboard(context, rootView) - activity?.onBackPressed() - true - } - else -> super.onOptionsItemSelected(item) - } - } - private fun checkLocationPermission() { val permission = ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_COARSE_LOCATION) 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 8136e80e08..3b5397c8da 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 @@ -3,9 +3,6 @@ package org.fossasia.openevent.general.search import android.content.res.ColorStateList import android.os.Bundle import android.view.LayoutInflater -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.CompoundButton @@ -26,6 +23,10 @@ import kotlinx.android.synthetic.main.fragment_search_results.view.eventsRecycle import kotlinx.android.synthetic.main.fragment_search_results.view.noSearchResults import kotlinx.android.synthetic.main.fragment_search_results.view.searchRootLayout import kotlinx.android.synthetic.main.fragment_search_results.view.shimmerSearch +import kotlinx.android.synthetic.main.fragment_search_results.view.toolbar +import kotlinx.android.synthetic.main.fragment_search_results.view.toolbarLayout +import kotlinx.android.synthetic.main.fragment_search_results.view.filter +import kotlinx.android.synthetic.main.fragment_search_results.view.scrollView import org.fossasia.openevent.general.R import org.fossasia.openevent.general.common.EventClickListener import org.fossasia.openevent.general.common.FavoriteFabClickListener @@ -38,6 +39,7 @@ import org.jetbrains.anko.design.longSnackbar import org.koin.androidx.viewmodel.ext.android.viewModel import timber.log.Timber import androidx.appcompat.view.ContextThemeWrapper +import androidx.core.widget.NestedScrollView import androidx.navigation.fragment.FragmentNavigatorExtras import org.fossasia.openevent.general.utils.extensions.setPostponeSharedElementTransition import org.fossasia.openevent.general.utils.extensions.setStartPostponedEnterTransition @@ -71,7 +73,7 @@ class SearchResultsFragment : Fragment(), CompoundButton.OnCheckedChangeListener override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { rootView = inflater.inflate(R.layout.fragment_search_results, container, false) setPostponeSharedElementTransition() - + setupToolbar() setChips() rootView.eventsRecycler.layoutManager = LinearLayoutManager(context) @@ -167,6 +169,31 @@ class SearchResultsFragment : Fragment(), CompoundButton.OnCheckedChangeListener } } + private fun setupToolbar() { + setToolbar(activity, show = false) + rootView.toolbar.setNavigationOnClickListener { + activity?.onBackPressed() + } + rootView.filter.setOnClickListener { + findNavController(rootView) + .navigate(SearchResultsFragmentDirections.actionSearchResultsToSearchFilter( + date = safeArgs.date, + freeEvents = safeArgs.freeEvents, + location = safeArgs.location, + type = safeArgs.type, + query = safeArgs.query, + sort = safeArgs.sort, + sessionsAndSpeakers = safeArgs.sessionsAndSpeakers, + callForSpeakers = safeArgs.callForSpeakers)) + } + rootView.scrollView.setOnScrollChangeListener { _: NestedScrollView?, _: Int, scrollY: Int, _: Int, _: Int -> + if (scrollY > 0) + rootView.toolbarLayout.elevation = resources.getDimension(R.dimen.custom_toolbar_elevation) + else + rootView.toolbarLayout.elevation = 0F + } + } + private fun addChips(name: String, checked: Boolean) { val newContext = ContextThemeWrapper(context, R.style.CustomChipChoice) val chip = Chip(newContext) @@ -182,12 +209,6 @@ class SearchResultsFragment : Fragment(), CompoundButton.OnCheckedChangeListener rootView.chipGroup.addView(chip) } - override fun onResume() { - super.onResume() - setToolbar(activity, getString(R.string.search_results)) - setHasOptionsMenu(true) - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val eventClickListener: EventClickListener = object : EventClickListener { @@ -235,34 +256,6 @@ class SearchResultsFragment : Fragment(), CompoundButton.OnCheckedChangeListener rootView.chipGroupLayout.visibility = if (show) View.GONE else View.VISIBLE } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - android.R.id.home -> { - activity?.onBackPressed() - true - } - R.id.filter -> { - findNavController(rootView) - .navigate(SearchResultsFragmentDirections.actionSearchResultsToSearchFilter( - date = safeArgs.date, - freeEvents = safeArgs.freeEvents, - location = safeArgs.location, - type = safeArgs.type, - query = safeArgs.query, - sort = safeArgs.sort, - sessionsAndSpeakers = safeArgs.sessionsAndSpeakers, - callForSpeakers = safeArgs.callForSpeakers)) - true - } - else -> super.onOptionsItemSelected(item) - } - } - - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.search_results, menu) - super.onCreateOptionsMenu(menu, inflater) - } - override fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean) { days.forEach { if (it == buttonView?.text) { 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 82b9a0ae1f..7336bf4cbc 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 @@ -3,7 +3,6 @@ package org.fossasia.openevent.general.search import android.app.DatePickerDialog import android.os.Bundle import android.view.LayoutInflater -import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment @@ -14,6 +13,7 @@ import kotlinx.android.synthetic.main.fragment_search_time.view.todayTextView import kotlinx.android.synthetic.main.fragment_search_time.view.tomorrowTextView import kotlinx.android.synthetic.main.fragment_search_time.view.thisWeekendTextView import kotlinx.android.synthetic.main.fragment_search_time.view.nextMonthTextView +import kotlinx.android.synthetic.main.fragment_search_time.view.toolbar import kotlinx.android.synthetic.main.fragment_search_time.view.timeTextView import org.fossasia.openevent.general.R import org.fossasia.openevent.general.event.EventUtils.getSimpleFormattedDate @@ -36,8 +36,7 @@ class SearchTimeFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { rootView = inflater.inflate(R.layout.fragment_search_time, container, false) - setToolbar(activity) - setHasOptionsMenu(true) + setToolbar(activity, show = false) setCurrentChoice(safeArgs.time) val calendar = Calendar.getInstance() @@ -76,6 +75,10 @@ class SearchTimeFragment : Fragment() { calendar.get(Calendar.DAY_OF_MONTH)).show() } + rootView.toolbar.setNavigationOnClickListener { + activity?.onBackPressed() + } + return rootView } @@ -95,16 +98,6 @@ class SearchTimeFragment : Fragment() { findNavController(rootView).navigate(destFragId, navArgs) } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - android.R.id.home -> { - activity?.onBackPressed() - true - } - else -> super.onOptionsItemSelected(item) - } - } - private fun setCurrentChoice(value: String?) { when (value) { ANYTIME -> rootView.anytimeTextView.setCheckMarkDrawable(R.drawable.ic_checked) 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 33bdea151d..e787e3a19b 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 @@ -2,7 +2,6 @@ package org.fossasia.openevent.general.search import android.os.Bundle import android.view.LayoutInflater -import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.core.view.isVisible @@ -16,6 +15,7 @@ import kotlinx.android.synthetic.main.content_no_internet.view.noInternetCard import kotlinx.android.synthetic.main.fragment_search_type.view.eventTypesRecyclerView import kotlinx.android.synthetic.main.fragment_search_type.view.eventTypesTextTitle import kotlinx.android.synthetic.main.fragment_search_type.view.shimmerSearchEventTypes +import kotlinx.android.synthetic.main.fragment_search_type.view.toolbar import org.fossasia.openevent.general.R import org.fossasia.openevent.general.utils.Utils.setToolbar import org.fossasia.openevent.general.utils.extensions.nonNull @@ -35,8 +35,7 @@ class SearchTypeFragment : Fragment() { ): View? { // Inflate the layout for this fragment rootView = inflater.inflate(R.layout.fragment_search_type, container, false) - setToolbar(activity, "", hasUpEnabled = true) - setHasOptionsMenu(true) + setToolbar(activity, show = false) rootView.eventTypesRecyclerView.layoutManager = LinearLayoutManager(activity) rootView.eventTypesRecyclerView.adapter = typesAdapter searchTypeViewModel.loadEventTypes() @@ -85,17 +84,11 @@ class SearchTypeFragment : Fragment() { if (searchTypeViewModel.isConnected()) searchTypeViewModel.loadEventTypes() } - return rootView - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - android.R.id.home -> { - activity?.onBackPressed() - true - } - else -> super.onOptionsItemSelected(item) + rootView.toolbar.setNavigationOnClickListener { + activity?.onBackPressed() } + + return rootView } private fun redirectToSearch(type: 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 27805e7576..eefb2f73ee 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 @@ -53,7 +53,6 @@ class SearchViewModel( private val savedNextToNextMonth = getNextToNextMonth() private val mutableEventTypes = MutableLiveData>() val eventTypes: LiveData> = mutableEventTypes - var searchViewQuery: String = "" var isQuerying = false fun loadEventTypes() { diff --git a/app/src/main/res/drawable/background_fragment_search.xml b/app/src/main/res/drawable/background_fragment_search.xml new file mode 100644 index 0000000000..b2be0cf473 --- /dev/null +++ b/app/src/main/res/drawable/background_fragment_search.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_arrow_back_black.xml b/app/src/main/res/drawable/ic_arrow_back_black.xml new file mode 100644 index 0000000000..beafea3959 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_back_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_tick.xml b/app/src/main/res/drawable/ic_baseline_tick.xml index 88328aaba8..b08c85c869 100644 --- a/app/src/main/res/drawable/ic_baseline_tick.xml +++ b/app/src/main/res/drawable/ic_baseline_tick.xml @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_search_white.xml b/app/src/main/res/drawable/ic_search_white.xml new file mode 100644 index 0000000000..be5ad99c63 --- /dev/null +++ b/app/src/main/res/drawable/ic_search_white.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout-land/fragment_search.xml b/app/src/main/res/layout-land/fragment_search.xml new file mode 100644 index 0000000000..a5ad8e4cdf --- /dev/null +++ b/app/src/main/res/layout-land/fragment_search.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/event_type_list.xml b/app/src/main/res/layout/event_type_list.xml index 7d816c5c68..3e76f81c73 100644 --- a/app/src/main/res/layout/event_type_list.xml +++ b/app/src/main/res/layout/event_type_list.xml @@ -9,5 +9,5 @@ android:text="@string/anytime" android:background="?attr/selectableItemBackground" android:textColor="@color/black" - android:textSize="@dimen/text_size_large" + android:textSize="@dimen/text_size_expanded_title" xmlns:android="http://schemas.android.com/apk/res/android" /> diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index 92c135aed4..fcf82ebbf1 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -1,18 +1,60 @@ - + + android:layout_height="match_parent" + android:orientation="vertical"> - + + + + + + + android:background="@null" + android:hint="@string/search_hint" + android:inputType="text" + android:imeOptions="actionSearch" + android:paddingStart="@dimen/padding_large" + android:textColor="@color/white" + android:textColorHint="@color/white" + android:textSize="@dimen/text_size_extra_large" + android:textStyle="bold" + app:layout_constraintTop_toTopOf="parent"/> + + + android:textSize="@dimen/text_size_small" /> - - + android:textSize="@dimen/text_size_small" /> + - + android:textSize="@dimen/text_size_small" /> - - - + + + diff --git a/app/src/main/res/layout/fragment_search_filter.xml b/app/src/main/res/layout/fragment_search_filter.xml index e47f31bc8c..b2f0f09f88 100644 --- a/app/src/main/res/layout/fragment_search_filter.xml +++ b/app/src/main/res/layout/fragment_search_filter.xml @@ -1,17 +1,43 @@ - + xmlns:app="http://schemas.android.com/apk/res-auto" + tools:context="org.fossasia.openevent.general.search.SearchFilterFragment" + android:orientation="vertical"> + + + + + + + - + android:padding="@dimen/padding_large"> + android:textSize="@dimen/text_size_large" /> + + + android:textSize="@dimen/text_size_large" /> + + + android:textSize="@dimen/text_size_large" /> + + @@ -129,9 +171,6 @@ android:id="@+id/sessionsAndSpeakerCheckBox" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/layout_margin_large" - android:layoutDirection="rtl" - android:padding="@dimen/padding_medium" android:text="@string/sessions_and_speakers" android:textColor="@color/light_grey" android:textSize="@dimen/text_size_large" /> @@ -140,12 +179,15 @@ android:id="@+id/callForSpeakerCheckBox" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/layout_margin_large" - android:layoutDirection="rtl" - android:padding="@dimen/padding_medium" android:text="@string/call_for_speakers" android:textColor="@color/light_grey" android:textSize="@dimen/text_size_large" /> + + - + diff --git a/app/src/main/res/layout/fragment_search_location.xml b/app/src/main/res/layout/fragment_search_location.xml index b121c8164b..b8e3a2a279 100644 --- a/app/src/main/res/layout/fragment_search_location.xml +++ b/app/src/main/res/layout/fragment_search_location.xml @@ -7,37 +7,38 @@ android:background="@android:color/white" android:orientation="vertical"> + @@ -47,7 +48,6 @@ android:layout_width="@dimen/item_image_view_medium" android:layout_height="@dimen/item_image_view_medium" android:layout_marginTop="@dimen/layout_margin_medium" - android:layout_marginLeft="@dimen/layout_margin_medium" android:layout_marginStart="@dimen/layout_margin_medium" app:layout_constraintStart_toEndOf="@+id/currentLocation" app:layout_constraintTop_toBottomOf="@+id/locationSearchView" @@ -74,8 +74,8 @@ - + android:layout_height="wrap_content" + tools:visibility="gone"/> @@ -87,11 +87,11 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_margin_large" - android:layout_marginLeft="@dimen/layout_margin_large" - android:layout_marginTop="@dimen/layout_margin_extra_large" + android:layout_marginTop="@dimen/layout_margin_large" + android:layout_marginBottom="@dimen/layout_margin_medium" android:text="@string/popular_locations" - android:textColor="@android:color/black" - android:textSize="@dimen/heading_text_size" /> + android:textStyle="bold" + android:textSize="@dimen/text_size_expanded_title" /> + android:orientation="vertical" + tools:visibility="gone"> @@ -135,9 +136,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/layout_margin_large" - android:layout_marginLeft="@dimen/layout_margin_large" - android:layout_marginTop="@dimen/layout_margin_medium" android:layout_marginEnd="@dimen/layout_margin_large" - android:layout_marginRight="@dimen/layout_margin_large" android:layout_marginBottom="8dp" /> diff --git a/app/src/main/res/layout/fragment_search_results.xml b/app/src/main/res/layout/fragment_search_results.xml index 9567c50e54..c74d94079c 100644 --- a/app/src/main/res/layout/fragment_search_results.xml +++ b/app/src/main/res/layout/fragment_search_results.xml @@ -1,37 +1,39 @@ - - - - + android:elevation="0dp"> + - - - - + android:layout_gravity="end" + android:padding="@dimen/padding_large" + android:src="@drawable/ic_filter"/> + + @@ -41,15 +43,15 @@ android:orientation="vertical"> + android:id="@+id/chipGroupLayout" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="@dimen/padding_medium" + android:scrollbars="none"> @@ -76,7 +78,9 @@ - + - + + + + + + + + diff --git a/app/src/main/res/layout/fragment_search_time.xml b/app/src/main/res/layout/fragment_search_time.xml index 7cef105faa..2a7b7dc43d 100644 --- a/app/src/main/res/layout/fragment_search_time.xml +++ b/app/src/main/res/layout/fragment_search_time.xml @@ -3,19 +3,23 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" android:background="@android:color/white" - android:layout_marginTop="@dimen/layout_margin_large" - android:layout_marginLeft="@dimen/layout_margin_large" - android:layout_marginRight="@dimen/layout_margin_large" android:orientation="vertical" + style="@style/AppTheme.NoActionBar" tools:context="org.fossasia.openevent.general.search.SearchTimeFragment"> + + @@ -24,7 +28,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="none" - android:overScrollMode="never"> + android:overScrollMode="never" + android:padding="@dimen/padding_large"> + tools:context="org.fossasia.openevent.general.search.SearchTypeFragment" + style="@style/AppTheme.NoActionBar"> + @@ -16,8 +20,7 @@ android:id="@+id/eventTypesTextTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:layout_marginBottom="@dimen/layout_margin_extra_large" + android:layout_marginStart="@dimen/layout_margin_large" android:text="@string/what_type" android:textColor="@color/black" android:textSize="@dimen/text_size_extra_large" @@ -30,6 +33,7 @@ @@ -59,6 +63,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="@null" + android:layout_margin="@dimen/layout_margin_large" android:scrollbars="none"/> diff --git a/app/src/main/res/menu/search_filter.xml b/app/src/main/res/menu/search_filter.xml deleted file mode 100644 index e143c3ed53..0000000000 --- a/app/src/main/res/menu/search_filter.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - diff --git a/app/src/main/res/menu/search_results.xml b/app/src/main/res/menu/search_results.xml deleted file mode 100644 index 91fd77b5e4..0000000000 --- a/app/src/main/res/menu/search_results.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - diff --git a/app/src/main/res/navigation/navigation_graph.xml b/app/src/main/res/navigation/navigation_graph.xml index 19447c5268..77fab0b440 100644 --- a/app/src/main/res/navigation/navigation_graph.xml +++ b/app/src/main/res/navigation/navigation_graph.xml @@ -67,31 +67,31 @@ + app:popEnterAnim="@anim/fade_in" + app:popExitAnim="@anim/fade_out" + app:enterAnim="@anim/fade_in" + app:exitAnim="@anim/fade_out"/> + app:popEnterAnim="@anim/fade_in" + app:popExitAnim="@anim/fade_out" + app:enterAnim="@anim/fade_in" + app:exitAnim="@anim/fade_out"/> + app:popEnterAnim="@anim/fade_in" + app:popExitAnim="@anim/fade_out" + app:enterAnim="@anim/fade_in" + app:exitAnim="@anim/fade_out"/> + app:popEnterAnim="@anim/fade_in" + app:popExitAnim="@anim/fade_out" + app:enterAnim="@anim/fade_in" + app:exitAnim="@anim/fade_out"/> 25dp 30dp 20dp + 8dp 24dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fda612a24d..8a535ac08c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,7 +18,7 @@ Location Track What\'s good in - where? + Where? We\'re having difficulty connecting to the server. Check your connection or try again later. We\'re having difficulty fetching event. Try again later. Sorry, All tickets for this event have been sold out!