From 320a818b7046d5bc568c0757b69c303dd148bc6f Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Tue, 5 Apr 2016 12:25:23 +0800 Subject: [PATCH] improved link click --- .../twidere/api/twitter/model/Status.java | 5 +++++ .../twidere/fragment/StatusFragment.java | 2 +- .../model/util/ParcelableMediaUtils.java | 17 +++++++++++++++++ .../mariotaku/twidere/util/IntentUtils.java | 14 +++----------- .../util/InternalTwitterContentUtils.java | 11 +++++++++-- .../twidere/util/OnLinkClickHandler.java | 8 ++++++-- .../util/StatusAdapterLinkClickHandler.java | 18 +++++++++++++++--- .../twidere/util/StatusLinkClickHandler.java | 3 ++- 8 files changed, 58 insertions(+), 20 deletions(-) diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/Status.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/Status.java index 86904f5d1..c32f39f03 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/Status.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/Status.java @@ -316,24 +316,28 @@ public class Status extends TwitterResponseObject implements Comparable, } + @Override public MediaEntity[] getExtendedMediaEntities() { if (extendedEntities == null) return null; return extendedEntities.getMedia(); } + @Override public HashtagEntity[] getHashtagEntities() { if (entities == null) return null; return entities.getHashtags(); } + @Override public MediaEntity[] getMediaEntities() { if (entities == null) return null; return entities.getMedia(); } + @Override public UrlEntity[] getUrlEntities() { if (entities == null) return null; return entities.getUrls(); @@ -343,6 +347,7 @@ public class Status extends TwitterResponseObject implements Comparable, return entities; } + @Override public UserMentionEntity[] getUserMentionEntities() { if (entities == null) return null; return entities.getUserMentions(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/StatusFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/StatusFragment.java index 00947b4ea..a6a8dda97 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/StatusFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/StatusFragment.java @@ -1111,7 +1111,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac countsUsersHeightHolder.setVisibility(View.GONE); } - final ParcelableMedia[] media = IntentUtils.getPrimaryMedia(status); + final ParcelableMedia[] media = ParcelableMediaUtils.getPrimaryMedia(status); if (ArrayUtils.isEmpty(media)) { mediaPreviewContainer.setVisibility(View.GONE); diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/util/ParcelableMediaUtils.java b/twidere/src/main/java/org/mariotaku/twidere/model/util/ParcelableMediaUtils.java index 830d87c63..7fa43e1e1 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/util/ParcelableMediaUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/util/ParcelableMediaUtils.java @@ -16,6 +16,7 @@ import org.mariotaku.twidere.api.twitter.model.Status; import org.mariotaku.twidere.api.twitter.model.UrlEntity; import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableMediaUpdate; +import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.util.InternalTwitterContentUtils; import org.mariotaku.twidere.util.TwidereArrayUtils; import org.mariotaku.twidere.util.media.preview.PreviewMediaExtractor; @@ -68,6 +69,7 @@ public class ParcelableMediaUtils { media.url = mediaUrl; media.media_url = mediaUrl; media.preview_url = mediaUrl; + media.page_url = entity.getExpandedUrl(); media.start = entity.getStart(); media.end = entity.getEnd(); media.type = ParcelableMediaUtils.getTypeInt(entity.getType()); @@ -266,4 +268,19 @@ public class ParcelableMediaUtils { } return null; } + + public static ParcelableMedia[] getPrimaryMedia(ParcelableStatus status) { + if (status.is_quote && ArrayUtils.isEmpty(status.media)) { + return status.quoted_media; + } else { + return status.media; + } + } + + public static ParcelableMedia[] getAllMedia(ParcelableStatus status) { + ParcelableMedia[] result = new ParcelableMedia[TwidereArrayUtils.arraysLength(status.media, + status.quoted_media)]; + TwidereArrayUtils.mergeArray(result, status.media, status.quoted_media); + return result; + } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/IntentUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/IntentUtils.java index 081510316..17decfb92 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/IntentUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/IntentUtils.java @@ -17,7 +17,6 @@ import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.text.TextUtils; -import org.apache.commons.lang3.ArrayUtils; import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; @@ -33,6 +32,7 @@ import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUserList; import org.mariotaku.twidere.model.UserKey; import org.mariotaku.twidere.model.util.ParcelableLocationUtils; +import org.mariotaku.twidere.model.util.ParcelableMediaUtils; import java.util.ArrayList; import java.util.List; @@ -141,7 +141,7 @@ public class IntentUtils implements Constants { final ParcelableMedia current, final Bundle options, final boolean newDocument) { openMedia(context, status.account_key, status.is_possibly_sensitive, status, null, current, - getPrimaryMedia(status), options, newDocument); + ParcelableMediaUtils.getPrimaryMedia(status), options, newDocument); } public static void openMedia(@NonNull final Context context, @Nullable final UserKey accountKey, final boolean isPossiblySensitive, @@ -185,18 +185,10 @@ public class IntentUtils implements Constants { public static void openMediaDirectly(@NonNull final Context context, @Nullable final UserKey accountKey, final ParcelableStatus status, final ParcelableMedia current, final Bundle options, final boolean newDocument) { - openMediaDirectly(context, accountKey, status, null, current, getPrimaryMedia(status), + openMediaDirectly(context, accountKey, status, null, current, ParcelableMediaUtils.getPrimaryMedia(status), options, newDocument); } - public static ParcelableMedia[] getPrimaryMedia(ParcelableStatus status) { - if (status.is_quote && ArrayUtils.isEmpty(status.media)) { - return status.quoted_media; - } else { - return status.media; - } - } - public static String getDefaultBrowserPackage(Context context) { Uri.Builder builder = new Uri.Builder(); builder.scheme(SCHEME_HTTP); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/InternalTwitterContentUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/InternalTwitterContentUtils.java index 291749e6d..99c3939a3 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/InternalTwitterContentUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/InternalTwitterContentUtils.java @@ -15,6 +15,7 @@ import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.DirectMessage; import org.mariotaku.twidere.api.twitter.model.EntitySupport; +import org.mariotaku.twidere.api.twitter.model.ExtendedEntitySupport; import org.mariotaku.twidere.api.twitter.model.MediaEntity; import org.mariotaku.twidere.api.twitter.model.Status; import org.mariotaku.twidere.api.twitter.model.UrlEntity; @@ -252,13 +253,19 @@ public class InternalTwitterContentUtils { private static void parseEntities(final HtmlBuilder builder, final EntitySupport entities) { // Format media. - final MediaEntity[] mediaEntities = entities.getMediaEntities(); + MediaEntity[] mediaEntities = null; + if (entities instanceof ExtendedEntitySupport) { + mediaEntities = ((ExtendedEntitySupport) entities).getExtendedMediaEntities(); + } + if (mediaEntities == null) { + mediaEntities = entities.getMediaEntities(); + } if (mediaEntities != null) { for (final MediaEntity mediaEntity : mediaEntities) { final int start = mediaEntity.getStart(), end = mediaEntity.getEnd(); final String mediaUrl = getMediaUrl(mediaEntity); if (mediaUrl != null && start >= 0 && end >= 0) { - builder.addLink(mediaUrl, mediaEntity.getDisplayUrl(), start, end); + builder.addLink(mediaEntity.getExpandedUrl(), mediaEntity.getDisplayUrl(), start, end); } } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/OnLinkClickHandler.java b/twidere/src/main/java/org/mariotaku/twidere/util/OnLinkClickHandler.java index 26f3f0061..4306ea81e 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/OnLinkClickHandler.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/OnLinkClickHandler.java @@ -78,7 +78,7 @@ public class OnLinkClickHandler implements OnLinkClickListener, Constants { break; } case TwidereLinkify.LINK_TYPE_LINK_IN_TEXT: { - if (PreviewMediaExtractor.isSupported(link)) { + if (isMedia(link, extraId)) { openMedia(accountKey, extraId, sensitive, link, start, end); } else { openLink(link); @@ -86,7 +86,7 @@ public class OnLinkClickHandler implements OnLinkClickListener, Constants { break; } case TwidereLinkify.LINK_TYPE_ENTITY_URL: { - if (PreviewMediaExtractor.isSupported(link)) { + if (isMedia(link, extraId)) { openMedia(accountKey, extraId, sensitive, link, start, end); } else { if (orig != null && "fanfou.com".equals(UriUtils.getAuthority(link))) { @@ -147,6 +147,10 @@ public class OnLinkClickHandler implements OnLinkClickListener, Constants { return false; } + protected boolean isMedia(String link, long extraId) { + return PreviewMediaExtractor.isSupported(link); + } + protected void openMedia(UserKey accountKey, long extraId, boolean sensitive, String link, int start, int end) { final ParcelableMedia[] media = {ParcelableMediaUtils.image(link)}; IntentUtils.openMedia(context, accountKey, sensitive, null, media, null, diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/StatusAdapterLinkClickHandler.java b/twidere/src/main/java/org/mariotaku/twidere/util/StatusAdapterLinkClickHandler.java index c69ff207d..31ee97a65 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/StatusAdapterLinkClickHandler.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/StatusAdapterLinkClickHandler.java @@ -25,6 +25,7 @@ import org.mariotaku.twidere.adapter.iface.IStatusesAdapter; import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.UserKey; +import org.mariotaku.twidere.model.util.ParcelableMediaUtils; /** * Created by mariotaku on 15/4/6. @@ -44,13 +45,24 @@ public class StatusAdapterLinkClickHandler extends OnLinkClickHandler { final String link, final int start, final int end) { if (extraId == RecyclerView.NO_POSITION) return; final ParcelableStatus status = adapter.getStatus((int) extraId); - final ParcelableMedia current = StatusLinkClickHandler.findByLink(status.media, link); + final ParcelableMedia[] media = ParcelableMediaUtils.getAllMedia(status); + final ParcelableMedia current = StatusLinkClickHandler.findByLink(media, link); if (current != null && current.open_browser) { openLink(link); } else { - IntentUtils.openMedia(context, status, current, null, - preferences.getBoolean(KEY_NEW_DOCUMENT_API)); + final boolean newDocument = preferences.getBoolean(KEY_NEW_DOCUMENT_API); + IntentUtils.openMedia(context, status, current, null, newDocument); } } + @Override + protected boolean isMedia(String link, long extraId) { + if (extraId != RecyclerView.NO_POSITION) { + final ParcelableStatus status = adapter.getStatus((int) extraId); + final ParcelableMedia[] media = ParcelableMediaUtils.getAllMedia(status); + final ParcelableMedia current = StatusLinkClickHandler.findByLink(media, link); + return current != null && !current.open_browser; + } + return super.isMedia(link, extraId); + } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/StatusLinkClickHandler.java b/twidere/src/main/java/org/mariotaku/twidere/util/StatusLinkClickHandler.java index 26372cc34..93ffa5073 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/StatusLinkClickHandler.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/StatusLinkClickHandler.java @@ -48,7 +48,8 @@ public class StatusLinkClickHandler extends OnLinkClickHandler { public static ParcelableMedia findByLink(ParcelableMedia[] media, String link) { if (link == null || media == null) return null; for (ParcelableMedia mediaItem : media) { - if (link.equals(mediaItem.media_url) || link.equals(mediaItem.url)) + if (link.equals(mediaItem.media_url) || link.equals(mediaItem.url) || + link.equals(mediaItem.page_url) || link.equals(mediaItem.preview_url)) return mediaItem; } return null;