diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/MediaViewerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/MediaViewerActivity.java index d16324dc0..e5493febc 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/MediaViewerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/MediaViewerActivity.java @@ -96,6 +96,7 @@ import org.mariotaku.twidere.util.media.MediaExtra; import org.mariotaku.twidere.util.media.preview.provider.TwitterMediaProvider; import java.io.File; +import java.util.Locale; import java.util.concurrent.TimeUnit; import javax.inject.Inject; @@ -623,9 +624,6 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements getDelegate().invalidateOptionsMenu(); } - /** - * @hide - */ @Override public void invalidateOptionsMenu() { getDelegate().invalidateOptionsMenu(); @@ -1043,8 +1041,10 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements protected Uri getDownloadUri() { final Pair bestVideoUrlAndType = getBestVideoUrlAndType(getMedia(), SUPPORTED_VIDEO_TYPES); - if (bestVideoUrlAndType == null || bestVideoUrlAndType.first == null) return null; - return Uri.parse(bestVideoUrlAndType.first); + if (bestVideoUrlAndType != null && bestVideoUrlAndType.first != null) { + return Uri.parse(bestVideoUrlAndType.first); + } + return getArguments().getParcelable(ImagePageFragment.EXTRA_MEDIA_URI); } @@ -1168,7 +1168,7 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements } @Nullable - private Pair getBestVideoUrlAndType(final ParcelableMedia media, + private Pair getBestVideoUrlAndType(@Nullable final ParcelableMedia media, @NonNull final String[] supportedTypes) { if (media == null) return null; switch (media.type) { @@ -1265,6 +1265,7 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements } } + @Nullable private ParcelableMedia getMedia() { return getArguments().getParcelable(EXTRA_MEDIA); } @@ -1298,8 +1299,8 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements mProgressBar.setProgress(Math.round(1000 * position / (float) duration)); final long durationSecs = TimeUnit.SECONDS.convert(duration, TimeUnit.MILLISECONDS), positionSecs = TimeUnit.SECONDS.convert(position, TimeUnit.MILLISECONDS); - mDurationLabel.setText(String.format("%02d:%02d", durationSecs / 60, durationSecs % 60)); - mPositionLabel.setText(String.format("%02d:%02d", positionSecs / 60, positionSecs % 60)); + mDurationLabel.setText(String.format(Locale.ROOT, "%02d:%02d", durationSecs / 60, durationSecs % 60)); + mPositionLabel.setText(String.format(Locale.ROOT, "%02d:%02d", positionSecs / 60, positionSecs % 60)); mHandler.postDelayed(this, 16); } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/preference/CardPreviewPreference.java b/twidere/src/main/java/org/mariotaku/twidere/preference/CardPreviewPreference.java index c5b42cbf1..790aa18ff 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/preference/CardPreviewPreference.java +++ b/twidere/src/main/java/org/mariotaku/twidere/preference/CardPreviewPreference.java @@ -70,8 +70,10 @@ public class CardPreviewPreference extends Preference implements Constants, OnSh protected void setLayoutResources(SharedPreferences preferences) { if (preferences.getBoolean(KEY_COMPACT_CARDS, false)) { setLayoutResource(R.layout.layout_preferences_card_preview_compact); + mHolder = null; } else { setLayoutResource(R.layout.layout_preferences_card_preview); + mHolder = null; } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/media/preview/provider/ImgurProvider.java b/twidere/src/main/java/org/mariotaku/twidere/util/media/preview/provider/ImgurProvider.java new file mode 100644 index 000000000..94a822f80 --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/util/media/preview/provider/ImgurProvider.java @@ -0,0 +1,47 @@ +package org.mariotaku.twidere.util.media.preview.provider; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import org.mariotaku.restfu.http.RestHttpClient; +import org.mariotaku.twidere.model.ParcelableMedia; +import org.mariotaku.twidere.util.UriUtils; + +/** + * Created by mariotaku on 16/3/20. + */ +public class ImgurProvider implements Provider { + @Override + public boolean supports(@NonNull String link) { + final String authority = UriUtils.getAuthority(link); + if (authority == null) return false; + switch (authority) { + case "i.imgur.com": + return true; + default: + return false; + } + } + + @Nullable + @Override + public ParcelableMedia from(@NonNull String url) { + final String authority = UriUtils.getAuthority(url); + if (authority == null) return null; + switch (authority) { + case "i.imgur.com": { + final String path = UriUtils.getPath(url); + if (path == null) return null; + ParcelableMedia media = new ParcelableMedia(); + media.url = url; + } + } + return null; + } + + @Nullable + @Override + public ParcelableMedia from(@NonNull String link, @NonNull RestHttpClient client, @Nullable Object extra) { + return from(link); + } +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/media/preview/provider/InstagramProvider.java b/twidere/src/main/java/org/mariotaku/twidere/util/media/preview/provider/InstagramProvider.java index 779205666..5990d6edb 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/media/preview/provider/InstagramProvider.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/media/preview/provider/InstagramProvider.java @@ -11,6 +11,7 @@ import org.mariotaku.twidere.util.UriUtils; import java.util.Locale; /** + * Process instagram image links * Created by mariotaku on 16/1/1. */ public class InstagramProvider implements Provider { diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java b/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java index b1592d598..152770812 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java @@ -34,10 +34,10 @@ import org.mariotaku.twidere.util.TwitterCardUtils; import org.mariotaku.twidere.util.UnitConvertUtils; import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.Utils; -import org.mariotaku.twidere.view.IconActionButton; import org.mariotaku.twidere.view.ActionIconThemedTextView; import org.mariotaku.twidere.view.CardMediaContainer; import org.mariotaku.twidere.view.ForegroundColorView; +import org.mariotaku.twidere.view.IconActionView; import org.mariotaku.twidere.view.NameView; import org.mariotaku.twidere.view.ShortTimeView; import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder; @@ -69,8 +69,9 @@ public class StatusViewHolder extends ViewHolder implements Constants, IStatusVi private final TextView statusInfoLabel; private final ShortTimeView timeView; private final CardMediaContainer mediaPreview, quoteMediaPreview; - private final IconActionButton replyIconView, retweetIconView, favoriteIconView; + private final IconActionView replyIconView, retweetIconView, favoriteIconView; private final TextView replyCountView, retweetCountView, favoriteCountView; + private final View replyView, retweetView, favoriteView; private final IColorLabelView itemContent; private final ForegroundColorView quoteIndicator; private final View actionButtons; @@ -111,9 +112,13 @@ public class StatusViewHolder extends ViewHolder implements Constants, IStatusVi itemMenu = itemView.findViewById(R.id.item_menu); actionButtons = itemView.findViewById(R.id.action_buttons); - replyIconView = (IconActionButton) itemView.findViewById(R.id.reply_icon); - retweetIconView = (IconActionButton) itemView.findViewById(R.id.retweet_icon); - favoriteIconView = (IconActionButton) itemView.findViewById(R.id.favorite_icon); + replyView = itemView.findViewById(R.id.reply); + retweetView = itemView.findViewById(R.id.retweet); + favoriteView = itemView.findViewById(R.id.favorite); + + replyIconView = (IconActionView) itemView.findViewById(R.id.reply_icon); + retweetIconView = (IconActionView) itemView.findViewById(R.id.retweet_icon); + favoriteIconView = (IconActionView) itemView.findViewById(R.id.favorite_icon); replyCountView = (ActionIconThemedTextView) itemView.findViewById(R.id.reply_count); retweetCountView = (ActionIconThemedTextView) itemView.findViewById(R.id.retweet_count); @@ -461,9 +466,9 @@ public class StatusViewHolder extends ViewHolder implements Constants, IStatusVi itemMenu.setOnClickListener(eventListener); profileImageView.setOnClickListener(eventListener); - replyIconView.setOnClickListener(eventListener); - retweetIconView.setOnClickListener(eventListener); - favoriteIconView.setOnClickListener(eventListener); + replyView.setOnClickListener(eventListener); + retweetView.setOnClickListener(eventListener); + favoriteView.setOnClickListener(eventListener); } @Override @@ -606,17 +611,20 @@ public class StatusViewHolder extends ViewHolder implements Constants, IStatusVi break; } case R.id.reply_count: - case R.id.reply_icon: { + case R.id.reply_icon: + case R.id.reply: { listener.onItemActionClick(holder, R.id.reply, position); break; } case R.id.retweet_count: - case R.id.retweet_icon: { + case R.id.retweet_icon: + case R.id.retweet: { listener.onItemActionClick(holder, R.id.retweet, position); break; } case R.id.favorite_count: - case R.id.favorite_icon: { + case R.id.favorite_icon: + case R.id.favorite: { listener.onItemActionClick(holder, R.id.favorite, position); break; } diff --git a/twidere/src/main/res/layout/card_item_status_common.xml b/twidere/src/main/res/layout/card_item_status_common.xml index 7bc4099fa..7af4ff0cc 100644 --- a/twidere/src/main/res/layout/card_item_status_common.xml +++ b/twidere/src/main/res/layout/card_item_status_common.xml @@ -321,75 +321,97 @@ android:paddingLeft="@dimen/element_spacing_small" android:paddingRight="@dimen/element_spacing_small"> - - - - - + android:focusable="false"> - + + + + + - - + android:focusable="false"> - + + + + + + + android:background="?selectableItemBackgroundBorderless" + android:clickable="true" + android:focusable="false"> + + + + + - - - - - + android:focusable="false"> - + + + + + - - + android:focusable="false"> - + + + + + + + android:background="?selectableItemBackgroundBorderless" + android:clickable="true" + android:focusable="false"> + + + +