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:
parent
3e7483b076
commit
ad5a055ec7
@ -63,6 +63,7 @@ subprojects {
|
||||
ParcelablePlease : '1.0.2',
|
||||
Chameleon : '0.9.17',
|
||||
UniqR : '0.9',
|
||||
SQLiteQB : '0.9.15',
|
||||
]
|
||||
}
|
||||
|
||||
|
@ -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']}"
|
||||
|
@ -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))
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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))
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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))
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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")
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
}
|
@ -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) {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user