From d74ffe28144462538a9888808be53b62b4cf0270 Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Fri, 25 Dec 2015 23:09:06 +0800 Subject: [PATCH] improved status interactions fixed media viewer crash --- .../twidere/model/ParcelableMedia.java | 1 + .../activity/support/MediaViewerActivity.java | 3 +- .../fragment/support/StatusFragment.java | 24 ++++- .../twidere/util/TwitterAPIFactory.java | 91 ++++++++++++++----- 4 files changed, 88 insertions(+), 31 deletions(-) diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMedia.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMedia.java index e06e1f3e1..e54f62503 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMedia.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMedia.java @@ -211,6 +211,7 @@ public class ParcelableMedia implements Parcelable { final BindingValue playerStreamUrl = card.getBindingValue("player_stream_url"); media.card = ParcelableStatus.ParcelableCardEntity.fromCardEntity(card, -1); if ("animated_gif".equals(name)) { + media.media_url = ((StringValue) playerStreamUrl).getValue(); media.type = ParcelableMedia.TYPE_CARD_ANIMATED_GIF; } else if (playerStreamUrl instanceof StringValue) { media.media_url = ((StringValue) playerStreamUrl).getValue(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java index 355aaaaaa..4ad0b8091 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java @@ -85,7 +85,6 @@ import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.VideoLoader.VideoLoadingListener; import java.io.File; -import java.io.IOException; import java.util.concurrent.TimeUnit; import pl.droidsonroids.gif.GifSupportChecker; @@ -643,7 +642,7 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements public void loadVideo(boolean forceReload) { Pair urlAndType = getBestVideoUrlAndType(getMedia()); - if (urlAndType == null) return; + if (urlAndType == null || urlAndType.first == null) return; mVideoUrlAndType = urlAndType; mVideoLoader.loadVideo(urlAndType.first, forceReload, this); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java index 75a0a2723..051d15663 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java @@ -1118,9 +1118,11 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac retweetsCountView.setText(Utils.getLocalizedNumber(locale, retweetCount)); favoritesCountView.setText(Utils.getLocalizedNumber(locale, favoriteCount)); final UserProfileImagesAdapter interactUsersAdapter = (UserProfileImagesAdapter) interactUsersView.getAdapter(); - interactUsersAdapter.clear(); - if (statusActivity != null && statusActivity.retweeters != null) { - interactUsersAdapter.addAll(statusActivity.retweeters); + if (interactUsersAdapter != null) { + interactUsersAdapter.clear(); + if (statusActivity != null && statusActivity.retweeters != null) { + interactUsersAdapter.addAll(statusActivity.retweeters); + } } final ParcelableMedia[] media = Utils.getPrimaryMedia(status); @@ -1971,6 +1973,11 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac } public void setStatusActivity(StatusActivity activity) { + final ParcelableStatus status = getStatus(); + if (status == null) return; + if (activity != null && activity.statusId != (status.is_retweet ? status.retweet_id : status.id)) { + return; + } mStatusActivity = activity; notifyDataSetChanged(); } @@ -2047,9 +2054,10 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac @Override public StatusActivity loadInBackground() { final Context context = getContext(); - final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, mAccountId, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, mAccountId, false); final Paging paging = new Paging(); - final StatusActivity activitySummary = new StatusActivity(); + paging.setCount(10); + final StatusActivity activitySummary = new StatusActivity(mStatusId); final List retweeters = new ArrayList<>(); try { for (Status status : twitter.getRetweets(mStatusId, paging)) { @@ -2114,10 +2122,16 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac List retweeters; + long statusId; + long favoriteCount; long replyCount = -1; long retweetCount; + public StatusActivity(long statusId) { + this.statusId = statusId; + } + public List getRetweeters() { return retweeters; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java index 58301ba2a..071ce02c4 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java @@ -11,11 +11,8 @@ import android.support.annotation.Nullable; import android.text.TextUtils; import android.webkit.URLUtil; -import com.squareup.okhttp.Authenticator; import com.squareup.okhttp.Dns; import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.Request; -import com.squareup.okhttp.Response; import org.apache.commons.lang3.math.NumberUtils; import org.mariotaku.restfu.ExceptionFactory; @@ -54,12 +51,12 @@ import org.mariotaku.twidere.model.RequestType; import org.mariotaku.twidere.util.dagger.ApplicationModule; import org.mariotaku.twidere.util.net.NetworkUsageUtils; -import java.io.IOException; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.SocketAddress; import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -105,7 +102,10 @@ public class TwitterAPIFactory implements TwidereConstants { final boolean includeRetweets, Class cls) { if (context == null) return null; final ParcelableCredentials credentials = ParcelableCredentials.getCredentials(context, accountId); - return getInstance(context, credentials, cls); + final HashMap extraParams = new HashMap<>(); + extraParams.put("include_entities", String.valueOf(includeEntities)); + extraParams.put("include_retweets", String.valueOf(includeRetweets)); + return getInstance(context, credentials, extraParams, cls); } public static RestHttpClient getDefaultHttpClient(final Context context) { @@ -164,7 +164,9 @@ public class TwitterAPIFactory implements TwidereConstants { return Proxy.NO_PROXY; } - public static T getInstance(final Context context, final Endpoint endpoint, final Authorization auth, Class cls) { + public static T getInstance(final Context context, final Endpoint endpoint, + final Authorization auth, final Map extraRequestParams, + final Class cls) { final RestAPIFactory factory = new RestAPIFactory(); final String userAgent; if (auth instanceof OAuthAuthorization) { @@ -183,19 +185,41 @@ public class TwitterAPIFactory implements TwidereConstants { factory.setConverter(new TwitterConverter()); factory.setEndpoint(endpoint); factory.setAuthorization(auth); - factory.setRequestInfoFactory(new TwidereRequestInfoFactory()); + factory.setRequestInfoFactory(new TwidereRequestInfoFactory(extraRequestParams)); factory.setHttpRequestFactory(new TwidereHttpRequestFactory(userAgent)); factory.setExceptionFactory(new TwidereExceptionFactory()); return factory.build(cls); } - public static T getInstance(final Context context, final Endpoint endpoint, final ParcelableCredentials credentials, Class cls) { - return TwitterAPIFactory.getInstance(context, endpoint, getAuthorization(credentials), cls); + public static T getInstance(final Context context, final Endpoint endpoint, + final Authorization auth, final Class cls) { + return getInstance(context, endpoint, auth, null, cls); } - static T getInstance(final Context context, final ParcelableCredentials credentials, final Class cls) { + + public static T getInstance(final Context context, final Endpoint endpoint, + final ParcelableCredentials credentials, + final Class cls) { + return getInstance(context, endpoint, credentials, null, cls); + } + + public static T getInstance(final Context context, final Endpoint endpoint, + final ParcelableCredentials credentials, + final Map extraRequestParams, final Class cls) { + return TwitterAPIFactory.getInstance(context, endpoint, getAuthorization(credentials), + extraRequestParams, cls); + } + + static T getInstance(final Context context, final ParcelableCredentials credentials, + final Class cls) { + return getInstance(context, credentials, null, cls); + } + + static T getInstance(final Context context, final ParcelableCredentials credentials, + final Map extraRequestParams, final Class cls) { if (credentials == null) return null; - return TwitterAPIFactory.getInstance(context, getEndpoint(credentials, cls), credentials, cls); + return TwitterAPIFactory.getInstance(context, getEndpoint(credentials, cls), credentials, + extraRequestParams, cls); } public static Endpoint getEndpoint(ParcelableCredentials credentials, Class cls) { @@ -263,7 +287,7 @@ public class TwitterAPIFactory implements TwidereConstants { return new EmptyAuthorization(); } - private static void addParameter(List> params, String name, Object value) { + private static void addParam(List> params, String name, Object value) { params.add(Pair.create(name, String.valueOf(value))); } @@ -385,18 +409,29 @@ public class TwitterAPIFactory implements TwidereConstants { public static class TwidereRequestInfoFactory implements RequestInfoFactory { - private static HashMap sExtraParams = new HashMap<>(); + private static Map sDefaultRequestParams; static { - sExtraParams.put("include_cards", "true"); - sExtraParams.put("cards_platform", "Android-12"); - sExtraParams.put("include_entities", "true"); - sExtraParams.put("include_my_retweet", "true"); - sExtraParams.put("include_rts", "true"); - sExtraParams.put("include_reply_count", "true"); - sExtraParams.put("include_descendent_reply_count", "true"); - sExtraParams.put("full_text", "true"); - sExtraParams.put("model_version", "7"); + final HashMap map = new HashMap<>(); + try { + map.put("include_cards", "true"); + map.put("cards_platform", "Android-12"); + map.put("include_entities", "true"); + map.put("include_my_retweet", "true"); + map.put("include_rts", "true"); + map.put("include_reply_count", "true"); + map.put("include_descendent_reply_count", "true"); + map.put("full_text", "true"); + map.put("model_version", "7"); + } finally { + sDefaultRequestParams = Collections.unmodifiableMap(map); + } + } + + private final Map extraRequestParams; + + TwidereRequestInfoFactory(Map extraRequestParams) { + this.extraRequestParams = extraRequestParams; } @@ -416,11 +451,19 @@ public class TwitterAPIFactory implements TwidereConstants { if (parts.isEmpty()) { final List> params = method.hasBody() ? forms : queries; for (String key : extraParamKeys) { - addParameter(params, key, sExtraParams.get(key)); + if (extraRequestParams != null && extraRequestParams.containsKey(key)) { + addParam(params, key, extraRequestParams.get(key)); + } else { + addParam(params, key, sDefaultRequestParams.get(key)); + } } } else { for (String key : extraParamKeys) { - addPart(parts, key, sExtraParams.get(key)); + if (extraRequestParams != null && extraRequestParams.containsKey(key)) { + addPart(parts, key, extraRequestParams.get(key)); + } else { + addPart(parts, key, sDefaultRequestParams.get(key)); + } } } }