From 1cd8580f45471e84aa8522bb0ad4d91ee94c484e Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Sat, 24 Dec 2016 23:52:34 +0800 Subject: [PATCH] improved filters --- .../twidere/provider/TwidereDataProvider.java | 3 +- .../twidere/util/DataStoreUtils.java | 67 +---------------- .../twidere/fragment/BaseFiltersFragment.kt | 34 +++------ .../fragment/CursorStatusesFragment.kt | 3 +- .../twidere/util/DataStoreFunctions.kt | 74 +++++++++++++++++++ .../src/main/res/menu/menu_filters_users.xml | 28 +++++++ twidere/src/main/res/values/strings.xml | 2 + 7 files changed, 121 insertions(+), 90 deletions(-) create mode 100644 twidere/src/main/kotlin/org/mariotaku/twidere/util/DataStoreFunctions.kt create mode 100644 twidere/src/main/res/menu/menu_filters_users.xml diff --git a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java index 9b7750e02..83b2f3ee9 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java +++ b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java @@ -116,6 +116,7 @@ import org.mariotaku.twidere.receiver.NotificationReceiver; import org.mariotaku.twidere.service.BackgroundOperationService; import org.mariotaku.twidere.util.ActivityTracker; import org.mariotaku.twidere.util.AsyncTwitterWrapper; +import org.mariotaku.twidere.util.DataStoreFunctionsKt; import org.mariotaku.twidere.util.DataStoreUtils; import org.mariotaku.twidere.util.ImagePreloader; import org.mariotaku.twidere.util.InternalTwitterContentUtils; @@ -1249,7 +1250,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta final NotificationManagerWrapper nm = mNotificationManager; final Expression selection = Expression.and(Expression.equalsArgs(Statuses.ACCOUNT_KEY), Expression.greaterThan(Statuses.POSITION_KEY, position)); - final String filteredSelection = DataStoreUtils.buildStatusFilterWhereClause(preferences, + final String filteredSelection = DataStoreFunctionsKt.buildStatusFilterWhereClause(preferences, Statuses.TABLE_NAME, selection).getSQL(); final String[] selectionArgs = {accountKey.toString()}; final String[] userProjection = {Statuses.USER_KEY, Statuses.USER_NAME, Statuses.USER_SCREEN_NAME}; diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/DataStoreUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/DataStoreUtils.java index bef6da0c8..b0e43c373 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/DataStoreUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/DataStoreUtils.java @@ -42,7 +42,6 @@ import com.bluelinelabs.logansquare.LoganSquare; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.mariotaku.kpreferences.SharedPreferencesExtensionsKt; import org.mariotaku.microblog.library.twitter.model.Activity; import org.mariotaku.sqliteqb.library.ArgsArray; import org.mariotaku.sqliteqb.library.Columns; @@ -56,7 +55,6 @@ import org.mariotaku.sqliteqb.library.Tables; import org.mariotaku.sqliteqb.library.query.SQLSelectQuery; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.TwidereConstants; -import org.mariotaku.twidere.constant.PreferenceKeysKt; import org.mariotaku.twidere.extension.AccountExtensionsKt; import org.mariotaku.twidere.model.FiltersData; import org.mariotaku.twidere.model.FiltersData$BaseItemValuesCreator; @@ -325,69 +323,6 @@ public class DataStoreUtils implements Constants { } } - @NonNull - public static Expression buildStatusFilterWhereClause(@NonNull final SharedPreferences preferences, - @NonNull final String table, - @Nullable final Expression extraSelection) { - final SQLSelectQuery filteredUsersQuery = SQLQueryBuilder - .select(new Column(new Table(Filters.Users.TABLE_NAME), Filters.Users.USER_KEY)) - .from(new Tables(Filters.Users.TABLE_NAME)) - .build(); - final Expression filteredUsersWhere = Expression.or( - Expression.in(new Column(new Table(table), Statuses.USER_KEY), filteredUsersQuery), - Expression.in(new Column(new Table(table), Statuses.RETWEETED_BY_USER_KEY), filteredUsersQuery), - Expression.in(new Column(new Table(table), Statuses.QUOTED_USER_KEY), filteredUsersQuery) - ); - final SQLSelectQuery.Builder filteredIdsQueryBuilder = SQLQueryBuilder - .select(new Column(new Table(table), Statuses._ID)) - .from(new Tables(table)) - .where(filteredUsersWhere) - .union() - .select(new Columns(new Column(new Table(table), Statuses._ID))) - .from(new Tables(table, Filters.Sources.TABLE_NAME)) - .where(Expression.or( - Expression.likeRaw(new Column(new Table(table), Statuses.SOURCE), - "'%>'||" + Filters.Sources.TABLE_NAME + "." + Filters.Sources.VALUE + "||'%'"), - Expression.likeRaw(new Column(new Table(table), Statuses.QUOTED_SOURCE), - "'%>'||" + Filters.Sources.TABLE_NAME + "." + Filters.Sources.VALUE + "||'%'") - )) - .union() - .select(new Columns(new Column(new Table(table), Statuses._ID))) - .from(new Tables(table, Filters.Keywords.TABLE_NAME)) - .where(Expression.or( - Expression.likeRaw(new Column(new Table(table), Statuses.TEXT_PLAIN), - "'%'||" + Filters.Keywords.TABLE_NAME + "." + Filters.Keywords.VALUE + "||'%'"), - Expression.likeRaw(new Column(new Table(table), Statuses.QUOTED_TEXT_PLAIN), - "'%'||" + Filters.Keywords.TABLE_NAME + "." + Filters.Keywords.VALUE + "||'%'") - )) - .union() - .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.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 + "||'%'") - )); - int filterFlags = 0; - if (SharedPreferencesExtensionsKt.get(preferences, PreferenceKeysKt.getFilterUnavailableQuoteStatusesKey())) { - filterFlags |= ParcelableStatus.FilterFlags.QUOTE_NOT_AVAILABLE; - } - - final Expression filterExpression = Expression.or( - Expression.and( - new Expression("(" + Statuses.FILTER_FLAGS + " & " + filterFlags + ") == 0"), - Expression.notIn(new Column(new Table(table), Statuses._ID), filteredIdsQueryBuilder.build()) - ), - Expression.equals(new Column(new Table(table), Statuses.IS_GAP), 1) - ); - if (extraSelection != null) { - return Expression.and(filterExpression, extraSelection); - } - return filterExpression; - } - - public static String getAccountDisplayName(final Context context, final UserKey accountKey, final boolean nameFirst) { final String name; if (nameFirst) { @@ -458,7 +393,7 @@ public class DataStoreUtils implements Constants { } expressionArgs.add(String.valueOf(compare)); - expressions.add(buildStatusFilterWhereClause(preferences, getTableNameByUri(uri), null)); + expressions.add(DataStoreFunctionsKt.buildStatusFilterWhereClause(preferences, getTableNameByUri(uri), null)); if (extraArgs != null) { Parcelable extras = extraArgs.getParcelable(EXTRA_EXTRAS); diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/BaseFiltersFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/BaseFiltersFragment.kt index 1f365a08e..03e4dbcce 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/BaseFiltersFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/BaseFiltersFragment.kt @@ -77,18 +77,6 @@ abstract class BaseFiltersFragment : AbsContentListViewFragment, data: Cursor?) { - adapter!!.swapCursor(data) + adapter.swapCursor(data) if (data != null && data.count > 0) { showContent() } else { @@ -179,14 +167,13 @@ abstract class BaseFiltersFragment : AbsContentListViewFragment) { - adapter!!.swapCursor(null) + adapter.swapCursor(null) } - override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { - inflater!!.inflate(R.menu.menu_filters, menu) + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.menu_filters, menu) } - override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.add -> { @@ -338,6 +325,11 @@ abstract class BaseFiltersFragment : AbsContentListViewFragment + get() = Filters.Users.COLUMNS + + override val contentUri: Uri + get() = Filters.Users.CONTENT_URI override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { when (requestCode) { @@ -355,11 +347,9 @@ abstract class BaseFiltersFragment : AbsContentListViewFragment - get() = Filters.Users.COLUMNS - - override val contentUri: Uri - get() = Filters.Users.CONTENT_URI + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.menu_filters_users, menu) + } override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorStatusesFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorStatusesFragment.kt index a649edebb..6132a3ca8 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorStatusesFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorStatusesFragment.kt @@ -47,6 +47,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Statuses import org.mariotaku.twidere.util.DataStoreUtils import org.mariotaku.twidere.util.ErrorInfoStore import org.mariotaku.twidere.util.Utils +import org.mariotaku.twidere.util.buildStatusFilterWhereClause /** * Created by mariotaku on 14/12/3. @@ -222,7 +223,7 @@ abstract class CursorStatusesFragment : AbsStatusesFragment() { protected fun getFiltersWhere(table: String): Expression? { if (!isFilterEnabled) return null - return DataStoreUtils.buildStatusFilterWhereClause(preferences, table, null) + return buildStatusFilterWhereClause(preferences, table, null) } protected fun getNewestStatusIds(accountKeys: Array): Array? { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/DataStoreFunctions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/DataStoreFunctions.kt new file mode 100644 index 000000000..12ba1328e --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/DataStoreFunctions.kt @@ -0,0 +1,74 @@ +package org.mariotaku.twidere.util + +import android.content.SharedPreferences +import org.mariotaku.kpreferences.get +import org.mariotaku.sqliteqb.library.* +import org.mariotaku.twidere.constant.filterUnavailableQuoteStatusesKey +import org.mariotaku.twidere.model.ParcelableStatus.FilterFlags +import org.mariotaku.twidere.provider.TwidereDataStore.Filters +import org.mariotaku.twidere.provider.TwidereDataStore.Statuses + +/** + * Created by mariotaku on 2016/12/24. + */ + +fun buildStatusFilterWhereClause(preferences: SharedPreferences, + table: String, + extraSelection: Expression?): Expression { + val filteredUsersQuery = SQLQueryBuilder + .select(Columns.Column(Table(Filters.Users.TABLE_NAME), Filters.Users.USER_KEY)) + .from(Tables(Filters.Users.TABLE_NAME)) + .build() + val filteredUsersWhere = Expression.or( + Expression.`in`(Columns.Column(Table(table), Statuses.USER_KEY), filteredUsersQuery), + Expression.`in`(Columns.Column(Table(table), Statuses.RETWEETED_BY_USER_KEY), filteredUsersQuery), + Expression.`in`(Columns.Column(Table(table), Statuses.QUOTED_USER_KEY), filteredUsersQuery) + ) + val filteredIdsQueryBuilder = SQLQueryBuilder + .select(Columns.Column(Table(table), Statuses._ID)) + .from(Tables(table)) + .where(filteredUsersWhere) + .union() + .select(Columns(Columns.Column(Table(table), Statuses._ID))) + .from(Tables(table, Filters.Sources.TABLE_NAME)) + .where(Expression.or( + Expression.likeRaw(Columns.Column(Table(table), Statuses.SOURCE), + "'%>'||" + Filters.Sources.TABLE_NAME + "." + Filters.Sources.VALUE + "||'%'"), + Expression.likeRaw(Columns.Column(Table(table), Statuses.QUOTED_SOURCE), + "'%>'||" + Filters.Sources.TABLE_NAME + "." + Filters.Sources.VALUE + "||'%'") + )) + .union() + .select(Columns(Columns.Column(Table(table), Statuses._ID))) + .from(Tables(table, Filters.Keywords.TABLE_NAME)) + .where(Expression.or( + Expression.likeRaw(Columns.Column(Table(table), Statuses.TEXT_PLAIN), + "'%'||" + Filters.Keywords.TABLE_NAME + "." + Filters.Keywords.VALUE + "||'%'"), + Expression.likeRaw(Columns.Column(Table(table), Statuses.QUOTED_TEXT_PLAIN), + "'%'||" + Filters.Keywords.TABLE_NAME + "." + Filters.Keywords.VALUE + "||'%'") + )) + .union() + .select(Columns(Columns.Column(Table(table), Statuses._ID))) + .from(Tables(table, Filters.Links.TABLE_NAME)) + .where(Expression.or( + Expression.likeRaw(Columns.Column(Table(table), Statuses.SPANS), + "'%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%'"), + Expression.likeRaw(Columns.Column(Table(table), Statuses.QUOTED_SPANS), + "'%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%'") + )) + var filterFlags: Long = 0 + if (preferences[filterUnavailableQuoteStatusesKey]) { + filterFlags = filterFlags or FilterFlags.QUOTE_NOT_AVAILABLE + } + + val filterExpression = Expression.or( + Expression.and( + Expression("(" + Statuses.FILTER_FLAGS + " & " + filterFlags + ") == 0"), + Expression.notIn(Columns.Column(Table(table), Statuses._ID), filteredIdsQueryBuilder.build()) + ), + Expression.equals(Columns.Column(Table(table), Statuses.IS_GAP), 1) + ) + if (extraSelection != null) { + return Expression.and(filterExpression, extraSelection) + } + return filterExpression +} diff --git a/twidere/src/main/res/menu/menu_filters_users.xml b/twidere/src/main/res/menu/menu_filters_users.xml new file mode 100644 index 000000000..31d81526b --- /dev/null +++ b/twidere/src/main/res/menu/menu_filters_users.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/twidere/src/main/res/values/strings.xml b/twidere/src/main/res/values/strings.xml index ce82ccb24..8d3b857d2 100644 --- a/twidere/src/main/res/values/strings.xml +++ b/twidere/src/main/res/values/strings.xml @@ -828,4 +828,6 @@ %1$s ยท %2$s %s Filter unavailable quotes + Import from blocked users + Import from muted users \ No newline at end of file