SUSI.AI has a feedback system where the user can post feedback for a skill using Android, iOS, and web clients. In skill details screen, the feedback posted by different users is displayed. This blog shows how the feedback from different users can be displayed in the skill details screen under feedback section.
Three of the items from the feedback list are displayed in the skill details screen. To see the entire list of feedback, the user can tap the ‘See All Reviews’ option at the bottom of the list.
The API endpoint that has been used to get skill feedback from the server is https://api.susi.ai/cms/getSkillFeedback.json
The following query params are attached to the above URL to get the specific feedback list :
- Model
- Group
- Language
- Skill Name
The list received is an array of `Feedback` objects, which hold three values :
- Feedback String (feedback) – Feedback string posted by a user
- Email (email) – Email address of the user who posted the feedback
- Time Stamp – Time of posting feedback
To display feedback, use the RecyclerView. There can be three possible cases:
- Case – 1: Size of the feedback list is greater than three
In this case, set the size of the list to three explicitly in the FeedbackAdapter so that only three view holders are inflated. Inflate the fourth view holder with “See All Reviews” text view and make it clickable if the size of the received feedback list is greater than three.
Also, when the user taps “See All Reviews”, launch an explicit intent to open the Feedback Activity. Set the AllReviewsAdapter for this activity. The size of the list will not be altered here because this activity must show all feedback. - Case – 2: Size of the feedback list is less than or equal to three
In this case simply display the feedback list in the SkillDetailsFragment and there is no need to launch any intent here. Also, “See All Reviews” will not be displayed here.Case – 3: Size of the feedback list is zero
In this case simply display a message that says no feedback has been submitted yet.Here is an example of how a “See All Reviews” screen looks like :
Implementation
First of all, define an XML layout for a feedback item and then create a data class for storing the query params.
data class FetchFeedbackQuery( val model: String, val group: String, val language: String, val skill: String )
Now, make the GET request using Retrofit from the model (M in MVP).
override fun fetchFeedback(query: FetchFeedbackQuery, listener: ISkillDetailsModel.OnFetchFeedbackFinishedListener) { fetchFeedbackResponseCall = ClientBuilder.fetchFeedbackCall(query) fetchFeedbackResponseCall.enqueue(object : Callback<GetSkillFeedbackResponse> { override fun onResponse(call: Call<GetSkillFeedbackResponse>, response: Response<GetSkillFeedbackResponse>) { listener.onFetchFeedbackModelSuccess(response) } override fun onFailure(call: Call<GetSkillFeedbackResponse>, t: Throwable) { Timber.e(t) listener.onFetchFeedbackError(t) } }) } override fun cancelFetchFeedback() { fetchFeedbackResponseCall.cancel() }
The feedback list received in the JSON response can now be used to display the user reviews with the help of custom adapters, keeping in mind the three cases already discussed above.
Resources
- Check out the GetSkillFeedbackService.java to know more about the API
https://github.com/fossasia/susi_server/blob/development/src/ai/susi/server/api/cms/GetSkillFeedbackService.java - Check out a blog on how Kotlin is a great language for JSON
https://medium.com/square-corner-blog/kotlins-a-great-language-for-json-fcd6ef99256b