mirror of
https://github.com/TwidereProject/Twidere-Android
synced 2025-02-17 04:00:48 +01:00
updated lib version
improved cursor usage
This commit is contained in:
parent
c454a6d343
commit
a683a25d34
@ -44,7 +44,7 @@ subprojects {
|
||||
Kotlin : "${kotlinVersion}",
|
||||
SupportLib : '26.1.0',
|
||||
SupportTest : '1.0.0',
|
||||
MariotakuCommons : '0.9.19',
|
||||
MariotakuCommons : '0.9.20',
|
||||
RestFu : '0.9.60',
|
||||
ObjectCursor : '0.9.20',
|
||||
PlayServices : '11.2.2',
|
||||
|
@ -123,9 +123,10 @@ android {
|
||||
exclude 'META-INF/DEPENDENCIES'
|
||||
exclude 'META-INF/README'
|
||||
exclude 'META-INF/INDEX.LIST'
|
||||
exclude '/LICENSE-junit.txt'
|
||||
exclude '/sdk-version.txt'
|
||||
exclude '/generated-sources'
|
||||
exclude 'META-INF/maven'
|
||||
exclude 'generated-sources/'
|
||||
exclude 'LICENSE-junit.txt'
|
||||
exclude 'sdk-version.txt'
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -8,36 +8,28 @@ import java.util.*
|
||||
* Created by mariotaku on 16/6/29.
|
||||
*/
|
||||
|
||||
fun Cursor.safeMoveToPosition(pos: Int): Boolean {
|
||||
try {
|
||||
return moveToPosition(pos)
|
||||
} catch(e: IllegalStateException) {
|
||||
return false
|
||||
}
|
||||
fun Cursor.safeMoveToPosition(pos: Int) = try {
|
||||
moveToPosition(pos)
|
||||
} catch (e: IllegalStateException) {
|
||||
false
|
||||
}
|
||||
|
||||
fun Cursor.safeGetLong(columnIndex: Int, def: Long = -1): Long {
|
||||
try {
|
||||
return getLong(columnIndex)
|
||||
} catch(e: IllegalStateException) {
|
||||
return def
|
||||
}
|
||||
fun Cursor.safeGetLong(columnIndex: Int, def: Long = -1) = try {
|
||||
getLong(columnIndex)
|
||||
} catch (e: IllegalStateException) {
|
||||
def
|
||||
}
|
||||
|
||||
fun Cursor.safeGetInt(columnIndex: Int, def: Int = -1): Int {
|
||||
try {
|
||||
return getInt(columnIndex)
|
||||
} catch(e: IllegalStateException) {
|
||||
return def
|
||||
}
|
||||
fun Cursor.safeGetInt(columnIndex: Int, def: Int = -1) = try {
|
||||
getInt(columnIndex)
|
||||
} catch (e: IllegalStateException) {
|
||||
def
|
||||
}
|
||||
|
||||
fun Cursor.safeGetString(columnIndex: Int, def: String = ""): String {
|
||||
try {
|
||||
return getString(columnIndex)
|
||||
} catch(e: IllegalStateException) {
|
||||
return def
|
||||
}
|
||||
fun Cursor.safeGetString(columnIndex: Int, def: String = "") = try {
|
||||
getString(columnIndex)
|
||||
} catch (e: IllegalStateException) {
|
||||
def
|
||||
}
|
||||
|
||||
fun <T> Cursor.map(indices: ObjectCursor.CursorIndices<T>): List<T> {
|
||||
@ -50,38 +42,6 @@ fun <T> Cursor.map(indices: ObjectCursor.CursorIndices<T>): List<T> {
|
||||
return list
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes the given [block] function on this resource and then closes it down correctly whether an exception
|
||||
* is thrown or not.
|
||||
*
|
||||
* @param block a function to process this closable resource.
|
||||
* @return the result of [block] function on this closable resource.
|
||||
*/
|
||||
inline fun <R> Cursor.useCursor(block: (Cursor) -> R): R {
|
||||
var closed = false
|
||||
try {
|
||||
return block(this)
|
||||
} catch (e: Exception) {
|
||||
closed = true
|
||||
try {
|
||||
this.close()
|
||||
} catch (closeException: Exception) {
|
||||
// eat the closeException as we are already throwing the original cause
|
||||
// and we don't want to mask the real exception
|
||||
|
||||
// TODO on Java 7 we should call
|
||||
// e.addSuppressed(closeException)
|
||||
// to work like try-with-resources
|
||||
// http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html#suppressed-exceptions
|
||||
}
|
||||
throw e
|
||||
} finally {
|
||||
if (!closed) {
|
||||
this.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val Cursor.isEmpty: Boolean
|
||||
get() = count == 0
|
||||
|
||||
|
@ -70,7 +70,10 @@ import org.mariotaku.chameleon.ChameleonUtils
|
||||
import org.mariotaku.kpreferences.contains
|
||||
import org.mariotaku.kpreferences.get
|
||||
import org.mariotaku.kpreferences.set
|
||||
import org.mariotaku.ktextension.*
|
||||
import org.mariotaku.ktextension.addOnAccountsUpdatedListenerSafe
|
||||
import org.mariotaku.ktextension.coerceInOr
|
||||
import org.mariotaku.ktextension.contains
|
||||
import org.mariotaku.ktextension.removeOnAccountsUpdatedListenerSafe
|
||||
import org.mariotaku.sqliteqb.library.Expression
|
||||
import org.mariotaku.twidere.Constants.*
|
||||
import org.mariotaku.twidere.R
|
||||
@ -985,9 +988,9 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
|
||||
TwidereQueryBuilder.mapConversationsProjection(it)
|
||||
}.toTypedArray()
|
||||
val unreadHaving = Expression.greaterThan(Conversations.UNREAD_COUNT, 0)
|
||||
val count = context.contentResolver.getUnreadMessagesEntriesCursor(projection,
|
||||
accountKeys, extraHaving = unreadHaving)?.useCursor { cur ->
|
||||
return@useCursor cur.count
|
||||
val count = context.contentResolver.getUnreadMessagesEntriesCursorReference(projection,
|
||||
accountKeys, extraHaving = unreadHaving)?.use { (cur) ->
|
||||
return@use cur.count
|
||||
} ?: -1
|
||||
result.put(i, count)
|
||||
publishProgress(TabBadge(i, count))
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
package org.mariotaku.twidere.adapter
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.database.Cursor
|
||||
@ -118,10 +117,8 @@ class UserAutoCompleteAdapter(
|
||||
val ascending = booleanArrayOf(false, false, true, true)
|
||||
val orderBy = OrderBy(order, ascending)
|
||||
val uri = Uri.withAppendedPath(CachedUsers.CONTENT_URI_WITH_SCORE, accountKey.toString())
|
||||
@SuppressLint("Recycle")
|
||||
val cursor = context.contentResolver.query(uri, CachedUsers.COLUMNS, usersSelection.sql,
|
||||
return context.contentResolver.query(uri, CachedUsers.COLUMNS, usersSelection.sql,
|
||||
selectionArgs, orderBy.sql)
|
||||
return cursor
|
||||
}
|
||||
|
||||
override fun swapCursor(cursor: Cursor?): Cursor? {
|
||||
|
@ -1,6 +1,5 @@
|
||||
package org.mariotaku.twidere.fragment.filter
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Activity
|
||||
import android.app.Dialog
|
||||
import android.content.Context
|
||||
@ -221,14 +220,13 @@ class FiltersSubscriptionsFragment : BaseFragment(), LoaderManager.LoaderCallbac
|
||||
actionMode = null
|
||||
}
|
||||
|
||||
@SuppressLint("Recycle")
|
||||
private fun performDeletion() {
|
||||
val ids = listView.checkedItemIds
|
||||
val resolver = context.contentResolver
|
||||
val where = Expression.inArgs(Filters.Subscriptions._ID, ids.size).sql
|
||||
val whereArgs = ids.toStringArray()
|
||||
resolver.query(Filters.Subscriptions.CONTENT_URI, Filters.Subscriptions.COLUMNS, where,
|
||||
whereArgs, null)?.useCursor { cursor ->
|
||||
resolver.queryReference(Filters.Subscriptions.CONTENT_URI, Filters.Subscriptions.COLUMNS, where,
|
||||
whereArgs, null)?.use { (cursor) ->
|
||||
val indices = ObjectCursor.indicesFrom(cursor, FiltersSubscription::class.java)
|
||||
cursor.moveToFirst()
|
||||
while (!cursor.isAfterLast) {
|
||||
|
@ -57,7 +57,6 @@ import org.mariotaku.kpreferences.get
|
||||
import org.mariotaku.ktextension.mapToArray
|
||||
import org.mariotaku.ktextension.setItemAvailability
|
||||
import org.mariotaku.ktextension.spannable
|
||||
import org.mariotaku.ktextension.useCursor
|
||||
import org.mariotaku.library.objectcursor.ObjectCursor
|
||||
import org.mariotaku.microblog.library.MicroBlog
|
||||
import org.mariotaku.microblog.library.MicroBlogException
|
||||
@ -77,11 +76,8 @@ import org.mariotaku.twidere.constant.IntentConstants.*
|
||||
import org.mariotaku.twidere.constant.nameFirstKey
|
||||
import org.mariotaku.twidere.constant.profileImageStyleKey
|
||||
import org.mariotaku.twidere.exception.UnsupportedCountIndexException
|
||||
import org.mariotaku.twidere.extension.applyTheme
|
||||
import org.mariotaku.twidere.extension.getDirectMessageMaxParticipants
|
||||
import org.mariotaku.twidere.extension.loadProfileImage
|
||||
import org.mariotaku.twidere.extension.*
|
||||
import org.mariotaku.twidere.extension.model.*
|
||||
import org.mariotaku.twidere.extension.onShow
|
||||
import org.mariotaku.twidere.extension.view.calculateSpaceItemHeight
|
||||
import org.mariotaku.twidere.fragment.BaseDialogFragment
|
||||
import org.mariotaku.twidere.fragment.BaseFragment
|
||||
@ -491,8 +487,8 @@ class MessageConversationInfoFragment : BaseFragment(), IToolBarSupportFragment,
|
||||
val where = Expression.and(Expression.equalsArgs(Conversations.ACCOUNT_KEY),
|
||||
Expression.equalsArgs(Conversations.CONVERSATION_ID)).sql
|
||||
val whereArgs = arrayOf(accountKey.toString(), conversationId)
|
||||
context.contentResolver.query(Conversations.CONTENT_URI, Conversations.COLUMNS, where,
|
||||
whereArgs, null).useCursor { cur ->
|
||||
context.contentResolver.queryReference(Conversations.CONTENT_URI, Conversations.COLUMNS, where,
|
||||
whereArgs, null)?.use { (cur) ->
|
||||
if (cur.moveToFirst()) {
|
||||
val indices = ObjectCursor.indicesFrom(cur, ParcelableMessageConversation::class.java)
|
||||
return indices.newObject(cur)
|
||||
|
@ -1,11 +1,11 @@
|
||||
package org.mariotaku.twidere.loader
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import org.mariotaku.library.objectcursor.ObjectCursor
|
||||
import org.mariotaku.microblog.library.twitter.model.Paging
|
||||
import org.mariotaku.sqliteqb.library.Columns
|
||||
import org.mariotaku.sqliteqb.library.Expression
|
||||
import org.mariotaku.twidere.extension.queryReference
|
||||
import org.mariotaku.twidere.loader.users.UserSearchLoader
|
||||
import org.mariotaku.twidere.model.AccountDetails
|
||||
import org.mariotaku.twidere.model.ParcelableUser
|
||||
@ -49,18 +49,17 @@ class CacheUserSearchLoader(
|
||||
Expression.likeRaw(Columns.Column(CachedUsers.NAME), "?||'%'", "^"),
|
||||
Expression.inArgs(Columns.Column(CachedUsers.USER_KEY), nicknameKeys.size)))
|
||||
val selectionArgs = arrayOf(details.type, queryEscaped, queryEscaped, *nicknameKeys)
|
||||
@SuppressLint("Recycle")
|
||||
val c = context.contentResolver.query(CachedUsers.CONTENT_URI, CachedUsers.BASIC_COLUMNS,
|
||||
selection.sql, selectionArgs, null)!!
|
||||
val i = ObjectCursor.indicesFrom(c, ParcelableUser::class.java)
|
||||
c.moveToFirst()
|
||||
while (!c.isAfterLast) {
|
||||
if (list.none { it.key.toString() == c.getString(i[CachedUsers.USER_KEY]) }) {
|
||||
list.add(i.newObject(c))
|
||||
context.contentResolver.queryReference(CachedUsers.CONTENT_URI, CachedUsers.BASIC_COLUMNS,
|
||||
selection.sql, selectionArgs, null)?.use { (c) ->
|
||||
val i = ObjectCursor.indicesFrom(c, ParcelableUser::class.java)
|
||||
c.moveToFirst()
|
||||
while (!c.isAfterLast) {
|
||||
if (list.none { it.key.toString() == c.getString(i[CachedUsers.USER_KEY]) }) {
|
||||
list.add(i.newObject(c))
|
||||
}
|
||||
c.moveToNext()
|
||||
}
|
||||
c.moveToNext()
|
||||
}
|
||||
c.close()
|
||||
val collator = Collator.getInstance()
|
||||
list.sortWith(Comparator { l, r ->
|
||||
val compare = collator.compare(r.name, l.name)
|
||||
|
@ -20,7 +20,6 @@
|
||||
package org.mariotaku.twidere.service
|
||||
|
||||
import android.accounts.AccountManager
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Notification
|
||||
import android.app.Service
|
||||
import android.content.Context
|
||||
@ -40,8 +39,6 @@ import org.mariotaku.abstask.library.ManualTaskStarter
|
||||
import org.mariotaku.kpreferences.get
|
||||
import org.mariotaku.ktextension.getNullableTypedArrayExtra
|
||||
import org.mariotaku.ktextension.toLongOr
|
||||
import org.mariotaku.ktextension.useCursor
|
||||
import org.mariotaku.library.objectcursor.ObjectCursor
|
||||
import org.mariotaku.microblog.library.MicroBlogException
|
||||
import org.mariotaku.microblog.library.twitter.TwitterUpload
|
||||
import org.mariotaku.microblog.library.twitter.model.MediaUploadResponse
|
||||
@ -55,6 +52,7 @@ import org.mariotaku.twidere.TwidereConstants.*
|
||||
import org.mariotaku.twidere.constant.refreshAfterTweetKey
|
||||
import org.mariotaku.twidere.extension.getErrorMessage
|
||||
import org.mariotaku.twidere.extension.model.notificationBuilder
|
||||
import org.mariotaku.twidere.extension.queryOne
|
||||
import org.mariotaku.twidere.extension.withAppendedPath
|
||||
import org.mariotaku.twidere.model.*
|
||||
import org.mariotaku.twidere.model.draft.SendDirectMessageActionExtras
|
||||
@ -119,12 +117,8 @@ class LengthyOperationsService : BaseIntentService("lengthy_operations") {
|
||||
val draftId = uri.lastPathSegment.toLongOr(-1L)
|
||||
if (draftId == -1L) return
|
||||
val where = Expression.equals(Drafts._ID, draftId)
|
||||
@SuppressLint("Recycle")
|
||||
val draft: Draft = contentResolver.query(Drafts.CONTENT_URI, Drafts.COLUMNS, where.sql, null, null)?.useCursor {
|
||||
val i = ObjectCursor.indicesFrom(it, Draft::class.java)
|
||||
if (!it.moveToFirst()) return@useCursor null
|
||||
return@useCursor i.newObject(it)
|
||||
} ?: return
|
||||
val draft: Draft = contentResolver.queryOne(Drafts.CONTENT_URI, Drafts.COLUMNS, where.sql,
|
||||
null, null, cls = Draft::class.java) ?: return
|
||||
|
||||
contentResolver.delete(Drafts.CONTENT_URI, where.sql, null)
|
||||
if (TextUtils.isEmpty(draft.action_type)) {
|
||||
@ -162,7 +156,6 @@ class LengthyOperationsService : BaseIntentService("lengthy_operations") {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("Recycle")
|
||||
private fun handleDiscardDraftIntent(intent: Intent) {
|
||||
val data = intent.data ?: return
|
||||
task {
|
||||
|
@ -1,6 +1,5 @@
|
||||
package org.mariotaku.twidere.task.cache
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.support.v4.util.ArraySet
|
||||
import org.mariotaku.ktextension.ContentValues
|
||||
@ -38,7 +37,6 @@ class CacheTimelineResultTask(
|
||||
val selectionArgsList = users.mapTo(mutableListOf(account.key.toString())) {
|
||||
it.key.toString()
|
||||
}
|
||||
@SuppressLint("Recycle")
|
||||
val localRelationships = cr.queryAll(CachedRelationships.CONTENT_URI, CachedRelationships.COLUMNS,
|
||||
Expression.and(Expression.equalsArgs(CachedRelationships.ACCOUNT_KEY),
|
||||
Expression.inArgs(CachedRelationships.USER_KEY, users.size)).sql,
|
||||
|
@ -1,14 +1,13 @@
|
||||
package org.mariotaku.twidere.task.filter
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.ContentResolver
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import org.mariotaku.abstask.library.AbstractTask
|
||||
import org.mariotaku.ktextension.useCursor
|
||||
import org.mariotaku.library.objectcursor.ObjectCursor
|
||||
import org.mariotaku.sqliteqb.library.Expression
|
||||
import org.mariotaku.twidere.extension.model.instantiateComponent
|
||||
import org.mariotaku.twidere.extension.queryReference
|
||||
import org.mariotaku.twidere.model.FiltersData
|
||||
import org.mariotaku.twidere.model.FiltersSubscription
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Filters
|
||||
@ -20,11 +19,11 @@ import java.util.*
|
||||
|
||||
class RefreshFiltersSubscriptionsTask(val context: Context) : AbstractTask<Unit?, Boolean, (Boolean) -> Unit>() {
|
||||
|
||||
@SuppressLint("Recycle")
|
||||
override fun doLongOperation(param: Unit?): Boolean {
|
||||
val resolver = context.contentResolver
|
||||
val sourceIds = ArrayList<Long>()
|
||||
resolver.query(Filters.Subscriptions.CONTENT_URI, Filters.Subscriptions.COLUMNS, null, null, null)?.useCursor { cursor ->
|
||||
resolver.queryReference(Filters.Subscriptions.CONTENT_URI, Filters.Subscriptions.COLUMNS,
|
||||
null, null, null)?.use { (cursor) ->
|
||||
val indices = ObjectCursor.indicesFrom(cursor, FiltersSubscription::class.java)
|
||||
cursor.moveToFirst()
|
||||
while (!cursor.isAfterLast) {
|
||||
@ -75,8 +74,8 @@ class RefreshFiltersSubscriptionsTask(val context: Context) : AbstractTask<Unit?
|
||||
items?.map { item ->
|
||||
item.source = sourceId
|
||||
return@map creator.create(item)
|
||||
}?.let { items ->
|
||||
ContentResolverUtils.bulkInsert(resolver, Filters.Users.CONTENT_URI, items)
|
||||
}?.let {
|
||||
ContentResolverUtils.bulkInsert(resolver, Filters.Users.CONTENT_URI, it)
|
||||
}
|
||||
}
|
||||
|
||||
@ -87,8 +86,8 @@ class RefreshFiltersSubscriptionsTask(val context: Context) : AbstractTask<Unit?
|
||||
items?.map { item ->
|
||||
item.source = sourceId
|
||||
return@map creator.create(item)
|
||||
}?.let { items ->
|
||||
ContentResolverUtils.bulkInsert(resolver, uri, items)
|
||||
}?.let {
|
||||
ContentResolverUtils.bulkInsert(resolver, uri, it)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -22,7 +22,6 @@ package org.mariotaku.twidere.task.twitter.message
|
||||
import android.accounts.AccountManager
|
||||
import android.content.Context
|
||||
import org.mariotaku.ktextension.forEachRow
|
||||
import org.mariotaku.ktextension.useCursor
|
||||
import org.mariotaku.library.objectcursor.ObjectCursor
|
||||
import org.mariotaku.microblog.library.MicroBlog
|
||||
import org.mariotaku.microblog.library.MicroBlogException
|
||||
@ -37,7 +36,7 @@ import org.mariotaku.twidere.model.util.AccountUtils
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Messages.Conversations
|
||||
import org.mariotaku.twidere.task.ExceptionHandlingAbstractTask
|
||||
import org.mariotaku.twidere.util.TwidereQueryBuilder
|
||||
import org.mariotaku.twidere.util.getUnreadMessagesEntriesCursor
|
||||
import org.mariotaku.twidere.util.getUnreadMessagesEntriesCursorReference
|
||||
|
||||
/**
|
||||
* Created by mariotaku on 2017/2/16.
|
||||
@ -60,16 +59,16 @@ class BatchMarkMessageReadTask(
|
||||
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),
|
||||
unreadWhere, null, unreadHaving, null) ?: return false
|
||||
|
||||
val cRef = cr.getUnreadMessagesEntriesCursorReference(projection, arrayOf(accountKey),
|
||||
unreadWhere, null, unreadHaving, null) ?: return false
|
||||
val account = AccountUtils.getAccountDetails(AccountManager.get(context), accountKey, true) ?:
|
||||
throw MicroBlogException("No account")
|
||||
val microBlog = account.newMicroBlogInstance(context, cls = MicroBlog::class.java)
|
||||
cur.useCursor {
|
||||
cRef.use { (cur) ->
|
||||
val indices = ObjectCursor.indicesFrom(cur, ParcelableMessageConversation::class.java)
|
||||
cur.forEachRow { cur, _ ->
|
||||
val conversation = indices.newObject(cur)
|
||||
cur.forEachRow { c, _ ->
|
||||
val conversation = indices.newObject(c)
|
||||
try {
|
||||
val lastReadEvent = MarkMessageReadTask.performMarkRead(context, microBlog,
|
||||
account, conversation) ?: return@forEachRow false
|
||||
|
@ -21,11 +21,11 @@ package org.mariotaku.twidere.task.twitter.message
|
||||
|
||||
import android.accounts.AccountManager
|
||||
import android.content.Context
|
||||
import org.mariotaku.ktextension.useCursor
|
||||
import org.mariotaku.microblog.library.MicroBlog
|
||||
import org.mariotaku.microblog.library.MicroBlogException
|
||||
import org.mariotaku.sqliteqb.library.Expression
|
||||
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
|
||||
import org.mariotaku.twidere.extension.queryReference
|
||||
import org.mariotaku.twidere.model.UserKey
|
||||
import org.mariotaku.twidere.model.util.AccountUtils
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Messages
|
||||
@ -53,8 +53,8 @@ class ClearMessagesTask(
|
||||
val messagesWhereArgs = arrayOf(accountKey.toString(), conversationId)
|
||||
val projection = arrayOf(Messages.MESSAGE_ID)
|
||||
val messageIds = mutableListOf<String>()
|
||||
context.contentResolver.query(Messages.CONTENT_URI, projection, messagesWhere,
|
||||
messagesWhereArgs, null)?.useCursor { cur ->
|
||||
context.contentResolver.queryReference(Messages.CONTENT_URI, projection, messagesWhere,
|
||||
messagesWhereArgs, null)?.use { (cur) ->
|
||||
cur.moveToFirst()
|
||||
while (!cur.isAfterLast) {
|
||||
val messageId = cur.getString(0)
|
||||
|
@ -20,14 +20,12 @@
|
||||
package org.mariotaku.twidere.task.twitter.message
|
||||
|
||||
import android.accounts.AccountManager
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.ContentValues
|
||||
import android.content.Context
|
||||
import org.mariotaku.commons.logansquare.LoganSquareMapperFinder
|
||||
import org.mariotaku.ktextension.mapToArray
|
||||
import org.mariotaku.ktextension.toIntOr
|
||||
import org.mariotaku.ktextension.toLongOr
|
||||
import org.mariotaku.ktextension.useCursor
|
||||
import org.mariotaku.library.objectcursor.ObjectCursor
|
||||
import org.mariotaku.microblog.library.MicroBlog
|
||||
import org.mariotaku.microblog.library.MicroBlogException
|
||||
@ -41,6 +39,7 @@ import org.mariotaku.twidere.annotation.AccountType
|
||||
import org.mariotaku.twidere.extension.model.*
|
||||
import org.mariotaku.twidere.extension.model.api.toParcelable
|
||||
import org.mariotaku.twidere.extension.queryCount
|
||||
import org.mariotaku.twidere.extension.queryReference
|
||||
import org.mariotaku.twidere.model.*
|
||||
import org.mariotaku.twidere.model.ParcelableMessageConversation.ConversationType
|
||||
import org.mariotaku.twidere.model.event.GetMessagesTaskEvent
|
||||
@ -499,15 +498,14 @@ class GetMessagesTask(
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("Recycle")
|
||||
internal fun MutableMap<String, ParcelableMessageConversation>.addLocalConversations(context: Context,
|
||||
accountKey: UserKey, conversationIds: Set<String>) {
|
||||
val newIds = conversationIds.filterNot { it in this.keys }
|
||||
val where = Expression.and(Expression.inArgs(Conversations.CONVERSATION_ID, newIds.size),
|
||||
Expression.equalsArgs(Conversations.ACCOUNT_KEY)).sql
|
||||
val whereArgs = newIds.toTypedArray() + accountKey.toString()
|
||||
return context.contentResolver.query(Conversations.CONTENT_URI, Conversations.COLUMNS,
|
||||
where, whereArgs, null).useCursor { cur ->
|
||||
context.contentResolver.queryReference(Conversations.CONTENT_URI, Conversations.COLUMNS,
|
||||
where, whereArgs, null)?.use { (cur) ->
|
||||
val indices = ObjectCursor.indicesFrom(cur, ParcelableMessageConversation::class.java)
|
||||
cur.moveToFirst()
|
||||
while (!cur.isAfterLast) {
|
||||
|
@ -1,6 +1,5 @@
|
||||
package org.mariotaku.twidere.util
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.ContentResolver
|
||||
import android.content.ContentValues
|
||||
import android.content.Context
|
||||
@ -15,18 +14,14 @@ import org.mariotaku.library.objectcursor.ObjectCursor
|
||||
import org.mariotaku.sqliteqb.library.*
|
||||
import org.mariotaku.sqliteqb.library.Columns.Column
|
||||
import org.mariotaku.twidere.extension.queryReference
|
||||
import org.mariotaku.twidere.extension.rawQuery
|
||||
import org.mariotaku.twidere.model.Draft
|
||||
import org.mariotaku.twidere.model.ParcelableActivity
|
||||
import org.mariotaku.twidere.model.ParcelableStatus
|
||||
import org.mariotaku.twidere.model.UserKey
|
||||
import org.mariotaku.twidere.extension.rawQueryReference
|
||||
import org.mariotaku.twidere.model.*
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.*
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Messages.Conversations
|
||||
import org.mariotaku.twidere.util.DataStoreUtils.ACTIVITIES_URIS
|
||||
import java.io.IOException
|
||||
|
||||
|
||||
@SuppressLint("Recycle")
|
||||
fun Context.deleteDrafts(draftIds: LongArray): Int {
|
||||
val where = Expression.inArgs(Drafts._ID, draftIds.size).sql
|
||||
val whereArgs = draftIds.mapToArray(Long::toString)
|
||||
@ -147,10 +142,10 @@ fun <T> ContentResolver.updateItems(uri: Uri, columns: Array<String>?, where: St
|
||||
}
|
||||
}
|
||||
|
||||
fun ContentResolver.getUnreadMessagesEntriesCursor(projection: Array<Columns.Column>,
|
||||
fun ContentResolver.getUnreadMessagesEntriesCursorReference(projection: Array<Columns.Column>,
|
||||
accountKeys: Array<UserKey>, extraWhere: Expression? = null,
|
||||
extraWhereArgs: Array<String>? = null, extraHaving: Expression? = null,
|
||||
extraHavingArgs: Array<String>? = null): Cursor? {
|
||||
extraHavingArgs: Array<String>? = null): CursorReference<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),
|
||||
@ -191,5 +186,5 @@ fun ContentResolver.getUnreadMessagesEntriesCursor(projection: Array<Columns.Col
|
||||
if (extraHavingArgs != null) {
|
||||
selectionArgs += extraHavingArgs
|
||||
}
|
||||
return rawQuery(qb.buildSQL(), selectionArgs)
|
||||
return rawQueryReference(qb.buildSQL(), selectionArgs)
|
||||
}
|
@ -20,7 +20,6 @@
|
||||
package org.mariotaku.twidere.util
|
||||
|
||||
import android.accounts.AccountManager
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.*
|
||||
import android.database.Cursor
|
||||
import android.net.Uri
|
||||
@ -31,7 +30,6 @@ import android.support.annotation.WorkerThread
|
||||
import android.text.TextUtils
|
||||
import org.mariotaku.kpreferences.get
|
||||
import org.mariotaku.ktextension.mapToArray
|
||||
import org.mariotaku.ktextension.useCursor
|
||||
import org.mariotaku.library.objectcursor.ObjectCursor
|
||||
import org.mariotaku.microblog.library.MicroBlog
|
||||
import org.mariotaku.microblog.library.MicroBlogException
|
||||
@ -54,7 +52,7 @@ import org.mariotaku.twidere.extension.model.api.toParcelable
|
||||
import org.mariotaku.twidere.extension.queryCount
|
||||
import org.mariotaku.twidere.extension.queryOne
|
||||
import org.mariotaku.twidere.extension.queryReference
|
||||
import org.mariotaku.twidere.extension.rawQuery
|
||||
import org.mariotaku.twidere.extension.rawQueryReference
|
||||
import org.mariotaku.twidere.model.*
|
||||
import org.mariotaku.twidere.model.tab.extra.HomeTabExtras
|
||||
import org.mariotaku.twidere.model.tab.extra.InteractionsTabExtras
|
||||
@ -740,7 +738,6 @@ object DataStoreUtils {
|
||||
})
|
||||
}
|
||||
|
||||
@SuppressLint("Recycle")
|
||||
private fun <T, I> getFieldsArray(
|
||||
context: Context, uri: Uri,
|
||||
keys: Array<UserKey?>, keyField: String,
|
||||
@ -769,7 +766,7 @@ object DataStoreUtils {
|
||||
if (sortExpression != null) {
|
||||
builder.orderBy(sortExpression)
|
||||
}
|
||||
resolver.rawQuery(builder.buildSQL(), bindingArgs)?.useCursor { cur ->
|
||||
resolver.rawQueryReference(builder.buildSQL(), bindingArgs)?.use { (cur) ->
|
||||
cur.moveToFirst()
|
||||
val colIdx = creator.newIndex(cur)
|
||||
while (!cur.isAfterLast) {
|
||||
|
@ -279,10 +279,8 @@ class ContentNotificationManager(
|
||||
TwidereQueryBuilder.mapConversationsProjection(it)
|
||||
}.toTypedArray()
|
||||
val unreadHaving = Expression.greaterThan(Conversations.UNREAD_COUNT, 0)
|
||||
val cur = cr.getUnreadMessagesEntriesCursor(projection, arrayOf(accountKey),
|
||||
extraHaving = unreadHaving) ?: return
|
||||
@Suppress("ConvertTryFinallyToUseCall")
|
||||
try {
|
||||
cr.getUnreadMessagesEntriesCursorReference(projection, arrayOf(accountKey),
|
||||
extraHaving = unreadHaving)?.use { (cur) ->
|
||||
if (cur.isEmpty) return
|
||||
|
||||
val indices = ObjectCursor.indicesFrom(cur, ParcelableMessageConversation::class.java)
|
||||
@ -337,8 +335,6 @@ class ContentNotificationManager(
|
||||
}
|
||||
val notificationId = Utils.getNotificationId(NOTIFICATION_ID_DIRECT_MESSAGES, accountKey)
|
||||
notificationManager.notify("direct_messages", notificationId, builder.build())
|
||||
} finally {
|
||||
cur.close()
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user