From e8c69e0455ca30e25a0f3240af6972f10473adac Mon Sep 17 00:00:00 2001 From: Duc Le Tran Date: Mon, 13 May 2019 14:49:51 +0200 Subject: [PATCH] Summary: Updating feedback section after making new one Detail: - Add livedata object to observe new submitted feedback. - Extract string + fix small bugs Fixes: #1746 --- .../general/event/EventDetailsFragment.kt | 16 ++++++---- .../general/event/EventDetailsViewModel.kt | 29 ++++++++++++------- .../event/feedback/FeedbackRecyclerAdapter.kt | 7 ++++- app/src/main/res/values/strings.xml | 4 +++ 4 files changed, 40 insertions(+), 16 deletions(-) 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 ba004eeff6..a63743b95d 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 @@ -45,7 +45,6 @@ import kotlinx.android.synthetic.main.content_event.view.speakerRv import kotlinx.android.synthetic.main.content_event.view.speakersContainer import kotlinx.android.synthetic.main.content_event.view.sponsorsRecyclerView import kotlinx.android.synthetic.main.content_event.view.sponsorsSummaryContainer -import kotlinx.android.synthetic.main.content_event.view.feedbackContainer import kotlinx.android.synthetic.main.fragment_event.view.buttonTickets import kotlinx.android.synthetic.main.fragment_event.view.eventErrorCard import kotlinx.android.synthetic.main.fragment_event.view.container @@ -152,10 +151,11 @@ class EventDetailsFragment : Fragment() { loadTicketFragment() } - eventViewModel.error + eventViewModel.popMessage .nonNull() .observe(viewLifecycleOwner, Observer { - showEventErrorScreen(true) + rootView.snackbar(it) + showEventErrorScreen(it == getString(R.string.error_fetching_event_message)) }) eventViewModel.eventFeedback.observe(viewLifecycleOwner, Observer { @@ -167,9 +167,16 @@ class EventDetailsFragment : Fragment() { rootView.feedbackRv.isVisible = true rootView.noFeedBackTv.isVisible = false } - rootView.feedbackContainer.isVisible = it.isNotEmpty() }) + eventViewModel.submittedFeedback + .nonNull() + .observe(viewLifecycleOwner, Observer { + feedbackAdapter.add(it) + rootView.feedbackRv.isVisible = true + rootView.noFeedBackTv.isVisible = false + }) + rootView.feedbackBtn.setOnClickListener { checkForAuthentication() } @@ -517,7 +524,6 @@ class EventDetailsFragment : Fragment() { eventViewModel.submitFeedback(layout.feedback.text.toString(), layout.feedbackrating.rating, safeArgs.eventId) - rootView.snackbar(R.string.feedback_submitted) } .setNegativeButton(getString(R.string.cancel)) { dialog, _ -> dialog.cancel() 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 c9f05bb35f..d969e96b4b 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 @@ -38,12 +38,14 @@ class EventDetailsViewModel( val progress: LiveData = mutableProgress private val mutableUser = MutableLiveData() val user: LiveData = mutableUser - private val mutableError = SingleLiveEvent() - val error: LiveData = mutableError + private val mutablePopMessage = SingleLiveEvent() + val popMessage: LiveData = mutablePopMessage private val mutableEvent = MutableLiveData() val event: LiveData = mutableEvent private val mutableEventFeedback = MutableLiveData>() val eventFeedback: LiveData> = mutableEventFeedback + private val mutableSubmittedFeedback = MutableLiveData() + val submittedFeedback: LiveData = mutableSubmittedFeedback private val mutableEventSessions = MutableLiveData>() val eventSessions: LiveData> = mutableEventSessions private var eventSpeakers: LiveData> = MutableLiveData() @@ -59,6 +61,8 @@ class EventDetailsViewModel( mutableEventFeedback.value = it }, { Timber.e(it, "Error fetching events feedback") + mutablePopMessage.value = resource.getString(R.string.error_fetching_event_section_message, + resource.getString(R.string.feedback)) }) } @@ -68,9 +72,10 @@ class EventDetailsViewModel( compositeDisposable += eventService.submitFeedback(feedback) .withDefaultSchedulers() .subscribe({ - //Do Nothing + mutablePopMessage.value = resource.getString(R.string.feedback_submitted) + mutableSubmittedFeedback.value = it }, { - it.message.toString() == "HTTP 400 BAD REQUEST" + mutablePopMessage.value = resource.getString(R.string.error_submitting_feedback) }) } fun fetchEventSpeakers(id: Long) { @@ -80,7 +85,8 @@ class EventDetailsViewModel( //Do Nothing }, { Timber.e(it, "Error fetching speaker for event id %d", id) - mutableError.value = resource.getString(R.string.error_fetching_event_message) + mutablePopMessage.value = resource.getString(R.string.error_fetching_event_section_message, + resource.getString(R.string.speakers)) }) } @@ -96,15 +102,16 @@ class EventDetailsViewModel( //Do Nothing }, { Timber.e(it, "Error fetching sponsor for event id %d", id) - mutableError.value = resource.getString(R.string.error_fetching_event_message) + mutablePopMessage.value = resource.getString(R.string.error_fetching_event_section_message, + resource.getString(R.string.sponsors)) }) } fun loadEventSponsors(id: Long): LiveData> = sponsorService.fetchSponsorsFromDb(id) fun loadEvent(id: Long) { - if (id.equals(-1)) { - mutableError.value = resource.getString(R.string.error_fetching_event_message) + if (id == -1L) { + mutablePopMessage.value = resource.getString(R.string.error_fetching_event_message) return } compositeDisposable += eventService.getEvent(id) @@ -117,7 +124,7 @@ class EventDetailsViewModel( mutableEvent.value = it }, { Timber.e(it, "Error fetching event %d", id) - mutableError.value = resource.getString(R.string.error_fetching_event_message) + mutablePopMessage.value = resource.getString(R.string.error_fetching_event_message) }) } @@ -127,6 +134,8 @@ class EventDetailsViewModel( .subscribe({ mutableEventSessions.value = it }, { + mutablePopMessage.value = resource.getString(R.string.error_fetching_event_section_message, + resource.getString(R.string.sessions)) Timber.e(it, "Error fetching events sessions") }) } @@ -145,7 +154,7 @@ class EventDetailsViewModel( Timber.d("Success") }, { Timber.e(it, "Error") - mutableError.value = resource.getString(R.string.error) + mutablePopMessage.value = resource.getString(R.string.error) }) } diff --git a/app/src/main/java/org/fossasia/openevent/general/event/feedback/FeedbackRecyclerAdapter.kt b/app/src/main/java/org/fossasia/openevent/general/event/feedback/FeedbackRecyclerAdapter.kt index 510a376c22..771d53aa85 100644 --- a/app/src/main/java/org/fossasia/openevent/general/event/feedback/FeedbackRecyclerAdapter.kt +++ b/app/src/main/java/org/fossasia/openevent/general/event/feedback/FeedbackRecyclerAdapter.kt @@ -6,7 +6,7 @@ import androidx.recyclerview.widget.RecyclerView import org.fossasia.openevent.general.R class FeedbackRecyclerAdapter : RecyclerView.Adapter() { - val feedbackList = ArrayList() + private val feedbackList = ArrayList() fun addAll(feedbackList: List) { if (feedbackList.isNotEmpty()) @@ -15,6 +15,11 @@ class FeedbackRecyclerAdapter : RecyclerView.Adapter() { notifyDataSetChanged() } + fun add(feedback: Feedback) { + feedbackList.add(0, feedback) + notifyItemInserted(0) + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FeedbackViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_feedback, parent, false) return FeedbackViewHolder(view) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e7de46236d..bee11caf06 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -302,6 +302,9 @@ Please provide first name and last name! Error updating user! User updated successfully! + "Error fetching %1$s for the event + Fail on submitting the feedback + Feedback submitted Failure @@ -326,6 +329,7 @@ Free stuff only Speakers Sponsors + Sessions Some description about this sponsor: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. name starts-at