From 76b9e63b2aa54a6a1bee55449fd052739b23f8d0 Mon Sep 17 00:00:00 2001 From: Duc Le Tran Date: Mon, 1 Jul 2019 09:17:51 +0200 Subject: [PATCH] Summary: Add ticket details Details: - Add sales date check - Add ticket description Fixes: #2030 --- .../general/ticket/TicketViewHolder.kt | 64 ++++++++++++++++ .../general/ticket/TicketsFragment.kt | 1 + .../general/ticket/TicketsRecyclerAdapter.kt | 8 +- app/src/main/res/layout/item_ticket.xml | 73 +++++++++++++++++-- app/src/main/res/values/strings.xml | 3 + 5 files changed, 140 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/fossasia/openevent/general/ticket/TicketViewHolder.kt b/app/src/main/java/org/fossasia/openevent/general/ticket/TicketViewHolder.kt index 7c9cdeef1..f1219b510 100644 --- a/app/src/main/java/org/fossasia/openevent/general/ticket/TicketViewHolder.kt +++ b/app/src/main/java/org/fossasia/openevent/general/ticket/TicketViewHolder.kt @@ -3,6 +3,7 @@ package org.fossasia.openevent.general.ticket import android.graphics.Paint import android.text.Editable import android.text.TextWatcher +import android.text.Html import android.view.View import android.widget.AdapterView import android.widget.ArrayAdapter @@ -17,7 +18,18 @@ 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 kotlinx.android.synthetic.main.item_ticket.view.priceInfo +import kotlinx.android.synthetic.main.item_ticket.view.moreInfoSection +import kotlinx.android.synthetic.main.item_ticket.view.seeMoreInfoText +import kotlinx.android.synthetic.main.item_ticket.view.ticketDateText +import kotlinx.android.synthetic.main.item_ticket.view.saleInfo +import kotlinx.android.synthetic.main.item_ticket.view.description import org.fossasia.openevent.general.discount.DiscountCode +import org.fossasia.openevent.general.event.EventUtils +import org.fossasia.openevent.general.event.EventUtils.getFormattedDate +import org.threeten.bp.DateTimeUtils +import java.util.Date +import kotlin.collections.ArrayList const val AMOUNT = "amount" const val TICKET_TYPE_FREE = "free" @@ -31,10 +43,19 @@ class TicketViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { ticket: Ticket, selectedListener: TicketSelectedListener?, eventCurrency: String?, + eventTimeZone: String?, ticketQuantity: Int, discountCode: DiscountCode? = null ) { itemView.ticketName.text = ticket.name + setupTicketSaleDate(ticket, eventTimeZone) + + setMoreInfoText() + itemView.seeMoreInfoText.setOnClickListener { + itemView.moreInfoSection.isVisible = !itemView.moreInfoSection.isVisible + setMoreInfoText() + } + var minQty = ticket.minOrder var maxQty = ticket.maxOrder if (discountCode?.minQuantity != null) @@ -74,6 +95,16 @@ class TicketViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { } } + val priceInfo = "${resource.getString(R.string.price)}: ${itemView.price.text}" + itemView.priceInfo.text = Html.fromHtml(priceInfo) + + if (ticket.description.isNullOrEmpty()) { + itemView.description.isVisible = false + } else { + itemView.description.isVisible = true + itemView.description.text = ticket.description + } + if (discountCode?.value != null && ticket.price != null && ticket.price != 0.toFloat()) { itemView.discountPrice.visibility = View.VISIBLE itemView.price.paintFlags = Paint.STRIKE_THRU_TEXT_FLAG @@ -133,4 +164,37 @@ class TicketViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { } } } + + private fun setMoreInfoText() { + itemView.seeMoreInfoText.text = resource.getString( + if (itemView.moreInfoSection.isVisible) R.string.see_less else R.string.see_more) + } + + private fun setupTicketSaleDate(ticket: Ticket, timeZone: String?) { + val startAt = ticket.salesStartsAt + val endAt = ticket.salesEndsAt + if (startAt != null && endAt != null && timeZone != null) { + val startsAt = EventUtils.getEventDateTime(startAt, timeZone) + val endsAt = EventUtils.getEventDateTime(endAt, timeZone) + val startDate = DateTimeUtils.toDate(startsAt.toInstant()) + val endDate = DateTimeUtils.toDate(endsAt.toInstant()) + val currentDate = Date() + + if (currentDate < startDate) { + itemView.ticketDateText.isVisible = true + itemView.ticketDateText.text = resource.getString(R.string.not_open) + itemView.orderQtySection.isVisible = false + } else if (startDate < currentDate && currentDate < endDate) { + itemView.ticketDateText.isVisible = false + itemView.orderQtySection.isVisible = true + } else { + itemView.ticketDateText.text = resource.getString(R.string.ended) + itemView.ticketDateText.isVisible = true + itemView.orderQtySection.isVisible = false + } + + val salesEnd = "${resource.getString(R.string.sales_end)} ${getFormattedDate(endsAt)}" + itemView.saleInfo.text = Html.fromHtml(salesEnd) + } + } } diff --git a/app/src/main/java/org/fossasia/openevent/general/ticket/TicketsFragment.kt b/app/src/main/java/org/fossasia/openevent/general/ticket/TicketsFragment.kt index 51e099a05..d4a9099f7 100644 --- a/app/src/main/java/org/fossasia/openevent/general/ticket/TicketsFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/ticket/TicketsFragment.kt @@ -281,6 +281,7 @@ class TicketsFragment : Fragment() { val startsAt = EventUtils.getEventDateTime(event.startsAt, event.timezone) val endsAt = EventUtils.getEventDateTime(event.endsAt, event.timezone) rootView.time.text = EventUtils.getFormattedDateTimeRangeDetailed(startsAt, endsAt) + ticketsRecyclerAdapter.setTimeZone(event.timezone) } private fun handleNoTicketsSelected() { diff --git a/app/src/main/java/org/fossasia/openevent/general/ticket/TicketsRecyclerAdapter.kt b/app/src/main/java/org/fossasia/openevent/general/ticket/TicketsRecyclerAdapter.kt index 3a33bebd4..916b7a769 100644 --- a/app/src/main/java/org/fossasia/openevent/general/ticket/TicketsRecyclerAdapter.kt +++ b/app/src/main/java/org/fossasia/openevent/general/ticket/TicketsRecyclerAdapter.kt @@ -10,6 +10,7 @@ class TicketsRecyclerAdapter : RecyclerView.Adapter() { private val tickets = ArrayList() private var eventCurrency: String? = null + private var eventTimeZone: String? = null private var discountCode: DiscountCode? = null private var selectedListener: TicketSelectedListener? = null private lateinit var ticketAndQuantity: List> @@ -28,6 +29,11 @@ class TicketsRecyclerAdapter : RecyclerView.Adapter() { eventCurrency = currencyCode } + fun setTimeZone(timeZone: String?) { + eventTimeZone = timeZone + notifyDataSetChanged() + } + fun applyDiscount(discountCode: DiscountCode) { this.discountCode = discountCode } @@ -49,7 +55,7 @@ class TicketsRecyclerAdapter : RecyclerView.Adapter() { currentDiscountCode = discountCode } val qty = if ((this::ticketAndQuantity.isInitialized)) ticketAndQuantity[position].second else 0 - holder.bind(ticket, selectedListener, eventCurrency, qty, currentDiscountCode) + holder.bind(ticket, selectedListener, eventCurrency, eventTimeZone, qty, currentDiscountCode) } override fun getItemCount(): Int { diff --git a/app/src/main/res/layout/item_ticket.xml b/app/src/main/res/layout/item_ticket.xml index 88ec5f942..9b577a618 100644 --- a/app/src/main/res/layout/item_ticket.xml +++ b/app/src/main/res/layout/item_ticket.xml @@ -2,21 +2,40 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" + android:orientation="vertical" android:layout_marginLeft="@dimen/layout_margin_medium" android:layout_marginRight="@dimen/layout_margin_medium" + android:padding="@dimen/layout_margin_medium" android:elevation="@dimen/card_elevation" - android:background="@drawable/border" + android:background="@drawable/border"> + + - - + + android:orientation="vertical"> + + + + + - + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1898f9830..a4ab714d7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -462,5 +462,8 @@ Oops. There is an error on cropping image Oops, there is an error. Current image can\'t be edited Donation + Ended + Not Open + Sales End: