fixed status link filter

This commit is contained in:
Mariotaku Lee 2016-03-31 08:48:20 +08:00
parent bf2311d5c9
commit ba9518ec22
5 changed files with 53 additions and 66 deletions

View File

@ -733,13 +733,6 @@ public interface TwidereDataStore {
Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH);
/**
* Status content, in HTML. Please note, this is not actually original
* text.<br>
* Type: TEXT
*/
String TEXT_HTML = "text_html";
/**
*
*/
@ -866,7 +859,6 @@ public interface TwidereDataStore {
+ " DESC";
String QUOTED_ID = "quoted_id";
String QUOTED_TEXT_HTML = "quoted_text_html";
String QUOTED_TEXT_PLAIN = "quoted_text_plain";
String QUOTED_TEXT_UNESCAPED = "quoted_text_unescaped";
String QUOTED_MEDIA_JSON = "quoted_media_json";
@ -900,32 +892,32 @@ public interface TwidereDataStore {
String IN_REPLY_TO_USER_NICKNAME = "in_reply_to_user_nickname";
String[] COLUMNS = {_ID, ACCOUNT_KEY, STATUS_ID, SORT_ID, USER_KEY, STATUS_TIMESTAMP,
TEXT_HTML, TEXT_PLAIN, TEXT_UNESCAPED, USER_NAME, USER_SCREEN_NAME,
USER_PROFILE_IMAGE_URL, IN_REPLY_TO_STATUS_ID, IN_REPLY_TO_USER_ID, IN_REPLY_TO_USER_NAME,
IN_REPLY_TO_USER_SCREEN_NAME, SOURCE, LOCATION, RETWEET_COUNT, FAVORITE_COUNT, REPLY_COUNT,
TEXT_PLAIN, TEXT_UNESCAPED, USER_NAME, USER_SCREEN_NAME, USER_PROFILE_IMAGE_URL,
IN_REPLY_TO_STATUS_ID, IN_REPLY_TO_USER_ID, IN_REPLY_TO_USER_NAME, IN_REPLY_TO_USER_SCREEN_NAME,
SOURCE, LOCATION, RETWEET_COUNT, FAVORITE_COUNT, REPLY_COUNT,
RETWEET_ID, RETWEET_TIMESTAMP, RETWEETED_BY_USER_KEY, RETWEETED_BY_USER_NAME,
RETWEETED_BY_USER_SCREEN_NAME, RETWEETED_BY_USER_PROFILE_IMAGE, QUOTED_ID, QUOTED_TEXT_HTML,
QUOTED_TEXT_PLAIN, QUOTED_TEXT_UNESCAPED, QUOTED_TIMESTAMP, QUOTED_SOURCE, QUOTED_USER_KEY,
QUOTED_USER_NAME, QUOTED_USER_SCREEN_NAME, QUOTED_USER_PROFILE_IMAGE,
RETWEETED_BY_USER_SCREEN_NAME, RETWEETED_BY_USER_PROFILE_IMAGE, QUOTED_ID,
QUOTED_TEXT_PLAIN, QUOTED_TEXT_UNESCAPED, QUOTED_TIMESTAMP, QUOTED_SOURCE,
QUOTED_USER_KEY, QUOTED_USER_NAME, QUOTED_USER_SCREEN_NAME, QUOTED_USER_PROFILE_IMAGE,
QUOTED_USER_IS_VERIFIED, QUOTED_USER_IS_PROTECTED, MY_RETWEET_ID, IS_RETWEET,
IS_QUOTE, IS_FAVORITE, IS_PROTECTED, IS_VERIFIED, IS_FOLLOWING, IS_GAP,
IS_POSSIBLY_SENSITIVE, MEDIA_JSON, MENTIONS_JSON, QUOTED_MEDIA_JSON, CARD_NAME, CARD,
PLACE_FULL_NAME, LANG, RETWEETED, QUOTED_LOCATION, QUOTED_PLACE_FULL_NAME, INSERTED_DATE,
EXTRAS, POSITION_KEY, SPANS, QUOTED_SPANS, ACCOUNT_COLOR, USER_COLOR, QUOTED_USER_COLOR,
RETWEET_USER_COLOR, USER_NICKNAME, QUOTED_USER_NICKNAME, RETWEET_USER_NICKNAME,
IN_REPLY_TO_USER_NICKNAME};
EXTRAS, POSITION_KEY, /*spans*/ SPANS, QUOTED_SPANS, /*colors*/ ACCOUNT_COLOR, USER_COLOR,
QUOTED_USER_COLOR, RETWEET_USER_COLOR, /*nicknames*/ USER_NICKNAME,
QUOTED_USER_NICKNAME, RETWEET_USER_NICKNAME, IN_REPLY_TO_USER_NICKNAME};
String[] TYPES = {TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL, TYPE_TEXT_NOT_NULL, TYPE_INT,
TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT,
TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_TEXT, TYPE_BOOLEAN,
TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_TEXT, TYPE_BOOLEAN,
TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN,
TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, INSERTED_DATE_TYPE,
TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT,
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT};
TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, INSERTED_DATE_TYPE, TYPE_TEXT,
TYPE_INT, /*spans*/ TYPE_TEXT, TYPE_TEXT, /*colors*/ TYPE_INT, TYPE_INT, TYPE_INT,
TYPE_INT, /*nicknames*/TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT};
}

View File

@ -34,7 +34,7 @@ import static org.mariotaku.twidere.annotation.PreferenceType.STRING;
public interface Constants extends TwidereConstants {
String DATABASES_NAME = "twidere.sqlite";
int DATABASES_VERSION = 139;
int DATABASES_VERSION = 140;
int MENU_GROUP_STATUS_EXTENSION = 10;
int MENU_GROUP_COMPOSE_EXTENSION = 11;

View File

@ -91,6 +91,7 @@ import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableActivityCursorIndices;
import org.mariotaku.twidere.model.ParcelableDirectMessageCursorIndices;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.SpanItem;
import org.mariotaku.twidere.model.StringLongPair;
import org.mariotaku.twidere.model.UnreadItem;
import org.mariotaku.twidere.model.UserKey;
@ -121,6 +122,7 @@ import org.mariotaku.twidere.util.ActivityTracker;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.ImagePreloader;
import org.mariotaku.twidere.util.JsonSerializer;
import org.mariotaku.twidere.util.NotificationManagerWrapper;
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.PermissionsManager;
@ -1232,7 +1234,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
final Context context = getContext();
if (uri == null || valuesArray == null || valuesArray.length == 0 || context == null)
return;
preloadImages(valuesArray);
preloadMedia(valuesArray);
switch (tableId) {
case TABLE_ID_STATUSES: {
mBackgroundExecutor.execute(new Runnable() {
@ -1639,19 +1641,29 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
}
}
private void preloadImages(final ContentValues... values) {
private void preloadMedia(final ContentValues... values) {
if (values == null) return;
final boolean preloadProfileImages = mPreferences.getBoolean(KEY_PRELOAD_PROFILE_IMAGES, false);
final boolean preloadPreviewMedia = mPreferences.getBoolean(KEY_PRELOAD_PREVIEW_IMAGES, false);
for (final ContentValues v : values) {
if (mPreferences.getBoolean(KEY_PRELOAD_PROFILE_IMAGES, false)) {
if (preloadProfileImages) {
mImagePreloader.preloadImage(v.getAsString(Statuses.USER_PROFILE_IMAGE_URL));
mImagePreloader.preloadImage(v.getAsString(DirectMessages.SENDER_PROFILE_IMAGE_URL));
mImagePreloader.preloadImage(v.getAsString(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL));
}
if (mPreferences.getBoolean(KEY_PRELOAD_PREVIEW_IMAGES, false)) {
final String textHtml = v.getAsString(Statuses.TEXT_HTML);
for (final String link : PreviewMediaExtractor.getSupportedLinksInStatus(textHtml)) {
mImagePreloader.preloadImage(link);
}
if (preloadPreviewMedia) {
preloadSpans(JsonSerializer.parseList(v.getAsString(Statuses.SPANS), SpanItem.class));
preloadSpans(JsonSerializer.parseList(v.getAsString(Statuses.QUOTED_SPANS), SpanItem.class));
}
}
}
private void preloadSpans(List<SpanItem> spans) {
if (spans == null) return;
for (SpanItem span : spans) {
if (span.link == null) continue;
if (PreviewMediaExtractor.isSupported(span.link)) {
mImagePreloader.preloadImage(span.link);
}
}
}

View File

@ -344,10 +344,10 @@ public class DataStoreUtils implements Constants {
.select(new Columns(new Column(new Table(table), Statuses._ID)))
.from(new Tables(table, Filters.Links.TABLE_NAME))
.where(Expression.or(
Expression.likeRaw(new Column(new Table(table), Statuses.TEXT_HTML),
"'%>%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%</a>%'"),
Expression.likeRaw(new Column(new Table(table), Statuses.QUOTED_TEXT_HTML),
"'%>%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%</a>%'")
Expression.likeRaw(new Column(new Table(table), Statuses.SPANS),
"'%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%'"),
Expression.likeRaw(new Column(new Table(table), Statuses.QUOTED_SPANS),
"'%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%'")
));
final Expression filterExpression = Expression.or(
Expression.notIn(new Column(new Table(table), Statuses._ID), filteredIdsQueryBuilder.build()),

View File

@ -20,13 +20,9 @@
package org.mariotaku.twidere.util;
import android.support.annotation.Nullable;
import android.util.Log;
import com.bluelinelabs.logansquare.JsonMapper;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@ -46,9 +42,6 @@ public class JsonSerializer {
try {
return LoganSquareMapperFinder.mapperFor(cls).serialize(list);
} catch (IOException e) {
if (BuildConfig.DEBUG) {
Log.w(Constants.LOGTAG, e);
}
return null;
}
}
@ -59,9 +52,6 @@ public class JsonSerializer {
try {
return LoganSquareMapperFinder.mapperFor(cls).serialize(list);
} catch (IOException e) {
if (BuildConfig.DEBUG) {
Log.w(Constants.LOGTAG, e);
}
return null;
}
}
@ -72,9 +62,6 @@ public class JsonSerializer {
try {
return LoganSquareMapperFinder.mapperFor(cls).serialize(Arrays.asList(array));
} catch (IOException e) {
if (BuildConfig.DEBUG) {
Log.w(Constants.LOGTAG, e);
}
return null;
}
}
@ -85,9 +72,6 @@ public class JsonSerializer {
try {
return LoganSquareMapperFinder.mapperFor(cls).serialize(object);
} catch (IOException e) {
if (BuildConfig.DEBUG) {
Log.w(Constants.LOGTAG, e);
}
return null;
}
}
@ -101,9 +85,6 @@ public class JsonSerializer {
LoganSquareMapperFinder.mapperFor(object.getClass());
return mapper.serialize(object);
} catch (IOException e) {
if (BuildConfig.DEBUG) {
Log.w(Constants.LOGTAG, e);
}
return null;
}
}
@ -116,9 +97,6 @@ public class JsonSerializer {
//noinspection unchecked
return list.toArray((T[]) Array.newInstance(cls, list.size()));
} catch (IOException e) {
if (BuildConfig.DEBUG) {
Log.w(Constants.LOGTAG, e);
}
return null;
}
}
@ -129,9 +107,6 @@ public class JsonSerializer {
try {
return LoganSquareMapperFinder.mapperFor(cls).parse(string);
} catch (IOException e) {
if (BuildConfig.DEBUG) {
Log.w(Constants.LOGTAG, e);
}
return null;
}
}
@ -143,13 +118,21 @@ public class JsonSerializer {
is = new FileInputStream(file);
return LoganSquareMapperFinder.mapperFor(cls).parseList(is);
} catch (IOException e) {
if (BuildConfig.DEBUG) {
Log.w(Constants.LOGTAG, e);
}
return null;
} finally {
Utils.closeSilently(is);
}
}
public static <E> List<E> parseList(String json, Class<E> cls) {
FileInputStream is = null;
//noinspection TryFinallyCanBeTryWithResources
try {
return LoganSquareMapperFinder.mapperFor(cls).parseList(json);
} catch (IOException e) {
return null;
}
}
}