1
0
mirror of https://github.com/TwidereProject/Twidere-Android synced 2025-02-17 04:00:48 +01:00

fixed dm unread count issue

This commit is contained in:
Mariotaku Lee 2017-04-10 17:35:35 +08:00
parent 3e7483b076
commit ad5a055ec7
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
23 changed files with 128 additions and 103 deletions

View File

@ -63,6 +63,7 @@ subprojects {
ParcelablePlease : '1.0.2',
Chameleon : '0.9.17',
UniqR : '0.9',
SQLiteQB : '0.9.15',
]
}

View File

@ -179,7 +179,7 @@ dependencies {
compile "com.github.mariotaku.MediaViewerLibrary:base:${libVersions['MediaViewerLibrary']}"
compile "com.github.mariotaku.MediaViewerLibrary:subsample-image-view:${libVersions['MediaViewerLibrary']}"
compile 'com.github.mariotaku:SQLiteQB:0.9.12'
compile "com.github.mariotaku:SQLiteQB:${libVersions['SQLiteQB']}"
compile "com.github.mariotaku.ObjectCursor:core:${libVersions['ObjectCursor']}"
compile 'com.github.mariotaku:AbstractTask:0.9.4'
compile "com.github.mariotaku.CommonsLibrary:parcel:${libVersions['MariotakuCommons']}"

View File

@ -66,6 +66,7 @@ import org.mariotaku.chameleon.ChameleonUtils
import org.mariotaku.kpreferences.get
import org.mariotaku.kpreferences.set
import org.mariotaku.ktextension.*
import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.twidere.Constants.*
import org.mariotaku.twidere.R
import org.mariotaku.twidere.activity.iface.IControlBarActivity.ControlBarShowHideHelper
@ -914,7 +915,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
readStateManager.getPosition(tag)
}.fold(0L, Math::max)
val count = DataStoreUtils.getStatusesCount(context, preferences,
Statuses.CONTENT_URI, spec.args, position, Statuses.STATUS_TIMESTAMP,
Statuses.CONTENT_URI, spec.args, Statuses.STATUS_TIMESTAMP, position,
true, accountKeys)
result.put(i, count)
publishProgress(TabBadge(i, count))
@ -935,8 +936,9 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
val projection = (Conversations.COLUMNS + Conversations.UNREAD_COUNT).map {
TwidereQueryBuilder.mapConversationsProjection(it)
}.toTypedArray()
val unreadHaving = Expression.greaterThan(Conversations.UNREAD_COUNT, 0)
val count = context.contentResolver.getUnreadMessagesEntriesCursor(projection,
accountKeys)?.useCursor { cur ->
accountKeys, extraHaving = unreadHaving)?.useCursor { cur ->
return@useCursor cur.count
} ?: -1
publishProgress(TabBadge(i, count))

View File

@ -541,9 +541,9 @@ abstract class AbsActivitiesFragment protected constructor() :
val resolver = context.contentResolver
val values = ContentValues()
values.put(Activities.IS_GAP, 1)
val where = Expression.equalsArgs(Activities._ID).sql
val whereArgs = arrayOf(adapter.getActivity(position)._id.toString())
resolver.update(contentUri, values, where, whereArgs)
val _id = adapter.getActivity(position)._id
val where = Expression.equals(Activities._ID, _id).sql
resolver.update(contentUri, values, where, null)
return true
}
else -> MenuUtils.handleStatusClick(activity, this, fragmentManager,

View File

@ -542,9 +542,8 @@ abstract class AbsStatusesFragment : AbsContentListRecyclerViewFragment<Parcelab
val resolver = context.contentResolver
val values = ContentValues()
values.put(Statuses.IS_GAP, 1)
val where = Expression.equalsArgs(Statuses._ID).sql
val whereArgs = arrayOf(status._id.toString())
resolver.update(contentUri, values, where, whereArgs)
val where = Expression.equals(Statuses._ID, status._id).sql
resolver.update(contentUri, values, where, null)
return true
}
else -> return MenuUtils.handleStatusClick(activity, this, fragmentManager,

View File

@ -638,12 +638,12 @@ class AccountsDashboardFragment : BaseFragment(), LoaderCallbacks<AccountsInfo>,
}
override fun loadInBackground(): AccountsInfo {
return loadAccountsInfo()
return loadAccountsInfo(true)
}
override fun onForceLoad() {
if (firsSyncLoad && firstLoad) {
deliverResult(loadAccountsInfo())
deliverResult(loadAccountsInfo(false))
return
}
super.onForceLoad()
@ -702,9 +702,14 @@ class AccountsDashboardFragment : BaseFragment(), LoaderCallbacks<AccountsInfo>,
cancelLoad()
}
private fun loadAccountsInfo(): AccountsInfo {
private fun loadAccountsInfo(loadFromDb: Boolean): AccountsInfo {
val accounts = AccountUtils.getAllAccountDetails(AccountManager.get(context), true)
val draftsCount = DataStoreUtils.queryCount(context.contentResolver, Drafts.CONTENT_URI_UNSENT, null, null)
val draftsCount = if (loadFromDb) {
DataStoreUtils.queryCount(context.contentResolver, Drafts.CONTENT_URI_UNSENT, null,
null)
} else {
-1
}
return AccountsInfo(accounts, draftsCount)
}
}

View File

@ -378,9 +378,9 @@ class CustomTabsFragment : BaseFragment(), LoaderCallbacks<Cursor?>, MultiChoice
val valuesCreator = ObjectCursor.valuesCreatorFrom(Tab::class.java)
when (tag) {
TAG_EDIT_TAB -> {
val where = Expression.equalsArgs(Tabs._ID).sql
val whereArgs = arrayOf(tab.id.toString())
context.contentResolver.update(Tabs.CONTENT_URI, valuesCreator.create(tab), where, whereArgs)
val where = Expression.equals(Tabs._ID, tab.id).sql
context.contentResolver.update(Tabs.CONTENT_URI, valuesCreator.create(tab),
where, null)
}
TAG_ADD_TAB -> {
context.contentResolver.insert(Tabs.CONTENT_URI, valuesCreator.create(tab))

View File

@ -211,13 +211,10 @@ class DraftsFragment : BaseFragment(), LoaderCallbacks<Cursor?>, OnItemClickList
}
}
if (deleteDraft) {
val draftIdString = draft._id.toString()
val where = Expression.equalsArgs(Drafts._ID).sql
val whereArgs = arrayOf(draftIdString)
val cr = context.contentResolver
cr.delete(Drafts.CONTENT_URI, where, whereArgs)
cr.delete(Drafts.CONTENT_URI_NOTIFICATIONS.withAppendedPath(draftIdString), null, null)
cr.delete(Drafts.CONTENT_URI, Expression.equals(Drafts._ID, draft._id).sql, null)
cr.delete(Drafts.CONTENT_URI_NOTIFICATIONS.withAppendedPath(draft._id.toString()),
null, null)
}
}

View File

@ -79,7 +79,7 @@ class TrendsSuggestionsFragment : AbsContentListViewFragment<TrendsAdapter>(), L
val uri = CachedTrends.Local.CONTENT_URI
val loaderWhere = Expression.and(Expression.equalsArgs(CachedTrends.ACCOUNT_KEY),
Expression.equalsArgs(CachedTrends.WOEID)).sql
val loaderWhereArgs = arrayOf(accountKey?.toString() ?: "", woeId.toString())
val loaderWhereArgs = arrayOf(accountKey?.toString()?.orEmpty(), woeId.toString())
return CursorLoader(activity, uri, CachedTrends.COLUMNS, loaderWhere, loaderWhereArgs, CachedTrends.TREND_ORDER)
}

View File

@ -258,10 +258,9 @@ abstract class BaseFiltersFragment : AbsContentListViewFragment<SimpleCursorAdap
if (id >= 0) {
val valueWhere = Expression.equalsArgs(Filters.VALUE).sql
val valueWhereArgs = arrayOf(text)
val idWhere = Expression.equalsArgs(Filters._ID).sql
val idWhereArgs = arrayOf(id.toString())
if (DataStoreUtils.queryCount(resolver, uri, valueWhere, valueWhereArgs) == 0) {
resolver.update(uri, values, idWhere, idWhereArgs)
val idWhere = Expression.equals(Filters._ID, id).sql
resolver.update(uri, values, idWhere, null)
} else {
Toast.makeText(context, R.string.message_toast_duplicate_filter_rule,
Toast.LENGTH_SHORT).show()

View File

@ -101,9 +101,14 @@ class MessagesEntriesFragment : AbsContentListRecyclerViewFragment<MessagesEntri
val qb = SQLQueryBuilder.select(Columns(*projection))
qb.from(Table(Conversations.TABLE_NAME))
qb.join(Join(false, Join.Operation.LEFT_OUTER, Table(Messages.TABLE_NAME),
Expression.equals(
Column(Table(Conversations.TABLE_NAME), Conversations.CONVERSATION_ID),
Column(Table(Messages.TABLE_NAME), Messages.CONVERSATION_ID)
Expression.and(
Expression.equals(
Column(Table(Conversations.TABLE_NAME), Conversations.CONVERSATION_ID),
Column(Table(Messages.TABLE_NAME), Messages.CONVERSATION_ID)
),
Expression.equals(
Column(Table(Conversations.TABLE_NAME), Conversations.ACCOUNT_KEY),
Column(Table(Messages.TABLE_NAME), Messages.ACCOUNT_KEY))
)
))
qb.where(Expression.inArgs(Column(Table(Conversations.TABLE_NAME), Conversations.ACCOUNT_KEY), accountKeys.size))

View File

@ -34,7 +34,7 @@ import org.mariotaku.twidere.util.content.ContentResolverUtils
object ParcelableRelationshipUtils {
fun create(accountKey: UserKey, userKey: UserKey, relationship: Relationship?,
filtering: Boolean = false): ParcelableRelationship {
filtering: Boolean = false): ParcelableRelationship {
val obj = ParcelableRelationship()
obj.account_key = accountKey
obj.user_key = userKey
@ -69,7 +69,7 @@ object ParcelableRelationshipUtils {
}
fun create(accountKey: UserKey, userKey: UserKey, user: User,
filtering: Boolean = false): ParcelableRelationship {
filtering: Boolean = false): ParcelableRelationship {
val obj = ParcelableRelationship()
obj.account_key = accountKey
obj.user_key = userKey
@ -93,9 +93,8 @@ object ParcelableRelationshipUtils {
relationships.forEach {
if (it._id > 0) {
val values = valuesCreator.create(it)
val where = Expression.equalsArgs(CachedRelationships._ID).sql
val whereArgs = arrayOf(it._id.toString())
cr.update(CachedRelationships.CONTENT_URI, values, where, whereArgs)
val where = Expression.equals(CachedRelationships._ID, it._id).sql
cr.update(CachedRelationships.CONTENT_URI, values, where, null)
} else {
insertItems.add(it)
}

View File

@ -350,9 +350,8 @@ class StreamingService : BaseService() {
.create(curActivity)
val resolver = context.contentResolver
if (updateId > 0) {
val where = Expression.equalsArgs(Activities._ID).sql
val whereArgs = arrayOf(updateId.toString())
resolver.update(Activities.AboutMe.CONTENT_URI, values, where, whereArgs)
val where = Expression.equals(Activities._ID, updateId).sql
resolver.update(Activities.AboutMe.CONTENT_URI, values, where, null)
curActivity._id = updateId
} else {
val uri = resolver.insert(Activities.AboutMe.CONTENT_URI, values)
@ -387,8 +386,8 @@ class StreamingService : BaseService() {
val userKey = UserKeyUtils.fromUser(user)
val where = Expression.and(Expression.equalsArgs(CachedRelationships.ACCOUNT_KEY),
Expression.equalsArgs(CachedRelationships.USER_KEY),
Expression.equalsArgs(CachedRelationships.NOTIFICATIONS_ENABLED)).sql
val whereArgs = arrayOf(account.key.toString(), userKey.toString(), "1")
Expression.equals(CachedRelationships.NOTIFICATIONS_ENABLED, 1)).sql
val whereArgs = arrayOf(account.key.toString(), userKey.toString())
if (DataStoreUtils.queryCount(context.contentResolver, CachedRelationships.CONTENT_URI,
where, whereArgs) <= 0) return

View File

@ -78,10 +78,9 @@ class UpdateAccountInfoTask(
}
tabsCursor.moveToNext()
}
val where = Expression.equalsArgs(Tabs._ID).sql
for (i in 0 until values.size()) {
val whereArgs = arrayOf(values.keyAt(i).toString())
resolver.update(Tabs.CONTENT_URI, values.valueAt(i), where, whereArgs)
val where = Expression.equals(Tabs._ID, values.keyAt(i)).sql
resolver.update(Tabs.CONTENT_URI, values.valueAt(i), where, null)
}
} catch (e: IOException) {
// Ignore

View File

@ -157,16 +157,17 @@ abstract class GetActivitiesTask(
}
var olderCount = -1
if (minPositionKey > 0) {
olderCount = DataStoreUtils.getActivitiesCount(context, contentUri, minPositionKey,
Activities.POSITION_KEY, false, arrayOf(details.key))
olderCount = DataStoreUtils.getActivitiesCount(context, contentUri, Activities.POSITION_KEY,
minPositionKey, false, arrayOf(details.key))
}
val writeUri = UriUtils.appendQueryParameters(contentUri, QUERY_PARAM_NOTIFY_CHANGE, notify)
if (deleteBound[0] > 0 && deleteBound[1] > 0) {
val where = Expression.and(
Expression.equalsArgs(Activities.ACCOUNT_KEY),
Expression.greaterEqualsArgs(Activities.MIN_SORT_POSITION),
Expression.lesserEqualsArgs(Activities.MAX_SORT_POSITION))
val whereArgs = arrayOf(details.key.toString(), deleteBound[0].toString(), deleteBound[1].toString())
Expression.greaterEquals(Activities.MIN_SORT_POSITION, deleteBound[0]),
Expression.lesserEquals(Activities.MAX_SORT_POSITION, deleteBound[1])
)
val whereArgs = arrayOf(details.key.toString())
// First item after gap doesn't count
val localDeleted = if (maxId != null && sinceId == null) 1 else 0
val rowsDeleted = cr.delete(writeUri, where.sql, whereArgs) - localDeleted
@ -186,9 +187,8 @@ abstract class GetActivitiesTask(
if (params.extraId != -1L) {
val noGapValues = ContentValues()
noGapValues.put(Activities.IS_GAP, false)
val noGapWhere = Expression.equalsArgs(Activities._ID).sql
val noGapWhereArgs = arrayOf(params.extraId.toString())
cr.update(writeUri, noGapValues, noGapWhere, noGapWhereArgs)
val noGapWhere = Expression.equals(Activities._ID, params.extraId).sql
cr.update(writeUri, noGapValues, noGapWhere, null)
}
} else {
return GetStatusesTask.ERROR_LOAD_GAP

View File

@ -191,7 +191,7 @@ abstract class GetStatusesTask(
var olderCount = -1
if (minPositionKey > 0) {
olderCount = DataStoreUtils.getStatusesCount(context, preferences, uri, null,
minPositionKey, Statuses.POSITION_KEY, false, arrayOf(accountKey))
Statuses.POSITION_KEY, minPositionKey, false, arrayOf(accountKey))
}
val rowsDeleted = resolver.delete(writeUri, deleteWhere, deleteWhereArgs)

View File

@ -163,8 +163,7 @@ class UpdateStatusTask(
private fun deleteOrUpdateDraft(update: ParcelableStatusUpdate, result: UpdateStatusResult,
draftId: Long) {
val where = Expression.equalsArgs(Drafts._ID).sql
val whereArgs = arrayOf(draftId.toString())
val where = Expression.equals(Drafts._ID, draftId).sql
var hasError = false
val failedAccounts = ArrayList<UserKey>()
for (i in update.accounts.indices) {
@ -178,10 +177,10 @@ class UpdateStatusTask(
if (hasError) {
val values = ContentValues()
values.put(Drafts.ACCOUNT_KEYS, failedAccounts.joinToString(","))
cr.update(Drafts.CONTENT_URI, values, where, whereArgs)
cr.update(Drafts.CONTENT_URI, values, where, null)
// TODO show error message
} else {
cr.delete(Drafts.CONTENT_URI, where, whereArgs)
cr.delete(Drafts.CONTENT_URI, where, null)
}
}
@ -1019,9 +1018,8 @@ class UpdateStatusTask(
}
fun deleteDraft(context: Context, id: Long) {
val where = Expression.equalsArgs(Drafts._ID).sql
val whereArgs = arrayOf(id.toString())
context.contentResolver.delete(Drafts.CONTENT_URI, where, whereArgs)
val where = Expression.equals(Drafts._ID, id).sql
context.contentResolver.delete(Drafts.CONTENT_URI, where, null)
}
fun AccountExtras.ImageLimit.check(width: Int, height: Int): Boolean {

View File

@ -26,6 +26,9 @@ import org.mariotaku.ktextension.useCursor
import org.mariotaku.library.objectcursor.ObjectCursor
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.sqliteqb.library.Columns
import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.sqliteqb.library.Table
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.ParcelableMessageConversation
import org.mariotaku.twidere.model.UserKey
@ -50,11 +53,15 @@ class BatchMarkMessageReadTask(
override fun onExecute(params: Unit?): Boolean {
val cr = context.contentResolver
val projection = Conversations.COLUMNS.map {
val projection = (Conversations.COLUMNS + Conversations.UNREAD_COUNT).map {
TwidereQueryBuilder.mapConversationsProjection(it)
}.toTypedArray()
val unreadWhere = Expression.greaterThan(Columns.Column(Table(Conversations.TABLE_NAME),
Conversations.LAST_READ_TIMESTAMP), markTimestampBefore)
val unreadHaving = Expression.greaterThan(Conversations.UNREAD_COUNT, 0)
val cur = cr.getUnreadMessagesEntriesCursor(projection, arrayOf(accountKey),
markTimestampBefore) ?: return false
unreadWhere, null, unreadHaving, null) ?: return false
val account = AccountUtils.getAccountDetails(AccountManager.get(context), accountKey, true) ?:
throw MicroBlogException("No account")

View File

@ -110,9 +110,8 @@ class MarkMessageReadTask(
values.put(Conversations.LAST_READ_TIMESTAMP, lastRead.second)
val updateWhere = Expression.and(Expression.equalsArgs(Conversations.ACCOUNT_KEY),
Expression.equalsArgs(Conversations.CONVERSATION_ID),
Expression.lesserThanArgs(Conversations.LAST_READ_TIMESTAMP)).sql
val updateWhereArgs = arrayOf(accountKey.toString(), conversationId,
lastRead.second.toString())
Expression.lesserThan(Conversations.LAST_READ_TIMESTAMP,lastRead.second)).sql
val updateWhereArgs = arrayOf(accountKey.toString(), conversationId)
cr.update(Conversations.CONTENT_URI, values, updateWhere, updateWhereArgs)
}

View File

@ -81,8 +81,8 @@ class ContentNotificationManager(
val accountKey = pref.accountKey
val resources = context.resources
val selection = Expression.and(Expression.equalsArgs(Statuses.ACCOUNT_KEY),
Expression.greaterThanArgs(Statuses.POSITION_KEY))
val selectionArgs = arrayOf(accountKey.toString(), minPositionKey.toString())
Expression.greaterThan(Statuses.POSITION_KEY, minPositionKey))
val selectionArgs = arrayOf(accountKey.toString())
val filteredSelection = buildStatusFilterWhereClause(preferences, Statuses.TABLE_NAME,
selection)
val userProjection = arrayOf(Statuses.USER_KEY, Statuses.USER_NAME, Statuses.USER_SCREEN_NAME)
@ -165,9 +165,9 @@ class ContentNotificationManager(
val accountKey = pref.accountKey
val where = Expression.and(
Expression.equalsArgs(Activities.ACCOUNT_KEY),
Expression.greaterThanArgs(Activities.POSITION_KEY)
Expression.greaterThan(Activities.POSITION_KEY, position)
).sql
val whereArgs = arrayOf(accountKey.toString(), position.toString())
val whereArgs = arrayOf(accountKey.toString())
@SuppressLint("Recycle")
val c = cr.query(Activities.AboutMe.CONTENT_URI, Activities.COLUMNS, where, whereArgs,
OrderBy(Activities.TIMESTAMP, false).sql) ?: return
@ -272,7 +272,9 @@ class ContentNotificationManager(
val projection = (Conversations.COLUMNS + Conversations.UNREAD_COUNT).map {
TwidereQueryBuilder.mapConversationsProjection(it)
}.toTypedArray()
val cur = cr.getUnreadMessagesEntriesCursor(projection, arrayOf(accountKey)) ?: return
val unreadHaving = Expression.greaterThan(Conversations.UNREAD_COUNT, 0)
val cur = cr.getUnreadMessagesEntriesCursor(projection, arrayOf(accountKey),
extraHaving = unreadHaving) ?: return
try {
if (cur.isEmpty) return
@ -281,12 +283,15 @@ class ContentNotificationManager(
var messageSum: Int = 0
var newLastReadTimestamp = -1L
cur.forEachRow { cur, _ ->
val unreadCount = cur.getInt(indices[Conversations.UNREAD_COUNT])
if (unreadCount <= 0) return@forEachRow false
if (newLastReadTimestamp != -1L) {
newLastReadTimestamp = cur.getLong(indices[Conversations.LAST_READ_TIMESTAMP])
}
messageSum += cur.getInt(indices[Conversations.UNREAD_COUNT])
messageSum += unreadCount
return@forEachRow true
}
if (messageSum == 0) return
val builder = NotificationCompat.Builder(context)
applyNotificationPreferences(builder, pref, pref.directMessagesNotificationType)

View File

@ -213,45 +213,55 @@ fun ContentResolver.updateActivity(uri: Uri, where: String?,
} finally {
c.close()
}
val updateWhere = Expression.equalsArgs(Activities._ID).sql
val updateWhereArgs = arrayOfNulls<String>(1)
for (i in 0 until values.size()) {
updateWhereArgs[0] = values.keyAt(i).toString()
update(uri, values.valueAt(i), updateWhere, updateWhereArgs)
val updateWhere = Expression.equals(Activities._ID, values.keyAt(i)).sql
update(uri, values.valueAt(i), updateWhere, null)
}
}
fun ContentResolver.getUnreadMessagesEntriesCursor(projection: Array<Columns.Column>,
accountKeys: Array<UserKey>, timestampBefore: Long = -1): Cursor? {
accountKeys: Array<UserKey>, extraWhere: Expression? = null,
extraWhereArgs: Array<String>? = null, extraHaving: Expression? = null,
extraHavingArgs: Array<String>? = null): Cursor? {
val qb = SQLQueryBuilder.select(Columns(*projection))
qb.from(Table(Conversations.TABLE_NAME))
qb.join(Join(false, Join.Operation.LEFT_OUTER, Table(Messages.TABLE_NAME),
Expression.equals(
Column(Table(Conversations.TABLE_NAME), Conversations.CONVERSATION_ID),
Column(Table(Messages.TABLE_NAME), Messages.CONVERSATION_ID)
Expression.and(
Expression.equals(
Column(Table(Conversations.TABLE_NAME), Conversations.CONVERSATION_ID),
Column(Table(Messages.TABLE_NAME), Messages.CONVERSATION_ID)
),
Expression.equals(
Column(Table(Conversations.TABLE_NAME), Conversations.ACCOUNT_KEY),
Column(Table(Messages.TABLE_NAME), Messages.ACCOUNT_KEY)
)
)
))
val whereConditions = arrayOf(
Expression.inArgs(Column(Table(Conversations.TABLE_NAME), Conversations.ACCOUNT_KEY),
accountKeys.size),
Expression.notEqualsArgs(Column(Table(Conversations.TABLE_NAME), Conversations.IS_OUTGOING)),
Expression.lesserThan(Column(Table(Conversations.TABLE_NAME), Conversations.LAST_READ_TIMESTAMP),
Column(Table(Conversations.TABLE_NAME), Conversations.LOCAL_TIMESTAMP))
)
if (timestampBefore >= 0) {
val beforeCondition = Expression.greaterThan(Column(Table(Conversations.TABLE_NAME),
Conversations.LAST_READ_TIMESTAMP), RawSQLLang("?"))
qb.where(Expression.and(*(whereConditions + beforeCondition)))
if (extraWhere != null) {
qb.where(Expression.and(*(whereConditions + extraWhere)))
} else {
qb.where(Expression.and(*whereConditions))
}
qb.groupBy(Column(Table(Messages.TABLE_NAME), Messages.CONVERSATION_ID))
if (extraHaving != null) {
qb.having(extraHaving)
}
qb.orderBy(OrderBy(arrayOf(Column(Table(Conversations.TABLE_NAME), Conversations.LOCAL_TIMESTAMP),
Column(Table(Conversations.TABLE_NAME), Conversations.SORT_ID)), booleanArrayOf(false, false)))
val selectionArgs = if (timestampBefore >= 0) {
accountKeys.toStringArray() + timestampBefore.toString()
} else {
accountKeys.toStringArray()
var selectionArgs = accountKeys.toStringArray() + "1"
if (extraWhereArgs != null) {
selectionArgs += extraWhereArgs
}
if (extraHavingArgs != null) {
selectionArgs += extraHavingArgs
}
return rawQuery(qb.buildSQL(), selectionArgs)
}

View File

@ -317,7 +317,7 @@ object DataStoreUtils {
}
fun getStatusesCount(context: Context, preferences: SharedPreferences, uri: Uri,
extraArgs: Bundle?, compare: Long, compareColumn: String, greaterThan: Boolean,
extraArgs: Bundle?, compareColumn: String, compare: Long, greaterThan: Boolean,
accountKeys: Array<UserKey>?): Int {
val keys = accountKeys ?: getActivatedAccountKeys(context)
@ -330,11 +330,10 @@ object DataStoreUtils {
}
if (greaterThan) {
expressions.add(Expression.greaterThanArgs(compareColumn))
expressions.add(Expression.greaterThan(compareColumn, compare))
} else {
expressions.add(Expression.lesserThanArgs(compareColumn))
expressions.add(Expression.lesserThan(compareColumn, compare))
}
expressionArgs.add(compare.toString())
expressions.add(buildStatusFilterWhereClause(preferences, getTableNameByUri(uri)!!, null))
@ -349,38 +348,39 @@ object DataStoreUtils {
return queryCount(context.contentResolver, uri, selection.sql, expressionArgs.toTypedArray())
}
fun getActivitiesCount(context: Context, uri: Uri, compare: Long,
compareColumn: String, greaterThan: Boolean, accountKeys: Array<UserKey>?): Int {
fun getActivitiesCount(context: Context, uri: Uri, compareColumn: String,
compare: Long, greaterThan: Boolean, accountKeys: Array<UserKey>?): Int {
val keys = accountKeys ?: getActivatedAccountKeys(context)
val selection = Expression.and(
Expression.inArgs(Column(Activities.ACCOUNT_KEY), keys.size),
if (greaterThan) Expression.greaterThanArgs(compareColumn) else Expression.lesserThanArgs(compareColumn),
if (greaterThan) {
Expression.greaterThan(compareColumn, compare)
} else {
Expression.lesserThan(compareColumn, compare)
},
buildActivityFilterWhereClause(getTableNameByUri(uri)!!, null)
)
val whereArgs = arrayListOf<String>()
keys.mapTo(whereArgs) { it.toString() }
whereArgs.add(compare.toString())
return queryCount(context.contentResolver, uri, selection.sql, whereArgs.toTypedArray())
}
fun getActivitiesCount(context: Context, uri: Uri,
extraWhere: Expression?, extraWhereArgs: Array<String>?,
since: Long, sinceColumn: String, followingOnly: Boolean,
sinceColumn: String, since: Long, followingOnly: Boolean,
accountKeys: Array<UserKey>?): Int {
val keys = (accountKeys ?: getActivatedAccountKeys(context)).map { it.toString() }.toTypedArray()
val expressions = ArrayList<Expression>()
expressions.add(Expression.inArgs(Column(Activities.ACCOUNT_KEY), keys.size))
expressions.add(Expression.greaterThanArgs(sinceColumn))
expressions.add(Expression.greaterThan(sinceColumn, since))
expressions.add(buildActivityFilterWhereClause(getTableNameByUri(uri)!!, null))
if (extraWhere != null) {
expressions.add(extraWhere)
}
val selection = Expression.and(*expressions.toTypedArray())
val selectionArgs: Array<String>
var selectionArgs = keys
if (extraWhereArgs != null) {
selectionArgs = keys + since.toString() + extraWhereArgs
} else {
selectionArgs = keys + since.toString()
selectionArgs += extraWhereArgs
}
// If followingOnly option is on, we have to iterate over items
val resolver = context.contentResolver
@ -832,7 +832,7 @@ object DataStoreUtils {
}
}
return getActivitiesCount(context, Activities.AboutMe.CONTENT_URI, extraWhere, extraWhereArgs,
since, sinceColumn, followingOnly, accountIds)
sinceColumn, since, followingOnly, accountIds)
}
fun addToFilter(context: Context, users: Collection<ParcelableUser>, filterAnywhere: Boolean) {

View File

@ -132,9 +132,10 @@ abstract class FileBasedDraftsSyncAction<RemoteFileInfo>(val context: Context) :
for (index in 0 until updateLocalInfoList.size()) {
val draft = Draft()
if (draft.loadFromRemote(updateLocalInfoList.valueAt(index))) {
val where = Expression.equalsArgs(Drafts._ID).sql
val whereArgs = arrayOf(updateLocalInfoList.keyAt(index).toString())
context.contentResolver.update(Drafts.CONTENT_URI, creator.create(draft), where, whereArgs)
val _id = updateLocalInfoList.keyAt(index)
val where = Expression.equals(Drafts._ID, _id).sql
context.contentResolver.update(Drafts.CONTENT_URI, creator.create(draft), where,
null)
}
}
}