From bea1b47396f3fa8b3efdb19d2d754807210d5232 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Fri, 5 Jun 2020 16:12:53 +0200 Subject: [PATCH] complete & move AddLessonDialog to separate class --- app/build.gradle | 2 +- .../controller/TCoRAPIController.kt | 6 +- .../fragments/TimeTableFragment.kt | 81 +--------- .../uicomponents/AddLessonDialog.kt | 142 ++++++++++++++++++ 4 files changed, 148 insertions(+), 83 deletions(-) create mode 100644 app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/AddLessonDialog.kt diff --git a/app/build.gradle b/app/build.gradle index 97641ec..9f6223c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.6' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7' implementation 'androidx.core:core:1.3.0' implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt index 2d834e8..1afa439 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt @@ -152,13 +152,11 @@ class TCoRAPIController { /** * TODO */ - fun getLessonSubjectList(courseName: String, week: Int): Deferred> { + fun getLessonSubjectListAsync(courseName: String, week: Int): Deferred> { val url = URL("$tcorBaseURL/lessonSubjectList?courseName=$courseName&week=$week") return GlobalScope.async { - println(courseName) - println(url.readText()) - Gson().fromJson(url.readText(), Array::class.java) + Gson().fromJson(url.readText(), ArrayList()::class.java) } } } diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt index e284455..39a059d 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt @@ -22,36 +22,24 @@ package org.mosad.seil0.projectlaogai.fragments -import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.AdapterView -import android.widget.AdapterView.OnItemSelectedListener -import android.widget.ArrayAdapter import android.widget.ScrollView -import android.widget.Spinner import androidx.fragment.app.Fragment 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 com.google.android.material.floatingactionbutton.FloatingActionButton import kotlinx.android.synthetic.main.fragment_timetable.* import kotlinx.coroutines.* import org.mosad.seil0.projectlaogai.R import org.mosad.seil0.projectlaogai.controller.CacheController -import org.mosad.seil0.projectlaogai.controller.CacheController.Companion.coursesList import org.mosad.seil0.projectlaogai.controller.CacheController.Companion.timetables import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.cCourse import org.mosad.seil0.projectlaogai.controller.TCoRAPIController -import org.mosad.seil0.projectlaogai.controller.TCoRAPIController.Companion.getLessonSubjectList -import org.mosad.seil0.projectlaogai.hsoparser.Course import org.mosad.seil0.projectlaogai.hsoparser.NotRetardedCalendar +import org.mosad.seil0.projectlaogai.uicomponents.AddLessonDialog import org.mosad.seil0.projectlaogai.uicomponents.DayCardView -import java.util.stream.Collectors /** * The timetable controller class @@ -94,7 +82,8 @@ class TimeTableFragment : Fragment() { } faBtnAddLesson.setOnClickListener { - initAddLessonDialog().show() + //initAddLessonDialog().show() + AddLessonDialog(context!!).initAddLessonDialog().show() } // hide the btnCardValue if the user is scrolling down @@ -169,68 +158,4 @@ class TimeTableFragment : Fragment() { } } - // TODO move to separate class - private fun initAddLessonDialog(): MaterialDialog { - 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) { - println("add course") - } - .negativeButton(R.string.cancel) { } - - val spinnerCourses: Spinner = dialog.getCustomView().findViewById(R.id.spinner_Courses) - val spinnerLessons: Spinner = dialog.getCustomView().findViewById(R.id.spinner_Lessons) - - - val field1List: List - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - field1List = coursesList.stream().map(Course::courseName).collect(Collectors.toList()) - } else { - field1List = ArrayList() - coursesList.forEach { course -> - field1List.add(course.courseName) - } - } - - ArrayAdapter( - context!!, - android.R.layout.simple_spinner_item, - field1List - ).also { adapter -> - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) - spinnerCourses.adapter = adapter - } - - // FIXME onItemSelectedListener is called on dialog.show - spinnerCourses.onItemSelectedListener = object : OnItemSelectedListener { - override fun onItemSelected(parent: AdapterView<*>, view: View, pos: Int, id: Long) { - println("onItemSelected: ${parent.getItemAtPosition(pos)}") - - // TODO get Lessons - val lessonSubjects = getLessonSubjectList(parent.getItemAtPosition(pos).toString(), 0) - println(lessonSubjects) - } - - override fun onNothingSelected(parent: AdapterView<*>) { - // Another interface callback - } - } - - spinnerLessons.onItemSelectedListener = object : OnItemSelectedListener { - override fun onItemSelected(parent: AdapterView<*>, view: View, pos: Int, id: Long) { - println(parent.getItemAtPosition(pos)) - } - - override fun onNothingSelected(parent: AdapterView<*>) { - // Another interface callback - } - - } - - return dialog - } - } diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/AddLessonDialog.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/AddLessonDialog.kt new file mode 100644 index 0000000..8c05611 --- /dev/null +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/AddLessonDialog.kt @@ -0,0 +1,142 @@ +/** + * ProjectLaogai + * + * Copyright 2019-2020 + * + * 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 +import org.mosad.seil0.projectlaogai.controller.CacheController +import org.mosad.seil0.projectlaogai.controller.TCoRAPIController +import org.mosad.seil0.projectlaogai.hsoparser.Course +import java.util.stream.Collectors + +/** + * This class can create a new AddLessonDialog. + */ +class AddLessonDialog(_context: Context) { + private val context = _context + + private lateinit var spinnerCourses: Spinner + private lateinit var spinnerLessons: Spinner + + private val lessonSubjectsList = ArrayList() + private val courseNamesList = getCourseNames() + + var selectedCourse = "" + + /** + * create a new AddLessonDialog (BottomSheet) + */ + fun initAddLessonDialog(): MaterialDialog { + 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) { + println("add course \"$selectedCourse\"") + // TODO call add function + } + .negativeButton(R.string.cancel) { } + + // initialize the spinners + spinnerCourses = dialog.getCustomView().findViewById(R.id.spinner_Courses) + spinnerLessons = dialog.getCustomView().findViewById(R.id.spinner_Lessons) + + setArrayAdapter(spinnerCourses, courseNamesList) + val lessonsAdapter = setArrayAdapter(spinnerLessons, lessonSubjectsList) + + 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) { + + val lessonSubjects = runBlocking { + TCoRAPIController.getLessonSubjectListAsync(parent.getItemAtPosition(pos).toString(), 0).await() + } + + lessonsAdapter.clear() + lessonsAdapter.addAll(lessonSubjects) + lessonsAdapter.notifyDataSetChanged() + } + + override fun onNothingSelected(parent: AdapterView<*>) { + // Another interface callback + } + } + + spinnerLessons.setSelection(0,false) // don't call onItemSelected() on spinnerCourses.onItemSelectedListener + spinnerLessons.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View, pos: Int, id: Long) { + selectedCourse = parent.getItemAtPosition(pos).toString() + } + + 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): ArrayAdapter { + 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 { + val coursesNameList: List + 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 + } +} \ No newline at end of file