Add support for offline use

This commit is contained in:
2019-09-19 19:26:36 +02:00
committed by Matte23
parent 0c8dde05a5
commit 4a9533a756
4 changed files with 32 additions and 6 deletions

View File

@@ -22,10 +22,12 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.fragment_circular_letters.view.* import kotlinx.android.synthetic.main.fragment_circular_letters.view.*
import net.underdesk.circolapp.R import net.underdesk.circolapp.R
import net.underdesk.circolapp.adapters.CircularLetterAdapter import net.underdesk.circolapp.adapters.CircularLetterAdapter
@@ -49,6 +51,17 @@ class CircularLetterFragment : Fragment() {
circularLetterViewModel.circulars.observe(this, Observer { circularLetterViewModel.circulars.observe(this, Observer {
root.circulars_list.adapter = CircularLetterAdapter(it) root.circulars_list.adapter = CircularLetterAdapter(it)
}) })
circularLetterViewModel.showMessage.observe(this, Observer {
if (it) activity?.findViewById<ConstraintLayout>(R.id.container)?.let { view ->
Snackbar.make(
view,
getString(R.string.snackbar_connection_not_available),
Snackbar.LENGTH_LONG
).show()
circularLetterViewModel.showMessage.postValue(false)
}
})
return root return root
} }
} }

View File

@@ -25,6 +25,7 @@ import androidx.lifecycle.MutableLiveData
import net.underdesk.circolapp.data.AppDatabase import net.underdesk.circolapp.data.AppDatabase
import net.underdesk.circolapp.data.Circular import net.underdesk.circolapp.data.Circular
import net.underdesk.circolapp.server.DataFetcher import net.underdesk.circolapp.server.DataFetcher
import java.io.IOException
class CircularLetterViewModel(application: Application) : AndroidViewModel(application) { class CircularLetterViewModel(application: Application) : AndroidViewModel(application) {
@@ -35,6 +36,7 @@ class CircularLetterViewModel(application: Application) : AndroidViewModel(appli
} }
val circulars: LiveData<List<Circular>> = _circulars val circulars: LiveData<List<Circular>> = _circulars
val showMessage = MutableLiveData<Boolean>().apply { value = false }
private fun loadCirculars() { private fun loadCirculars() {
object : Thread() { object : Thread() {
@@ -48,11 +50,15 @@ class CircularLetterViewModel(application: Application) : AndroidViewModel(appli
private fun updateCirculars() { private fun updateCirculars() {
val fetcher = DataFetcher() val fetcher = DataFetcher()
val newCirculars = fetcher.getCircularsFromServer() try {
if (newCirculars.size != _circulars.value?.size ?: true) { val newCirculars = fetcher.getCircularsFromServer()
_circulars.postValue(newCirculars) if (newCirculars.size != _circulars.value?.size ?: true) {
AppDatabase.getInstance(getApplication()).circularDao().deleteAll() _circulars.postValue(newCirculars)
AppDatabase.getInstance(getApplication()).circularDao().insertAll(newCirculars) AppDatabase.getInstance(getApplication()).circularDao().deleteAll()
AppDatabase.getInstance(getApplication()).circularDao().insertAll(newCirculars)
}
} catch (exception: IOException) {
showMessage.postValue(true)
} }
} }
} }

View File

@@ -32,6 +32,7 @@ import net.underdesk.circolapp.R
import net.underdesk.circolapp.data.AppDatabase import net.underdesk.circolapp.data.AppDatabase
import net.underdesk.circolapp.data.Circular import net.underdesk.circolapp.data.Circular
import net.underdesk.circolapp.server.DataFetcher import net.underdesk.circolapp.server.DataFetcher
import java.io.IOException
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@@ -72,7 +73,11 @@ class PollWork(appContext: Context, workerParams: WorkerParameters) :
val fetcher = DataFetcher() val fetcher = DataFetcher()
val oldCirculars = AppDatabase.getInstance(applicationContext).circularDao().getCirculars() val oldCirculars = AppDatabase.getInstance(applicationContext).circularDao().getCirculars()
val newCirculars = fetcher.getCircularsFromServer() val newCirculars = try {
fetcher.getCircularsFromServer()
} catch (exception: IOException) {
return Result.retry()
}
if (newCirculars.size != oldCirculars.size) { if (newCirculars.size != oldCirculars.size) {
createNotificationChannel() createNotificationChannel()

View File

@@ -11,4 +11,6 @@
<string name="channel_name">Circular letters</string> <string name="channel_name">Circular letters</string>
<string name="channel_description">Notify when your school issue a new circular letter</string> <string name="channel_description">Notify when your school issue a new circular letter</string>
<string name="snackbar_connection_not_available">Network not available. Results may be outdated</string>
</resources> </resources>