Skip to content

Commit cd3f591

Browse files
feat: Add Event FAQ's
1 parent d72aa61 commit cd3f591

File tree

10 files changed

+194
-10
lines changed

10 files changed

+194
-10
lines changed

app/src/main/java/org/fossasia/openevent/general/about/AboutEventFragment.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import androidx.core.view.isVisible
99
import androidx.fragment.app.Fragment
1010
import androidx.lifecycle.Observer
1111
import androidx.navigation.fragment.navArgs
12+
import androidx.recyclerview.widget.LinearLayoutManager
1213
import com.google.android.material.appbar.AppBarLayout
1314
import com.squareup.picasso.Picasso
1415
import kotlinx.android.synthetic.main.fragment_about_event.view.appBar
@@ -18,9 +19,12 @@ import kotlinx.android.synthetic.main.fragment_about_event.view.aboutEventDetail
1819
import kotlinx.android.synthetic.main.fragment_about_event.view.eventName
1920
import kotlinx.android.synthetic.main.fragment_about_event.view.detailsHeader
2021
import kotlinx.android.synthetic.main.fragment_about_event.view.aboutEventImage
22+
import kotlinx.android.synthetic.main.fragment_about_event.view.faqContainer
23+
import kotlinx.android.synthetic.main.fragment_about_event.view.faqRv
2124
import org.fossasia.openevent.general.R
2225
import org.fossasia.openevent.general.event.Event
2326
import org.fossasia.openevent.general.event.EventUtils
27+
import org.fossasia.openevent.general.event.faq.FAQRecyclerAdapter
2428
import org.fossasia.openevent.general.utils.extensions.nonNull
2529
import org.fossasia.openevent.general.utils.stripHtml
2630
import org.koin.androidx.viewmodel.ext.android.viewModel
@@ -31,11 +35,15 @@ class AboutEventFragment : Fragment() {
3135
private lateinit var rootView: View
3236
private val aboutEventViewModel by viewModel<AboutEventViewModel>()
3337
private lateinit var eventExtra: Event
38+
private val faqAdapter = FAQRecyclerAdapter()
3439
private val safeArgs: AboutEventFragmentArgs by navArgs()
3540

3641
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
3742
rootView = layoutInflater.inflate(R.layout.fragment_about_event, container, false)
3843

44+
rootView.faqRv.layoutManager = LinearLayoutManager(context)
45+
rootView.faqRv.adapter = faqAdapter
46+
3947
setToolbar(activity)
4048
setHasOptionsMenu(true)
4149

@@ -57,7 +65,13 @@ class AboutEventFragment : Fragment() {
5765
rootView.progressBarAbout.isVisible = it
5866
})
5967

68+
aboutEventViewModel.eventFAQ.observe(viewLifecycleOwner, Observer {
69+
faqAdapter.addAll(it)
70+
rootView.faqContainer.isVisible = !it.isEmpty()
71+
})
72+
6073
aboutEventViewModel.loadEvent(safeArgs.eventId)
74+
aboutEventViewModel.loadEventFaq(safeArgs.eventId)
6175

6276
return rootView
6377
}

app/src/main/java/org/fossasia/openevent/general/about/AboutEventViewModel.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import org.fossasia.openevent.general.common.SingleLiveEvent
1111
import org.fossasia.openevent.general.data.Resource
1212
import org.fossasia.openevent.general.event.Event
1313
import org.fossasia.openevent.general.event.EventService
14+
import org.fossasia.openevent.general.event.faq.EventFAQ
1415
import timber.log.Timber
1516

1617
class AboutEventViewModel(private val eventService: EventService, private val resource: Resource) : ViewModel() {
@@ -21,6 +22,8 @@ class AboutEventViewModel(private val eventService: EventService, private val re
2122
val progressAboutEvent: LiveData<Boolean> = mutableProgressAboutEvent
2223
private val mutableEvent = MutableLiveData<Event>()
2324
val event: LiveData<Event> = mutableEvent
25+
private val mutableEventFAQ = MutableLiveData<List<EventFAQ>>()
26+
val eventFAQ: LiveData<List<EventFAQ>> = mutableEventFAQ
2427
private val mutableError = SingleLiveEvent<String>()
2528
val error: LiveData<String> = mutableError
2629

@@ -45,6 +48,23 @@ class AboutEventViewModel(private val eventService: EventService, private val re
4548
)
4649
}
4750

51+
fun loadEventFaq(id: Long) {
52+
if (id.equals(-1)) {
53+
mutableError.value = Resource().getString(R.string.error_fetching_event_message)
54+
return
55+
}
56+
compositeDisposable.add(eventService.getEventFAQs(id)
57+
.subscribeOn(Schedulers.io())
58+
.observeOn(AndroidSchedulers.mainThread())
59+
.subscribe({ faqList ->
60+
mutableEventFAQ.value = faqList
61+
}, {
62+
mutableError.value = resource.getString(R.string.error_fetching_event_message)
63+
Timber.e(it, "Error fetching event %d", id)
64+
})
65+
)
66+
}
67+
4868
override fun onCleared() {
4969
super.onCleared()
5070
compositeDisposable.clear()

app/src/main/java/org/fossasia/openevent/general/di/Modules.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ import org.fossasia.openevent.general.event.EventsListAdapter
4242
import org.fossasia.openevent.general.event.EventsViewModel
4343
import org.fossasia.openevent.general.event.feedback.Feedback
4444
import org.fossasia.openevent.general.event.feedback.FeedbackApi
45+
import org.fossasia.openevent.general.event.faq.EventFAQ
46+
import org.fossasia.openevent.general.event.faq.EventFAQApi
4547
import org.fossasia.openevent.general.event.location.EventLocation
4648
import org.fossasia.openevent.general.event.location.EventLocationApi
4749
import org.fossasia.openevent.general.event.topic.EventTopic
@@ -147,11 +149,15 @@ val apiModule = module {
147149
val retrofit: Retrofit = get()
148150
retrofit.create(SpeakerApi::class.java)
149151
}
152+
single {
153+
val retrofit: Retrofit = get()
154+
retrofit.create(EventFAQApi::class.java)
155+
}
150156

151157
factory { AuthHolder(get()) }
152158
factory { AuthService(get(), get(), get()) }
153159

154-
factory { EventService(get(), get(), get(), get(), get(), get(), get()) }
160+
factory { EventService(get(), get(), get(), get(), get(), get(), get(),get()) }
155161
factory { SpeakerService(get(), get(), get()) }
156162
factory { TicketService(get(), get()) }
157163
factory { SocialLinksService(get(), get()) }
@@ -223,7 +229,7 @@ val networkModule = module {
223229
EventTopic::class.java, Attendee::class.java, TicketId::class.java, Order::class.java,
224230
AttendeeId::class.java, Charge::class.java, Paypal::class.java, ConfirmOrder::class.java,
225231
CustomForm::class.java, EventLocation::class.java, EventType::class.java,
226-
Feedback::class.java, Speaker::class.java))
232+
Feedback::class.java, Speaker::class.java,EventFAQ::class.java))
227233
.addConverterFactory(JacksonConverterFactory.create(objectMapper))
228234
.baseUrl(baseUrl)
229235
.build()

app/src/main/java/org/fossasia/openevent/general/event/EventService.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import io.reactivex.Flowable
55
import io.reactivex.Single
66
import org.fossasia.openevent.general.event.feedback.Feedback
77
import org.fossasia.openevent.general.event.feedback.FeedbackApi
8+
import org.fossasia.openevent.general.event.faq.EventFAQ
9+
import org.fossasia.openevent.general.event.faq.EventFAQApi
810
import org.fossasia.openevent.general.event.location.EventLocation
911
import org.fossasia.openevent.general.event.location.EventLocationApi
1012
import org.fossasia.openevent.general.event.topic.EventTopic
@@ -22,6 +24,7 @@ class EventService(
2224
private val eventTopicsDao: EventTopicsDao,
2325
private val eventTypesApi: EventTypesApi,
2426
private val eventLocationApi: EventLocationApi,
27+
private val eventFAQApi: EventFAQApi,
2528
private val eventFeedbackApi: FeedbackApi
2629
) {
2730

@@ -47,6 +50,10 @@ class EventService(
4750
return eventLocationApi.getEventLocation()
4851
}
4952

53+
fun getEventFAQs(id: Long): Single<List<EventFAQ>> {
54+
return eventFAQApi.getEventFAQ(id)
55+
}
56+
5057
private fun getEventTopicList(eventsList: List<Event>): List<EventTopic?> {
5158
return eventsList
5259
.filter { it.eventTopic != null }
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.fossasia.openevent.general.event.faq
2+
3+
import com.github.jasminb.jsonapi.LongIdHandler
4+
import com.github.jasminb.jsonapi.annotations.Id
5+
import com.github.jasminb.jsonapi.annotations.Type
6+
7+
@Type("faq")
8+
data class EventFAQ(
9+
@Id(LongIdHandler::class)
10+
val id: Long,
11+
val question: String,
12+
val answer: String
13+
)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.fossasia.openevent.general.event.faq
2+
3+
import io.reactivex.Single
4+
import retrofit2.http.GET
5+
import retrofit2.http.Path
6+
7+
interface EventFAQApi {
8+
9+
@GET("events/{id}/faqs?sort=question")
10+
fun getEventFAQ(@Path("id") id: Long): Single<List<EventFAQ>>
11+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.fossasia.openevent.general.event.faq
2+
3+
import android.view.LayoutInflater
4+
import android.view.ViewGroup
5+
import androidx.recyclerview.widget.RecyclerView
6+
import org.fossasia.openevent.general.R
7+
8+
class FAQRecyclerAdapter : RecyclerView.Adapter<FAQViewHolder>() {
9+
val faqList = ArrayList<EventFAQ>()
10+
11+
fun addAll(faqList: List<EventFAQ>) {
12+
if (faqList.isNotEmpty())
13+
this.faqList.clear()
14+
this.faqList.addAll(faqList)
15+
notifyDataSetChanged()
16+
}
17+
18+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FAQViewHolder {
19+
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_faq, parent, false)
20+
return FAQViewHolder(view)
21+
}
22+
23+
override fun onBindViewHolder(holder: FAQViewHolder, position: Int) {
24+
val faq = faqList[position]
25+
26+
holder.bind(faq)
27+
}
28+
29+
override fun getItemCount(): Int {
30+
return faqList.size
31+
}
32+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.fossasia.openevent.general.event.faq
2+
3+
import android.view.View
4+
import androidx.recyclerview.widget.RecyclerView
5+
import kotlinx.android.synthetic.main.item_faq.view.answerTv
6+
import kotlinx.android.synthetic.main.item_faq.view.questiontv
7+
8+
class FAQViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
9+
10+
fun bind(faq: EventFAQ) {
11+
itemView.questiontv.text = faq.question
12+
itemView.answerTv.text = faq.answer
13+
}
14+
}

app/src/main/res/layout/fragment_about_event.xml

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,63 @@
8686
android:layout_marginRight="@dimen/padding_medium"
8787
app:cardBackgroundColor="@android:color/white">
8888

89-
<TextView
90-
android:id="@+id/aboutEventContent"
89+
<LinearLayout
9190
android:layout_width="match_parent"
92-
android:layout_height="wrap_content"
93-
android:layout_marginTop="@dimen/layout_margin_medium"
94-
android:padding="@dimen/padding_medium"
95-
android:textColor="@color/black"
96-
android:textSize="@dimen/text_size_medium"
97-
tools:text="Lorem ipsum ipsum ipsum " />
91+
android:layout_height="match_parent"
92+
android:orientation="vertical">
93+
94+
<TextView
95+
android:id="@+id/aboutEventContent"
96+
android:layout_width="match_parent"
97+
android:layout_height="wrap_content"
98+
android:layout_marginTop="@dimen/layout_margin_medium"
99+
android:padding="@dimen/padding_medium"
100+
android:textColor="@color/black"
101+
android:textSize="@dimen/text_size_medium"
102+
tools:text="Lorem ipsum ipsum ipsum " />
103+
104+
<LinearLayout
105+
android:id="@+id/faqContainer"
106+
android:layout_width="match_parent"
107+
android:layout_height="wrap_content"
108+
android:orientation="vertical"
109+
android:layout_marginTop="@dimen/layout_margin_medium"
110+
tools:visibility="visible">
111+
112+
<View
113+
android:layout_width="match_parent"
114+
android:layout_height="@dimen/event_details_divider"
115+
android:layout_marginLeft="@dimen/layout_margin_medium"
116+
android:layout_marginRight="@dimen/layout_margin_medium"
117+
android:layout_marginBottom="@dimen/layout_margin_medium"
118+
android:background="@color/grey" />
119+
120+
<TextView
121+
android:layout_width="match_parent"
122+
android:layout_height="wrap_content"
123+
android:layout_marginLeft="@dimen/layout_margin_medium"
124+
android:layout_marginRight="@dimen/layout_margin_medium"
125+
android:layout_marginBottom="@dimen/layout_margin_large"
126+
android:text="Frequently Asked Questinos"
127+
android:textColor="@color/dark_grey"
128+
android:textSize="@dimen/event_details_headers" />
129+
130+
131+
<androidx.recyclerview.widget.RecyclerView
132+
android:id="@+id/faqRv"
133+
android:layout_width="wrap_content"
134+
android:layout_height="wrap_content"
135+
android:layout_marginLeft="@dimen/layout_margin_medium"
136+
android:layout_marginRight="@dimen/layout_margin_medium"
137+
android:layout_marginBottom="@dimen/layout_margin_large"
138+
android:orientation="vertical"
139+
tools:itemCount="3"
140+
tools:listitem="@layout/item_faq" />
141+
142+
</LinearLayout>
143+
144+
</LinearLayout>
145+
98146

99147
</androidx.cardview.widget.CardView>
100148
</androidx.core.widget.NestedScrollView>

app/src/main/res/layout/item_faq.xml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="wrap_content"
5+
android:orientation="vertical">
6+
7+
<TextView
8+
android:id="@+id/questiontv"
9+
android:layout_width="match_parent"
10+
android:layout_height="wrap_content"
11+
android:layout_margin="@dimen/layout_margin_medium" />
12+
13+
<TextView
14+
android:id="@+id/answerTv"
15+
android:layout_width="match_parent"
16+
android:layout_height="wrap_content"
17+
android:layout_margin="@dimen/layout_margin_medium" />
18+
19+
</LinearLayout>

0 commit comments

Comments
 (0)