meili-epfl/Meili

View on GitHub
app/src/main/java/com/github/epfl/meili/util/ListSorter.kt

Summary

Maintainability
A
1 hr
Test Coverage
A
96%
package com.github.epfl.meili.util

import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Spinner
import androidx.appcompat.app.AppCompatActivity
import com.github.epfl.meili.models.User
import com.github.epfl.meili.profile.UserProfileLinker
import com.github.epfl.meili.profile.friends.UserInfoService

interface ListSorter<T> : AdapterView.OnItemSelectedListener, UserProfileLinker<T> {
    companion object {
        const val NEWEST = "Newest"
        const val OLDEST = "Oldest"
        const val POPULAR = "Popularity"

        const val TAG = "ListSorter"
        var serviceProvider: () -> UserInfoService = { UserInfoService() }
    }

    var sortOrder: String
    var listMap: Map<String, T>

    /** Gets the current activity */
    fun getActivity(): AppCompatActivity

    /** Gets the item's authorUid */
    fun getAuthorUid(item: T): String

    /** Orders the list */
    fun orderList(list: List<Pair<String, Pair<T, User>>>): List<Pair<String, Pair<T, User>>>

    /** Listens to changes in comments */
    fun sortListener(map: Map<String, T>) {
        serviceProvider().getUserInformation(map.values.map { getAuthorUid(it) }) {
            onUsersInfoReceived(it, map)
        }
    }

    /** Initializes the sorting activity */
    fun initSorting(sortSpinner: Spinner, sort_array: Int) {
        // Create an ArrayAdapter using the string array and a default spinner layout
        ArrayAdapter.createFromResource(
            getActivity(), sort_array,
            android.R.layout.simple_spinner_item
        ).also { adapter ->
            // Specify the layout to use when the list of choices appears
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
            // Apply the adapter to the spinner
            sortSpinner.adapter = adapter
        }
        sortSpinner.onItemSelectedListener = this
    }

    override fun onUsersInfoReceived(users: Map<String, User>, map: Map<String, T>) {
        this.listMap = map
        usersMap = HashMap(usersMap) + users

        val listAndUsersMap = HashMap<String, Pair<T, User>>()
        for ((id, item) in map) {
            val user = usersMap[getAuthorUid(item)]
            if (user != null) {
                listAndUsersMap[id] = Pair(item, user)
            }
        }

        recyclerAdapter.submitList(orderList(listAndUsersMap.toList()))
        recyclerAdapter.notifyDataSetChanged()
    }

    private fun sortList(order: String) {
        sortOrder = order
        onUsersInfoReceived(HashMap(), listMap)
    }

    override fun onItemSelected(parent: AdapterView<*>?, view: View?, pos: Int, id: Long) {
        sortList(parent?.getItemAtPosition(pos) as String)
    }

    override fun onNothingSelected(p0: AdapterView<*>?) {}

}