activities about me supports my following only limitation

This commit is contained in:
Mariotaku Lee 2016-01-02 18:27:45 +08:00
parent 84d8780423
commit f8264eddc0
6 changed files with 91 additions and 36 deletions

View File

@ -105,10 +105,14 @@ public class ParcelableActivity implements Comparable<ParcelableActivity>, Parce
@JsonField(name = "is_gap")
@CursorField(value = Activities.IS_GAP)
public boolean is_gap;
@ParcelableThisPlease
@JsonField(name = "status_user_following")
@CursorField(value = Activities.STATUS_USER_FOLLOWING, excludeWrite = true)
public boolean status_user_following;
public transient long[] filtered_source_ids;
public transient ParcelableUser[] filtered_sources;
public transient long[] after_filtered_source_ids;
public transient ParcelableUser[] after_filtered_sources;
public ParcelableActivity() {
}
@ -204,19 +208,4 @@ public class ParcelableActivity implements Comparable<ParcelableActivity>, Parce
}
};
public ParcelableUser[] getUnfilteredSources() {
if (filtered_sources != null) return filtered_sources;
if (filtered_source_ids == null || sources.length == filtered_source_ids.length) {
return sources;
}
ParcelableUser[] result = new ParcelableUser[filtered_source_ids.length];
for (int i = 0; i < filtered_source_ids.length; i++) {
for (ParcelableUser user : sources) {
if (user.id == filtered_source_ids[i]) {
result[i] = user;
}
}
}
return filtered_sources = result;
}
}

View File

@ -31,7 +31,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.apache.commons.collections.primitives.ArrayLongList;
import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
@ -42,6 +41,7 @@ import org.mariotaku.twidere.fragment.support.UserFragment;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.util.ParcelableActivityUtils;
import org.mariotaku.twidere.util.MediaLoadingHandler;
import org.mariotaku.twidere.util.OnLinkClickHandler;
import org.mariotaku.twidere.util.ThemeUtils;
@ -76,6 +76,7 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
private ActivityAdapterListener mActivityAdapterListener;
private long[] mFilteredUserIds;
private boolean mFollowingOnly;
protected AbsActivitiesAdapter(final Context context, boolean compact) {
super(context);
@ -224,8 +225,7 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
}
case ITEM_VIEW_TYPE_EMPTY: {
final View view = new Space(getContext());
return new ViewHolder(view) {
};
return new EmptyViewHolder(view);
}
}
throw new UnsupportedOperationException("Unsupported viewType " + viewType);
@ -271,36 +271,28 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
if (ArrayUtils.isEmpty(activity.target_object_statuses)) {
return ITEM_VIEW_TYPE_STUB;
}
if (mFollowingOnly && !activity.status_user_following) return ITEM_VIEW_TYPE_EMPTY;
return ITEM_VIEW_TYPE_STATUS;
} else if (Activity.Action.REPLY.literal.equals(action)) {
if (ArrayUtils.isEmpty(activity.target_statuses)) {
return ITEM_VIEW_TYPE_STUB;
}
if (mFollowingOnly && !activity.status_user_following) return ITEM_VIEW_TYPE_EMPTY;
return ITEM_VIEW_TYPE_STATUS;
} else if (Activity.Action.QUOTE.literal.equals(action)) {
if (ArrayUtils.isEmpty(activity.target_statuses)) {
return ITEM_VIEW_TYPE_STUB;
}
if (mFollowingOnly && !activity.status_user_following) return ITEM_VIEW_TYPE_EMPTY;
return ITEM_VIEW_TYPE_STATUS;
} else if (Activity.Action.FOLLOW.literal.equals(action) || Activity.Action.FAVORITE.literal.equals(action)
|| Activity.Action.RETWEET.literal.equals(action) || Activity.Action.FAVORITED_RETWEET.literal.equals(action)
|| Activity.Action.RETWEETED_RETWEET.literal.equals(action) || Activity.Action.RETWEETED_MENTION.literal.equals(action)
|| Activity.Action.FAVORITED_MENTION.literal.equals(action) || Activity.Action.LIST_CREATED.literal.equals(action)
|| Activity.Action.LIST_MEMBER_ADDED.literal.equals(action)) {
if (activity.filtered_source_ids == null) {
if (!ArrayUtils.isEmpty(mFilteredUserIds)) {
ArrayLongList list = new ArrayLongList();
for (long id : ArrayUtils.nullToEmpty(activity.source_ids)) {
if (!ArrayUtils.contains(mFilteredUserIds, id)) {
list.add(id);
}
}
activity.filtered_source_ids = list.toArray();
} else {
activity.filtered_source_ids = activity.source_ids;
}
}
if (ArrayUtils.isEmpty(activity.filtered_source_ids)) {
ParcelableActivityUtils.getAfterFilteredSourceIds(activity, mFilteredUserIds,
mFollowingOnly);
if (ArrayUtils.isEmpty(activity.after_filtered_source_ids)) {
return ITEM_VIEW_TYPE_EMPTY;
}
return ITEM_VIEW_TYPE_TITLE_SUMMARY;
@ -308,6 +300,11 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
return ITEM_VIEW_TYPE_STUB;
}
public void setFollowingOnly(boolean followingOnly) {
mFollowingOnly = followingOnly;
notifyDataSetChanged();
}
@Override
public final int getItemCount() {
return getActivityCount() + (isLoadMoreIndicatorVisible() ? 1 : 0);
@ -404,4 +401,9 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
}
private static class EmptyViewHolder extends ViewHolder {
public EmptyViewHolder(View view) {
super(view);
}
}
}

View File

@ -47,6 +47,7 @@ import org.mariotaku.twidere.loader.iface.IExtendedLoader;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.util.ParcelableActivityUtils;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
@ -361,7 +362,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
public void onActivityClick(ActivityTitleSummaryViewHolder holder, int position) {
final ParcelableActivity activity = getAdapter().getActivity(position);
if (activity == null) return;
Utils.openUsers(getActivity(), Arrays.asList(activity.sources));
Utils.openUsers(getActivity(), Arrays.asList(ParcelableActivityUtils.getAfterFilteredSources(activity)));
}
@Override

View File

@ -19,9 +19,12 @@
package org.mariotaku.twidere.fragment.support;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import org.mariotaku.twidere.adapter.ParcelableActivitiesAdapter;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import edu.tsinghua.hotmobi.model.TimelineType;
@ -60,6 +63,20 @@ public class ActivitiesAboutMeFragment extends CursorActivitiesFragment {
setRefreshing(mTwitterWrapper.isMentionsTimelineRefreshing());
}
@NonNull
@Override
protected ParcelableActivitiesAdapter onCreateAdapter(Context context, boolean compact) {
final ParcelableActivitiesAdapter adapter = super.onCreateAdapter(context, compact);
final Bundle arguments = getArguments();
if (arguments != null) {
final Bundle extras = arguments.getBundle(EXTRA_EXTRAS);
if (extras != null) {
adapter.setFollowingOnly(extras.getBoolean(EXTRA_MY_FOLLOWING_ONLY));
}
}
return adapter;
}
@Override
protected String getReadPositionTag() {
return READ_POSITION_TAG_ACTIVITIES_ABOUT_ME;

View File

@ -0,0 +1,45 @@
package org.mariotaku.twidere.model.util;
import org.apache.commons.collections.primitives.ArrayLongList;
import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableUser;
/**
* Created by mariotaku on 16/1/2.
*/
public class ParcelableActivityUtils {
public static void getAfterFilteredSourceIds(ParcelableActivity activity, long[] filteredUserIds, boolean followingOnly) {
if (activity.after_filtered_source_ids != null) return;
if (!ArrayUtils.isEmpty(filteredUserIds)) {
ArrayLongList list = new ArrayLongList();
for (ParcelableUser user : activity.sources) {
if (followingOnly && !user.is_following) {
continue;
}
if (!ArrayUtils.contains(filteredUserIds, user.id)) {
list.add(user.id);
}
}
activity.after_filtered_source_ids = list.toArray();
} else {
activity.after_filtered_source_ids = activity.source_ids;
}
}
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.id == activity.after_filtered_source_ids[i]) {
result[i] = user;
}
}
}
return activity.after_filtered_sources = result;
}
}

View File

@ -32,6 +32,7 @@ import org.mariotaku.twidere.adapter.AbsActivitiesAdapter;
import org.mariotaku.twidere.model.ActivityTitleSummaryMessage;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.util.ParcelableActivityUtils;
import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.view.ActionIconView;
import org.mariotaku.twidere.view.BadgeView;
@ -75,7 +76,7 @@ public class ActivityTitleSummaryViewHolder extends ViewHolder implements View.O
public void displayActivity(ParcelableActivity activity, boolean byFriends) {
final Context context = adapter.getContext();
final ParcelableUser[] sources = activity.getUnfilteredSources();
final ParcelableUser[] sources = ParcelableActivityUtils.getAfterFilteredSources(activity);
final ActivityTitleSummaryMessage message = ActivityTitleSummaryMessage.get(context,
adapter.getUserColorNameManager(), activity, sources, activityTypeView.getDefaultColor(),
byFriends, adapter.shouldUseStarsForLikes(), adapter.isNameFirst());