2017-01-12 17:26:44 +01:00
|
|
|
package org.mariotaku.twidere.task.filter
|
|
|
|
|
2017-01-28 08:15:35 +01:00
|
|
|
import android.annotation.SuppressLint
|
2017-01-12 17:26:44 +01:00
|
|
|
import android.content.ContentResolver
|
|
|
|
import android.content.Context
|
|
|
|
import android.net.Uri
|
|
|
|
import org.mariotaku.abstask.library.AbstractTask
|
|
|
|
import org.mariotaku.ktextension.useCursor
|
2017-03-05 09:08:09 +01:00
|
|
|
import org.mariotaku.library.objectcursor.ObjectCursor
|
2017-01-12 17:26:44 +01:00
|
|
|
import org.mariotaku.sqliteqb.library.Expression
|
|
|
|
import org.mariotaku.twidere.extension.model.instantiateComponent
|
|
|
|
import org.mariotaku.twidere.model.FiltersData
|
2017-03-05 09:08:09 +01:00
|
|
|
import org.mariotaku.twidere.model.FiltersSubscription
|
2017-01-12 17:26:44 +01:00
|
|
|
import org.mariotaku.twidere.provider.TwidereDataStore.Filters
|
2017-01-28 08:15:35 +01:00
|
|
|
import org.mariotaku.twidere.util.DebugLog
|
2017-01-12 17:26:44 +01:00
|
|
|
import org.mariotaku.twidere.util.content.ContentResolverUtils
|
2017-01-28 08:15:35 +01:00
|
|
|
import org.mariotaku.twidere.util.sync.LOGTAG_SYNC
|
2017-01-12 17:26:44 +01:00
|
|
|
import java.io.IOException
|
2017-01-28 08:15:35 +01:00
|
|
|
import java.util.*
|
2017-01-12 17:26:44 +01:00
|
|
|
|
|
|
|
class RefreshFiltersSubscriptionsTask(val context: Context) : AbstractTask<Unit?, Boolean, (Boolean) -> Unit>() {
|
|
|
|
|
2017-01-28 08:15:35 +01:00
|
|
|
@SuppressLint("Recycle")
|
2017-01-12 17:26:44 +01:00
|
|
|
override fun doLongOperation(param: Unit?): Boolean {
|
|
|
|
val resolver = context.contentResolver
|
2017-01-28 08:15:35 +01:00
|
|
|
val sourceIds = ArrayList<Long>()
|
|
|
|
resolver.query(Filters.Subscriptions.CONTENT_URI, Filters.Subscriptions.COLUMNS, null, null, null)?.useCursor { cursor ->
|
2017-03-05 09:08:09 +01:00
|
|
|
val indices = ObjectCursor.indicesFrom(cursor, FiltersSubscription::class.java)
|
2017-01-28 08:15:35 +01:00
|
|
|
cursor.moveToFirst()
|
|
|
|
while (!cursor.isAfterLast) {
|
2017-01-12 17:26:44 +01:00
|
|
|
val subscription = indices.newObject(cursor)
|
2017-01-28 08:15:35 +01:00
|
|
|
sourceIds.add(subscription.id)
|
|
|
|
val component = subscription.instantiateComponent(context)
|
|
|
|
if (component != null) {
|
|
|
|
try {
|
|
|
|
if (component.fetchFilters()) {
|
|
|
|
updateUserItems(resolver, component.users, subscription.id)
|
|
|
|
updateBaseItems(resolver, component.keywords, Filters.Keywords.CONTENT_URI, subscription.id)
|
|
|
|
updateBaseItems(resolver, component.links, Filters.Links.CONTENT_URI, subscription.id)
|
|
|
|
updateBaseItems(resolver, component.sources, Filters.Sources.CONTENT_URI, subscription.id)
|
|
|
|
}
|
|
|
|
} catch (e: IOException) {
|
|
|
|
DebugLog.w(LOGTAG_SYNC, "Unable to refresh filters", e)
|
2017-01-12 17:26:44 +01:00
|
|
|
}
|
|
|
|
}
|
2017-01-28 08:15:35 +01:00
|
|
|
cursor.moveToNext()
|
2017-01-12 17:26:44 +01:00
|
|
|
}
|
2017-01-28 08:15:35 +01:00
|
|
|
}
|
|
|
|
// Delete 'orphaned' filter items with `sourceId` > 0
|
|
|
|
val extraWhere = Expression.greaterThan(Filters.SOURCE, 0).sql
|
|
|
|
ContentResolverUtils.bulkDelete(resolver, Filters.Users.CONTENT_URI, Filters.Users.SOURCE,
|
2017-02-13 14:33:45 +01:00
|
|
|
true, sourceIds, extraWhere, null)
|
2017-01-28 08:15:35 +01:00
|
|
|
ContentResolverUtils.bulkDelete(resolver, Filters.Keywords.CONTENT_URI, Filters.Keywords.SOURCE,
|
2017-02-13 14:33:45 +01:00
|
|
|
true, sourceIds, extraWhere, null)
|
2017-01-28 08:15:35 +01:00
|
|
|
ContentResolverUtils.bulkDelete(resolver, Filters.Sources.CONTENT_URI, Filters.Sources.SOURCE,
|
2017-02-13 14:33:45 +01:00
|
|
|
true, sourceIds, extraWhere, null)
|
2017-01-28 08:15:35 +01:00
|
|
|
ContentResolverUtils.bulkDelete(resolver, Filters.Links.CONTENT_URI, Filters.Links.SOURCE,
|
2017-02-13 14:33:45 +01:00
|
|
|
true, sourceIds, extraWhere, null)
|
2017-01-28 08:15:35 +01:00
|
|
|
try {
|
|
|
|
Thread.sleep(1000)
|
|
|
|
} catch (e: InterruptedException) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
return true
|
2017-01-12 17:26:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun afterExecute(callback: ((Boolean) -> Unit)?, result: Boolean) {
|
|
|
|
callback?.invoke(result)
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun updateUserItems(resolver: ContentResolver, items: List<FiltersData.UserItem>?, sourceId: Long) {
|
|
|
|
resolver.delete(Filters.Users.CONTENT_URI, Expression.equalsArgs(Filters.Users.SOURCE).sql,
|
|
|
|
arrayOf(sourceId.toString()))
|
2017-03-05 09:08:09 +01:00
|
|
|
val creator = ObjectCursor.valuesCreatorFrom(FiltersData.UserItem::class.java)
|
2017-01-12 17:26:44 +01:00
|
|
|
items?.map { item ->
|
|
|
|
item.source = sourceId
|
2017-03-05 09:08:09 +01:00
|
|
|
return@map creator.create(item)
|
2017-01-12 17:26:44 +01:00
|
|
|
}?.let { items ->
|
|
|
|
ContentResolverUtils.bulkInsert(resolver, Filters.Users.CONTENT_URI, items)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun updateBaseItems(resolver: ContentResolver, items: List<FiltersData.BaseItem>?, uri: Uri, sourceId: Long) {
|
|
|
|
resolver.delete(uri, Expression.equalsArgs(Filters.SOURCE).sql,
|
|
|
|
arrayOf(sourceId.toString()))
|
2017-03-05 09:08:09 +01:00
|
|
|
val creator = ObjectCursor.valuesCreatorFrom(FiltersData.BaseItem::class.java)
|
2017-01-12 17:26:44 +01:00
|
|
|
items?.map { item ->
|
|
|
|
item.source = sourceId
|
2017-03-05 09:08:09 +01:00
|
|
|
return@map creator.create(item)
|
2017-01-12 17:26:44 +01:00
|
|
|
}?.let { items ->
|
|
|
|
ContentResolverUtils.bulkInsert(resolver, uri, items)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|