Skip to content

Commit d5a53ff

Browse files
authored
Use Flow instead of LiveData in the Test App (readium#461)
1 parent 2a3fbfe commit d5a53ff

File tree

7 files changed

+48
-24
lines changed

7 files changed

+48
-24
lines changed

test-app/src/main/java/org/readium/r2/testapp/bookshelf/BookshelfFragment.kt

+11-3
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,13 @@ import androidx.activity.result.ActivityResultLauncher
1919
import androidx.activity.result.contract.ActivityResultContracts
2020
import androidx.fragment.app.Fragment
2121
import androidx.fragment.app.activityViewModels
22+
import androidx.lifecycle.Lifecycle
23+
import androidx.lifecycle.lifecycleScope
24+
import androidx.lifecycle.repeatOnLifecycle
2225
import androidx.recyclerview.widget.RecyclerView
2326
import com.google.android.material.dialog.MaterialAlertDialogBuilder
27+
import kotlinx.coroutines.flow.collectLatest
28+
import kotlinx.coroutines.launch
2429
import org.readium.r2.shared.util.AbsoluteUrl
2530
import org.readium.r2.testapp.Application
2631
import org.readium.r2.testapp.R
@@ -103,9 +108,12 @@ class BookshelfFragment : Fragment() {
103108
)
104109
)
105110
}
106-
107-
bookshelfViewModel.books.observe(viewLifecycleOwner) {
108-
bookshelfAdapter.submitList(it)
111+
lifecycleScope.launch {
112+
repeatOnLifecycle(Lifecycle.State.STARTED) {
113+
bookshelfViewModel.books.collectLatest {
114+
bookshelfAdapter.submitList(it)
115+
}
116+
}
109117
}
110118

111119
binding.bookshelfAddBookFab.setOnClickListener {

test-app/src/main/java/org/readium/r2/testapp/catalogs/CatalogFeedListFragment.kt

+12-3
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,15 @@ import android.widget.EditText
1818
import androidx.appcompat.app.AlertDialog
1919
import androidx.fragment.app.Fragment
2020
import androidx.fragment.app.viewModels
21+
import androidx.lifecycle.Lifecycle
22+
import androidx.lifecycle.lifecycleScope
23+
import androidx.lifecycle.repeatOnLifecycle
2124
import androidx.recyclerview.widget.LinearLayoutManager
2225
import androidx.recyclerview.widget.RecyclerView
2326
import com.google.android.material.dialog.MaterialAlertDialogBuilder
2427
import com.google.android.material.snackbar.Snackbar
28+
import kotlinx.coroutines.flow.collectLatest
29+
import kotlinx.coroutines.launch
2530
import org.readium.r2.testapp.R
2631
import org.readium.r2.testapp.data.model.Catalog
2732
import org.readium.r2.testapp.databinding.FragmentCatalogFeedListBinding
@@ -62,9 +67,13 @@ class CatalogFeedListFragment : Fragment() {
6267
)
6368
}
6469

65-
catalogFeedListViewModel.catalogs.observe(viewLifecycleOwner, {
66-
catalogsAdapter.submitList(it)
67-
})
70+
lifecycleScope.launch {
71+
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
72+
catalogFeedListViewModel.catalogs.collectLatest {
73+
catalogsAdapter.submitList(it)
74+
}
75+
}
76+
}
6877

6978
val version = 2
7079
val VERSION_KEY = "OPDS_CATALOG_VERSION"

test-app/src/main/java/org/readium/r2/testapp/data/BookRepository.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
package org.readium.r2.testapp.data
88

99
import androidx.annotation.ColorInt
10-
import androidx.lifecycle.LiveData
1110
import java.io.File
1211
import kotlinx.coroutines.flow.Flow
1312
import org.joda.time.DateTime
@@ -25,7 +24,7 @@ import org.readium.r2.testapp.utils.extensions.readium.authorName
2524
class BookRepository(
2625
private val booksDao: BooksDao
2726
) {
28-
fun books(): LiveData<List<Book>> = booksDao.getAllBooks()
27+
fun books(): Flow<List<Book>> = booksDao.getAllBooks()
2928

3029
suspend fun get(id: Long) = booksDao.get(id)
3130

@@ -48,7 +47,7 @@ class BookRepository(
4847
return booksDao.insertBookmark(bookmark)
4948
}
5049

51-
fun bookmarksForBook(bookId: Long): LiveData<List<Bookmark>> =
50+
fun bookmarksForBook(bookId: Long): Flow<List<Bookmark>> =
5251
booksDao.getBookmarksForBook(bookId)
5352

5453
suspend fun deleteBookmark(bookmarkId: Long) = booksDao.deleteBookmark(bookmarkId)

test-app/src/main/java/org/readium/r2/testapp/data/CatalogRepository.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
package org.readium.r2.testapp.data
88

9-
import androidx.lifecycle.LiveData
9+
import kotlinx.coroutines.flow.Flow
1010
import org.readium.r2.testapp.data.db.CatalogDao
1111
import org.readium.r2.testapp.data.model.Catalog
1212

@@ -16,7 +16,7 @@ class CatalogRepository(private val catalogDao: CatalogDao) {
1616
return catalogDao.insertCatalog(catalog)
1717
}
1818

19-
fun getCatalogsFromDatabase(): LiveData<List<Catalog>> = catalogDao.getCatalogModels()
19+
fun getCatalogsFromDatabase(): Flow<List<Catalog>> = catalogDao.getCatalogModels()
2020

2121
suspend fun deleteCatalog(id: Long) = catalogDao.deleteCatalog(id)
2222
}

test-app/src/main/java/org/readium/r2/testapp/data/db/BooksDao.kt

+4-5
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
package org.readium.r2.testapp.data.db
88

99
import androidx.annotation.ColorInt
10-
import androidx.lifecycle.LiveData
1110
import androidx.room.Dao
1211
import androidx.room.Insert
1312
import androidx.room.OnConflictStrategy
@@ -43,18 +42,18 @@ interface BooksDao {
4342

4443
/**
4544
* Retrieve all books
46-
* @return List of books as LiveData
45+
* @return List of books as Flow
4746
*/
4847
@Query("SELECT * FROM " + Book.TABLE_NAME + " ORDER BY " + Book.CREATION_DATE + " desc")
49-
fun getAllBooks(): LiveData<List<Book>>
48+
fun getAllBooks(): Flow<List<Book>>
5049

5150
/**
5251
* Retrieve all bookmarks for a specific book
5352
* @param bookId The ID of the book
54-
* @return List of bookmarks for the book as LiveData
53+
* @return List of bookmarks for the book as Flow
5554
*/
5655
@Query("SELECT * FROM " + Bookmark.TABLE_NAME + " WHERE " + Bookmark.BOOK_ID + " = :bookId")
57-
fun getBookmarksForBook(bookId: Long): LiveData<List<Bookmark>>
56+
fun getBookmarksForBook(bookId: Long): Flow<List<Bookmark>>
5857

5958
/**
6059
* Retrieve all highlights for a specific book

test-app/src/main/java/org/readium/r2/testapp/data/db/CatalogDao.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66

77
package org.readium.r2.testapp.data.db
88

9-
import androidx.lifecycle.LiveData
109
import androidx.room.Dao
1110
import androidx.room.Insert
1211
import androidx.room.OnConflictStrategy
1312
import androidx.room.Query
13+
import kotlinx.coroutines.flow.Flow
1414
import org.readium.r2.testapp.data.model.Catalog
1515

1616
@Dao
@@ -26,19 +26,19 @@ interface CatalogDao {
2626

2727
/**
2828
* Retrieve list of Catalog models based on Catalog model
29-
* @return List of Catalog models as LiveData
29+
* @return List of Catalog models as Flow
3030
*/
3131
@Query(
3232
"SELECT * FROM " + Catalog.TABLE_NAME + " WHERE " + Catalog.TITLE + " = :title AND " + Catalog.HREF + " = :href AND " + Catalog.TYPE + " = :type"
3333
)
34-
fun getCatalogModels(title: String, href: String, type: Int): LiveData<List<Catalog>>
34+
fun getCatalogModels(title: String, href: String, type: Int): Flow<List<Catalog>>
3535

3636
/**
3737
* Retrieve list of all Catalog models
38-
* @return List of Catalog models as LiveData
38+
* @return List of Catalog models as Flow
3939
*/
4040
@Query("SELECT * FROM " + Catalog.TABLE_NAME)
41-
fun getCatalogModels(): LiveData<List<Catalog>>
41+
fun getCatalogModels(): Flow<List<Catalog>>
4242

4343
/**
4444
* Deletes an Catalog model

test-app/src/main/java/org/readium/r2/testapp/outline/BookmarksFragment.kt

+12-3
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ import android.view.ViewGroup
1313
import androidx.appcompat.widget.PopupMenu
1414
import androidx.fragment.app.Fragment
1515
import androidx.fragment.app.setFragmentResult
16+
import androidx.lifecycle.Lifecycle
1617
import androidx.lifecycle.ViewModelProvider
18+
import androidx.lifecycle.lifecycleScope
19+
import androidx.lifecycle.repeatOnLifecycle
1720
import androidx.recyclerview.widget.DiffUtil
1821
import androidx.recyclerview.widget.LinearLayoutManager
1922
import androidx.recyclerview.widget.ListAdapter
2023
import androidx.recyclerview.widget.RecyclerView
2124
import kotlin.math.roundToInt
25+
import kotlinx.coroutines.flow.collectLatest
26+
import kotlinx.coroutines.launch
2227
import org.joda.time.DateTime
2328
import org.joda.time.format.DateTimeFormat
2429
import org.readium.r2.shared.publication.Publication
@@ -73,9 +78,13 @@ class BookmarksFragment : Fragment() {
7378
{ it.resourceIndex },
7479
{ it.locator.locations.progression }
7580
)
76-
viewModel.getBookmarks().observe(viewLifecycleOwner) {
77-
val bookmarks = it.sortedWith(comparator)
78-
bookmarkAdapter.submitList(bookmarks)
81+
lifecycleScope.launch {
82+
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
83+
viewModel.getBookmarks().collectLatest {
84+
val bookmarks = it.sortedWith(comparator)
85+
bookmarkAdapter.submitList(bookmarks)
86+
}
87+
}
7988
}
8089
}
8190

0 commit comments

Comments
 (0)