Skip to content

Commit 46bce45

Browse files
authored
Follow-up to DAO updates. (#5857)
1 parent beb3f4f commit 46bce45

File tree

3 files changed

+73
-23
lines changed

3 files changed

+73
-23
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.wikipedia.extensions
2+
3+
import android.app.Activity
4+
import androidx.appcompat.app.AppCompatActivity
5+
import androidx.lifecycle.Lifecycle
6+
7+
val Activity.isStarted get(): Boolean {
8+
return ((this as AppCompatActivity).lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED))
9+
}

app/src/main/java/org/wikipedia/readinglist/ReadingListBehaviorsUtil.kt

Lines changed: 62 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import android.icu.text.ListFormatter
66
import android.os.Build
77
import android.text.Spanned
88
import androidx.appcompat.app.AppCompatActivity
9-
import androidx.lifecycle.lifecycleScope
109
import com.google.android.material.dialog.MaterialAlertDialogBuilder
1110
import kotlinx.coroutines.CoroutineExceptionHandler
1211
import kotlinx.coroutines.CoroutineScope
@@ -19,6 +18,7 @@ import org.wikipedia.Constants.InvokeSource
1918
import org.wikipedia.R
2019
import org.wikipedia.database.AppDatabase
2120
import org.wikipedia.dataclient.ServiceFactory
21+
import org.wikipedia.extensions.isStarted
2222
import org.wikipedia.page.ExclusiveBottomSheetPresenter
2323
import org.wikipedia.page.PageTitle
2424
import org.wikipedia.readinglist.database.ReadingList
@@ -71,6 +71,9 @@ object ReadingListBehaviorsUtil {
7171
}
7272
AppDatabase.instance.readingListPageDao()
7373
.markPagesForOffline(selectedPages, true, forcedSave)
74+
if (!activity.isStarted) {
75+
return@launch
76+
}
7477
showMultiSelectOfflineStateChangeSnackbar(activity, selectedPages, true)
7578
}
7679
}
@@ -80,6 +83,9 @@ object ReadingListBehaviorsUtil {
8083
if (selectedPages.isNotEmpty()) {
8184
MainScope().launch(exceptionHandler) {
8285
AppDatabase.instance.readingListPageDao().markPagesForOffline(selectedPages, offline = false, forcedSave = false)
86+
if (!activity.isStarted) {
87+
return@launch
88+
}
8389
showMultiSelectOfflineStateChangeSnackbar(activity, selectedPages, false)
8490
callback.onCompleted()
8591
}
@@ -98,6 +104,9 @@ object ReadingListBehaviorsUtil {
98104
AppDatabase.instance.readingListDao().deleteList(readingList)
99105
AppDatabase.instance.readingListPageDao()
100106
.markPagesForDeletion(readingList, readingList.pages, false)
107+
if (!activity.isStarted) {
108+
return@launch
109+
}
101110
callback.onCompleted()
102111
}
103112
}
@@ -108,6 +117,9 @@ object ReadingListBehaviorsUtil {
108117
AppDatabase.instance.readingListDao().deleteList(readingList)
109118
AppDatabase.instance.readingListPageDao()
110119
.markPagesForDeletion(readingList, readingList.pages, false)
120+
if (!activity.isStarted) {
121+
return@launch
122+
}
111123
callback.onCompleted()
112124
}
113125
}
@@ -123,6 +135,9 @@ object ReadingListBehaviorsUtil {
123135
AppDatabase.instance.readingListDao().deleteList(it)
124136
AppDatabase.instance.readingListPageDao().markPagesForDeletion(it, it.pages, false)
125137
}
138+
if (!activity.isStarted) {
139+
return@launch
140+
}
126141
callback.onCompleted()
127142
}
128143
}
@@ -133,16 +148,20 @@ object ReadingListBehaviorsUtil {
133148
fun deletePages(activity: Activity, listsContainPage: List<ReadingList>, readingListPage: ReadingListPage, snackbarCallback: SnackbarCallback, callback: Callback) {
134149
MainScope().launch(exceptionHandler) {
135150
if (listsContainPage.size > 1) {
136-
val lists = withContext(Dispatchers.IO) {
137-
val pages = AppDatabase.instance.readingListPageDao().getAllPageOccurrences(ReadingListPage.toPageTitle(readingListPage))
138-
AppDatabase.instance.readingListDao().getListsFromPageOccurrences(pages)
139-
}
140-
RemoveFromReadingListsDialog(lists).deleteOrShowDialog(activity) { list, page ->
141-
showDeletePageFromListsUndoSnackbar(activity, list, page, snackbarCallback)
142-
callback.onCompleted()
143-
}
151+
val pages = AppDatabase.instance.readingListPageDao().getAllPageOccurrences(ReadingListPage.toPageTitle(readingListPage))
152+
val lists = AppDatabase.instance.readingListDao().getListsFromPageOccurrences(pages)
153+
if (!activity.isStarted) {
154+
return@launch
155+
}
156+
RemoveFromReadingListsDialog(lists).deleteOrShowDialog(activity) { list, page ->
157+
showDeletePageFromListsUndoSnackbar(activity, list, page, snackbarCallback)
158+
callback.onCompleted()
159+
}
144160
} else {
145161
AppDatabase.instance.readingListPageDao().markPagesForDeletion(listsContainPage[0], listOf(readingListPage))
162+
if (!activity.isStarted) {
163+
return@launch
164+
}
146165
listsContainPage[0].pages.remove(readingListPage)
147166
showDeletePagesUndoSnackbar(activity, listsContainPage[0], listOf(readingListPage), snackbarCallback)
148167
callback.onCompleted()
@@ -152,10 +171,8 @@ object ReadingListBehaviorsUtil {
152171

153172
fun updateReadingListPage(item: ReadingListPage) {
154173
MainScope().launch(exceptionHandler) {
155-
withContext(Dispatchers.IO) {
156-
AppDatabase.instance.readingListDao().updateLists(getListsContainPage(item), false)
157-
AppDatabase.instance.readingListPageDao().updateReadingListPage(item)
158-
}
174+
AppDatabase.instance.readingListDao().updateLists(getListsContainPage(item), false)
175+
AppDatabase.instance.readingListPageDao().updateReadingListPage(item)
159176
}
160177
}
161178

@@ -171,6 +188,9 @@ object ReadingListBehaviorsUtil {
171188
val existingTitles = AppDatabase.instance.readingListDao().getListsWithoutContents()
172189
.map { it.title }
173190
.filterNot { it == readingList.title }
191+
if (!activity.isStarted) {
192+
return@launch
193+
}
174194

175195
ReadingListTitleDialog.readingListTitleDialog(
176196
activity, readingList.title, readingList.description, existingTitles,
@@ -181,6 +201,9 @@ object ReadingListBehaviorsUtil {
181201
readingList.description = description
182202
readingList.dirty = true
183203
AppDatabase.instance.readingListDao().updateList(readingList, true)
204+
if (!activity.isStarted) {
205+
return@launch
206+
}
184207
callback.onCompleted()
185208
}
186209
}
@@ -204,6 +227,9 @@ object ReadingListBehaviorsUtil {
204227
.setAction(R.string.reading_list_item_delete_undo) {
205228
MainScope().launch(exceptionHandler) {
206229
AppDatabase.instance.readingListPageDao().addPageToLists(lists, page, true)
230+
if (!activity.isStarted) {
231+
return@launch
232+
}
207233
callback.onUndoDeleteClicked()
208234
}
209235
}
@@ -222,6 +248,9 @@ object ReadingListBehaviorsUtil {
222248
MainScope().launch(exceptionHandler) {
223249
val newPages = pages.map { ReadingListPage(ReadingListPage.toPageTitle(it)) }
224250
AppDatabase.instance.readingListPageDao().addPagesToList(readingList, newPages, true)
251+
if (!activity.isStarted) {
252+
return@launch
253+
}
225254
readingList.pages.addAll(newPages)
226255
callback.onUndoDeleteClicked()
227256
}
@@ -241,6 +270,9 @@ object ReadingListBehaviorsUtil {
241270
val newPages = readingList.pages.map { ReadingListPage(ReadingListPage.toPageTitle(it)) }
242271
AppDatabase.instance.readingListPageDao()
243272
.addPagesToList(newList, newPages, true)
273+
if (!activity.isStarted) {
274+
return@launch
275+
}
244276
callback.onUndoDeleteClicked()
245277
}
246278
}
@@ -264,8 +296,11 @@ object ReadingListBehaviorsUtil {
264296
AppDatabase.instance.readingListPageDao()
265297
.addPagesToList(newList, newPages, true)
266298
}
299+
if (!activity.isStarted) {
300+
return@launch
301+
}
302+
callback.onUndoDeleteClicked()
267303
}
268-
callback.onUndoDeleteClicked()
269304
}
270305
}
271306
snackBar.show()
@@ -289,9 +324,10 @@ object ReadingListBehaviorsUtil {
289324
}
290325
if (page.offline) {
291326
MainScope().launch(exceptionHandler) {
292-
val lists = withContext(Dispatchers.IO) {
293-
val pages = AppDatabase.instance.readingListPageDao().getAllPageOccurrences(ReadingListPage.toPageTitle(page))
294-
AppDatabase.instance.readingListDao().getListsFromPageOccurrences(pages)
327+
val pages = AppDatabase.instance.readingListPageDao().getAllPageOccurrences(ReadingListPage.toPageTitle(page))
328+
val lists = AppDatabase.instance.readingListDao().getListsFromPageOccurrences(pages)
329+
if (!activity.isStarted) {
330+
return@launch
295331
}
296332
if (lists.size > 1) {
297333
MaterialAlertDialogBuilder(activity)
@@ -324,14 +360,17 @@ object ReadingListBehaviorsUtil {
324360

325361
fun addToDefaultList(activity: Activity, title: PageTitle, addToDefault: Boolean, invokeSource: InvokeSource, listener: DialogInterface.OnDismissListener? = null) {
326362
if (addToDefault) {
327-
// If the title is a redirect, resolve it before saving to the reading list.
328-
(activity as AppCompatActivity).lifecycleScope.launch(exceptionHandler) {
363+
MainScope().launch(exceptionHandler) {
364+
// If the title is a redirect, resolve it before saving to the reading list.
329365
val pageInfo = ServiceFactory.get(title.wikiSite).getInfoByPageIdsOrTitles(null, title.prefixedText).query?.firstPage()
330366
val finalPageTitle = pageInfo?.let {
331367
PageTitle(it.title, title.wikiSite, it.thumbUrl(), it.description, it.displayTitle(title.wikiSite.languageCode), null)
332368
} ?: title
333369
val defaultList = AppDatabase.instance.readingListDao().getDefaultList()
334370
val addedTitles = AppDatabase.instance.readingListPageDao().addPagesToListIfNotExist(defaultList, listOf(finalPageTitle))
371+
if (!activity.isStarted) {
372+
return@launch
373+
}
335374
if (addedTitles.isNotEmpty()) {
336375
FeedbackUtil.makeSnackbar(activity, activity.getString(R.string.reading_list_article_added_to_default_list, StringUtil.fromHtml(finalPageTitle.displayText)))
337376
.setAction(R.string.reading_list_add_to_list_button) {
@@ -354,10 +393,12 @@ object ReadingListBehaviorsUtil {
354393
}
355394

356395
private fun toggleOffline(activity: Activity, page: ReadingListPage, forcedSave: Boolean) {
357-
358396
MainScope().launch(exceptionHandler) {
359397
AppDatabase.instance.readingListPageDao()
360398
.markPagesForOffline(listOf(page), !page.offline, forcedSave)
399+
if (!activity.isStarted) {
400+
return@launch
401+
}
361402
FeedbackUtil.showMessage(
362403
activity,
363404
activity.resources.getQuantityString(
@@ -401,7 +442,7 @@ object ReadingListBehaviorsUtil {
401442

402443
fun searchListsAndPages(coroutineScope: CoroutineScope, searchQuery: String?, callback: SearchCallback) {
403444
coroutineScope.launch(exceptionHandler) {
404-
allReadingLists = withContext(Dispatchers.IO) { AppDatabase.instance.readingListDao().getAllLists() }
445+
allReadingLists = AppDatabase.instance.readingListDao().getAllLists()
405446
val list = withContext(Dispatchers.IO) { applySearchQuery(searchQuery, allReadingLists) }
406447
if (searchQuery.isNullOrEmpty()) {
407448
ReadingList.sortGenericList(list, Prefs.getReadingListSortMode(ReadingList.SORT_BY_NAME_ASC))

app/src/main/java/org/wikipedia/readinglist/ReadingListPreviewSaveDialogView.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class ReadingListPreviewSaveDialogView(context: Context, attrs: AttributeSet? =
5252
coroutineScope().launch(CoroutineExceptionHandler {
5353
_, throwable -> L.w(throwable)
5454
}) {
55-
currentReadingLists = AppDatabase.instance.readingListDao().getAllLists()
55+
currentReadingLists = AppDatabase.instance.readingListDao().getListsWithoutContents()
5656
}
5757
binding.readingListTitle.doOnTextChanged { _, _, _, _ ->
5858
validateTitleAndList()
@@ -92,7 +92,7 @@ class ReadingListPreviewSaveDialogView(context: Context, attrs: AttributeSet? =
9292
}
9393
}
9494

95-
private inner class ReadingListItemHolder constructor(val itemBinding: ItemReadingListPreviewSaveSelectItemBinding) : DefaultViewHolder<View>(itemBinding.root), OnClickListener {
95+
private inner class ReadingListItemHolder(val itemBinding: ItemReadingListPreviewSaveSelectItemBinding) : DefaultViewHolder<View>(itemBinding.root), OnClickListener {
9696
private lateinit var readingListPage: ReadingListPage
9797

9898
fun bindItem(readingListPage: ReadingListPage) {

0 commit comments

Comments
 (0)