diff --git a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/User.java b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/User.java index 98ffdecf2..08b18e66f 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/User.java +++ b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/twitter/model/User.java @@ -203,7 +203,7 @@ public class User extends TwitterResponseObject implements Comparable, Par boolean followedBy; @JsonField(name = "following") - boolean following; + boolean following = true; @JsonField(name = "follow_request_sent") boolean followRequestSent; @@ -294,12 +294,10 @@ public class User extends TwitterResponseObject implements Comparable, Par return followersCount; } - public boolean isFollowing() { return following; } - public long getFriendsCount() { return friendsCount; } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableActivity.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableActivity.java index 94e53fe75..c6e2e25eb 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableActivity.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableActivity.java @@ -215,6 +215,11 @@ public class ParcelableActivity implements Comparable, Parce @Nullable public String status_my_retweet_id; + @CursorField(Activities.HAS_FOLLOWING_SOURCE) + @ParcelableThisPlease + @JsonField(name = "has_following_source") + public boolean has_following_source = true; + public transient UserKey[] after_filtered_source_ids; public transient ParcelableUser[] after_filtered_sources; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java index d4908dbbb..0e6460da1 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java @@ -932,6 +932,7 @@ public interface TwidereDataStore { String TARGET_OBJECT_STATUSES = "target_object_statuses"; String TARGET_OBJECT_USER_LISTS = "target_object_user_lists"; String TARGET_OBJECT_USERS = "target_object_users"; + String HAS_FOLLOWING_SOURCE = "has_following_source"; String POSITION_KEY = "position_key"; diff --git a/twidere/src/main/java/org/mariotaku/twidere/Constants.java b/twidere/src/main/java/org/mariotaku/twidere/Constants.java index a073c6b24..deffdabd1 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/Constants.java +++ b/twidere/src/main/java/org/mariotaku/twidere/Constants.java @@ -34,7 +34,7 @@ import static org.mariotaku.twidere.annotation.PreferenceType.STRING; public interface Constants extends TwidereConstants { String DATABASES_NAME = "twidere.sqlite"; - int DATABASES_VERSION = 151; + int DATABASES_VERSION = 152; int MENU_GROUP_STATUS_EXTENSION = 10; int MENU_GROUP_COMPOSE_EXTENSION = 11; diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/util/ParcelableActivityUtils.java b/twidere/src/main/java/org/mariotaku/twidere/model/util/ParcelableActivityUtils.java deleted file mode 100644 index 08353acd3..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/model/util/ParcelableActivityUtils.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.mariotaku.twidere.model.util; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import org.apache.commons.lang3.ArrayUtils; -import org.mariotaku.microblog.library.twitter.model.Activity; -import org.mariotaku.twidere.model.ParcelableActivity; -import org.mariotaku.twidere.model.ParcelableStatus; -import org.mariotaku.twidere.model.ParcelableUser; -import org.mariotaku.twidere.model.UserKey; - -import java.util.ArrayList; -import java.util.List; - -/** - * Processing ParcelableActivity - *

- * Created by mariotaku on 16/1/2. - */ -public class ParcelableActivityUtils { - - private ParcelableActivityUtils() { - } - - /** - * @param activity Activity for processing - * @param filteredUserIds Those ids will be removed from source_ids. - * @param followingOnly Limit following users in sources - * @return true if source ids changed, false otherwise - */ - public static boolean initAfterFilteredSourceIds(ParcelableActivity activity, UserKey[] filteredUserIds, - boolean followingOnly) { - if (activity.sources == null) return false; - if (activity.after_filtered_source_ids != null) return false; - if (followingOnly || !ArrayUtils.isEmpty(filteredUserIds)) { - List list = new ArrayList<>(); - for (ParcelableUser user : activity.sources) { - if (followingOnly && !user.is_following) { - continue; - } - - if (!ArrayUtils.contains(filteredUserIds, user.key)) { - list.add(user.key); - } - } - activity.after_filtered_source_ids = list.toArray(new UserKey[list.size()]); - return true; - } else { - activity.after_filtered_source_ids = activity.source_ids; - return false; - } - } - - public static ParcelableUser[] getAfterFilteredSources(ParcelableActivity activity) { - if (activity.after_filtered_sources != null) return activity.after_filtered_sources; - if (activity.after_filtered_source_ids == null || activity.sources.length == activity.after_filtered_source_ids.length) { - return activity.sources; - } - ParcelableUser[] result = new ParcelableUser[activity.after_filtered_source_ids.length]; - for (int i = 0; i < activity.after_filtered_source_ids.length; i++) { - for (ParcelableUser user : activity.sources) { - if (user.key.equals(activity.after_filtered_source_ids[i])) { - result[i] = user; - } - } - } - return activity.after_filtered_sources = result; - } - - public static ParcelableActivity fromActivity(final Activity activity, - final UserKey accountKey, - final boolean isGap) { - ParcelableActivity result = new ParcelableActivity(); - result.account_key = accountKey; - result.timestamp = activity.getCreatedAt().getTime(); - result.action = activity.getAction(); - result.max_sort_position = activity.getMaxSortPosition(); - result.min_sort_position = activity.getMinSortPosition(); - result.max_position = activity.getMaxPosition(); - result.min_position = activity.getMinPosition(); - result.sources = ParcelableUserUtils.fromUsers(activity.getSources(), accountKey); - result.target_users = ParcelableUserUtils.fromUsers(activity.getTargetUsers(), accountKey); - result.target_user_lists = ParcelableUserListUtils.fromUserLists(activity.getTargetUserLists(), accountKey); - result.target_statuses = ParcelableStatusUtils.fromStatuses(activity.getTargetStatuses(), accountKey); - result.target_object_statuses = ParcelableStatusUtils.fromStatuses(activity.getTargetObjectStatuses(), accountKey); - result.target_object_user_lists = ParcelableUserListUtils.fromUserLists(activity.getTargetObjectUserLists(), accountKey); - result.target_object_users = ParcelableUserUtils.fromUsers(activity.getTargetObjectUsers(), accountKey); - if (result.sources != null) { - result.source_ids = new UserKey[result.sources.length]; - for (int i = 0; i < result.sources.length; i++) { - result.source_ids[i] = result.sources[i].key; - } - } - result.is_gap = isGap; - return result; - } - - -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java index 8277b136a..ec24f5a83 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java +++ b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java @@ -1425,9 +1425,9 @@ public final class TwidereDataProvider extends ContentProvider implements Consta if (timestamp == -1) { timestamp = activity.timestamp; } - ParcelableActivityUtils.initAfterFilteredSourceIds(activity, filteredUserIds, + ParcelableActivityUtils.INSTANCE.initAfterFilteredSourceIds(activity, filteredUserIds, pref.isNotificationFollowingOnly()); - final ParcelableUser[] sources = ParcelableActivityUtils.getAfterFilteredSources(activity); + final ParcelableUser[] sources = ParcelableActivityUtils.INSTANCE.getAfterFilteredSources(activity); if (ArrayUtils.isEmpty(sources)) continue; final ActivityTitleSummaryMessage message = ActivityTitleSummaryMessage.get(context, mUserColorNameManager, activity, sources, diff --git a/twidere/src/main/java/org/mariotaku/twidere/task/twitter/GetActivitiesTask.java b/twidere/src/main/java/org/mariotaku/twidere/task/twitter/GetActivitiesTask.java index 80092904e..d07dc55f0 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/task/twitter/GetActivitiesTask.java +++ b/twidere/src/main/java/org/mariotaku/twidere/task/twitter/GetActivitiesTask.java @@ -154,7 +154,7 @@ public abstract class GetActivitiesTask extends AbstractTask { if (ArrayUtils.isEmpty(activity.target_statuses)) { return ITEM_VIEW_TYPE_STUB } - if (followingOnly && !activity.status_user_following) return ITEM_VIEW_TYPE_EMPTY return ITEM_VIEW_TYPE_STATUS } Activity.Action.QUOTE -> { if (ArrayUtils.isEmpty(activity.target_statuses)) { return ITEM_VIEW_TYPE_STUB } - if (followingOnly && !activity.status_user_following) return ITEM_VIEW_TYPE_EMPTY return ITEM_VIEW_TYPE_STATUS } Activity.Action.FOLLOW, Activity.Action.FAVORITE, Activity.Action.RETWEET, @@ -290,9 +287,11 @@ class ParcelableActivitiesAdapter( Activity.Action.MEDIA_TAGGED, Activity.Action.RETWEETED_MEDIA_TAGGED, Activity.Action.FAVORITED_MEDIA_TAGGED, Activity.Action.JOINED_TWITTER -> { if (mentionsOnly) return ITEM_VIEW_TYPE_EMPTY - ParcelableActivityUtils.initAfterFilteredSourceIds(activity, filteredUserIds, followingOnly) - if (ArrayUtils.isEmpty(activity.after_filtered_source_ids)) { - return ITEM_VIEW_TYPE_EMPTY + if (filteredUserIds != null) { + ParcelableActivityUtils.initAfterFilteredSourceIds(activity, filteredUserIds!!, followingOnly) + if (ArrayUtils.isEmpty(activity.after_filtered_source_ids)) { + return ITEM_VIEW_TYPE_EMPTY + } } return ITEM_VIEW_TYPE_TITLE_SUMMARY } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorActivitiesFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorActivitiesFragment.kt index 461287b9e..055b86636 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorActivitiesFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorActivitiesFragment.kt @@ -96,11 +96,11 @@ abstract class CursorActivitiesFragment : AbsActivitiesFragment() { accountKeys.size) val expression = processWhere(where, accountSelectionArgs) val selection = expression.sql - val adapter = adapter - adapter!!.showAccountsColor = accountKeys.size > 1 + val adapter = adapter!! + adapter.showAccountsColor = accountKeys.size > 1 val projection = Activities.COLUMNS - return CursorActivitiesLoader(context, uri, projection, selection, - expression.parameters, sortOrder, fromUser) + return CursorActivitiesLoader(context, uri, projection, selection, expression.parameters, + sortOrder, fromUser) } override fun createMessageBusCallback(): Any { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/InteractionsTimelineFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/InteractionsTimelineFragment.kt index be2ebd99d..bbe6f9d8b 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/InteractionsTimelineFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/InteractionsTimelineFragment.kt @@ -22,7 +22,6 @@ package org.mariotaku.twidere.fragment import android.content.Context import android.net.Uri import edu.tsinghua.hotmobi.model.TimelineType -import org.apache.commons.lang3.ArrayUtils import org.mariotaku.microblog.library.twitter.model.Activity import org.mariotaku.sqliteqb.library.Expression import org.mariotaku.twidere.TwidereConstants.NOTIFICATION_ID_INTERACTIONS_TIMELINE @@ -65,10 +64,18 @@ class InteractionsTimelineFragment : CursorActivitiesFragment() { val arguments = arguments if (arguments != null) { val extras = arguments.getParcelable(EXTRA_EXTRAS) - if (extras != null && extras.isMentionsOnly) { - val expression = Expression.and(where, Expression.inArgs(Activities.ACTION, 3)) - return ParameterizedExpression(expression, ArrayUtils.addAll(whereArgs, Activity.Action.MENTION, - Activity.Action.REPLY, Activity.Action.QUOTE)) + if (extras != null) { + val expressions = mutableListOf(where) + val combinedArgs = mutableListOf(*whereArgs) + if (extras.isMentionsOnly) { + expressions.add(Expression.inArgs(Activities.ACTION, 3)) + combinedArgs.addAll(arrayOf(Activity.Action.MENTION, Activity.Action.REPLY, Activity.Action.QUOTE)) + } + if (extras.isMyFollowingOnly) { + expressions.add(Expression.equals(Activities.HAS_FOLLOWING_SOURCE, 1)) + } + return ParameterizedExpression(Expression.and(*expressions.toTypedArray()), + combinedArgs.toTypedArray()) } } return super.processWhere(where, whereArgs) diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/util/ParcelableActivityExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableActivityExtensions.kt similarity index 100% rename from twidere/src/main/java/org/mariotaku/twidere/model/util/ParcelableActivityExtensions.kt rename to twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableActivityExtensions.kt diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableActivityUtils.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableActivityUtils.kt new file mode 100644 index 000000000..1161285e7 --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableActivityUtils.kt @@ -0,0 +1,97 @@ +package org.mariotaku.twidere.model.util + +import org.apache.commons.lang3.ArrayUtils +import org.mariotaku.microblog.library.twitter.model.Activity +import org.mariotaku.twidere.model.ParcelableActivity +import org.mariotaku.twidere.model.ParcelableUser +import org.mariotaku.twidere.model.UserKey +import java.util.* + +/** + * Processing ParcelableActivity + * + * + * Created by mariotaku on 16/1/2. + */ +object ParcelableActivityUtils { + + /** + * @param activity Activity for processing + * * + * @param filteredUserIds Those ids will be removed from source_ids. + * * + * @param followingOnly Limit following users in sources + * * + * @return true if source ids changed, false otherwise + */ + fun initAfterFilteredSourceIds(activity: ParcelableActivity, filteredUserIds: Array, + followingOnly: Boolean): Boolean { + if (activity.sources == null) return false + if (activity.after_filtered_source_ids != null) return false + if (followingOnly || !ArrayUtils.isEmpty(filteredUserIds)) { + val list = ArrayList() + for (user in activity.sources) { + if (followingOnly && !user.is_following) { + continue + } + + if (!ArrayUtils.contains(filteredUserIds, user.key)) { + list.add(user.key) + } + } + activity.after_filtered_source_ids = list.toTypedArray() + return true + } else { + activity.after_filtered_source_ids = activity.source_ids + return false + } + } + + fun getAfterFilteredSources(activity: ParcelableActivity): Array { + if (activity.after_filtered_sources != null) return activity.after_filtered_sources + if (activity.after_filtered_source_ids == null || activity.sources.size == activity.after_filtered_source_ids.size) { + return activity.sources + } + val result = Array(activity.after_filtered_source_ids.size) { idx -> + return@Array activity.sources.find { it.key == activity.after_filtered_source_ids[idx] }!! + } + activity.after_filtered_sources = result + return result + } + + fun fromActivity(activity: Activity, + accountKey: UserKey, + isGap: Boolean): ParcelableActivity { + val result = ParcelableActivity() + result.account_key = accountKey + result.timestamp = activity.createdAt.time + result.action = activity.action + result.max_sort_position = activity.maxSortPosition + result.min_sort_position = activity.minSortPosition + result.max_position = activity.maxPosition + result.min_position = activity.minPosition + result.sources = ParcelableUserUtils.fromUsers(activity.sources, accountKey) + result.target_users = ParcelableUserUtils.fromUsers(activity.targetUsers, accountKey) + result.target_user_lists = ParcelableUserListUtils.fromUserLists(activity.targetUserLists, accountKey) + result.target_statuses = ParcelableStatusUtils.fromStatuses(activity.targetStatuses, accountKey) + result.target_object_statuses = ParcelableStatusUtils.fromStatuses(activity.targetObjectStatuses, accountKey) + result.target_object_user_lists = ParcelableUserListUtils.fromUserLists(activity.targetObjectUserLists, accountKey) + result.target_object_users = ParcelableUserUtils.fromUsers(activity.targetObjectUsers, accountKey) + result.has_following_source = activity.sources.fold(false) { folded, item -> + if (item.isFollowing) { + return@fold true + } + return@fold false + } + if (result.sources != null) { + result.source_ids = arrayOfNulls(result.sources.size) + for (i in result.sources.indices) { + result.source_ids[i] = result.sources[i].key + } + } + result.is_gap = isGap + return result + } + + +}