From 14d267a95afaa70529c61f3192eeb108c79b3bac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Tue, 31 Mar 2020 18:20:24 +0200 Subject: [PATCH] [API] Fix task cancelling with the notification. [UI] Add event downloading progress bar. --- .../pl/szczodrzynski/edziennik/Extensions.kt | 1 + .../edziennik/data/api/ApiService.kt | 6 ++--- .../data/api/EdziennikNotification.kt | 19 +++++++------ .../api/edziennik/edudziennik/Edudziennik.kt | 1 + .../data/api/edziennik/idziennik/Idziennik.kt | 1 + .../data/api/edziennik/librus/Librus.kt | 1 + .../edziennik/mobidziennik/Mobidziennik.kt | 1 + .../data/api/edziennik/template/Template.kt | 1 + .../data/api/edziennik/vulcan/Vulcan.kt | 1 + .../data/api/events/EventGetEvent.kt | 9 +++++++ .../edziennik/data/api/models/Data.kt | 6 ++++- .../edziennik/receivers/SzkolnyReceiver.kt | 6 +++++ .../ui/dialogs/event/EventDetailsDialog.kt | 27 +++++++++++++++++++ .../WidgetNotificationsProvider.kt | 10 +++---- .../main/res/layout/dialog_event_details.xml | 27 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 16 files changed, 100 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/EventGetEvent.kt diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt index ed9b58c5..05b3d06f 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt @@ -743,6 +743,7 @@ inline fun T.onChange(crossinline onChangeListener: (v: T, @Suppress("UNCHECKED_CAST") inline fun T.onChange(crossinline onChangeListener: (v: T, isChecked: Boolean) -> Unit) { + clearOnCheckedChangeListeners() addOnCheckedChangeListener { buttonView, isChecked -> onChangeListener(buttonView as T, isChecked) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/ApiService.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/ApiService.kt index 2b0b63f2..ad9c4296 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/ApiService.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/ApiService.kt @@ -38,6 +38,9 @@ class ApiService : Service() { context.startService(Intent(context, ApiService::class.java)) EventBus.getDefault().postSticky(request) } + + var lastEventTime = System.currentTimeMillis() + var taskCancelTries = 0 } private val app by lazy { applicationContext as App } @@ -64,9 +67,6 @@ class ApiService : Service() { private val notification by lazy { EdziennikNotification(app) } - private var lastEventTime = System.currentTimeMillis() - private var taskCancelTries = 0 - /* ______ _ _ _ _ _____ _ _ _ _ | ____| | | (_) (_) | / ____| | | | | | | | |__ __| |_____ ___ _ __ _ __ _| | __ | | __ _| | | |__ __ _ ___| | __ diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/EdziennikNotification.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/EdziennikNotification.kt index 8582fc03..605b644c 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/EdziennikNotification.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/EdziennikNotification.kt @@ -8,11 +8,12 @@ import android.app.Notification import android.app.NotificationManager import android.app.PendingIntent import android.content.Context -import android.content.Intent import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat.PRIORITY_MIN import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.Bundle import pl.szczodrzynski.edziennik.R +import pl.szczodrzynski.edziennik.receivers.SzkolnyReceiver import kotlin.math.roundToInt @@ -35,16 +36,18 @@ class EdziennikNotification(val app: App) { var serviceClosed = false private fun cancelPendingIntent(taskId: Int): PendingIntent { - val intent = Intent("pl.szczodrzynski.edziennik.SZKOLNY_MAIN") - intent.putExtra("task", "TaskCancelRequest") - intent.putExtra("taskId", taskId) - return PendingIntent.getBroadcast(app, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT) as PendingIntent + val intent = SzkolnyReceiver.getIntent(app, Bundle( + "task" to "TaskCancelRequest", + "taskId" to taskId + )) + return PendingIntent.getBroadcast(app, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) as PendingIntent } private val closePendingIntent: PendingIntent get() { - val intent = Intent("pl.szczodrzynski.edziennik.SZKOLNY_MAIN") - intent.putExtra("task", "ServiceCloseRequest") - return PendingIntent.getBroadcast(app, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT) as PendingIntent + val intent = SzkolnyReceiver.getIntent(app, Bundle( + "task" to "ServiceCloseRequest" + )) + return PendingIntent.getBroadcast(app, 0, intent, 0) as PendingIntent } private fun errorCountText(): String? { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/Edudziennik.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/Edudziennik.kt index d64c1120..561c94c8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/Edudziennik.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/Edudziennik.kt @@ -103,6 +103,7 @@ class Edudziennik(val app: App, val profile: Profile?, val loginStore: LoginStor override fun cancel() { d(TAG, "Cancelled") data.cancel() + callback.onCompleted() } private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/Idziennik.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/Idziennik.kt index bee25d2e..a698ed69 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/Idziennik.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/Idziennik.kt @@ -126,6 +126,7 @@ class Idziennik(val app: App, val profile: Profile?, val loginStore: LoginStore, override fun cancel() { d(TAG, "Cancelled") data.cancel() + callback.onCompleted() } private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt index e9eabdf7..7995a905 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt @@ -141,6 +141,7 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va override fun cancel() { d(TAG, "Cancelled") data.cancel() + callback.onCompleted() } private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt index b6497d77..8b8951a3 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt @@ -128,6 +128,7 @@ class Mobidziennik(val app: App, val profile: Profile?, val loginStore: LoginSto override fun cancel() { d(TAG, "Cancelled") data.cancel() + callback.onCompleted() } private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt index eaf4e1d3..49c8bbad 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt @@ -101,6 +101,7 @@ class Template(val app: App, val profile: Profile?, val loginStore: LoginStore, override fun cancel() { d(TAG, "Cancelled") data.cancel() + callback.onCompleted() } private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt index 24a47d66..208d65bf 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt @@ -112,6 +112,7 @@ class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, va override fun cancel() { d(TAG, "Cancelled") data.cancel() + callback.onCompleted() } private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/EventGetEvent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/EventGetEvent.kt new file mode 100644 index 00000000..f13aa616 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/EventGetEvent.kt @@ -0,0 +1,9 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-3-31. + */ + +package pl.szczodrzynski.edziennik.data.api.events + +import pl.szczodrzynski.edziennik.data.db.full.EventFull + +data class EventGetEvent(val message: EventFull) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt index 753160ac..30fab35e 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt @@ -86,6 +86,7 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt val gradeCategories = LongSparseArray() var teacherOnConflictStrategy = OnConflictStrategy.IGNORE + var eventListReplace = false val classrooms = LongSparseArray() val attendanceTypes = LongSparseArray() @@ -284,7 +285,10 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt db.gradeDao().addAll(gradeList) } if (eventList.isNotEmpty()) { - db.eventDao().upsertAll(eventList, removeNotKept = true) + if (eventListReplace) + db.eventDao().replaceAll(eventList) + else + db.eventDao().upsertAll(eventList, removeNotKept = true) } if (noticeList.isNotEmpty()) { db.noticeDao().clear(profile.id) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/receivers/SzkolnyReceiver.kt b/app/src/main/java/pl/szczodrzynski/edziennik/receivers/SzkolnyReceiver.kt index f456bae3..f7819c43 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/receivers/SzkolnyReceiver.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/receivers/SzkolnyReceiver.kt @@ -7,6 +7,7 @@ package pl.szczodrzynski.edziennik.receivers import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import android.os.Bundle import pl.szczodrzynski.edziennik.data.api.ApiService import pl.szczodrzynski.edziennik.data.api.edziennik.EdziennikTask import pl.szczodrzynski.edziennik.data.api.events.requests.ServiceCloseRequest @@ -15,6 +16,11 @@ import pl.szczodrzynski.edziennik.data.api.events.requests.TaskCancelRequest class SzkolnyReceiver : BroadcastReceiver() { companion object { const val ACTION = "pl.szczodrzynski.edziennik.SZKOLNY_MAIN" + fun getIntent(context: Context, extras: Bundle): Intent { + val intent = Intent(context, SzkolnyReceiver::class.java) + intent.putExtras(extras) + return intent + } } override fun onReceive(context: Context?, intent: Intent?) { 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 703f4ea3..cbcdaaf8 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 @@ -12,10 +12,17 @@ import android.view.View import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.isVisible import com.google.android.material.dialog.MaterialAlertDialogBuilder 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.edziennik.EdziennikTask +import pl.szczodrzynski.edziennik.data.api.events.EventGetEvent import pl.szczodrzynski.edziennik.data.api.szkolny.SzkolnyApi +import pl.szczodrzynski.edziennik.data.db.entity.Event import pl.szczodrzynski.edziennik.data.db.full.EventFull import pl.szczodrzynski.edziennik.databinding.DialogEventDetailsBinding import pl.szczodrzynski.edziennik.ui.modules.timetable.TimetableFragment @@ -188,6 +195,26 @@ class EventDetailsDialog( BetterLink.attach(b.topic) { dialog.dismiss() } + + if (event.homeworkBody == null && !event.addedManually && event.type == Event.TYPE_HOMEWORK) { + b.bodyProgressBar.isVisible = true + b.body.isVisible = false + EdziennikTask.eventGet(event.profileId, event).enqueue(activity) + } + else { + b.bodyProgressBar.isVisible = false + b.body.isVisible = true + b.body.text = event.homeworkBody + BetterLink.attach(b.body) { + dialog.dismiss() + } + } + } + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + fun onEventGetEvent(event: EventGetEvent) { + EventBus.getDefault().removeStickyEvent(event) + update() } private fun showRemovingProgressDialog() { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/notifications/WidgetNotificationsProvider.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/notifications/WidgetNotificationsProvider.kt index 77d2a902..aec64aef 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/notifications/WidgetNotificationsProvider.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/notifications/WidgetNotificationsProvider.kt @@ -17,10 +17,7 @@ import com.mikepenz.iconics.IconicsDrawable import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial import com.mikepenz.iconics.utils.colorInt import com.mikepenz.iconics.utils.sizeDp -import pl.szczodrzynski.edziennik.App -import pl.szczodrzynski.edziennik.MainActivity -import pl.szczodrzynski.edziennik.R -import pl.szczodrzynski.edziennik.getJsonObject +import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.receivers.SzkolnyReceiver import pl.szczodrzynski.edziennik.ui.widgets.WidgetConfig @@ -43,8 +40,9 @@ class WidgetNotificationsProvider : AppWidgetProvider() { RemoteViews(app.packageName, if (config.darkTheme) R.layout.widget_notifications_dark else R.layout.widget_notifications) } - val syncIntent = Intent(SzkolnyReceiver.ACTION) - syncIntent.putExtra("task", "SyncRequest") + val syncIntent = SzkolnyReceiver.getIntent(context, Bundle( + "task" to "SyncRequest" + )) val syncPendingIntent = PendingIntent.getBroadcast(context, 0, syncIntent, 0) views.setOnClickPendingIntent(R.id.widgetNotificationsSync, syncPendingIntent) diff --git a/app/src/main/res/layout/dialog_event_details.xml b/app/src/main/res/layout/dialog_event_details.xml index 913f2704..03f69a7b 100644 --- a/app/src/main/res/layout/dialog_event_details.xml +++ b/app/src/main/res/layout/dialog_event_details.xml @@ -151,6 +151,33 @@ android:textIsSelectable="true" tools:text="Rozdział II: Panowanie Piastów i Jagiellonów.Przeniesiony z 11 grudnia." /> + + + + + + Oznacz jako wykonane Oznacz jako wykonane Czy chcesz oznaczyć to zadanie jako wykonane?\n\nNie będzie ono się wyświetlać na stronie głównej oraz w aktualnych zadaniach domowych. Będzie wciąż dostępne w Terminarzu. + Treść