1
0
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:
Mariotaku Lee 2017-09-20 19:28:14 +08:00
parent c454a6d343
commit a683a25d34
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
17 changed files with 75 additions and 146 deletions

View File

@ -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',

View File

@ -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'
}
}

View File

@ -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

View File

@ -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))

View File

@ -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? {

View File

@ -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) {

View File

@ -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)

View File

@ -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)

View File

@ -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 {

View File

@ -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,

View File

@ -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)
}
}

View File

@ -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

View File

@ -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)

View File

@ -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) {

View File

@ -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)
}

View File

@ -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) {

View File

@ -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()
}
}