added experimental vine video support

use jitpack instead of submodule
This commit is contained in:
Mariotaku Lee 2015-03-23 01:06:25 +08:00
parent 1852b5305b
commit 6a62ba6382
67 changed files with 1017 additions and 394 deletions

6
.gitmodules vendored
View File

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

View File

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

@ -1 +0,0 @@
Subproject commit 524ca7a432be4c55be3841813fe7326f2fbf08c1

@ -1 +0,0 @@
Subproject commit 10724315c13768d16891c0ff0926daecba39c75c

View File

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

View File

@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle')
android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
targetSdkVersion 22
versionCode 1
versionName "1.0"
}

View File

@ -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<ParcelableMedia> CREATOR = new Parcelable.Creator<ParcelableMedia>() {
@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<Variant> CREATOR = new Parcelable.Creator<Variant>() {
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<VideoInfo> CREATOR = new Parcelable.Creator<VideoInfo>() {
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);
}

View File

@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle')
android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
targetSdkVersion 22
versionCode 1
versionName "1.0"
}

View File

@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle')
android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
targetSdkVersion 22
versionCode 1
versionName "1.0"
}

View File

@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle')
android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
targetSdkVersion 22
versionCode 1
versionName "1.0"
}

View File

@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle')
android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
targetSdkVersion 22
versionCode 1
versionName "1.0"
}

View File

@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle')
android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
targetSdkVersion 22
versionCode 1
versionName "1.0"
}

View File

@ -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<Integer, Size> getSizes();
/**
* Returns size variations of the media.
*
* @return size variations of the media
*/
Map<Integer, Size> 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();
}
}

View File

@ -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<Integer, MediaEntity.Size> 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<Integer, MediaEntity.Size> 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<Integer, MediaEntity.Size>(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<Integer, MediaEntity.Size>(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<Integer, MediaEntity.Size> getSizes() {
return sizes;
}
/**
* {@inheritDoc}
*/
@Override
public URL getMediaURLHttps() {
return mediaURLHttps;
}
/**
* {@inheritDoc}
*/
@Override
public int getStart() {
return start;
}
@Override
public Map<Integer, MediaEntity.Size> 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<Integer, MediaEntity.Size> 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<Integer, MediaEntity.Size> 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;
}
}
}
}

View File

@ -25,7 +25,7 @@ android {
defaultConfig {
applicationId "org.mariotaku.twidere.donate.nyanwp"
minSdkVersion 20
targetSdkVersion 21
targetSdkVersion 22
versionCode 1
versionName "1.0"
}

View File

@ -25,7 +25,7 @@ android {
defaultConfig {
applicationId "org.mariotaku.twidere.donate.nyanwp"
minSdkVersion 14
targetSdkVersion 21
targetSdkVersion 22
versionCode 3
versionName "1.2"
}

View File

@ -24,7 +24,7 @@ android {
defaultConfig {
applicationId "org.mariotaku.twidere.extension.push.xiaomi"
minSdkVersion 14
targetSdkVersion 21
targetSdkVersion 22
versionCode 2
versionName "1.0"
}

View File

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

View File

@ -25,7 +25,7 @@ android {
defaultConfig {
applicationId "org.mariotaku.extension.twitlonger"
minSdkVersion 14
targetSdkVersion 21
targetSdkVersion 22
versionCode 6
versionName "1.5"
}

View File

@ -23,7 +23,7 @@ apply from: rootProject.file('global.gradle')
android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
targetSdkVersion 22
versionCode 1
versionName "1.0"
}

View File

@ -26,7 +26,7 @@ android {
defaultConfig {
applicationId "org.mariotaku.twidere"
minSdkVersion 20
targetSdkVersion 21
targetSdkVersion 22
versionCode 1
versionName "1.0"
}

View File

@ -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'])

View File

@ -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<Boolean> 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<ParcelableMediaUpdate> {
private final ImageLoaderWrapper mImageLoader;
private final MediaLoaderWrapper mImageLoader;
public MediaPreviewAdapter(final Context context) {
super(context, R.layout.grid_item_media_editor);

View File

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

View File

@ -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<Result>, 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<TileImageLoader.Result> 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) {

View File

@ -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<SuggestionItem> mData;
@ -542,7 +542,7 @@ public class QuickSearchBarActivity extends ThemedFragmentActivity implements On
return view;
}
public ImageLoaderWrapper getImageLoader() {
public MediaLoaderWrapper getImageLoader() {
return mImageLoader;
}

View File

@ -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<Void, Void, ?> mTask;

View File

@ -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<Data> extends Adapter<ViewHolder> 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<Data> extends Adapter<ViewHolder> imp
public abstract void setData(Data data);
@Override
public ImageLoaderWrapper getImageLoader() {
public MediaLoaderWrapper getImageLoader() {
return mImageLoader;
}

View File

@ -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<D> extends Adapter<ViewHolder> 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<D> extends Adapter<ViewHolder> implemen
}
@Override
public final ImageLoaderWrapper getImageLoader() {
public final MediaLoaderWrapper getImageLoader() {
return mImageLoader;
}

View File

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

View File

@ -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<ParcelableAccount> {
private final ImageLoaderWrapper mImageLoader;
private final MediaLoaderWrapper mImageLoader;
private final boolean mDisplayProfileImage;
public AccountsSpinnerAdapter(final Context context) {

View File

@ -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<T> extends ArrayAdapter<T> 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<T> extends ArrayAdapter<T> implements IBaseAdapter
}
@Override
public ImageLoaderWrapper getImageLoader() {
public MediaLoaderWrapper getImageLoader() {
return mImageLoader;
}

View File

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

View File

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

View File

@ -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<String> implements Constants {
private final ImageLoaderWrapper mImageLoader;
private final MediaLoaderWrapper mImageLoader;
private final SharedPreferences mPreferences;
private final ImageLoadingHandler mImageLoadingHandler;

View File

@ -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<ViewHolder>
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<ViewHolder>
return mContext;
}
public ImageLoaderWrapper getImageLoader() {
public MediaLoaderWrapper getImageLoader() {
return mImageLoader;
}

View File

@ -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<ViewHolder> 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<ViewHolder> implements Consta
}
public ImageLoaderWrapper getImageLoader() {
public MediaLoaderWrapper getImageLoader() {
return mImageLoader;
}

View File

@ -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<ParcelableU
OnClickListener {
private final Context mContext;
private final ImageLoaderWrapper mImageLoader;
private final MediaLoaderWrapper mImageLoader;
private final MultiSelectManager mMultiSelectManager;
private final Locale mLocale;

View File

@ -28,7 +28,7 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter;
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.util.MultiSelectManager;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.holder.UserViewListHolder;
@ -45,7 +45,7 @@ import static org.mariotaku.twidere.util.Utils.getUserTypeIconRes;
public class ParcelableUsersAdapter extends BaseArrayAdapter<ParcelableUser> implements IBaseCardAdapter {
private final ImageLoaderWrapper mProfileImageLoader;
private final MediaLoaderWrapper mProfileImageLoader;
private final MultiSelectManager mMultiSelectManager;
private final Context mContext;

View File

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

View File

@ -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<ParcelableUser> implements IBaseAdapter {
private final ImageLoaderWrapper mImageLoader;
private final MediaLoaderWrapper mImageLoader;
private final Context mContext;
public SimpleParcelableUsersAdapter(final Context context) {

View File

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

View File

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

View File

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

View File

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

View File

@ -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<AccountProfileImageViewHolder> {
private final LayoutInflater mInflater;
private final ImageLoaderWrapper mImageLoader;
private final MediaLoaderWrapper mImageLoader;
private final AccountsDashboardFragment mFragment;
private ParcelableAccount[] mAccounts;
private ParcelableAccount[] mInternalAccounts;

View File

@ -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<List<ParcelableUser>> mSearchLoadersCallback = new LoaderCallbacks<List<ParcelableUser>>() {

View File

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

View File

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

View File

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

View File

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

View File

@ -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<SingleResponse<ParcelableUserList>>, DrawerCallback,
SystemWindowsInsetsCallback, SupportFragmentCallback {
private ImageLoaderWrapper mProfileImageLoader;
private MediaLoaderWrapper mProfileImageLoader;
private AsyncTwitterWrapper mTwitterWrapper;
private ImageView mProfileImageView;

View File

@ -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<MediaTimelineViewHolder> {
private final LayoutInflater mInflater;
private final ImageLoaderWrapper mImageLoader;
private final MediaLoaderWrapper mImageLoader;
private final ImageLoadingHandler mLoadingHandler;
private List<ParcelableStatus> 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];

View File

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

View File

@ -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<ParcelableAccount> {
private final ImageLoaderWrapper mImageLoader;
private final MediaLoaderWrapper mImageLoader;
public AccountsGridAdapter(Context context) {
super(context, R.layout.grid_item_selector_account);

View File

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

View File

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

View File

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

View File

@ -0,0 +1,171 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
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<Void, Integer, SingleResponse<File>> 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<File> 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<File> 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);
}
}
}
}

View File

@ -0,0 +1,26 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.util.message;
/**
* Created by mariotaku on 15/3/23.
*/
public class VideoLoadFinishedEvent {
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Twidere - Twitter client for Android
~
~ Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
~
~ 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 <http://www.gnu.org/licenses/>.
-->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_gravity="center"
android:layout_height="match_parent"/>
<ProgressBar
android:visibility="gone"
android:id="@+id/progress"
android:layout_width="@dimen/element_size_normal"
android:layout_height="@dimen/element_size_normal"
android:layout_gravity="center"/>
</FrameLayout>