diff --git a/app/src/main/java/net/underdesk/circolapp/server/DataFetcher.kt b/app/src/main/java/net/underdesk/circolapp/server/DataFetcher.kt index e58e122..9c79001 100644 --- a/app/src/main/java/net/underdesk/circolapp/server/DataFetcher.kt +++ b/app/src/main/java/net/underdesk/circolapp/server/DataFetcher.kt @@ -19,6 +19,8 @@ package net.underdesk.circolapp.server import com.google.gson.Gson +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import net.underdesk.circolapp.data.Circular import net.underdesk.circolapp.server.pojo.Response import org.jsoup.Jsoup @@ -34,49 +36,53 @@ class DataFetcher { } @Throws(IOException::class) - fun getCircularsFromServer(): List { - val json = gson.fromJson(retrieveDataFromServer(), Response::class.java) + suspend fun getCircularsFromServer(): List { + return withContext(Dispatchers.Default) { + val json = gson.fromJson(retrieveDataFromServer(), Response::class.java) - val document = Jsoup.parseBodyFragment(json.content!!.rendered) - val htmlList = document.getElementsByTag("ul")[0].getElementsByTag("a") + val document = Jsoup.parseBodyFragment(json.content!!.rendered) + val htmlList = document.getElementsByTag("ul")[0].getElementsByTag("a") - val list = ArrayList() + val list = ArrayList() - htmlList.forEach { element -> - if (element.parents().size == 6) { - list.last().attachmentsNames.add(element.text()) - list.last().attachmentsUrls.add(element.attr("href")) - } else if (element.parents().size == 4) { - list.add(Circular.generateFromString(element.text(), element.attr("href"))) + htmlList.forEach { element -> + if (element.parents().size == 6) { + list.last().attachmentsNames.add(element.text()) + list.last().attachmentsUrls.add(element.attr("href")) + } else if (element.parents().size == 4) { + list.add(Circular.generateFromString(element.text(), element.attr("href"))) + } } - } - return list + list + } } @Throws(IOException::class) - fun retrieveDataFromServer(): String? { + private suspend fun retrieveDataFromServer(): String? { var connection: HttpsURLConnection? = null - return try { - connection = (URL(ENDPOINT_URL).openConnection() as? HttpsURLConnection) - connection?.run { - // Set GET HTTP method - requestMethod = "GET" - setRequestProperty("Accept-Encoding", "none") + return withContext(Dispatchers.IO) { + try { + connection = (URL(ENDPOINT_URL).openConnection() as? HttpsURLConnection) + connection?.run { + // Set GET HTTP method + requestMethod = "GET" - connect() - if (responseCode != HttpsURLConnection.HTTP_OK) { - throw IOException("HTTP error code: $responseCode") + setRequestProperty("Accept-Encoding", "none") + + connect() + if (responseCode != HttpsURLConnection.HTTP_OK) { + throw IOException("HTTP error code: $responseCode") + } + + inputStream?.reader()?.readText() } - - inputStream?.reader()?.readText() + } finally { + // Close Stream and disconnect HTTPS connection. + connection?.inputStream?.close() + connection?.disconnect() } - } finally { - // Close Stream and disconnect HTTPS connection. - connection?.inputStream?.close() - connection?.disconnect() } - } } \ No newline at end of file diff --git a/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModel.kt b/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModel.kt index 403315a..4aa55d6 100644 --- a/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModel.kt +++ b/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModel.kt @@ -19,10 +19,8 @@ package net.underdesk.circolapp.viewmodels import android.app.Application -import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.Transformations +import androidx.lifecycle.* +import kotlinx.coroutines.launch import net.underdesk.circolapp.data.AppDatabase import net.underdesk.circolapp.data.Circular import net.underdesk.circolapp.server.DataFetcher @@ -48,25 +46,23 @@ class CircularLetterViewModel(application: Application) : AndroidViewModel(appli fun updateCirculars() { if (isNotUpdating) { - object : Thread() { - override fun run() { - isNotUpdating = false - val fetcher = DataFetcher() + viewModelScope.launch { + isNotUpdating = false + val fetcher = DataFetcher() - try { - val newCirculars = fetcher.getCircularsFromServer() - if (newCirculars.size != circulars.value?.size ?: true) { - AppDatabase.getInstance(getApplication()).circularDao() - .insertAll(newCirculars) - } - } catch (exception: IOException) { - showMessage.postValue(true) - } finally { - isNotUpdating = true - circularsUpdated.postValue(true) + try { + val newCirculars = fetcher.getCircularsFromServer() + if (newCirculars.size != circulars.value?.size ?: true) { + AppDatabase.getInstance(getApplication()).circularDao() + .insertAll(newCirculars) } + } catch (exception: IOException) { + showMessage.postValue(true) + } finally { + isNotUpdating = true + circularsUpdated.postValue(true) } - }.start() + } } } } \ No newline at end of file diff --git a/app/src/main/java/net/underdesk/circolapp/works/PollWork.kt b/app/src/main/java/net/underdesk/circolapp/works/PollWork.kt index 2073aa1..800f79d 100644 --- a/app/src/main/java/net/underdesk/circolapp/works/PollWork.kt +++ b/app/src/main/java/net/underdesk/circolapp/works/PollWork.kt @@ -30,6 +30,9 @@ import androidx.core.app.NotificationManagerCompat import androidx.core.app.TaskStackBuilder import androidx.preference.PreferenceManager import androidx.work.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.withContext import net.underdesk.circolapp.MainActivity import net.underdesk.circolapp.R import net.underdesk.circolapp.data.AppDatabase @@ -40,7 +43,7 @@ import java.util.concurrent.TimeUnit class PollWork(appContext: Context, workerParams: WorkerParameters) : - Worker(appContext, workerParams) { + CoroutineWorker(appContext, workerParams) { companion object { const val CHANNEL_ID = "net.underdesk.circolapp.NEW_CIRCULAR" @@ -84,52 +87,59 @@ class PollWork(appContext: Context, workerParams: WorkerParameters) : } } - override fun doWork(): Result { + override suspend fun doWork(): Result = coroutineScope { val fetcher = DataFetcher() - val oldCirculars = AppDatabase.getInstance(applicationContext).circularDao().getCirculars() - val newCirculars = try { - fetcher.getCircularsFromServer() - } catch (exception: IOException) { - return Result.retry() - } - - if (newCirculars.size != oldCirculars.size) { - createNotificationChannel() - - val summaryStyle = NotificationCompat.InboxStyle() - .setBigContentTitle(applicationContext.getString(R.string.notification_summary_title)) - .setSummaryText(applicationContext.getString(R.string.notification_summary)) - - val circularCount = newCirculars.size - oldCirculars.size - - for (i in 0 until circularCount) { - createNotification(newCirculars[i]) - summaryStyle.addLine(newCirculars[i].name) + withContext(Dispatchers.IO) { + val oldCirculars = + AppDatabase.getInstance(applicationContext).circularDao().getCirculars() + val newCirculars = try { + fetcher.getCircularsFromServer() + } catch (exception: IOException) { + return@withContext Result.retry() } - val summaryNotification = NotificationCompat.Builder(applicationContext, CHANNEL_ID) - .setContentTitle(applicationContext.getString(R.string.notification_summary_title)) - .setContentText( - applicationContext.resources.getQuantityString( - R.plurals.notification_summary_text, - circularCount, - circularCount - ) - ) - .setSmallIcon(R.drawable.ic_notification) - .setStyle(summaryStyle) - .setGroup(CHANNEL_ID) - .setGroupSummary(true) - .build() + if (newCirculars.size != oldCirculars.size) { + withContext(Dispatchers.Main) { + createNotificationChannel() - with(NotificationManagerCompat.from(applicationContext)) { - notify(-1, summaryNotification) + val summaryStyle = NotificationCompat.InboxStyle() + .setBigContentTitle(applicationContext.getString(R.string.notification_summary_title)) + .setSummaryText(applicationContext.getString(R.string.notification_summary)) + + val circularCount = newCirculars.size - oldCirculars.size + + for (i in 0 until circularCount) { + createNotification(newCirculars[i]) + summaryStyle.addLine(newCirculars[i].name) + } + + val summaryNotification = + NotificationCompat.Builder(applicationContext, CHANNEL_ID) + .setContentTitle(applicationContext.getString(R.string.notification_summary_title)) + .setContentText( + applicationContext.resources.getQuantityString( + R.plurals.notification_summary_text, + circularCount, + circularCount + ) + ) + .setSmallIcon(R.drawable.ic_notification) + .setStyle(summaryStyle) + .setGroup(CHANNEL_ID) + .setGroupSummary(true) + .build() + + with(NotificationManagerCompat.from(applicationContext)) { + notify(-1, summaryNotification) + } + } + + AppDatabase.getInstance(applicationContext).circularDao() + .insertAll(newCirculars) } - - AppDatabase.getInstance(applicationContext).circularDao().insertAll(newCirculars) + Result.success() } - return Result.success() } private fun createNotification(circular: Circular) {