improved link click

This commit is contained in:
Mariotaku Lee 2016-04-05 12:25:23 +08:00
parent 8507cb3a20
commit 320a818b70
8 changed files with 58 additions and 20 deletions

View File

@ -316,24 +316,28 @@ public class Status extends TwitterResponseObject implements Comparable<Status>,
}
@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<Status>,
return entities;
}
@Override
public UserMentionEntity[] getUserMentionEntities() {
if (entities == null) return null;
return entities.getUserMentions();

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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);
}
}
}

View File

@ -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,

View File

@ -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<D> 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);
}
}

View File

@ -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;