conventionschedule-android/app/src/main/java/com/adlerosn/brasilfurfest/schedule/EventActivity.kt

332 lines
15 KiB
Kotlin

package com.adlerosn.brasilfurfest.schedule
import android.annotation.SuppressLint
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.content.res.Resources
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.provider.CalendarContract
import com.google.android.material.snackbar.Snackbar
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import android.text.Spannable
import android.text.SpannableStringBuilder
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import com.adlerosn.brasilfurfest.CountdownActivity
import com.adlerosn.brasilfurfest.R
import com.adlerosn.brasilfurfest.SplashActivity
import com.adlerosn.brasilfurfest.helper.*
import com.adlerosn.brasilfurfest.helper.observables.Observable
import com.adlerosn.brasilfurfest.helper.observables.Observer
import com.adlerosn.brasilfurfest.schedule.abstractDataTypes.convention.FilterableNamedColoredAttribute
import com.adlerosn.brasilfurfest.schedule.abstractDataTypes.managed.AttendeeConFavorite
import com.adlerosn.brasilfurfest.schedule.managers.ScheduleManagerGetter
import com.google.gson.GsonBuilder
import kotlinx.android.synthetic.main.activity_event.*
import kotlinx.android.synthetic.main.activity_event_content.*
import kotlinx.android.synthetic.main.activity_event_content_keypair.view.*
import kotlinx.android.synthetic.main.activity_event_share.view.*
import org.jetbrains.anko.doAsync
import kotlin.math.roundToInt
class EventActivity : AppCompatActivity() {
private var fromNotification = false
override fun onCreate(savedInstanceState: Bundle?) {
ActivitiesForFragments[this.javaClass.simpleName] = this
super.onCreate(savedInstanceState)
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
window.statusBarColor = Color.TRANSPARENT
setContentView(R.layout.activity_event)
resourcesAliased = this.resources
setSupportActionBar(toolbar)
toolbar_layout.setCollapsedTitleTextAppearance(R.style.CollapsedAppBar)
toolbar_layout.setExpandedTitleTextAppearance(R.style.ExpandedAppBar)
val scheduleManager = ScheduleManagerGetter[this]
val favorite = intent.getSerializableExtra("favorite") as AttendeeConFavorite
val offerStar = intent.getBooleanExtra("offerStar", false)
fromNotification = intent.getBooleanExtra("fromNotification", false)
val event = favorite.findInConvention(scheduleManager.convention)
toolbar_layout.title = event?.titles?.solved ?: favorite.getString()
doAsync { uiThreadWithLogger {
event?.assetImage?.solved?.fromCacheManagerToImageOf(app_bar_image)
?:
scheduleManager.convention.imageDefaultEvent?.solved?.fromCacheManagerToImageOf(app_bar_image)
} }
val timerClickListener = View.OnClickListener{ _ ->
Intent(this, CountdownActivity::class.java).let {
it.putExtra("label", favorite.getString())
it.putExtra("counter", favorite.timeRange.start.timeInMillis)
it.putExtra("finishesAt", favorite.timeRange.finish.timeInMillis)
startActivity(it)
}
}
keypairs.removeAllViews()
inflateKeyPair(
R.string.schedule_event_key_activity.getString(),
favorite.getString(),
keypairs
)
if(event?.subtitles?.solved?.isNotEmpty() == true)
inflateKeyPair(
R.string.schedule_event_key_detail.getString(),
event.subtitles.solved!!,
keypairs
)
val whenButton = inflateKeyPair(
R.string.schedule_event_key_when.getString(),
R.string.schedule_event_key_when_formatted.getString().format(
favorite.timeRange.start.timeInMillis.formatAsLongDayOfWeekWithNumber(),
favorite.timeRange.start.timeInMillis.formatAsHoursAndMinutes(),
favorite.timeRange.finish.timeInMillis.formatAsHoursAndMinutes()
).capitalize(),
keypairs
).apply {
touchableIndicator.visibility = View.VISIBLE
setOnClickListener(timerClickListener)
}
if(favorite.isSecondaryStringPlace){
inflateKeyPair(
R.string.schedule_event_key_place.getString(),
favorite.getSecondaryString(),
keypairs
)
}
if(event!=null) {
if(event.places.isNotEmpty())
inflateKeyPair(
event.places.size.pluralize(R.string.schedule_event_key_place, R.string.schedule_event_key_places).getString(),
formatSpannableWithColor(event.places),
keypairs
)
if(event.language!=null)
inflateKeyPair(
R.string.schedule_event_key_language.getString(),
event.language.language.getString(),
keypairs
)
event.descriptions.solved?.let {
if(it.isNotEmpty())
inflateKeyPair(
R.string.schedule_event_key_description.getString(),
it,
keypairs
)
if(event.tags.isNotEmpty())
inflateKeyPair(
event.tags.size.pluralize(R.string.schedule_event_key_category, R.string.schedule_event_key_categories).getString(),
formatSpannableWithColor(event.tags),
keypairs
)
if(event.conbookPages.isNotEmpty())
inflateKeyPair(
event.conbookPages.size.pluralize(R.string.schedule_event_key_on_conbooks_page, R.string.schedule_event_key_on_conbooks_pages).getString(),
event.conbookPages.map { it.toString() }.textuallyJoined,
keypairs
)
if(event.conbookId.isNotEmpty())
inflateKeyPair(
R.string.schedule_event_key_identified_on_conbook_as.getString(),
event.conbookId,
keypairs
)
if(event.attendableBy.isNotEmpty())
inflateKeyPair(
event.attendableBy.size.pluralize(R.string.schedule_event_key_elegible_registration, R.string.schedule_event_key_elegible_registrations).getString(),
event.attendableBy.map { it.names.solved!! }.textuallyJoined,
keypairs
)
}
@SuppressLint("RestrictedApi")
if(event.hiddenFromTimeTable or scheduleManager.canAttend(event).not()) {
fab.visibility = View.GONE
fabCalendar.visibility = View.GONE
fabShare.visibility = View.GONE
}
}
@SuppressLint("RestrictedApi")
if(!offerStar){
fab.visibility = View.GONE
fabCalendar.visibility = View.GONE
fabShare.visibility = View.GONE
}
fab.setOnClickListener { _ ->
R.drawable.ic_star_half_white_24dp.asImageOf(fab)
if (favorite in scheduleManager.attendeeFavorites)
scheduleManager.attendeeFavorites.remove(favorite)
else
scheduleManager.attendeeFavorites.add(favorite)
}
fab.isLongClickable = true
fab.setOnLongClickListener {
Snackbar.make(it.rootView, R.string.add_or_remove_favorite, Snackbar.LENGTH_LONG).apply {
setActionTextColor(this@EventActivity.getColorCompat(R.color.colorBase20))
view.setBackgroundColor(this@EventActivity.getColorCompat(R.color.colorBase03))
view.let {
it.setPadding(
it.paddingLeft,
it.paddingTop,
it.paddingRight,
it.paddingBottom + (48 * Resources.getSystem().displayMetrics.density).toInt()
)
show()
}
}
true
}
fabCalendar.setOnClickListener { _ ->
val intent = Intent(Intent.ACTION_EDIT)
intent.type = "vnd.android.cursor.item/event"
intent.putExtra(CalendarContract.Events.TITLE, favorite.getString())
if(event!=null) {
intent.putExtra(CalendarContract.Events.EVENT_LOCATION, event.places.map { it.names.solved ?: "" }.textuallyJoined)
intent.putExtra(CalendarContract.Events.DESCRIPTION, event.descriptions.solved ?: "")
}
intent.putExtra(
CalendarContract.EXTRA_EVENT_BEGIN_TIME,
favorite.timeRange.start.timeInMillis
)
intent.putExtra(
CalendarContract.EXTRA_EVENT_END_TIME,
favorite.timeRange.finish.timeInMillis
)
startActivity(intent)
}
fabShare.isLongClickable = true
fabShare.setOnClickListener {
val gson = GsonBuilder().create()
val link = "https://brasilfurfest.com.br/app/roomparty#"+ Uri.encode(gson.toJson(favorite))
val dialog = AlertDialog.Builder(this).create()
dialog.setTitle(R.string.event_share_question.getString())
val view = layoutInflater.inflate(R.layout.activity_event_share)
view.btnLink.setOnClickListener {
val clipboardManager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clipData = ClipData.newPlainText("Room party link", link)
clipboardManager.setPrimaryClip(clipData)
startActivity(Intent.createChooser(Intent(Intent.ACTION_SEND).apply { type="text/plain"; putExtra(Intent.EXTRA_TEXT, link) }, null))
dialog.dismiss()
}
view.btnQr.setOnClickListener {
startActivity(Intent(this, QRCodeViewerActivity::class.java).apply { putExtra("data", link) })
dialog.dismiss()
}
dialog.setView(view)
dialog.show()
}
fabShare.setOnLongClickListener {
Snackbar.make(it.rootView, R.string.shows_you_how_you_can_share_this, Snackbar.LENGTH_LONG).apply {
setActionTextColor(this@EventActivity.getColorCompat(R.color.colorBase20))
view.setBackgroundColor(this@EventActivity.getColorCompat(R.color.colorBase03))
view.let {
it.setPadding(
it.paddingLeft,
it.paddingTop,
it.paddingRight,
it.paddingBottom + 48.asDpToPx.roundToInt()
)
show()
}
}
true
}
if(favorite.isShareable.not())
@SuppressLint("RestrictedApi")
fabShare.visibility = View.INVISIBLE
fabCalendar.isLongClickable = true
fabCalendar.setOnLongClickListener {
Snackbar.make(it.rootView, R.string.adds_to_your_agenda_app, Snackbar.LENGTH_LONG).apply {
setActionTextColor(this@EventActivity.getColorCompat(R.color.colorBase20))
view.setBackgroundColor(this@EventActivity.getColorCompat(R.color.colorBase03))
view.let {
it.setPadding(
it.paddingLeft,
it.paddingTop,
it.paddingRight,
it.paddingBottom + 48.asDpToPx.roundToInt()
)
show()
}
}
true
}
whenButton.isLongClickable = true
whenButton.setOnLongClickListener {
Snackbar.make(it.rootView, R.string.opens_timer, Snackbar.LENGTH_LONG).apply {
setActionTextColor(this@EventActivity.getColorCompat(R.color.colorBase20))
view.setBackgroundColor(this@EventActivity.getColorCompat(R.color.colorBase03))
view.let {
it.setPadding(
it.paddingLeft,
it.paddingTop,
it.paddingRight,
it.paddingBottom + 48.asDpToPx.roundToInt()
)
show()
}
}
true
}
scheduleManager.addObserver (object : Observer<Observable<Any?>, Any?> {
override fun update(observable: Observable<Any?>, args: Any?) {
if (favorite in scheduleManager.attendeeFavorites)
R.drawable.ic_star_white_24dp.asImageOf(fab)
else
R.drawable.ic_star_border_white_24dp.asImageOf(fab)
}
}.apply { this.update(Observable(), null) })
}
private fun inflateKeyPair(key: String, value: CharSequence, into: ViewGroup? = null) =
layoutInflater.inflate(R.layout.activity_event_content_keypair).apply {
textKey.text = key
textValue.text = value
into?.addView(this)
touchableIndicator.visibility = View.GONE
}
override fun onBackPressed() {
if (!fromNotification)
super.onBackPressed()
else {
val intent = Intent(this, SplashActivity::class.java)
intent.flags =
Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_TASK_ON_HOME
intent.putExtra("fastStart", true)
this.startActivity(intent)
this.finish()
}
}
private fun formatSpannableWithColor(collection: List<FilterableNamedColoredAttribute>): Spannable =
collection.map {
SpannableString(
it.names.solved!!,
RoundedBackgroundAndForegroundColorsSpan(
it.color,
it.color.decideBestForegroundColor(
applicationContext.getColorCompat(R.color.colorBase03),
applicationContext.getColorCompat(R.color.colorBase21)
)
)
)
}.textuallyJoined.let { SpannableStringBuilder().append(it).append(" ") }
}