[Dialog/BellSync] Implement bell sync dialog.

This commit is contained in:
Kacper Ziubryniewicz
2019-12-20 00:40:00 +01:00
parent 38fc9e97bb
commit 2cf204ff79
10 changed files with 451 additions and 4 deletions

View File

@ -0,0 +1,79 @@
/*
* Copyright (c) Kacper Ziubryniewicz 2019-12-20
*/
package pl.szczodrzynski.edziennik.ui.dialogs.bell
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.MainActivity
import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.databinding.DialogBellSyncBinding
import pl.szczodrzynski.edziennik.utils.models.Time
import kotlin.coroutines.CoroutineContext
class BellSyncDialog(
val activity: AppCompatActivity,
private val bellTime: Time,
val onShowListener: ((tag: String) -> Unit)? = null,
val onDismissListener: ((tag: String) -> Unit)? = null
) : CoroutineScope {
companion object {
const val TAG = "BellSyncDialog"
}
private lateinit var job: Job
override val coroutineContext: CoroutineContext
get() = job + Dispatchers.Main
private lateinit var dialog: AlertDialog
private lateinit var b: DialogBellSyncBinding
private val app by lazy { activity.application as App }
init { apply {
if (activity.isFinishing)
return@apply
job = Job()
b = DialogBellSyncBinding.inflate(activity.layoutInflater)
onShowListener?.invoke(TAG)
dialog = MaterialAlertDialogBuilder(activity)
.setTitle(R.string.bell_sync_title)
.setView(b.root)
.setNeutralButton(R.string.cancel) { dialog, _ -> dialog.dismiss() }
.show()
initView()
}}
private fun initView() {
b.bellSyncHowto.text = app.getString(R.string.bell_sync_howto, bellTime.stringHM)
b.bellSyncButton.setOnClickListener {
val now = Time.getNow()
val bellDiff = Time.diff(now, bellTime)
val multiplier = if (bellTime > now) -1 else 1
app.config.timetable.bellSyncDiff = bellDiff
app.config.timetable.bellSyncMultiplier = multiplier
MaterialAlertDialogBuilder(activity)
.setTitle(R.string.bell_sync_title)
.setMessage(app.getString(R.string.bell_sync_results, if (multiplier == -1) '-' else '+', bellDiff.stringHMS))
.setPositiveButton(R.string.ok) { resultsDialog, _ ->
resultsDialog.dismiss()
dialog.dismiss()
if (activity is MainActivity) activity.reloadTarget()
}
.show()
}
if (Time.diff(Time.getNow(), bellTime) > Time(0, 10, 0)) { // Easter egg ^^
b.bellSyncButton.setImageDrawable(app.resources.getDrawable(R.drawable.ic_bell_wtf)) // wtf
}
}
}

View File

@ -0,0 +1,138 @@
/*
* Copyright (c) Kacper Ziubryniewicz 2019-12-20
*/
package pl.szczodrzynski.edziennik.ui.dialogs.bell
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.*
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.MainActivity
import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.databinding.DialogBellSyncTimeChooseBinding
import pl.szczodrzynski.edziennik.onClick
import pl.szczodrzynski.edziennik.utils.TextInputDropDown
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
import kotlin.coroutines.CoroutineContext
class BellSyncTimeChooseDialog(
val activity: AppCompatActivity,
val onShowListener: ((tag: String) -> Unit)? = null,
val onDismissListener: ((tag: String) -> Unit)? = null
) : CoroutineScope {
companion object {
const val TAG = "BellSyncTimeChooseDialog"
}
private lateinit var job: Job
override val coroutineContext: CoroutineContext
get() = job + Dispatchers.Main
private lateinit var dialog: AlertDialog
private lateinit var b: DialogBellSyncTimeChooseBinding
private val app by lazy { activity.application as App }
private val today = Date.getToday()
private val selectedTime: Time?
get() = b.timeDropdown.selected?.id?.let { Time.fromValue(it.toInt()) }
init { apply {
if (activity.isFinishing)
return@apply
job = Job()
b = DialogBellSyncTimeChooseBinding.inflate(activity.layoutInflater)
onShowListener?.invoke(TAG)
dialog = MaterialAlertDialogBuilder(activity)
.setTitle(R.string.bell_sync_title)
.setView(b.root)
.setPositiveButton(R.string.ok) { dialog, _ ->
dialog.dismiss()
selectedTime?.let {
BellSyncDialog(activity, it)
}
}
.setNegativeButton(R.string.cancel) { dialog, _ -> dialog.dismiss() }
.setNeutralButton(R.string.reset, null)
.setOnDismissListener {
onDismissListener?.invoke(TAG)
}
.show()
dialog.getButton(AlertDialog.BUTTON_NEUTRAL).onClick {
showResetDialog()
}
initView()
}}
private fun initView() {
b.bellSyncHowto.text = app.getString(R.string.bell_sync_choose_howto)
app.config.timetable.bellSyncDiff?.let { bellDiff ->
val multiplier = app.config.timetable.bellSyncMultiplier
val bellDiffText = (if (multiplier == -1) '-' else '+') + bellDiff.stringHMS
b.bellSyncHowto.text = app.getString(R.string.concat_2_strings,
app.getString(R.string.bell_sync_choose_howto),
app.getString(R.string.bell_sync_current_dialog, bellDiffText)
)
}
loadTimeList()
}
private fun loadTimeList() { launch {
val timeItems = withContext(Dispatchers.Default) {
val lessons = app.db.timetableDao().getForDateNow(App.profileId, today)
val items = mutableListOf<TextInputDropDown.Item>()
lessons.forEach {
items += TextInputDropDown.Item(
it.startTime?.value?.toLong() ?: return@forEach,
app.getString(R.string.bell_sync_lesson_item, it.displaySubjectName, it.startTime?.stringHM),
tag = it
)
items += TextInputDropDown.Item(
it.endTime?.value?.toLong() ?: return@forEach,
app.getString(R.string.bell_sync_break_item, it.endTime?.stringHM),
tag = it
)
}
items
}
b.timeDropdown.clear()
b.timeDropdown.append(timeItems)
timeItems.forEachIndexed { index, item ->
val time = Time.fromValue(item.id.toInt())
if (time < Time.getNow()) {
b.timeDropdown.select(if (timeItems.size > index + 1) timeItems[index + 1] else item)
}
}
b.timeDropdown.isEnabled = true
// TODO Fix popup cutting off
}}
private fun showResetDialog() {
MaterialAlertDialogBuilder(activity)
.setTitle(R.string.bell_sync_title)
.setMessage(R.string.bell_sync_reset_confirm)
.setPositiveButton(R.string.yes) { confirmDialog, _ ->
app.config.timetable.bellSyncDiff = null
app.config.timetable.bellSyncMultiplier = 0
confirmDialog.dismiss()
dialog.dismiss()
if (activity is MainActivity) activity.reloadTarget()
}
.setNegativeButton(R.string.no) { dialog, _ -> dialog.dismiss() }
.show()
}
}

View File

@ -22,6 +22,7 @@ import pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile
import pl.szczodrzynski.edziennik.data.db.modules.timetable.Lesson
import pl.szczodrzynski.edziennik.data.db.modules.timetable.LessonFull
import pl.szczodrzynski.edziennik.databinding.CardHomeTimetableBinding
import pl.szczodrzynski.edziennik.ui.dialogs.bell.BellSyncTimeChooseDialog
import pl.szczodrzynski.edziennik.ui.modules.home.HomeCard
import pl.szczodrzynski.edziennik.ui.modules.home.HomeCardAdapter
import pl.szczodrzynski.edziennik.ui.modules.home.HomeFragmentV2
@ -79,6 +80,16 @@ class HomeTimetableCard(
.colorAttr(activity, R.attr.colorIcon)
.sizeDp(20))
b.bellSync.setImageDrawable(IconicsDrawable(activity, CommunityMaterial.Icon.cmd_alarm_bell)
.colorAttr(activity, R.attr.colorIcon)
.sizeDp(20))
b.bellSync.setOnClickListener {
BellSyncTimeChooseDialog(
activity
)
}
// get current bell-sync params
app.config.timetable.bellSyncDiff?.let {
bellSyncDiffMillis = (it.hour * 60 * 60 * 1000 + it.minute * 60 * 1000 + it.second * 1000).toLong()