From d621430fab177d233c6ed6c4ba699f0b0ce90991 Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Tue, 28 Mar 2017 22:48:05 +0800 Subject: [PATCH] deletes favorites when unfavorited fixed #736 --- .../fragment/ParcelableStatusesFragment.kt | 159 ++++++++++-------- .../twidere/fragment/UserFavoritesFragment.kt | 52 ++++-- .../twidere/task/DestroyFavoriteTask.kt | 3 +- .../src/main/res/menu/menu_detail_status.xml | 8 +- 4 files changed, 127 insertions(+), 95 deletions(-) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableStatusesFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableStatusesFragment.kt index bf008231b..d1600e61e 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableStatusesFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableStatusesFragment.kt @@ -47,6 +47,18 @@ import java.util.* */ abstract class ParcelableStatusesFragment : AbsStatusesFragment() { + override var refreshing: Boolean + get() { + if (context == null || isDetached) return false + return loaderManager.hasRunningLoadersSafe() + } + set(value) { + super.refreshing = value + } + + protected open val savedStatusesFileArgs: Array? + get() = null + private var lastId: String? = null private var page = 1 private var pageDelta: Int = 0 @@ -58,22 +70,19 @@ abstract class ParcelableStatusesFragment : AbsStatusesFragment() { } } - fun deleteStatus(statusId: String) { - val list = adapterData ?: return - val dataToRemove = HashSet() - for (i in 0 until list.size) { - val status = list[i] - if (status.id == statusId || status.retweet_id == statusId) { - dataToRemove.add(status) - } else if (status.my_retweet_id == statusId) { - status.my_retweet_id = null - status.retweet_count = status.retweet_count - 1 - } - } - if (list is MutableList) { - list.removeAll(dataToRemove) - } - adapterData = list + override fun onStart() { + super.onStart() + bus.register(this) + } + + override fun onStop() { + bus.unregister(this) + super.onStop() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putInt(EXTRA_PAGE, page) } override fun getStatuses(param: RefreshTaskParam): Boolean { @@ -99,16 +108,6 @@ abstract class ParcelableStatusesFragment : AbsStatusesFragment() { return true } - override fun onStart() { - super.onStart() - bus.register(this) - } - - override fun onStop() { - bus.unregister(this) - super.onStop() - } - override fun hasMoreData(data: List?): Boolean { if (data == null || data.isEmpty()) return false val tmpLastId = lastId @@ -164,6 +163,43 @@ abstract class ParcelableStatusesFragment : AbsStatusesFragment() { getStatuses(param) } + override fun triggerRefresh(): Boolean { + super.triggerRefresh() + val accountKeys = accountKeys + if (adapter.getStatusCount(true) > 0) { + val firstStatus = adapter.getStatus(0, true) + val sinceIds = Array(accountKeys.size) { + return@Array if (firstStatus.account_key == accountKeys[it]) firstStatus.id else null + } + getStatuses(BaseRefreshTaskParam(accountKeys, null, sinceIds)) + } else { + getStatuses(BaseRefreshTaskParam(accountKeys, null, null)) + } + return true + } + + override fun onHasMoreDataChanged(hasMoreData: Boolean) { + pageDelta = if (hasMoreData) 1 else 0 + } + + fun removeStatus(statusId: String) { + val list = adapterData ?: return + val dataToRemove = HashSet() + for (i in 0 until list.size) { + val status = list[i] + if (status.id == statusId || status.retweet_id == statusId) { + dataToRemove.add(status) + } else if (status.my_retweet_id == statusId) { + status.my_retweet_id = null + status.retweet_count = status.retweet_count - 1 + } + } + if (list is MutableList) { + list.removeAll(dataToRemove) + } + adapterData = list + } + fun replaceStatusStates(status: ParcelableStatus?) { if (status == null) return val lm = layoutManager @@ -182,41 +218,6 @@ abstract class ParcelableStatusesFragment : AbsStatusesFragment() { adapter.notifyItemRangeChanged(rangeStart, rangeEnd) } - override fun triggerRefresh(): Boolean { - super.triggerRefresh() - val accountKeys = accountKeys - if (adapter.getStatusCount(true) > 0) { - val firstStatus = adapter.getStatus(0, true) - val sinceIds = Array(accountKeys.size) { - return@Array if (firstStatus.account_key == accountKeys[it]) firstStatus.id else null - } - getStatuses(BaseRefreshTaskParam(accountKeys, null, sinceIds)) - } else { - getStatuses(BaseRefreshTaskParam(accountKeys, null, null)) - } - return true - } - - override var refreshing: Boolean - get() { - if (context == null || isDetached) return false - return loaderManager.hasRunningLoadersSafe() - } - set(value) { - super.refreshing = value - } - - override fun onSaveInstanceState(outState: Bundle?) { - super.onSaveInstanceState(outState) - outState!!.putInt(EXTRA_PAGE, page) - } - - protected open val savedStatusesFileArgs: Array? - get() = null - - override fun onHasMoreDataChanged(hasMoreData: Boolean) { - pageDelta = if (hasMoreData) 1 else 0 - } private fun updateFavoritedStatus(status: ParcelableStatus) { replaceStatusStates(status) @@ -234,28 +235,44 @@ abstract class ParcelableStatusesFragment : AbsStatusesFragment() { adapterData = data } + protected open fun notifyFavoriteTask(event: FavoriteTaskEvent) { + if (event.isSucceeded) { + updateFavoritedStatus(event.status!!) + } + } + + protected open fun notifyStatusDestroyed(event: StatusDestroyedEvent) { + removeStatus(event.status.id) + } + + protected open fun notifyStatusListChanged(event: StatusListChangedEvent) { + adapter.notifyDataSetChanged() + } + + protected open fun notifyStatusRetweeted(event: StatusRetweetedEvent) { + updateRetweetedStatuses(event.status) + } + protected inner class ParcelableStatusesBusCallback { @Subscribe - fun notifyFavoriteTask(event: FavoriteTaskEvent) { - if (event.isSucceeded) { - updateFavoritedStatus(event.status!!) - } + fun onFavoriteTaskEvent(event: FavoriteTaskEvent) { + notifyFavoriteTask(event) } @Subscribe - fun notifyStatusDestroyed(event: StatusDestroyedEvent) { - deleteStatus(event.status.id) + fun onStatusDestroyedEvent(event: StatusDestroyedEvent) { + notifyStatusDestroyed(event) } @Subscribe - fun notifyStatusListChanged(event: StatusListChangedEvent) { - adapter.notifyDataSetChanged() + fun onStatusListChangedEvent(event: StatusListChangedEvent) { + notifyStatusListChanged(event) } @Subscribe - fun notifyStatusRetweeted(event: StatusRetweetedEvent) { - updateRetweetedStatuses(event.status) + fun onStatusRetweetedEvent(event: StatusRetweetedEvent) { + notifyStatusRetweeted(event) } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFavoritesFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFavoritesFragment.kt index 32d8d58bc..f89f04f85 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFavoritesFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFavoritesFragment.kt @@ -27,6 +27,7 @@ import org.mariotaku.twidere.TwidereConstants.* import org.mariotaku.twidere.loader.UserFavoritesLoader import org.mariotaku.twidere.model.ParcelableStatus import org.mariotaku.twidere.model.UserKey +import org.mariotaku.twidere.model.event.FavoriteTaskEvent import org.mariotaku.twidere.util.Utils import java.util.* @@ -35,23 +36,6 @@ import java.util.* */ class UserFavoritesFragment : ParcelableStatusesFragment() { - override fun onCreateStatusesLoader(context: Context, - args: Bundle, - fromUser: Boolean): Loader?> { - refreshing = true - val accountKey = Utils.getAccountKey(context, args) - val maxId = args.getString(EXTRA_MAX_ID) - val sinceId = args.getString(EXTRA_SINCE_ID) - val page = args.getInt(EXTRA_PAGE, -1) - val userKey = args.getParcelable(EXTRA_USER_KEY) - val screenName = args.getString(EXTRA_SCREEN_NAME) - val tabPosition = args.getInt(EXTRA_TAB_POSITION, -1) - val loadingMore = args.getBoolean(EXTRA_LOADING_MORE, false) - return UserFavoritesLoader(context, accountKey, userKey, screenName, sinceId, maxId, - page, adapterData, savedStatusesFileArgs, tabPosition, fromUser, - loadingMore) - } - override val savedStatusesFileArgs: Array? get() { val args = arguments!! @@ -71,7 +55,6 @@ class UserFavoritesFragment : ParcelableStatusesFragment() { return result.toTypedArray() } - override val readPositionTagWithArguments: String? get() { val args = arguments!! @@ -91,6 +74,39 @@ class UserFavoritesFragment : ParcelableStatusesFragment() { return sb.toString() } + @TimelineType override val timelineType: String = TimelineType.OTHER + + override fun onCreateStatusesLoader(context: Context, args: Bundle, fromUser: Boolean): + Loader?> { + refreshing = true + val accountKey = Utils.getAccountKey(context, args) + val maxId = args.getString(EXTRA_MAX_ID) + val sinceId = args.getString(EXTRA_SINCE_ID) + val page = args.getInt(EXTRA_PAGE, -1) + val userKey = args.getParcelable(EXTRA_USER_KEY) + val screenName = args.getString(EXTRA_SCREEN_NAME) + val tabPosition = args.getInt(EXTRA_TAB_POSITION, -1) + val loadingMore = args.getBoolean(EXTRA_LOADING_MORE, false) + return UserFavoritesLoader(context, accountKey, userKey, screenName, sinceId, maxId, + page, adapterData, savedStatusesFileArgs, tabPosition, fromUser, + loadingMore) + } + + override fun notifyFavoriteTask(event: FavoriteTaskEvent) { + if (event.action == FavoriteTaskEvent.Action.DESTROY && event.isSucceeded) { + event.status?.let { status -> + val args = arguments!! + val userKey = args.getParcelable(EXTRA_USER_KEY) + if (status.account_key == userKey) { + removeStatus(event.statusId) + triggerRefresh() + return + } + } + } + super.notifyFavoriteTask(event) + } + } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/task/DestroyFavoriteTask.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/task/DestroyFavoriteTask.kt index 6329ecbc5..6959370ac 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/task/DestroyFavoriteTask.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/task/DestroyFavoriteTask.kt @@ -96,8 +96,7 @@ class DestroyFavoriteTask( override fun afterExecute(callback: Any?, result: SingleResponse) { destroyingFavoriteIds.removeElement(AsyncTwitterWrapper.calculateHashCode(accountKey, statusId)) - val taskEvent = FavoriteTaskEvent(FavoriteTaskEvent.Action.DESTROY, - accountKey, statusId) + val taskEvent = FavoriteTaskEvent(FavoriteTaskEvent.Action.DESTROY, accountKey, statusId) taskEvent.isFinished = true if (result.hasData()) { val status = result.data diff --git a/twidere/src/main/res/menu/menu_detail_status.xml b/twidere/src/main/res/menu/menu_detail_status.xml index a20c90d96..c03f01e8e 100644 --- a/twidere/src/main/res/menu/menu_detail_status.xml +++ b/twidere/src/main/res/menu/menu_detail_status.xml @@ -58,10 +58,6 @@ android:icon="@drawable/ic_action_delete" android:title="@string/action_delete" android:visible="false"/> - + \ No newline at end of file