PolyBooks/sdp_polyBooks

View on GitHub
app/src/main/java/com/github/polybooks/activities/FilteringSalesActivity.kt

Summary

Maintainability
A
2 hrs
Test Coverage
B
89%
package com.github.polybooks.activities

import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import com.github.polybooks.R
import com.github.polybooks.adapter.AdapterFactory
import com.github.polybooks.core.*
import com.github.polybooks.database.*
import com.github.polybooks.database.Database
import com.github.polybooks.database.SaleOrdering
import com.github.polybooks.database.SaleQuery
import com.github.polybooks.utils.GlobalVariables.EXTRA_SALE_QUERY_SETTINGS
import com.github.polybooks.utils.setupNavbar


/**
 * This activity let the users selecting the sorting and filtering the sales by clicking
 * on the corresponding values for each parameter (eg. "Architecture" button for
 * parameter "Field"). If no value is selected for a given parameter, then the
 * query won't be filtered on this parameter
 */
class FilteringSalesActivity: FilteringActivity() {

    private val TAG: String = "FilteringSalesActivity"

    private lateinit var saleDB: SaleDatabase

    private lateinit var mReset: Button
    private lateinit var mResults: Button

    private lateinit var mName: EditText
    private lateinit var mISBN: EditText
    private lateinit var mPriceMin: EditText
    private lateinit var mPriceMax: EditText

    private lateinit var mSortParameter: Parameter<SaleOrdering>
    private lateinit var mStateParameter: Parameter<SaleState>
    private lateinit var mBookConditionParameter: Parameter<BookCondition>

    private lateinit var mFieldParameter: Parameter<Field>
    private lateinit var mSemesterParameter: Parameter<Semester>
    private lateinit var mCourseParameter: Parameter<Course>

    // --------

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_filtering_sales)

        saleDB = Database.saleDatabase(applicationContext)
        // Get a reference to the UI parameters
        mReset = findViewById(R.id.reset_button)
        mResults = findViewById(R.id.results_button)

        setParametersButtons()

        setupNavbar(findViewById(R.id.bottom_navigation), this)

    }

    fun resetParameters(view: View) {
        // reset the Edit Text views
        mName.text.clear()
        mISBN.text.clear()
        mPriceMin.text.clear()
        mPriceMax.text.clear()

        mSortParameter.resetItemsViews()
        mStateParameter.resetItemsViews()
        mBookConditionParameter.resetItemsViews()

        mFieldParameter.resetItemsViews()
        mSemesterParameter.resetItemsViews()
        mCourseParameter.resetItemsViews()
    }

    fun getResults(view: View) {
//        var query: SaleQuery = DummySalesQuery()
        var query: SaleQuery = saleDB.querySales()

        //These 2 in front for dummy sales query
        if (mName.text.isNotEmpty())
            query.searchByTitle(mName.text.toString())

        if (mISBN.text.isNotEmpty())
            query = query.searchByISBN(mISBN.text.toString())

        // price
        val minPrice =
            if (mPriceMin.text.isNotEmpty()) mPriceMin.text.toString().toFloat()
            else 0.0f

        val maxPrice =
            if (mPriceMax.text.isNotEmpty()) mPriceMax.text.toString().toFloat()
            else Float.MAX_VALUE

        query = query.searchByPrice(minPrice, maxPrice)

        resultByParameter(query)

        val querySettings = query.getSettings()
        val intent = Intent(this, ListSalesActivity::class.java)
        intent.putExtra(EXTRA_SALE_QUERY_SETTINGS, querySettings)
        startActivity(intent)
    }


    private fun setParametersButtons() {
        setTextParameters()

        mSortParameter = Parameter(
            R.id.sale_sort_parameter,
            AdapterFactory.saleSortingAdapter()
        )
        mStateParameter = Parameter(
            R.id.sale_state_parameter,
            AdapterFactory.saleStateAdapter()
        )
        mBookConditionParameter = Parameter(
            R.id.sale_condition_parameter,
            AdapterFactory.saleBookConditionAdapter()
        )
        mFieldParameter = Parameter(
            R.id.field_parameter,
            AdapterFactory.fieldInterestAdapter()
        )
        mSemesterParameter = Parameter(
            R.id.semester_parameter,
            AdapterFactory.semesterInterestAdapter()
        )
        mCourseParameter = Parameter(
            R.id.course_parameter,
            AdapterFactory.courseInterestAdapter()
        )
    }

    private fun setTextParameters() {
        mName = findViewById(R.id.book_name)
        mISBN = findViewById(R.id.book_isbn)
        mPriceMin = findViewById(R.id.price_min)
        mPriceMax = findViewById(R.id.price_max)
    }

    private fun resultByParameter(query: SaleQuery) {
        resultByParameter(query, mSortParameter) { q, orderings ->
            q.withOrdering(orderings[0])
        }
        resultByParameter(query, mStateParameter) { q, states ->
            q.searchByState(states.toSet())
        }
        resultByParameter(query, mBookConditionParameter) { q, conditions ->
            q.searchByCondition(conditions.toSet())
        }

        val interests: MutableSet<Interest> = mutableSetOf()
        interests.addAll(mFieldParameter.getSelectedValues())
        interests.addAll(mSemesterParameter.getSelectedValues())
        interests.addAll(mCourseParameter.getSelectedValues())
    }

    private fun <T> resultByParameter(
        query: SaleQuery,
        parameter: Parameter<T>,
        f: (SaleQuery, List<T>) -> Unit
    ) {
        val values: List<T> = parameter.getSelectedValues()
        if (values.isNotEmpty())
            f(query, values)
    }
}