From 2cf204ff7952b0260913e9254635fab63ccf0af3 Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Fri, 20 Dec 2019 00:40:00 +0100 Subject: [PATCH 001/270] [Dialog/BellSync] Implement bell sync dialog. --- .../ui/dialogs/bell/BellSyncDialog.kt | 79 ++++++++++ .../dialogs/bell/BellSyncTimeChooseDialog.kt | 138 ++++++++++++++++++ .../modules/home/cards/HomeTimetableCard.kt | 11 ++ app/src/main/res/drawable/ic_bell.xml | 54 +++++++ app/src/main/res/drawable/ic_bell_wtf.xml | 78 ++++++++++ .../main/res/layout/card_home_timetable.xml | 10 +- app/src/main/res/layout/dialog_bell_sync.xml | 31 ++++ .../layout/dialog_bell_sync_time_choose.xml | 43 ++++++ app/src/main/res/values-en/strings.xml | 5 +- app/src/main/res/values/strings.xml | 6 +- 10 files changed, 451 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncDialog.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt create mode 100644 app/src/main/res/drawable/ic_bell.xml create mode 100644 app/src/main/res/drawable/ic_bell_wtf.xml create mode 100644 app/src/main/res/layout/dialog_bell_sync.xml create mode 100644 app/src/main/res/layout/dialog_bell_sync_time_choose.xml diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncDialog.kt new file mode 100644 index 00000000..7dd3619d --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncDialog.kt @@ -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 + } + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt new file mode 100644 index 00000000..3bc88aa9 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt @@ -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() + + 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() + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeTimetableCard.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeTimetableCard.kt index e3a2feeb..20f9c848 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeTimetableCard.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeTimetableCard.kt @@ -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() diff --git a/app/src/main/res/drawable/ic_bell.xml b/app/src/main/res/drawable/ic_bell.xml new file mode 100644 index 00000000..61d88dce --- /dev/null +++ b/app/src/main/res/drawable/ic_bell.xml @@ -0,0 +1,54 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_bell_wtf.xml b/app/src/main/res/drawable/ic_bell_wtf.xml new file mode 100644 index 00000000..e49822fe --- /dev/null +++ b/app/src/main/res/drawable/ic_bell_wtf.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/card_home_timetable.xml b/app/src/main/res/layout/card_home_timetable.xml index 2b456a35..ef6436b0 100644 --- a/app/src/main/res/layout/card_home_timetable.xml +++ b/app/src/main/res/layout/card_home_timetable.xml @@ -48,9 +48,15 @@ android:visibility="gone" tools:src="@sample/settings" /> + - - \ No newline at end of file + diff --git a/app/src/main/res/layout/dialog_bell_sync.xml b/app/src/main/res/layout/dialog_bell_sync.xml new file mode 100644 index 00000000..e8838cc6 --- /dev/null +++ b/app/src/main/res/layout/dialog_bell_sync.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_bell_sync_time_choose.xml b/app/src/main/res/layout/dialog_bell_sync_time_choose.xml new file mode 100644 index 00000000..0859f5a7 --- /dev/null +++ b/app/src/main/res/layout/dialog_bell_sync_time_choose.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 0b0d8503..fd3d8ae4 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -76,10 +76,13 @@ Incorrect format Calibration is impossible, because there are no lessons now. Try again, i.e. in the end of the lesson or break. Remember that you should run this even before planned bell time. \n\nCurrent calibration: %s - Click OK, when the lesson ends. The counter\'s time will be calibrated to the bell time.\n\nPlanned bell time is %s + Click OK, when the bell rings. The counter\'s time will be calibrated to the bell time.\n\nPlanned bell time is %s Do you want to reset the calibration? The bell is inexact by %s%s Calibrate with the school bell + Time of the bell to synchronize + lesson %s (%s) + break (%s) Cancel Go to grades Grades - last 7 days diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 976e17ad..0e4003c6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -98,10 +98,14 @@ Nieprawidłowy format Synchronizacja jest niemożliwa, ponieważ teraz nie ma żadnych lekcji. Spróbuj jeszcze raz np. pod koniec lekcji albo przerwy. Pamiętaj, że powinieneś to uruchomić jeszcze przed planowanym czasem dzwonka. "\n\nAktualna kalibracja to %s" - Kliknij OK, kiedy lekcja się skończy. Licznik czasu zostanie zsynchronizowany z czasem dzwonka.\n\nCzas według planu to %s + Kliknij OK, kiedy dzwonek zadzwoni. Licznik czasu zostanie zsynchronizowany z czasem dzwonka.\n\nCzas według planu to %s + Wybierz najbliższy dzwonek, abyś mógł go zsynchronizować z aplikacją. Czy na pewno zresetować synchronizację? Dzwonek jest niedokładny o %s%s Synchronizacja z dzwonkiem + Godzina dzwonka do synchronizacji + lekcja %s (%s) + przerwa (%s) Anuluj Przejdź do ocen Oceny - ostatnie 7 dni From f242c304769ec9da475532a2beadb1d382e76030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Fri, 20 Dec 2019 22:00:55 +0100 Subject: [PATCH 002/270] [API/Events] Update Event Manual dialog sharing. --- .../pl/szczodrzynski/edziennik/Extensions.kt | 5 ++ .../edziennik/data/api/szkolny/Szkolny.kt | 4 +- .../edziennik/data/api/szkolny/SzkolnyApi.kt | 27 +++++--- .../api/szkolny/request/EventShareRequest.kt | 1 + .../edziennik/data/api/task/SzkolnyTask.kt | 12 ++-- .../ui/dialogs/event/EventDetailsDialog.kt | 37 +++++++---- .../ui/dialogs/event/EventManualDialog.kt | 66 ++++++++++++++----- 7 files changed, 108 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt index e327d770..788e19d5 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt @@ -641,3 +641,8 @@ fun Drawable.setTintColor(color: Int): Drawable { ) return this } + +inline fun List.ifNotEmpty(block: (List) -> Unit) { + if (!isEmpty()) + block(this) +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/Szkolny.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/Szkolny.kt index 867d2690..aba4e9fa 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/Szkolny.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/Szkolny.kt @@ -36,7 +36,7 @@ class Szkolny(val app: App, val callback: EdziennikCallback) { completed() } - fun shareEvent(event: EventFull) { + /*fun shareEvent(event: EventFull) { api.shareEvent(event) completed() } @@ -44,7 +44,7 @@ class Szkolny(val app: App, val callback: EdziennikCallback) { fun unshareEvent(event: EventFull) { api.unshareEvent(event) completed() - } + }*/ private fun completed() { callback.onCompleted() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyApi.kt index ccaea91d..2da2ed93 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyApi.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyApi.kt @@ -15,7 +15,9 @@ import pl.szczodrzynski.edziennik.data.api.szkolny.interceptor.SignatureIntercep import pl.szczodrzynski.edziennik.data.api.szkolny.request.EventShareRequest import pl.szczodrzynski.edziennik.data.api.szkolny.request.ServerSyncRequest import pl.szczodrzynski.edziennik.data.api.szkolny.request.WebPushRequest +import pl.szczodrzynski.edziennik.data.api.szkolny.response.ApiResponse import pl.szczodrzynski.edziennik.data.api.szkolny.response.WebPushResponse +import pl.szczodrzynski.edziennik.data.db.modules.events.Event import pl.szczodrzynski.edziennik.data.db.modules.events.EventFull import pl.szczodrzynski.edziennik.data.db.modules.profiles.ProfileFull import pl.szczodrzynski.edziennik.utils.models.Date @@ -102,29 +104,33 @@ class SzkolnyApi(val app: App) { return events } - fun shareEvent(event: EventFull) { + fun shareEvent(event: EventFull): ApiResponse? { val team = app.db.teamDao().getByIdNow(event.profileId, event.teamId) - api.shareEvent(EventShareRequest( + return api.shareEvent(EventShareRequest( deviceId = app.deviceId, sharedByName = event.sharedByName, shareTeamCode = team.code, event = event - )).execute() + )).execute().body() } - fun unshareEvent(event: EventFull) { + fun unshareEvent(event: Event): ApiResponse? { val team = app.db.teamDao().getByIdNow(event.profileId, event.teamId) - api.shareEvent(EventShareRequest( + return api.shareEvent(EventShareRequest( deviceId = app.deviceId, sharedByName = event.sharedByName, unshareTeamCode = team.code, eventId = event.id - )).execute() + )).execute().body() } - fun pairBrowser(browserId: String?, pairToken: String?): List { + /*fun eventEditRequest(requesterName: String, event: Event): ApiResponse? { + + }*/ + + fun pairBrowser(browserId: String?, pairToken: String?, onError: ((List) -> Unit)? = null): List { val response = api.webPush(WebPushRequest( action = "pairBrowser", deviceId = app.deviceId, @@ -132,10 +138,15 @@ class SzkolnyApi(val app: App) { pairToken = pairToken )).execute().body() + response?.errors?.let { + onError?.invoke(it) + return emptyList() + } + return response?.data?.browsers ?: emptyList() } - fun listBrowsers(): List { + fun listBrowsers(onError: ((List) -> Unit)? = null): List { val response = api.webPush(WebPushRequest( action = "listBrowsers", deviceId = app.deviceId diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/request/EventShareRequest.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/request/EventShareRequest.kt index 90f5d75e..650cdf85 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/request/EventShareRequest.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/request/EventShareRequest.kt @@ -14,6 +14,7 @@ data class EventShareRequest ( val sharedByName: String, val shareTeamCode: String? = null, val unshareTeamCode: String? = null, + val requesterName: String? = null, val eventId: Long? = null, val event: EventFull? = null diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/SzkolnyTask.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/SzkolnyTask.kt index a0aca4d0..d58d806e 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/SzkolnyTask.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/SzkolnyTask.kt @@ -16,8 +16,8 @@ class SzkolnyTask(val request: Any) : IApiTask(-1) { private const val TAG = "SzkolnyTask" fun sync(profiles: List) = SzkolnyTask(SyncRequest(profiles)) - fun shareEvent(event: EventFull) = SzkolnyTask(ShareEventRequest(event)) - fun unshareEvent(event: EventFull) = SzkolnyTask(UnshareEventRequest(event)) + /*fun shareEvent(event: EventFull) = SzkolnyTask(ShareEventRequest(event)) + fun unshareEvent(event: EventFull) = SzkolnyTask(UnshareEventRequest(event))*/ } private lateinit var szkolny: Szkolny @@ -35,12 +35,12 @@ class SzkolnyTask(val request: Any) : IApiTask(-1) { when (request) { is SyncRequest -> szkolny.sync(request.profiles) - is ShareEventRequest -> szkolny.shareEvent(request.event) - is UnshareEventRequest -> szkolny.unshareEvent(request.event) + /*is ShareEventRequest -> szkolny.shareEvent(request.event) + is UnshareEventRequest -> szkolny.unshareEvent(request.event)*/ } } data class SyncRequest(val profiles: List) - data class ShareEventRequest(val event: EventFull) - data class UnshareEventRequest(val event: EventFull) + /*data class ShareEventRequest(val event: EventFull) + data class UnshareEventRequest(val event: EventFull)*/ } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventDetailsDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventDetailsDialog.kt index f7f58d91..d49a3a84 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventDetailsDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventDetailsDialog.kt @@ -10,6 +10,7 @@ import androidx.appcompat.app.AppCompatActivity import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.* import pl.szczodrzynski.edziennik.* +import pl.szczodrzynski.edziennik.data.api.szkolny.SzkolnyApi import pl.szczodrzynski.edziennik.data.api.task.SzkolnyTask import pl.szczodrzynski.edziennik.data.db.modules.events.EventFull import pl.szczodrzynski.edziennik.databinding.DialogEventDetailsBinding @@ -39,6 +40,10 @@ class EventDetailsDialog( private lateinit var adapter: EventListAdapter + private val api by lazy { + SzkolnyApi(app) + } + init { run { if (activity.isFinishing) return@run @@ -126,19 +131,27 @@ class EventDetailsDialog( } private fun removeEvent() { - if (eventShared && eventOwn) { - Toast.makeText(activity, "Unshare + remove own event", Toast.LENGTH_SHORT).show() + launch { + if (eventShared && eventOwn) { + Toast.makeText(activity, "Unshare + remove own event", Toast.LENGTH_SHORT).show() - SzkolnyTask.unshareEvent(event).enqueue(activity) - finishRemoving() - } - else if (eventShared && !eventOwn) { - Toast.makeText(activity, "Remove + blacklist somebody's event", Toast.LENGTH_SHORT).show() - // TODO - } - else { - Toast.makeText(activity, "Remove event", Toast.LENGTH_SHORT).show() - finishRemoving() + val response = withContext(Dispatchers.Default) { + api.unshareEvent(event!!) + } + + response?.errors?.ifNotEmpty { + Toast.makeText(activity, "Error: "+it[0].reason, Toast.LENGTH_SHORT).show() + return@launch + } + + finishRemoving() + } else if (eventShared && !eventOwn) { + Toast.makeText(activity, "Remove + blacklist somebody's event", Toast.LENGTH_SHORT).show() + // TODO + } else { + Toast.makeText(activity, "Remove event", Toast.LENGTH_SHORT).show() + finishRemoving() + } } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventManualDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventManualDialog.kt index 4f3d516b..ab713135 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventManualDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventManualDialog.kt @@ -20,6 +20,7 @@ import com.jaredrummler.android.colorpicker.ColorPickerDialogListener import kotlinx.coroutines.* import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.MainActivity.Companion.DRAWER_ITEM_AGENDA +import pl.szczodrzynski.edziennik.data.api.szkolny.SzkolnyApi import pl.szczodrzynski.edziennik.data.api.task.SzkolnyTask import pl.szczodrzynski.edziennik.data.db.modules.events.Event import pl.szczodrzynski.edziennik.data.db.modules.events.EventFull @@ -60,13 +61,17 @@ class EventManualDialog( private val app by lazy { activity.application as App } private lateinit var b: DialogEventManualV2Binding private lateinit var dialog: AlertDialog - private var removeEventDialog: AlertDialog? = null - private var defaultLoaded = false private lateinit var event: Event private var customColor: Int? = null private val editingShared = editingEvent?.sharedBy != null private val editingOwn = editingEvent?.sharedBy == "self" + private var removeEventDialog: AlertDialog? = null + private var defaultLoaded = false + + private val api by lazy { + SzkolnyApi(app) + } init { run { if (activity.isFinishing) @@ -617,7 +622,21 @@ class EventManualDialog( else if (!share && editingShared) { Toast.makeText(activity, "Unshare own event", Toast.LENGTH_SHORT).show() - SzkolnyTask.unshareEvent(eventObject.withMetadata(metadataObject)).enqueue(activity) + eventObject.apply { + sharedBy = null + sharedByName = profile?.studentNameLong + } + + val response = withContext(Dispatchers.Default) { + api.unshareEvent(eventObject) + } + + response?.errors?.ifNotEmpty { + Toast.makeText(activity, "Error: "+it[0].reason, Toast.LENGTH_SHORT).show() + return@launch + } + + eventObject.sharedByName = null finishAdding(eventObject, metadataObject) } else if (share) { @@ -630,7 +649,14 @@ class EventManualDialog( metadataObject.addedDate = System.currentTimeMillis() - SzkolnyTask.shareEvent(eventObject.withMetadata(metadataObject)).enqueue(activity) + val response = withContext(Dispatchers.Default) { + api.shareEvent(eventObject.withMetadata(metadataObject)) + } + + response?.errors?.ifNotEmpty { + Toast.makeText(activity, "Error: "+it[0].reason, Toast.LENGTH_SHORT).show() + return@launch + } eventObject.sharedBy = "self" finishAdding(eventObject, metadataObject) @@ -642,19 +668,27 @@ class EventManualDialog( } private fun removeEvent() { - if (editingShared && editingOwn) { - Toast.makeText(activity, "Unshare + remove own event", Toast.LENGTH_SHORT).show() + launch { + if (editingShared && editingOwn) { + Toast.makeText(activity, "Unshare + remove own event", Toast.LENGTH_SHORT).show() - editingEvent?.let { SzkolnyTask.unshareEvent(it).enqueue(activity) } - finishRemoving() - } - else if (editingShared && !editingOwn) { - Toast.makeText(activity, "Remove + blacklist somebody's event", Toast.LENGTH_SHORT).show() - // TODO - } - else { - Toast.makeText(activity, "Remove event", Toast.LENGTH_SHORT).show() - finishRemoving() + val response = withContext(Dispatchers.Default) { + api.unshareEvent(editingEvent!!) + } + + response?.errors?.ifNotEmpty { + Toast.makeText(activity, "Error: "+it[0].reason, Toast.LENGTH_SHORT).show() + return@launch + } + + finishRemoving() + } else if (editingShared && !editingOwn) { + Toast.makeText(activity, "Remove + blacklist somebody's event", Toast.LENGTH_SHORT).show() + // TODO + } else { + Toast.makeText(activity, "Remove event", Toast.LENGTH_SHORT).show() + finishRemoving() + } } } From 2d838e700314dbd10819ab8e3cc8c6a220a43a00 Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Fri, 20 Dec 2019 23:48:47 +0100 Subject: [PATCH 003/270] [Dialog/BellSync] Add coroutine timer and make some small changes. --- .../ui/dialogs/bell/BellSyncDialog.kt | 31 ++++++++++++++----- .../dialogs/bell/BellSyncTimeChooseDialog.kt | 2 +- app/src/main/res/layout/dialog_bell_sync.xml | 2 +- app/src/main/res/values-en/strings.xml | 5 +-- app/src/main/res/values/strings.xml | 4 +-- 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncDialog.kt index 7dd3619d..85d531ba 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncDialog.kt @@ -10,10 +10,12 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job +import kotlinx.coroutines.launch 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.startCoroutineTimer import pl.szczodrzynski.edziennik.utils.models.Time import kotlin.coroutines.CoroutineContext @@ -37,6 +39,16 @@ class BellSyncDialog( private val app by lazy { activity.application as App } + private var counterJob: Job? = null + + private val actualBellDiff: Pair + get() { + val now = Time.getNow() + val bellDiff = Time.diff(now, bellTime) + val multiplier = if (bellTime > now) -1 else 1 + return Pair(bellDiff, multiplier) + } + init { apply { if (activity.isFinishing) return@apply @@ -52,18 +64,15 @@ class BellSyncDialog( }} 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 + val (bellDiff, multiplier) = actualBellDiff + val bellDiffText = (if (multiplier == -1) '-' else '+') + bellDiff.stringHMS 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)) + .setMessage(app.getString(R.string.bell_sync_results, bellDiffText)) .setPositiveButton(R.string.ok) { resultsDialog, _ -> resultsDialog.dismiss() dialog.dismiss() @@ -72,8 +81,16 @@ class BellSyncDialog( .show() } - if (Time.diff(Time.getNow(), bellTime) > Time(0, 10, 0)) { // Easter egg ^^ + if (Time.diff(Time.getNow(), bellTime) > Time(2, 0, 0)) { // Easter egg ^^ b.bellSyncButton.setImageDrawable(app.resources.getDrawable(R.drawable.ic_bell_wtf)) // wtf } + + launch { + counterJob = startCoroutineTimer(repeatMillis = 1000) { + val (bellDiff, multiplier) = actualBellDiff + val bellDiffText = (if (multiplier == -1) '-' else '+') + bellDiff.stringHMS + b.bellSyncHowto.text = app.getString(R.string.bell_sync_howto, bellTime.stringHM, bellDiffText) + } + } } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt index 3bc88aa9..33e35e59 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt @@ -129,7 +129,7 @@ class BellSyncTimeChooseDialog( app.config.timetable.bellSyncMultiplier = 0 confirmDialog.dismiss() - dialog.dismiss() + initView() if (activity is MainActivity) activity.reloadTarget() } .setNegativeButton(R.string.no) { dialog, _ -> dialog.dismiss() } diff --git a/app/src/main/res/layout/dialog_bell_sync.xml b/app/src/main/res/layout/dialog_bell_sync.xml index e8838cc6..3af9dbed 100644 --- a/app/src/main/res/layout/dialog_bell_sync.xml +++ b/app/src/main/res/layout/dialog_bell_sync.xml @@ -25,7 +25,7 @@ android:layout_height="128dp" android:layout_gravity="center" android:layout_margin="32dp" - android:background="?android:attr/selectableItemBackground" + android:background="?attr/selectableItemBackgroundBorderless" app:srcCompat="@drawable/ic_bell" /> diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index fd3d8ae4..decfedb0 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -76,9 +76,9 @@ Incorrect format Calibration is impossible, because there are no lessons now. Try again, i.e. in the end of the lesson or break. Remember that you should run this even before planned bell time. \n\nCurrent calibration: %s - Click OK, when the bell rings. The counter\'s time will be calibrated to the bell time.\n\nPlanned bell time is %s + Click the bell icon, when the bell rings. The counter\'s time will be calibrated to the bell time.\n\nPlanned bell time is %s\n\nThe bell time difference at the moment is %s Do you want to reset the calibration? - The bell is inexact by %s%s + The bell is inexact by %s Calibrate with the school bell Time of the bell to synchronize lesson %s (%s) @@ -873,4 +873,5 @@ (child) (parent) Syncing... + Choose the nearest bell to synchronize. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0e4003c6..43d3df29 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -98,10 +98,10 @@ Nieprawidłowy format Synchronizacja jest niemożliwa, ponieważ teraz nie ma żadnych lekcji. Spróbuj jeszcze raz np. pod koniec lekcji albo przerwy. Pamiętaj, że powinieneś to uruchomić jeszcze przed planowanym czasem dzwonka. "\n\nAktualna kalibracja to %s" - Kliknij OK, kiedy dzwonek zadzwoni. Licznik czasu zostanie zsynchronizowany z czasem dzwonka.\n\nCzas według planu to %s + Kliknij w ikonę dzwonka, kiedy dzwonek zadzwoni. Licznik czasu zostanie zsynchronizowany z czasem dzwonka.\n\nCzas według planu to %s\n\nAktualna różnica wynosi %s Wybierz najbliższy dzwonek, abyś mógł go zsynchronizować z aplikacją. Czy na pewno zresetować synchronizację? - Dzwonek jest niedokładny o %s%s + Dzwonek jest niedokładny o %s Synchronizacja z dzwonkiem Godzina dzwonka do synchronizacji lekcja %s (%s) From 1f5927eec026f1b8cf791785585ae7e1d17d7c4f Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Fri, 20 Dec 2019 23:49:47 +0100 Subject: [PATCH 004/270] [Manifest] Set the default theme to dark. --- app/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ab159072..9638f5ac 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/SplashTheme" + android:theme="@style/AppTheme.Dark" android:usesCleartextTraffic="true" tools:ignore="UnusedAttribute"> Date: Sat, 21 Dec 2019 17:39:17 +0100 Subject: [PATCH 005/270] [UI/Timetable] Handle no timetable or no lessons in Home card. --- .../modules/home/cards/HomeTimetableCard.kt | 68 ++++- .../main/res/layout/card_home_timetable.xml | 280 +++++++++++++----- app/src/main/res/values/strings.xml | 7 + 3 files changed, 275 insertions(+), 80 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeTimetableCard.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeTimetableCard.kt index 20f9c848..458a52e1 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeTimetableCard.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeTimetableCard.kt @@ -14,9 +14,16 @@ import androidx.core.view.setMargins import androidx.lifecycle.Observer import com.mikepenz.iconics.IconicsDrawable import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial +import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont import com.mikepenz.iconics.utils.sizeDp import kotlinx.coroutines.* +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode import pl.szczodrzynski.edziennik.* +import pl.szczodrzynski.edziennik.data.api.LOGIN_TYPE_LIBRUS +import pl.szczodrzynski.edziennik.data.api.events.ApiTaskAllFinishedEvent +import pl.szczodrzynski.edziennik.data.api.task.EdziennikTask import pl.szczodrzynski.edziennik.data.db.modules.events.Event import pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile import pl.szczodrzynski.edziennik.data.db.modules.timetable.Lesson @@ -80,7 +87,7 @@ class HomeTimetableCard( .colorAttr(activity, R.attr.colorIcon) .sizeDp(20)) - b.bellSync.setImageDrawable(IconicsDrawable(activity, CommunityMaterial.Icon.cmd_alarm_bell) + b.bellSync.setImageDrawable(IconicsDrawable(activity, SzkolnyFont.Icon.szf_alarm_bell_outline) .colorAttr(activity, R.attr.colorIcon) .sizeDp(20)) @@ -90,6 +97,18 @@ class HomeTimetableCard( ) } + b.root.onClick { + activity.loadTarget(MainActivity.DRAWER_ITEM_TIMETABLE, Bundle().apply { + putString("timetableDate", timetableDate.stringY_m_d) + }) + } + + if (app.profile.loginStoreType == LOGIN_TYPE_LIBRUS && app.profile.getLoginData("timetableNotPublic", false)) { + b.timetableLayout.visibility = View.GONE + b.notPublicLayout.visibility = View.VISIBLE + return + } + // get current bell-sync params app.config.timetable.bellSyncDiff?.let { bellSyncDiffMillis = (it.hour * 60 * 60 * 1000 + it.minute * 60 * 1000 + it.second * 1000).toLong() @@ -103,11 +122,7 @@ class HomeTimetableCard( update() }) - b.root.setOnClickListener { - activity.loadTarget(MainActivity.DRAWER_ITEM_TIMETABLE, Bundle().apply { - putString("timetableDate", timetableDate.stringY_m_d) - }) - } + EventBus.getDefault().register(this) } private fun update() { launch { @@ -144,6 +159,42 @@ class HomeTimetableCard( timetableDate = deferred.await() + if (lessons.isEmpty()) { + // timetable is not downloaded yet + b.timetableLayout.visibility = View.GONE + b.noTimetableLayout.visibility = View.VISIBLE + b.noLessonsLayout.visibility = View.GONE + val weekStart = timetableDate.clone().weekStart + b.noTimetableText.setText( + R.string.home_timetable_no_timetable_text, + weekStart.stringY_m_d + ) + b.noTimetableSync.onClick { + it.isEnabled = false + EdziennikTask.syncProfile( + profileId = App.profileId, + viewIds = listOf( + MainActivity.DRAWER_ITEM_TIMETABLE to 0 + ), + arguments = JsonObject( + "weekStart" to weekStart + ) + ).enqueue(activity) + } + return@launch + } + if (lessons.size == 1 && lessons[0].type == Lesson.TYPE_NO_LESSONS) { + // in next 7 days only NO_LESSONS is found + b.timetableLayout.visibility = View.GONE + b.noTimetableLayout.visibility = View.GONE + b.noLessonsLayout.visibility = View.VISIBLE + return@launch + } + + b.timetableLayout.visibility = View.VISIBLE + b.noTimetableLayout.visibility = View.GONE + b.noLessonsLayout.visibility = View.GONE + val isToday = today == timetableDate b.progress.visibility = View.GONE @@ -290,5 +341,10 @@ class HomeTimetableCard( } } + @Subscribe(threadMode = ThreadMode.MAIN) + fun onSyncFinishedEvent(event: ApiTaskAllFinishedEvent) { + b.noTimetableSync.isEnabled = true + } + override fun unbind(position: Int, holder: HomeCardAdapter.ViewHolder) = Unit } diff --git a/app/src/main/res/layout/card_home_timetable.xml b/app/src/main/res/layout/card_home_timetable.xml index ef6436b0..415c8390 100644 --- a/app/src/main/res/layout/card_home_timetable.xml +++ b/app/src/main/res/layout/card_home_timetable.xml @@ -6,124 +6,256 @@ - + android:orientation="horizontal" + android:visibility="gone" + tools:visibility="visible"> + + + android:text="@string/home_timetable_no_timetable" /> + android:textSize="16sp" + android:text="@string/home_timetable_no_timetable_text"/> + + + - - - - - + android:layout_height="wrap_content" + android:orientation="horizontal" + android:gravity="center_vertical" + android:visibility="gone" + tools:layout_marginTop="150dp" + tools:visibility="visible"> + + + android:textAppearance="@style/NavView.TextView.Title" + android:text="@string/home_timetable_no_lessons" /> - - + android:textSize="16sp" + android:text="@string/home_timetable_no_lessons_text"/> - + + + + + + + android:layout_marginLeft="8dp" + android:layout_marginStart="8dp" + android:orientation="vertical"> + + + + + + - - - + android:orientation="vertical" + tools:layout_marginTop="350dp"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 43d3df29..1fd7d796 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1113,4 +1113,11 @@ Skanuj kod QR Odłącz Połączono %s + Nie pobrano planu lekcji + Plan lekcji na tydzień %s nie został jeszcze pobrany. + Pobierz + Nie ma żadnych lekcji + Przez następne 7 dni nie ma żadnych lekcji. + Brak planu lekcji + Plan lekcji nie został opublikowany przez szkołę.\n\nSkontaktuj się z wychowawcą. From b66bd6fec94a1227f84aaf26dd4884fe1f81c437 Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Sat, 21 Dec 2019 20:46:26 +0100 Subject: [PATCH 006/270] [Dialog/BellSync] Add showing info when there are no lessons. --- .../ui/dialogs/bell/BellSyncDialog.kt | 4 + .../dialogs/bell/BellSyncTimeChooseDialog.kt | 61 ++++-- .../ui/modules/home/CounterActivity.java | 4 +- .../{HomeFragmentV2.kt => HomeFragment.kt} | 8 +- ...HomeFragment.java => HomeFragmentOld.java} | 17 +- .../ui/modules/home/HomeTimetableCard.kt | 177 ------------------ .../ui/modules/home/HomeTimetableCardOld.java | 10 +- .../ui/modules/homework/HomeworkAdapter.java | 6 +- .../modules/settings/SettingsNewFragment.java | 26 +-- .../modules/timetable/TimetableFragment.java | 4 +- .../edziennik/utils/models/Time.java | 4 +- app/src/main/res/layout/fragment_home.xml | 101 +--------- app/src/main/res/layout/fragment_home_old.xml | 101 ++++++++++ app/src/main/res/layout/fragment_home_v2.xml | 20 -- 14 files changed, 196 insertions(+), 347 deletions(-) rename app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/{HomeFragmentV2.kt => HomeFragment.kt} (97%) rename app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/{HomeFragment.java => HomeFragmentOld.java} (98%) delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/HomeTimetableCard.kt create mode 100644 app/src/main/res/layout/fragment_home_old.xml delete mode 100644 app/src/main/res/layout/fragment_home_v2.xml diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncDialog.kt index 85d531ba..738408eb 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncDialog.kt @@ -59,6 +59,10 @@ class BellSyncDialog( .setTitle(R.string.bell_sync_title) .setView(b.root) .setNeutralButton(R.string.cancel) { dialog, _ -> dialog.dismiss() } + .setOnDismissListener { + counterJob?.cancel() + onDismissListener?.invoke(TAG) + } .show() initView() }} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt index 33e35e59..3934d8e0 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt @@ -12,7 +12,6 @@ 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 @@ -26,6 +25,8 @@ class BellSyncTimeChooseDialog( companion object { const val TAG = "BellSyncTimeChooseDialog" + + private const val MAX_DIFF_MINUTES = 10 } private lateinit var job: Job @@ -39,7 +40,7 @@ class BellSyncTimeChooseDialog( private val today = Date.getToday() private val selectedTime: Time? - get() = b.timeDropdown.selected?.id?.let { Time.fromValue(it.toInt()) } + get() = b.timeDropdown.selected?.tag as Time? init { apply { if (activity.isFinishing) @@ -57,15 +58,15 @@ class BellSyncTimeChooseDialog( } } .setNegativeButton(R.string.cancel) { dialog, _ -> dialog.dismiss() } - .setNeutralButton(R.string.reset, null) .setOnDismissListener { onDismissListener?.invoke(TAG) } - .show() - - dialog.getButton(AlertDialog.BUTTON_NEUTRAL).onClick { - showResetDialog() - } + .create() + .apply { + setButton(AlertDialog.BUTTON_NEUTRAL, app.getString(R.string.reset)) { _, _ -> + showResetDialog() + } + } initView() }} @@ -85,6 +86,17 @@ class BellSyncTimeChooseDialog( loadTimeList() } + private fun checkForLessons(timeList: List