fixed text selection

fixed item click
This commit is contained in:
Mariotaku Lee 2016-03-21 08:34:20 +08:00
parent a62fdf7535
commit 83cbadb4e1
22 changed files with 223 additions and 273 deletions

View File

@ -62,6 +62,10 @@ public final class DummyItemAdapter implements IStatusesAdapter<Object>,
private boolean useStarsForLikes; private boolean useStarsForLikes;
private boolean showAbsoluteTime; private boolean showAbsoluteTime;
private int showingActionCardPosition = RecyclerView.NO_POSITION; private int showingActionCardPosition = RecyclerView.NO_POSITION;
private FollowClickListener followClickListener;
private RequestClickListener requestClickListener;
private IStatusViewHolder.StatusClickListener statusClickListener;
private UserClickListener userClickListener;
public DummyItemAdapter(Context context) { public DummyItemAdapter(Context context) {
this(context, new TwidereLinkify(null), null); this(context, new TwidereLinkify(null), null);
@ -84,14 +88,14 @@ public final class DummyItemAdapter implements IStatusesAdapter<Object>,
@NonNull @NonNull
@Override @Override
public MediaLoaderWrapper getMediaLoader() { public Context getContext() {
return loader; return context;
} }
@Nullable @NonNull
@Override @Override
public UserListAdapterListener getUserListAdapterListener() { public MediaLoaderWrapper getMediaLoader() {
return null; return loader;
} }
@NonNull @NonNull
@ -100,35 +104,33 @@ public final class DummyItemAdapter implements IStatusesAdapter<Object>,
return formatter; return formatter;
} }
@NonNull
@Override
public Context getContext() {
return context;
}
@Override @Override
public MediaLoadingHandler getMediaLoadingHandler() { public MediaLoadingHandler getMediaLoadingHandler() {
return handler; return handler;
} }
@Nullable
@Override
public IStatusViewHolder.StatusClickListener getStatusClickListener() {
return null;
}
@Nullable
@Override
public StatusAdapterListener getStatusAdapterListener() {
return null;
}
@NonNull @NonNull
@Override @Override
public UserColorNameManager getUserColorNameManager() { public UserColorNameManager getUserColorNameManager() {
return manager; return manager;
} }
@Nullable
@Override
public UserListClickListener getUserListClickListener() {
return null;
}
@Nullable
@Override
public IStatusViewHolder.StatusClickListener getStatusClickListener() {
return statusClickListener;
}
public void setStatusClickListener(IStatusViewHolder.StatusClickListener statusClickListener) {
this.statusClickListener = statusClickListener;
}
@Override @Override
public int getItemCount() { public int getItemCount() {
return 0; return 0;
@ -155,7 +157,17 @@ public final class DummyItemAdapter implements IStatusesAdapter<Object>,
return textSize; return textSize;
} }
@Nullable
public UserClickListener getUserClickListener() {
return userClickListener;
}
public void setUserClickListener(UserClickListener userClickListener) {
this.userClickListener = userClickListener;
}
@Override @Override
@IndicatorPosition @IndicatorPosition
public int getLoadMoreIndicatorPosition() { public int getLoadMoreIndicatorPosition() {
return IndicatorPosition.NONE; return IndicatorPosition.NONE;
@ -179,6 +191,11 @@ public final class DummyItemAdapter implements IStatusesAdapter<Object>,
@Override @Override
public ParcelableStatus getStatus(int position) { public ParcelableStatus getStatus(int position) {
if (adapter instanceof ParcelableStatusesAdapter) {
return ((ParcelableStatusesAdapter) adapter).getStatus(position);
} else if (adapter instanceof VariousItemsAdapter) {
return (ParcelableStatus) ((VariousItemsAdapter) adapter).getItem(position);
}
return null; return null;
} }
@ -249,7 +266,6 @@ public final class DummyItemAdapter implements IStatusesAdapter<Object>,
return sensitiveContentEnabled; return sensitiveContentEnabled;
} }
@Override @Override
public boolean isCardActionsShown(int position) { public boolean isCardActionsShown(int position) {
if (position == RecyclerView.NO_POSITION) return showCardActions; if (position == RecyclerView.NO_POSITION) return showCardActions;
@ -269,6 +285,11 @@ public final class DummyItemAdapter implements IStatusesAdapter<Object>,
@Override @Override
public ParcelableUser getUser(int position) { public ParcelableUser getUser(int position) {
if (adapter instanceof ParcelableUsersAdapter) {
return ((ParcelableUsersAdapter) adapter).getUser(position);
} else if (adapter instanceof VariousItemsAdapter) {
return (ParcelableUser) ((VariousItemsAdapter) adapter).getItem(position);
}
return null; return null;
} }
@ -303,20 +324,23 @@ public final class DummyItemAdapter implements IStatusesAdapter<Object>,
} }
@Nullable
@Override
public UserAdapterListener getUserAdapterListener() {
return null;
}
@Override @Override
public RequestClickListener getRequestClickListener() { public RequestClickListener getRequestClickListener() {
return null; return requestClickListener;
}
public void setRequestClickListener(RequestClickListener requestClickListener) {
this.requestClickListener = requestClickListener;
} }
@Override @Override
public FollowClickListener getFollowClickListener() { public FollowClickListener getFollowClickListener() {
return null; return followClickListener;
}
public void setFollowClickListener(FollowClickListener followClickListener) {
this.followClickListener = followClickListener;
} }
@Override @Override
@ -363,11 +387,11 @@ public final class DummyItemAdapter implements IStatusesAdapter<Object>,
textSize = preferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size)); textSize = preferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size));
nameFirst = preferences.getBoolean(KEY_NAME_FIRST, true); nameFirst = preferences.getBoolean(KEY_NAME_FIRST, true);
displayProfileImage = preferences.getBoolean(KEY_DISPLAY_PROFILE_IMAGE, true); displayProfileImage = preferences.getBoolean(KEY_DISPLAY_PROFILE_IMAGE, true);
displayMediaPreview = preferences.getBoolean(KEY_MEDIA_PREVIEW, false); setMediaPreviewEnabled(preferences.getBoolean(KEY_MEDIA_PREVIEW, false));
sensitiveContentEnabled = preferences.getBoolean(KEY_DISPLAY_SENSITIVE_CONTENTS, false); sensitiveContentEnabled = preferences.getBoolean(KEY_DISPLAY_SENSITIVE_CONTENTS, false);
showCardActions = !preferences.getBoolean(KEY_HIDE_CARD_ACTIONS, false); showCardActions = !preferences.getBoolean(KEY_HIDE_CARD_ACTIONS, false);
linkHighlightStyle = Utils.getLinkHighlightingStyleInt(preferences.getString(KEY_LINK_HIGHLIGHT_OPTION, null)); linkHighlightStyle = Utils.getLinkHighlightingStyleInt(preferences.getString(KEY_LINK_HIGHLIGHT_OPTION, null));
useStarsForLikes = preferences.getBoolean(KEY_I_WANT_MY_STARS_BACK); setUseStarsForLikes(preferences.getBoolean(KEY_I_WANT_MY_STARS_BACK));
showAbsoluteTime = preferences.getBoolean(KEY_SHOW_ABSOLUTE_TIME); setShowAbsoluteTime(preferences.getBoolean(KEY_SHOW_ABSOLUTE_TIME));
} }
} }

View File

@ -42,7 +42,6 @@ import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableActivityCursorIndices; import org.mariotaku.twidere.model.ParcelableActivityCursorIndices;
import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableStatusCursorIndices;
import org.mariotaku.twidere.model.UserKey; import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.util.ParcelableActivityUtils; import org.mariotaku.twidere.model.util.ParcelableActivityUtils;
import org.mariotaku.twidere.util.IntentUtils; import org.mariotaku.twidere.util.IntentUtils;
@ -220,10 +219,6 @@ public class ParcelableActivitiesAdapter extends LoadMoreSupportAdapter<Recycler
return mStatusAdapterDelegate.getTextSize(); return mStatusAdapterDelegate.getTextSize();
} }
public int getLinkHighlightingStyle() {
return mStatusAdapterDelegate.getLinkHighlightingStyle();
}
public boolean isNameFirst() { public boolean isNameFirst() {
return mStatusAdapterDelegate.isNameFirst(); return mStatusAdapterDelegate.isNameFirst();
} }
@ -469,11 +464,11 @@ public class ParcelableActivitiesAdapter extends LoadMoreSupportAdapter<Recycler
} }
@Override @Override
public final void onGapClick(RecyclerView.ViewHolder holder, int position) { public final void onGapClick(GapViewHolder holder, int position) {
final ParcelableActivitiesAdapter adapter = adapterRef.get(); final ParcelableActivitiesAdapter adapter = adapterRef.get();
if (adapter == null) return; if (adapter == null) return;
if (adapter.mActivityAdapterListener != null) { if (adapter.mActivityAdapterListener != null) {
adapter.mActivityAdapterListener.onGapClick((GapViewHolder) holder, position); adapter.mActivityAdapterListener.onGapClick(holder, position);
} }
} }

View File

@ -33,7 +33,6 @@ import org.mariotaku.library.objectcursor.ObjectCursor;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.iface.IStatusesAdapter; import org.mariotaku.twidere.adapter.iface.IStatusesAdapter;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableStatusCursorIndices; import org.mariotaku.twidere.model.ParcelableStatusCursorIndices;
import org.mariotaku.twidere.model.UserKey; import org.mariotaku.twidere.model.UserKey;
@ -49,7 +48,6 @@ import org.mariotaku.twidere.view.holder.GapViewHolder;
import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder; import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder; import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
import java.lang.ref.WeakReference;
import java.util.List; import java.util.List;
/** /**
@ -78,9 +76,8 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
private final boolean mShowCardActions; private final boolean mShowCardActions;
private final boolean mUseStarsForLikes; private final boolean mUseStarsForLikes;
private final boolean mShowAbsoluteTime; private final boolean mShowAbsoluteTime;
private final EventListener mEventListener;
@Nullable @Nullable
private StatusAdapterListener mStatusAdapterListener; private IStatusViewHolder.StatusClickListener mStatusClickListener;
private boolean mShowInReplyTo; private boolean mShowInReplyTo;
private boolean mShowAccountsColor; private boolean mShowAccountsColor;
private List<ParcelableStatus> mData; private List<ParcelableStatus> mData;
@ -93,7 +90,6 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
ThemeUtils.getUserThemeBackgroundAlpha(context)); ThemeUtils.getUserThemeBackgroundAlpha(context));
mInflater = LayoutInflater.from(context); mInflater = LayoutInflater.from(context);
mLoadingHandler = new MediaLoadingHandler(getProgressViewIds()); mLoadingHandler = new MediaLoadingHandler(getProgressViewIds());
mEventListener = new EventListener(this);
mTextSize = mPreferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size)); mTextSize = mPreferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size));
mCompactCards = compact; mCompactCards = compact;
mProfileImageStyle = Utils.getProfileImageStyle(mPreferences.getString(KEY_PROFILE_IMAGE_STYLE, null)); mProfileImageStyle = Utils.getProfileImageStyle(mPreferences.getString(KEY_PROFILE_IMAGE_STYLE, null));
@ -243,7 +239,11 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
@Nullable @Nullable
@Override @Override
public IStatusViewHolder.StatusClickListener getStatusClickListener() { public IStatusViewHolder.StatusClickListener getStatusClickListener() {
return mEventListener; return mStatusClickListener;
}
public void setStatusClickListener(@Nullable IStatusViewHolder.StatusClickListener statusClickListener) {
mStatusClickListener = statusClickListener;
} }
@Override @Override
@ -261,14 +261,7 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
return mTextSize; return mTextSize;
} }
@Nullable
@Override @Override
public StatusAdapterListener getStatusAdapterListener() {
return mStatusAdapterListener;
}
@Override
public TwidereLinkify getTwidereLinkify() { public TwidereLinkify getTwidereLinkify() {
return mLinkify; return mLinkify;
} }
@ -409,10 +402,6 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
return count; return count;
} }
public void setListener(@Nullable StatusAdapterListener listener) {
mStatusAdapterListener = listener;
}
public void setShowAccountsColor(boolean showAccountsColor) { public void setShowAccountsColor(boolean showAccountsColor) {
if (mShowAccountsColor == showAccountsColor) return; if (mShowAccountsColor == showAccountsColor) return;
mShowAccountsColor = showAccountsColor; mShowAccountsColor = showAccountsColor;
@ -423,7 +412,7 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
@Override @Override
public ParcelableStatus findStatusById(UserKey accountKey, String statusId) { public ParcelableStatus findStatusById(UserKey accountKey, String statusId) {
for (int i = 0, j = getStatusCount(); i < j; i++) { for (int i = 0, j = getStatusCount(); i < j; i++) {
if (accountKey.equals(getAccountKey(i)) && statusId == getStatusId(i)) { if (accountKey.equals(getAccountKey(i)) && statusId.equals(getStatusId(i))) {
return getStatus(i); return getStatus(i);
} }
} }
@ -437,7 +426,7 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
@Nullable @Nullable
@Override @Override
public GapClickListener getGapClickListener() { public GapClickListener getGapClickListener() {
return mEventListener; return mStatusClickListener;
} }
public int getStatusStartIndex() { public int getStatusStartIndex() {
@ -454,77 +443,4 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
return getStatus(position).is_filtered; return getStatus(position).is_filtered;
} }
public static class EventListener implements GapClickListener, IStatusViewHolder.StatusClickListener {
private final WeakReference<IStatusesAdapter<?>> adapterRef;
public EventListener(IStatusesAdapter<?> adapter) {
adapterRef = new WeakReference<IStatusesAdapter<?>>(adapter);
}
@Override
public final void onStatusClick(IStatusViewHolder holder, int position) {
final IStatusesAdapter<?> adapter = adapterRef.get();
if (adapter == null) return;
final StatusAdapterListener listener = adapter.getStatusAdapterListener();
if (listener == null) return;
listener.onStatusClick(holder, position);
}
@Override
public void onMediaClick(IStatusViewHolder holder, View view, final ParcelableMedia media, int statusPosition) {
final IStatusesAdapter<?> adapter = adapterRef.get();
if (adapter == null) return;
final StatusAdapterListener listener = adapter.getStatusAdapterListener();
if (listener == null) return;
listener.onMediaClick(holder, view, media, statusPosition);
}
@Override
public void onUserProfileClick(final IStatusViewHolder holder, final int position) {
final IStatusesAdapter<?> adapter = adapterRef.get();
if (adapter == null) return;
final StatusAdapterListener listener = adapter.getStatusAdapterListener();
if (listener == null) return;
final ParcelableStatus status = adapter.getStatus(position);
if (status == null) return;
listener.onUserProfileClick(holder, status, position);
}
@Override
public boolean onStatusLongClick(IStatusViewHolder holder, int position) {
final IStatusesAdapter<?> adapter = adapterRef.get();
if (adapter == null) return false;
final StatusAdapterListener listener = adapter.getStatusAdapterListener();
return listener != null && listener.onStatusLongClick(holder, position);
}
@Override
public void onItemActionClick(RecyclerView.ViewHolder holder, int id, int position) {
final IStatusesAdapter<?> adapter = adapterRef.get();
if (adapter == null) return;
final StatusAdapterListener listener = adapter.getStatusAdapterListener();
if (listener == null) return;
listener.onStatusActionClick((IStatusViewHolder) holder, id, position);
}
@Override
public void onItemMenuClick(RecyclerView.ViewHolder holder, View menuView, int position) {
final IStatusesAdapter<?> adapter = adapterRef.get();
if (adapter == null) return;
final StatusAdapterListener listener = adapter.getStatusAdapterListener();
if (listener == null) return;
listener.onStatusMenuClick((IStatusViewHolder) holder, menuView, position);
}
@Override
public final void onGapClick(RecyclerView.ViewHolder holder, int position) {
final IStatusesAdapter<?> adapter = adapterRef.get();
if (adapter == null) return;
final StatusAdapterListener listener = adapter.getStatusAdapterListener();
if (listener == null) return;
listener.onGapClick((GapViewHolder) holder, position);
}
}
} }

View File

@ -48,9 +48,8 @@ public class ParcelableUserListsAdapter extends LoadMoreSupportAdapter<RecyclerV
private final boolean mDisplayProfileImage; private final boolean mDisplayProfileImage;
private final boolean mShowAbsoluteTime; private final boolean mShowAbsoluteTime;
private final boolean mNameFirst; private final boolean mNameFirst;
private final EventListener mEventListener;
private List<ParcelableUserList> mData; private List<ParcelableUserList> mData;
private UserListAdapterListener mUserListAdapterListener; private UserListClickListener mUserListClickListener;
public ParcelableUserListsAdapter(Context context) { public ParcelableUserListsAdapter(Context context) {
@ -58,7 +57,6 @@ public class ParcelableUserListsAdapter extends LoadMoreSupportAdapter<RecyclerV
mCardBackgroundColor = ThemeUtils.getCardBackgroundColor(context, mCardBackgroundColor = ThemeUtils.getCardBackgroundColor(context,
ThemeUtils.getThemeBackgroundOption(context), ThemeUtils.getThemeBackgroundOption(context),
ThemeUtils.getUserThemeBackgroundAlpha(context)); ThemeUtils.getUserThemeBackgroundAlpha(context));
mEventListener = new EventListener(this);
mInflater = LayoutInflater.from(context); mInflater = LayoutInflater.from(context);
mTextSize = mPreferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size)); mTextSize = mPreferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size));
mProfileImageStyle = Utils.getProfileImageStyle(mPreferences.getString(KEY_PROFILE_IMAGE_STYLE, null)); mProfileImageStyle = Utils.getProfileImageStyle(mPreferences.getString(KEY_PROFILE_IMAGE_STYLE, null));
@ -173,8 +171,8 @@ public class ParcelableUserListsAdapter extends LoadMoreSupportAdapter<RecyclerV
return ITEM_VIEW_TYPE_USER_LIST; return ITEM_VIEW_TYPE_USER_LIST;
} }
public void setListener(UserListAdapterListener userListAdapterListener) { public void setUserListClickListener(UserListClickListener userListClickListener) {
mUserListAdapterListener = userListAdapterListener; mUserListClickListener = userListClickListener;
} }
@Override @Override
@ -184,8 +182,8 @@ public class ParcelableUserListsAdapter extends LoadMoreSupportAdapter<RecyclerV
@Nullable @Nullable
@Override @Override
public IUserListsAdapter.UserListAdapterListener getUserListAdapterListener() { public UserListClickListener getUserListClickListener() {
return mEventListener; return mUserListClickListener;
} }
public static UserListViewHolder createUserListViewHolder(IUserListsAdapter<?> adapter, public static UserListViewHolder createUserListViewHolder(IUserListsAdapter<?> adapter,
@ -202,33 +200,5 @@ public class ParcelableUserListsAdapter extends LoadMoreSupportAdapter<RecyclerV
return holder; return holder;
} }
public interface UserListAdapterListener {
void onUserListClick(UserListViewHolder holder, int position);
boolean onUserListLongClick(UserListViewHolder holder, int position);
}
static class EventListener implements IUserListsAdapter.UserListAdapterListener {
private final ParcelableUserListsAdapter mAdapter;
public EventListener(ParcelableUserListsAdapter adapter) {
mAdapter = adapter;
}
@Override
public void onUserListClick(UserListViewHolder holder, int position) {
final UserListAdapterListener listener = mAdapter.mUserListAdapterListener;
if (listener == null) return;
listener.onUserListClick(holder, position);
}
@Override
public boolean onUserListLongClick(UserListViewHolder holder, int position) {
final UserListAdapterListener listener = mAdapter.mUserListAdapterListener;
return listener != null && listener.onUserListLongClick(holder, position);
}
}
} }

View File

@ -50,7 +50,7 @@ public class ParcelableUsersAdapter extends LoadMoreSupportAdapter<RecyclerView.
private final boolean mDisplayProfileImage; private final boolean mDisplayProfileImage;
private final boolean mShowAbsoluteTime; private final boolean mShowAbsoluteTime;
private List<ParcelableUser> mData; private List<ParcelableUser> mData;
private UserAdapterListener mUserAdapterListener; private UserClickListener mUserClickListener;
private RequestClickListener mRequestClickListener; private RequestClickListener mRequestClickListener;
private FollowClickListener mFollowClickListener; private FollowClickListener mFollowClickListener;
@ -200,12 +200,12 @@ public class ParcelableUsersAdapter extends LoadMoreSupportAdapter<RecyclerView.
@Nullable @Nullable
@Override @Override
public UserAdapterListener getUserAdapterListener() { public UserClickListener getUserClickListener() {
return mUserAdapterListener; return mUserClickListener;
} }
public void setUserAdapterListener(UserAdapterListener userAdapterListener) { public void setUserClickListener(UserClickListener userClickListener) {
mUserAdapterListener = userAdapterListener; mUserClickListener = userClickListener;
} }
@Override @Override

View File

@ -9,6 +9,7 @@ import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.ParcelableUserList; import org.mariotaku.twidere.model.ParcelableUserList;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TwidereLinkify;
import org.mariotaku.twidere.view.holder.StatusViewHolder; import org.mariotaku.twidere.view.holder.StatusViewHolder;
import org.mariotaku.twidere.view.holder.UserListViewHolder; import org.mariotaku.twidere.view.holder.UserListViewHolder;
import org.mariotaku.twidere.view.holder.UserViewHolder; import org.mariotaku.twidere.view.holder.UserViewHolder;
@ -38,7 +39,8 @@ public class VariousItemsAdapter extends LoadMoreSupportAdapter<RecyclerView.Vie
mCardBackgroundColor = ThemeUtils.getCardBackgroundColor(context, mCardBackgroundColor = ThemeUtils.getCardBackgroundColor(context,
ThemeUtils.getThemeBackgroundOption(context), ThemeUtils.getThemeBackgroundOption(context),
ThemeUtils.getUserThemeBackgroundAlpha(context)); ThemeUtils.getUserThemeBackgroundAlpha(context));
mDummyAdapter = new DummyItemAdapter(context); mDummyAdapter = new DummyItemAdapter(context, new TwidereLinkify(null), this);
mDummyAdapter.updateOptions();
setLoadMoreIndicatorPosition(IndicatorPosition.NONE); setLoadMoreIndicatorPosition(IndicatorPosition.NONE);
} }
@ -107,4 +109,12 @@ public class VariousItemsAdapter extends LoadMoreSupportAdapter<RecyclerView.Vie
if (mData == null) return 0; if (mData == null) return 0;
return mData.size(); return mData.size();
} }
public Object getItem(int position) {
return mData.get(position);
}
public DummyItemAdapter getDummyAdapter() {
return mDummyAdapter;
}
} }

View File

@ -20,7 +20,8 @@
package org.mariotaku.twidere.adapter.iface; package org.mariotaku.twidere.adapter.iface;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView.ViewHolder;
import org.mariotaku.twidere.view.holder.GapViewHolder;
/** /**
* Created by mariotaku on 14/12/3. * Created by mariotaku on 14/12/3.
@ -36,7 +37,7 @@ public interface IGapSupportedAdapter {
interface GapClickListener { interface GapClickListener {
void onGapClick(ViewHolder holder, int position); void onGapClick(GapViewHolder holder, int position);
} }

View File

@ -1,15 +1,12 @@
package org.mariotaku.twidere.adapter.iface; package org.mariotaku.twidere.adapter.iface;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.view.View;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.UserKey; import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.util.MediaLoadingHandler; import org.mariotaku.twidere.util.MediaLoadingHandler;
import org.mariotaku.twidere.util.TwidereLinkify; import org.mariotaku.twidere.util.TwidereLinkify;
import org.mariotaku.twidere.view.CardMediaContainer.PreviewStyle; import org.mariotaku.twidere.view.CardMediaContainer.PreviewStyle;
import org.mariotaku.twidere.view.holder.GapViewHolder;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder; import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
/** /**
@ -64,22 +61,4 @@ public interface IStatusesAdapter<Data> extends IContentCardAdapter, IGapSupport
@Nullable @Nullable
IStatusViewHolder.StatusClickListener getStatusClickListener(); IStatusViewHolder.StatusClickListener getStatusClickListener();
@Nullable
StatusAdapterListener getStatusAdapterListener();
interface StatusAdapterListener {
void onGapClick(GapViewHolder holder, int position);
void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition);
void onStatusActionClick(IStatusViewHolder holder, int id, int position);
void onStatusClick(IStatusViewHolder holder, int position);
boolean onStatusLongClick(IStatusViewHolder holder, int position);
void onStatusMenuClick(IStatusViewHolder holder, View menuView, int position);
void onUserProfileClick(IStatusViewHolder holder, ParcelableStatus status, int position);
}
} }

View File

@ -48,9 +48,9 @@ public interface IUserListsAdapter<Data> extends IContentCardAdapter {
MediaLoaderWrapper getMediaLoader(); MediaLoaderWrapper getMediaLoader();
@Nullable @Nullable
UserListAdapterListener getUserListAdapterListener(); UserListClickListener getUserListClickListener();
interface UserListAdapterListener { interface UserListClickListener {
void onUserListClick(UserListViewHolder holder, int position); void onUserListClick(UserListViewHolder holder, int position);

View File

@ -41,7 +41,7 @@ public interface IUsersAdapter<Data> extends IContentCardAdapter {
void setData(Data data); void setData(Data data);
@Nullable @Nullable
UserAdapterListener getUserAdapterListener(); UserClickListener getUserClickListener();
RequestClickListener getRequestClickListener(); RequestClickListener getRequestClickListener();
@ -53,7 +53,7 @@ public interface IUsersAdapter<Data> extends IContentCardAdapter {
@Override @Override
MediaLoaderWrapper getMediaLoader(); MediaLoaderWrapper getMediaLoader();
interface UserAdapterListener { interface UserClickListener {
void onUserClick(UserViewHolder holder, int position); void onUserClick(UserViewHolder holder, int position);
@ -71,4 +71,32 @@ public interface IUsersAdapter<Data> extends IContentCardAdapter {
interface FollowClickListener { interface FollowClickListener {
void onFollowClicked(UserViewHolder holder, int position); void onFollowClicked(UserViewHolder holder, int position);
} }
abstract class SimpleUserClickListener implements UserClickListener, RequestClickListener, FollowClickListener {
@Override
public void onFollowClicked(UserViewHolder holder, int position) {
}
@Override
public void onAcceptClicked(UserViewHolder holder, int position) {
}
@Override
public void onDenyClicked(UserViewHolder holder, int position) {
}
@Override
public void onUserClick(UserViewHolder holder, int position) {
}
@Override
public boolean onUserLongClick(UserViewHolder holder, int position) {
return false;
}
}
} }

View File

@ -44,7 +44,6 @@ import com.squareup.otto.Subscribe;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.ParcelableStatusesAdapter; import org.mariotaku.twidere.adapter.ParcelableStatusesAdapter;
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition; import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition;
import org.mariotaku.twidere.adapter.iface.IStatusesAdapter.StatusAdapterListener;
import org.mariotaku.twidere.annotation.ReadPositionTag; import org.mariotaku.twidere.annotation.ReadPositionTag;
import org.mariotaku.twidere.graphic.like.LikeAnimationDrawable; import org.mariotaku.twidere.graphic.like.LikeAnimationDrawable;
import org.mariotaku.twidere.loader.iface.IExtendedLoader; import org.mariotaku.twidere.loader.iface.IExtendedLoader;
@ -68,6 +67,7 @@ import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.imageloader.PauseRecyclerViewOnScrollListener; import org.mariotaku.twidere.util.imageloader.PauseRecyclerViewOnScrollListener;
import org.mariotaku.twidere.view.ExtendedRecyclerView; import org.mariotaku.twidere.view.ExtendedRecyclerView;
import org.mariotaku.twidere.view.holder.GapViewHolder; import org.mariotaku.twidere.view.holder.GapViewHolder;
import org.mariotaku.twidere.view.holder.StatusViewHolder;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder; import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
import java.io.File; import java.io.File;
@ -84,7 +84,7 @@ import edu.tsinghua.hotmobi.model.TimelineType;
* Created by mariotaku on 14/11/5. * Created by mariotaku on 14/11/5.
*/ */
public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFragment<ParcelableStatusesAdapter> public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFragment<ParcelableStatusesAdapter>
implements LoaderCallbacks<List<ParcelableStatus>>, StatusAdapterListener, KeyboardShortcutCallback { implements LoaderCallbacks<List<ParcelableStatus>>, IStatusViewHolder.StatusClickListener, KeyboardShortcutCallback {
private final Object mStatusesBusCallback; private final Object mStatusesBusCallback;
private final OnScrollListener mHotMobiScrollTracker = new OnScrollListener() { private final OnScrollListener mHotMobiScrollTracker = new OnScrollListener() {
@ -364,7 +364,7 @@ public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFrag
protected abstract String getTimelineType(); protected abstract String getTimelineType();
@Override @Override
public void onStatusActionClick(IStatusViewHolder holder, int id, int position) { public void onItemActionClick(RecyclerView.ViewHolder holder, int id, int position) {
final ParcelableStatusesAdapter adapter = getAdapter(); final ParcelableStatusesAdapter adapter = getAdapter();
final ParcelableStatus status = adapter.getStatus(position); final ParcelableStatus status = adapter.getStatus(position);
if (status == null) return; if (status == null) return;
@ -387,7 +387,8 @@ public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFrag
if (status.is_favorite) { if (status.is_favorite) {
twitter.destroyFavoriteAsync(status.account_key, status.id); twitter.destroyFavoriteAsync(status.account_key, status.id);
} else { } else {
holder.playLikeAnimation(new DefaultOnLikedListener(twitter, status)); ((StatusViewHolder) holder).playLikeAnimation(new DefaultOnLikedListener(twitter,
status));
} }
break; break;
} }
@ -407,7 +408,7 @@ public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFrag
} }
@Override @Override
public void onStatusMenuClick(IStatusViewHolder holder, View menuView, int position) { public void onItemMenuClick(RecyclerView.ViewHolder holder, View menuView, int position) {
if (getActivity() == null) return; if (getActivity() == null) return;
final LinearLayoutManager lm = getLayoutManager(); final LinearLayoutManager lm = getLayoutManager();
final View view = lm.findViewByPosition(position); final View view = lm.findViewByPosition(position);
@ -416,8 +417,9 @@ public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFrag
} }
@Override @Override
public void onUserProfileClick(IStatusViewHolder holder, ParcelableStatus status, int position) { public void onUserProfileClick(IStatusViewHolder holder, int position) {
final FragmentActivity activity = getActivity(); final FragmentActivity activity = getActivity();
final ParcelableStatus status = getAdapter().getStatus(position);
IntentUtils.openUserProfile(activity, status.account_key, status.user_key.getId(), IntentUtils.openUserProfile(activity, status.account_key, status.user_key.getId(),
status.user_screen_name, null, true, UserFragment.Referral.TIMELINE_STATUS); status.user_screen_name, null, true, UserFragment.Referral.TIMELINE_STATUS);
} }
@ -471,7 +473,7 @@ public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFrag
@Override @Override
public void onDestroy() { public void onDestroy() {
final ParcelableStatusesAdapter adapter = getAdapter(); final ParcelableStatusesAdapter adapter = getAdapter();
adapter.setListener(null); adapter.setStatusClickListener(null);
super.onDestroy(); super.onDestroy();
} }
@ -490,7 +492,7 @@ public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFrag
final ParcelableStatusesAdapter adapter = getAdapter(); final ParcelableStatusesAdapter adapter = getAdapter();
final RecyclerView recyclerView = getRecyclerView(); final RecyclerView recyclerView = getRecyclerView();
final LinearLayoutManager layoutManager = getLayoutManager(); final LinearLayoutManager layoutManager = getLayoutManager();
adapter.setListener(this); adapter.setStatusClickListener(this);
registerForContextMenu(recyclerView); registerForContextMenu(recyclerView);
mNavigationHelper = new RecyclerViewNavigationHelper(recyclerView, layoutManager, mNavigationHelper = new RecyclerViewNavigationHelper(recyclerView, layoutManager,
adapter, this); adapter, this);

View File

@ -10,8 +10,15 @@ import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader; import android.support.v4.content.Loader;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import org.mariotaku.twidere.adapter.DummyItemAdapter;
import org.mariotaku.twidere.adapter.VariousItemsAdapter; import org.mariotaku.twidere.adapter.VariousItemsAdapter;
import org.mariotaku.twidere.adapter.decorator.DividerItemDecoration; import org.mariotaku.twidere.adapter.decorator.DividerItemDecoration;
import org.mariotaku.twidere.adapter.iface.IUsersAdapter;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.util.IntentUtils;
import org.mariotaku.twidere.view.holder.UserViewHolder;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
import java.util.List; import java.util.List;
@ -31,7 +38,26 @@ public class ItemsListFragment extends AbsContentListRecyclerViewFragment<Variou
@NonNull @NonNull
@Override @Override
protected VariousItemsAdapter onCreateAdapter(Context context, boolean compact) { protected VariousItemsAdapter onCreateAdapter(Context context, boolean compact) {
return new VariousItemsAdapter(context, compact); final VariousItemsAdapter adapter = new VariousItemsAdapter(context, compact);
final DummyItemAdapter dummyItemAdapter = adapter.getDummyAdapter();
dummyItemAdapter.setStatusClickListener(new IStatusViewHolder.SimpleStatusClickListener() {
@Override
public void onStatusClick(IStatusViewHolder holder, int position) {
final ParcelableStatus status = dummyItemAdapter.getStatus(position);
if (status == null) return;
IntentUtils.openStatus(getContext(), status, null);
}
});
dummyItemAdapter.setUserClickListener(new IUsersAdapter.SimpleUserClickListener() {
@Override
public void onUserClick(UserViewHolder holder, int position) {
final ParcelableUser user = dummyItemAdapter.getUser(position);
if (user == null) return;
IntentUtils.openUserProfile(getContext(), user, null, true,
UserFragment.Referral.TIMELINE_STATUS);
}
});
return adapter;
} }
@Override @Override

View File

@ -31,8 +31,8 @@ import android.support.v7.widget.RecyclerView;
import android.view.KeyEvent; import android.view.KeyEvent;
import org.mariotaku.twidere.adapter.ParcelableUserListsAdapter; import org.mariotaku.twidere.adapter.ParcelableUserListsAdapter;
import org.mariotaku.twidere.adapter.ParcelableUserListsAdapter.UserListAdapterListener;
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition; import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition;
import org.mariotaku.twidere.adapter.iface.IUserListsAdapter.UserListClickListener;
import org.mariotaku.twidere.loader.iface.ICursorSupportLoader; import org.mariotaku.twidere.loader.iface.ICursorSupportLoader;
import org.mariotaku.twidere.loader.iface.IExtendedLoader; import org.mariotaku.twidere.loader.iface.IExtendedLoader;
import org.mariotaku.twidere.model.ParcelableUserList; import org.mariotaku.twidere.model.ParcelableUserList;
@ -46,7 +46,7 @@ import org.mariotaku.twidere.view.holder.UserListViewHolder;
import java.util.List; import java.util.List;
public abstract class ParcelableUserListsFragment extends AbsContentListRecyclerViewFragment<ParcelableUserListsAdapter> public abstract class ParcelableUserListsFragment extends AbsContentListRecyclerViewFragment<ParcelableUserListsAdapter>
implements LoaderCallbacks<List<ParcelableUserList>>, UserListAdapterListener, KeyboardShortcutCallback { implements LoaderCallbacks<List<ParcelableUserList>>, UserListClickListener, KeyboardShortcutCallback {
private RecyclerViewNavigationHelper mNavigationHelper; private RecyclerViewNavigationHelper mNavigationHelper;
private long mNextCursor; private long mNextCursor;
@ -141,7 +141,7 @@ public abstract class ParcelableUserListsFragment extends AbsContentListRecycler
final ParcelableUserListsAdapter adapter = getAdapter(); final ParcelableUserListsAdapter adapter = getAdapter();
final RecyclerView recyclerView = getRecyclerView(); final RecyclerView recyclerView = getRecyclerView();
final LinearLayoutManager layoutManager = getLayoutManager(); final LinearLayoutManager layoutManager = getLayoutManager();
adapter.setListener(this); adapter.setUserListClickListener(this);
mNavigationHelper = new RecyclerViewNavigationHelper(recyclerView, layoutManager, adapter, mNavigationHelper = new RecyclerViewNavigationHelper(recyclerView, layoutManager, adapter,
this); this);

View File

@ -38,7 +38,7 @@ import com.squareup.otto.Subscribe;
import org.mariotaku.twidere.adapter.ParcelableUsersAdapter; import org.mariotaku.twidere.adapter.ParcelableUsersAdapter;
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition; import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition;
import org.mariotaku.twidere.adapter.iface.IUsersAdapter; import org.mariotaku.twidere.adapter.iface.IUsersAdapter;
import org.mariotaku.twidere.adapter.iface.IUsersAdapter.UserAdapterListener; import org.mariotaku.twidere.adapter.iface.IUsersAdapter.UserClickListener;
import org.mariotaku.twidere.loader.iface.IExtendedLoader; import org.mariotaku.twidere.loader.iface.IExtendedLoader;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.UserKey; import org.mariotaku.twidere.model.UserKey;
@ -56,7 +56,7 @@ import org.mariotaku.twidere.view.holder.UserViewHolder;
import java.util.List; import java.util.List;
public abstract class ParcelableUsersFragment extends AbsContentListRecyclerViewFragment<ParcelableUsersAdapter> public abstract class ParcelableUsersFragment extends AbsContentListRecyclerViewFragment<ParcelableUsersAdapter>
implements LoaderCallbacks<List<ParcelableUser>>, UserAdapterListener, KeyboardShortcutCallback, implements LoaderCallbacks<List<ParcelableUser>>, UserClickListener, KeyboardShortcutCallback,
IUsersAdapter.FollowClickListener { IUsersAdapter.FollowClickListener {
@NonNull @NonNull
@ -74,7 +74,7 @@ public abstract class ParcelableUsersFragment extends AbsContentListRecyclerView
final ParcelableUsersAdapter adapter = getAdapter(); final ParcelableUsersAdapter adapter = getAdapter();
final RecyclerView recyclerView = getRecyclerView(); final RecyclerView recyclerView = getRecyclerView();
final LinearLayoutManager layoutManager = getLayoutManager(); final LinearLayoutManager layoutManager = getLayoutManager();
adapter.setUserAdapterListener(this); adapter.setUserClickListener(this);
mNavigationHelper = new RecyclerViewNavigationHelper(recyclerView, layoutManager, adapter, mNavigationHelper = new RecyclerViewNavigationHelper(recyclerView, layoutManager, adapter,
this); this);

View File

@ -89,11 +89,9 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.ColorPickerDialogActivity; import org.mariotaku.twidere.activity.ColorPickerDialogActivity;
import org.mariotaku.twidere.adapter.BaseRecyclerViewAdapter; import org.mariotaku.twidere.adapter.BaseRecyclerViewAdapter;
import org.mariotaku.twidere.adapter.LoadMoreSupportAdapter; import org.mariotaku.twidere.adapter.LoadMoreSupportAdapter;
import org.mariotaku.twidere.adapter.ParcelableStatusesAdapter;
import org.mariotaku.twidere.adapter.decorator.DividerItemDecoration; import org.mariotaku.twidere.adapter.decorator.DividerItemDecoration;
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition; import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition;
import org.mariotaku.twidere.adapter.iface.IStatusesAdapter; import org.mariotaku.twidere.adapter.iface.IStatusesAdapter;
import org.mariotaku.twidere.adapter.iface.IStatusesAdapter.StatusAdapterListener;
import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.Twitter;
import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.TwitterException;
import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.api.twitter.model.Paging;
@ -132,7 +130,7 @@ import org.mariotaku.twidere.util.AsyncTaskUtils;
import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.CheckUtils; import org.mariotaku.twidere.util.CheckUtils;
import org.mariotaku.twidere.util.CompareUtils; import org.mariotaku.twidere.util.CompareUtils;
import org.mariotaku.twidere.util.ContentScrollHandler; import org.mariotaku.twidere.util.ContentScrollHandler.ContentListSupport;
import org.mariotaku.twidere.util.DataStoreUtils; import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.HtmlSpanBuilder; import org.mariotaku.twidere.util.HtmlSpanBuilder;
import org.mariotaku.twidere.util.IntentUtils; import org.mariotaku.twidere.util.IntentUtils;
@ -169,6 +167,7 @@ import org.mariotaku.twidere.view.holder.GapViewHolder;
import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder; import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder;
import org.mariotaku.twidere.view.holder.StatusViewHolder; import org.mariotaku.twidere.view.holder.StatusViewHolder;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder; import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder.StatusClickListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -183,7 +182,7 @@ import edu.tsinghua.hotmobi.model.TweetEvent;
* Created by mariotaku on 14/12/5. * Created by mariotaku on 14/12/5.
*/ */
public class StatusFragment extends BaseSupportFragment implements LoaderCallbacks<SingleResponse<ParcelableStatus>>, public class StatusFragment extends BaseSupportFragment implements LoaderCallbacks<SingleResponse<ParcelableStatus>>,
OnMediaClickListener, StatusAdapterListener, KeyboardShortcutCallback, ContentScrollHandler.ContentListSupport { OnMediaClickListener, StatusClickListener, KeyboardShortcutCallback, ContentListSupport {
// Constants // Constants
private static final int LOADER_ID_DETAIL_STATUS = 1; private static final int LOADER_ID_DETAIL_STATUS = 1;
@ -376,7 +375,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
mLayoutManager.setRecycleChildrenOnDetach(true); mLayoutManager.setRecycleChildrenOnDetach(true);
mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setClipToPadding(false); mRecyclerView.setClipToPadding(false);
mStatusAdapter.setEventListener(this); mStatusAdapter.setStatusClickListener(this);
mRecyclerView.setAdapter(mStatusAdapter); mRecyclerView.setAdapter(mStatusAdapter);
registerForContextMenu(mRecyclerView); registerForContextMenu(mRecyclerView);
@ -418,7 +417,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
} }
@Override @Override
public void onStatusActionClick(IStatusViewHolder holder, int id, int position) { public void onItemActionClick(ViewHolder holder, int id, int position) {
final ParcelableStatus status = mStatusAdapter.getStatus(position); final ParcelableStatus status = mStatusAdapter.getStatus(position);
if (status == null) return; if (status == null) return;
switch (id) { switch (id) {
@ -440,7 +439,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
if (status.is_favorite) { if (status.is_favorite) {
twitter.destroyFavoriteAsync(status.account_key, status.id); twitter.destroyFavoriteAsync(status.account_key, status.id);
} else { } else {
holder.playLikeAnimation(new DefaultOnLikedListener(twitter, status)); ((StatusViewHolder) holder).playLikeAnimation(new DefaultOnLikedListener(twitter,
status));
} }
break; break;
} }
@ -458,7 +458,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
} }
@Override @Override
public void onStatusMenuClick(IStatusViewHolder holder, View menuView, int position) { public void onItemMenuClick(ViewHolder holder, View menuView, int position) {
if (getActivity() == null) return; if (getActivity() == null) return;
final View view = mLayoutManager.findViewByPosition(position); final View view = mLayoutManager.findViewByPosition(position);
if (view == null) return; if (view == null) return;
@ -466,8 +466,9 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
} }
@Override @Override
public void onUserProfileClick(IStatusViewHolder holder, ParcelableStatus status, int position) { public void onUserProfileClick(IStatusViewHolder holder, int position) {
final FragmentActivity activity = getActivity(); final FragmentActivity activity = getActivity();
final ParcelableStatus status = mStatusAdapter.getStatus(position);
IntentUtils.openUserProfile(activity, status.account_key, status.user_key.getId(), IntentUtils.openUserProfile(activity, status.account_key, status.user_key.getId(),
status.user_screen_name, null, true, UserFragment.Referral.TIMELINE_STATUS); status.user_screen_name, null, true, UserFragment.Referral.TIMELINE_STATUS);
} }
@ -1681,7 +1682,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
private final MediaLoadingHandler mMediaLoadingHandler; private final MediaLoadingHandler mMediaLoadingHandler;
private final TwidereLinkify mTwidereLinkify; private final TwidereLinkify mTwidereLinkify;
private StatusAdapterListener mStatusAdapterListener; private StatusClickListener mStatusClickListener;
private RecyclerView mRecyclerView; private RecyclerView mRecyclerView;
private DetailStatusViewHolder mStatusViewHolder; private DetailStatusViewHolder mStatusViewHolder;
@ -1701,7 +1702,6 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
private final boolean mShowCardActions; private final boolean mShowCardActions;
private final boolean mUseStarsForLikes; private final boolean mUseStarsForLikes;
private final boolean mShowAbsoluteTime; private final boolean mShowAbsoluteTime;
private final ParcelableStatusesAdapter.EventListener mEventListener;
private boolean mDetailMediaExpanded; private boolean mDetailMediaExpanded;
private ParcelableStatus mStatus; private ParcelableStatus mStatus;
@ -1749,7 +1749,6 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
mCardLayoutResource = R.layout.card_item_status; mCardLayoutResource = R.layout.card_item_status;
} }
mTwidereLinkify = new TwidereLinkify(new StatusAdapterLinkClickHandler<>(this)); mTwidereLinkify = new TwidereLinkify(new StatusAdapterLinkClickHandler<>(this));
mEventListener = new ParcelableStatusesAdapter.EventListener(this);
} }
public int findPositionById(long itemId) { public int findPositionById(long itemId) {
@ -1954,15 +1953,10 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
@Nullable @Nullable
@Override @Override
public IStatusViewHolder.StatusClickListener getStatusClickListener() { public StatusClickListener getStatusClickListener() {
return mEventListener; return mStatusClickListener;
} }
@Nullable
@Override
public StatusAdapterListener getStatusAdapterListener() {
return mStatusAdapterListener;
}
public ParcelableStatus getStatus() { public ParcelableStatus getStatus() {
return mStatus; return mStatus;
@ -1995,7 +1989,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
@Nullable @Nullable
@Override @Override
public GapClickListener getGapClickListener() { public GapClickListener getGapClickListener() {
return mEventListener; return mStatusClickListener;
} }
@ -2205,8 +2199,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
return mItemCounts[idx]; return mItemCounts[idx];
} }
public void setEventListener(StatusAdapterListener listener) { public void setStatusClickListener(StatusClickListener listener) {
mStatusAdapterListener = listener; mStatusClickListener = listener;
} }
public void setReplyError(CharSequence error) { public void setReplyError(CharSequence error) {
@ -2264,7 +2258,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
public void setStatusActivity(StatusActivity activity) { public void setStatusActivity(StatusActivity activity) {
final ParcelableStatus status = getStatus(); final ParcelableStatus status = getStatus();
if (status == null) return; if (status == null) return;
if (activity != null && activity.statusId != (status.is_retweet ? status.retweet_id : status.id)) { if (activity != null && activity.isStatus(status)) {
return; return;
} }
mStatusActivity = activity; mStatusActivity = activity;
@ -2603,6 +2597,10 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
", retweetCount=" + retweetCount + ", retweetCount=" + retweetCount +
'}'; '}';
} }
public boolean isStatus(ParcelableStatus status) {
return TextUtils.equals(statusId, status.is_retweet ? status.retweet_id : status.id);
}
} }
static class ReadPosition { static class ReadPosition {

View File

@ -919,9 +919,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
public void onPrepareOptionsMenu(final Menu menu) { public void onPrepareOptionsMenu(final Menu menu) {
final AsyncTwitterWrapper twitter = mTwitterWrapper; final AsyncTwitterWrapper twitter = mTwitterWrapper;
final ParcelableUser user = getUser(); final ParcelableUser user = getUser();
final UserRelationship userRelationship = mRelationship; if (twitter == null || user == null) return;
if (twitter == null || user == null || userRelationship == null) return;
final Relationship relationship = userRelationship.relationship;
final boolean isMyself = user.account_key.equals(user.key); final boolean isMyself = user.account_key.equals(user.key);
final MenuItem mentionItem = menu.findItem(R.id.mention); final MenuItem mentionItem = menu.findItem(R.id.mention);
@ -934,20 +932,10 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
MenuUtils.setMenuItemAvailability(menu, R.id.saved_searches, isMyself); MenuUtils.setMenuItemAvailability(menu, R.id.saved_searches, isMyself);
MenuUtils.setMenuItemAvailability(menu, R.id.scheduled_statuses, isMyself MenuUtils.setMenuItemAvailability(menu, R.id.scheduled_statuses, isMyself
&& TwitterAPIFactory.getOfficialKeyType(getActivity(), user.account_key) == ConsumerKeyType.TWEETDECK); && TwitterAPIFactory.getOfficialKeyType(getActivity(), user.account_key) == ConsumerKeyType.TWEETDECK);
// final MenuItem followItem = menu.findItem(MENU_FOLLOW);
// followItem.setVisible(!isMyself); final UserRelationship userRelationship = mRelationship;
// final boolean shouldShowFollowItem = !creatingFriendship && !destroyingFriendship && !isMyself if (!isMyself && userRelationship != null) {
// && relationship != null; final Relationship relationship = userRelationship.relationship;
// followItem.setEnabled(shouldShowFollowItem);
// if (shouldShowFollowItem) {
// followItem.setTitle(isFollowing ? R.string.unfollow : isProtected ? R.string.send_follow_request
// : R.string.follow);
// followItem.setIcon(isFollowing ? R.drawable.ic_action_cancel : R.drawable.ic_action_add);
// } else {
// followItem.setTitle(null);
// followItem.setIcon(null);
// }
if (!isMyself) {
MenuUtils.setMenuItemAvailability(menu, R.id.send_direct_message, relationship.canSourceDMTarget()); MenuUtils.setMenuItemAvailability(menu, R.id.send_direct_message, relationship.canSourceDMTarget());
MenuUtils.setMenuItemAvailability(menu, R.id.block, true); MenuUtils.setMenuItemAvailability(menu, R.id.block, true);
MenuUtils.setMenuItemAvailability(menu, R.id.mute_user, true); MenuUtils.setMenuItemAvailability(menu, R.id.mute_user, true);

View File

@ -6,6 +6,7 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader; import android.support.v4.content.Loader;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager; import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -17,7 +18,6 @@ import org.mariotaku.twidere.adapter.ParcelableStatusesAdapter;
import org.mariotaku.twidere.adapter.StaggeredGridParcelableStatusesAdapter; import org.mariotaku.twidere.adapter.StaggeredGridParcelableStatusesAdapter;
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition; import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition;
import org.mariotaku.twidere.adapter.iface.IStatusesAdapter; import org.mariotaku.twidere.adapter.iface.IStatusesAdapter;
import org.mariotaku.twidere.fragment.AbsContentRecyclerViewFragment;
import org.mariotaku.twidere.loader.MediaTimelineLoader; import org.mariotaku.twidere.loader.MediaTimelineLoader;
import org.mariotaku.twidere.loader.iface.IExtendedLoader; import org.mariotaku.twidere.loader.iface.IExtendedLoader;
import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableMedia;
@ -34,7 +34,7 @@ import java.util.List;
* Created by mariotaku on 14/11/5. * Created by mariotaku on 14/11/5.
*/ */
public class UserMediaTimelineFragment extends AbsContentRecyclerViewFragment<StaggeredGridParcelableStatusesAdapter, StaggeredGridLayoutManager> public class UserMediaTimelineFragment extends AbsContentRecyclerViewFragment<StaggeredGridParcelableStatusesAdapter, StaggeredGridLayoutManager>
implements LoaderCallbacks<List<ParcelableStatus>>, DrawerCallback, ParcelableStatusesAdapter.StatusAdapterListener { implements LoaderCallbacks<List<ParcelableStatus>>, DrawerCallback, IStatusViewHolder.StatusClickListener {
@Override @Override
@ -54,7 +54,7 @@ public class UserMediaTimelineFragment extends AbsContentRecyclerViewFragment<St
public void onActivityCreated(@Nullable Bundle savedInstanceState) { public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
final ParcelableStatusesAdapter adapter = getAdapter(); final ParcelableStatusesAdapter adapter = getAdapter();
adapter.setListener(this); adapter.setStatusClickListener(this);
final Bundle loaderArgs = new Bundle(getArguments()); final Bundle loaderArgs = new Bundle(getArguments());
loaderArgs.putBoolean(EXTRA_FROM_USER, true); loaderArgs.putBoolean(EXTRA_FROM_USER, true);
getLoaderManager().initLoader(0, loaderArgs, this); getLoaderManager().initLoader(0, loaderArgs, this);
@ -168,7 +168,7 @@ public class UserMediaTimelineFragment extends AbsContentRecyclerViewFragment<St
} }
@Override @Override
public void onStatusActionClick(IStatusViewHolder holder, int id, int position) { public void onItemActionClick(RecyclerView.ViewHolder holder, int id, int position) {
} }
@ -183,12 +183,12 @@ public class UserMediaTimelineFragment extends AbsContentRecyclerViewFragment<St
} }
@Override @Override
public void onStatusMenuClick(IStatusViewHolder holder, View menuView, int position) { public void onItemMenuClick(RecyclerView.ViewHolder holder, View menuView, int position) {
} }
@Override @Override
public void onUserProfileClick(IStatusViewHolder holder, ParcelableStatus status, int position) { public void onUserProfileClick(IStatusViewHolder holder, int position) {
} }
} }

View File

@ -88,7 +88,7 @@ public class CardPreviewPreference extends Preference implements Constants, OnSh
mHolder.setStatusClickListener(new IStatusViewHolder.SimpleStatusClickListener() { mHolder.setStatusClickListener(new IStatusViewHolder.SimpleStatusClickListener() {
@Override @Override
public void onItemActionClick(RecyclerView.ViewHolder holder, int id, int position) { public void onItemActionClick(RecyclerView.ViewHolder holder, int id, int position) {
if (id == R.id.favorite_count) { if (id == R.id.favorite) {
((StatusViewHolder) holder).playLikeAnimation(new LikeAnimationDrawable.OnLikedListener() { ((StatusViewHolder) holder).playLikeAnimation(new LikeAnimationDrawable.OnLikedListener() {
@Override @Override
public boolean onLiked() { public boolean onLiked() {

View File

@ -57,7 +57,7 @@ public class TimelineContentTextView extends AppCompatTextView {
public boolean dispatchTouchEvent(MotionEvent event) { public boolean dispatchTouchEvent(MotionEvent event) {
// FIXME simple workaround to https://code.google.com/p/android/issues/detail?id=191430 // FIXME simple workaround to https://code.google.com/p/android/issues/detail?id=191430
// Android clears TextView when setText(), so setText before touch // Android clears TextView when setText(), so setText before touch
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN && isTextSelectable()) {
if (getSelectionEnd() != getSelectionStart()) { if (getSelectionEnd() != getSelectionStart()) {
final CharSequence text = getText(); final CharSequence text = getText();
setText(null); setText(null);
@ -69,6 +69,9 @@ public class TimelineContentTextView extends AppCompatTextView {
@Override @Override
public boolean onTouchEvent(MotionEvent event) { public boolean onTouchEvent(MotionEvent event) {
if (isTextSelectable()) {
return super.onTouchEvent(event);
}
switch (event.getActionMasked()) { switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN: { case MotionEvent.ACTION_DOWN: {
Layout layout = getLayout(); Layout layout = getLayout();

View File

@ -51,7 +51,7 @@ public class UserListViewHolder extends ViewHolder implements View.OnClickListen
private final TextView membersCountView; private final TextView membersCountView;
private final TextView subscribersCountView; private final TextView subscribersCountView;
private IUserListsAdapter.UserListAdapterListener userListClickListener; private IUserListsAdapter.UserListClickListener userListClickListener;
public UserListViewHolder(IUserListsAdapter<?> adapter, View itemView) { public UserListViewHolder(IUserListsAdapter<?> adapter, View itemView) {
super(itemView); super(itemView);
@ -91,7 +91,7 @@ public class UserListViewHolder extends ViewHolder implements View.OnClickListen
} }
public void setOnClickListeners() { public void setOnClickListeners() {
setUserListClickListener(adapter.getUserListAdapterListener()); setUserListClickListener(adapter.getUserListClickListener());
} }
@Override @Override
@ -116,7 +116,7 @@ public class UserListViewHolder extends ViewHolder implements View.OnClickListen
return false; return false;
} }
public void setUserListClickListener(IUserListsAdapter.UserListAdapterListener listener) { public void setUserListClickListener(IUserListsAdapter.UserListClickListener listener) {
userListClickListener = listener; userListClickListener = listener;
((View) itemContent).setOnClickListener(this); ((View) itemContent).setOnClickListener(this);
((View) itemContent).setOnLongClickListener(this); ((View) itemContent).setOnLongClickListener(this);

View File

@ -32,7 +32,7 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.iface.IUsersAdapter; import org.mariotaku.twidere.adapter.iface.IUsersAdapter;
import org.mariotaku.twidere.adapter.iface.IUsersAdapter.FollowClickListener; import org.mariotaku.twidere.adapter.iface.IUsersAdapter.FollowClickListener;
import org.mariotaku.twidere.adapter.iface.IUsersAdapter.RequestClickListener; import org.mariotaku.twidere.adapter.iface.IUsersAdapter.RequestClickListener;
import org.mariotaku.twidere.adapter.iface.IUsersAdapter.UserAdapterListener; import org.mariotaku.twidere.adapter.iface.IUsersAdapter.UserClickListener;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.util.UserKeyUtils; import org.mariotaku.twidere.model.util.UserKeyUtils;
import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.AsyncTwitterWrapper;
@ -63,7 +63,7 @@ public class UserViewHolder extends ViewHolder implements OnClickListener, OnLon
private final View actionsContainer; private final View actionsContainer;
private final View processingRequestProgress; private final View processingRequestProgress;
private UserAdapterListener userClickListener; private UserClickListener userClickListener;
private RequestClickListener requestClickListener; private RequestClickListener requestClickListener;
private FollowClickListener followClickListener; private FollowClickListener followClickListener;
@ -205,7 +205,7 @@ public class UserViewHolder extends ViewHolder implements OnClickListener, OnLon
} }
public void setOnClickListeners() { public void setOnClickListeners() {
setUserClickListener(adapter.getUserAdapterListener()); setUserClickListener(adapter.getUserClickListener());
setActionClickListeners(adapter.getRequestClickListener(), adapter.getFollowClickListener()); setActionClickListeners(adapter.getRequestClickListener(), adapter.getFollowClickListener());
} }
@ -238,7 +238,7 @@ public class UserViewHolder extends ViewHolder implements OnClickListener, OnLon
friendsCountView.setTextSize(textSize); friendsCountView.setTextSize(textSize);
} }
public void setUserClickListener(UserAdapterListener listener) { public void setUserClickListener(UserClickListener listener) {
userClickListener = listener; userClickListener = listener;
((View) itemContent).setOnClickListener(this); ((View) itemContent).setOnClickListener(this);
((View) itemContent).setOnLongClickListener(this); ((View) itemContent).setOnLongClickListener(this);

View File

@ -26,11 +26,13 @@ import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import org.mariotaku.twidere.adapter.iface.ContentCardClickListener; import org.mariotaku.twidere.adapter.iface.ContentCardClickListener;
import org.mariotaku.twidere.adapter.iface.IGapSupportedAdapter;
import org.mariotaku.twidere.graphic.like.LikeAnimationDrawable; import org.mariotaku.twidere.graphic.like.LikeAnimationDrawable;
import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.UserKey; import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.view.CardMediaContainer; import org.mariotaku.twidere.view.CardMediaContainer;
import org.mariotaku.twidere.view.holder.GapViewHolder;
/** /**
* Created by mariotaku on 15/10/26. * Created by mariotaku on 15/10/26.
@ -56,7 +58,7 @@ public interface IStatusViewHolder extends CardMediaContainer.OnMediaClickListen
void playLikeAnimation(LikeAnimationDrawable.OnLikedListener listener); void playLikeAnimation(LikeAnimationDrawable.OnLikedListener listener);
interface StatusClickListener extends ContentCardClickListener { interface StatusClickListener extends ContentCardClickListener, IGapSupportedAdapter.GapClickListener {
void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition); void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition);
@ -68,19 +70,27 @@ public interface IStatusViewHolder extends CardMediaContainer.OnMediaClickListen
} }
abstract class SimpleStatusClickListener implements StatusClickListener { abstract class SimpleStatusClickListener implements StatusClickListener {
@Override
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition) { public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition) {
} }
@Override
public void onStatusClick(IStatusViewHolder holder, int position) { public void onStatusClick(IStatusViewHolder holder, int position) {
} }
@Override
public boolean onStatusLongClick(IStatusViewHolder holder, int position) { public boolean onStatusLongClick(IStatusViewHolder holder, int position) {
return false; return false;
} }
@Override
public void onGapClick(GapViewHolder holder, int position) {
}
@Override
public void onUserProfileClick(IStatusViewHolder holder, int position) { public void onUserProfileClick(IStatusViewHolder holder, int position) {
} }