From ef7bfa7c8ca6362c3890f4242b897ed29997cd57 Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Wed, 22 Jul 2020 16:24:32 -0400 Subject: [PATCH 1/2] Add ReaderRepo events to post table mods --- .../android/datasets/ReaderDatabase.java | 5 +++ .../android/datasets/ReaderPostTable.java | 33 +++++++++++++++++-- .../repository/ReaderDiscoverRepository.kt | 33 +++++++++++++++---- .../reader/repository/ReaderPostRepository.kt | 30 ++++++++++++++--- .../repository/ReaderRepositoryEvents.kt | 1 + 5 files changed, 89 insertions(+), 13 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java index 2c3a2c00bc14..a526a1f0f45a 100644 --- a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java +++ b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java @@ -4,9 +4,11 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; +import org.greenrobot.eventbus.EventBus; import org.wordpress.android.WordPress; import org.wordpress.android.models.ReaderPostList; import org.wordpress.android.models.ReaderTagList; +import org.wordpress.android.ui.reader.repository.ReaderRepositoryEvent.ReaderPostTableActionEnded; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.AppLog.T; @@ -270,6 +272,9 @@ private static void purge() { } } db.setTransactionSuccessful(); + if (numPostsDeleted > 0) { + EventBus.getDefault().post(ReaderPostTableActionEnded.INSTANCE); + } } finally { db.endTransaction(); } diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java index a36da83a2a64..4ca0b8467066 100644 --- a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java +++ b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java @@ -8,6 +8,7 @@ import androidx.annotation.NonNull; +import org.greenrobot.eventbus.EventBus; import org.wordpress.android.R; import org.wordpress.android.WordPress; import org.wordpress.android.models.ReaderCardType; @@ -20,6 +21,7 @@ import org.wordpress.android.ui.reader.actions.ReaderActions; import org.wordpress.android.ui.reader.models.ReaderBlogIdPostId; import org.wordpress.android.ui.reader.models.ReaderBlogIdPostIdList; +import org.wordpress.android.ui.reader.repository.ReaderRepositoryEvent.ReaderPostTableActionEnded; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.SqlUtils; @@ -233,6 +235,9 @@ public static int purgeUnbookmarkedPostsWithBookmarkTag() { .delete("tbl_posts", "tag_name=? AND tag_type=? AND is_bookmarked=0", args); } } + if (numDeleted > 0) { + EventBus.getDefault().post(ReaderPostTableActionEnded.INSTANCE); + } return numDeleted; } @@ -507,6 +512,7 @@ private static void update(long blogId, long postId, ContentValues values) { values, "blog_id=? AND post_id=?", args); + EventBus.getDefault().post(ReaderPostTableActionEnded.INSTANCE); } @@ -526,10 +532,15 @@ public static int deletePostsWithTag(final ReaderTag tag) { } String[] args = {tag.getTagSlug(), Integer.toString(tag.tagType.toInt())}; - return ReaderDatabase.getWritableDb().delete( + int rowsDeleted = ReaderDatabase.getWritableDb().delete( "tbl_posts", "tag_name=? AND tag_type=?", args); + + if (rowsDeleted > 0) { + EventBus.getDefault().post(ReaderPostTableActionEnded.INSTANCE); + } + return rowsDeleted; } public static int removeTagsFromPost(long blogId, long postId, final ReaderTagType tagType) { @@ -538,20 +549,30 @@ public static int removeTagsFromPost(long blogId, long postId, final ReaderTagTy } String[] args = {Integer.toString(tagType.toInt()), Long.toString(blogId), Long.toString(postId)}; - return ReaderDatabase.getWritableDb().delete( + int rowsDeleted = ReaderDatabase.getWritableDb().delete( "tbl_posts", "tag_type=? AND blog_id=? AND post_id=?", args); + + if (rowsDeleted > 0) { + EventBus.getDefault().post(ReaderPostTableActionEnded.INSTANCE); + } + return rowsDeleted; } public static int deletePostsInBlog(long blogId) { String[] args = {Long.toString(blogId)}; - return ReaderDatabase.getWritableDb().delete("tbl_posts", "blog_id = ?", args); + int rowsDeleted = ReaderDatabase.getWritableDb().delete("tbl_posts", "blog_id = ?", args); + if (rowsDeleted > 0) { + EventBus.getDefault().post(ReaderPostTableActionEnded.INSTANCE); + } + return rowsDeleted; } public static void deletePost(long blogId, long postId) { String[] args = new String[]{Long.toString(blogId), Long.toString(postId)}; ReaderDatabase.getWritableDb().delete("tbl_posts", "blog_id=? AND post_id=?", args); + EventBus.getDefault().post(ReaderPostTableActionEnded.INSTANCE); } /* @@ -568,6 +589,7 @@ public static void updateFollowedStatus() { if (count > 0) { AppLog.d(AppLog.T.READER, String.format(Locale.ENGLISH, "reader post table > marked %d posts unfollowed", count)); + EventBus.getDefault().post(ReaderPostTableActionEnded.INSTANCE); } } finally { statement.close(); @@ -616,6 +638,7 @@ public static void removeGapMarkerForTag(final ReaderTag tag) { String[] args = {tag.getTagSlug(), Integer.toString(tag.tagType.toInt())}; String sql = "UPDATE tbl_posts SET has_gap_marker=0 WHERE has_gap_marker!=0 AND tag_name=? AND tag_type=?"; ReaderDatabase.getWritableDb().execSQL(sql, args); + EventBus.getDefault().post(ReaderPostTableActionEnded.INSTANCE); } /* @@ -656,6 +679,7 @@ public static void setGapMarkerForTag(long blogId, long postId, ReaderTag tag) { String sql = "UPDATE tbl_posts SET has_gap_marker=1 WHERE blog_id=? AND post_id=? AND tag_name=? AND tag_type=?"; ReaderDatabase.getWritableDb().execSQL(sql, args); + EventBus.getDefault().post(ReaderPostTableActionEnded.INSTANCE); } public static String getGapMarkerDateForTag(ReaderTag tag) { @@ -709,6 +733,7 @@ public static void deletePostsBeforeGapMarkerForTag(ReaderTag tag) { int numDeleted = ReaderDatabase.getWritableDb().delete("tbl_posts", where, args); if (numDeleted > 0) { AppLog.d(AppLog.T.READER, "removed " + numDeleted + " posts older than gap marker"); + EventBus.getDefault().post(ReaderPostTableActionEnded.INSTANCE); } } @@ -751,6 +776,7 @@ private static void setFollowStatusForPosts(long blogId, long feedId, boolean is } db.setTransactionSuccessful(); + EventBus.getDefault().post(ReaderPostTableActionEnded.INSTANCE); } finally { db.endTransaction(); } @@ -860,6 +886,7 @@ public static void addOrUpdatePosts(final ReaderTag tag, ReaderPostList posts) { } db.setTransactionSuccessful(); + EventBus.getDefault().post(ReaderPostTableActionEnded.INSTANCE); } finally { db.endTransaction(); SqlUtils.closeStatement(stmtPosts); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderDiscoverRepository.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderDiscoverRepository.kt index 58e9cb3ac33b..88f9f7fee716 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderDiscoverRepository.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderDiscoverRepository.kt @@ -5,6 +5,8 @@ import androidx.lifecycle.MutableLiveData import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode.BACKGROUND import org.wordpress.android.models.ReaderPost import org.wordpress.android.models.ReaderPostList import org.wordpress.android.models.ReaderTag @@ -17,6 +19,7 @@ import org.wordpress.android.ui.reader.repository.ReaderRepositoryCommunication. import org.wordpress.android.ui.reader.repository.ReaderRepositoryEvent.PostLikeEnded.PostLikeFailure import org.wordpress.android.ui.reader.repository.ReaderRepositoryEvent.PostLikeEnded.PostLikeSuccess import org.wordpress.android.ui.reader.repository.ReaderRepositoryEvent.PostLikeEnded.PostLikeUnChanged +import org.wordpress.android.ui.reader.repository.ReaderRepositoryEvent.ReaderPostTableActionEnded import org.wordpress.android.ui.reader.repository.usecases.FetchPostsForTagUseCase import org.wordpress.android.ui.reader.repository.usecases.GetNumPostsForTagUseCase import org.wordpress.android.ui.reader.repository.usecases.GetPostsForTagUseCase @@ -24,14 +27,17 @@ import org.wordpress.android.ui.reader.repository.usecases.GetPostsForTagWithCou import org.wordpress.android.ui.reader.repository.usecases.PostLikeActionUseCase import org.wordpress.android.ui.reader.repository.usecases.ShouldAutoUpdateTagUseCase import org.wordpress.android.ui.reader.utils.ReaderUtilsWrapper +import org.wordpress.android.util.EventBusWrapper import org.wordpress.android.viewmodel.Event import org.wordpress.android.viewmodel.ReactiveMutableLiveData +import java.util.concurrent.atomic.AtomicBoolean import javax.inject.Inject import javax.inject.Named import kotlin.coroutines.CoroutineContext class ReaderDiscoverRepository constructor( private val bgDispatcher: CoroutineDispatcher, + private val eventBusWrapper: EventBusWrapper, private val readerTag: ReaderTag, private val getPostsForTagUseCase: GetPostsForTagUseCase, private val getNumPostsForTagUseCase: GetNumPostsForTagUseCase, @@ -45,6 +51,7 @@ class ReaderDiscoverRepository constructor( get() = bgDispatcher private var isStarted = false + private val isDirty = AtomicBoolean() private val _discoverFeed = ReactiveMutableLiveData( onActive = { onActiveDiscoverFeed() }, onInactive = { onInactiveDiscoverFeed() }) @@ -57,6 +64,7 @@ class ReaderDiscoverRepository constructor( if (isStarted) return isStarted = true + eventBusWrapper.register(this) readerUpdatePostsEndedHandler.start(readerTag, ReaderUpdatePostsEndedHandler.setUpdatePostsEndedListeners( this::onNewPosts, @@ -65,6 +73,7 @@ class ReaderDiscoverRepository constructor( } fun stop() { + eventBusWrapper.unregister(this) getPostsForTagUseCase.stop() getNumPostsForTagUseCase.stop() shouldAutoUpdateTagUseCase.stop() @@ -73,7 +82,6 @@ class ReaderDiscoverRepository constructor( postLikeActionUseCase.stop() } - // todo - can change this to blogId, feedId, etc fun performLikeAction(post: ReaderPost, isAskingToLike: Boolean, wpComUserId: Long) { launch { when (val event = postLikeActionUseCase.perform(post, isAskingToLike, wpComUserId)) { @@ -113,20 +121,20 @@ class ReaderDiscoverRepository constructor( loadPosts() } - private fun onInactiveDiscoverFeed() { - } + private fun onInactiveDiscoverFeed() {} private fun loadPosts() { launch { val existsInMemory = discoverFeed.value?.let { !it.isEmpty() } ?: false - val refresh = shouldAutoUpdateTagUseCase.get(readerTag) + val refresh = + shouldAutoUpdateTagUseCase.get(readerTag) || isDirty.getAndSet(false) if (!existsInMemory) { - val result = getPostsForTagUseCase.get(readerTag) - _discoverFeed.postValue(result) + reloadPosts() } + if (refresh) { val response = fetchPostsForTagUseCase.fetch(readerTag) if (response != Success) _communicationChannel.postValue(Event(response)) @@ -141,9 +149,21 @@ class ReaderDiscoverRepository constructor( } } + @Subscribe(threadMode = BACKGROUND) + @SuppressWarnings("unused") + fun onReaderPostTableAction(event: ReaderPostTableActionEnded) { + if (_discoverFeed.hasObservers()) { + isDirty.compareAndSet(true, false) + reloadPosts() + } else { + isDirty.compareAndSet(false, true) + } + } + class Factory @Inject constructor( @Named(BG_THREAD) private val bgDispatcher: CoroutineDispatcher, + private val eventBusWrapper: EventBusWrapper, private val readerUtilsWrapper: ReaderUtilsWrapper, private val getPostsForTagUseCase: GetPostsForTagUseCase, private val getNumPostsForTagUseCase: GetNumPostsForTagUseCase, @@ -159,6 +179,7 @@ class ReaderDiscoverRepository constructor( return ReaderDiscoverRepository( bgDispatcher, + eventBusWrapper, tag, getPostsForTagUseCase, getNumPostsForTagUseCase, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderPostRepository.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderPostRepository.kt index 7791ab850c6c..f493206cdf4b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderPostRepository.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderPostRepository.kt @@ -5,6 +5,8 @@ import androidx.lifecycle.MutableLiveData import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode.BACKGROUND import org.wordpress.android.models.ReaderPost import org.wordpress.android.models.ReaderPostList import org.wordpress.android.models.ReaderTag @@ -15,20 +17,24 @@ import org.wordpress.android.ui.reader.repository.ReaderRepositoryCommunication. import org.wordpress.android.ui.reader.repository.ReaderRepositoryEvent.PostLikeEnded.PostLikeFailure import org.wordpress.android.ui.reader.repository.ReaderRepositoryEvent.PostLikeEnded.PostLikeSuccess import org.wordpress.android.ui.reader.repository.ReaderRepositoryEvent.PostLikeEnded.PostLikeUnChanged +import org.wordpress.android.ui.reader.repository.ReaderRepositoryEvent.ReaderPostTableActionEnded import org.wordpress.android.ui.reader.repository.usecases.FetchPostsForTagUseCase import org.wordpress.android.ui.reader.repository.usecases.GetNumPostsForTagUseCase import org.wordpress.android.ui.reader.repository.usecases.GetPostsForTagUseCase import org.wordpress.android.ui.reader.repository.usecases.GetPostsForTagWithCountUseCase import org.wordpress.android.ui.reader.repository.usecases.PostLikeActionUseCase import org.wordpress.android.ui.reader.repository.usecases.ShouldAutoUpdateTagUseCase +import org.wordpress.android.util.EventBusWrapper import org.wordpress.android.viewmodel.Event import org.wordpress.android.viewmodel.ReactiveMutableLiveData +import java.util.concurrent.atomic.AtomicBoolean import javax.inject.Inject import javax.inject.Named import kotlin.coroutines.CoroutineContext class ReaderPostRepository( private val bgDispatcher: CoroutineDispatcher, + private val eventBusWrapper: EventBusWrapper, private val readerTag: ReaderTag, private val getPostsForTagUseCase: GetPostsForTagUseCase, private val getNumPostsForTagUseCase: GetNumPostsForTagUseCase, @@ -42,7 +48,7 @@ class ReaderPostRepository( get() = bgDispatcher private var isStarted = false - private var isDirty = false + private val isDirty = AtomicBoolean() private val _posts = ReactiveMutableLiveData( onActive = { onActivePosts() }, onInactive = { onInactivePosts() }) @@ -55,6 +61,7 @@ class ReaderPostRepository( if (isStarted) return isStarted = true + eventBusWrapper.register(this) readerUpdatePostsEndedHandler.start( readerTag, ReaderUpdatePostsEndedHandler.setUpdatePostsEndedListeners( @@ -65,6 +72,7 @@ class ReaderPostRepository( } fun stop() { + eventBusWrapper.unregister(this) getPostsForTagUseCase.stop() getNumPostsForTagUseCase.stop() shouldAutoUpdateTagUseCase.stop() @@ -123,16 +131,17 @@ class ReaderPostRepository( val existsInMemory = posts.value?.let { !it.isEmpty() } ?: false - val refresh = shouldAutoUpdateTagUseCase.get(readerTag) + val refresh = + shouldAutoUpdateTagUseCase.get(readerTag) || isDirty.getAndSet(false) if (!existsInMemory) { - val result = getPostsForTagUseCase.get(readerTag) - _posts.postValue(result) + reloadPosts() } if (refresh) { val response = fetchPostsForTagUseCase.fetch(readerTag) if (response != Success) _communicationChannel.postValue(Event(response)) + reloadPosts() } } } @@ -144,9 +153,21 @@ class ReaderPostRepository( } } + @Subscribe(threadMode = BACKGROUND) + @SuppressWarnings("unused") + fun onReaderPostTableAction(event: ReaderPostTableActionEnded) { + if (_posts.hasObservers()) { + isDirty.compareAndSet(true, false) + reloadPosts() + } else { + isDirty.compareAndSet(false, true) + } + } + class Factory @Inject constructor( @Named(BG_THREAD) private val bgDispatcher: CoroutineDispatcher, + private val eventBusWrapper: EventBusWrapper, private val getPostsForTagUseCase: GetPostsForTagUseCase, private val getNumPostsForTagUseCase: GetNumPostsForTagUseCase, private val shouldAutoUpdateTagUseCase: ShouldAutoUpdateTagUseCase, @@ -158,6 +179,7 @@ class ReaderPostRepository( fun create(readerTag: ReaderTag): ReaderPostRepository { return ReaderPostRepository( bgDispatcher, + eventBusWrapper, readerTag, getPostsForTagUseCase, getNumPostsForTagUseCase, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderRepositoryEvents.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderRepositoryEvents.kt index b27a4f6988e0..045dd8021c45 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderRepositoryEvents.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderRepositoryEvents.kt @@ -1,6 +1,7 @@ package org.wordpress.android.ui.reader.repository sealed class ReaderRepositoryEvent { + object ReaderPostTableActionEnded : ReaderRepositoryEvent() sealed class PostLikeEnded( val postId: Long, val blogId: Long, From 0d2512e21f0a8492ee8edf098da67c9eaaa4a4fb Mon Sep 17 00:00:00 2001 From: Annmarie Ziegler Date: Mon, 27 Jul 2020 08:13:09 -0400 Subject: [PATCH 2/2] Fix lint --- .../ui/reader/repository/ReaderDiscoverRepository.kt | 2 +- .../android/ui/reader/repository/ReaderPostRepository.kt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderDiscoverRepository.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderDiscoverRepository.kt index 63caeee3009d..99b1045bd9e0 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderDiscoverRepository.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderDiscoverRepository.kt @@ -6,9 +6,9 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode.BACKGROUND -import kotlinx.coroutines.withContext import org.wordpress.android.models.ReaderPost import org.wordpress.android.models.ReaderPostList import org.wordpress.android.models.ReaderTag diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderPostRepository.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderPostRepository.kt index 77f3cc195a69..49d087ce1236 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderPostRepository.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderPostRepository.kt @@ -6,9 +6,9 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode.BACKGROUND -import kotlinx.coroutines.withContext import org.wordpress.android.models.ReaderPost import org.wordpress.android.models.ReaderPostList import org.wordpress.android.models.ReaderTag @@ -24,8 +24,8 @@ import org.wordpress.android.ui.reader.repository.usecases.FetchPostsForTagUseCa import org.wordpress.android.ui.reader.repository.usecases.GetPostsForTagUseCase import org.wordpress.android.ui.reader.repository.usecases.PostLikeActionUseCase import org.wordpress.android.ui.reader.repository.usecases.ShouldAutoUpdateTagUseCase -import org.wordpress.android.util.EventBusWrapper import org.wordpress.android.ui.reader.services.post.ReaderPostServiceStarter.UpdateAction +import org.wordpress.android.util.EventBusWrapper import org.wordpress.android.viewmodel.Event import org.wordpress.android.viewmodel.ReactiveMutableLiveData import java.util.concurrent.atomic.AtomicBoolean @@ -138,7 +138,7 @@ class ReaderPostRepository( if (_posts.hasObservers()) { isDirty.compareAndSet(true, false) launch { - reloadPosts() + reloadPosts() } } else { isDirty.compareAndSet(false, true)