Skip to content

Commit b07cd45

Browse files
aggarwalpulkit596iamareebjamal
authored andcommitted
refactor: refactor to use data binding (#1690)
1 parent ff9ce2e commit b07cd45

File tree

5 files changed

+633
-603
lines changed

5 files changed

+633
-603
lines changed

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ def STRIPE_API_TOKEN = System.getenv('STRIPE_API_TOKEN') ?: "YOUR_API_KEY"
1212
def MAPBOX_KEY = System.getenv('MAPBOX_KEY') ?: "pk.eyJ1IjoiYW5nbWFzMSIsImEiOiJjanNqZDd0N2YxN2Q5NDNuNTBiaGt6eHZqIn0.BCrxjW6rP_OuOuGtbhVEQg"
1313

1414
android {
15+
dataBinding {
16+
enabled = true
17+
}
1518
compileSdkVersion 28
1619
defaultConfig {
1720
applicationId "com.eventyay.attendee"

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

Lines changed: 8 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -13,43 +13,32 @@ import android.view.MenuInflater
1313
import android.view.MenuItem
1414
import android.view.View
1515
import android.view.ViewGroup
16-
import android.widget.TextView
1716
import androidx.appcompat.app.AlertDialog
1817
import androidx.core.content.ContextCompat
1918
import androidx.core.view.isVisible
19+
import androidx.databinding.DataBindingUtil
2020
import androidx.fragment.app.Fragment
2121
import androidx.lifecycle.Observer
2222
import androidx.navigation.Navigation.findNavController
2323
import androidx.navigation.fragment.navArgs
2424
import androidx.recyclerview.widget.LinearLayoutManager
25-
import com.squareup.picasso.Callback
2625
import com.squareup.picasso.Picasso
27-
import kotlinx.android.synthetic.main.content_event.aboutEventContainer
28-
import kotlinx.android.synthetic.main.content_event.locationContainer
29-
import kotlinx.android.synthetic.main.content_event.organizerContainer
3026
import kotlinx.android.synthetic.main.content_event.similarEventsContainer
3127
import kotlinx.android.synthetic.main.content_event.view.eventDateDetailsFirst
3228
import kotlinx.android.synthetic.main.content_event.view.eventDateDetailsSecond
3329
import kotlinx.android.synthetic.main.content_event.view.eventDescription
3430
import kotlinx.android.synthetic.main.content_event.view.eventLocationLinearLayout
35-
import kotlinx.android.synthetic.main.content_event.view.eventLocationTextView
3631
import kotlinx.android.synthetic.main.content_event.view.eventName
3732
import kotlinx.android.synthetic.main.content_event.view.eventOrganiserDescription
38-
import kotlinx.android.synthetic.main.content_event.view.eventOrganiserName
3933
import kotlinx.android.synthetic.main.content_event.view.eventTimingLinearLayout
4034
import kotlinx.android.synthetic.main.content_event.view.imageMap
41-
import kotlinx.android.synthetic.main.content_event.view.locationUnderMap
4235
import kotlinx.android.synthetic.main.content_event.view.eventImage
4336
import kotlinx.android.synthetic.main.content_event.view.feedbackBtn
4437
import kotlinx.android.synthetic.main.content_event.view.feedbackRv
45-
import kotlinx.android.synthetic.main.content_event.view.organizerLogoIcon
4638
import kotlinx.android.synthetic.main.content_event.view.nestedContentEventScroll
4739
import kotlinx.android.synthetic.main.content_event.view.noFeedBackTv
48-
import kotlinx.android.synthetic.main.content_event.view.organizerName
49-
import kotlinx.android.synthetic.main.content_event.view.refundPolicy
5040
import kotlinx.android.synthetic.main.content_event.view.seeMore
5141
import kotlinx.android.synthetic.main.content_event.view.seeMoreOrganizer
52-
import kotlinx.android.synthetic.main.content_event.view.organizerContainer
5342
import kotlinx.android.synthetic.main.content_event.view.sessionContainer
5443
import kotlinx.android.synthetic.main.content_event.view.sessionsRv
5544
import kotlinx.android.synthetic.main.content_event.view.speakerRv
@@ -65,11 +54,11 @@ import kotlinx.android.synthetic.main.dialog_feedback.view.feedback
6554
import kotlinx.android.synthetic.main.dialog_feedback.view.feedbackTextInputLayout
6655
import kotlinx.android.synthetic.main.dialog_feedback.view.feedbackrating
6756
import kotlinx.android.synthetic.main.fragment_event.eventCoordinatorLayout
68-
import org.fossasia.openevent.general.CircleTransform
6957
import org.fossasia.openevent.general.R
7058
import org.fossasia.openevent.general.about.AboutEventFragmentArgs
7159
import org.fossasia.openevent.general.auth.LoginFragmentArgs
7260
import org.fossasia.openevent.general.common.SpeakerClickListener
61+
import org.fossasia.openevent.general.databinding.FragmentEventBinding
7362
import org.fossasia.openevent.general.event.EventUtils.loadMapUrl
7463
import org.fossasia.openevent.general.event.faq.EventFAQFragmentArgs
7564
import org.fossasia.openevent.general.event.feedback.FeedbackRecyclerAdapter
@@ -84,7 +73,6 @@ import org.fossasia.openevent.general.sponsor.SponsorsFragmentArgs
8473
import org.fossasia.openevent.general.ticket.TicketsFragmentArgs
8574
import org.fossasia.openevent.general.utils.Utils
8675
import org.fossasia.openevent.general.utils.Utils.getAnimSlide
87-
import org.fossasia.openevent.general.utils.Utils.requireDrawable
8876
import org.fossasia.openevent.general.utils.extensions.nonNull
8977
import org.fossasia.openevent.general.utils.nullToEmpty
9078
import org.fossasia.openevent.general.utils.stripHtml
@@ -94,7 +82,6 @@ import java.util.Currency
9482
import org.fossasia.openevent.general.utils.Utils.setToolbar
9583
import org.jetbrains.anko.design.longSnackbar
9684
import org.jetbrains.anko.design.snackbar
97-
import java.lang.Exception
9885

9986
const val EVENT_ID = "eventId"
10087
const val EVENT_TOPIC_ID = "eventTopicId"
@@ -109,6 +96,7 @@ class EventDetailsFragment : Fragment() {
10996
private val sessionsAdapter = SessionRecyclerAdapter()
11097

11198
private lateinit var rootView: View
99+
private lateinit var binding: FragmentEventBinding
112100
private var eventTopicId: Long? = null
113101
private var eventLocation: String? = null
114102
private lateinit var eventShare: Event
@@ -152,7 +140,8 @@ class EventDetailsFragment : Fragment() {
152140
container: ViewGroup?,
153141
savedInstanceState: Bundle?
154142
): View? {
155-
rootView = inflater.inflate(R.layout.fragment_event, container, false)
143+
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_event, container, false)
144+
rootView = binding.root
156145
setToolbar(activity)
157146
setHasOptionsMenu(true)
158147

@@ -280,23 +269,11 @@ class EventDetailsFragment : Fragment() {
280269
private fun loadEvent(event: Event) {
281270
val startsAt = EventUtils.getEventDateTime(event.startsAt, event.timezone)
282271
val endsAt = EventUtils.getEventDateTime(event.endsAt, event.timezone)
283-
284-
rootView.eventName.text = event.name
272+
binding.event = event
273+
binding.executePendingBindings()
285274

286275
// Organizer Section
287276
if (!event.organizerName.isNullOrEmpty()) {
288-
rootView.eventOrganiserName.text = "by " + event.organizerName.nullToEmpty()
289-
setTextField(rootView.eventOrganiserDescription, event.organizerDescription?.stripHtml()?.trim())
290-
rootView.organizerName.text = event.organizerName.nullToEmpty()
291-
rootView.eventOrganiserName.isVisible = true
292-
organizerContainer.isVisible = true
293-
294-
Picasso.get()
295-
.load(event.logoUrl)
296-
.placeholder(requireDrawable(requireContext(), R.drawable.ic_person_black))
297-
.transform(CircleTransform())
298-
.into(rootView.organizerLogoIcon)
299-
300277
val organizerDescriptionListener = View.OnClickListener {
301278
if (rootView.seeMoreOrganizer.text == getString(R.string.see_more)) {
302279
rootView.seeMoreOrganizer.text = getString(R.string.see_less)
@@ -316,10 +293,7 @@ class EventDetailsFragment : Fragment() {
316293
rootView.eventOrganiserDescription.setOnClickListener(organizerDescriptionListener)
317294
}
318295
}
319-
} else {
320-
rootView.organizerContainer.isVisible = false
321296
}
322-
323297
currency = Currency.getInstance(event.paymentCurrency ?: "USD").symbol
324298
// About event on-click
325299
val aboutEventOnClickListener = View.OnClickListener {
@@ -333,7 +307,6 @@ class EventDetailsFragment : Fragment() {
333307
// Event Description Section
334308
val description = event.description.nullToEmpty().stripHtml()
335309
if (!description.isNullOrEmpty()) {
336-
setTextField(rootView.eventDescription, description)
337310

338311
rootView.eventDescription.post {
339312
if (rootView.eventDescription.lineCount > LINE_COUNT) {
@@ -343,26 +316,13 @@ class EventDetailsFragment : Fragment() {
343316
rootView.seeMore.setOnClickListener(aboutEventOnClickListener)
344317
}
345318
}
346-
} else {
347-
aboutEventContainer.isVisible = false
348-
}
349-
350-
// Map Section
351-
if (!event.locationName.isNullOrEmpty()) {
352-
locationContainer.isVisible = true
353-
rootView.eventLocationTextView.text = event.locationName
354319
}
355320

356321
// load location to map
357322
val mapClickListener = View.OnClickListener { startMap(event) }
358323

359324
val locationNameIsEmpty = event.locationName.isNullOrEmpty()
360-
locationContainer.isVisible = !locationNameIsEmpty
361-
rootView.eventLocationLinearLayout.isVisible = !locationNameIsEmpty
362-
rootView.locationUnderMap.isVisible = !locationNameIsEmpty
363-
rootView.imageMap.isVisible = !locationNameIsEmpty
364325
if (!locationNameIsEmpty) {
365-
rootView.locationUnderMap.text = event.locationName
366326
rootView.imageMap.setOnClickListener(mapClickListener)
367327
rootView.eventLocationLinearLayout.setOnClickListener(mapClickListener)
368328

@@ -377,9 +337,6 @@ class EventDetailsFragment : Fragment() {
377337
rootView.eventDateDetailsFirst.text = EventUtils.getFormattedEventDateTimeRange(startsAt, endsAt)
378338
rootView.eventDateDetailsSecond.text = EventUtils.getFormattedEventDateTimeRangeSecond(startsAt, endsAt)
379339

380-
// Refund policy
381-
rootView.refundPolicy.text = event.refundPolicy
382-
383340
// Similar Events Section
384341
if (event.eventTopic != null || !event.locationName.isNullOrBlank() ||
385342
!event.searchableLocationName.isNullOrBlank()) {
@@ -390,22 +347,6 @@ class EventDetailsFragment : Fragment() {
390347
else event.searchableLocationName
391348
}
392349

393-
// Set Cover Image
394-
event.originalImageUrl?.let {
395-
Picasso.get()
396-
.load(it)
397-
.placeholder(R.drawable.header)
398-
.into(rootView.eventImage, object : Callback {
399-
override fun onSuccess() {
400-
rootView.eventImage.tag = "image_loading_successful"
401-
}
402-
403-
override fun onError(e: Exception?) {
404-
Timber.e(e)
405-
}
406-
})
407-
}
408-
409350
// Add event to Calendar
410351
val dateClickListener = View.OnClickListener { startCalendar(event) }
411352
rootView.eventTimingLinearLayout.setOnClickListener(dateClickListener)
@@ -450,13 +391,6 @@ class EventDetailsFragment : Fragment() {
450391
}
451392
}
452393

453-
private fun setTextField(textView: TextView, value: String?) {
454-
when (value.isNullOrBlank()) {
455-
true -> textView.isVisible = false
456-
false -> textView.text = value
457-
}
458-
}
459-
460394
private fun startCalendar(event: Event) {
461395
val intent = Intent(Intent.ACTION_INSERT)
462396
intent.type = "vnd.android.cursor.item/event"
@@ -559,6 +493,7 @@ class EventDetailsFragment : Fragment() {
559493
menuActionBar?.getItem(i)?.isVisible = !show
560494
}
561495
}
496+
562497
private fun checkForAuthentication() {
563498
if (eventViewModel.isLoggedIn())
564499
writeFeedback()
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.fossasia.openevent.general.utils
2+
3+
import android.view.View
4+
import android.widget.ImageView
5+
import android.widget.TextView
6+
import androidx.databinding.BindingAdapter
7+
import com.squareup.picasso.Callback
8+
import com.squareup.picasso.Picasso
9+
import org.fossasia.openevent.general.CircleTransform
10+
import org.fossasia.openevent.general.R
11+
import timber.log.Timber
12+
13+
/**
14+
* Toggle Visibility of the view depending upn the value is null or not.
15+
*/
16+
@BindingAdapter("hideIfEmpty")
17+
fun setHideIfEmpty(view: View, value: String?) {
18+
view.visibility = if (!value.isNullOrEmpty()) View.VISIBLE else View.GONE
19+
}
20+
21+
/**
22+
* Set Html Text by chaging the value using String Extensions in Utils.
23+
*/
24+
@BindingAdapter("strippedHtml")
25+
fun TextView.setStrippedHtml(value: String?) {
26+
this.text = value.nullToEmpty().stripHtml()?.trim()
27+
}
28+
29+
@BindingAdapter("avatarUrl")
30+
fun setAvatarUrl(imageView: ImageView, url: String?) {
31+
Picasso.get()
32+
.load(url)
33+
.placeholder(R.drawable.ic_person_black)
34+
.into(imageView, object : Callback {
35+
override fun onSuccess() {
36+
imageView.tag = "image_loading_success"
37+
}
38+
39+
override fun onError(e: Exception?) {
40+
Timber.e(e)
41+
}
42+
})
43+
}
44+
45+
@BindingAdapter("headerUrl")
46+
fun setOriginalImageUrl(imageView: ImageView, url: String?) {
47+
Picasso.get()
48+
.load(url)
49+
.placeholder(R.drawable.header)
50+
.transform(CircleTransform())
51+
.into(imageView)
52+
}

0 commit comments

Comments
 (0)