Add swipe to refresh

This commit is contained in:
2019-09-25 19:41:45 +02:00
committed by Matte23
parent d3915dc020
commit 275c819be5
9 changed files with 64 additions and 18 deletions

View File

@@ -48,6 +48,7 @@ dependencies {
implementation "androidx.work:work-runtime-ktx:2.2.0"
implementation "androidx.room:room-runtime:2.2.0-rc01"
implementation 'androidx.preference:preference:1.1.0'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'
kapt "androidx.room:room-compiler:2.2.0-rc01"
implementation "androidx.room:room-ktx:2.2.0-rc01"
testImplementation 'junit:junit:4.12'

View File

@@ -48,6 +48,7 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
}
var searchCallback: SearchCallback? = null
var refreshCallback: RefreshCallback? = null
override var circularToDownload: Circular? = null
override fun onCreate(savedInstanceState: Bundle?) {
@@ -103,6 +104,10 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// Handle item selection
return when (item.itemId) {
R.id.menu_main_refresh -> {
refreshCallback?.refresh()
true
}
R.id.menu_main_settings -> {
startActivity(Intent(this, SettingsActivity::class.java))
true
@@ -176,4 +181,8 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
interface SearchCallback {
fun search(query: String)
}
interface RefreshCallback {
fun refresh()
}
}

View File

@@ -28,13 +28,15 @@ 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.*
import kotlinx.android.synthetic.main.fragment_circular_letters.view.*
import net.underdesk.circolapp.MainActivity
import net.underdesk.circolapp.R
import net.underdesk.circolapp.adapters.CircularLetterAdapter
import net.underdesk.circolapp.viewmodels.CircularLetterViewModel
class CircularLetterFragment : Fragment(), MainActivity.SearchCallback {
class CircularLetterFragment : Fragment(), MainActivity.SearchCallback,
MainActivity.RefreshCallback {
private lateinit var circularLetterViewModel: CircularLetterViewModel
@@ -67,12 +69,27 @@ class CircularLetterFragment : Fragment(), MainActivity.SearchCallback {
circularLetterViewModel.showMessage.postValue(false)
}
})
circularLetterViewModel.circularsUpdated.observe(this, Observer {
if (it) {
root.circulars_refresh.isRefreshing = false
circularLetterViewModel.showMessage.postValue(false)
}
})
root.circulars_refresh.setOnRefreshListener { circularLetterViewModel.updateCirculars() }
(activity as MainActivity).searchCallback = this
(activity as MainActivity).refreshCallback = this
return root
}
override fun search(query: String) {
circularLetterViewModel.query.postValue(query)
}
override fun refresh() {
circulars_refresh.isRefreshing = true
circularLetterViewModel.updateCirculars()
}
}

View File

@@ -44,6 +44,7 @@ class FavouritesFragment : Fragment(), MainActivity.SearchCallback {
val root = inflater.inflate(R.layout.fragment_circular_letters, container, false)
root.circulars_list.layoutManager = LinearLayoutManager(context)
root.circulars_refresh.isEnabled = false
favouritesViewModel =
ViewModelProviders.of(this).get(FavouritesViewModel::class.java)
@@ -56,6 +57,7 @@ class FavouritesFragment : Fragment(), MainActivity.SearchCallback {
})
(activity as MainActivity).searchCallback = this
(activity as MainActivity).refreshCallback = null
return root
}

View File

@@ -44,6 +44,7 @@ class RemindersFragment : Fragment(), MainActivity.SearchCallback {
val root = inflater.inflate(R.layout.fragment_circular_letters, container, false)
root.circulars_list.layoutManager = LinearLayoutManager(context)
root.circulars_refresh.isEnabled = false
remindersViewModel =
ViewModelProviders.of(this).get(RemindersViewModel::class.java)
@@ -56,6 +57,7 @@ class RemindersFragment : Fragment(), MainActivity.SearchCallback {
})
(activity as MainActivity).searchCallback = this
(activity as MainActivity).refreshCallback = null
return root
}

View File

@@ -30,11 +30,7 @@ import java.io.IOException
class CircularLetterViewModel(application: Application) : AndroidViewModel(application) {
init {
object : Thread() {
override fun run() {
updateCirculars()
}
}.start()
updateCirculars()
}
val query = MutableLiveData<String>("")
@@ -47,18 +43,31 @@ class CircularLetterViewModel(application: Application) : AndroidViewModel(appli
}
val showMessage = MutableLiveData<Boolean>().apply { value = false }
val circularsUpdated = MutableLiveData<Boolean>().apply { value = false }
private var isNotUpdating = true
private fun updateCirculars() {
val fetcher = DataFetcher()
fun updateCirculars() {
if (isNotUpdating) {
object : Thread() {
override fun run() {
isNotUpdating = false
val fetcher = DataFetcher()
try {
val newCirculars = fetcher.getCircularsFromServer()
if (newCirculars.size != circulars.value?.size ?: true) {
AppDatabase.getInstance(getApplication()).circularDao().deleteAll()
AppDatabase.getInstance(getApplication()).circularDao().insertAll(newCirculars)
}
} catch (exception: IOException) {
showMessage.postValue(true)
try {
val newCirculars = fetcher.getCircularsFromServer()
if (newCirculars.size != circulars.value?.size ?: true) {
AppDatabase.getInstance(getApplication()).circularDao().deleteAll()
AppDatabase.getInstance(getApplication()).circularDao()
.insertAll(newCirculars)
}
circularsUpdated.postValue(true)
} catch (exception: IOException) {
showMessage.postValue(true)
} finally {
isNotUpdating = true
}
}
}.start()
}
}
}

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/circulars_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -7,4 +8,4 @@
android:id="@+id/circulars_list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

View File

@@ -8,6 +8,10 @@
android:title="@string/menu_search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_main_refresh"
android:title="@string/menu_refresh"
app:showAsAction="never" />
<item
android:id="@+id/menu_main_settings"
android:title="@string/title_settings" />

View File

@@ -8,6 +8,7 @@
<string name="menu_about">About</string>
<string name="menu_search">Search</string>
<string name="menu_refresh">Refresh</string>
<string name="preferences_general_header">General</string>
<string name="preference_notifications_header">Notifications</string>