From 1a80e819c2fd40db0f0f021c7fbb7beeb016ec8d Mon Sep 17 00:00:00 2001 From: Aman Date: Fri, 3 May 2019 18:53:32 +0530 Subject: [PATCH] fix:updated favourites on event navigation & continuous topic api calls --- .../openevent/general/event/EventDao.kt | 10 ++- .../general/event/EventDetailsFragment.kt | 2 +- .../general/event/EventDetailsViewModel.kt | 30 ++++--- .../openevent/general/event/EventService.kt | 86 ++++++++----------- .../general/event/EventsViewModel.kt | 12 ++- .../general/order/OrdersUnderUserViewModel.kt | 3 + .../general/search/SearchViewModel.kt | 11 ++- 7 files changed, 87 insertions(+), 67 deletions(-) diff --git a/app/src/main/java/org/fossasia/openevent/general/event/EventDao.kt b/app/src/main/java/org/fossasia/openevent/general/event/EventDao.kt index 66c623483..c3f4977fd 100644 --- a/app/src/main/java/org/fossasia/openevent/general/event/EventDao.kt +++ b/app/src/main/java/org/fossasia/openevent/general/event/EventDao.kt @@ -6,6 +6,7 @@ import androidx.room.OnConflictStrategy.REPLACE import androidx.room.Query import io.reactivex.Flowable import io.reactivex.Single +import org.fossasia.openevent.general.event.topic.EventTopic @Dao interface EventDao { @@ -28,7 +29,7 @@ interface EventDao { fun getEventById(eventId: Long): Single @Query("SELECT * from Event WHERE id in (:ids)") - fun getEventWithIds(ids: List): Single> + fun getEventWithIds(ids: List): Flowable> @Query("UPDATE Event SET favorite = :favorite WHERE id = :eventId") fun setFavorite(eventId: Long, favorite: Boolean) @@ -39,6 +40,9 @@ interface EventDao { @Query("SELECT id from Event WHERE favorite = 1 AND id in (:ids)") fun getFavoriteEventWithinIds(ids: List): Single> - @Query("SELECT * from Event WHERE eventTopic = :topicId") - fun getAllSimilarEvents(topicId: Long): Flowable> + @Query("SELECT * from Event WHERE eventTopic = :eventTopic") + fun getAllSimilarEvents(eventTopic: EventTopic): Flowable> + + @Query("SELECT * FROM EventTopic WHERE id=:topicId") + fun getEventTopic(topicId: Long): Single } diff --git a/app/src/main/java/org/fossasia/openevent/general/event/EventDetailsFragment.kt b/app/src/main/java/org/fossasia/openevent/general/event/EventDetailsFragment.kt index ffc40d391..497e85bf9 100644 --- a/app/src/main/java/org/fossasia/openevent/general/event/EventDetailsFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/event/EventDetailsFragment.kt @@ -280,7 +280,7 @@ class EventDetailsFragment : Fragment() { rootView.similarEventsRecycler.adapter = similarEventsAdapter eventViewModel.similarEvents.observe(viewLifecycleOwner, Observer { similarEvents -> - similarEventsAdapter.submitList(similarEvents) + similarEventsAdapter.submitList(similarEvents.toList()) rootView.similarEventsContainer.visibility = if (similarEvents.isNotEmpty()) View.VISIBLE else View.GONE }) diff --git a/app/src/main/java/org/fossasia/openevent/general/event/EventDetailsViewModel.kt b/app/src/main/java/org/fossasia/openevent/general/event/EventDetailsViewModel.kt index 9ce8dbdc6..76c07805a 100644 --- a/app/src/main/java/org/fossasia/openevent/general/event/EventDetailsViewModel.kt +++ b/app/src/main/java/org/fossasia/openevent/general/event/EventDetailsViewModel.kt @@ -60,8 +60,8 @@ class EventDetailsViewModel( val eventSponsors: LiveData> = mutableEventSponsors private val mutableSocialLinks = MutableLiveData>() val socialLinks: LiveData> = mutableSocialLinks - private val mutableSimilarEvents = MutableLiveData>() - val similarEvents: LiveData> = mutableSimilarEvents + private val mutableSimilarEvents = MutableLiveData>() + val similarEvents: LiveData> = mutableSimilarEvents fun isLoggedIn() = authHolder.isLoggedIn() @@ -127,11 +127,16 @@ class EventDetailsViewModel( if (topicId != -1L) { compositeDisposable += eventService.getSimilarEvents(topicId) .withDefaultSchedulers() - .subscribe({ - val similarEventList = mutableListOf() - mutableSimilarEvents.value?.let { currentEvents -> similarEventList.addAll(currentEvents) } - val list = it.filter { it.id != eventId } + .distinctUntilChanged() + .subscribe({ events -> + val list = events.filter { it.id != eventId } + val oldList = mutableSimilarEvents.value + + val similarEventList = mutableSetOf() similarEventList.addAll(list) + oldList?.let { + similarEventList.addAll(it) + } mutableSimilarEvents.value = similarEventList }, { Timber.e(it, "Error fetching similar events") @@ -142,11 +147,15 @@ class EventDetailsViewModel( compositeDisposable += eventService.getEventsByLocation(location) .withDefaultSchedulers() - .subscribe({ - val similarEventList = mutableListOf() - mutableSimilarEvents.value?.let { currentEvents -> similarEventList.addAll(currentEvents) } - val list = it.filter { it.id != eventId } + .distinctUntilChanged() + .subscribe({ events -> + val list = events.filter { it.id != eventId } + val oldList = mutableSimilarEvents.value + val similarEventList = mutableSetOf() similarEventList.addAll(list) + oldList?.let { + similarEventList.addAll(it) + } mutableSimilarEvents.value = similarEventList }, { Timber.e(it, "Error fetching similar events") @@ -176,6 +185,7 @@ class EventDetailsViewModel( } compositeDisposable += eventService.getEvent(id) .withDefaultSchedulers() + .distinctUntilChanged() .doOnSubscribe { mutableProgress.value = true }.doFinally { diff --git a/app/src/main/java/org/fossasia/openevent/general/event/EventService.kt b/app/src/main/java/org/fossasia/openevent/general/event/EventService.kt index 44bd5c094..04a435b20 100644 --- a/app/src/main/java/org/fossasia/openevent/general/event/EventService.kt +++ b/app/src/main/java/org/fossasia/openevent/general/event/EventService.kt @@ -37,14 +37,14 @@ class EventService( eventsFlowable else eventApi.getEvents() - .map { - eventDao.insertEvents(it) - eventTopicsDao.insertEventTopics(getEventTopicList(it)) - } - .toFlowable() - .flatMap { - eventsFlowable - } + .map { + eventDao.insertEvents(it) + eventTopicsDao.insertEventTopics(getEventTopicList(it)) + } + .toFlowable() + .flatMap { + eventsFlowable + } } } @@ -58,9 +58,9 @@ class EventService( private fun getEventTopicList(eventsList: List): List { return eventsList - .filter { it.eventTopic != null } - .map { it.eventTopic } - .toList() + .filter { it.eventTopic != null } + .map { it.eventTopic } + .toList() } fun getEventTopics(): Flowable> { @@ -74,15 +74,14 @@ class EventService( fun getEventFeedback(id: Long): Single> { return eventFeedbackApi.getEventFeedback(id) } + fun submitFeedback(feedback: Feedback): Single { return eventFeedbackApi.postfeedback(feedback) } - fun getSearchEvents(eventName: String, sortBy: String): Single> { - return eventApi.searchEvents(sortBy, eventName).flatMap { apiList -> - val eventIds = apiList.map { it.id }.toList() - eventDao.getFavoriteEventWithinIds(eventIds).flatMap { favIds -> - updateFavorites(apiList, favIds) - } + + fun getSearchEvents(eventName: String, sortBy: String): Flowable> { + return eventApi.searchEvents(sortBy, eventName).flatMapPublisher { apiList -> + updateFavorites(apiList) } } @@ -90,23 +89,25 @@ class EventService( return eventDao.getFavoriteEvents() } - fun getEventsByLocation(locationName: String?): Single> { + fun getEventsByLocation(locationName: String?): Flowable> { val query = "[{\"name\":\"location-name\",\"op\":\"ilike\",\"val\":\"%$locationName%\"}," + "{\"name\":\"ends-at\",\"op\":\"ge\",\"val\":\"%${EventUtils.getTimeInISO8601(Date())}%\"}]" - return eventApi.searchEvents("name", query).flatMap { apiList -> - val eventIds = apiList.map { it.id }.toList() - eventTopicsDao.insertEventTopics(getEventTopicList(apiList)) - eventDao.getFavoriteEventWithinIds(eventIds).flatMap { favIds -> - updateFavorites(apiList, favIds) - } + return eventApi.searchEvents("name", query).flatMapPublisher { apiList -> + updateFavorites(apiList) } } - fun updateFavorites(apiEvents: List, favEventIds: List): Single> { - apiEvents.map { if (favEventIds.contains(it.id)) it.favorite = true } - eventDao.insertEvents(apiEvents) - val eventIds = apiEvents.map { it.id }.toList() - return eventDao.getEventWithIds(eventIds) + fun updateFavorites(apiList: List): Flowable> { + + val ids = apiList.map { it.id }.toList() + eventTopicsDao.insertEventTopics(getEventTopicList(apiList)) + return eventDao.getFavoriteEventWithinIds(ids) + .flatMapPublisher { favIds -> + apiList.map { if (favIds.contains(it.id)) it.favorite = true } + eventDao.insertEvents(apiList) + val eventIds = apiList.map { it.id }.toList() + eventDao.getEventWithIds(eventIds) + } } fun getEvent(id: Long): Flowable { @@ -123,15 +124,14 @@ class EventService( } } - fun getEventsUnderUser(eventIds: List): Single> { + fun getEventsUnderUser(eventIds: List): Flowable> { val query = buildQuery(eventIds) return eventApi.eventsUnderUser(query) - .map { + .flatMapPublisher { eventDao.insertEvents(it) - it - }.onErrorResumeNext { - eventDao.getEventWithIds(eventIds).map { it } + eventDao.getEventWithIds(eventIds) } + .onErrorResumeNext(eventDao.getEventWithIds(eventIds)) } fun setFavorite(eventId: Long, favorite: Boolean): Completable { @@ -141,20 +141,10 @@ class EventService( } fun getSimilarEvents(id: Long): Flowable> { - val eventsFlowable = eventDao.getAllSimilarEvents(id) - return eventsFlowable.switchMap { - if (it.isNotEmpty()) - eventsFlowable - else - eventTopicApi.getEventsUnderTopicId(id) - .toFlowable() - .map { - eventDao.insertEvents(it) - } - .flatMap { - eventsFlowable - } - } + return eventTopicApi.getEventsUnderTopicId(id) + .flatMapPublisher { + updateFavorites(it) + } } fun getSpeakerCall(id: Long): Single = diff --git a/app/src/main/java/org/fossasia/openevent/general/event/EventsViewModel.kt b/app/src/main/java/org/fossasia/openevent/general/event/EventsViewModel.kt index 0c178aab3..1989b6c44 100644 --- a/app/src/main/java/org/fossasia/openevent/general/event/EventsViewModel.kt +++ b/app/src/main/java/org/fossasia/openevent/general/event/EventsViewModel.kt @@ -44,16 +44,17 @@ class EventsViewModel( if (lastSearch != savedLocation.value) { compositeDisposable += eventService.getEventsByLocation(mutableSavedLocation.value) .withDefaultSchedulers() + .distinctUntilChanged() .doOnSubscribe { mutableShowShimmerEvents.value = true } .doFinally { - mutableProgress.value = false - mutableShowShimmerEvents.value = false - lastSearch = mutableSavedLocation.value ?: "" + stopLoaders() }.subscribe({ + stopLoaders() mutableEvents.value = it }, { + stopLoaders() Timber.e(it, "Error fetching events") mutableError.value = resource.getString(R.string.error_fetching_events_message) }) @@ -62,6 +63,11 @@ class EventsViewModel( } } + private fun stopLoaders() { + mutableProgress.value = false + mutableShowShimmerEvents.value = false + lastSearch = mutableSavedLocation.value ?: "" + } fun isConnected(): Boolean = mutableConnectionLiveData.value ?: false fun clearEvents() { diff --git a/app/src/main/java/org/fossasia/openevent/general/order/OrdersUnderUserViewModel.kt b/app/src/main/java/org/fossasia/openevent/general/order/OrdersUnderUserViewModel.kt index 363be8961..a646496a7 100644 --- a/app/src/main/java/org/fossasia/openevent/general/order/OrdersUnderUserViewModel.kt +++ b/app/src/main/java/org/fossasia/openevent/general/order/OrdersUnderUserViewModel.kt @@ -65,9 +65,11 @@ class OrdersUnderUserViewModel( private fun eventsUnderUser(eventIds: List, showExpired: Boolean) { compositeDisposable += eventService.getEventsUnderUser(eventIds) .withDefaultSchedulers() + .distinctUntilChanged() .doFinally { mutableShowShimmerResults.value = false }.subscribe({ + mutableShowShimmerResults.value = false val events = ArrayList() it.map { val times = eventIdAndTimes[it.id] @@ -93,6 +95,7 @@ class OrdersUnderUserViewModel( if (finalList.isEmpty()) mutableNoTickets.value = true mutableEventAndOrder.value = finalList }, { + mutableShowShimmerResults.value = false mutableMessage.value = resource.getString(R.string.list_events_fail_message) Timber.d(it, "Failed to list events under a user ") }) 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 36aba5fe6..c8f51d096 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 @@ -313,20 +313,27 @@ class SearchViewModel( } compositeDisposable += eventService.getSearchEvents(query, sortBy) .withDefaultSchedulers() + .distinctUntilChanged() .doOnSubscribe { mutableShowShimmerResults.value = true mutableChipClickable.value = false }.doFinally { - mutableShowShimmerResults.value = false - mutableChipClickable.value = true + stopLoaders() }.subscribe({ + stopLoaders() mutableEvents.value = it }, { + stopLoaders() Timber.e(it, "Error fetching events") mutableError.value = resource.getString(R.string.error_fetching_events_message) }) } + private fun stopLoaders() { + mutableShowShimmerResults.value = false + mutableChipClickable.value = true + } + fun setFavorite(eventId: Long, favorite: Boolean) { compositeDisposable += eventService.setFavorite(eventId, favorite) .withDefaultSchedulers()