mirror of
https://github.com/Matte23/circolapp.git
synced 2025-12-06 07:29:10 +00:00
Add swipe to refresh
This commit is contained in:
@@ -48,6 +48,7 @@ dependencies {
|
|||||||
implementation "androidx.work:work-runtime-ktx:2.2.0"
|
implementation "androidx.work:work-runtime-ktx:2.2.0"
|
||||||
implementation "androidx.room:room-runtime:2.2.0-rc01"
|
implementation "androidx.room:room-runtime:2.2.0-rc01"
|
||||||
implementation 'androidx.preference:preference:1.1.0'
|
implementation 'androidx.preference:preference:1.1.0'
|
||||||
|
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'
|
||||||
kapt "androidx.room:room-compiler:2.2.0-rc01"
|
kapt "androidx.room:room-compiler:2.2.0-rc01"
|
||||||
implementation "androidx.room:room-ktx:2.2.0-rc01"
|
implementation "androidx.room:room-ktx:2.2.0-rc01"
|
||||||
testImplementation 'junit:junit:4.12'
|
testImplementation 'junit:junit:4.12'
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
|
|||||||
}
|
}
|
||||||
|
|
||||||
var searchCallback: SearchCallback? = null
|
var searchCallback: SearchCallback? = null
|
||||||
|
var refreshCallback: RefreshCallback? = null
|
||||||
override var circularToDownload: Circular? = null
|
override var circularToDownload: Circular? = null
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
@@ -103,6 +104,10 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
|
|||||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
// Handle item selection
|
// Handle item selection
|
||||||
return when (item.itemId) {
|
return when (item.itemId) {
|
||||||
|
R.id.menu_main_refresh -> {
|
||||||
|
refreshCallback?.refresh()
|
||||||
|
true
|
||||||
|
}
|
||||||
R.id.menu_main_settings -> {
|
R.id.menu_main_settings -> {
|
||||||
startActivity(Intent(this, SettingsActivity::class.java))
|
startActivity(Intent(this, SettingsActivity::class.java))
|
||||||
true
|
true
|
||||||
@@ -176,4 +181,8 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
|
|||||||
interface SearchCallback {
|
interface SearchCallback {
|
||||||
fun search(query: String)
|
fun search(query: String)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface RefreshCallback {
|
||||||
|
fun refresh()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,13 +28,15 @@ 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 com.google.android.material.snackbar.Snackbar
|
||||||
|
import kotlinx.android.synthetic.main.fragment_circular_letters.*
|
||||||
import kotlinx.android.synthetic.main.fragment_circular_letters.view.*
|
import kotlinx.android.synthetic.main.fragment_circular_letters.view.*
|
||||||
import net.underdesk.circolapp.MainActivity
|
import net.underdesk.circolapp.MainActivity
|
||||||
import net.underdesk.circolapp.R
|
import net.underdesk.circolapp.R
|
||||||
import net.underdesk.circolapp.adapters.CircularLetterAdapter
|
import net.underdesk.circolapp.adapters.CircularLetterAdapter
|
||||||
import net.underdesk.circolapp.viewmodels.CircularLetterViewModel
|
import net.underdesk.circolapp.viewmodels.CircularLetterViewModel
|
||||||
|
|
||||||
class CircularLetterFragment : Fragment(), MainActivity.SearchCallback {
|
class CircularLetterFragment : Fragment(), MainActivity.SearchCallback,
|
||||||
|
MainActivity.RefreshCallback {
|
||||||
|
|
||||||
private lateinit var circularLetterViewModel: CircularLetterViewModel
|
private lateinit var circularLetterViewModel: CircularLetterViewModel
|
||||||
|
|
||||||
@@ -67,12 +69,27 @@ class CircularLetterFragment : Fragment(), MainActivity.SearchCallback {
|
|||||||
circularLetterViewModel.showMessage.postValue(false)
|
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).searchCallback = this
|
||||||
|
(activity as MainActivity).refreshCallback = this
|
||||||
return root
|
return root
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun search(query: String) {
|
override fun search(query: String) {
|
||||||
circularLetterViewModel.query.postValue(query)
|
circularLetterViewModel.query.postValue(query)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun refresh() {
|
||||||
|
circulars_refresh.isRefreshing = true
|
||||||
|
circularLetterViewModel.updateCirculars()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -44,6 +44,7 @@ class FavouritesFragment : Fragment(), MainActivity.SearchCallback {
|
|||||||
val root = inflater.inflate(R.layout.fragment_circular_letters, container, false)
|
val root = inflater.inflate(R.layout.fragment_circular_letters, container, false)
|
||||||
|
|
||||||
root.circulars_list.layoutManager = LinearLayoutManager(context)
|
root.circulars_list.layoutManager = LinearLayoutManager(context)
|
||||||
|
root.circulars_refresh.isEnabled = false
|
||||||
|
|
||||||
favouritesViewModel =
|
favouritesViewModel =
|
||||||
ViewModelProviders.of(this).get(FavouritesViewModel::class.java)
|
ViewModelProviders.of(this).get(FavouritesViewModel::class.java)
|
||||||
@@ -56,6 +57,7 @@ class FavouritesFragment : Fragment(), MainActivity.SearchCallback {
|
|||||||
})
|
})
|
||||||
|
|
||||||
(activity as MainActivity).searchCallback = this
|
(activity as MainActivity).searchCallback = this
|
||||||
|
(activity as MainActivity).refreshCallback = null
|
||||||
return root
|
return root
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ class RemindersFragment : Fragment(), MainActivity.SearchCallback {
|
|||||||
val root = inflater.inflate(R.layout.fragment_circular_letters, container, false)
|
val root = inflater.inflate(R.layout.fragment_circular_letters, container, false)
|
||||||
|
|
||||||
root.circulars_list.layoutManager = LinearLayoutManager(context)
|
root.circulars_list.layoutManager = LinearLayoutManager(context)
|
||||||
|
root.circulars_refresh.isEnabled = false
|
||||||
|
|
||||||
remindersViewModel =
|
remindersViewModel =
|
||||||
ViewModelProviders.of(this).get(RemindersViewModel::class.java)
|
ViewModelProviders.of(this).get(RemindersViewModel::class.java)
|
||||||
@@ -56,6 +57,7 @@ class RemindersFragment : Fragment(), MainActivity.SearchCallback {
|
|||||||
})
|
})
|
||||||
|
|
||||||
(activity as MainActivity).searchCallback = this
|
(activity as MainActivity).searchCallback = this
|
||||||
|
(activity as MainActivity).refreshCallback = null
|
||||||
return root
|
return root
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,11 +30,7 @@ import java.io.IOException
|
|||||||
|
|
||||||
class CircularLetterViewModel(application: Application) : AndroidViewModel(application) {
|
class CircularLetterViewModel(application: Application) : AndroidViewModel(application) {
|
||||||
init {
|
init {
|
||||||
object : Thread() {
|
updateCirculars()
|
||||||
override fun run() {
|
|
||||||
updateCirculars()
|
|
||||||
}
|
|
||||||
}.start()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val query = MutableLiveData<String>("")
|
val query = MutableLiveData<String>("")
|
||||||
@@ -47,18 +43,31 @@ class CircularLetterViewModel(application: Application) : AndroidViewModel(appli
|
|||||||
}
|
}
|
||||||
|
|
||||||
val showMessage = MutableLiveData<Boolean>().apply { value = false }
|
val showMessage = MutableLiveData<Boolean>().apply { value = false }
|
||||||
|
val circularsUpdated = MutableLiveData<Boolean>().apply { value = false }
|
||||||
|
private var isNotUpdating = true
|
||||||
|
|
||||||
private fun updateCirculars() {
|
fun updateCirculars() {
|
||||||
val fetcher = DataFetcher()
|
if (isNotUpdating) {
|
||||||
|
object : Thread() {
|
||||||
|
override fun run() {
|
||||||
|
isNotUpdating = false
|
||||||
|
val fetcher = DataFetcher()
|
||||||
|
|
||||||
try {
|
try {
|
||||||
val newCirculars = fetcher.getCircularsFromServer()
|
val newCirculars = fetcher.getCircularsFromServer()
|
||||||
if (newCirculars.size != circulars.value?.size ?: true) {
|
if (newCirculars.size != circulars.value?.size ?: true) {
|
||||||
AppDatabase.getInstance(getApplication()).circularDao().deleteAll()
|
AppDatabase.getInstance(getApplication()).circularDao().deleteAll()
|
||||||
AppDatabase.getInstance(getApplication()).circularDao().insertAll(newCirculars)
|
AppDatabase.getInstance(getApplication()).circularDao()
|
||||||
}
|
.insertAll(newCirculars)
|
||||||
} catch (exception: IOException) {
|
}
|
||||||
showMessage.postValue(true)
|
circularsUpdated.postValue(true)
|
||||||
|
} catch (exception: IOException) {
|
||||||
|
showMessage.postValue(true)
|
||||||
|
} finally {
|
||||||
|
isNotUpdating = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.start()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?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_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
@@ -7,4 +8,4 @@
|
|||||||
android:id="@+id/circulars_list"
|
android:id="@+id/circulars_list"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent" />
|
android:layout_height="match_parent" />
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||||
@@ -8,6 +8,10 @@
|
|||||||
android:title="@string/menu_search"
|
android:title="@string/menu_search"
|
||||||
app:actionViewClass="androidx.appcompat.widget.SearchView"
|
app:actionViewClass="androidx.appcompat.widget.SearchView"
|
||||||
app:showAsAction="ifRoom" />
|
app:showAsAction="ifRoom" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/menu_main_refresh"
|
||||||
|
android:title="@string/menu_refresh"
|
||||||
|
app:showAsAction="never" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/menu_main_settings"
|
android:id="@+id/menu_main_settings"
|
||||||
android:title="@string/title_settings" />
|
android:title="@string/title_settings" />
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
<string name="menu_about">About</string>
|
<string name="menu_about">About</string>
|
||||||
<string name="menu_search">Search</string>
|
<string name="menu_search">Search</string>
|
||||||
|
<string name="menu_refresh">Refresh</string>
|
||||||
|
|
||||||
<string name="preferences_general_header">General</string>
|
<string name="preferences_general_header">General</string>
|
||||||
<string name="preference_notifications_header">Notifications</string>
|
<string name="preference_notifications_header">Notifications</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user