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.View
import android.view.ViewGroup
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.fragment_circular_letters.view.*
import net.underdesk.circolapp.R
import net.underdesk.circolapp.adapters.CircularLetterAdapter
@@ -49,6 +51,17 @@ class CircularLetterFragment : Fragment() {
circularLetterViewModel.circulars.observe(this, Observer {
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
}
}

View File

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

View File

@@ -11,4 +11,6 @@
<string name="channel_name">Circular letters</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>