Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c2e6514a authored by Ricki Hirner's avatar Ricki Hirner
Browse files

AccountListFragment: use ViewModel

parent 676f74a5
Loading
Loading
Loading
Loading
+39 −52
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ package at.bitfire.davdroid.ui
import android.accounts.Account
import android.accounts.AccountManager
import android.accounts.OnAccountsUpdateListener
import android.app.Application
import android.content.Context
import android.content.Intent
import android.os.Bundle
@@ -21,23 +22,30 @@ import android.widget.AbsListView
import android.widget.AdapterView
import android.widget.ArrayAdapter
import androidx.fragment.app.ListFragment
import androidx.loader.app.LoaderManager
import androidx.loader.content.AsyncTaskLoader
import androidx.loader.content.Loader
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import at.bitfire.davdroid.R
import kotlinx.android.synthetic.main.account_list_item.view.*

class AccountListFragment: ListFragment(), LoaderManager.LoaderCallbacks<Array<Account>> {
class AccountListFragment: ListFragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        listAdapter = AccountListAdapter(requireActivity())

        val model = ViewModelProviders.of(this).get(Model::class.java)
        model.accounts.observe(this, Observer { accounts ->
            val adapter = listAdapter as AccountListAdapter
            adapter.clear()
            adapter.addAll(*accounts)
        })

        return inflater.inflate(R.layout.account_list, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        LoaderManager.getInstance(this).initLoader(0, arguments, this)

        listView.choiceMode = AbsListView.CHOICE_MODE_SINGLE
        listView.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
@@ -49,66 +57,45 @@ class AccountListFragment: ListFragment(), LoaderManager.LoaderCallbacks<Array<A
    }


    // loader
    // list adapter

    override fun onCreateLoader(id: Int, args: Bundle?) =
            AccountLoader(requireActivity())
    class AccountListAdapter(
            context: Context
    ): ArrayAdapter<Account>(context, R.layout.account_list_item) {

    override fun onLoadFinished(loader: Loader<Array<Account>>, accounts: Array<Account>) {
        val adapter = listAdapter as AccountListAdapter
        adapter.clear()
        adapter.addAll(*accounts)
    }
        override fun getView(position: Int, _v: View?, parent: ViewGroup?): View {
            val account = getItem(position)!!

    override fun onLoaderReset(loader: Loader<Array<Account>>) {
        (listAdapter as AccountListAdapter).clear()
            val v = _v ?: LayoutInflater.from(context).inflate(R.layout.account_list_item, parent, false)
            v.account_name.text = account.name

            return v
        }
    }

    class AccountLoader(
            context: Context
    ): AsyncTaskLoader<Array<Account>>(context) {

        private val accountManager = AccountManager.get(context)!!
        private var listener: OnAccountsUpdateListener? = null
    class Model(
            application: Application
    ): AndroidViewModel(application), OnAccountsUpdateListener {

        override fun onStartLoading() {
            if (listener == null) {
                listener = OnAccountsUpdateListener { onContentChanged() }
                accountManager.addOnAccountsUpdatedListener(listener, null, false)
            }
        val accounts = MutableLiveData<Array<out Account>>()

            forceLoad()
        private val accountManager = AccountManager.get(getApplication())!!
        init {
            accountManager.addOnAccountsUpdatedListener(this, null, true)
        }

        override fun onReset() {
            listener?.let {
                try {
                    accountManager.removeOnAccountsUpdatedListener(it)
                } catch(ignored: IllegalArgumentException) {}
                listener = null
            }
        override fun onCleared() {
            accountManager.removeOnAccountsUpdatedListener(this)
        }

        override fun loadInBackground(): Array<Account> =
        override fun onAccountsUpdated(newAccounts: Array<out Account>) {
            val context = getApplication<Application>()
            accounts.postValue(
                    AccountManager.get(context).getAccountsByType(context.getString(R.string.account_type))

            )
        }


    // list adapter

    class AccountListAdapter(
            context: Context
    ): ArrayAdapter<Account>(context, R.layout.account_list_item) {

        override fun getView(position: Int, _v: View?, parent: ViewGroup?): View {
            val account = getItem(position)!!

            val v = _v ?: LayoutInflater.from(context).inflate(R.layout.account_list_item, parent, false)
            v.account_name.text = account.name

            return v
        }
    }

}
 No newline at end of file