mirror of
https://github.com/TwidereProject/Twidere-Android
synced 2025-02-17 04:00:48 +01:00
refactoring
This commit is contained in:
parent
b106b5c012
commit
675949a528
@ -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'
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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'
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -150,7 +150,7 @@ public class StaggeredGridParcelableStatusesAdapter extends AbsParcelableStatuse
|
||||
}
|
||||
|
||||
public void setOnClickListeners() {
|
||||
setStatusClickListener(adapter);
|
||||
setStatusClickListener(adapter.getStatusClickListener());
|
||||
}
|
||||
|
||||
public void setupViewOptions() {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
||||
/**
|
||||
|
@ -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 {
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user