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 1867245cf..9b7750e02 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java +++ b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java @@ -1193,7 +1193,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta for (final AccountPreferences pref : prefs) { if (!pref.isHomeTimelineNotificationEnabled()) continue; final long positionTag = getPositionTag(CustomTabType.HOME_TIMELINE, pref.getAccountKey()); - showTimelineNotification(pref, positionTag); + showTimelineNotification(mPreferences, pref, positionTag); } notifyUnreadCountChanged(NOTIFICATION_ID_HOME_TIMELINE); } @@ -1241,7 +1241,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta return mReadStateManager.getPosition(tag); } - private void showTimelineNotification(AccountPreferences pref, long position) { + private void showTimelineNotification(SharedPreferences preferences, AccountPreferences pref, long position) { final UserKey accountKey = pref.getAccountKey(); final Context context = getContext(); if (context == null) return; @@ -1249,8 +1249,8 @@ 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(Statuses.TABLE_NAME, - selection).getSQL(); + final String filteredSelection = DataStoreUtils.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}; final String[] statusProjection = {Statuses.STATUS_ID}; 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 e4cf731e7..bef6da0c8 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/DataStoreUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/DataStoreUtils.java @@ -24,6 +24,7 @@ import android.accounts.AccountManager; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; +import android.content.SharedPreferences; import android.content.UriMatcher; import android.database.Cursor; import android.net.Uri; @@ -41,6 +42,7 @@ 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; @@ -54,6 +56,7 @@ 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; @@ -323,7 +326,9 @@ public class DataStoreUtils implements Constants { } @NonNull - public static Expression buildStatusFilterWhereClause(@NonNull final String table, final Expression extraSelection) { + 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)) @@ -364,8 +369,16 @@ public class DataStoreUtils implements Constants { 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.notIn(new Column(new Table(table), Statuses._ID), filteredIdsQueryBuilder.build()), + 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) { @@ -420,7 +433,9 @@ public class DataStoreUtils implements Constants { return keys.toArray(new UserKey[keys.size()]); } - public static int getStatusesCount(@NonNull final Context context, final Uri uri, + public static int getStatusesCount(@NonNull final Context context, + @NonNull final SharedPreferences preferences, + final Uri uri, @Nullable final Bundle extraArgs, final long compare, String compareColumn, boolean greaterThan, @Nullable UserKey[] accountKeys) { @@ -443,7 +458,7 @@ public class DataStoreUtils implements Constants { } expressionArgs.add(String.valueOf(compare)); - expressions.add(buildStatusFilterWhereClause(getTableNameByUri(uri), null)); + expressions.add(buildStatusFilterWhereClause(preferences, getTableNameByUri(uri), null)); if (extraArgs != null) { Parcelable extras = extraArgs.getParcelable(EXTRA_EXTRAS); diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt index c54480104..aab883fb7 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt @@ -28,6 +28,7 @@ import android.app.SearchManager import android.content.Context import android.content.DialogInterface import android.content.Intent +import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.content.res.Configuration import android.graphics.Rect @@ -515,7 +516,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp fun updateUnreadCount() { if (mainTabs == null || updateUnreadCountTask != null && updateUnreadCountTask!!.status == AsyncTask.Status.RUNNING) return - updateUnreadCountTask = UpdateUnreadCountTask(this, readStateManager, mainTabs, + updateUnreadCountTask = UpdateUnreadCountTask(this, preferences, readStateManager, mainTabs, pagerAdapter.tabs.toTypedArray()) AsyncTaskUtils.executeTask(updateUnreadCountTask) mainTabs.setDisplayBadge(preferences.getBoolean(SharedPreferenceConstants.KEY_UNREAD_COUNT, true)) @@ -885,6 +886,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp private class UpdateUnreadCountTask internal constructor( private val context: Context, + private val preferences: SharedPreferences, private val readStateManager: ReadStateManager, private val indicator: TabPagerIndicator, private val tabs: Array) : AsyncTask() { @@ -904,8 +906,9 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp val tag = Utils.getReadPositionTagWithAccount(ReadPositionTag.HOME_TIMELINE, it) readStateManager.getPosition(tag) }.fold(0L, Math::max) - val count = DataStoreUtils.getStatusesCount(context, Statuses.CONTENT_URI, - spec.args, position, Statuses.STATUS_TIMESTAMP, true, accountKeys) + val count = DataStoreUtils.getStatusesCount(context, preferences, + Statuses.CONTENT_URI, spec.args, position, Statuses.STATUS_TIMESTAMP, + true, accountKeys) result.put(i, count) publishProgress(TabBadge(i, count)) } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/constant/PreferenceKeys.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/constant/PreferenceKeys.kt index fa781ea58..045c983f4 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/constant/PreferenceKeys.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/constant/PreferenceKeys.kt @@ -51,6 +51,7 @@ val drawerToggleKey = KBooleanKey(KEY_DRAWER_TOGGLE, false) val fabVisibleKey = KBooleanKey(KEY_FAB_VISIBLE, true) val themeKey = KStringKey(KEY_THEME, VALUE_THEME_NAME_LIGHT) val themeColorKey = KIntKey(KEY_THEME_COLOR, 0) +val filterUnavailableQuoteStatusesKey = KBooleanKey("filter_unavailable_quote_statuses", false) object refreshIntervalKey : KSimpleKey(KEY_REFRESH_INTERVAL, 15) { override fun read(preferences: SharedPreferences): Long { 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 9be8b7705..a649edebb 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorStatusesFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/CursorStatusesFragment.kt @@ -45,8 +45,6 @@ import org.mariotaku.twidere.model.message.* import org.mariotaku.twidere.provider.TwidereDataStore.Filters import org.mariotaku.twidere.provider.TwidereDataStore.Statuses import org.mariotaku.twidere.util.DataStoreUtils -import org.mariotaku.twidere.util.DataStoreUtils.buildStatusFilterWhereClause -import org.mariotaku.twidere.util.DataStoreUtils.getTableNameByUri import org.mariotaku.twidere.util.ErrorInfoStore import org.mariotaku.twidere.util.Utils @@ -78,7 +76,7 @@ abstract class CursorStatusesFragment : AbsStatusesFragment() { override fun onCreateStatusesLoader(context: Context, args: Bundle, fromUser: Boolean): Loader?> { val uri = contentUri - val table = getTableNameByUri(uri) + val table = DataStoreUtils.getTableNameByUri(uri) val sortOrder = Statuses.DEFAULT_SORT_ORDER val accountKeys = this.accountKeys val accountWhere = Expression.`in`(Column(Statuses.ACCOUNT_KEY), @@ -224,7 +222,7 @@ abstract class CursorStatusesFragment : AbsStatusesFragment() { protected fun getFiltersWhere(table: String): Expression? { if (!isFilterEnabled) return null - return buildStatusFilterWhereClause(table, null) + return DataStoreUtils.buildStatusFilterWhereClause(preferences, table, null) } protected fun getNewestStatusIds(accountKeys: Array): Array? { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableStatusUtils.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableStatusUtils.kt index b2873f0dd..54e56be6c 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableStatusUtils.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableStatusUtils.kt @@ -7,7 +7,6 @@ import org.mariotaku.microblog.library.twitter.model.Status import org.mariotaku.twidere.TwidereConstants.USER_TYPE_FANFOU_COM import org.mariotaku.twidere.model.* import org.mariotaku.twidere.model.ParcelableStatus.FilterFlags -import org.mariotaku.twidere.task.twitter.GetStatusesTask import org.mariotaku.twidere.util.HtmlSpanBuilder import org.mariotaku.twidere.util.InternalTwitterContentUtils import org.mariotaku.twidere.util.TwitterContentUtils @@ -105,7 +104,7 @@ object ParcelableStatusUtils { result.quoted_user_profile_image = TwitterContentUtils.getProfileImageUrl(quotedUser) result.quoted_user_is_protected = quotedUser.isProtected result.quoted_user_is_verified = quotedUser.isVerified - } else { + } else if (status.isQuoteStatus) { result.filter_flags = result.filter_flags or FilterFlags.QUOTE_NOT_AVAILABLE } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/GetStatusesTask.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/GetStatusesTask.kt index ec8948521..4fe0851a9 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/GetStatusesTask.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/GetStatusesTask.kt @@ -12,7 +12,7 @@ import org.apache.commons.lang3.ArrayUtils import org.apache.commons.lang3.math.NumberUtils import org.mariotaku.abstask.library.AbstractTask import org.mariotaku.abstask.library.TaskStarter -import org.mariotaku.kpreferences.KPreferences +import org.mariotaku.kpreferences.get import org.mariotaku.microblog.library.MicroBlog import org.mariotaku.microblog.library.MicroBlogException import org.mariotaku.microblog.library.twitter.model.Paging @@ -48,7 +48,7 @@ abstract class GetStatusesTask( protected val context: Context ) : AbstractTask, () -> Unit>() { @Inject - lateinit var preferences: KPreferences + lateinit var preferences: SharedPreferencesWrapper @Inject lateinit var bus: Bus @Inject @@ -200,8 +200,8 @@ abstract class GetStatusesTask( val deleteWhereArgs = arrayOf(accountKey.toString(), *statusIds) var olderCount = -1 if (minPositionKey > 0) { - olderCount = DataStoreUtils.getStatusesCount(context, uri, null, minPositionKey, - Statuses.POSITION_KEY, false, arrayOf(accountKey)) + olderCount = DataStoreUtils.getStatusesCount(context, preferences, uri, null, + minPositionKey, Statuses.POSITION_KEY, false, arrayOf(accountKey)) } val rowsDeleted = resolver.delete(writeUri, deleteWhere, deleteWhereArgs)