1
0
mirror of https://github.com/TwidereProject/Twidere-Android synced 2025-02-17 04:00:48 +01:00

refactoring

This commit is contained in:
Mariotaku Lee 2016-01-22 14:40:23 +08:00
parent b106b5c012
commit 675949a528
25 changed files with 699 additions and 631 deletions

View File

@ -43,7 +43,7 @@ dependencies {
compile 'com.android.support:support-v4:23.1.1'
compile 'com.bluelinelabs:logansquare:1.3.4'
compile 'org.apache.commons:commons-lang3:3.4'
compile 'com.github.mariotaku.RestFu:library:0.9.10'
compile 'com.github.mariotaku.RestFu:library:0.9.11'
compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.2'
compile 'com.github.mariotaku.SQLiteQB:library:0.9.3'
compile 'com.github.mariotaku.ObjectCursor:core:0.9.3'

View File

@ -30,6 +30,7 @@ import org.mariotaku.twidere.api.twitter.model.RateLimitStatus;
import org.mariotaku.twidere.api.twitter.model.TwitterResponse;
import org.mariotaku.twidere.api.twitter.util.InternalParseUtil;
import java.io.IOException;
import java.util.Locale;
/**
@ -54,6 +55,7 @@ public class TwitterException extends Exception implements TwitterResponse, Http
private RateLimitStatus rateLimitStatus;
private HttpRequest httpRequest;
private HttpResponse httpResponse;
private boolean causedByNetworkIssue;
public TwitterException() {
}
@ -100,10 +102,7 @@ public class TwitterException extends Exception implements TwitterResponse, Http
public TwitterException(final String message, final Throwable cause) {
super(message, cause);
}
private void setHttpRequest(HttpRequest httpRequest) {
this.httpRequest = httpRequest;
setCausedByNetworkIssue(cause instanceof IOException);
}
public ErrorInfo[] getErrors() {
@ -113,17 +112,6 @@ public class TwitterException extends Exception implements TwitterResponse, Http
return errors;
}
public void setHttpResponse(HttpResponse res) {
httpResponse = res;
if (res != null) {
rateLimitStatus = RateLimitStatus.createFromResponseHeader(res);
statusCode = res.getStatus();
} else {
rateLimitStatus = null;
statusCode = -1;
}
}
/**
* Tests if the exception is caused by rate limitation exceed
*
@ -160,10 +148,25 @@ public class TwitterException extends Exception implements TwitterResponse, Http
return httpRequest;
}
private void setHttpRequest(HttpRequest httpRequest) {
this.httpRequest = httpRequest;
}
public HttpResponse getHttpResponse() {
return httpResponse;
}
public void setHttpResponse(HttpResponse res) {
httpResponse = res;
if (res != null) {
rateLimitStatus = RateLimitStatus.createFromResponseHeader(res);
statusCode = res.getStatus();
} else {
rateLimitStatus = null;
statusCode = -1;
}
}
/**
* {@inheritDoc}
*/
@ -245,7 +248,11 @@ public class TwitterException extends Exception implements TwitterResponse, Http
* @since Twitter4J 2.1.2
*/
public boolean isCausedByNetworkIssue() {
return getCause() instanceof java.io.IOException;
return causedByNetworkIssue;
}
public void setCausedByNetworkIssue(boolean causedByNetworkIssue) {
this.causedByNetworkIssue = causedByNetworkIssue;
}
/**

View File

@ -26,6 +26,7 @@ import org.mariotaku.restfu.http.ContentType;
import org.mariotaku.restfu.http.HttpResponse;
import org.mariotaku.restfu.http.ValueMap;
import org.mariotaku.restfu.http.mime.Body;
import org.mariotaku.twidere.api.twitter.TwitterException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@ -124,9 +125,9 @@ public class OAuthToken implements ValueMap {
return new String[]{"oauth_token", "oauth_token_secret"};
}
public static class Converter implements RestConverter<HttpResponse, OAuthToken> {
public static class Converter implements RestConverter<HttpResponse, OAuthToken, TwitterException> {
@Override
public OAuthToken convert(HttpResponse response) throws IOException {
public OAuthToken convert(HttpResponse response) throws IOException, ConvertException {
final Body body = response.getBody();
try {
final ContentType contentType = body.contentType();
@ -139,7 +140,7 @@ public class OAuthToken implements ValueMap {
try {
return new OAuthToken(os.toString(charset.name()), charset);
} catch (ParseException e) {
throw new IOException(e);
throw new ConvertException(e);
}
} finally {
Utils.closeSilently(body);

View File

@ -148,32 +148,4 @@ public final class RateLimitStatus {
return new RateLimitStatus(limit, remainingHits, resetTimeInSeconds);
}
// static Map<String, RateLimitStatus> createRateLimitStatuses(final HttpResponse res, final Configuration conf)
// throws TwitterException {
// final JSONObject json = res.asJSONObject();
// final Map<String, RateLimitStatus> map = createRateLimitStatuses(json);
// return map;
// }
//
// static Map<String, RateLimitStatus> createRateLimitStatuses(final InputStream stream) throws TwitterException {
// final Map<String, RateLimitStatus> map = new HashMap<String, RateLimitStatus>();
// try {
// final JSONObject resources = json.getJSONObject("resources");
// final Iterator<?> resourceKeys = resources.keys();
// while (resourceKeys.hasNext()) {
// final JSONObject resource = resources.getJSONObject((String) resourceKeys.next());
// final Iterator<?> endpointKeys = resource.keys();
// while (endpointKeys.hasNext()) {
// final String endpoint = (String) endpointKeys.next();
// final JSONObject rateLimitStatusJSON = resource.getJSONObject(endpoint);
// final RateLimitStatus rateLimitStatus = new RateLimitStatus(rateLimitStatusJSON);
// map.put(endpoint, rateLimitStatus);
// }
// }
// return Collections.unmodifiableMap(map);
// } catch (final JSONException jsone) {
// throw new TwitterException(jsone);
// }
// }
}

View File

@ -21,6 +21,7 @@ package org.mariotaku.twidere.api.twitter.model;
import org.mariotaku.restfu.RestConverter;
import org.mariotaku.restfu.http.HttpResponse;
import org.mariotaku.twidere.api.twitter.TwitterException;
/**
* Created by mariotaku on 15/6/15.
@ -41,7 +42,7 @@ public class ResponseCode {
return responseCode >= 200 && responseCode < 300;
}
public static class Converter implements RestConverter<HttpResponse, ResponseCode> {
public static class Converter implements RestConverter<HttpResponse, ResponseCode, TwitterException> {
@Override
public ResponseCode convert(HttpResponse response) {

View File

@ -38,15 +38,14 @@ import org.mariotaku.twidere.api.twitter.model.User;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.util.List;
/**
* Created by mariotaku on 15/5/5.
*/
public class TwitterConverterFactory extends RestConverter.SimpleFactory {
public class TwitterConverterFactory extends RestConverter.SimpleFactory<TwitterException> {
private static SimpleArrayMap<Type, RestConverter<HttpResponse, ?>> sResponseConverters = new SimpleArrayMap<>();
private static SimpleArrayMap<Type, RestConverter<?, Body>> sBodyConverters = new SimpleArrayMap<>();
private static SimpleArrayMap<Type, RestConverter<HttpResponse, ?, TwitterException>> sResponseConverters = new SimpleArrayMap<>();
private static SimpleArrayMap<Type, RestConverter<?, Body, TwitterException>> sBodyConverters = new SimpleArrayMap<>();
static {
sResponseConverters.put(ResponseCode.class, new ResponseCode.Converter());
@ -67,7 +66,8 @@ public class TwitterConverterFactory extends RestConverter.SimpleFactory {
}
}
private static <T> T parseOrThrow(HttpResponse resp, InputStream stream, Type type) throws IOException, TwitterException {
private static <T> T parseOrThrow(HttpResponse resp, InputStream stream, Type type)
throws IOException, TwitterException, RestConverter.ConvertException {
try {
final ParameterizedType<T> parameterizedType = ParameterizedTypeAccessor.create(type);
final T parse = LoganSquare.parse(stream, parameterizedType);
@ -76,15 +76,7 @@ public class TwitterConverterFactory extends RestConverter.SimpleFactory {
}
return parse;
} catch (JsonParseException e) {
throw new TwitterException("Malformed JSON Data", resp);
}
}
private static <T> List<T> parseListOrThrow(HttpResponse resp, InputStream stream, Class<T> elementCls) throws IOException, TwitterException {
try {
return LoganSquare.parseList(stream, elementCls);
} catch (JsonParseException e) {
throw new TwitterException("Malformed JSON Data", e, resp);
throw new RestConverter.ConvertException("Malformed JSON Data");
}
}
@ -95,8 +87,8 @@ public class TwitterConverterFactory extends RestConverter.SimpleFactory {
}
@Override
public RestConverter<HttpResponse, ?> fromResponse(Type type) {
RestConverter<HttpResponse, ?> converter = sResponseConverters.get(type);
public RestConverter<HttpResponse, ?, TwitterException> fromResponse(Type type) {
RestConverter<HttpResponse, ?, TwitterException> converter = sResponseConverters.get(type);
if (converter != null) {
return converter;
}
@ -104,8 +96,8 @@ public class TwitterConverterFactory extends RestConverter.SimpleFactory {
}
@Override
public RestConverter<?, Body> toParam(Type type) {
final RestConverter<?, Body> converter = sBodyConverters.get(type);
public RestConverter<?, Body, TwitterException> toParam(Type type) {
final RestConverter<?, Body, TwitterException> converter = sBodyConverters.get(type);
if (converter != null) {
return converter;
}
@ -118,7 +110,7 @@ public class TwitterConverterFactory extends RestConverter.SimpleFactory {
}
}
public static class TwitterConverter implements RestConverter<HttpResponse, Object> {
public static class TwitterConverter implements RestConverter<HttpResponse, Object, TwitterException> {
private final Type type;
public TwitterConverter(Type type) {
@ -126,19 +118,15 @@ public class TwitterConverterFactory extends RestConverter.SimpleFactory {
}
@Override
public Object convert(HttpResponse httpResponse) throws IOException {
try {
final Body body = httpResponse.getBody();
final InputStream stream = body.stream();
final Object object = parseOrThrow(httpResponse, stream, type);
checkResponse(type, object, httpResponse);
if (object instanceof TwitterResponseObject) {
((TwitterResponseObject) object).processResponseHeader(httpResponse);
}
return object;
} catch (TwitterException e) {
throw new IOException(e);
public Object convert(HttpResponse httpResponse) throws IOException, ConvertException, TwitterException {
final Body body = httpResponse.getBody();
final InputStream stream = body.stream();
final Object object = parseOrThrow(httpResponse, stream, type);
checkResponse(type, object, httpResponse);
if (object instanceof TwitterResponseObject) {
((TwitterResponseObject) object).processResponseHeader(httpResponse);
}
return object;
}
}
}

View File

@ -109,8 +109,8 @@ dependencies {
compile 'com.soundcloud.android:android-crop:1.0.1@aar'
compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.2'
compile 'com.github.mariotaku:PickNCrop:0.9.2'
compile 'com.github.mariotaku.RestFu:library:0.9.10'
compile 'com.github.mariotaku.RestFu:okhttp:0.9.10'
compile 'com.github.mariotaku.RestFu:library:0.9.11'
compile 'com.github.mariotaku.RestFu:okhttp:0.9.11'
compile 'com.diogobernardino:williamchart:2.1'
compile 'com.lnikkila:extendedtouchview:0.1.0'
compile 'com.google.dagger:dagger:2.0.2'

View File

@ -21,6 +21,7 @@ package org.mariotaku.twidere.adapter;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.support.v4.util.Pair;
import android.support.v4.widget.Space;
@ -51,15 +52,15 @@ import org.mariotaku.twidere.view.holder.ActivityTitleSummaryViewHolder;
import org.mariotaku.twidere.view.holder.GapViewHolder;
import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder;
import org.mariotaku.twidere.view.holder.StatusViewHolder;
import org.mariotaku.twidere.view.holder.StatusViewHolder.DummyStatusHolderAdapter;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
import java.lang.ref.WeakReference;
/**
* Created by mariotaku on 15/1/3.
*/
public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<ViewHolder> implements Constants,
IActivitiesAdapter<Data>, IStatusViewHolder.StatusClickListener,
ActivityTitleSummaryViewHolder.ActivityClickListener {
IActivitiesAdapter<Data> {
public static final int ITEM_VIEW_TYPE_STUB = 0;
public static final int ITEM_VIEW_TYPE_GAP = 1;
@ -68,15 +69,17 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
public static final int ITEM_VIEW_TYPE_STATUS = 4;
public static final int ITEM_VIEW_TYPE_EMPTY = 5;
private final LayoutInflater mInflater;
private final MediaLoadingHandler mLoadingHandler;
private final int mCardBackgroundColor;
private final boolean mCompactCards;
private final DummyStatusHolderAdapter mStatusAdapterDelegate;
private ActivityAdapterListener mActivityAdapterListener;
final LayoutInflater mInflater;
final MediaLoadingHandler mLoadingHandler;
final int mCardBackgroundColor;
final boolean mCompactCards;
final DummyStatusHolderAdapter mStatusAdapterDelegate;
final EventListener mEventListener;
ActivityAdapterListener mActivityAdapterListener;
long[] mFilteredUserIds;
boolean mFollowingOnly;
private long[] mFilteredUserIds;
private boolean mFollowingOnly;
protected AbsActivitiesAdapter(final Context context, boolean compact) {
super(context);
@ -86,6 +89,7 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
ThemeUtils.getUserThemeBackgroundAlpha(context));
mInflater = LayoutInflater.from(context);
mLoadingHandler = new MediaLoadingHandler(R.id.media_preview_progress);
mEventListener = new EventListener(this);
mCompactCards = compact;
mStatusAdapterDelegate.updateOptions();
}
@ -113,6 +117,17 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
return mLoadingHandler;
}
@Override
public ActivityClickListener getActivityClickListener() {
return mEventListener;
}
@Nullable
@Override
public GapClickListener getGapClickListener() {
return mEventListener;
}
@Override
public int getProfileImageStyle() {
return mStatusAdapterDelegate.getProfileImageStyle();
@ -141,42 +156,12 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
return mStatusAdapterDelegate.isProfileImageEnabled();
}
@Override
public void onStatusClick(IStatusViewHolder holder, int position) {
if (mActivityAdapterListener != null) {
mActivityAdapterListener.onStatusClick(holder, position);
}
}
@Override
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition) {
if (mActivityAdapterListener != null) {
mActivityAdapterListener.onMediaClick(holder, view, media, statusPosition);
}
}
@Override
public boolean shouldUseStarsForLikes() {
return mStatusAdapterDelegate.shouldUseStarsForLikes();
}
@Override
public void onUserProfileClick(IStatusViewHolder holder, int position) {
final Context context = getContext();
final ParcelableActivity activity = getActivity(position);
final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity);
assert status != null;
final View profileImageView = holder.getProfileImageView();
final View profileTypeView = holder.getProfileTypeView();
if (context instanceof FragmentActivity) {
final Bundle options = Utils.makeSceneTransitionOption((FragmentActivity) context,
new Pair<>(profileImageView, UserFragment.TRANSITION_NAME_PROFILE_IMAGE),
new Pair<>(profileTypeView, UserFragment.TRANSITION_NAME_PROFILE_TYPE));
Utils.openUserProfile(context, status.account_id, status.user_id, status.user_screen_name, options);
} else {
Utils.openUserProfile(context, status.account_id, status.user_id, status.user_screen_name, null);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
@ -194,7 +179,7 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
}
final StatusViewHolder holder = new StatusViewHolder(mStatusAdapterDelegate, view);
holder.setupViewOptions();
holder.setStatusClickListener(this);
holder.setStatusClickListener(mEventListener);
return holder;
}
case ITEM_VIEW_TYPE_TITLE_SUMMARY: {
@ -251,11 +236,6 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
}
}
@Override
public boolean onStatusLongClick(IStatusViewHolder holder, int position) {
return false;
}
@Override
public int getItemViewType(int position) {
final ParcelableActivity activity = getActivity(position);
@ -308,26 +288,6 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
return getActivityCount() + (isLoadMoreIndicatorVisible() ? 1 : 0);
}
@Override
public final void onGapClick(ViewHolder holder, int position) {
if (mActivityAdapterListener != null) {
mActivityAdapterListener.onGapClick((GapViewHolder) holder, position);
}
}
@Override
public final void onItemActionClick(ViewHolder holder, int id, int position) {
if (mActivityAdapterListener != null) {
mActivityAdapterListener.onStatusActionClick(((IStatusViewHolder) holder), id, position);
}
}
@Override
public final void onItemMenuClick(ViewHolder holder, View menuView, int position) {
if (mActivityAdapterListener != null) {
mActivityAdapterListener.onStatusMenuClick((StatusViewHolder) holder, menuView, position);
}
}
public void setListener(ActivityAdapterListener listener) {
mActivityAdapterListener = listener;
@ -344,12 +304,6 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
return mStatusAdapterDelegate.isMediaPreviewEnabled();
}
@Override
public void onActivityClick(ActivityTitleSummaryViewHolder holder, int position) {
if (mActivityAdapterListener == null) return;
mActivityAdapterListener.onActivityClick(holder, position);
}
@Override
public boolean shouldShowAccountsColor() {
@ -381,9 +335,9 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
}
private static class StubViewHolder extends ViewHolder {
static class StubViewHolder extends ViewHolder {
private final TextView text1, text2;
final TextView text1, text2;
public StubViewHolder(View itemView) {
super(itemView);
@ -399,9 +353,97 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
}
private static class EmptyViewHolder extends ViewHolder {
static class EmptyViewHolder extends ViewHolder {
public EmptyViewHolder(View view) {
super(view);
}
}
static class EventListener implements IStatusViewHolder.StatusClickListener, GapClickListener,
ActivityClickListener {
final WeakReference<AbsActivitiesAdapter<?>> adapterRef;
EventListener(AbsActivitiesAdapter<?> adapter) {
adapterRef = new WeakReference<AbsActivitiesAdapter<?>>(adapter);
}
@Override
public final void onGapClick(ViewHolder holder, int position) {
final AbsActivitiesAdapter<?> adapter = adapterRef.get();
if (adapter == null) return;
if (adapter.mActivityAdapterListener != null) {
adapter.mActivityAdapterListener.onGapClick((GapViewHolder) holder, position);
}
}
@Override
public final void onItemActionClick(ViewHolder holder, int id, int position) {
final AbsActivitiesAdapter<?> adapter = adapterRef.get();
if (adapter == null) return;
if (adapter.mActivityAdapterListener != null) {
adapter.mActivityAdapterListener.onStatusActionClick(((IStatusViewHolder) holder), id, position);
}
}
@Override
public boolean onStatusLongClick(IStatusViewHolder holder, int position) {
return false;
}
@Override
public void onUserProfileClick(IStatusViewHolder holder, int position) {
final AbsActivitiesAdapter<?> adapter = adapterRef.get();
if (adapter == null) return;
final Context context = adapter.getContext();
final ParcelableActivity activity = adapter.getActivity(position);
final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity);
assert status != null;
final View profileImageView = holder.getProfileImageView();
final View profileTypeView = holder.getProfileTypeView();
if (context instanceof FragmentActivity) {
final Bundle options = Utils.makeSceneTransitionOption((FragmentActivity) context,
new Pair<>(profileImageView, UserFragment.TRANSITION_NAME_PROFILE_IMAGE),
new Pair<>(profileTypeView, UserFragment.TRANSITION_NAME_PROFILE_TYPE));
Utils.openUserProfile(context, status.account_id, status.user_id, status.user_screen_name, options);
} else {
Utils.openUserProfile(context, status.account_id, status.user_id, status.user_screen_name, null);
}
}
@Override
public void onStatusClick(IStatusViewHolder holder, int position) {
final AbsActivitiesAdapter<?> adapter = adapterRef.get();
if (adapter == null) return;
if (adapter.mActivityAdapterListener != null) {
adapter.mActivityAdapterListener.onStatusClick(holder, position);
}
}
@Override
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition) {
final AbsActivitiesAdapter<?> adapter = adapterRef.get();
if (adapter == null) return;
if (adapter.mActivityAdapterListener != null) {
adapter.mActivityAdapterListener.onMediaClick(holder, view, media, statusPosition);
}
}
@Override
public void onActivityClick(ActivityTitleSummaryViewHolder holder, int position) {
final AbsActivitiesAdapter<?> adapter = adapterRef.get();
if (adapter == null) return;
if (adapter.mActivityAdapterListener == null) return;
adapter.mActivityAdapterListener.onActivityClick(holder, position);
}
@Override
public final void onItemMenuClick(ViewHolder holder, View menuView, int position) {
final AbsActivitiesAdapter<?> adapter = adapterRef.get();
if (adapter == null) return;
if (adapter.mActivityAdapterListener != null) {
adapter.mActivityAdapterListener.onStatusMenuClick((StatusViewHolder) holder, menuView, position);
}
}
}
}

View File

@ -13,14 +13,11 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.iface.IStatusesAdapter;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.util.MediaLoadingHandler;
import org.mariotaku.twidere.util.StatusAdapterLinkClickHandler;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TwidereLinkify;
import org.mariotaku.twidere.util.TwidereLinkify.HighlightStyle;
import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.CardMediaContainer.PreviewStyle;
import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle;
@ -28,6 +25,8 @@ import org.mariotaku.twidere.view.holder.GapViewHolder;
import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
import java.lang.ref.WeakReference;
/**
* Created by mariotaku on 14/11/19.
*/
@ -36,33 +35,35 @@ public abstract class AbsStatusesAdapter<D> extends LoadMoreSupportAdapter<ViewH
public static final int ITEM_VIEW_TYPE_STATUS = 2;
private final LayoutInflater mInflater;
private final MediaLoadingHandler mLoadingHandler;
private final TwidereLinkify mLinkify;
private final int mCardBackgroundColor;
private final int mTextSize;
final LayoutInflater mInflater;
final MediaLoadingHandler mLoadingHandler;
final TwidereLinkify mLinkify;
final int mCardBackgroundColor;
final int mTextSize;
@ShapeStyle
private final int mProfileImageStyle;
final int mProfileImageStyle;
@PreviewStyle
private final int mMediaPreviewStyle;
final int mMediaPreviewStyle;
@HighlightStyle
private final int mLinkHighlightingStyle;
private final boolean mCompactCards;
private final boolean mNameFirst;
private final boolean mDisplayMediaPreview;
private final boolean mDisplayProfileImage;
private final boolean mSensitiveContentEnabled;
private final boolean mHideCardActions;
private final boolean mUseStarsForLikes;
private StatusAdapterListener mStatusAdapterListener;
private boolean mShowInReplyTo;
private boolean mShowAccountsColor;
final int mLinkHighlightingStyle;
final boolean mCompactCards;
final boolean mNameFirst;
final boolean mDisplayMediaPreview;
final boolean mDisplayProfileImage;
final boolean mSensitiveContentEnabled;
final boolean mHideCardActions;
final boolean mUseStarsForLikes;
final EventListener mEventListener;
StatusAdapterListener mStatusAdapterListener;
boolean mShowInReplyTo;
boolean mShowAccountsColor;
public AbsStatusesAdapter(Context context, boolean compact) {
super(context);
mCardBackgroundColor = ThemeUtils.getCardBackgroundColor(context, ThemeUtils.getThemeBackgroundOption(context), ThemeUtils.getUserThemeBackgroundAlpha(context));
mInflater = LayoutInflater.from(context);
mLoadingHandler = new MediaLoadingHandler(getProgressViewIds());
mEventListener = new EventListener(this);
mTextSize = mPreferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size));
mCompactCards = compact;
mProfileImageStyle = Utils.getProfileImageStyle(mPreferences.getString(KEY_PROFILE_IMAGE_STYLE, null));
@ -96,6 +97,12 @@ public abstract class AbsStatusesAdapter<D> extends LoadMoreSupportAdapter<ViewH
return mLoadingHandler;
}
@Nullable
@Override
public IStatusViewHolder.StatusClickListener getStatusClickListener() {
return mEventListener;
}
@Override
public final int getProfileImageStyle() {
return mProfileImageStyle;
@ -112,6 +119,12 @@ public abstract class AbsStatusesAdapter<D> extends LoadMoreSupportAdapter<ViewH
}
@Override
public StatusAdapterListener getStatusAdapterListener() {
return mStatusAdapterListener;
}
@Override
public TwidereLinkify getTwidereLinkify() {
return mLinkify;
}
@ -146,35 +159,11 @@ public abstract class AbsStatusesAdapter<D> extends LoadMoreSupportAdapter<ViewH
return mDisplayProfileImage;
}
@Override
public boolean onStatusLongClick(IStatusViewHolder holder, int position) {
return mStatusAdapterListener != null && mStatusAdapterListener.onStatusLongClick(holder, position);
}
@Override
public boolean shouldUseStarsForLikes() {
return mUseStarsForLikes;
}
@Override
public final void onStatusClick(IStatusViewHolder holder, int position) {
if (mStatusAdapterListener == null) return;
mStatusAdapterListener.onStatusClick(holder, position);
}
@Override
public void onMediaClick(IStatusViewHolder holder, View view, final ParcelableMedia media, int statusPosition) {
if (mStatusAdapterListener == null) return;
mStatusAdapterListener.onMediaClick(holder, view, media, statusPosition);
}
@Override
public void onUserProfileClick(final IStatusViewHolder holder, final int position) {
if (mStatusAdapterListener == null) return;
final ParcelableStatus status = getStatus(position);
if (status == null) return;
mStatusAdapterListener.onUserProfileClick(holder, status, position);
}
public boolean isShowInReplyTo() {
return mShowInReplyTo;
@ -244,23 +233,6 @@ public abstract class AbsStatusesAdapter<D> extends LoadMoreSupportAdapter<ViewH
return getStatusesCount() + (isLoadMoreIndicatorVisible() ? 1 : 0);
}
@Override
public final void onGapClick(ViewHolder holder, int position) {
if (mStatusAdapterListener == null) return;
mStatusAdapterListener.onGapClick((GapViewHolder) holder, position);
}
@Override
public void onItemActionClick(ViewHolder holder, int id, int position) {
if (mStatusAdapterListener == null) return;
mStatusAdapterListener.onStatusActionClick((IStatusViewHolder) holder, id, position);
}
@Override
public void onItemMenuClick(ViewHolder holder, View menuView, int position) {
if (mStatusAdapterListener == null) return;
mStatusAdapterListener.onStatusMenuClick((IStatusViewHolder) holder, menuView, position);
}
public void setListener(StatusAdapterListener listener) {
mStatusAdapterListener = listener;
@ -286,20 +258,84 @@ public abstract class AbsStatusesAdapter<D> extends LoadMoreSupportAdapter<ViewH
holder.displayStatus(getStatus(position), isShowInReplyTo());
}
public interface StatusAdapterListener {
void onGapClick(GapViewHolder holder, int position);
@Nullable
@Override
public GapClickListener getGapClickListener() {
return mEventListener;
}
void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition);
public static class EventListener implements GapClickListener, IStatusViewHolder.StatusClickListener {
void onStatusActionClick(IStatusViewHolder holder, int id, int position);
private final WeakReference<IStatusesAdapter<?>> adapterRef;
void onStatusClick(IStatusViewHolder holder, int position);
public EventListener(IStatusesAdapter<?> adapter) {
adapterRef = new WeakReference<IStatusesAdapter<?>>(adapter);
}
boolean onStatusLongClick(IStatusViewHolder holder, int position);
@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);
}
void onStatusMenuClick(IStatusViewHolder holder, View menuView, int 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(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(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(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);
}
void onUserProfileClick(IStatusViewHolder holder, ParcelableStatus status, int position);
}
}

View File

@ -0,0 +1,264 @@
package org.mariotaku.twidere.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.text.BidiFormatter;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.adapter.iface.IStatusesAdapter;
import org.mariotaku.twidere.constant.SharedPreferenceConstants;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.util.MediaLoadingHandler;
import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.TwidereLinkify;
import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
import javax.inject.Inject;
/**
* Created by mariotaku on 16/1/22.
*/
public final class DummyStatusHolderAdapter implements IStatusesAdapter<Object> {
private final Context context;
private final SharedPreferencesWrapper preferences;
private final TwidereLinkify linkify;
private final MediaLoadingHandler handler;
@Inject
MediaLoaderWrapper loader;
@Inject
AsyncTwitterWrapper twitter;
@Inject
UserColorNameManager manager;
@Inject
BidiFormatter formatter;
private int profileImageStyle;
private int mediaPreviewStyle;
private int textSize;
private int linkHighlightStyle;
private boolean nameFirst;
private boolean displayProfileImage;
private boolean sensitiveContentEnabled;
private boolean hideCardActions;
private boolean displayMediaPreview;
private boolean shouldShowAccountsColor;
private boolean useStarsForLikes;
public DummyStatusHolderAdapter(Context context) {
this(context, new TwidereLinkify(null));
}
public DummyStatusHolderAdapter(Context context, TwidereLinkify linkify) {
GeneralComponentHelper.build(context).inject(this);
this.context = context;
preferences = SharedPreferencesWrapper.getInstance(context, TwidereConstants.SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
handler = new MediaLoadingHandler(R.id.media_preview_progress);
this.linkify = linkify;
updateOptions();
}
public void setShouldShowAccountsColor(boolean shouldShowAccountsColor) {
this.shouldShowAccountsColor = shouldShowAccountsColor;
}
@NonNull
@Override
public MediaLoaderWrapper getMediaLoader() {
return loader;
}
@NonNull
@Override
public BidiFormatter getBidiFormatter() {
return formatter;
}
@NonNull
@Override
public Context getContext() {
return context;
}
@Override
public MediaLoadingHandler getMediaLoadingHandler() {
return handler;
}
@Nullable
@Override
public IStatusViewHolder.StatusClickListener getStatusClickListener() {
return null;
}
@Override
public StatusAdapterListener getStatusAdapterListener() {
return null;
}
@NonNull
@Override
public UserColorNameManager getUserColorNameManager() {
return manager;
}
@Override
public int getItemCount() {
return 0;
}
@Override
public int getProfileImageStyle() {
return profileImageStyle;
}
@Override
public int getMediaPreviewStyle() {
return mediaPreviewStyle;
}
@NonNull
@Override
public AsyncTwitterWrapper getTwitterWrapper() {
return twitter;
}
@Override
public float getTextSize() {
return textSize;
}
@Override
public boolean isLoadMoreIndicatorVisible() {
return false;
}
@Override
public void setLoadMoreIndicatorVisible(boolean enabled) {
}
@Override
public boolean isLoadMoreSupported() {
return false;
}
@Override
public void setLoadMoreSupported(boolean supported) {
}
@Override
public ParcelableStatus getStatus(int position) {
return null;
}
@Override
public int getStatusesCount() {
return 0;
}
@Override
public long getStatusId(int position) {
return 0;
}
@Override
public long getAccountId(int position) {
return 0;
}
@Nullable
@Override
public ParcelableStatus findStatusById(long accountId, long statusId) {
return null;
}
@Override
public TwidereLinkify getTwidereLinkify() {
return linkify;
}
@Override
public boolean isMediaPreviewEnabled() {
return displayMediaPreview;
}
public void setMediaPreviewEnabled(boolean enabled) {
displayMediaPreview = enabled;
}
@Override
public int getLinkHighlightingStyle() {
return linkHighlightStyle;
}
@Override
public boolean isNameFirst() {
return nameFirst;
}
@Override
public boolean isSensitiveContentEnabled() {
return sensitiveContentEnabled;
}
@Override
public boolean isCardActionsHidden() {
return hideCardActions;
}
@Override
public void setData(Object o) {
}
@Override
public boolean shouldUseStarsForLikes() {
return useStarsForLikes;
}
public void setUseStarsForLikes(boolean useStarsForLikes) {
this.useStarsForLikes = useStarsForLikes;
}
@Override
public boolean shouldShowAccountsColor() {
return shouldShowAccountsColor;
}
@Override
public boolean isGapItem(int position) {
return false;
}
@Override
public GapClickListener getGapClickListener() {
return null;
}
@Override
public boolean isProfileImageEnabled() {
return displayProfileImage;
}
public void updateOptions() {
profileImageStyle = Utils.getProfileImageStyle(preferences.getString(SharedPreferenceConstants.KEY_PROFILE_IMAGE_STYLE, null));
mediaPreviewStyle = Utils.getMediaPreviewStyle(preferences.getString(SharedPreferenceConstants.KEY_MEDIA_PREVIEW_STYLE, null));
textSize = preferences.getInt(SharedPreferenceConstants.KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size));
nameFirst = preferences.getBoolean(SharedPreferenceConstants.KEY_NAME_FIRST, true);
displayProfileImage = preferences.getBoolean(SharedPreferenceConstants.KEY_DISPLAY_PROFILE_IMAGE, true);
displayMediaPreview = preferences.getBoolean(SharedPreferenceConstants.KEY_MEDIA_PREVIEW, false);
sensitiveContentEnabled = preferences.getBoolean(SharedPreferenceConstants.KEY_DISPLAY_SENSITIVE_CONTENTS, false);
hideCardActions = preferences.getBoolean(SharedPreferenceConstants.KEY_HIDE_CARD_ACTIONS, false);
linkHighlightStyle = Utils.getLinkHighlightingStyleInt(preferences.getString(SharedPreferenceConstants.KEY_LINK_HIGHLIGHT_OPTION, null));
useStarsForLikes = preferences.getBoolean(SharedPreferenceConstants.KEY_I_WANT_MY_STARS_BACK);
}
}

View File

@ -150,7 +150,7 @@ public class StaggeredGridParcelableStatusesAdapter extends AbsParcelableStatuse
}
public void setOnClickListeners() {
setStatusClickListener(adapter);
setStatusClickListener(adapter.getStatusClickListener());
}
public void setupViewOptions() {

View File

@ -22,6 +22,7 @@ package org.mariotaku.twidere.adapter.iface;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.util.MediaLoadingHandler;
import org.mariotaku.twidere.view.CardMediaContainer.PreviewStyle;
import org.mariotaku.twidere.view.holder.ActivityTitleSummaryViewHolder;
/**
* Created by mariotaku on 14/11/18.
@ -44,4 +45,11 @@ public interface IActivitiesAdapter<Data> extends IContentCardAdapter, IGapSuppo
boolean isMediaPreviewEnabled();
boolean shouldShowAccountsColor();
ActivityClickListener getActivityClickListener();
interface ActivityClickListener {
void onActivityClick(ActivityTitleSummaryViewHolder holder, int position);
}
}

View File

@ -19,6 +19,7 @@
package org.mariotaku.twidere.adapter.iface;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView.ViewHolder;
/**
@ -30,6 +31,14 @@ public interface IGapSupportedAdapter {
boolean isGapItem(int position);
void onGapClick(ViewHolder holder, int position);
@Nullable
GapClickListener getGapClickListener();
interface GapClickListener {
void onGapClick(ViewHolder holder, int position);
}
}

View File

@ -1,18 +1,20 @@
package org.mariotaku.twidere.adapter.iface;
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.util.MediaLoadingHandler;
import org.mariotaku.twidere.util.TwidereLinkify;
import org.mariotaku.twidere.view.CardMediaContainer.PreviewStyle;
import org.mariotaku.twidere.view.holder.GapViewHolder;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
/**
* Created by mariotaku on 14/11/18.
*/
public interface IStatusesAdapter<Data> extends IContentCardAdapter, IStatusViewHolder.StatusClickListener,
IGapSupportedAdapter, ContentCardClickListener {
public interface IStatusesAdapter<Data> extends IContentCardAdapter, IGapSupportedAdapter {
int getLinkHighlightingStyle();
@ -48,4 +50,24 @@ public interface IStatusesAdapter<Data> extends IContentCardAdapter, IStatusView
MediaLoadingHandler getMediaLoadingHandler();
@Nullable
IStatusViewHolder.StatusClickListener getStatusClickListener();
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

@ -46,7 +46,7 @@ import com.squareup.otto.Subscribe;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.AbsStatusesAdapter;
import org.mariotaku.twidere.adapter.AbsStatusesAdapter.StatusAdapterListener;
import org.mariotaku.twidere.adapter.iface.IStatusesAdapter.StatusAdapterListener;
import org.mariotaku.twidere.loader.iface.IExtendedLoader;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;

View File

@ -52,7 +52,7 @@ import org.mariotaku.twidere.util.TwidereValidator;
import org.mariotaku.twidere.view.ComposeEditText;
import org.mariotaku.twidere.view.StatusTextCountView;
import org.mariotaku.twidere.view.holder.StatusViewHolder;
import org.mariotaku.twidere.view.holder.StatusViewHolder.DummyStatusHolderAdapter;
import org.mariotaku.twidere.adapter.DummyStatusHolderAdapter;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
import static org.mariotaku.twidere.util.Utils.isMyRetweet;

View File

@ -84,11 +84,12 @@ import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
import org.mariotaku.twidere.adapter.AbsStatusesAdapter.StatusAdapterListener;
import org.mariotaku.twidere.adapter.AbsStatusesAdapter;
import org.mariotaku.twidere.adapter.ArrayRecyclerAdapter;
import org.mariotaku.twidere.adapter.BaseRecyclerViewAdapter;
import org.mariotaku.twidere.adapter.decorator.DividerItemDecoration;
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.TwitterException;
import org.mariotaku.twidere.api.twitter.model.Paging;
@ -1343,7 +1344,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
}
}
private static class StatusAdapter extends BaseRecyclerViewAdapter<ViewHolder> implements IStatusesAdapter<List<ParcelableStatus>> {
private static class StatusAdapter extends BaseRecyclerViewAdapter<ViewHolder>
implements IStatusesAdapter<List<ParcelableStatus>> {
private static final int VIEW_TYPE_LIST_STATUS = 0;
private static final int VIEW_TYPE_DETAIL_STATUS = 1;
@ -1387,6 +1389,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
private final boolean mSensitiveContentEnabled;
private final boolean mHideCardActions;
private final boolean mUseStarsForLikes;
private final AbsStatusesAdapter.EventListener mEventListener;
private boolean mLoadMoreSupported;
private boolean mLoadMoreIndicatorVisible;
private boolean mDetailMediaExpanded;
@ -1433,6 +1436,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
mCardLayoutResource = R.layout.card_item_status;
}
mTwidereLinkify = new TwidereLinkify(new StatusAdapterLinkClickHandler<>(this));
mEventListener = new AbsStatusesAdapter.EventListener(this);
}
public int findPositionById(long itemId) {
@ -1596,6 +1600,17 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
return mMediaLoadingHandler;
}
@Nullable
@Override
public IStatusViewHolder.StatusClickListener getStatusClickListener() {
return mEventListener;
}
@Override
public StatusAdapterListener getStatusAdapterListener() {
return mStatusAdapterListener;
}
public ParcelableStatus getStatus() {
return mStatus;
}
@ -1624,13 +1639,13 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
return false;
}
@Nullable
@Override
public final void onGapClick(ViewHolder holder, int position) {
if (mStatusAdapterListener != null) {
mStatusAdapterListener.onGapClick((GapViewHolder) holder, position);
}
public GapClickListener getGapClickListener() {
return mEventListener;
}
@Override
public boolean isLoadMoreIndicatorVisible() {
return mLoadMoreIndicatorVisible;
@ -1854,55 +1869,6 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
mRecyclerView = null;
}
@Override
public void onItemActionClick(ViewHolder holder, int id, int position) {
if (mStatusAdapterListener != null) {
mStatusAdapterListener.onStatusActionClick((IStatusViewHolder) holder, id, position);
}
}
@Override
public void onItemMenuClick(ViewHolder holder, View itemView, int position) {
if (mStatusAdapterListener != null) {
mStatusAdapterListener.onStatusMenuClick((IStatusViewHolder) holder, itemView, position);
}
}
@Override
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition) {
if (mStatusAdapterListener != null) {
mStatusAdapterListener.onMediaClick(holder, view, media, statusPosition);
}
}
@Override
public final void onStatusClick(IStatusViewHolder holder, int position) {
if (mStatusAdapterListener != null) {
mStatusAdapterListener.onStatusClick(holder, position);
}
}
@Override
public boolean onStatusLongClick(IStatusViewHolder holder, int position) {
return false;
}
@Override
public void onUserProfileClick(IStatusViewHolder holder, int position) {
final Context context = getContext();
final ParcelableStatus status = getStatus(position);
final View profileImageView = holder.getProfileImageView();
final View profileTypeView = holder.getProfileTypeView();
if (context instanceof FragmentActivity) {
final Bundle options = Utils.makeSceneTransitionOption((FragmentActivity) context,
new Pair<>(profileImageView, UserFragment.TRANSITION_NAME_PROFILE_IMAGE),
new Pair<>(profileTypeView, UserFragment.TRANSITION_NAME_PROFILE_TYPE));
Utils.openUserProfile(context, status.account_id, status.user_id, status.user_screen_name, options);
} else {
Utils.openUserProfile(context, status.account_id, status.user_id, status.user_screen_name, null);
}
}
private void setCount(int idx, int size) {
mItemCounts[idx] = size;
notifyDataSetChanged();

View File

@ -29,7 +29,7 @@ import android.view.ViewGroup;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.view.holder.StatusViewHolder;
import org.mariotaku.twidere.view.holder.StatusViewHolder.DummyStatusHolderAdapter;
import org.mariotaku.twidere.adapter.DummyStatusHolderAdapter;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
/**

View File

@ -33,7 +33,7 @@ import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.TwidereLinkify;
import org.mariotaku.twidere.view.holder.StatusViewHolder;
import org.mariotaku.twidere.view.holder.StatusViewHolder.DummyStatusHolderAdapter;
import org.mariotaku.twidere.adapter.DummyStatusHolderAdapter;
public class CardPreviewPreference extends Preference implements Constants, OnSharedPreferenceChangeListener {

View File

@ -229,7 +229,7 @@ public class TwitterAPIFactory implements TwidereConstants {
public static <T> T getInstance(final Context context, final Endpoint endpoint,
final Authorization auth, final Map<String, String> extraRequestParams,
final Class<T> cls) {
final RestAPIFactory factory = new RestAPIFactory();
final RestAPIFactory<TwitterException> factory = new RestAPIFactory<>();
final String userAgent;
if (auth instanceof OAuthAuthorization) {
final String consumerKey = ((OAuthAuthorization) auth).getConsumerKey();
@ -245,12 +245,11 @@ public class TwitterAPIFactory implements TwidereConstants {
}
DependencyHolder holder = DependencyHolder.get(context);
factory.setHttpClient(holder.getRestHttpClient());
final TwitterConverterFactory restConverterFactory = new TwitterConverterFactory();
factory.setRestConverterFactory(restConverterFactory);
factory.setEndpoint(endpoint);
factory.setAuthorization(auth);
factory.setHttpRequestFactory(new TwidereHttpRequestFactory(userAgent));
factory.setEndpoint(endpoint);
factory.setConstantPool(sConstantPoll);
factory.setRestConverterFactory(new TwitterConverterFactory());
factory.setHttpRequestFactory(new TwidereHttpRequestFactory(userAgent));
factory.setExceptionFactory(new TwidereExceptionFactory());
return factory.build(cls);
}
@ -545,9 +544,9 @@ public class TwitterAPIFactory implements TwidereConstants {
}
}
public static class TwidereExceptionFactory implements ExceptionFactory {
public static class TwidereExceptionFactory implements ExceptionFactory<TwitterException> {
@Override
public Exception newException(Throwable cause, HttpRequest request, HttpResponse response) {
public TwitterException newException(Throwable cause, HttpRequest request, HttpResponse response) {
final TwitterException te;
if (cause != null) {
te = new TwitterException(cause);

View File

@ -42,7 +42,6 @@ import org.mariotaku.twidere.provider.TwidereDataStore.UnreadCounts;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Set;
@ -155,8 +154,7 @@ public class TwitterWrapper implements Constants {
try {
return showUser(twitter, id, screenName);
} catch (final TwitterException e) {
if (e.getCause() instanceof IOException)
throw e;
if (e.isCausedByNetworkIssue()) throw e;
}
return showUserAlternative(twitter, id, screenName);
}

View File

@ -31,6 +31,7 @@ import org.mariotaku.twidere.adapter.BaseArrayAdapter;
import org.mariotaku.twidere.adapter.BaseRecyclerViewAdapter;
import org.mariotaku.twidere.adapter.ComposeAutoCompleteAdapter;
import org.mariotaku.twidere.adapter.DraftsAdapter;
import org.mariotaku.twidere.adapter.DummyStatusHolderAdapter;
import org.mariotaku.twidere.adapter.UserAutoCompleteAdapter;
import org.mariotaku.twidere.fragment.BaseDialogFragment;
import org.mariotaku.twidere.fragment.BaseFiltersFragment;
@ -53,7 +54,6 @@ import org.mariotaku.twidere.text.util.EmojiEditableFactory;
import org.mariotaku.twidere.text.util.EmojiSpannableFactory;
import org.mariotaku.twidere.util.MultiSelectEventHandler;
import org.mariotaku.twidere.util.net.TwidereProxySelector;
import org.mariotaku.twidere.view.holder.StatusViewHolder;
import javax.inject.Singleton;
@ -65,7 +65,7 @@ import dagger.Component;
@Singleton
@Component(modules = ApplicationModule.class)
public interface GeneralComponent {
void inject(StatusViewHolder.DummyStatusHolderAdapter object);
void inject(DummyStatusHolderAdapter object);
void inject(BaseFragment object);

View File

@ -31,6 +31,7 @@ import android.widget.TextView;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.AbsActivitiesAdapter;
import org.mariotaku.twidere.adapter.iface.IActivitiesAdapter;
import org.mariotaku.twidere.model.ActivityTitleSummaryMessage;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableUser;
@ -56,7 +57,7 @@ public class ActivityTitleSummaryViewHolder extends ViewHolder implements View.O
private final ImageView[] profileImageViews;
private final View profileImageSpace;
private ActivityClickListener activityClickListener;
private IActivitiesAdapter.ActivityClickListener activityClickListener;
public ActivityTitleSummaryViewHolder(AbsActivitiesAdapter adapter, View itemView, boolean isCompact) {
super(itemView);
@ -150,10 +151,10 @@ public class ActivityTitleSummaryViewHolder extends ViewHolder implements View.O
}
public void setOnClickListeners() {
setActivityClickListener(adapter);
setActivityClickListener(adapter.getActivityClickListener());
}
public void setActivityClickListener(ActivityClickListener listener) {
public void setActivityClickListener(IActivitiesAdapter.ActivityClickListener listener) {
activityClickListener = listener;
((View) itemContent).setOnClickListener(this);
// ((View) itemContent).setOnLongClickListener(this);
@ -172,8 +173,4 @@ public class ActivityTitleSummaryViewHolder extends ViewHolder implements View.O
}
}
public interface ActivityClickListener {
void onActivityClick(ActivityTitleSummaryViewHolder holder, int position);
}
}

View File

@ -40,6 +40,8 @@ public class GapViewHolder extends RecyclerView.ViewHolder implements OnClickLis
@Override
public void onClick(View v) {
adapter.onGapClick(this, getLayoutPosition());
final IGapSupportedAdapter.GapClickListener listener = adapter.getGapClickListener();
if (listener == null) return;
listener.onGapClick(this, getLayoutPosition());
}
}

View File

@ -2,7 +2,6 @@ package org.mariotaku.twidere.view.holder;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v4.text.BidiFormatter;
import android.support.v4.widget.TextViewCompat;
@ -26,13 +25,10 @@ import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.HtmlSpanBuilder;
import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.util.MediaLoadingHandler;
import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.TwidereLinkify;
import org.mariotaku.twidere.util.TwitterCardUtils;
import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
import org.mariotaku.twidere.view.ActionIconThemedTextView;
import org.mariotaku.twidere.view.CardMediaContainer;
import org.mariotaku.twidere.view.ForegroundColorView;
@ -41,10 +37,9 @@ import org.mariotaku.twidere.view.ShortTimeView;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
import org.mariotaku.twidere.view.iface.IColorLabelView;
import java.lang.ref.WeakReference;
import java.util.Locale;
import javax.inject.Inject;
import static org.mariotaku.twidere.util.HtmlEscapeHelper.toPlainText;
import static org.mariotaku.twidere.util.Utils.getUserTypeIconRes;
@ -53,36 +48,37 @@ import static org.mariotaku.twidere.util.Utils.getUserTypeIconRes;
* <p/>
* Created by mariotaku on 14/11/19.
*/
public class StatusViewHolder extends ViewHolder implements Constants, OnClickListener,
OnLongClickListener, IStatusViewHolder {
public class StatusViewHolder extends ViewHolder implements Constants, IStatusViewHolder {
@NonNull
private final IStatusesAdapter<?> adapter;
final IStatusesAdapter<?> adapter;
private final ImageView statusInfoIcon;
private final ImageView profileImageView;
private final ImageView profileTypeView;
private final ImageView extraTypeView;
private final TextView textView;
private final TextView quotedTextView;
private final NameView nameView;
private final NameView quotedNameView;
private final TextView statusInfoLabel;
private final ShortTimeView timeView;
private final CardMediaContainer mediaPreview;
private final ActionIconThemedTextView replyCountView, retweetCountView, favoriteCountView;
private final IColorLabelView itemContent;
private final ForegroundColorView quoteIndicator;
private final View actionButtons;
private final View itemMenu;
private final View profileImageSpace;
private final View statusInfoSpace;
final ImageView statusInfoIcon;
final ImageView profileImageView;
final ImageView profileTypeView;
final ImageView extraTypeView;
final TextView textView;
final TextView quotedTextView;
final NameView nameView;
final NameView quotedNameView;
final TextView statusInfoLabel;
final ShortTimeView timeView;
final CardMediaContainer mediaPreview;
final ActionIconThemedTextView replyCountView, retweetCountView, favoriteCountView;
final IColorLabelView itemContent;
final ForegroundColorView quoteIndicator;
final View actionButtons;
final View itemMenu;
final View profileImageSpace;
final View statusInfoSpace;
final EventListener eventListener;
private StatusClickListener statusClickListener;
StatusClickListener statusClickListener;
public StatusViewHolder(@NonNull final IStatusesAdapter<?> adapter, @NonNull final View itemView) {
super(itemView);
this.adapter = adapter;
this.eventListener = new EventListener(this);
itemContent = (IColorLabelView) itemView.findViewById(R.id.item_content);
profileImageView = (ImageView) itemView.findViewById(R.id.profile_image);
profileTypeView = (ImageView) itemView.findViewById(R.id.profile_type);
@ -344,43 +340,6 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi
return profileTypeView;
}
@Override
public void onClick(View v) {
if (statusClickListener == null) return;
final int position = getLayoutPosition();
switch (v.getId()) {
case R.id.item_content: {
statusClickListener.onStatusClick(this, position);
break;
}
case R.id.item_menu: {
statusClickListener.onItemMenuClick(this, v, position);
break;
}
case R.id.profile_image: {
statusClickListener.onUserProfileClick(this, position);
break;
}
case R.id.reply_count:
case R.id.retweet_count:
case R.id.favorite_count: {
statusClickListener.onItemActionClick(this, v.getId(), position);
break;
}
}
}
@Override
public boolean onLongClick(View v) {
if (statusClickListener == null) return false;
final int position = getLayoutPosition();
switch (v.getId()) {
case R.id.item_content: {
return statusClickListener.onStatusLongClick(this, position);
}
}
return false;
}
@Override
public void onMediaClick(View view, ParcelableMedia media, long accountId) {
@ -390,20 +349,20 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi
}
public void setOnClickListeners() {
setStatusClickListener(adapter);
setStatusClickListener(adapter.getStatusClickListener());
}
@Override
public void setStatusClickListener(StatusClickListener listener) {
statusClickListener = listener;
((View) itemContent).setOnClickListener(this);
((View) itemContent).setOnLongClickListener(this);
((View) itemContent).setOnClickListener(eventListener);
((View) itemContent).setOnLongClickListener(eventListener);
itemMenu.setOnClickListener(this);
profileImageView.setOnClickListener(this);
replyCountView.setOnClickListener(this);
retweetCountView.setOnClickListener(this);
favoriteCountView.setOnClickListener(this);
itemMenu.setOnClickListener(eventListener);
profileImageView.setOnClickListener(eventListener);
replyCountView.setOnClickListener(eventListener);
retweetCountView.setOnClickListener(eventListener);
favoriteCountView.setOnClickListener(eventListener);
}
@Override
@ -440,7 +399,7 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi
}
}
private void displayExtraTypeIcon(String cardName, ParcelableMedia[] media, ParcelableLocation location, String placeFullName, boolean sensitive) {
void displayExtraTypeIcon(String cardName, ParcelableMedia[] media, ParcelableLocation location, String placeFullName, boolean sensitive) {
if (TwitterCardUtils.CARD_NAME_AUDIO.equals(cardName)) {
extraTypeView.setImageResource(sensitive ? R.drawable.ic_action_warning : R.drawable.ic_action_music);
extraTypeView.setVisibility(View.VISIBLE);
@ -465,7 +424,7 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi
}
}
private boolean hasVideo(ParcelableMedia[] media) {
boolean hasVideo(ParcelableMedia[] media) {
for (ParcelableMedia mediaItem : media) {
if (mediaItem.type == ParcelableMedia.Type.TYPE_VIDEO
|| mediaItem.type == ParcelableMedia.Type.TYPE_ANIMATED_GIF)
@ -474,260 +433,57 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi
return false;
}
public static final class DummyStatusHolderAdapter implements IStatusesAdapter<Object> {
static class EventListener implements OnClickListener, OnLongClickListener {
private final Context context;
private final SharedPreferencesWrapper preferences;
private final TwidereLinkify linkify;
private final MediaLoadingHandler handler;
@Inject
MediaLoaderWrapper loader;
@Inject
AsyncTwitterWrapper twitter;
@Inject
UserColorNameManager manager;
@Inject
BidiFormatter formatter;
final WeakReference<StatusViewHolder> holderRef;
private int profileImageStyle;
private int mediaPreviewStyle;
private int textSize;
private int linkHighlightStyle;
private boolean nameFirst;
private boolean displayProfileImage;
private boolean sensitiveContentEnabled;
private boolean hideCardActions;
private boolean displayMediaPreview;
private boolean shouldShowAccountsColor;
private boolean useStarsForLikes;
public DummyStatusHolderAdapter(Context context) {
this(context, new TwidereLinkify(null));
}
public DummyStatusHolderAdapter(Context context, TwidereLinkify linkify) {
GeneralComponentHelper.build(context).inject(this);
this.context = context;
preferences = SharedPreferencesWrapper.getInstance(context, SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
handler = new MediaLoadingHandler(R.id.media_preview_progress);
this.linkify = linkify;
updateOptions();
}
public void setShouldShowAccountsColor(boolean shouldShowAccountsColor) {
this.shouldShowAccountsColor = shouldShowAccountsColor;
}
@NonNull
@Override
public MediaLoaderWrapper getMediaLoader() {
return loader;
}
@NonNull
@Override
public BidiFormatter getBidiFormatter() {
return formatter;
}
@NonNull
@Override
public Context getContext() {
return context;
EventListener(StatusViewHolder holder) {
this.holderRef = new WeakReference<>(holder);
}
@Override
public MediaLoadingHandler getMediaLoadingHandler() {
return handler;
}
@NonNull
@Override
public UserColorNameManager getUserColorNameManager() {
return manager;
public void onClick(View v) {
StatusViewHolder holder = holderRef.get();
if (holder == null) return;
StatusClickListener listener = holder.statusClickListener;
if (listener == null) return;
final int position = holder.getLayoutPosition();
switch (v.getId()) {
case R.id.item_content: {
listener.onStatusClick(holder, position);
break;
}
case R.id.item_menu: {
listener.onItemMenuClick(holder, v, position);
break;
}
case R.id.profile_image: {
listener.onUserProfileClick(holder, position);
break;
}
case R.id.reply_count:
case R.id.retweet_count:
case R.id.favorite_count: {
listener.onItemActionClick(holder, v.getId(), position);
break;
}
}
}
@Override
public int getItemCount() {
return 0;
}
@Override
public int getProfileImageStyle() {
return profileImageStyle;
}
@Override
public int getMediaPreviewStyle() {
return mediaPreviewStyle;
}
@NonNull
@Override
public AsyncTwitterWrapper getTwitterWrapper() {
return twitter;
}
@Override
public float getTextSize() {
return textSize;
}
@Override
public boolean isLoadMoreIndicatorVisible() {
public boolean onLongClick(View v) {
StatusViewHolder holder = holderRef.get();
if (holder == null) return false;
StatusClickListener listener = holder.statusClickListener;
if (listener == null) return false;
final int position = holder.getLayoutPosition();
switch (v.getId()) {
case R.id.item_content: {
return listener.onStatusLongClick(holder, position);
}
}
return false;
}
@Override
public void setLoadMoreIndicatorVisible(boolean enabled) {
}
@Override
public boolean isLoadMoreSupported() {
return false;
}
@Override
public void setLoadMoreSupported(boolean supported) {
}
@Override
public ParcelableStatus getStatus(int position) {
return null;
}
@Override
public int getStatusesCount() {
return 0;
}
@Override
public long getStatusId(int position) {
return 0;
}
@Override
public long getAccountId(int position) {
return 0;
}
@Nullable
@Override
public ParcelableStatus findStatusById(long accountId, long statusId) {
return null;
}
@Override
public TwidereLinkify getTwidereLinkify() {
return linkify;
}
@Override
public boolean isMediaPreviewEnabled() {
return displayMediaPreview;
}
public void setMediaPreviewEnabled(boolean enabled) {
displayMediaPreview = enabled;
}
@Override
public int getLinkHighlightingStyle() {
return linkHighlightStyle;
}
@Override
public boolean isNameFirst() {
return nameFirst;
}
@Override
public boolean isSensitiveContentEnabled() {
return sensitiveContentEnabled;
}
@Override
public boolean isCardActionsHidden() {
return hideCardActions;
}
@Override
public void setData(Object o) {
}
@Override
public boolean shouldUseStarsForLikes() {
return useStarsForLikes;
}
public void setUseStarsForLikes(boolean useStarsForLikes) {
this.useStarsForLikes = useStarsForLikes;
}
@Override
public boolean shouldShowAccountsColor() {
return shouldShowAccountsColor;
}
@Override
public boolean isGapItem(int position) {
return false;
}
@Override
public void onGapClick(ViewHolder holder, int position) {
}
@Override
public boolean isProfileImageEnabled() {
return displayProfileImage;
}
@Override
public void onStatusClick(IStatusViewHolder holder, int position) {
}
@Override
public boolean onStatusLongClick(IStatusViewHolder holder, int position) {
return false;
}
@Override
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int statusPosition) {
}
@Override
public void onUserProfileClick(IStatusViewHolder holder, int position) {
}
@Override
public void onItemActionClick(ViewHolder holder, int id, int position) {
}
@Override
public void onItemMenuClick(ViewHolder holder, View menuView, int position) {
}
public void updateOptions() {
profileImageStyle = Utils.getProfileImageStyle(preferences.getString(KEY_PROFILE_IMAGE_STYLE, null));
mediaPreviewStyle = Utils.getMediaPreviewStyle(preferences.getString(KEY_MEDIA_PREVIEW_STYLE, null));
textSize = preferences.getInt(KEY_TEXT_SIZE, context.getResources().getInteger(R.integer.default_text_size));
nameFirst = preferences.getBoolean(KEY_NAME_FIRST, true);
displayProfileImage = preferences.getBoolean(KEY_DISPLAY_PROFILE_IMAGE, true);
displayMediaPreview = preferences.getBoolean(KEY_MEDIA_PREVIEW, false);
sensitiveContentEnabled = preferences.getBoolean(KEY_DISPLAY_SENSITIVE_CONTENTS, false);
hideCardActions = preferences.getBoolean(KEY_HIDE_CARD_ACTIONS, false);
linkHighlightStyle = Utils.getLinkHighlightingStyleInt(preferences.getString(KEY_LINK_HIGHLIGHT_OPTION, null));
useStarsForLikes = preferences.getBoolean(KEY_I_WANT_MY_STARS_BACK);
}
}
}