Twidere-App-Android-Twitter.../twidere/src/main/kotlin/org/mariotaku/twidere/loader/AccountDetailsLoader.kt

58 lines
1.8 KiB
Kotlin

package org.mariotaku.twidere.loader
import android.accounts.AccountManager
import android.accounts.OnAccountsUpdateListener
import android.content.Context
import android.support.v4.content.FixedAsyncTaskLoader
import org.mariotaku.ktextension.addOnAccountsUpdatedListenerSafe
import org.mariotaku.ktextension.removeOnAccountsUpdatedListenerSafe
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.util.AccountUtils
import java.lang.ref.WeakReference
/**
* Created by mariotaku on 2016/12/4.
*/
class AccountDetailsLoader(
context: Context,
val filter: (AccountDetails.() -> Boolean)? = null
) : FixedAsyncTaskLoader<List<AccountDetails>>(context) {
private var accountUpdateListener: OnAccountsUpdateListener? = null
set(value) {
val am: AccountManager = AccountManager.get(context)
field?.let {
am.removeOnAccountsUpdatedListenerSafe(it)
}
if (value != null) {
am.addOnAccountsUpdatedListenerSafe(value, updateImmediately = true)
}
}
override fun loadInBackground(): List<AccountDetails> {
val am: AccountManager = AccountManager.get(context)
return AccountUtils.getAllAccountDetails(am, true).filter {
filter?.invoke(it) ?: true
}.sortedBy(AccountDetails::position)
}
override fun onReset() {
super.onReset()
onStopLoading()
accountUpdateListener = null
}
override fun onStartLoading() {
val weakThis = WeakReference(this)
accountUpdateListener = OnAccountsUpdateListener {
weakThis.get()?.onContentChanged()
}
if (takeContentChanged()) {
forceLoad()
}
}
override fun onStopLoading() {
cancelLoad()
}
}