You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
5.6 KiB
151 lines
5.6 KiB
/** |
|
* 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.fragments |
|
|
|
import android.os.Bundle |
|
import android.view.LayoutInflater |
|
import android.view.View |
|
import android.view.ViewGroup |
|
import android.widget.ScrollView |
|
import androidx.fragment.app.Fragment |
|
import com.afollestad.materialdialogs.MaterialDialog |
|
import com.afollestad.materialdialogs.WhichButton |
|
import com.afollestad.materialdialogs.actions.getActionButton |
|
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.PreferencesController |
|
import org.mosad.seil0.projectlaogai.controller.cache.TimetableController |
|
import org.mosad.seil0.projectlaogai.controller.cache.TimetableController.Companion.timetable |
|
import org.mosad.seil0.projectlaogai.uicomponents.AddSubjectDialog |
|
import org.mosad.seil0.projectlaogai.uicomponents.DayCardView |
|
import org.mosad.seil0.projectlaogai.util.NotRetardedCalendar |
|
|
|
/** |
|
* The timetable controller class |
|
* contains all needed parts to display and the timetable detail screen |
|
*/ |
|
class TimeTableFragment : Fragment() { |
|
|
|
private lateinit var scrollViewTimetable: ScrollView |
|
private lateinit var faBtnAddSubject: FloatingActionButton |
|
|
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { |
|
|
|
val view: View = inflater.inflate(R.layout.fragment_timetable, container, false) |
|
scrollViewTimetable = view.findViewById(R.id.scrollView_Timetable) |
|
faBtnAddSubject = view.findViewById(R.id.faBtnAddSubject) |
|
|
|
// init actions |
|
initActions() |
|
|
|
if (timetable.size > 1 && timetable[0].days.isNotEmpty() && timetable[1].days.isNotEmpty()) { |
|
initTimetable() |
|
|
|
//println(timetable) |
|
} else { |
|
MaterialDialog(context!!) |
|
.title(R.string.error) |
|
.message(R.string.timetable_error) |
|
.show() |
|
} |
|
|
|
return view |
|
} |
|
|
|
/** |
|
* initialize the actions |
|
*/ |
|
private fun initActions() = GlobalScope.launch(Dispatchers.Main) { |
|
|
|
refreshLayout_Timetable.setOnRefreshListener { |
|
runBlocking { TimetableController.update(context!!).joinAll() } |
|
reloadTimetableUI() |
|
} |
|
|
|
// show the AddLessonDialog if the ftaBtn is clicked |
|
faBtnAddSubject.setOnClickListener { |
|
AddSubjectDialog(context!!).initialize(this@TimeTableFragment).show{ |
|
getActionButton(WhichButton.POSITIVE).updateTextColor(PreferencesController.cColorAccent) |
|
getActionButton(WhichButton.NEGATIVE).updateTextColor(PreferencesController.cColorAccent) |
|
} |
|
} |
|
|
|
// hide the btnCardValue if the user is scrolling down |
|
scrollViewTimetable.setOnScrollChangeListener { _, _, scrollY, _, oldScrollY -> |
|
if (scrollY > oldScrollY) { |
|
faBtnAddSubject.hide() |
|
} else { |
|
faBtnAddSubject.show() |
|
} |
|
} |
|
|
|
} |
|
|
|
/** |
|
* add the current and next weeks lessons |
|
*/ |
|
private fun initTimetable() = GlobalScope.launch(Dispatchers.Default) { |
|
val currentDayIndex = NotRetardedCalendar.getDayOfWeekIndex() |
|
|
|
addTimetableWeek(currentDayIndex, 5, 0).join() // add current week |
|
addTimetableWeek(0, currentDayIndex - 1, 1) // add next week |
|
} |
|
|
|
private fun addTimetableWeek(dayBegin: Int, dayEnd: Int, week: Int) = GlobalScope.launch(Dispatchers.Main) { |
|
for (dayIndex in dayBegin..dayEnd) { |
|
val dayCardView = DayCardView(context!!) |
|
|
|
// some wired calendar magic, calculate the correct date to be shown |
|
// ((timetable week - current week * 7) + (dayIndex - dayIndex of current week) |
|
val daysToAdd = ((timetable[week].weekNumberYear - NotRetardedCalendar.getWeekOfYear()) |
|
* 7 + (dayIndex - NotRetardedCalendar.getDayOfWeekIndex())) |
|
dayCardView.addTimetableDay(timetable[week].days[dayIndex], daysToAdd) |
|
|
|
// if there are no lessons don't show the dayCardView |
|
if (dayCardView.getLinLayoutDay().childCount > 1) |
|
linLayout_Timetable.addView(dayCardView) |
|
|
|
} |
|
} |
|
|
|
/** |
|
* clear linLayout_Timetable, add the updated timetable |
|
*/ |
|
fun reloadTimetableUI() = GlobalScope.launch(Dispatchers.Default) { |
|
withContext(Dispatchers.Main) { |
|
// remove all lessons from the layout |
|
linLayout_Timetable.removeAllViews() |
|
|
|
// add the refreshed timetables |
|
val dayIndex = NotRetardedCalendar.getDayOfWeekIndex() |
|
|
|
addTimetableWeek(dayIndex, 5, 0).join() // add current week |
|
addTimetableWeek(0, dayIndex - 1, 1) // add next week |
|
|
|
refreshLayout_Timetable.isRefreshing = false |
|
} |
|
} |
|
|
|
}
|
|
|