Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,9 @@ class AttendeeFragment : Fragment(), ComplexBackPressFragment {
ticketsRecyclerAdapter.setCurrency(attendeeViewModel.paymentCurrency)
safeArgs.ticketIdAndQty?.value?.let {
val quantities = it.map { pair -> pair.second }.filter { it != 0 }
val donations = it.filter { it.second != 0 }.map { pair -> pair.third }
ticketsRecyclerAdapter.setQuantity(quantities)
ticketsRecyclerAdapter.setDonations(donations)
attendeeRecyclerAdapter.setQuantity(quantities)
}
attendeeViewModel.forms.value?.let { attendeeRecyclerAdapter.setCustomForm(it) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,7 @@ class AttendeeViewModel(
private val mutableUser = MutableLiveData<User>()
val user: LiveData<User> = mutableUser
val orderCompleted = MutableLiveData<Boolean>()
val totalAmount = MutableLiveData<Float>(0F)
val paymentCompleted = MutableLiveData<Boolean>()
val totalAmount = MutableLiveData(0F)
private val mutableTickets = MutableLiveData<List<Ticket>>()
val tickets: LiveData<List<Ticket>> = mutableTickets
private val mutableForms = MutableLiveData<List<CustomForm>>()
Expand Down Expand Up @@ -89,7 +88,7 @@ class AttendeeViewModel(

// Retained information
var countryPosition: Int = -1
var ticketIdAndQty: List<Pair<Int, Int>>? = null
var ticketIdAndQty: List<Triple<Int, Int, Float>>? = null
var selectedPaymentOption: Int = -1
var singleTicket = false
var monthSelectedPosition: Int = 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class TicketDetailsRecyclerAdapter : RecyclerView.Adapter<TicketDetailsViewHolde
private val tickets = ArrayList<Ticket>()
private var eventCurrency: String? = null
private var qty = ArrayList<Int>()
private var donationsList = ArrayList<Float>()

fun addAll(ticketList: List<Ticket>) {
if (tickets.isNotEmpty())
Expand All @@ -22,6 +23,12 @@ class TicketDetailsRecyclerAdapter : RecyclerView.Adapter<TicketDetailsViewHolde
eventCurrency = currencyCode
}

fun setDonations(donations: List<Float>) {
if (donationsList.isNotEmpty()) donationsList.clear()
donationsList.addAll(donations)
notifyDataSetChanged()
}

fun setQuantity(ticketQuantities: List<Int>) {
if (qty.isNotEmpty())qty.clear()
qty.addAll(ticketQuantities)
Expand All @@ -34,7 +41,7 @@ class TicketDetailsRecyclerAdapter : RecyclerView.Adapter<TicketDetailsViewHolde
}

override fun onBindViewHolder(holder: TicketDetailsViewHolder, position: Int) {
holder.bind(tickets[position], qty[position], eventCurrency)
holder.bind(tickets[position], qty[position], donationsList[position], eventCurrency)
}

override fun getItemCount(): Int {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,36 @@ package org.fossasia.openevent.general.ticket

import androidx.recyclerview.widget.RecyclerView
import android.view.View
import kotlinx.android.synthetic.main.item_ticket_details.view.*
import kotlinx.android.synthetic.main.item_ticket_details.view.ticketName
import kotlinx.android.synthetic.main.item_ticket_details.view.price
import kotlinx.android.synthetic.main.item_ticket_details.view.qty
import kotlinx.android.synthetic.main.item_ticket_details.view.subTotal
import org.fossasia.openevent.general.R
import org.fossasia.openevent.general.data.Resource

class TicketDetailsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(ticket: Ticket, ticketQuantity: Int, eventCurrency: String?) {
itemView.ticketName.text = ticket.name

if (ticket.price != null) {
itemView.price.visibility = View.VISIBLE
itemView.price.text = "$${ticket.price}"
}
private val resource = Resource()

if (ticket.price != null) {
itemView.price.text = "$eventCurrency${ticket.price}"
}
fun bind(ticket: Ticket, ticketQuantity: Int, donationAmount: Float, eventCurrency: String?) {
itemView.ticketName.text = ticket.name

if (ticket.price == 0.toFloat()) {
itemView.price.text = "Free"
when (ticket.type) {
TICKET_TYPE_DONATION -> {
itemView.price.text = resource.getString(R.string.donation)
itemView.subTotal.text = "$eventCurrency$donationAmount"
}
TICKET_TYPE_FREE -> {
itemView.price.text = resource.getString(R.string.free)
}
TICKET_TYPE_PAID -> {
if (ticket.price != null) {
itemView.price.text = "$eventCurrency${ticket.price}"
}
val subTotal: Float? = ticket.price?.times(ticketQuantity)
itemView.subTotal.text = "$eventCurrency$subTotal"
}
}

val subTotal: Float? = ticket.price?.times(ticketQuantity)
itemView.qty.text = ticketQuantity.toString()
itemView.subTotal.text = "$$subTotal"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ import java.io.Serializable
*
* @param value The list of ids and quantities
*/
data class TicketIdAndQtyWrapper(val value: List<Pair<Int, Int>>) : Serializable
data class TicketIdAndQtyWrapper(val value: List<Triple<Int, Int, Float>>) : Serializable
Original file line number Diff line number Diff line change
@@ -1,20 +1,31 @@
package org.fossasia.openevent.general.ticket

import android.graphics.Paint
import android.text.Editable
import android.text.TextWatcher
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.item_ticket.view.order
import kotlinx.android.synthetic.main.item_ticket.view.orderRange
import kotlinx.android.synthetic.main.item_ticket.view.price
import kotlinx.android.synthetic.main.item_ticket.view.ticketName
import kotlinx.android.synthetic.main.item_ticket.view.discountPrice
import kotlinx.android.synthetic.main.item_ticket.view.donationInput
import kotlinx.android.synthetic.main.item_ticket.view.orderQtySection
import org.fossasia.openevent.general.R
import org.fossasia.openevent.general.data.Resource
import org.fossasia.openevent.general.discount.DiscountCode

const val AMOUNT = "amount"
const val TICKET_TYPE_FREE = "free"
const val TICKET_TYPE_PAID = "paid"
const val TICKET_TYPE_DONATION = "donation"

class TicketViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val resource = Resource()

fun bind(
ticket: Ticket,
Expand All @@ -38,11 +49,71 @@ class TicketViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
itemView.price.paintFlags = 0
}

itemView.order.setOnClickListener {
itemView.orderRange.performClick()
}

when (ticket.type) {
TICKET_TYPE_DONATION -> {
itemView.price.text = resource.getString(R.string.enter_donation)
itemView.orderQtySection.isVisible = false
itemView.donationInput.isVisible = true
setupDonationTicketPicker(selectedListener, ticket)
}
TICKET_TYPE_FREE -> {
itemView.price.text = resource.getString(R.string.free)
itemView.orderQtySection.isVisible = true
itemView.donationInput.isVisible = false
setupQtyPicker(minQty, maxQty, selectedListener, ticket, ticketQuantity)
}
TICKET_TYPE_PAID -> {
itemView.price.text = "$eventCurrency${ticket.price}"
itemView.orderQtySection.isVisible = true
itemView.donationInput.isVisible = false
setupQtyPicker(minQty, maxQty, selectedListener, ticket, ticketQuantity)
}
}

if (discountCode?.value != null && ticket.price != null && ticket.price != 0.toFloat()) {
itemView.discountPrice.visibility = View.VISIBLE
itemView.price.paintFlags = Paint.STRIKE_THRU_TEXT_FLAG
itemView.discountPrice.text =
if (discountCode.type == AMOUNT) "$eventCurrency${ticket.price - discountCode.value}"
else "$eventCurrency${ticket.price - (ticket.price * discountCode.value / 100)}"
}
}

private fun setupDonationTicketPicker(
selectedListener: TicketSelectedListener?,
ticket: Ticket
) {
itemView.donationInput.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { /*Do Nothing*/ }
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { /*Do Nothing*/ }
override fun afterTextChanged(s: Editable?) {
val donationEntered = s.toString()
if (donationEntered.isNotBlank()) {
val donation = donationEntered.toFloat()
if (donation > 0F) {
selectedListener?.onDonationSelected(ticket.id, donation)
}
}
}
})
}

private fun setupQtyPicker(
minQty: Int,
maxQty: Int,
selectedListener: TicketSelectedListener?,
ticket: Ticket,
ticketQuantity: Int
) {
if (minQty > 0 && maxQty > 0) {
val spinnerList = ArrayList<String>()
spinnerList.add("0")
for (i in minQty..maxQty) {
spinnerList.add(Integer.toString(i))
spinnerList.add(i.toString())
}
itemView.orderRange.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View, pos: Int, id: Long) {
Expand All @@ -61,25 +132,5 @@ class TicketViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
itemView.order.text = ticketQuantity.toString()
}
}

itemView.order.setOnClickListener {
itemView.orderRange.performClick()
}

if (ticket.price != null) {
itemView.price.text = "$eventCurrency${ticket.price}"
}

if (ticket.price == 0.toFloat()) {
itemView.price.text = "Free"
}

if (discountCode?.value != null && ticket.price != null && ticket.price != 0.toFloat()) {
itemView.discountPrice.visibility = View.VISIBLE
itemView.price.paintFlags = Paint.STRIKE_THRU_TEXT_FLAG
itemView.discountPrice.text =
if (discountCode.type == AMOUNT) "$eventCurrency${ticket.price - discountCode.value}"
else "$eventCurrency${ticket.price - (ticket.price * discountCode.value / 100)}"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class TicketsFragment : Fragment() {
private val safeArgs: TicketsFragmentArgs by navArgs()
private lateinit var rootView: View
private lateinit var linearLayoutManager: LinearLayoutManager
private var ticketIdAndQty = ArrayList<Pair<Int, Int>>()
private var ticketIdAndQty = ArrayList<Triple<Int, Int, Float>>()
private var totalAmount: Float = 0.0f

override fun onCreate(savedInstanceState: Bundle?) {
Expand Down Expand Up @@ -189,6 +189,13 @@ class TicketsFragment : Fragment() {
super.onViewCreated(view, savedInstanceState)

val ticketSelectedListener = object : TicketSelectedListener {
override fun onDonationSelected(ticketId: Int, donation: Float) {
if (donation > 0F) {
handleTicketDonationEntered(ticketId, donation)
ticketsViewModel.ticketIdAndQty.value = ticketIdAndQty
}
}

override fun onSelected(ticketId: Int, quantity: Int) {
handleTicketSelect(ticketId, quantity)
ticketsViewModel.ticketIdAndQty.value = ticketIdAndQty
Expand Down Expand Up @@ -243,9 +250,18 @@ class TicketsFragment : Fragment() {
private fun handleTicketSelect(id: Int, quantity: Int) {
val pos = ticketIdAndQty.map { it.first }.indexOf(id)
if (pos == -1) {
ticketIdAndQty.add(Pair(id, quantity))
ticketIdAndQty.add(Triple(id, quantity, 0F))
} else {
ticketIdAndQty[pos] = Triple(id, quantity, 0F)
}
}

private fun handleTicketDonationEntered(id: Int, donation: Float) {
val pos = ticketIdAndQty.map { it.first }.indexOf(id)
if (pos == -1) {
ticketIdAndQty.add(Triple(id, 1, donation))
} else {
ticketIdAndQty[pos] = Pair(id, quantity)
ticketIdAndQty[pos] = Triple(id, 1, donation)
}
}

Expand Down Expand Up @@ -287,7 +303,7 @@ class TicketsFragment : Fragment() {
ticketsViewModel.loadTickets(safeArgs.eventId)
}

val retainedTicketIdAndQty: List<Pair<Int, Int>>? = ticketsViewModel.ticketIdAndQty.value
val retainedTicketIdAndQty: List<Triple<Int, Int, Float>>? = ticketsViewModel.ticketIdAndQty.value
if (retainedTicketIdAndQty != null) {
for (idAndQty in retainedTicketIdAndQty) {
handleTicketSelect(idAndQty.first, idAndQty.second)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class TicketsRecyclerAdapter : RecyclerView.Adapter<TicketViewHolder>() {
private var eventCurrency: String? = null
private var discountCode: DiscountCode? = null
private var selectedListener: TicketSelectedListener? = null
private lateinit var ticketAndQuantity: List<Pair<Int, Int>>
private lateinit var ticketAndQuantity: List<Triple<Int, Int, Float>>

fun addAll(ticketList: List<Ticket>) {
if (tickets.isNotEmpty())
Expand Down Expand Up @@ -56,11 +56,12 @@ class TicketsRecyclerAdapter : RecyclerView.Adapter<TicketViewHolder>() {
return tickets.size
}

fun setTicketAndQty(ticketAndQty: List<Pair<Int, Int>>) {
fun setTicketAndQty(ticketAndQty: List<Triple<Int, Int, Float>>) {
ticketAndQuantity = ticketAndQty
}
}

interface TicketSelectedListener {
fun onSelected(ticketId: Int, quantity: Int)
fun onDonationSelected(ticketId: Int, donation: Float)
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class TicketsViewModel(
val amount: LiveData<Float> = mutableAmount
private val mutableTicketTableVisibility = MutableLiveData<Boolean>()
val ticketTableVisibility: LiveData<Boolean> = mutableTicketTableVisibility
val ticketIdAndQty = MutableLiveData<List<Pair<Int, Int>>>()
val ticketIdAndQty = MutableLiveData<List<Triple<Int, Int, Float>>>()

fun isLoggedIn() = authHolder.isLoggedIn()

Expand Down Expand Up @@ -97,7 +97,7 @@ class TicketsViewModel(
})
}

fun getAmount(ticketIdAndQty: List<Pair<Int, Int>>) {
fun getAmount(ticketIdAndQty: List<Triple<Int, Int, Float>>) {
val ticketIds = ArrayList<Int>()
val qty = ArrayList<Int>()
ticketIdAndQty.forEach {
Expand All @@ -106,6 +106,7 @@ class TicketsViewModel(
qty.add(it.second)
}
}
val donation = ticketIdAndQty.map { it.third }.sum()
compositeDisposable += ticketService.getTicketsWithIds(ticketIds)
.withDefaultSchedulers()
.doOnSubscribe {
Expand All @@ -127,15 +128,15 @@ class TicketsViewModel(
}
price?.let { prices += price * qty[index++] }
}
mutableAmount.value = prices
mutableAmount.value = prices + donation
}, {
Timber.e(it, "Error Loading tickets!")
})
}

fun isConnected(): Boolean = mutableConnectionLiveData.value ?: false

fun totalTicketsEmpty(ticketIdAndQty: List<Pair<Int, Int>>): Boolean {
fun totalTicketsEmpty(ticketIdAndQty: List<Triple<Int, Int, Float>>): Boolean {
return ticketIdAndQty.sumBy { it.second } == 0
}

Expand Down
Loading