From 6a62ba6382d901589444cdb8782877221849f2be Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Mon, 23 Mar 2015 01:06:25 +0800 Subject: [PATCH] added experimental vine video support use jitpack instead of submodule --- .gitmodules | 6 - build.gradle | 1 - libraries/DragSortListView | 1 - libraries/MessageBubbleView | 1 - settings.gradle | 4 +- twidere.component.common/build.gradle | 2 +- .../twidere/model/ParcelableMedia.java | 151 +++++- twidere.component.jsonserializer/build.gradle | 2 +- twidere.component.nyan/build.gradle | 2 +- twidere.component.querybuilder/build.gradle | 2 +- .../build.gradle | 2 +- twidere.component.twitter4j/build.gradle | 2 +- .../src/main/java/twitter4j/MediaEntity.java | 116 +++-- .../internal/json/MediaEntityJSONImpl.java | 493 +++++++++++------- twidere.donate.nyanwp.wear/build.gradle | 2 +- twidere.donate.nyanwp/build.gradle | 2 +- twidere.extension.push.xiaomi/build.gradle | 2 +- twidere.extension.streaming/build.gradle | 2 +- twidere.extension.twitlonger/build.gradle | 2 +- twidere.library.extension/build.gradle | 2 +- twidere.wear/build.gradle | 2 +- twidere/build.gradle | 9 +- .../activity/support/ComposeActivity.java | 13 +- .../support/CustomTabEditorActivity.java | 4 +- .../activity/support/MediaViewerActivity.java | 131 ++++- .../support/QuickSearchBarActivity.java | 10 +- .../support/UserProfileEditorActivity.java | 4 +- .../twidere/adapter/AbsActivitiesAdapter.java | 6 +- .../twidere/adapter/AbsStatusesAdapter.java | 6 +- .../twidere/adapter/AccountsAdapter.java | 6 +- .../adapter/AccountsSpinnerAdapter.java | 4 +- .../twidere/adapter/BaseArrayAdapter.java | 6 +- .../twidere/adapter/BaseCursorAdapter.java | 6 +- .../twidere/adapter/DraftsAdapter.java | 4 +- .../twidere/adapter/MediaPreviewAdapter.java | 4 +- .../adapter/MessageConversationAdapter.java | 6 +- .../adapter/MessageEntriesAdapter.java | 6 +- .../ParcelableUserListsListAdapter.java | 4 +- .../adapter/ParcelableUsersAdapter.java | 4 +- .../SimpleParcelableUserListsAdapter.java | 4 +- .../adapter/SimpleParcelableUsersAdapter.java | 4 +- .../UserHashtagAutoCompleteAdapter.java | 4 +- .../twidere/adapter/iface/IBaseAdapter.java | 4 +- .../adapter/iface/IContentCardAdapter.java | 4 +- .../twidere/app/TwidereApplication.java | 22 +- .../support/AccountsDashboardFragment.java | 6 +- .../DirectMessagesConversationFragment.java | 4 +- .../support/RetweetQuoteDialogFragment.java | 4 +- .../fragment/support/StatusFragment.java | 8 +- .../StatusTranslateDialogFragment.java | 4 +- .../fragment/support/UserFragment.java | 4 +- .../fragment/support/UserListFragment.java | 4 +- .../support/UserMediaTimelineFragment.java | 6 +- .../support/ViewStatusDialogFragment.java | 4 +- .../popup/AccountSelectorPopupWindow.java | 4 +- .../preference/AccountsListPreference.java | 4 +- ...erWrapper.java => MediaLoaderWrapper.java} | 8 +- .../org/mariotaku/twidere/util/Utils.java | 4 +- .../mariotaku/twidere/util/VideoLoader.java | 171 ++++++ .../util/message/VideoLoadFinishedEvent.java | 26 + .../twidere/view/CardMediaContainer.java | 4 +- .../ActivityTitleSummaryViewHolder.java | 4 +- .../holder/MessageConversationViewHolder.java | 4 +- .../view/holder/MessageEntryViewHolder.java | 4 +- .../twidere/view/holder/StatusViewHolder.java | 20 +- ...page.xml => fragment_media_page_image.xml} | 0 .../res/layout/fragment_media_page_video.xml | 40 ++ 67 files changed, 1017 insertions(+), 394 deletions(-) delete mode 160000 libraries/DragSortListView delete mode 160000 libraries/MessageBubbleView rename twidere/src/main/java/org/mariotaku/twidere/util/{ImageLoaderWrapper.java => MediaLoaderWrapper.java} (96%) create mode 100644 twidere/src/main/java/org/mariotaku/twidere/util/VideoLoader.java create mode 100644 twidere/src/main/java/org/mariotaku/twidere/util/message/VideoLoadFinishedEvent.java rename twidere/src/main/res/layout/{fragment_media_page.xml => fragment_media_page_image.xml} (100%) create mode 100644 twidere/src/main/res/layout/fragment_media_page_video.xml diff --git a/.gitmodules b/.gitmodules index 5f06f37d6..1ff5d7522 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,12 +1,6 @@ [submodule "libraries/SlidingMenu"] path = libraries/SlidingMenu url = https://github.com/mariotaku/SlidingMenu-Gradle -[submodule "libraries/DragSortListView"] - path = libraries/DragSortListView - url = https://github.com/mariotaku/DragSortListView-Gradle -[submodule "libraries/MessageBubbleView"] - path = libraries/MessageBubbleView - url = https://github.com/mariotaku/MessageBubbleView.git [submodule "libraries/ColorPicker"] path = libraries/ColorPicker url = https://github.com/uucky/ColorPicker-Android.git diff --git a/build.gradle b/build.gradle index 614c071ef..34967a029 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,6 @@ buildscript { dependencies { classpath 'com.github.ben-manes:gradle-versions-plugin:0.8' classpath 'com.android.tools.build:gradle:1.1.3' - classpath 'com.github.xujiaao:aarLinkSources:1.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/libraries/DragSortListView b/libraries/DragSortListView deleted file mode 160000 index 524ca7a43..000000000 --- a/libraries/DragSortListView +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 524ca7a432be4c55be3841813fe7326f2fbf08c1 diff --git a/libraries/MessageBubbleView b/libraries/MessageBubbleView deleted file mode 160000 index 10724315c..000000000 --- a/libraries/MessageBubbleView +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 10724315c13768d16891c0ff0926daecba39c75c diff --git a/settings.gradle b/settings.gradle index 057603cf4..bc806e286 100644 --- a/settings.gradle +++ b/settings.gradle @@ -12,9 +12,7 @@ include ':twidere.component.nyan' include ':twidere.extension.streaming' include ':twidere.extension.twitlonger' include ':twidere.extension.push.xiaomi' -include ':SlidingMenu', ':DragSortListView', ':MessageBubbleView', ':ColorPicker' +include ':SlidingMenu', ':ColorPicker' project(':SlidingMenu').projectDir = file('libraries/SlidingMenu/library') -project(':DragSortListView').projectDir = file('libraries/DragSortListView/library') -project(':MessageBubbleView').projectDir = file('libraries/MessageBubbleView/library') project(':ColorPicker').projectDir = file('libraries/ColorPicker/library') \ No newline at end of file diff --git a/twidere.component.common/build.gradle b/twidere.component.common/build.gradle index a11d75f86..d5fc874fb 100644 --- a/twidere.component.common/build.gradle +++ b/twidere.component.common/build.gradle @@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle') android { defaultConfig { minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } 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 773c66155..b054e26b5 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 @@ -4,11 +4,9 @@ import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.util.Log; import org.mariotaku.jsonserializer.JSONParcel; import org.mariotaku.jsonserializer.JSONParcelable; -import org.mariotaku.twidere.TwidereConstants; import org.mariotaku.twidere.util.MediaPreviewUtils; import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.SimpleValueSerializer; @@ -17,21 +15,24 @@ import org.mariotaku.twidere.util.SimpleValueSerializer.SerializationException; import org.mariotaku.twidere.util.SimpleValueSerializer.SimpleValueSerializable; import org.mariotaku.twidere.util.SimpleValueSerializer.Writer; -import java.io.IOException; import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import twitter4j.EntitySupport; import twitter4j.ExtendedEntitySupport; import twitter4j.MediaEntity; import twitter4j.MediaEntity.Size; +import twitter4j.MediaEntity.Type; import twitter4j.URLEntity; @SuppressWarnings("unused") public class ParcelableMedia implements Parcelable, JSONParcelable, SimpleValueSerializable { + public static final int TYPE_UNKNOWN = 0; public static final int TYPE_IMAGE = 1; + public static final int TYPE_VIDEO = 2; public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override @@ -77,6 +78,8 @@ public class ParcelableMedia implements Parcelable, JSONParcelable, SimpleValueS public int start, end, type; public int width, height; + public VideoInfo video_info; + public ParcelableMedia() { @@ -97,10 +100,21 @@ public class ParcelableMedia implements Parcelable, JSONParcelable, SimpleValueS media_url = ParseUtils.parseString(entity.getMediaURL()); start = entity.getStart(); end = entity.getEnd(); - type = TYPE_IMAGE; + type = getTypeInt(entity.getType()); final Size size = entity.getSizes().get(Size.LARGE); width = size != null ? size.getWidth() : 0; height = size != null ? size.getHeight() : 0; + video_info = VideoInfo.fromMediaEntityInfo(entity.getVideoInfo()); + } + + private static int getTypeInt(Type type) { + switch (type) { + case PHOTO: + return TYPE_IMAGE; + case VIDEO: + return TYPE_VIDEO; + } + return TYPE_UNKNOWN; } public ParcelableMedia(final Parcel in) { @@ -111,6 +125,7 @@ public class ParcelableMedia implements Parcelable, JSONParcelable, SimpleValueS type = in.readInt(); width = in.readInt(); height = in.readInt(); + video_info = in.readParcelable(VideoInfo.class.getClassLoader()); } private ParcelableMedia(@NonNull final String media_url, @Nullable final String page_url, @@ -237,6 +252,7 @@ public class ParcelableMedia implements Parcelable, JSONParcelable, SimpleValueS dest.writeInt(type); dest.writeInt(width); dest.writeInt(height); + dest.writeParcelable(video_info, flags); } public static ParcelableMedia[] fromEntities(final EntitySupport entities) { @@ -272,6 +288,133 @@ public class ParcelableMedia implements Parcelable, JSONParcelable, SimpleValueS } + public static class VideoInfo implements Parcelable { + + public Variant[] variants; + public long[] aspect_ratio; + public long duration; + + public VideoInfo(Reader source) { + + } + + public VideoInfo(MediaEntity.VideoInfo videoInfo) { + variants = Variant.fromMediaEntityVariants(videoInfo.getVariants()); + aspect_ratio = videoInfo.getAspectRatio(); + duration = videoInfo.getDuration(); + } + + public static VideoInfo fromMediaEntityInfo(MediaEntity.VideoInfo videoInfo) { + if (videoInfo == null) return null; + return new VideoInfo(videoInfo); + } + + @Override + public String toString() { + return "VideoInfo{" + + "variants=" + Arrays.toString(variants) + + ", aspect_ratio=" + Arrays.toString(aspect_ratio) + + ", duration=" + duration + + '}'; + } + + public static class Variant implements Parcelable { + public Variant(MediaEntity.VideoInfo.Variant entityVariant) { + content_type = entityVariant.getContentType(); + url = entityVariant.getUrl(); + bitrate = entityVariant.getBitrate(); + } + + @Override + public String toString() { + return "Variant{" + + "content_type='" + content_type + '\'' + + ", url='" + url + '\'' + + ", bitrate=" + bitrate + + '}'; + } + + public final String content_type; + public final String url; + public final long bitrate; + + public Variant(JSONParcel source) { + content_type = source.readString("content_type"); + url = source.readString("url"); + bitrate = source.readLong("bitrate"); + } + + @Override + public int describeContents() { + return 0; + } + + public static Variant[] fromMediaEntityVariants(MediaEntity.VideoInfo.Variant[] entityVariants) { + if (entityVariants == null) return null; + final Variant[] variants = new Variant[entityVariants.length]; + for (int i = 0, j = entityVariants.length; i < j; i++) { + variants[i] = new Variant(entityVariants[i]); + } + return variants; + } + + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.content_type); + dest.writeString(this.url); + dest.writeLong(this.bitrate); + } + + + private Variant(Parcel in) { + this.content_type = in.readString(); + this.url = in.readString(); + this.bitrate = in.readLong(); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public Variant createFromParcel(Parcel source) { + return new Variant(source); + } + + public Variant[] newArray(int size) { + return new Variant[size]; + } + }; + + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeTypedArray(variants, flags); + dest.writeLongArray(aspect_ratio); + dest.writeLong(duration); + } + + + private VideoInfo(Parcel in) { + variants = in.createTypedArray(Variant.CREATOR); + aspect_ratio = in.createLongArray(); + duration = in.readLong(); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public VideoInfo createFromParcel(Parcel source) { + return new VideoInfo(source); + } + + public VideoInfo[] newArray(int size) { + return new VideoInfo[size]; + } + }; + } + public static ParcelableMedia newImage(final String media_url, final String url) { return new ParcelableMedia(media_url, url, 0, 0, TYPE_IMAGE); } diff --git a/twidere.component.jsonserializer/build.gradle b/twidere.component.jsonserializer/build.gradle index 994ef030c..7ade21594 100644 --- a/twidere.component.jsonserializer/build.gradle +++ b/twidere.component.jsonserializer/build.gradle @@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle') android { defaultConfig { minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } diff --git a/twidere.component.nyan/build.gradle b/twidere.component.nyan/build.gradle index f917b0533..a166550ae 100644 --- a/twidere.component.nyan/build.gradle +++ b/twidere.component.nyan/build.gradle @@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle') android { defaultConfig { minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } diff --git a/twidere.component.querybuilder/build.gradle b/twidere.component.querybuilder/build.gradle index 994ef030c..7ade21594 100644 --- a/twidere.component.querybuilder/build.gradle +++ b/twidere.component.querybuilder/build.gradle @@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle') android { defaultConfig { minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } diff --git a/twidere.component.twitter4j.streaming/build.gradle b/twidere.component.twitter4j.streaming/build.gradle index 1cdc92f24..47059764a 100644 --- a/twidere.component.twitter4j.streaming/build.gradle +++ b/twidere.component.twitter4j.streaming/build.gradle @@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle') android { defaultConfig { minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } diff --git a/twidere.component.twitter4j/build.gradle b/twidere.component.twitter4j/build.gradle index f917b0533..a166550ae 100644 --- a/twidere.component.twitter4j/build.gradle +++ b/twidere.component.twitter4j/build.gradle @@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle') android { defaultConfig { minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } diff --git a/twidere.component.twitter4j/src/main/java/twitter4j/MediaEntity.java b/twidere.component.twitter4j/src/main/java/twitter4j/MediaEntity.java index ce93b3a24..dd6fa2b78 100644 --- a/twidere.component.twitter4j/src/main/java/twitter4j/MediaEntity.java +++ b/twidere.component.twitter4j/src/main/java/twitter4j/MediaEntity.java @@ -25,54 +25,88 @@ import java.util.Map; * @since Twitter4J 2.2.3 */ public interface MediaEntity extends URLEntity, Serializable { - /** - * Returns the id of the media. - * - * @return the id of the media - */ - long getId(); + /** + * Returns the id of the media. + * + * @return the id of the media + */ + long getId(); - /** - * Returns the media URL. - * - * @return the media URL - */ - URL getMediaURL(); + /** + * Returns the media URL. + * + * @return the media URL + */ + URL getMediaURL(); - /** - * Returns the media secure URL. - * - * @return the media secure URL - */ - URL getMediaURLHttps(); + /** + * Returns the media secure URL. + * + * @return the media secure URL + */ + URL getMediaURLHttps(); - /** - * Returns size variations of the media. - * - * @return size variations of the media - */ - Map getSizes(); + /** + * Returns size variations of the media. + * + * @return size variations of the media + */ + Map getSizes(); - /** - * Returns the media type ("photo"). - * - * @return the media type ("photo"). - */ - String getType(); + /** + * Returns the media type ("photo"). + * + * @return the media type ("photo"). + */ + Type getType(); - interface Size extends Serializable { - Integer THUMB = 0; - Integer SMALL = 1; - Integer MEDIUM = 2; - Integer LARGE = 3; - int FIT = 100; - int CROP = 101; + enum Type { + PHOTO, VIDEO, UNKNOWN; - int getHeight(); + public static Type parse(String typeString) { + if ("photo".equalsIgnoreCase(typeString)) { + return PHOTO; + } else if ("video".equalsIgnoreCase(typeString)) { + return VIDEO; + } + return UNKNOWN; + } + } - int getResize(); + VideoInfo getVideoInfo(); - int getWidth(); - } + interface VideoInfo extends Serializable { + + Variant[] getVariants(); + + long[] getAspectRatio(); + + long getDuration(); + + interface Variant extends Serializable { + + String getContentType(); + + String getUrl(); + + long getBitrate(); + } + + } + + interface Size extends Serializable { + Integer THUMB = 0; + Integer SMALL = 1; + Integer MEDIUM = 2; + Integer LARGE = 3; + int FIT = 100; + int CROP = 101; + + int getHeight(); + + int getResize(); + + int getWidth(); + } } diff --git a/twidere.component.twitter4j/src/main/java/twitter4j/internal/json/MediaEntityJSONImpl.java b/twidere.component.twitter4j/src/main/java/twitter4j/internal/json/MediaEntityJSONImpl.java index 5b9d2b703..a0b536a38 100644 --- a/twidere.component.twitter4j/src/main/java/twitter4j/internal/json/MediaEntityJSONImpl.java +++ b/twidere.component.twitter4j/src/main/java/twitter4j/internal/json/MediaEntityJSONImpl.java @@ -25,6 +25,7 @@ import org.json.JSONObject; import java.net.MalformedURLException; import java.net.URL; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -39,239 +40,329 @@ import static twitter4j.internal.util.InternalParseUtil.getLong; */ public class MediaEntityJSONImpl implements MediaEntity { - /** - * - */ - private static final long serialVersionUID = -1634113112942821363L; - private long id; - private int start = -1; - private int end = -1; - private URL url; - private URL mediaURL; - private URL mediaURLHttps; - private URL expandedURL; - private String displayURL; - private Map sizes; - private String type; + /** + * + */ + private static final long serialVersionUID = -1634113112942821363L; + private long id; + private int start = -1; + private int end = -1; + private URL url; + private URL mediaURL; + private URL mediaURLHttps; + private URL expandedURL; + private String displayURL; + private Map sizes; + private Type type; + private VideoInfoJSONImpl videoInfo; - public MediaEntityJSONImpl(final JSONObject json) throws TwitterException { - try { - final JSONArray indicesArray = json.getJSONArray("indices"); - start = indicesArray.getInt(0); - end = indicesArray.getInt(1); - id = getLong("id", json); + public VideoInfo getVideoInfo() { + return videoInfo; + } - try { - url = new URL(json.getString("url")); - } catch (final MalformedURLException ignore) { - } + public MediaEntityJSONImpl(final JSONObject json) throws TwitterException { + try { + final JSONArray indicesArray = json.getJSONArray("indices"); + start = indicesArray.getInt(0); + end = indicesArray.getInt(1); + id = getLong("id", json); - if (!json.isNull("expanded_url")) { - try { - expandedURL = new URL(json.getString("expanded_url")); - } catch (final MalformedURLException ignore) { - } - } - if (!json.isNull("media_url")) { - try { - mediaURL = new URL(json.getString("media_url")); - } catch (final MalformedURLException ignore) { - } - } - if (!json.isNull("media_url_https")) { - try { - mediaURLHttps = new URL(json.getString("media_url_https")); - } catch (final MalformedURLException ignore) { - } - } - if (!json.isNull("display_url")) { - displayURL = json.getString("display_url"); - } - final JSONObject sizes = json.getJSONObject("sizes"); - this.sizes = new HashMap(4); - // thumbworkarounding API side issue - addMediaEntitySizeIfNotNull(this.sizes, sizes, MediaEntity.Size.LARGE, "large"); - addMediaEntitySizeIfNotNull(this.sizes, sizes, MediaEntity.Size.MEDIUM, "medium"); - addMediaEntitySizeIfNotNull(this.sizes, sizes, MediaEntity.Size.SMALL, "small"); - addMediaEntitySizeIfNotNull(this.sizes, sizes, MediaEntity.Size.THUMB, "thumb"); - if (!json.isNull("type")) { - type = json.getString("type"); - } - } catch (final JSONException jsone) { - throw new TwitterException(jsone); - } - } + try { + url = new URL(json.getString("url")); + } catch (final MalformedURLException ignore) { + } - /* For serialization purposes only. */ - /* package */MediaEntityJSONImpl() { + if (!json.isNull("expanded_url")) { + try { + expandedURL = new URL(json.getString("expanded_url")); + } catch (final MalformedURLException ignore) { + } + } + if (!json.isNull("media_url")) { + try { + mediaURL = new URL(json.getString("media_url")); + } catch (final MalformedURLException ignore) { + } + } + if (!json.isNull("media_url_https")) { + try { + mediaURLHttps = new URL(json.getString("media_url_https")); + } catch (final MalformedURLException ignore) { + } + } + if (!json.isNull("display_url")) { + displayURL = json.getString("display_url"); + } + if (!json.isNull("video_info")) { + videoInfo = new VideoInfoJSONImpl(json.getJSONObject("video_info")); + } + final JSONObject sizes = json.getJSONObject("sizes"); + this.sizes = new HashMap(4); + // thumbworkarounding API side issue + addMediaEntitySizeIfNotNull(this.sizes, sizes, MediaEntity.Size.LARGE, "large"); + addMediaEntitySizeIfNotNull(this.sizes, sizes, MediaEntity.Size.MEDIUM, "medium"); + addMediaEntitySizeIfNotNull(this.sizes, sizes, MediaEntity.Size.SMALL, "small"); + addMediaEntitySizeIfNotNull(this.sizes, sizes, MediaEntity.Size.THUMB, "thumb"); + if (!json.isNull("type")) { + type = Type.parse(json.getString("type")); + } + } catch (final JSONException jsone) { + throw new TwitterException(jsone); + } + } - } + /* For serialization purposes only. */ + /* package */MediaEntityJSONImpl() { - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (!(o instanceof MediaEntityJSONImpl)) return false; + } - final MediaEntityJSONImpl that = (MediaEntityJSONImpl) o; + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof MediaEntityJSONImpl)) return false; - if (id != that.id) return false; + final MediaEntityJSONImpl that = (MediaEntityJSONImpl) o; - return true; - } + if (id != that.id) return false; - /** - * {@inheritDoc} - */ - @Override - public String getDisplayURL() { - return displayURL; - } + return true; + } - /** - * {@inheritDoc} - */ - @Override - public int getEnd() { - return end; - } + /** + * {@inheritDoc} + */ + @Override + public String getDisplayURL() { + return displayURL; + } - /** - * {@inheritDoc} - */ - @Override - public URL getExpandedURL() { - return expandedURL; - } + /** + * {@inheritDoc} + */ + @Override + public int getEnd() { + return end; + } - /** - * {@inheritDoc} - */ - @Override - public long getId() { - return id; - } + /** + * {@inheritDoc} + */ + @Override + public URL getExpandedURL() { + return expandedURL; + } - /** - * {@inheritDoc} - */ - @Override - public URL getMediaURL() { - return mediaURL; - } + /** + * {@inheritDoc} + */ + @Override + public long getId() { + return id; + } - /** - * {@inheritDoc} - */ - @Override - public URL getMediaURLHttps() { - return mediaURLHttps; - } + /** + * {@inheritDoc} + */ + @Override + public URL getMediaURL() { + return mediaURL; + } - @Override - public Map getSizes() { - return sizes; - } + /** + * {@inheritDoc} + */ + @Override + public URL getMediaURLHttps() { + return mediaURLHttps; + } - /** - * {@inheritDoc} - */ - @Override - public int getStart() { - return start; - } + @Override + public Map getSizes() { + return sizes; + } - /** - * {@inheritDoc} - */ - @Override - public String getType() { - return type; - } + /** + * {@inheritDoc} + */ + @Override + public int getStart() { + return start; + } - /** - * {@inheritDoc} - */ - @Override - public URL getURL() { - return url; - } + /** + * {@inheritDoc} + */ + @Override + public Type getType() { + return type; + } - @Override - public int hashCode() { - return (int) (id ^ id >>> 32); - } + /** + * {@inheritDoc} + */ + @Override + public URL getURL() { + return url; + } - @Override - public String toString() { - return "MediaEntityJSONImpl{" + "id=" + id + ", start=" + start + ", end=" + end + ", url=" + url - + ", mediaURL=" + mediaURL + ", mediaURLHttps=" + mediaURLHttps + ", expandedURL=" + expandedURL - + ", displayURL='" + displayURL + '\'' + ", sizes=" + sizes + ", type=" + type + '}'; - } + @Override + public int hashCode() { + return (int) (id ^ id >>> 32); + } - private void addMediaEntitySizeIfNotNull(final Map sizes, final JSONObject sizes_json, - final Integer size, final String key) throws JSONException { - final JSONObject size_json = sizes_json.optJSONObject(key); - if (size_json != null) { - sizes.put(size, new Size(size_json)); - } - } + @Override + public String toString() { + return "MediaEntityJSONImpl{" + "id=" + id + ", start=" + start + ", end=" + end + ", url=" + url + + ", mediaURL=" + mediaURL + ", mediaURLHttps=" + mediaURLHttps + ", expandedURL=" + expandedURL + + ", displayURL='" + displayURL + '\'' + ", sizes=" + sizes + ", type=" + type + '}'; + } - static class Size implements MediaEntity.Size { + private void addMediaEntitySizeIfNotNull(final Map sizes, final JSONObject sizes_json, + final Integer size, final String key) throws JSONException { + final JSONObject size_json = sizes_json.optJSONObject(key); + if (size_json != null) { + sizes.put(size, new Size(size_json)); + } + } - /** - * - */ - private static final long serialVersionUID = 5638836742331957957L; - int width; - int height; - int resize; + static class Size implements MediaEntity.Size { - Size(final JSONObject json) throws JSONException { - width = json.getInt("w"); - height = json.getInt("h"); - resize = "fit".equals(json.getString("resize")) ? MediaEntity.Size.FIT : MediaEntity.Size.CROP; - } + /** + * + */ + private static final long serialVersionUID = 5638836742331957957L; + int width; + int height; + int resize; - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (!(o instanceof Size)) return false; + Size(final JSONObject json) throws JSONException { + width = json.getInt("w"); + height = json.getInt("h"); + resize = "fit".equals(json.getString("resize")) ? MediaEntity.Size.FIT : MediaEntity.Size.CROP; + } - final Size size = (Size) o; + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof Size)) return false; - if (height != size.height) return false; - if (resize != size.resize) return false; - if (width != size.width) return false; + final Size size = (Size) o; - return true; - } + if (height != size.height) return false; + if (resize != size.resize) return false; + if (width != size.width) return false; - @Override - public int getHeight() { - return height; - } + return true; + } - @Override - public int getResize() { - return resize; - } + @Override + public int getHeight() { + return height; + } - @Override - public int getWidth() { - return width; - } + @Override + public int getResize() { + return resize; + } - @Override - public int hashCode() { - int result = width; - result = 31 * result + height; - result = 31 * result + resize; - return result; - } + @Override + public int getWidth() { + return width; + } - @Override - public String toString() { - return "Size{" + "width=" + width + ", height=" + height + ", resize=" + resize + '}'; - } - } + @Override + public int hashCode() { + int result = width; + result = 31 * result + height; + result = 31 * result + resize; + return result; + } + + @Override + public String toString() { + return "Size{" + "width=" + width + ", height=" + height + ", resize=" + resize + '}'; + } + } + + private static class VideoInfoJSONImpl implements VideoInfo { + + private final VariantJSONImpl[] variants; + private final long[] aspectRatio; + private final long duration; + + VideoInfoJSONImpl(JSONObject json) throws JSONException { + variants = VariantJSONImpl.fromJSONArray(json.getJSONArray("variants")); + final JSONArray aspectRatioJson = json.getJSONArray("aspect_ratio"); + aspectRatio = new long[]{aspectRatioJson.getLong(0), aspectRatioJson.getLong(1)}; + duration = json.getLong("duration_millis"); + } + + @Override + public Variant[] getVariants() { + return variants; + } + + @Override + public long[] getAspectRatio() { + return aspectRatio; + } + + @Override + public String toString() { + return "VideoInfoJSONImpl{" + + "variants=" + Arrays.toString(variants) + + ", aspectRatio=" + Arrays.toString(aspectRatio) + + ", duration=" + duration + + '}'; + } + + @Override + public long getDuration() { + return duration; + } + + private static class VariantJSONImpl implements Variant { + private final String contentType; + private final String url; + private final long bitrate; + + @Override + public String toString() { + return "VariantJSONImpl{" + + "contentType='" + contentType + '\'' + + ", url='" + url + '\'' + + ", bitrate=" + bitrate + + '}'; + } + + public VariantJSONImpl(JSONObject json) throws JSONException { + contentType = json.getString("content_type"); + url = json.getString("url"); + bitrate = json.optLong("bitrate", -1); + } + + public static VariantJSONImpl[] fromJSONArray(JSONArray json) throws JSONException { + final VariantJSONImpl[] variant = new VariantJSONImpl[json.length()]; + for (int i = 0, j = variant.length; i < j; i++) { + variant[i] = new VariantJSONImpl(json.getJSONObject(i)); + } + return variant; + } + + @Override + public String getContentType() { + return contentType; + } + + @Override + public String getUrl() { + return url; + } + + @Override + public long getBitrate() { + return bitrate; + } + } + } } diff --git a/twidere.donate.nyanwp.wear/build.gradle b/twidere.donate.nyanwp.wear/build.gradle index 98b33df96..7f551661b 100644 --- a/twidere.donate.nyanwp.wear/build.gradle +++ b/twidere.donate.nyanwp.wear/build.gradle @@ -25,7 +25,7 @@ android { defaultConfig { applicationId "org.mariotaku.twidere.donate.nyanwp" minSdkVersion 20 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } diff --git a/twidere.donate.nyanwp/build.gradle b/twidere.donate.nyanwp/build.gradle index 99221769c..4d4751f08 100644 --- a/twidere.donate.nyanwp/build.gradle +++ b/twidere.donate.nyanwp/build.gradle @@ -25,7 +25,7 @@ android { defaultConfig { applicationId "org.mariotaku.twidere.donate.nyanwp" minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 3 versionName "1.2" } diff --git a/twidere.extension.push.xiaomi/build.gradle b/twidere.extension.push.xiaomi/build.gradle index 2ea871117..9a671a028 100644 --- a/twidere.extension.push.xiaomi/build.gradle +++ b/twidere.extension.push.xiaomi/build.gradle @@ -24,7 +24,7 @@ android { defaultConfig { applicationId "org.mariotaku.twidere.extension.push.xiaomi" minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 2 versionName "1.0" } diff --git a/twidere.extension.streaming/build.gradle b/twidere.extension.streaming/build.gradle index ba4d8ff8c..3108a086f 100644 --- a/twidere.extension.streaming/build.gradle +++ b/twidere.extension.streaming/build.gradle @@ -25,7 +25,7 @@ android { defaultConfig { applicationId "org.mariotaku.twidere.extension.streaming" minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 13 versionName "1.10 (0.3.0-dev)" } diff --git a/twidere.extension.twitlonger/build.gradle b/twidere.extension.twitlonger/build.gradle index 09cb3e9c4..8caa35224 100644 --- a/twidere.extension.twitlonger/build.gradle +++ b/twidere.extension.twitlonger/build.gradle @@ -25,7 +25,7 @@ android { defaultConfig { applicationId "org.mariotaku.extension.twitlonger" minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 6 versionName "1.5" } diff --git a/twidere.library.extension/build.gradle b/twidere.library.extension/build.gradle index 877deed79..cf5704e4a 100644 --- a/twidere.library.extension/build.gradle +++ b/twidere.library.extension/build.gradle @@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle') android { defaultConfig { minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } diff --git a/twidere.wear/build.gradle b/twidere.wear/build.gradle index 6d2eed824..8718fdc8d 100644 --- a/twidere.wear/build.gradle +++ b/twidere.wear/build.gradle @@ -26,7 +26,7 @@ android { defaultConfig { applicationId "org.mariotaku.twidere" minSdkVersion 20 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } diff --git a/twidere/build.gradle b/twidere/build.gradle index 04450e092..c9a0f0828 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -1,7 +1,6 @@ import java.text.SimpleDateFormat apply plugin: 'com.android.application' -apply plugin: 'aar-link-sources' apply from: rootProject.file('global.gradle') apply from: rootProject.file('signing.gradle') @@ -63,7 +62,6 @@ dependencies { compile 'com.android.support:recyclerview-v7:22.0.0' compile 'com.sothree.slidinguppanel:library:3.0.0' compile 'com.twitter:twitter-text:1.11.1' - aarLinkSources 'com.twitter:twitter-text:1.11.1:sources@jar' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3' compile 'com.google.android.apps.dashclock:dashclock-api:2.0.0' compile 'com.squareup:otto:1.3.6' @@ -74,16 +72,15 @@ dependencies { compile 'com.pnikosis:materialish-progress:1.4' compile 'com.squareup.okhttp:okhttp:2.3.0' compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.2' - aarLinkSources 'com.squareup.okhttp:okhttp:2.2.0:sources@jar' + compile 'com.github.mariotaku:MessageBubbleView:1.0' + compile 'com.github.mariotaku:DragSortListView:0.6.1' + compile 'com.github.mariotaku:SlidingMenu:1.3' googleCompile 'com.google.android.gms:play-services-maps:7.0.0' googleCompile 'com.google.maps.android:android-maps-utils:0.3.4' fdroidCompile 'org.osmdroid:osmdroid-android:4.3' fdroidCompile 'org.slf4j:slf4j-simple:1.7.10' compile project(':twidere.component.common') compile project(':twidere.component.nyan') - compile project(':SlidingMenu') - compile project(':DragSortListView') - compile project(':MessageBubbleView') compile project(':ColorPicker') compile fileTree(dir: 'libs/main', include: ['*.jar']) googleCompile fileTree(dir: 'libs/google', include: ['*.jar']) diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java index 424b4bdc6..f5da1a9db 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java @@ -105,7 +105,7 @@ import org.mariotaku.twidere.service.BackgroundOperationService; import org.mariotaku.twidere.task.TwidereAsyncTask; import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.ContentValuesCreator; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.MathUtils; import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.SharedPreferencesWrapper; @@ -114,7 +114,6 @@ import org.mariotaku.twidere.util.TwidereArrayUtils; import org.mariotaku.twidere.util.TwidereValidator; import org.mariotaku.twidere.util.UserColorNameUtils; import org.mariotaku.twidere.util.Utils; -import org.mariotaku.twidere.util.accessor.ViewAccessor; import org.mariotaku.twidere.view.ActionIconView; import org.mariotaku.twidere.view.BadgeView; import org.mariotaku.twidere.view.ShapedImageView; @@ -190,7 +189,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements TextWatch private ShapedImageView mProfileImageView; private BadgeView mCountView; private View mAccountSelectorButton; - private ImageLoaderWrapper mImageLoader; + private MediaLoaderWrapper mImageLoader; private View mLocationContainer; private ActionIconView mLocationIcon; private TextView mLocationText; @@ -1202,7 +1201,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements TextWatch public void showAccount(AccountIconsAdapter adapter, ParcelableAccount account, boolean isSelected) { itemView.setAlpha(isSelected ? 1 : 0.33f); - final ImageLoaderWrapper loader = adapter.getImageLoader(); + final MediaLoaderWrapper loader = adapter.getImageLoader(); loader.displayProfileImage(iconView, account.profile_image_url); iconView.setBorderColor(account.color); } @@ -1219,7 +1218,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements TextWatch private final ComposeActivity mActivity; private final LayoutInflater mInflater; - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final LongSparseArray mSelection; private ParcelableAccount[] mAccounts; @@ -1231,7 +1230,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements TextWatch mSelection = new LongSparseArray<>(); } - public ImageLoaderWrapper getImageLoader() { + public MediaLoaderWrapper getImageLoader() { return mImageLoader; } @@ -1481,7 +1480,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements TextWatch private static class MediaPreviewAdapter extends DraggableArrayAdapter { - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; public MediaPreviewAdapter(final Context context) { super(context, R.layout.grid_item_media_editor); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/CustomTabEditorActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/CustomTabEditorActivity.java index 95e16f565..37ee3f0c8 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/CustomTabEditorActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/CustomTabEditorActivity.java @@ -53,7 +53,7 @@ import org.mariotaku.twidere.model.CustomTabConfiguration.ExtraConfiguration; import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUserList; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.ThemeUtils; @@ -71,7 +71,7 @@ import static org.mariotaku.twidere.util.UserColorNameUtils.getUserNickname; public class CustomTabEditorActivity extends BaseSupportDialogActivity implements OnClickListener { - private ImageLoaderWrapper mImageLoader; + private MediaLoaderWrapper mImageLoader; private SharedPreferences mPreferences; private AccountsSpinnerAdapter mAccountsAdapter; 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 67c97d902..8d7a3b501 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 @@ -39,6 +39,7 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLayoutChangeListener; import android.view.ViewGroup; +import android.webkit.WebView; import android.widget.ProgressBar; import com.diegocarloslima.byakugallery.lib.TileBitmapDrawable; @@ -48,16 +49,20 @@ import org.apache.commons.lang3.ArrayUtils; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; import org.mariotaku.twidere.adapter.support.SupportFixedFragmentStatePagerAdapter; +import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.fragment.support.BaseSupportFragment; import org.mariotaku.twidere.fragment.support.ViewStatusDialogFragment; import org.mariotaku.twidere.loader.support.TileImageLoader; import org.mariotaku.twidere.loader.support.TileImageLoader.DownloadListener; import org.mariotaku.twidere.loader.support.TileImageLoader.Result; import org.mariotaku.twidere.model.ParcelableMedia; +import org.mariotaku.twidere.model.ParcelableMedia.VideoInfo.Variant; import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.util.SaveImageTask; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.Utils; +import org.mariotaku.twidere.util.VideoLoader; +import org.mariotaku.twidere.util.VideoLoader.VideoLoadingListener; import org.mariotaku.twidere.view.TouchImageView; import org.mariotaku.twidere.view.TouchImageView.ZoomListener; @@ -178,6 +183,106 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement return getIntent().hasExtra(EXTRA_STATUS); } + public static final class VideoPageFragment extends BaseSupportFragment + implements VideoLoadingListener { + + private static final String[] SUPPORTED_VIDEO_TYPES; + + static { + SUPPORTED_VIDEO_TYPES = new String[]{"video/mp4"}; + } + + private WebView mWebView; + private VideoLoader mVideoLoader; + + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_media_page_video, container, false); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mVideoLoader = TwidereApplication.getInstance(getActivity()).getVideoLoader(); + final String url = getBestVideoUrl(getMedia()); + if (url != null) { +// mVideoLoader.loadVideo(url, this); + mWebView.loadUrl(url); + } + } + + private String getBestVideoUrl(ParcelableMedia media) { + if (media == null || media.video_info == null) return null; + for (Variant variant : media.video_info.variants) { + if (ArrayUtils.contains(SUPPORTED_VIDEO_TYPES, variant.content_type)) { + return variant.url; + } + } + return null; + } + + @Override + public void onBaseViewCreated(View view, Bundle savedInstanceState) { + super.onBaseViewCreated(view, savedInstanceState); + mWebView = (WebView) view.findViewById(R.id.web_view); + } + + @Override + public void onVideoLoadingCancelled(String uri, VideoLoadingListener listener) { + + } + + @Override + public void onResume() { + super.onResume(); + mWebView.onResume(); + } + + @Override + public void onDestroyView() { + mWebView.destroy(); + super.onDestroyView(); + } + + @Override + public void onPause() { + mWebView.onPause(); + super.onPause(); + } + + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); +// if (mVideoView != null && mVideoView.isPlaying()) { +// mVideoView.pause(); +// } + } + + @Override + public void onVideoLoadingComplete(String uri, VideoLoadingListener listener, File file) { + mWebView.loadUrl(Uri.fromFile(file).toString()); + } + + @Override + public void onVideoLoadingFailed(String uri, VideoLoadingListener listener, Exception e) { + } + + @Override + public void onVideoLoadingProgressUpdate(String uri, VideoLoadingListener listener, int current, int total) { + + } + + private ParcelableMedia getMedia() { + final Bundle args = getArguments(); + return args.getParcelable(EXTRA_MEDIA); + } + + @Override + public void onVideoLoadingStarted(String uri, VideoLoadingListener listener) { + + } + } + public static final class ImagePageFragment extends BaseSupportFragment implements DownloadListener, LoaderCallbacks, OnLayoutChangeListener, OnClickListener, ZoomListener { @@ -205,11 +310,16 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement mProgressBar.setVisibility(View.VISIBLE); mProgressBar.setIndeterminate(true); invalidateOptionsMenu(); - final ParcelableMedia media = args.getParcelable(EXTRA_MEDIA); + final ParcelableMedia media = getMedia(); final long accountId = args.getLong(EXTRA_ACCOUNT_ID, -1); return new TileImageLoader(getActivity(), this, accountId, Uri.parse(media.media_url)); } + private ParcelableMedia getMedia() { + final Bundle args = getArguments(); + return args.getParcelable(EXTRA_MEDIA); + } + @Override public void onLoadFinished(final Loader loader, final TileImageLoader.Result data) { if (data.hasData()) { @@ -269,7 +379,7 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_media_page, container, false); + return inflater.inflate(R.layout.fragment_media_page_image, container, false); } @Override @@ -347,11 +457,6 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement startActivity(intent); } - private ParcelableMedia getMedia() { - final Bundle args = getArguments(); - return args.getParcelable(EXTRA_MEDIA); - } - @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -464,10 +569,18 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement @Override public Fragment getItem(int position) { + final ParcelableMedia media = mMedia[position]; final Bundle args = new Bundle(); args.putLong(EXTRA_ACCOUNT_ID, mAccountId); - args.putParcelable(EXTRA_MEDIA, mMedia[position]); - return Fragment.instantiate(mActivity, ImagePageFragment.class.getName(), args); + args.putParcelable(EXTRA_MEDIA, media); + switch (media.type) { + case ParcelableMedia.TYPE_VIDEO: { + return Fragment.instantiate(mActivity, VideoPageFragment.class.getName(), args); + } + default: { + return Fragment.instantiate(mActivity, ImagePageFragment.class.getName(), args); + } + } } public void setMedia(long accountId, ParcelableMedia[] media) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/QuickSearchBarActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/QuickSearchBarActivity.java index 21d3baab1..041f62890 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/QuickSearchBarActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/QuickSearchBarActivity.java @@ -68,7 +68,7 @@ import org.mariotaku.twidere.model.ParcelableUser.CachedIndices; import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers; import org.mariotaku.twidere.provider.TwidereDataStore.SavedSearches; import org.mariotaku.twidere.provider.TwidereDataStore.SearchHistory; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.SwipeDismissListViewTouchListener; import org.mariotaku.twidere.util.SwipeDismissListViewTouchListener.DismissCallbacks; @@ -436,7 +436,7 @@ public class QuickSearchBarActivity extends ThemedFragmentActivity implements On public void bindView(SuggestionsAdapter adapter, View view, int position) { final ParcelableUser user = mUser; final Context context = adapter.getContext(); - final ImageLoaderWrapper loader = adapter.getImageLoader(); + final MediaLoaderWrapper loader = adapter.getImageLoader(); final ImageView icon = (ImageView) view.findViewById(android.R.id.icon); final TextView text1 = (TextView) view.findViewById(android.R.id.text1); final TextView text2 = (TextView) view.findViewById(android.R.id.text2); @@ -480,7 +480,7 @@ public class QuickSearchBarActivity extends ThemedFragmentActivity implements On @Override public void bindView(SuggestionsAdapter adapter, View view, int position) { - final ImageLoaderWrapper loader = adapter.getImageLoader(); + final MediaLoaderWrapper loader = adapter.getImageLoader(); final ImageView icon = (ImageView) view.findViewById(android.R.id.icon); final TextView text1 = (TextView) view.findViewById(android.R.id.text1); final TextView text2 = (TextView) view.findViewById(android.R.id.text2); @@ -496,7 +496,7 @@ public class QuickSearchBarActivity extends ThemedFragmentActivity implements On private final Context mContext; private final LayoutInflater mInflater; - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final boolean mNicknameOnly; private List mData; @@ -542,7 +542,7 @@ public class QuickSearchBarActivity extends ThemedFragmentActivity implements On return view; } - public ImageLoaderWrapper getImageLoader() { + public MediaLoaderWrapper getImageLoader() { return mImageLoader; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/UserProfileEditorActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/UserProfileEditorActivity.java index 482203922..d41f15f31 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/UserProfileEditorActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/UserProfileEditorActivity.java @@ -48,7 +48,7 @@ import org.mariotaku.twidere.task.TwidereAsyncTask.Status; import org.mariotaku.twidere.util.AsyncTaskManager; import org.mariotaku.twidere.util.AsyncTwitterWrapper.UpdateProfileBannerImageTask; import org.mariotaku.twidere.util.AsyncTwitterWrapper.UpdateProfileImageTask; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.TwitterWrapper; @@ -79,7 +79,7 @@ public class UserProfileEditorActivity extends BaseActionBarActivity implements private static final int REQUEST_PICK_LINK_COLOR = 3; private static final int REQUEST_PICK_BACKGROUND_COLOR = 4; - private ImageLoaderWrapper mLazyImageLoader; + private MediaLoaderWrapper mLazyImageLoader; private AsyncTaskManager mAsyncTaskManager; private TwidereAsyncTask mTask; diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsActivitiesAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsActivitiesAdapter.java index 358bc1179..daf122b1d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsActivitiesAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsActivitiesAdapter.java @@ -39,7 +39,7 @@ import org.mariotaku.twidere.fragment.support.UserFragment; import org.mariotaku.twidere.model.ParcelableActivity; import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.util.AsyncTwitterWrapper; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ImageLoadingHandler; import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.ThemeUtils; @@ -64,7 +64,7 @@ public abstract class AbsActivitiesAdapter extends Adapter imp private final Context mContext; private final LayoutInflater mInflater; - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final ImageLoadingHandler mLoadingHandler; private final AsyncTwitterWrapper mTwitterWrapper; private final int mCardBackgroundColor; @@ -105,7 +105,7 @@ public abstract class AbsActivitiesAdapter extends Adapter imp public abstract void setData(Data data); @Override - public ImageLoaderWrapper getImageLoader() { + public MediaLoaderWrapper getImageLoader() { return mImageLoader; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java index cae3d7dc2..15c9ea1e9 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java @@ -18,7 +18,7 @@ import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.fragment.support.UserFragment; import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.util.AsyncTwitterWrapper; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ImageLoadingHandler; import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.ThemeUtils; @@ -39,7 +39,7 @@ public abstract class AbsStatusesAdapter extends Adapter implemen private final Context mContext; private final LayoutInflater mInflater; - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final ImageLoadingHandler mLoadingHandler; private final AsyncTwitterWrapper mTwitterWrapper; private final int mCardBackgroundColor; @@ -84,7 +84,7 @@ public abstract class AbsStatusesAdapter extends Adapter implemen } @Override - public final ImageLoaderWrapper getImageLoader() { + public final MediaLoaderWrapper getImageLoader() { return mImageLoader; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/AccountsAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/AccountsAdapter.java index 58d52f3b4..399212afc 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/AccountsAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/AccountsAdapter.java @@ -35,12 +35,12 @@ import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.model.ParcelableAccount.Indices; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.view.holder.AccountViewHolder; public class AccountsAdapter extends SimpleDragSortCursorAdapter implements Constants, IBaseAdapter { - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final SharedPreferences mPreferences; private boolean mDisplayProfileImage; @@ -90,7 +90,7 @@ public class AccountsAdapter extends SimpleDragSortCursorAdapter implements Cons } @Override - public ImageLoaderWrapper getImageLoader() { + public MediaLoaderWrapper getImageLoader() { return mImageLoader; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/AccountsSpinnerAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/AccountsSpinnerAdapter.java index e6160dc50..6d13cbc75 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/AccountsSpinnerAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/AccountsSpinnerAdapter.java @@ -29,13 +29,13 @@ import org.mariotaku.twidere.R; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.fragment.support.DirectMessagesConversationFragment; import org.mariotaku.twidere.model.ParcelableAccount; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import java.util.Collection; public class AccountsSpinnerAdapter extends ArrayAdapter { - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final boolean mDisplayProfileImage; public AccountsSpinnerAdapter(final Context context) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/BaseArrayAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/BaseArrayAdapter.java index f4875f9fc..c0f9fd547 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/BaseArrayAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/BaseArrayAdapter.java @@ -25,7 +25,7 @@ import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import org.mariotaku.twidere.adapter.iface.IBaseAdapter; import org.mariotaku.twidere.app.TwidereApplication; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.OnLinkClickHandler; import org.mariotaku.twidere.util.TwidereLinkify; @@ -43,7 +43,7 @@ public class BaseArrayAdapter extends ArrayAdapter implements IBaseAdapter private boolean mDisplayProfileImage, mNicknameOnly, mDisplayNameFirst, mShowAccountColor; private final SharedPreferences mNicknamePrefs, mColorPrefs; - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; public BaseArrayAdapter(final Context context, final int layoutRes) { this(context, layoutRes, null); @@ -61,7 +61,7 @@ public class BaseArrayAdapter extends ArrayAdapter implements IBaseAdapter } @Override - public ImageLoaderWrapper getImageLoader() { + public MediaLoaderWrapper getImageLoader() { return mImageLoader; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/BaseCursorAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/BaseCursorAdapter.java index 9c2fd89c8..145fe9d51 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/BaseCursorAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/BaseCursorAdapter.java @@ -29,7 +29,7 @@ import android.support.v4.widget.SimpleCursorAdapter; import org.mariotaku.twidere.adapter.iface.IBaseAdapter; import org.mariotaku.twidere.app.TwidereApplication; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.OnLinkClickHandler; import org.mariotaku.twidere.util.TwidereLinkify; @@ -44,7 +44,7 @@ public class BaseCursorAdapter extends SimpleCursorAdapter implements IBaseAdapt private boolean mDisplayProfileImage, mNicknameOnly, mDisplayNameFirst, mShowAccountColor; private final SharedPreferences mNicknamePrefs, mColorPrefs; - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; public BaseCursorAdapter(final Context context, final int layout, final Cursor c, final String[] from, final int[] to) { @@ -64,7 +64,7 @@ public class BaseCursorAdapter extends SimpleCursorAdapter implements IBaseAdapt } @Override - public ImageLoaderWrapper getImageLoader() { + public MediaLoaderWrapper getImageLoader() { return mImageLoader; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/DraftsAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/DraftsAdapter.java index 9705d1358..b24c0ea29 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/DraftsAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/DraftsAdapter.java @@ -32,8 +32,8 @@ import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.DraftItem; import org.mariotaku.twidere.model.ParcelableMediaUpdate; import org.mariotaku.twidere.provider.TwidereDataStore.Drafts; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.TwidereArrayUtils; -import org.mariotaku.twidere.util.ImageLoaderWrapper; import org.mariotaku.twidere.util.ImageLoadingHandler; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.view.holder.DraftViewHolder; @@ -42,7 +42,7 @@ import static org.mariotaku.twidere.util.Utils.getAccountColors; public class DraftsAdapter extends SimpleCursorAdapter { - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final ImageLoadingHandler mImageLoadingHandler; private float mTextSize; diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/MediaPreviewAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/MediaPreviewAdapter.java index 2e9156659..49fece6e0 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/MediaPreviewAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/MediaPreviewAdapter.java @@ -28,14 +28,14 @@ import android.widget.ImageView; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; import org.mariotaku.twidere.app.TwidereApplication; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ImageLoadingHandler; import java.util.Collection; public class MediaPreviewAdapter extends ArrayAdapter implements Constants { - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final SharedPreferences mPreferences; private final ImageLoadingHandler mImageLoadingHandler; diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/MessageConversationAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/MessageConversationAdapter.java index c65c38588..f4fbfe99c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/MessageConversationAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/MessageConversationAdapter.java @@ -36,7 +36,7 @@ import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.ParcelableDirectMessage; import org.mariotaku.twidere.model.ParcelableDirectMessage.CursorIndices; import org.mariotaku.twidere.util.DirectMessageOnLinkClickHandler; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ImageLoadingHandler; import org.mariotaku.twidere.util.MultiSelectManager; import org.mariotaku.twidere.util.ThemeUtils; @@ -59,7 +59,7 @@ public class MessageConversationAdapter extends Adapter private final Context mContext; private final LayoutInflater mInflater; - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final MultiSelectManager mMultiSelectManager; private final ImageLoadingHandler mImageLoadingHandler; @@ -84,7 +84,7 @@ public class MessageConversationAdapter extends Adapter return mContext; } - public ImageLoaderWrapper getImageLoader() { + public MediaLoaderWrapper getImageLoader() { return mImageLoader; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/MessageEntriesAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/MessageEntriesAdapter.java index 3ec9a7647..74cdd14e1 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/MessageEntriesAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/MessageEntriesAdapter.java @@ -34,7 +34,7 @@ import org.mariotaku.twidere.adapter.iface.IContentCardAdapter; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages.ConversationEntries; import org.mariotaku.twidere.util.AsyncTwitterWrapper; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ImageLoadingHandler; import org.mariotaku.twidere.util.MultiSelectManager; import org.mariotaku.twidere.util.SharedPreferencesWrapper; @@ -46,7 +46,7 @@ public class MessageEntriesAdapter extends Adapter implements Consta private final Context mContext; private final LayoutInflater mInflater; - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final MultiSelectManager mMultiSelectManager; private final boolean mNicknameOnly; private boolean mLoadMoreIndicatorEnabled; @@ -98,7 +98,7 @@ public class MessageEntriesAdapter extends Adapter implements Consta } - public ImageLoaderWrapper getImageLoader() { + public MediaLoaderWrapper getImageLoader() { return mImageLoader; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/ParcelableUserListsListAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/ParcelableUserListsListAdapter.java index 92cdfd6b3..070d9157f 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/ParcelableUserListsListAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/ParcelableUserListsListAdapter.java @@ -30,7 +30,7 @@ import org.mariotaku.twidere.R; import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.ParcelableUserList; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.MultiSelectManager; import org.mariotaku.twidere.util.UserColorNameUtils; import org.mariotaku.twidere.util.Utils; @@ -47,7 +47,7 @@ public class ParcelableUserListsListAdapter extends BaseArrayAdapter implements IBaseCardAdapter { - private final ImageLoaderWrapper mProfileImageLoader; + private final MediaLoaderWrapper mProfileImageLoader; private final MultiSelectManager mMultiSelectManager; private final Context mContext; diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/SimpleParcelableUserListsAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/SimpleParcelableUserListsAdapter.java index fc05a17a0..ce21eb8fa 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/SimpleParcelableUserListsAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/SimpleParcelableUserListsAdapter.java @@ -27,7 +27,7 @@ import org.mariotaku.twidere.R; import org.mariotaku.twidere.adapter.iface.IBaseAdapter; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.ParcelableUserList; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.UserColorNameUtils; import org.mariotaku.twidere.view.holder.TwoLineWithIconViewHolder; @@ -39,7 +39,7 @@ import static org.mariotaku.twidere.util.UserColorNameUtils.getDisplayName; public class SimpleParcelableUserListsAdapter extends BaseArrayAdapter implements IBaseAdapter { private final Context mContext; - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; public SimpleParcelableUserListsAdapter(final Context context) { super(context, R.layout.list_item_two_line); diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/SimpleParcelableUsersAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/SimpleParcelableUsersAdapter.java index 5bfb17aa4..6d4f236ee 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/SimpleParcelableUsersAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/SimpleParcelableUsersAdapter.java @@ -28,7 +28,7 @@ import org.mariotaku.twidere.R; import org.mariotaku.twidere.adapter.iface.IBaseAdapter; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.ParcelableUser; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.view.holder.TwoLineWithIconViewHolder; import java.util.List; @@ -39,7 +39,7 @@ import static org.mariotaku.twidere.util.Utils.getUserTypeIconRes; public class SimpleParcelableUsersAdapter extends BaseArrayAdapter implements IBaseAdapter { - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final Context mContext; public SimpleParcelableUsersAdapter(final Context context) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/UserHashtagAutoCompleteAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/UserHashtagAutoCompleteAdapter.java index a95df2700..8dadcab37 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/UserHashtagAutoCompleteAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/UserHashtagAutoCompleteAdapter.java @@ -42,7 +42,7 @@ import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.provider.TwidereDataStore.CachedHashtags; import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers; import org.mariotaku.twidere.provider.TwidereDataStore.CachedValues; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.Utils; @@ -55,7 +55,7 @@ public class UserHashtagAutoCompleteAdapter extends SimpleCursorAdapter implemen private final ContentResolver mResolver; private final SQLiteDatabase mDatabase; - private final ImageLoaderWrapper mProfileImageLoader; + private final MediaLoaderWrapper mProfileImageLoader; private final SharedPreferences mPreferences, mUserNicknamePreferences; private final EditText mEditText; diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IBaseAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IBaseAdapter.java index 7988b24da..a692b0931 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IBaseAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IBaseAdapter.java @@ -22,11 +22,11 @@ package org.mariotaku.twidere.adapter.iface; import android.widget.ListAdapter; import org.mariotaku.twidere.Constants; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; public interface IBaseAdapter extends Constants, ListAdapter { - public ImageLoaderWrapper getImageLoader(); + public MediaLoaderWrapper getImageLoader(); public int getLinkHighlightOption(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IContentCardAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IContentCardAdapter.java index 549579879..9fbb7ad79 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IContentCardAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IContentCardAdapter.java @@ -22,7 +22,7 @@ package org.mariotaku.twidere.adapter.iface; import android.content.Context; import org.mariotaku.twidere.util.AsyncTwitterWrapper; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ImageLoadingHandler; import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle; @@ -30,7 +30,7 @@ import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle; * Created by mariotaku on 15/1/3. */ public interface IContentCardAdapter extends IGapSupportedAdapter, ContentCardClickListener { - ImageLoaderWrapper getImageLoader(); + MediaLoaderWrapper getImageLoader(); Context getContext(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java index 60e9c98f0..a2877eca0 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java +++ b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java @@ -46,12 +46,13 @@ import org.mariotaku.twidere.activity.MainHondaJOJOActivity; import org.mariotaku.twidere.service.RefreshService; import org.mariotaku.twidere.util.AsyncTaskManager; import org.mariotaku.twidere.util.AsyncTwitterWrapper; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.MessagesManager; import org.mariotaku.twidere.util.MultiSelectManager; import org.mariotaku.twidere.util.StrictModeUtils; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.Utils; +import org.mariotaku.twidere.util.VideoLoader; import org.mariotaku.twidere.util.content.TwidereSQLiteOpenHelper; import org.mariotaku.twidere.util.imageloader.TwidereImageDownloader; import org.mariotaku.twidere.util.imageloader.URLFileNameGenerator; @@ -74,7 +75,7 @@ public class TwidereApplication extends MultiDexApplication implements Constants OnSharedPreferenceChangeListener { private Handler mHandler; - private ImageLoaderWrapper mImageLoaderWrapper; + private MediaLoaderWrapper mMediaLoaderWrapper; private ImageLoader mImageLoader; private AsyncTaskManager mAsyncTaskManager; private SharedPreferences mPreferences; @@ -87,6 +88,7 @@ public class TwidereApplication extends MultiDexApplication implements Constants private HostAddressResolver mResolver; private SQLiteDatabase mDatabase; private Bus mMessageBus; + private VideoLoader mVideoLoader; public AsyncTaskManager getAsyncTaskManager() { if (mAsyncTaskManager != null) return mAsyncTaskManager; @@ -137,9 +139,15 @@ public class TwidereApplication extends MultiDexApplication implements Constants return mImageLoader = loader; } - public ImageLoaderWrapper getImageLoaderWrapper() { - if (mImageLoaderWrapper != null) return mImageLoaderWrapper; - return mImageLoaderWrapper = new ImageLoaderWrapper(getImageLoader()); + public VideoLoader getVideoLoader() { + if (mVideoLoader != null) return mVideoLoader; + final VideoLoader loader = new VideoLoader(this); + return mVideoLoader = loader; + } + + public MediaLoaderWrapper getImageLoaderWrapper() { + if (mMediaLoaderWrapper != null) return mMediaLoaderWrapper; + return mMediaLoaderWrapper = new MediaLoaderWrapper(getImageLoader(), getVideoLoader()); } public static TwidereApplication getInstance(final Context context) { @@ -215,8 +223,8 @@ public class TwidereApplication extends MultiDexApplication implements Constants @Override public void onLowMemory() { - if (mImageLoaderWrapper != null) { - mImageLoaderWrapper.clearMemoryCache(); + if (mMediaLoaderWrapper != null) { + mMediaLoaderWrapper.clearMemoryCache(); } super.onLowMemory(); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AccountsDashboardFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AccountsDashboardFragment.java index 987c4181a..84c05fbde 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AccountsDashboardFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AccountsDashboardFragment.java @@ -91,7 +91,7 @@ import org.mariotaku.twidere.menu.SupportAccountActionProvider; import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; import org.mariotaku.twidere.util.CompareUtils; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.TransitionUtils; import org.mariotaku.twidere.util.Utils; @@ -133,7 +133,7 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement private View mAccountProfileContainer; private Context mThemedContext; - private ImageLoaderWrapper mImageLoader; + private MediaLoaderWrapper mImageLoader; private SupportAccountActionProvider mAccountActionProvider; private boolean mSwitchAccountAnimationPlaying; @@ -600,7 +600,7 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement private static class AccountSelectorAdapter extends Adapter { private final LayoutInflater mInflater; - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final AccountsDashboardFragment mFragment; private ParcelableAccount[] mAccounts; private ParcelableAccount[] mInternalAccounts; diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesConversationFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesConversationFragment.java index 22a6e4b5a..4a7496cb7 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesConversationFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesConversationFragment.java @@ -86,7 +86,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages; import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages.Conversation; import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.ClipboardUtils; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.TwidereValidator; import org.mariotaku.twidere.util.UserColorNameUtils; @@ -145,7 +145,7 @@ public class DirectMessagesConversationFragment extends BaseSupportFragment impl private ParcelableAccount mAccount; private ParcelableUser mRecipient; - private ImageLoaderWrapper mImageLoader; + private MediaLoaderWrapper mImageLoader; private IColorLabelView mProfileImageContainer; private LoaderCallbacks> mSearchLoadersCallback = new LoaderCallbacks>() { diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/RetweetQuoteDialogFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/RetweetQuoteDialogFragment.java index eb6b580da..a89028157 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/RetweetQuoteDialogFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/RetweetQuoteDialogFragment.java @@ -35,7 +35,7 @@ import org.mariotaku.twidere.R; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.util.AsyncTwitterWrapper; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ImageLoadingHandler; import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.ThemeUtils; @@ -83,7 +83,7 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem final Context context = builder.getContext(); final SharedPreferencesWrapper preferences = SharedPreferencesWrapper.getInstance(context, SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); - final ImageLoaderWrapper loader = TwidereApplication.getInstance(context).getImageLoaderWrapper(); + final MediaLoaderWrapper loader = TwidereApplication.getInstance(context).getImageLoaderWrapper(); final ImageLoadingHandler handler = new ImageLoadingHandler(R.id.media_preview_progress); final AsyncTwitterWrapper twitter = getTwitterWrapper(); final LayoutInflater inflater = LayoutInflater.from(context); 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 78dbea824..893681657 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 @@ -87,7 +87,7 @@ import org.mariotaku.twidere.text.method.StatusContentMovementMethod; import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.ClipboardUtils; import org.mariotaku.twidere.util.CompareUtils; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ImageLoadingHandler; import org.mariotaku.twidere.util.LinkCreator; import org.mariotaku.twidere.util.StatusLinkClickHandler; @@ -453,7 +453,7 @@ public class StatusFragment extends BaseSupportFragment private final Context mContext; private final StatusFragment mFragment; private final LayoutInflater mInflater; - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final ImageLoadingHandler mImageLoadingHandler; private final boolean mNameFirst, mNicknameOnly; @@ -506,7 +506,7 @@ public class StatusFragment extends BaseSupportFragment return mFragment; } - public ImageLoaderWrapper getImageLoader() { + public MediaLoaderWrapper getImageLoader() { return mImageLoader; } @@ -1110,7 +1110,7 @@ public class StatusFragment extends BaseSupportFragment final StatusFragment fragment = adapter.getFragment(); final Context context = adapter.getContext(); final Resources resources = context.getResources(); - final ImageLoaderWrapper loader = adapter.getImageLoader(); + final MediaLoaderWrapper loader = adapter.getImageLoader(); final boolean nameFirst = adapter.isNameFirst(); final boolean nicknameOnly = adapter.isNicknameOnly(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusTranslateDialogFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusTranslateDialogFragment.java index 5ef311a13..df5728797 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusTranslateDialogFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusTranslateDialogFragment.java @@ -41,7 +41,7 @@ import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.SingleResponse; import org.mariotaku.twidere.util.AsyncTwitterWrapper; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ImageLoadingHandler; import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.Utils; @@ -128,7 +128,7 @@ public class StatusTranslateDialogFragment extends BaseSupportDialogFragment imp if (status == null || translated == null) return; final FragmentActivity activity = getActivity(); final TwidereApplication application = getApplication(); - final ImageLoaderWrapper loader = application.getImageLoaderWrapper(); + final MediaLoaderWrapper loader = application.getImageLoaderWrapper(); final ImageLoadingHandler handler = new ImageLoadingHandler(R.id.media_preview_progress); final AsyncTwitterWrapper twitter = getTwitterWrapper(); final SharedPreferencesWrapper preferences = SharedPreferencesWrapper.getInstance(activity, diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java index 974a0a80c..f9b4c08de 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java @@ -107,7 +107,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Filters; import org.mariotaku.twidere.text.TextAlphaSpan; import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.ContentValuesCreator; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.LinkCreator; import org.mariotaku.twidere.util.MathUtils; import org.mariotaku.twidere.util.ParseUtils; @@ -174,7 +174,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener private static final int LOADER_ID_USER = 1; private static final int LOADER_ID_FRIENDSHIP = 2; - private ImageLoaderWrapper mProfileImageLoader; + private MediaLoaderWrapper mProfileImageLoader; private ShapedImageView mProfileImageView; private ImageView mProfileTypeView; diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java index 99f185fc3..03a6d64f4 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java @@ -70,7 +70,7 @@ import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUserList; import org.mariotaku.twidere.model.SingleResponse; import org.mariotaku.twidere.util.AsyncTwitterWrapper; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.LinkCreator; import org.mariotaku.twidere.util.OnLinkClickHandler; import org.mariotaku.twidere.util.ParseUtils; @@ -99,7 +99,7 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList LoaderCallbacks>, DrawerCallback, SystemWindowsInsetsCallback, SupportFragmentCallback { - private ImageLoaderWrapper mProfileImageLoader; + private MediaLoaderWrapper mProfileImageLoader; private AsyncTwitterWrapper mTwitterWrapper; private ImageView mProfileImageView; diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserMediaTimelineFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserMediaTimelineFragment.java index 7aa402cd6..a553cec0e 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserMediaTimelineFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserMediaTimelineFragment.java @@ -22,7 +22,7 @@ import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.loader.support.MediaTimelineLoader; import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableStatus; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ImageLoadingHandler; import org.mariotaku.twidere.util.SimpleDrawerCallback; import org.mariotaku.twidere.view.HeaderDrawerLayout.DrawerCallback; @@ -161,7 +161,7 @@ public class UserMediaTimelineFragment extends BaseSupportFragment private static class MediaTimelineAdapter extends Adapter { private final LayoutInflater mInflater; - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final ImageLoadingHandler mLoadingHandler; private List mData; @@ -208,7 +208,7 @@ public class UserMediaTimelineFragment extends BaseSupportFragment mediaTextView = (TextView) itemView.findViewById(R.id.media_text); } - public void setMedia(ImageLoaderWrapper loader, ImageLoadingHandler loadingHandler, ParcelableStatus status) { + public void setMedia(MediaLoaderWrapper loader, ImageLoadingHandler loadingHandler, ParcelableStatus status) { final ParcelableMedia[] media = status.media; if (media == null || media.length < 1) return; final ParcelableMedia firstMedia = media[0]; diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ViewStatusDialogFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ViewStatusDialogFragment.java index 615519ee9..4f8419a75 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ViewStatusDialogFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ViewStatusDialogFragment.java @@ -31,7 +31,7 @@ import org.mariotaku.twidere.R; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.util.AsyncTwitterWrapper; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ImageLoadingHandler; import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.Utils; @@ -71,7 +71,7 @@ public class ViewStatusDialogFragment extends BaseSupportDialogFragment { } final TwidereApplication application = getApplication(); final FragmentActivity activity = getActivity(); - final ImageLoaderWrapper loader = application.getImageLoaderWrapper(); + final MediaLoaderWrapper loader = application.getImageLoaderWrapper(); final ImageLoadingHandler handler = new ImageLoadingHandler(R.id.media_preview_progress); final AsyncTwitterWrapper twitter = getTwitterWrapper(); final SharedPreferencesWrapper preferences = SharedPreferencesWrapper.getInstance(activity, diff --git a/twidere/src/main/java/org/mariotaku/twidere/popup/AccountSelectorPopupWindow.java b/twidere/src/main/java/org/mariotaku/twidere/popup/AccountSelectorPopupWindow.java index b827bfa15..8e5f003e8 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/popup/AccountSelectorPopupWindow.java +++ b/twidere/src/main/java/org/mariotaku/twidere/popup/AccountSelectorPopupWindow.java @@ -40,7 +40,7 @@ import org.mariotaku.twidere.R; import org.mariotaku.twidere.adapter.ArrayAdapter; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.ParcelableAccount; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemedViewFactory; import org.mariotaku.twidere.util.Utils; @@ -146,7 +146,7 @@ public class AccountSelectorPopupWindow { private static class AccountsGridAdapter extends ArrayAdapter { - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; public AccountsGridAdapter(Context context) { super(context, R.layout.grid_item_selector_account); diff --git a/twidere/src/main/java/org/mariotaku/twidere/preference/AccountsListPreference.java b/twidere/src/main/java/org/mariotaku/twidere/preference/AccountsListPreference.java index 3fe842434..9c65e50b3 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/preference/AccountsListPreference.java +++ b/twidere/src/main/java/org/mariotaku/twidere/preference/AccountsListPreference.java @@ -47,7 +47,7 @@ import org.mariotaku.twidere.R; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.task.TwidereAsyncTask; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.Utils; import java.util.List; @@ -100,7 +100,7 @@ public abstract class AccountsListPreference extends PreferenceCategory implemen private final ParcelableAccount mAccount; private final SharedPreferences mSwitchPreference; - private final ImageLoaderWrapper mImageLoader; + private final MediaLoaderWrapper mImageLoader; private final String mSwitchKey; private final boolean mSwitchDefault; diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ImageLoaderWrapper.java b/twidere/src/main/java/org/mariotaku/twidere/util/MediaLoaderWrapper.java similarity index 96% rename from twidere/src/main/java/org/mariotaku/twidere/util/ImageLoaderWrapper.java rename to twidere/src/main/java/org/mariotaku/twidere/util/MediaLoaderWrapper.java index 65cd27e2f..43cc36263 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/ImageLoaderWrapper.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/MediaLoaderWrapper.java @@ -36,16 +36,18 @@ import org.mariotaku.twidere.util.imageloader.OvalBitmapDisplayer; import static org.mariotaku.twidere.util.Utils.getBestBannerUrl; -public class ImageLoaderWrapper implements Constants { +public class MediaLoaderWrapper implements Constants { private final ImageLoader mImageLoader; private final DisplayImageOptions mProfileImageDisplayOptions; private final DisplayImageOptions mDashboardProfileImageDisplayOptions; private final DisplayImageOptions mOvalProfileImageDisplayOptions; private final DisplayImageOptions mImageDisplayOptions, mBannerDisplayOptions; + private final VideoLoader mVideoLoader; - public ImageLoaderWrapper(final ImageLoader loader) { - mImageLoader = loader; + public MediaLoaderWrapper(final ImageLoader imageLoader, VideoLoader videoLoader) { + mImageLoader = imageLoader; + mVideoLoader = videoLoader; final DisplayImageOptions.Builder profileOptsBuilder = new DisplayImageOptions.Builder(); profileOptsBuilder.cacheInMemory(true); profileOptsBuilder.cacheOnDisk(true); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java index df764e7a4..c8a765d84 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java @@ -471,7 +471,7 @@ public final class Utils implements Constants, TwitterConstants { } } - public static void addToLinearLayout(final LinearLayout container, final ImageLoaderWrapper loader, + public static void addToLinearLayout(final LinearLayout container, final MediaLoaderWrapper loader, final List mediaList, final long accountId, final int maxColumnCount, final OnMediaClickListener mediaClickListener) { if (container.getOrientation() != LinearLayout.VERTICAL) @@ -510,7 +510,7 @@ public final class Utils implements Constants, TwitterConstants { } } - public static void addToLinearLayout(final LinearLayout container, final ImageLoaderWrapper loader, + public static void addToLinearLayout(final LinearLayout container, final MediaLoaderWrapper loader, final ParcelableMedia[] mediaArray, final long accountId, final int maxColumnCount, final OnMediaClickListener listener) { addToLinearLayout(container, loader, Arrays.asList(mediaArray), accountId, maxColumnCount, diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/VideoLoader.java b/twidere/src/main/java/org/mariotaku/twidere/util/VideoLoader.java new file mode 100644 index 000000000..70cc47c94 --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/util/VideoLoader.java @@ -0,0 +1,171 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.util; + +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +import com.nostra13.universalimageloader.cache.disc.DiskCache; +import com.nostra13.universalimageloader.core.download.ImageDownloader; +import com.nostra13.universalimageloader.utils.IoUtils; +import com.squareup.otto.Bus; + +import org.mariotaku.twidere.app.TwidereApplication; +import org.mariotaku.twidere.model.SingleResponse; +import org.mariotaku.twidere.task.ManagedAsyncTask; +import org.mariotaku.twidere.util.message.VideoLoadFinishedEvent; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + + +/** + * Created by mariotaku on 14-8-13. + */ +public class VideoLoader { + + private final Context mContext; + private final DiskCache mDiskCache; + private final ImageDownloader mImageDownloader; + private final AsyncTaskManager mTaskManager; + private final Bus mBus; + + public VideoLoader(Context context) { + final TwidereApplication app = TwidereApplication.getInstance(context); + mContext = context; + mDiskCache = app.getDiskCache(); + mImageDownloader = app.getImageDownloader(); + mTaskManager = app.getAsyncTaskManager(); + mBus = app.getMessageBus(); + } + + public File getCachedVideoFile(final String url, boolean loadIfNotFound) { + if (url == null) return null; + final File cache = mDiskCache.get(url); + if (cache.exists()) + return cache; + else if (loadIfNotFound) { + loadVideo(url, null); + } + return null; + } + + + public int loadVideo(String uri, VideoLoadingListener listener) { + if (mTaskManager.hasRunningTasksForTag(uri)) { + return 0; + } + return mTaskManager.add(new PreLoadVideoTask(mContext, this, listener, uri), true); + } + + private void notifyTaskFinish(String uri, boolean succeeded) { + mBus.post(new VideoLoadFinishedEvent()); + } + + public interface VideoLoadingListener { + + void onVideoLoadingCancelled(String uri, VideoLoadingListener listener); + + void onVideoLoadingComplete(String uri, VideoLoadingListener listener, File file); + + void onVideoLoadingFailed(String uri, VideoLoadingListener listener, Exception e); + + void onVideoLoadingProgressUpdate(String uri, VideoLoadingListener listener, int current, int total); + + void onVideoLoadingStarted(String uri, VideoLoadingListener listener); + } + + private static class PreLoadVideoTask extends ManagedAsyncTask> implements IoUtils.CopyListener { + + private final VideoLoader mPreLoader; + private final VideoLoadingListener mListener; + private final String mUri; + + private PreLoadVideoTask(final Context context, final VideoLoader preLoader, VideoLoadingListener listener, final String uri) { + super(context, preLoader.mTaskManager, uri); + mPreLoader = preLoader; + mListener = listener; + mUri = uri; + } + + @Override + public boolean onBytesCopied(int current, int total) { + if (isCancelled()) return false; + publishProgress(current, total); + return true; + } + + @Override + protected SingleResponse doInBackground(Void... params) { + final File file = mPreLoader.mDiskCache.get(mUri); + if (file.isFile() && file.length() > 0) return SingleResponse.getInstance(file); + try { + final InputStream is = mPreLoader.mImageDownloader.getStream(mUri, null); + mPreLoader.mDiskCache.save(mUri, is, this); + IoUtils.closeSilently(is); + } catch (IOException e) { + mPreLoader.mDiskCache.remove(mUri); + Log.w(LOGTAG, e); + return SingleResponse.getInstance(e); + } + return SingleResponse.getInstance(file); + } + + @Override + protected void onProgressUpdate(Integer... values) { + super.onProgressUpdate(values); + if (mListener != null) { + mListener.onVideoLoadingProgressUpdate(mUri, mListener, values[0], values[1]); + } + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + if (mListener != null) { + mListener.onVideoLoadingStarted(mUri, mListener); + } + } + + @Override + protected void onPostExecute(SingleResponse result) { + super.onPostExecute(result); + if (mListener != null) { + if (result.hasData()) { + mListener.onVideoLoadingComplete(mUri, mListener, result.getData()); + } else { + mListener.onVideoLoadingFailed(mUri, mListener, result.getException()); + } + } + mPreLoader.notifyTaskFinish(mUri, result.hasData()); + } + + @Override + protected void onCancelled() { + super.onCancelled(); + if (mListener != null) { + mListener.onVideoLoadingCancelled(mUri, mListener); + } + } + } + +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/message/VideoLoadFinishedEvent.java b/twidere/src/main/java/org/mariotaku/twidere/util/message/VideoLoadFinishedEvent.java new file mode 100644 index 000000000..1fbe620be --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/util/message/VideoLoadFinishedEvent.java @@ -0,0 +1,26 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.util.message; + +/** + * Created by mariotaku on 15/3/23. + */ +public class VideoLoadFinishedEvent { +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/CardMediaContainer.java b/twidere/src/main/java/org/mariotaku/twidere/view/CardMediaContainer.java index dd42a8443..61845ed9c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/CardMediaContainer.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/CardMediaContainer.java @@ -33,7 +33,7 @@ import android.widget.TextView; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; import org.mariotaku.twidere.model.ParcelableMedia; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ImageLoadingHandler; import org.mariotaku.twidere.util.Utils.OnMediaClickListener; @@ -84,7 +84,7 @@ public class CardMediaContainer extends ViewGroup implements Constants { } public void displayMedia(@Nullable final ParcelableMedia[] mediaArray, - @NonNull final ImageLoaderWrapper loader, + @NonNull final MediaLoaderWrapper loader, final long accountId, final OnMediaClickListener mediaClickListener, final ImageLoadingHandler loadingHandler) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/holder/ActivityTitleSummaryViewHolder.java b/twidere/src/main/java/org/mariotaku/twidere/view/holder/ActivityTitleSummaryViewHolder.java index 44d49c301..d98fab207 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/holder/ActivityTitleSummaryViewHolder.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/holder/ActivityTitleSummaryViewHolder.java @@ -37,7 +37,7 @@ import org.mariotaku.twidere.R; import org.mariotaku.twidere.adapter.AbsActivitiesAdapter; import org.mariotaku.twidere.model.ParcelableActivity; import org.mariotaku.twidere.model.ParcelableUser; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.UserColorNameUtils; import org.mariotaku.twidere.view.ActionIconView; import org.oshkimaadziig.george.androidutils.SpanFormatter; @@ -156,7 +156,7 @@ public class ActivityTitleSummaryViewHolder extends ViewHolder { } private void displayUserProfileImages(final ParcelableUser[] statuses) { - final ImageLoaderWrapper imageLoader = adapter.getImageLoader(); + final MediaLoaderWrapper imageLoader = adapter.getImageLoader(); if (statuses == null) { for (final ImageView view : profileImageViews) { imageLoader.cancelDisplayTask(view); diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/holder/MessageConversationViewHolder.java b/twidere/src/main/java/org/mariotaku/twidere/view/holder/MessageConversationViewHolder.java index 7554b4f38..4971a0d14 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/holder/MessageConversationViewHolder.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/holder/MessageConversationViewHolder.java @@ -34,7 +34,7 @@ import org.mariotaku.twidere.adapter.MessageConversationAdapter; import org.mariotaku.twidere.model.ParcelableDirectMessage.CursorIndices; import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.util.ColorUtils; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.SimpleValueSerializer; import org.mariotaku.twidere.util.TwidereLinkify; import org.mariotaku.twidere.util.Utils; @@ -73,7 +73,7 @@ public class MessageConversationViewHolder extends ViewHolder { public void displayMessage(Cursor cursor, CursorIndices indices) { final Context context = adapter.getContext(); final TwidereLinkify linkify = adapter.getLinkify(); - final ImageLoaderWrapper loader = adapter.getImageLoader(); + final MediaLoaderWrapper loader = adapter.getImageLoader(); final long accountId = cursor.getLong(indices.account_id); final long timestamp = cursor.getLong(indices.message_timestamp); diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/holder/MessageEntryViewHolder.java b/twidere/src/main/java/org/mariotaku/twidere/view/holder/MessageEntryViewHolder.java index 8dd7a07ee..f5815de87 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/holder/MessageEntryViewHolder.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/holder/MessageEntryViewHolder.java @@ -32,7 +32,7 @@ import android.widget.TextView; import org.mariotaku.twidere.R; import org.mariotaku.twidere.adapter.MessageEntriesAdapter; import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages.ConversationEntries; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.UserColorNameUtils; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.view.ShortTimeView; @@ -66,7 +66,7 @@ public class MessageEntryViewHolder extends ViewHolder implements OnClickListene public void displayMessage(Cursor cursor) { final Context context = adapter.getContext(); - final ImageLoaderWrapper loader = adapter.getImageLoader(); + final MediaLoaderWrapper loader = adapter.getImageLoader(); final long accountId = cursor.getLong(ConversationEntries.IDX_ACCOUNT_ID); final long conversationId = cursor.getLong(ConversationEntries.IDX_CONVERSATION_ID); 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 23ce5ed19..a19e0c64c 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 @@ -21,10 +21,9 @@ import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus.CursorIndices; import org.mariotaku.twidere.util.AsyncTwitterWrapper; -import org.mariotaku.twidere.util.ImageLoaderWrapper; +import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ImageLoadingHandler; import org.mariotaku.twidere.util.SimpleValueSerializer; -import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.TwitterCardUtils; import org.mariotaku.twidere.util.UserColorNameUtils; import org.mariotaku.twidere.util.Utils; @@ -110,7 +109,7 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan } public void displayStatus(@NonNull final Context context, - @NonNull final ImageLoaderWrapper loader, + @NonNull final MediaLoaderWrapper loader, @NonNull final ImageLoadingHandler handler, @NonNull final AsyncTwitterWrapper twitter, final boolean displayMediaPreview, final boolean displayAccountsColor, @@ -229,7 +228,7 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan public void displayStatus(@NonNull Cursor cursor, @NonNull CursorIndices indices, final boolean displayInReplyTo) { - final ImageLoaderWrapper loader = adapter.getImageLoader(); + final MediaLoaderWrapper loader = adapter.getImageLoader(); final AsyncTwitterWrapper twitter = adapter.getTwitterWrapper(); final Context context = adapter.getContext(); final boolean nameFirst = adapter.isNameFirst(); @@ -443,7 +442,11 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan extraTypeView.setImageResource(R.drawable.ic_action_play_circle); extraTypeView.setVisibility(View.VISIBLE); } else if (media != null && media.length > 0) { - extraTypeView.setImageResource(R.drawable.ic_action_gallery); + if (hasVideo(media)) { + extraTypeView.setImageResource(R.drawable.ic_action_movie); + } else { + extraTypeView.setImageResource(R.drawable.ic_action_gallery); + } extraTypeView.setVisibility(View.VISIBLE); } else if (location != null && location.isValid()) { extraTypeView.setImageResource(R.drawable.ic_action_location); @@ -453,6 +456,13 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements Constan } } + private boolean hasVideo(ParcelableMedia[] media) { + for (ParcelableMedia mediaItem : media) { + if (mediaItem.type == ParcelableMedia.TYPE_VIDEO) return true; + } + return false; + } + public static interface StatusClickListener extends ContentCardClickListener { void onStatusClick(StatusViewHolder holder, int position); diff --git a/twidere/src/main/res/layout/fragment_media_page.xml b/twidere/src/main/res/layout/fragment_media_page_image.xml similarity index 100% rename from twidere/src/main/res/layout/fragment_media_page.xml rename to twidere/src/main/res/layout/fragment_media_page_image.xml diff --git a/twidere/src/main/res/layout/fragment_media_page_video.xml b/twidere/src/main/res/layout/fragment_media_page_video.xml new file mode 100644 index 000000000..fc76964f9 --- /dev/null +++ b/twidere/src/main/res/layout/fragment_media_page_video.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + \ No newline at end of file