BlindlyTeam/Blindly

View on GitHub
app/src/main/java/ch/epfl/sdp/blindly/main_screen/profile/edit/EditPassions.kt

Summary

Maintainability
B
5 hrs
Test Coverage
A
94%
package ch.epfl.sdp.blindly.main_screen.profile.edit

import android.os.Build
import android.os.Bundle
import android.view.View.INVISIBLE
import android.view.View.VISIBLE
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import ch.epfl.sdp.blindly.R
import ch.epfl.sdp.blindly.profile_setup.ProfileOrientation
import ch.epfl.sdp.blindly.user.PASSIONS
import ch.epfl.sdp.blindly.user.UserHelper
import ch.epfl.sdp.blindly.user.enums.Passions
import ch.epfl.sdp.blindly.viewmodel.UserViewModel
import ch.epfl.sdp.blindly.viewmodel.ViewModelAssistedFactory
import com.google.android.material.chip.ChipGroup
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject

private const val SELECTION_LIMIT = 5

@AndroidEntryPoint
class EditPassions : AppCompatActivity() {

    @Inject
    lateinit var userHelper: UserHelper

    @Inject
    lateinit var assistedFactory: ViewModelAssistedFactory

    private lateinit var viewModel: UserViewModel

    private lateinit var chipGroup: ChipGroup

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

        val uid = userHelper.getUserId()
        viewModel = UserViewModel.instantiateViewModel(
            uid,
            assistedFactory,
            this,
            this
        )

        val passions = intent.getStringArrayListExtra(PASSIONS)
        chipGroup = findViewById(R.id.passions_chip_group)
        if (passions != null)
            setCheckedChips(chipGroup, passions)
    }

    override fun onBackPressed() {
        if (passionsAreCorrect()) {
            viewModel.updateField(PASSIONS, ProfileOrientation.getChipTextsFromIds(chipGroup))
            super.onBackPressed()
        }
    }

    private fun passionsAreCorrect(): Boolean {
        findViewById<TextView>(R.id.at_least_one_warning).visibility = INVISIBLE
        findViewById<TextView>(R.id.no_more_than_5_warning).visibility = INVISIBLE

        val ids = chipGroup.checkedChipIds
        val size = ids.size

        return when {
            //none selected
            size < 1 -> {
                findViewById<TextView>(R.id.at_least_one_warning).visibility = VISIBLE
                false
            }
            size > SELECTION_LIMIT -> {
                findViewById<TextView>(R.id.no_more_than_5_warning).visibility = VISIBLE
                false
            }
            //correct numbers of selection
            else -> {
                true
            }
        }
    }

    /**
     * Check the chip from the chipGroup given an ArrayList of Strings
     *
     * @param chipGroup the chipGroup in which the chip can be checked
     * @param passions the ArrayList<String> containing the text of the chip to check
     */
    private fun setCheckedChips(chipGroup: ChipGroup, passions: ArrayList<String>) {
        passions.forEach { p ->
            Passions.values().forEach { v ->
                if (v.asString == p) {
                    chipGroup.check(v.id)
                }
            }
        }
    }
}