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 .
*
* /
package org.mosad.seil0.projectlaogai.uicomponents
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
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-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-08-10 14:31:17 +02:00
import org.mosad.seil0.projectlaogai.controller.cache.TimetableController
2020-06-12 00:51:50 +02:00
import org.mosad.seil0.projectlaogai.fragments.TimeTableFragment
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
/ * *
* This class can create a new AddLessonDialog .
* /
2020-06-11 21:51:46 +02:00
class AddSubjectDialog ( _context : Context ) {
2020-06-05 16:12:53 +02:00
private val context = _context
private lateinit var spinnerCourses : Spinner
2020-06-05 19:17:49 +02:00
private lateinit var 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
/ * *
* create a new AddLessonDialog ( BottomSheet )
* /
2020-06-12 00:51:50 +02:00
fun initialize ( ttf : TimeTableFragment ) : MaterialDialog {
2020-06-05 16:12:53 +02:00
val dialog = MaterialDialog ( context , BottomSheet ( ) )
. title ( R . string . add _lesson )
. message ( R . string . add _lesson _desc )
. customView ( R . layout . dialog _add _lesson )
. setPeekHeight ( 900 )
. positiveButton ( R . string . add ) {
2020-06-11 21:41:05 +02:00
val lessons = TCoRAPIController . getLessons ( selectedCourse , selectedSubject , 0 )
2020-06-05 20:56:37 +02:00
println ( " add lesson \" $selectedCourse : $selectedSubject \" " )
println ( lessons . toString ( ) )
2020-06-05 19:17:49 +02:00
2020-08-10 14:31:17 +02:00
TimetableController . addSubject ( selectedCourse , selectedSubject , context )
runBlocking { ttf . reloadTimetableUI ( ) }
2020-06-05 16:12:53 +02:00
}
2020-06-07 14:59:04 +02:00
. negativeButton ( R . string . cancel )
2020-06-05 16:12:53 +02:00
// initialize the spinners
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
setArrayAdapter ( spinnerCourses , courseNamesList )
2020-06-05 19:17:49 +02:00
val lessonsAdapter = setArrayAdapter ( spinnerSubjects , subjectsList )
2020-06-05 16:12:53 +02:00
spinnerCourses . setSelection ( 0 , false ) // don't call onItemSelected() on spinnerCourses.onItemSelectedListener
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-06-05 19:17:49 +02:00
spinnerSubjects . setSelection ( 0 , false ) // don't call onItemSelected() on spinnerCourses.onItemSelectedListener
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
}
}
return dialog
}
/ * *
* 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
}
}