2020-06-05 16:12:53 +02:00
/ * *
* ProjectLaogai
*
* Copyright 2019 - 2020 < seil0 @mosad . xyz >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston ,
* MA 02110 - 1301 , USA .
*
* /
2020-08-11 17:09:46 +02:00
package org.mosad.seil0.projectlaogai.uicomponents.dialogs
2020-06-05 16:12:53 +02:00
import android.content.Context
import android.os.Build
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Spinner
import com.afollestad.materialdialogs.MaterialDialog
2020-08-11 17:09:46 +02:00
import com.afollestad.materialdialogs.WhichButton
import com.afollestad.materialdialogs.actions.getActionButton
2020-06-05 16:12:53 +02:00
import com.afollestad.materialdialogs.bottomsheets.BottomSheet
import com.afollestad.materialdialogs.bottomsheets.setPeekHeight
import com.afollestad.materialdialogs.customview.customView
import com.afollestad.materialdialogs.customview.getCustomView
import kotlinx.coroutines.runBlocking
import org.mosad.seil0.projectlaogai.R
2020-08-13 21:01:21 +02:00
import org.mosad.seil0.projectlaogai.controller.preferences.Preferences
2020-08-10 14:31:17 +02:00
import org.mosad.seil0.projectlaogai.controller.cache.CacheController
2020-06-05 16:12:53 +02:00
import org.mosad.seil0.projectlaogai.controller.TCoRAPIController
2020-06-07 23:41:49 +02:00
import org.mosad.seil0.projectlaogai.util.Course
2020-06-05 16:12:53 +02:00
import java.util.stream.Collectors
/ * *
2020-08-11 17:09:46 +02:00
* This class creates a new AddLessonDialog .
2020-06-05 16:12:53 +02:00
* /
2020-08-11 17:09:46 +02:00
class AddSubjectDialog ( val context : Context ) {
2020-06-05 16:12:53 +02:00
2020-08-11 17:09:46 +02:00
private val dialog = MaterialDialog ( context , BottomSheet ( ) )
2020-08-12 11:00:22 +02:00
private val spinnerCourses : Spinner
private val spinnerSubjects : Spinner
2020-06-05 16:12:53 +02:00
2020-06-05 19:17:49 +02:00
private val subjectsList = ArrayList < String > ( )
2020-06-05 16:12:53 +02:00
private val courseNamesList = getCourseNames ( )
var selectedCourse = " "
2020-06-05 19:17:49 +02:00
var selectedSubject = " "
2020-06-05 16:12:53 +02:00
2020-08-11 17:09:46 +02:00
init {
dialog . title ( R . string . add _lesson )
2020-06-05 16:12:53 +02:00
. message ( R . string . add _lesson _desc )
. customView ( R . layout . dialog _add _lesson )
2020-08-11 17:09:46 +02:00
. positiveButton ( R . string . add )
2020-06-07 14:59:04 +02:00
. negativeButton ( R . string . cancel )
2020-08-11 17:09:46 +02:00
. setPeekHeight ( 900 )
2020-06-05 16:12:53 +02:00
spinnerCourses = dialog . getCustomView ( ) . findViewById ( R . id . spinner _Courses )
2020-06-05 19:17:49 +02:00
spinnerSubjects = dialog . getCustomView ( ) . findViewById ( R . id . spinner _Lessons )
2020-06-05 16:12:53 +02:00
2020-08-11 17:09:46 +02:00
// fix not working accent color
2020-08-13 21:01:21 +02:00
dialog . getActionButton ( WhichButton . POSITIVE ) . updateTextColor ( Preferences . cColorAccent )
dialog . getActionButton ( WhichButton . NEGATIVE ) . updateTextColor ( Preferences . cColorAccent )
2020-08-11 17:09:46 +02:00
initSpinners ( )
}
fun positiveButton ( func : AddSubjectDialog . ( ) -> Unit ) : AddSubjectDialog = apply {
dialog . positiveButton {
func ( )
}
}
fun show ( ) {
dialog . show ( )
}
fun show ( func : AddSubjectDialog . ( ) -> Unit ) : AddSubjectDialog = apply {
func ( )
this . show ( )
}
private fun initSpinners ( ) {
2020-06-05 16:12:53 +02:00
setArrayAdapter ( spinnerCourses , courseNamesList )
2020-06-05 19:17:49 +02:00
val lessonsAdapter = setArrayAdapter ( spinnerSubjects , subjectsList )
2020-06-05 16:12:53 +02:00
2020-08-11 17:09:46 +02:00
// don't call onItemSelected() on spinnerCourses.onItemSelectedListener
spinnerCourses . setSelection ( 0 , false )
2020-06-05 16:12:53 +02:00
spinnerCourses . onItemSelectedListener = object : AdapterView . OnItemSelectedListener {
override fun onItemSelected ( parent : AdapterView < * > , view : View , pos : Int , id : Long ) {
2020-06-05 19:17:49 +02:00
selectedCourse = parent . getItemAtPosition ( pos ) . toString ( )
2020-06-05 16:12:53 +02:00
2020-06-05 19:17:49 +02:00
// TODO show loading dialog while loading
2020-06-05 16:12:53 +02:00
val lessonSubjects = runBlocking {
2020-06-11 21:51:46 +02:00
TCoRAPIController . getSubjectListAsync ( parent . getItemAtPosition ( pos ) . toString ( ) , 0 ) . await ( )
2020-06-05 16:12:53 +02:00
}
lessonsAdapter . clear ( )
lessonsAdapter . addAll ( lessonSubjects )
lessonsAdapter . notifyDataSetChanged ( )
}
override fun onNothingSelected ( parent : AdapterView < * > ) {
// Another interface callback
}
}
2020-08-11 17:09:46 +02:00
// don't call onItemSelected() on spinnerCourses.onItemSelectedListener
spinnerSubjects . setSelection ( 0 , false )
2020-06-05 19:17:49 +02:00
spinnerSubjects . onItemSelectedListener = object : AdapterView . OnItemSelectedListener {
2020-06-05 16:12:53 +02:00
override fun onItemSelected ( parent : AdapterView < * > , view : View , pos : Int , id : Long ) {
2020-06-05 19:17:49 +02:00
selectedSubject = parent . getItemAtPosition ( pos ) . toString ( )
2020-06-05 16:12:53 +02:00
}
override fun onNothingSelected ( parent : AdapterView < * > ) {
// Another interface callback
}
}
}
/ * *
* set a new ArrayAdapter for a spinner with a list
* @param spinner the spinner you wish to set the adapter for
* @param list the list to set the adapter to
* /
private fun setArrayAdapter ( spinner : Spinner , list : List < String > ) : ArrayAdapter < String > {
return ArrayAdapter ( context , android . R . layout . simple _spinner _item , list )
. also { adapter ->
adapter . setDropDownViewResource ( android . R . layout . simple _spinner _dropdown _item )
spinner . adapter = adapter
}
}
/ * *
* get all course names from coursesList
* @return a list , containing all course names
* /
private fun getCourseNames ( ) : List < String > {
val coursesNameList : List < String >
if ( Build . VERSION . SDK _INT >= Build . VERSION_CODES . N ) {
coursesNameList = CacheController . coursesList . stream ( ) . map ( Course :: courseName ) . collect (
Collectors . toList ( ) )
} else {
coursesNameList = ArrayList ( )
CacheController . coursesList . forEach { course ->
coursesNameList . add ( course . courseName )
}
}
return coursesNameList
}
}