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

fixed sync filter flow

This commit is contained in:
Mariotaku Lee 2017-01-01 02:03:43 +08:00
parent e0826633bb
commit 978bc2198b
2 changed files with 34 additions and 29 deletions

View File

@ -4,6 +4,7 @@ import android.content.ContentResolver
import android.net.Uri import android.net.Uri
import org.mariotaku.ktextension.addAllEnhanced import org.mariotaku.ktextension.addAllEnhanced
import org.mariotaku.ktextension.convert import org.mariotaku.ktextension.convert
import org.mariotaku.ktextension.isNullOrEmpty
import org.mariotaku.ktextension.map import org.mariotaku.ktextension.map
import org.mariotaku.sqliteqb.library.Expression import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.twidere.model.* import org.mariotaku.twidere.model.*
@ -152,29 +153,18 @@ fun FiltersData.parse(parser: XmlPullParser) {
fun FiltersData.addAll(data: FiltersData, ignoreDuplicates: Boolean = false): Boolean { fun FiltersData.addAll(data: FiltersData, ignoreDuplicates: Boolean = false): Boolean {
var changed: Boolean = false var changed: Boolean = false
if (this.users != null) { initFields()
if (data.users != null) {
changed = changed or this.users.addAllEnhanced(collection = data.users, ignoreDuplicates = ignoreDuplicates) changed = changed or this.users.addAllEnhanced(collection = data.users, ignoreDuplicates = ignoreDuplicates)
} else {
this.users = data.users
changed = true
} }
if (this.keywords != null) { if (data.keywords != null) {
changed = changed or this.keywords.addAllEnhanced(collection = data.keywords, ignoreDuplicates = ignoreDuplicates) changed = changed or this.keywords.addAllEnhanced(collection = data.keywords, ignoreDuplicates = ignoreDuplicates)
} else {
this.keywords = data.keywords
changed = true
} }
if (this.sources != null) { if (data.sources != null) {
changed = changed or this.sources.addAllEnhanced(collection = data.sources, ignoreDuplicates = ignoreDuplicates) changed = changed or this.sources.addAllEnhanced(collection = data.sources, ignoreDuplicates = ignoreDuplicates)
} else {
this.sources = data.sources
changed = true
} }
if (this.links != null) { if (data.links != null) {
changed = changed or this.links.addAllEnhanced(collection = data.links, ignoreDuplicates = ignoreDuplicates) changed = changed or this.links.addAllEnhanced(collection = data.links, ignoreDuplicates = ignoreDuplicates)
} else {
this.links = data.links
changed = true
} }
return changed return changed
} }
@ -188,6 +178,11 @@ fun FiltersData.removeAll(data: FiltersData): Boolean {
return changed return changed
} }
fun FiltersData.isEmpty(): Boolean {
return users.isNullOrEmpty() && keywords.isNullOrEmpty() && sources.isNullOrEmpty()
&& links.isNullOrEmpty()
}
fun FiltersData.initFields() { fun FiltersData.initFields() {
if (users == null) { if (users == null) {
users = ArrayList() users = ArrayList()

View File

@ -19,7 +19,7 @@ abstract class FileBasedFiltersDataSyncHelper(val context: Context) {
} }
val remoteModified = remoteFilters.loadFromRemote(snapshotFile.lastModified()) val remoteModified = remoteFilters.loadFromRemote(snapshotFile.lastModified())
if (BuildConfig.DEBUG && !remoteModified) { if (BuildConfig.DEBUG && !remoteModified) {
Log.d(LOGTAG, "Remote filter unchanged, skipped downloading") Log.d(LOGTAG, "Remote filter unchanged, skip download")
} }
val filters: FiltersData = FiltersData().apply { val filters: FiltersData = FiltersData().apply {
read(context.contentResolver) read(context.contentResolver)
@ -28,27 +28,37 @@ abstract class FileBasedFiltersDataSyncHelper(val context: Context) {
var localModified = false var localModified = false
val deletedFilters: FiltersData? = try { val remoteAddedFilters = FiltersData()
FileReader(snapshotFile).use { val remoteDeletedFilters = FiltersData()
val result = FiltersData() try {
val snapshot = FileReader(snapshotFile).use {
val snapshot = FiltersData()
val parser = Xml.newPullParser() val parser = Xml.newPullParser()
parser.setInput(it) parser.setInput(it)
result.parse(parser) snapshot.parse(parser)
localModified = localModified or (result != filters) return@use snapshot
result.removeAll(filters)
return@use result
} }
if (remoteModified) {
remoteAddedFilters.addAll(remoteFilters)
remoteAddedFilters.removeAll(snapshot)
remoteDeletedFilters.addAll(snapshot)
remoteDeletedFilters.removeAll(remoteFilters)
}
localModified = localModified or (snapshot != filters)
} catch (e: FileNotFoundException) { } catch (e: FileNotFoundException) {
remoteAddedFilters.addAll(remoteFilters)
remoteAddedFilters.removeAll(filters)
localModified = true localModified = true
null
} }
if (remoteModified) { if (remoteModified) {
localModified = localModified or filters.addAll(remoteFilters, true) filters.addAll(remoteAddedFilters, true)
} filters.removeAll(remoteDeletedFilters)
if (deletedFilters != null) { localModified = !remoteAddedFilters.isEmpty() || !remoteDeletedFilters.isEmpty()
localModified = localModified or filters.removeAll(deletedFilters)
} }
filters.write(context.contentResolver) filters.write(context.contentResolver)