@@ -6,7 +6,6 @@ import android.icu.text.ListFormatter
66import android.os.Build
77import android.text.Spanned
88import androidx.appcompat.app.AppCompatActivity
9- import androidx.lifecycle.lifecycleScope
109import com.google.android.material.dialog.MaterialAlertDialogBuilder
1110import kotlinx.coroutines.CoroutineExceptionHandler
1211import kotlinx.coroutines.CoroutineScope
@@ -19,6 +18,7 @@ import org.wikipedia.Constants.InvokeSource
1918import org.wikipedia.R
2019import org.wikipedia.database.AppDatabase
2120import org.wikipedia.dataclient.ServiceFactory
21+ import org.wikipedia.extensions.isStarted
2222import org.wikipedia.page.ExclusiveBottomSheetPresenter
2323import org.wikipedia.page.PageTitle
2424import 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 ))
0 commit comments