diff --git a/app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt b/app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt index fe5e7bf..42a9d99 100644 --- a/app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt +++ b/app/src/main/java/io/heckel/ntfy/ui/MainActivity.kt @@ -7,10 +7,7 @@ import android.content.Intent import android.net.Uri import android.os.Bundle import android.util.Log -import android.view.ActionMode -import android.view.Menu -import android.view.MenuItem -import android.view.View +import android.view.* import android.widget.Toast import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity @@ -309,10 +306,12 @@ class MainActivity : AppCompatActivity(), ActionMode.Callback, AddFragment.Subsc private fun refreshAllSubscriptions() { lifecycleScope.launch(Dispatchers.IO) { - try { - Log.d(TAG, "Polling for new notifications") - var newNotificationsCount = 0 - repository.getSubscriptions().forEach { subscription -> + Log.d(TAG, "Polling for new notifications") + var errors = 0 + var errorMessage = "" // First error + var newNotificationsCount = 0 + repository.getSubscriptions().forEach { subscription -> + try { val notifications = api.poll(subscription.id, subscription.baseUrl, subscription.topic) val newNotifications = repository.onlyNewNotifications(subscription.id, notifications) newNotifications.forEach { notification -> @@ -326,24 +325,24 @@ class MainActivity : AppCompatActivity(), ActionMode.Callback, AddFragment.Subsc broadcaster?.send(subscription, notification, result.muted) } } - } - val toastMessage = if (newNotificationsCount == 0) { - getString(R.string.refresh_message_no_results) - } else { - getString(R.string.refresh_message_result, newNotificationsCount) - } - runOnUiThread { - Toast.makeText(this@MainActivity, toastMessage, Toast.LENGTH_LONG).show() - mainListContainer.isRefreshing = false - } - Log.d(TAG, "Finished polling for new notifications") - } catch (e: Exception) { - Log.e(TAG, "Polling failed: ${e.message}", e) - runOnUiThread { - Toast.makeText(this@MainActivity, getString(R.string.refresh_message_error, e.message), Toast.LENGTH_LONG).show() - mainListContainer.isRefreshing = false + } catch (e: Exception) { + val topic = topicShortUrl(subscription.baseUrl, subscription.topic) + if (errorMessage == "") errorMessage = "$topic: ${e.message}" + errors++ } } + val toastMessage = if (errors > 0) { + getString(R.string.refresh_message_error, errors, errorMessage) + } else if (newNotificationsCount == 0) { + getString(R.string.refresh_message_no_results) + } else { + getString(R.string.refresh_message_result, newNotificationsCount) + } + runOnUiThread { + Toast.makeText(this@MainActivity, toastMessage, Toast.LENGTH_LONG).show() + mainListContainer.isRefreshing = false + } + Log.d(TAG, "Finished polling for new notifications") } } diff --git a/app/src/main/java/io/heckel/ntfy/work/PollWorker.kt b/app/src/main/java/io/heckel/ntfy/work/PollWorker.kt index 4c812df..8828e23 100644 --- a/app/src/main/java/io/heckel/ntfy/work/PollWorker.kt +++ b/app/src/main/java/io/heckel/ntfy/work/PollWorker.kt @@ -29,8 +29,8 @@ class PollWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, val broadcaster = BroadcastService(applicationContext) val api = ApiService() - try { - repository.getSubscriptions().forEach{ subscription -> + repository.getSubscriptions().forEach{ subscription -> + try { val notifications = api.poll(subscription.id, subscription.baseUrl, subscription.topic) val newNotifications = repository .onlyNewNotifications(subscription.id, notifications) @@ -44,18 +44,17 @@ class PollWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, broadcaster.send(subscription, notification, result.muted) } } + } catch (e: Exception) { + Log.e(TAG, "Failed checking messages: ${e.message}", e) } - Log.d(TAG, "Finished polling for new notifications") - return@withContext Result.success() - } catch (e: Exception) { - Log.e(TAG, "Failed checking messages: ${e.message}", e) - return@withContext Result.failure() } + Log.d(TAG, "Finished polling for new notifications") + return@withContext Result.success() } } companion object { - const val VERSION = BuildConfig.VERSION_CODE + const val VERSION = BuildConfig.VERSION_CODE const val TAG = "NtfyPollWorker" const val WORK_NAME_PERIODIC = "NtfyPollWorkerPeriodic" } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fb59ccc..5fe54e6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -23,7 +23,7 @@ %1$d notification(s) received Everything is up-to-date - Could not refresh topic: %1$s + %1$d subscription(s) could not be refreshed\n\n%2$s Subscribed topics