From 275c819be5f75e81a264fd3349ecf5fd8cd2e1a3 Mon Sep 17 00:00:00 2001 From: Matte23 Date: Wed, 25 Sep 2019 19:41:45 +0200 Subject: [PATCH] Add swipe to refresh --- app/build.gradle | 1 + .../net/underdesk/circolapp/MainActivity.kt | 9 +++++ .../fragments/CircularLetterFragment.kt | 19 ++++++++- .../circolapp/fragments/FavouritesFragment.kt | 2 + .../circolapp/fragments/RemindersFragment.kt | 2 + .../viewmodels/CircularLetterViewModel.kt | 39 ++++++++++++------- .../res/layout/fragment_circular_letters.xml | 5 ++- app/src/main/res/menu/menu_main.xml | 4 ++ app/src/main/res/values/strings.xml | 1 + 9 files changed, 64 insertions(+), 18 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e425768..cdf9b92 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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' diff --git a/app/src/main/java/net/underdesk/circolapp/MainActivity.kt b/app/src/main/java/net/underdesk/circolapp/MainActivity.kt index 5663e74..72b1a84 100644 --- a/app/src/main/java/net/underdesk/circolapp/MainActivity.kt +++ b/app/src/main/java/net/underdesk/circolapp/MainActivity.kt @@ -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() + } } diff --git a/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt b/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt index 4f2f060..e9c1e9d 100644 --- a/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt +++ b/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt @@ -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() + } } \ No newline at end of file diff --git a/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt b/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt index bae49ba..b292275 100644 --- a/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt +++ b/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt @@ -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 } diff --git a/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt b/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt index e02374c..91180f0 100644 --- a/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt +++ b/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt @@ -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 } 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 76a6925..f932d9e 100644 --- a/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModel.kt +++ b/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModel.kt @@ -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("") @@ -47,18 +43,31 @@ class CircularLetterViewModel(application: Application) : AndroidViewModel(appli } val showMessage = MutableLiveData().apply { value = false } + val circularsUpdated = MutableLiveData().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() } } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_circular_letters.xml b/app/src/main/res/layout/fragment_circular_letters.xml index f92642b..960c9d0 100644 --- a/app/src/main/res/layout/fragment_circular_letters.xml +++ b/app/src/main/res/layout/fragment_circular_letters.xml @@ -1,5 +1,6 @@ - @@ -7,4 +8,4 @@ android:id="@+id/circulars_list" android:layout_width="match_parent" android:layout_height="match_parent" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index b8a71fb..5f85753 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -8,6 +8,10 @@ android:title="@string/menu_search" app:actionViewClass="androidx.appcompat.widget.SearchView" app:showAsAction="ifRoom" /> + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b92ad80..6784c97 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,6 +8,7 @@ About Search + Refresh General Notifications