From cbac2796aa468b8f03caad73fa354bdfeb6dda51 Mon Sep 17 00:00:00 2001 From: Aidan Follestad Date: Tue, 8 Jan 2019 16:39:00 -0800 Subject: [PATCH] Show success notification if validation passes after previously not passing. Resolves #4. --- .../engine/validation/ValidationJob.kt | 11 ++++- .../nocknock/notifications/Channel.kt | 8 +++- .../notifications/NockNotificationManager.kt | 40 +++++++++++++++---- ...fication.xml => ic_notification_error.xml} | 0 .../res/drawable/ic_notification_success.xml | 10 +++++ notifications/src/main/res/values/strings.xml | 10 ++++- 6 files changed, 66 insertions(+), 13 deletions(-) rename notifications/src/main/res/drawable/{ic_notification.xml => ic_notification_error.xml} (100%) create mode 100644 notifications/src/main/res/drawable/ic_notification_success.xml diff --git a/engine/src/main/java/com/afollestad/nocknock/engine/validation/ValidationJob.kt b/engine/src/main/java/com/afollestad/nocknock/engine/validation/ValidationJob.kt index 57a62cd..64942bb 100644 --- a/engine/src/main/java/com/afollestad/nocknock/engine/validation/ValidationJob.kt +++ b/engine/src/main/java/com/afollestad/nocknock/engine/validation/ValidationJob.kt @@ -19,8 +19,8 @@ import android.app.job.JobParameters import android.app.job.JobService import android.content.Intent import com.afollestad.nocknock.data.AppDatabase -import com.afollestad.nocknock.data.model.RetryPolicy import com.afollestad.nocknock.data.getSite +import com.afollestad.nocknock.data.model.RetryPolicy import com.afollestad.nocknock.data.model.Site import com.afollestad.nocknock.data.model.Status import com.afollestad.nocknock.data.model.Status.CHECKING @@ -80,6 +80,10 @@ class ValidationJob : JobService() { sendBroadcast(Intent(ACTION_JOB_RUNNING).apply { putExtra(KEY_SITE_ID, site.id) }) log("Checking ${site.name} (${site.url})...") + val lastResult = site.lastResult + if (lastResult != null) { + log("Result of previous attempt: ${lastResult.status}") + } val jobResult = async(IO) { updateStatus(site, CHECKING) @@ -139,6 +143,9 @@ class ValidationJob : JobService() { if (jobResult.lastResult!!.status == OK) { notificationManager.cancelStatusNotification(jobResult) + if (lastResult != null && lastResult.status != OK) { + notificationManager.postValidationSuccessNotification(jobResult) + } } else { val retryPolicy = site.retryPolicy if (retryPolicy != null) { @@ -167,7 +174,7 @@ class ValidationJob : JobService() { } } - notificationManager.postStatusNotification(jobResult) + notificationManager.postValidationErrorNotification(jobResult) } validationManager.scheduleValidation( diff --git a/notifications/src/main/java/com/afollestad/nocknock/notifications/Channel.kt b/notifications/src/main/java/com/afollestad/nocknock/notifications/Channel.kt index dcf9f76..7cad6ca 100644 --- a/notifications/src/main/java/com/afollestad/nocknock/notifications/Channel.kt +++ b/notifications/src/main/java/com/afollestad/nocknock/notifications/Channel.kt @@ -24,7 +24,13 @@ enum class Channel( val description: Int, val importance: Int ) { - CheckFailures( + ValidationSuccess( + id = "check_success", + title = R.string.channel_server_check_success_title, + description = R.string.channel_server_check_success_description, + importance = IMPORTANCE_DEFAULT + ), + ValidationErrors( id = "check_failures", title = R.string.channel_server_check_failures_title, description = R.string.channel_server_check_failures_description, diff --git a/notifications/src/main/java/com/afollestad/nocknock/notifications/NockNotificationManager.kt b/notifications/src/main/java/com/afollestad/nocknock/notifications/NockNotificationManager.kt index ba1d2b0..84addbc 100644 --- a/notifications/src/main/java/com/afollestad/nocknock/notifications/NockNotificationManager.kt +++ b/notifications/src/main/java/com/afollestad/nocknock/notifications/NockNotificationManager.kt @@ -18,7 +18,7 @@ package com.afollestad.nocknock.notifications import android.annotation.TargetApi import android.app.NotificationManager import android.os.Build.VERSION_CODES -import com.afollestad.nocknock.notifications.Channel.CheckFailures +import com.afollestad.nocknock.notifications.Channel.ValidationErrors import com.afollestad.nocknock.utilities.providers.CanNotifyModel import com.afollestad.nocknock.utilities.providers.IntentProvider import com.afollestad.nocknock.utilities.providers.NotificationChannelProvider @@ -34,7 +34,9 @@ interface NockNotificationManager { fun createChannels() - fun postStatusNotification(model: CanNotifyModel) + fun postValidationErrorNotification(model: CanNotifyModel) + + fun postValidationSuccessNotification(model: CanNotifyModel) fun cancelStatusNotification(model: CanNotifyModel) @@ -60,26 +62,48 @@ class RealNockNotificationManager( override fun createChannels() = Channel.values().forEach(this::createChannel) - override fun postStatusNotification(model: CanNotifyModel) { + override fun postValidationErrorNotification(model: CanNotifyModel) { if (isAppOpen) { // Don't show notifications while the app is open - log("App is open, status notification for site ${model.notifyId()} won't be posted.") + log("App is open, validation error notification for site ${model.notifyId()} won't be posted.") return } - log("Posting status notification for site ${model.notifyId()}...") + log("Posting validation error notification for site ${model.notifyId()}...") val intent = intentProvider.getPendingIntentForViewSite(model) val newNotification = notificationProvider.create( - channelId = CheckFailures.id, + channelId = ValidationErrors.id, title = model.notifyName(), content = model.notifyDescription() ?: stringProvider.get(R.string.something_wrong), intent = intent, - smallIcon = R.drawable.ic_notification + smallIcon = R.drawable.ic_notification_error ) stockManager.notify(model.notifyTag(), model.notificationId(), newNotification) - log("Posted status notification for site ${model.notificationId()}.") + log("Posted validation error notification for site ${model.notificationId()}.") + } + + override fun postValidationSuccessNotification(model: CanNotifyModel) { + if (isAppOpen) { + // Don't show notifications while the app is open + log("App is open, validation success notification for site ${model.notifyId()} won't be posted.") + return + } + + log("Posting validation success notification for site ${model.notifyId()}...") + val intent = intentProvider.getPendingIntentForViewSite(model) + + val newNotification = notificationProvider.create( + channelId = ValidationErrors.id, + title = model.notifyName(), + content = stringProvider.get(R.string.validation_passed), + intent = intent, + smallIcon = R.drawable.ic_notification_success + ) + + stockManager.notify(model.notifyTag(), model.notificationId(), newNotification) + log("Posted validation success notification for site ${model.notificationId()}.") } override fun cancelStatusNotification(model: CanNotifyModel) { diff --git a/notifications/src/main/res/drawable/ic_notification.xml b/notifications/src/main/res/drawable/ic_notification_error.xml similarity index 100% rename from notifications/src/main/res/drawable/ic_notification.xml rename to notifications/src/main/res/drawable/ic_notification_error.xml diff --git a/notifications/src/main/res/drawable/ic_notification_success.xml b/notifications/src/main/res/drawable/ic_notification_success.xml new file mode 100644 index 0000000..290fb76 --- /dev/null +++ b/notifications/src/main/res/drawable/ic_notification_success.xml @@ -0,0 +1,10 @@ + + + diff --git a/notifications/src/main/res/values/strings.xml b/notifications/src/main/res/values/strings.xml index ba78f43..4462309 100644 --- a/notifications/src/main/res/values/strings.xml +++ b/notifications/src/main/res/values/strings.xml @@ -1,12 +1,18 @@ - Server Check Failures + Site Validation Failures - Notifications for Nock Nock status checks failing for your sites. Something has gone + Notifications for Nock Nock validations failing for your sites. Something has gone wrong if you see one of these. + Site Validation Success + + Notifications for Nock Nock when a site validation passes when it previously had not. + + Something\'s wrong! Tap for details. + Yay! No longer in trouble! Validation passed.