Fragments now get data class instances from Room instead of having them passed through a Bundle object; ClassSessionSheet.kt now keeps screen turned on; renamed *BottomSheet.kt to *Sheet.kt
This commit is contained in:
@@ -56,6 +56,7 @@ dependencies {
|
||||
|
||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0'
|
||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0'
|
||||
|
||||
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
|
||||
|
||||
implementation 'com.shawnlin:number-picker:2.4.8'
|
||||
|
||||
@@ -1,46 +1,39 @@
|
||||
package com.denizd.qwark.activity
|
||||
|
||||
import android.Manifest
|
||||
import android.graphics.Color
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.WindowManager
|
||||
import android.widget.TextView
|
||||
import androidx.core.app.ActivityCompat
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.fragment.app.FragmentTransaction
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import com.denizd.qwark.R
|
||||
import com.denizd.qwark.databinding.ActivityMainBinding
|
||||
import com.denizd.qwark.fragment.*
|
||||
import com.denizd.qwark.fragment.CourseFragment
|
||||
import com.denizd.qwark.fragment.ParticipationFragment
|
||||
import com.denizd.qwark.viewmodel.MainViewModel
|
||||
import com.google.android.material.appbar.AppBarLayout
|
||||
import com.google.android.material.bottomnavigation.BottomNavigationView
|
||||
|
||||
internal class MainActivity : AppCompatActivity(R.layout.activity_main) {
|
||||
class MainActivity : FragmentActivity() {
|
||||
|
||||
private lateinit var toolbarTitle: TextView
|
||||
private lateinit var bottomNavigationView: BottomNavigationView
|
||||
private lateinit var viewModel: MainViewModel
|
||||
|
||||
private var _binding: ActivityMainBinding? = null
|
||||
private val binding: ActivityMainBinding get() = _binding!!
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setTheme(R.style.AppTheme)
|
||||
_binding = ActivityMainBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 42)
|
||||
// ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 42)
|
||||
|
||||
viewModel = ViewModelProvider(this)[MainViewModel::class.java]
|
||||
viewModel.applyTheme(window, this)
|
||||
viewModel.checkForFirstTimeYearNotice(this)
|
||||
|
||||
val actionBar = findViewById<AppBarLayout>(R.id.app_bar_layout)
|
||||
toolbarTitle = findViewById(R.id.toolbarTxt)
|
||||
bottomNavigationView = findViewById(R.id.bottom_nav)
|
||||
|
||||
findViewById<AppBarLayout>(R.id.app_bar_layout).also { appBarLayout ->
|
||||
binding.appBarLayout.also { appBarLayout ->
|
||||
appBarLayout.setOnApplyWindowInsetsListener { _, insets ->
|
||||
(appBarLayout.layoutParams as ViewGroup.MarginLayoutParams)
|
||||
.topMargin = insets.systemWindowInsetTop
|
||||
@@ -48,6 +41,7 @@ internal class MainActivity : AppCompatActivity(R.layout.activity_main) {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO remove this translucent app bar layout stuff, it's hard to maintain
|
||||
window.decorView.systemUiVisibility = if (resources.getBoolean(R.bool.isLight)) {
|
||||
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
|
||||
} else {
|
||||
@@ -59,8 +53,8 @@ internal class MainActivity : AppCompatActivity(R.layout.activity_main) {
|
||||
}
|
||||
window.statusBarColor = Color.TRANSPARENT
|
||||
|
||||
bottomNavigationView.setOnNavigationItemSelectedListener { item ->
|
||||
actionBar.setExpanded(true)
|
||||
binding.bottomNav.setOnNavigationItemSelectedListener { item ->
|
||||
binding.appBarLayout.setExpanded(true)
|
||||
loadFragment(viewModel.getFragmentType(item.itemId))
|
||||
}
|
||||
|
||||
@@ -89,11 +83,16 @@ internal class MainActivity : AppCompatActivity(R.layout.activity_main) {
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
if (supportFragmentManager.fragments.size == 0) {
|
||||
bottomNavigationView.selectedItemId = R.id.courses
|
||||
binding.bottomNav.selectedItemId = R.id.courses
|
||||
loadFragment(viewModel.getFragmentType(R.id.courses))
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
_binding = null
|
||||
}
|
||||
|
||||
private fun loadFragment(type: String): Boolean {
|
||||
val fragment = supportFragmentManager.findFragmentByTag(type) ?: viewModel.getFragment(type)
|
||||
|
||||
@@ -101,8 +100,10 @@ internal class MainActivity : AppCompatActivity(R.layout.activity_main) {
|
||||
return false
|
||||
}
|
||||
|
||||
supportFragmentManager.beginTransaction().replace(R.id.fragment_container, fragment, type)
|
||||
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).commit()
|
||||
supportFragmentManager.beginTransaction()
|
||||
.replace(R.id.fragment_container, fragment, type)
|
||||
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
|
||||
.commit()
|
||||
|
||||
// with (supportFragmentManager) {
|
||||
// beginTransaction()
|
||||
@@ -118,8 +119,8 @@ internal class MainActivity : AppCompatActivity(R.layout.activity_main) {
|
||||
// Log.d("TAG2", "${supportFragmentManager.}") // supportFragmentManager.fragments[0].tag} ${supportFragmentManager.fragments[0].javaClass.simpleName
|
||||
when (supportFragmentManager.fragments[0].tag) {
|
||||
"GradeFragment", "ParticipationCourseFragment" -> {
|
||||
bottomNavigationView.visibility = View.INVISIBLE
|
||||
findViewById<View>(R.id.view).visibility = View.INVISIBLE
|
||||
binding.bottomNav.visibility = View.INVISIBLE
|
||||
binding.view.visibility = View.INVISIBLE
|
||||
super.onBackPressed()
|
||||
}
|
||||
"NoteFragment" -> {
|
||||
@@ -128,8 +129,8 @@ internal class MainActivity : AppCompatActivity(R.layout.activity_main) {
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
bottomNavigationView.visibility = View.VISIBLE
|
||||
findViewById<View>(R.id.view).visibility = View.VISIBLE
|
||||
binding.bottomNav.visibility = View.VISIBLE
|
||||
binding.view.visibility = View.VISIBLE
|
||||
super.onBackPressed()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import com.denizd.qwark.util.QwarkUtil
|
||||
import com.denizd.qwark.model.Course
|
||||
import com.denizd.qwark.model.CourseExam
|
||||
import com.denizd.qwark.util.getUserDefinedAverage
|
||||
import com.denizd.qwark.util.round
|
||||
import com.denizd.qwark.util.roundToInt
|
||||
|
||||
class CourseAdapter(private var courses: List<CourseExam>,
|
||||
@@ -69,14 +70,16 @@ class CourseAdapter(private var courses: List<CourseExam>,
|
||||
else -> context.getString(R.string.average_grade_placeholder, currentItem.average.getUserDefinedAverage(gradeType))
|
||||
}
|
||||
}
|
||||
var timeLeft = ((currentItem.examTime.toDouble() - QwarkUtil.timeAtMidnight.toDouble()) / (1000.0 * 60.0 * 60.0 * 24.0)).roundToInt()
|
||||
val examText = when (timeLeft) {
|
||||
val examText = when (val timeLeft = ((currentItem.examTime.toDouble() - QwarkUtil.timeAtMidnight.toDouble()) / (1000.0 * 60.0 * 60.0 * 24.0)).roundToInt()) {
|
||||
0 -> context.getString(R.string.exam_today_placeholder)
|
||||
else -> {
|
||||
when {
|
||||
timeLeft > 7 -> {
|
||||
timeLeft /= 7
|
||||
context.resources.getQuantityString(R.plurals.exam_weeks_placeholder, timeLeft, timeLeft.toString())
|
||||
context.resources.getQuantityString(
|
||||
R.plurals.exam_weeks_placeholder,
|
||||
2,
|
||||
(timeLeft.toDouble() / 7.0).round(1).toString()
|
||||
)
|
||||
}
|
||||
timeLeft in 1..7 -> context.resources.getQuantityString(R.plurals.exam_days_placeholder, timeLeft, timeLeft.toString())
|
||||
else -> ""
|
||||
|
||||
@@ -53,7 +53,16 @@ class ParticipationAdapter(private var participations: List<Participation>, priv
|
||||
}
|
||||
}
|
||||
))
|
||||
holder.time.text = QwarkUtil.getSimpleDateTimeFormat().format(Date(currentItem.time))
|
||||
holder.time.text = buildString {
|
||||
append(QwarkUtil.getSimpleDateTimeFormat().format(Date(currentItem.time)))
|
||||
|
||||
// TODO this checks the time on fragment launch, but it doesn't change, even if the time has passed
|
||||
append(if (currentItem.time > System.currentTimeMillis() - 1000 * 60 * 90) {
|
||||
holder.time.context.getString(R.string.participation_resumable)
|
||||
} else {
|
||||
""
|
||||
})
|
||||
}
|
||||
holder.participationText.text = holder.participationText.context.getString(
|
||||
R.string.participation_placeholder,
|
||||
currentItem.timesHandRaised.toString(),
|
||||
|
||||
@@ -21,4 +21,6 @@ internal class CourseRepository(app: Application) {
|
||||
|
||||
fun getCoursesByYearId(yearId: Int): LiveData<List<CourseExam>> = dao.getCoursesByYearId(yearId)
|
||||
fun getAveragesForCourses(courseId: Int): List<HistoricalAvg> = dao.getAveragesForCourses(courseId)
|
||||
|
||||
fun getCourse(courseId: Int): CourseExam = dao.getCourse(courseId)[0]
|
||||
}
|
||||
@@ -42,6 +42,6 @@ class FinalsRepository(app: Application) {
|
||||
fun getAllCourses() = dao.getAllCourseExams()
|
||||
|
||||
fun getCourse(courseId: Int) = dao.getCourse(courseId)[0]
|
||||
|
||||
fun getFinalGrade(finalGradeId: Int) = dao.getFinalGrade(finalGradeId)[0]
|
||||
fun update(finalGrade: FinalGrade) { dao.update(finalGrade) }
|
||||
}
|
||||
@@ -27,4 +27,5 @@ class GradeRepository(app: Application) {
|
||||
}
|
||||
|
||||
fun getGradesByForeignKey(courseId: Int): LiveData<List<Grade>> = dao.getGradesByForeignKey(courseId)
|
||||
fun getGrade(gradeId: Int) = dao.getGrade(gradeId)[0]
|
||||
}
|
||||
@@ -16,4 +16,5 @@ class NoteRepository(app: Application) {
|
||||
fun update(note: Note) { dao.update(note) }
|
||||
fun updateDismissed(newDismissedStatus: Boolean, noteId: Int) { dao.updateDismissed(newDismissedStatus, noteId) }
|
||||
fun delete(noteId: Int) { dao.deleteNote(noteId) }
|
||||
fun getNote(noteId: Int) = dao.getNote(noteId)[0]
|
||||
}
|
||||
@@ -3,14 +3,12 @@ package com.denizd.qwark.database
|
||||
import android.app.Application
|
||||
import android.util.Log
|
||||
import androidx.lifecycle.LiveData
|
||||
import com.denizd.qwark.util.QwarkPreferences
|
||||
import com.denizd.qwark.model.Course
|
||||
import com.denizd.qwark.model.CourseExam
|
||||
import com.denizd.qwark.model.Participation
|
||||
import com.denizd.qwark.model.SchoolDay
|
||||
import com.denizd.qwark.util.QwarkUtil
|
||||
import com.denizd.qwark.util.round
|
||||
import com.denizd.qwark.util.roundToInt
|
||||
import com.denizd.qwark.util.*
|
||||
import com.denizd.qwark.util.QwarkPreferences
|
||||
import java.util.*
|
||||
|
||||
class ParticipationRepository(app: Application) {
|
||||
@@ -46,8 +44,7 @@ class ParticipationRepository(app: Application) {
|
||||
|
||||
fun getDayType(): String = if (dayId in 1..5) days[dayId - 1] else days[1]
|
||||
fun getDays(): List<SchoolDay> = dao.getDays(prefs.getSchoolYear())
|
||||
fun getCourses(): List<CourseExam> = QwarkUtil.getCoursesSorted(
|
||||
dao.getCoursesByYearIdAsList(prefs.getSchoolYear()),
|
||||
fun getCourses(): List<CourseExam> = dao.getCoursesByYearIdAsList(prefs.getSchoolYear()).getSorted(
|
||||
prefs.getCourseSortType()
|
||||
)
|
||||
fun link(courseId: Int) { dao.link(courseId, getDayType(), prefs.getSchoolYear()) }
|
||||
@@ -67,6 +64,11 @@ class ParticipationRepository(app: Application) {
|
||||
)
|
||||
}
|
||||
fun delete(participation: Participation) { dao.delete(participation) }
|
||||
fun updateParticipation(participation: String, courseId: Int) { dao.updateParticipation(participation, courseId) }
|
||||
fun updateParticipation(participation: String, courseId: Int) {
|
||||
dao.updateParticipation(participation, courseId)
|
||||
}
|
||||
fun updateParticipation(timesHandRaised: Int, timesSpoken: Int, participationId: Int) {
|
||||
dao.updateParticipation(timesHandRaised, timesSpoken, participationId)
|
||||
}
|
||||
fun getSchoolYearName() = prefs.getSchoolYearName()
|
||||
}
|
||||
@@ -47,6 +47,9 @@ interface QwarkDao {
|
||||
@Query("UPDATE course SET participation = :participation WHERE course_id = :courseId")
|
||||
fun updateParticipation(participation: String, courseId: Int)
|
||||
|
||||
@Query("UPDATE participation SET times_hand_raised = :timesHandRaised, times_spoken = :timesSpoken WHERE participation_id = :participationId")
|
||||
fun updateParticipation(timesHandRaised: Int, timesSpoken: Int, participationId: Int)
|
||||
|
||||
|
||||
// grades
|
||||
@get:Query("SELECT * FROM grade ORDER BY time")
|
||||
@@ -64,6 +67,9 @@ interface QwarkDao {
|
||||
@Query("DELETE FROM grade WHERE grade_id = :gradeId")
|
||||
fun deleteGrade(gradeId: Int)
|
||||
|
||||
@Query("SELECT * FROM grade WHERE grade_id = :gradeId")
|
||||
fun getGrade(gradeId: Int): List<Grade>
|
||||
|
||||
|
||||
// notes
|
||||
@get:Query("SELECT * FROM note ORDER BY time DESC")
|
||||
@@ -90,6 +96,9 @@ interface QwarkDao {
|
||||
@Query("SELECT DISTINCT category FROM note")
|
||||
fun getAllCategories(): List<String>
|
||||
|
||||
@Query("SELECT * FROM note WHERE note_id = :noteId")
|
||||
fun getNote(noteId: Int): List<Note>
|
||||
|
||||
|
||||
// historical averages
|
||||
@get:Query("SELECT * FROM historical_avg ORDER BY course_id DESC")
|
||||
@@ -155,6 +164,9 @@ interface QwarkDao {
|
||||
@Insert
|
||||
fun insertAll(finalGrades: Array<FinalGrade>)
|
||||
|
||||
@Query("SELECT * FROM final_grade WHERE final_grade_id = :finalGradeId")
|
||||
fun getFinalGrade(finalGradeId: Int): List<FinalGrade>
|
||||
|
||||
|
||||
// school days
|
||||
@Insert
|
||||
@@ -174,7 +186,7 @@ interface QwarkDao {
|
||||
@Query("DELETE FROM course_schoolday_relation WHERE relation_id = :relationId")
|
||||
fun removeLink(relationId: Int)
|
||||
|
||||
@Query("SELECT * FROM participation WHERE course_id = :courseId")
|
||||
@Query("SELECT * FROM participation WHERE course_id = :courseId ORDER BY time DESC")
|
||||
fun getAllParticipationsForCourse(courseId: Int): LiveData<List<Participation>>
|
||||
|
||||
@Insert
|
||||
|
||||
@@ -8,44 +8,44 @@ import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.fragment.app.FragmentTransaction
|
||||
import androidx.fragment.app.viewModels
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.recyclerview.widget.StaggeredGridLayoutManager
|
||||
import com.denizd.qwark.R
|
||||
import com.denizd.qwark.adapter.CourseAdapter
|
||||
import com.denizd.qwark.sheet.ConfirmDeletionBottomSheet
|
||||
import com.denizd.qwark.sheet.CourseCreateBottomSheet
|
||||
import com.denizd.qwark.sheet.CourseOptionsBottomSheet
|
||||
import com.denizd.qwark.util.QwarkUtil
|
||||
import com.denizd.qwark.sheet.ConfirmDeletionSheet
|
||||
import com.denizd.qwark.sheet.CourseCreateSheet
|
||||
import com.denizd.qwark.sheet.CourseOptionsSheet
|
||||
import com.denizd.qwark.databinding.*
|
||||
import com.denizd.qwark.sheet.HistoricalAverageBottomSheet
|
||||
import com.denizd.qwark.sheet.HistoricalAverageSheet
|
||||
import com.denizd.qwark.model.Course
|
||||
import com.denizd.qwark.model.CourseExam
|
||||
import com.denizd.qwark.util.calculateTotalAverage
|
||||
import com.denizd.qwark.util.getSorted
|
||||
import com.denizd.qwark.viewmodel.CourseViewModel
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import java.lang.NumberFormatException
|
||||
|
||||
internal class CourseFragment : QwarkFragment(), CourseAdapter.CourseClickListener {
|
||||
class CourseFragment : QwarkFragment(), CourseAdapter.CourseClickListener {
|
||||
|
||||
private var _binding: PaddedRecyclerViewBinding? = null
|
||||
private val binding: PaddedRecyclerViewBinding get() = _binding!!
|
||||
|
||||
private lateinit var viewModel: CourseViewModel
|
||||
private val viewModel: CourseViewModel by viewModels()
|
||||
private lateinit var recyclerViewAdapter: CourseAdapter
|
||||
|
||||
private var scrollPosition: Parcelable? = null
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
viewModel = ViewModelProvider(this)[CourseViewModel::class.java]
|
||||
recyclerViewAdapter = CourseAdapter(ArrayList(), this, viewModel.getGradeType())
|
||||
viewModel.allCourses.observe(this, Observer { courses ->
|
||||
val c = QwarkUtil.getCoursesSorted(courses, viewModel.getCourseSortType())
|
||||
recyclerViewAdapter.setCourses(c)
|
||||
recyclerViewAdapter.setCourses(courses.getSorted(viewModel.getCourseSortType()))
|
||||
if (scrollPosition == null) {
|
||||
binding.recyclerView.scrollToPosition(0)
|
||||
binding.recyclerView.scheduleLayoutAnimation()
|
||||
binding.recyclerView.apply {
|
||||
scrollToPosition(0)
|
||||
scheduleLayoutAnimation()
|
||||
}
|
||||
} else {
|
||||
binding.recyclerView.layoutManager?.onRestoreInstanceState(scrollPosition)
|
||||
}
|
||||
@@ -105,16 +105,7 @@ internal class CourseFragment : QwarkFragment(), CourseAdapter.CourseClickListen
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
binding.recyclerView.apply {
|
||||
applyPadding(verticalPadding = 4)
|
||||
/**
|
||||
* On first app launch, setting the padding will not scroll the recycler view items
|
||||
* down. This is a workaround to scroll the recycler view down programmatically.
|
||||
*/
|
||||
// TODO this actually doesn't do anything
|
||||
// if (!QwarkUtil.hasAppLaunched) {
|
||||
// scrollToPosition(0)
|
||||
// QwarkUtil.hasAppLaunched = true
|
||||
// }
|
||||
applyPadding(horizontalPadding = 4)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -142,8 +133,8 @@ internal class CourseFragment : QwarkFragment(), CourseAdapter.CourseClickListen
|
||||
}
|
||||
|
||||
private fun createOptionsDialog(course: CourseExam) {
|
||||
openBottomSheet(CourseOptionsBottomSheet().also { sheet ->
|
||||
QwarkUtil.putCourseInBundle(sheet, course)
|
||||
openBottomSheet(CourseOptionsSheet().also { sheet ->
|
||||
sheet.arguments = Bundle().apply { putInt("courseId", course.courseId) }
|
||||
})
|
||||
}
|
||||
|
||||
@@ -162,7 +153,7 @@ internal class CourseFragment : QwarkFragment(), CourseAdapter.CourseClickListen
|
||||
fun getAveragesForCourse(courseId: Int) = viewModel.getAveragesForCourses(courseId)
|
||||
|
||||
fun createHistoryDialog(courseId: Int, course: String) {
|
||||
openBottomSheet(HistoricalAverageBottomSheet().also { sheet ->
|
||||
openBottomSheet(HistoricalAverageSheet().also { sheet ->
|
||||
sheet.arguments = Bundle(2).apply {
|
||||
putString("courseName", course)
|
||||
putInt("courseId", courseId)
|
||||
@@ -171,18 +162,20 @@ internal class CourseFragment : QwarkFragment(), CourseAdapter.CourseClickListen
|
||||
}
|
||||
|
||||
fun createCourseDialog(course: CourseExam? = null) {
|
||||
openBottomSheet(CourseCreateBottomSheet().also { sheet ->
|
||||
if (course != null) QwarkUtil.putCourseInBundle(sheet, course)
|
||||
openBottomSheet(CourseCreateSheet().also { sheet ->
|
||||
if (course != null) sheet.arguments = Bundle().apply { putInt("courseId", course.courseId) }
|
||||
})
|
||||
}
|
||||
|
||||
fun deleteCourse(course: Course) {
|
||||
openBottomSheet(
|
||||
ConfirmDeletionBottomSheet(
|
||||
ConfirmDeletionSheet(
|
||||
getString(R.string.delete_course_and_data_confirmation, course.name)
|
||||
) {
|
||||
viewModel.delete(course)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
fun getCourse(courseId: Int): CourseExam = viewModel.getCourse(courseId)
|
||||
}
|
||||
|
||||
@@ -3,27 +3,26 @@ package com.denizd.qwark.fragment
|
||||
import android.content.res.Configuration
|
||||
import android.os.Bundle
|
||||
import android.os.Parcelable
|
||||
import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.fragment.app.FragmentTransaction
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.denizd.qwark.R
|
||||
import com.denizd.qwark.adapter.FinalGradeAdapter
|
||||
import com.denizd.qwark.sheet.ConfirmDeletionBottomSheet
|
||||
import com.denizd.qwark.sheet.FinalsCreateBottomSheet
|
||||
import com.denizd.qwark.sheet.FinalsOptionsBottomSheet
|
||||
import com.denizd.qwark.sheet.ConfirmDeletionSheet
|
||||
import com.denizd.qwark.sheet.FinalsCreateSheet
|
||||
import com.denizd.qwark.sheet.FinalsOptionsSheet
|
||||
import com.denizd.qwark.databinding.FinalsFragmentBinding
|
||||
import com.denizd.qwark.sheet.FinalsLinkBottomSheet
|
||||
import com.denizd.qwark.util.QwarkUtil
|
||||
import com.denizd.qwark.sheet.FinalsLinkSheet
|
||||
import com.denizd.qwark.model.FinalGrade
|
||||
import com.denizd.qwark.viewmodel.FinalsViewModel
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
|
||||
internal class FinalsFragment : QwarkFragment(), FinalGradeAdapter.FinalGradeClickListener {
|
||||
class FinalsFragment : QwarkFragment(), FinalGradeAdapter.FinalGradeClickListener {
|
||||
|
||||
private lateinit var viewModel: FinalsViewModel
|
||||
private var _binding: FinalsFragmentBinding? = null
|
||||
@@ -44,7 +43,7 @@ internal class FinalsFragment : QwarkFragment(), FinalGradeAdapter.FinalGradeCli
|
||||
super.onCreate(savedInstanceState)
|
||||
viewModel = ViewModelProvider(this)[FinalsViewModel::class.java]
|
||||
viewModel.updateLinkedGrades {
|
||||
viewModel.allFinalGrades?.observe(this, Observer { finalGrades ->
|
||||
viewModel.allFinalGrades.observe(this, Observer { finalGrades ->
|
||||
// createOverview(finalGrades, view.rootView) // TODO export to bitmap
|
||||
if (basicScrollPosition == null) {
|
||||
binding.basicCoursesRecyclerview.scheduleLayoutAnimation()
|
||||
@@ -67,7 +66,7 @@ internal class FinalsFragment : QwarkFragment(), FinalGradeAdapter.FinalGradeCli
|
||||
binding.gradeTextview.text = "---"
|
||||
} else {
|
||||
pointsText = "$finalScore"
|
||||
gradeText = getString(R.string.approximate_placeholder, viewModel.getFinalGrade(finalScore).toString())
|
||||
gradeText = getString(R.string.approximate_placeholder, viewModel.getFinalGradeScore(finalScore).toString())
|
||||
setTextForGradeTextViews()
|
||||
}
|
||||
|
||||
@@ -126,41 +125,42 @@ internal class FinalsFragment : QwarkFragment(), FinalGradeAdapter.FinalGradeCli
|
||||
}
|
||||
|
||||
override fun onFinalGradeClick(finalGrade: FinalGrade) {
|
||||
openBottomSheet(FinalsOptionsBottomSheet().also { sheet ->
|
||||
QwarkUtil.putFinalGradeInBundle(sheet, finalGrade)
|
||||
openBottomSheet(FinalsOptionsSheet().also { sheet ->
|
||||
sheet.arguments = Bundle().apply { putInt("finalGradeId", finalGrade.finalGradeId) }
|
||||
})
|
||||
}
|
||||
|
||||
internal fun createEditGradeSheet(finalGrade: FinalGrade) {
|
||||
openBottomSheet(FinalsCreateBottomSheet().also { sheet ->
|
||||
QwarkUtil.putFinalGradeInBundle(sheet, finalGrade)
|
||||
fun createEditGradeSheet(finalGrade: FinalGrade) {
|
||||
openBottomSheet(FinalsCreateSheet().also { sheet ->
|
||||
sheet.arguments = Bundle().apply { putInt("finalGradeId", finalGrade.finalGradeId) }
|
||||
})
|
||||
}
|
||||
|
||||
internal fun createLinkGradeSheet(finalGrade: FinalGrade) {
|
||||
openBottomSheet(FinalsLinkBottomSheet().also { sheet ->
|
||||
QwarkUtil.putFinalGradeInBundle(sheet, finalGrade)
|
||||
fun createLinkGradeSheet(finalGrade: FinalGrade) {
|
||||
openBottomSheet(FinalsLinkSheet().also { sheet ->
|
||||
sheet.arguments = Bundle().apply { putInt("finalGradeId", finalGrade.finalGradeId) }
|
||||
})
|
||||
}
|
||||
|
||||
internal fun getAllYears() = viewModel.getAllYears()
|
||||
internal fun getAllCourses() = viewModel.getAllCourses()
|
||||
fun getAllYears() = viewModel.getAllYears()
|
||||
fun getAllCourses() = viewModel.getAllCourses()
|
||||
|
||||
internal fun viewLinkedCourse(courseId: Int) {
|
||||
val f = GradeFragment()
|
||||
QwarkUtil.putCourseInBundle(f, viewModel.getCourse(courseId))
|
||||
val d = viewModel.getSchoolYearName(courseId)
|
||||
Log.d("TAG", d)
|
||||
f.arguments?.putString("schoolYear", d)
|
||||
activity?.supportFragmentManager?.beginTransaction()
|
||||
?.replace(R.id.fragment_container, f)
|
||||
?.addToBackStack("GradeFragment")
|
||||
?.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
|
||||
?.commit()
|
||||
fun viewLinkedCourse(courseId: Int) {
|
||||
val f = GradeFragment().also { fragment ->
|
||||
fragment.arguments = Bundle().apply {
|
||||
putInt("courseId", courseId)
|
||||
putString("schoolYear", viewModel.getSchoolYearName(courseId))
|
||||
}
|
||||
}
|
||||
(context as FragmentActivity).supportFragmentManager.beginTransaction()
|
||||
.replace(R.id.fragment_container, f)
|
||||
.addToBackStack(f.name)
|
||||
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
|
||||
.commit()
|
||||
}
|
||||
|
||||
internal fun clearFinalGrade(finalGrade: FinalGrade) {
|
||||
val deletionSheet = ConfirmDeletionBottomSheet(getString(R.string.clear_final_grade_desc, finalGrade.name)) {
|
||||
fun clearFinalGrade(finalGrade: FinalGrade) {
|
||||
val deletionSheet = ConfirmDeletionSheet(getString(R.string.clear_final_grade_desc, finalGrade.name)) {
|
||||
val newFinalGrade = FinalGrade(
|
||||
name = "",
|
||||
grade = "-1",
|
||||
@@ -175,14 +175,14 @@ internal class FinalsFragment : QwarkFragment(), FinalGradeAdapter.FinalGradeCli
|
||||
openBottomSheet(deletionSheet)
|
||||
}
|
||||
|
||||
internal fun clearFinalGradeError() {
|
||||
fun clearFinalGradeError() {
|
||||
Snackbar
|
||||
.make(snackBarContainer, getString(R.string.clear_final_grade_error), Snackbar.LENGTH_LONG)
|
||||
.setBackgroundTint(context.getColor(R.color.colorWarning))
|
||||
.show()
|
||||
}
|
||||
|
||||
internal fun update(finalGrade: FinalGrade) { viewModel.update(finalGrade) }
|
||||
fun update(finalGrade: FinalGrade) { viewModel.update(finalGrade) }
|
||||
|
||||
// TODO perhaps replace with a bottom sheet
|
||||
// private fun createOverview(finalGrades: List<FinalGrade>, view: View) {
|
||||
@@ -284,6 +284,7 @@ internal class FinalsFragment : QwarkFragment(), FinalGradeAdapter.FinalGradeCli
|
||||
binding.finalExamsRecyclerview.layoutManager?.onRestoreInstanceState(examScrollPosition)
|
||||
}
|
||||
|
||||
internal fun getCourseSortType() = viewModel.getCourseSortType()
|
||||
fun getCourseSortType() = viewModel.getCourseSortType()
|
||||
fun getGradeType() = viewModel.getGradeType()
|
||||
fun getFinalGrade(finalGradeId: Int) = viewModel.getFinalGrade(finalGradeId)
|
||||
}
|
||||
@@ -2,24 +2,22 @@ package com.denizd.qwark.fragment
|
||||
|
||||
import android.os.Bundle
|
||||
import android.os.Parcelable
|
||||
import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.fragment.app.FragmentTransaction
|
||||
import androidx.fragment.app.viewModels
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import com.denizd.qwark.R
|
||||
import com.denizd.qwark.adapter.GradeAdapter
|
||||
import com.denizd.qwark.sheet.ConfirmDeletionBottomSheet
|
||||
import com.denizd.qwark.sheet.GradeCreateBottomSheet
|
||||
import com.denizd.qwark.sheet.ConfirmDeletionSheet
|
||||
import com.denizd.qwark.sheet.GradeCreateSheet
|
||||
import com.denizd.qwark.databinding.GradeFragmentBinding
|
||||
import com.denizd.qwark.model.CourseExam
|
||||
import com.denizd.qwark.model.Grade
|
||||
import com.denizd.qwark.model.HistoricalAvg
|
||||
import com.denizd.qwark.util.QwarkUtil
|
||||
import com.denizd.qwark.util.calculateAverage
|
||||
import com.denizd.qwark.util.getUserDefinedAverage
|
||||
import com.denizd.qwark.viewmodel.GradeViewModel
|
||||
@@ -34,7 +32,7 @@ class GradeFragment : QwarkFragment(), GradeAdapter.GradeClickListener {
|
||||
private lateinit var weightingString: String
|
||||
private lateinit var adapter: GradeAdapter
|
||||
|
||||
private lateinit var viewModel: GradeViewModel
|
||||
private val viewModel: GradeViewModel by viewModels()
|
||||
private lateinit var inflater: LayoutInflater
|
||||
|
||||
private var _binding: GradeFragmentBinding? = null
|
||||
@@ -45,12 +43,9 @@ class GradeFragment : QwarkFragment(), GradeAdapter.GradeClickListener {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
viewModel = ViewModelProvider(this)[GradeViewModel::class.java]
|
||||
|
||||
// currentCourse = QwarkUtil.getCourseFromBundle(arguments)
|
||||
schoolYear = arguments?.getString("schoolYear") ?: ""
|
||||
currentCourse = viewModel.getCourse(arguments?.getInt("courseId") ?: -1)
|
||||
average = currentCourse.average
|
||||
average = currentCourse.average.getUserDefinedAverage(getGradeType())
|
||||
weightingString = "${currentCourse.oralWeighting} / ${100 - currentCourse.oralWeighting}"
|
||||
|
||||
viewModel.getGradesByForeignKey(currentCourse.courseId).observe(this, Observer { grades ->
|
||||
@@ -67,7 +62,7 @@ class GradeFragment : QwarkFragment(), GradeAdapter.GradeClickListener {
|
||||
average = filteredGrades.calculateAverage(
|
||||
currentCourse.oralWeighting
|
||||
)
|
||||
binding.average.text = if (filteredGrades.isEmpty()) "X" else average.getUserDefinedAverage(getGradeType())
|
||||
binding.average.text = if (filteredGrades.isEmpty()) "??" else average.getUserDefinedAverage(getGradeType())
|
||||
viewModel.updateAverage(average, filteredGrades.size, currentCourse.courseId)
|
||||
}
|
||||
|
||||
@@ -94,7 +89,7 @@ class GradeFragment : QwarkFragment(), GradeAdapter.GradeClickListener {
|
||||
currentCourse.name
|
||||
)
|
||||
fab.hide()
|
||||
with(view.rootView) {
|
||||
with (view.rootView) {
|
||||
findViewById<BottomNavigationView>(R.id.bottom_nav).visibility = View.GONE
|
||||
findViewById<View>(R.id.view).visibility = View.GONE
|
||||
}
|
||||
@@ -103,7 +98,7 @@ class GradeFragment : QwarkFragment(), GradeAdapter.GradeClickListener {
|
||||
presentGradeDialog()
|
||||
}
|
||||
|
||||
binding.average.text = currentCourse.average
|
||||
binding.average.text = currentCourse.average.getUserDefinedAverage(getGradeType())
|
||||
binding.weighting.text = weightingString
|
||||
|
||||
binding.recyclerView.adapter = adapter
|
||||
@@ -135,12 +130,12 @@ class GradeFragment : QwarkFragment(), GradeAdapter.GradeClickListener {
|
||||
}
|
||||
|
||||
private fun presentGradeDialog(grade: Grade? = null) {
|
||||
openBottomSheet(GradeCreateBottomSheet().also { sheet ->
|
||||
if (grade == null) {
|
||||
sheet.arguments = Bundle(1).apply { putInt("courseId", currentCourse.courseId) }
|
||||
openBottomSheet(GradeCreateSheet().also { sheet ->
|
||||
sheet.arguments = Bundle(1).apply { if (grade == null) {
|
||||
putInt("courseId", currentCourse.courseId)
|
||||
} else {
|
||||
QwarkUtil.putGradeInBundle(sheet, grade)
|
||||
}
|
||||
putInt("gradeId", grade.gradeId)
|
||||
}}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -149,7 +144,7 @@ class GradeFragment : QwarkFragment(), GradeAdapter.GradeClickListener {
|
||||
}
|
||||
|
||||
override fun onGradeLongClick(gradeId: Int) {
|
||||
val deletionSheet = ConfirmDeletionBottomSheet(getString(R.string.confirm_grade_deletion)) {
|
||||
val deletionSheet = ConfirmDeletionSheet(getString(R.string.confirm_grade_deletion)) {
|
||||
viewModel.delete(gradeId)
|
||||
}
|
||||
openBottomSheet(deletionSheet)
|
||||
@@ -157,23 +152,27 @@ class GradeFragment : QwarkFragment(), GradeAdapter.GradeClickListener {
|
||||
|
||||
private fun openParticipationCourseFragment() {
|
||||
appBar.setExpanded(true)
|
||||
val f = ParticipationCourseFragment()
|
||||
f.arguments = Bundle().apply {
|
||||
putString("course", currentCourse.name)
|
||||
putInt("courseId", currentCourse.courseId)
|
||||
putBoolean("advanced", currentCourse.advanced)
|
||||
(context as FragmentActivity).supportFragmentManager.also { fm ->
|
||||
if (fm.getBackStackEntryAt(0).name == "ParticipationCourseFragment") {
|
||||
fm.popBackStack()
|
||||
} else {
|
||||
val f = ParticipationCourseFragment()
|
||||
f.arguments = Bundle().apply {
|
||||
putString("course", currentCourse.name)
|
||||
putInt("courseId", currentCourse.courseId)
|
||||
putBoolean("advanced", currentCourse.advanced)
|
||||
}
|
||||
fm.beginTransaction()
|
||||
.replace(R.id.fragment_container, f)
|
||||
.addToBackStack(f.name)
|
||||
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
|
||||
.commit()
|
||||
}
|
||||
}
|
||||
// for targetFragment to work, ParticipationFragment needs to be active
|
||||
// TODO fix the dependency on targetFragment (maybe introduce a ParticipationCourseViewModel)
|
||||
// f.setTargetFragment((context as FragmentActivity).supportFragmentManager.findFragmentByTag("ParticipationFragment"), 42)
|
||||
(context as FragmentActivity).supportFragmentManager.beginTransaction()
|
||||
.replace(R.id.fragment_container, f)
|
||||
.addToBackStack(f.name)
|
||||
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
|
||||
.commit()
|
||||
}
|
||||
|
||||
fun insert(grade: Grade) { viewModel.insert(grade) }
|
||||
fun update(grade: Grade) { viewModel.update(grade) }
|
||||
fun getGradeType(): Int = viewModel.getGradeType()
|
||||
fun getGrade(gradeId: Int) = viewModel.getGrade(gradeId)
|
||||
}
|
||||
@@ -11,14 +11,13 @@ import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.recyclerview.widget.StaggeredGridLayoutManager
|
||||
import com.denizd.qwark.R
|
||||
import com.denizd.qwark.adapter.NoteAdapter
|
||||
import com.denizd.qwark.sheet.ConfirmDeletionBottomSheet
|
||||
import com.denizd.qwark.sheet.NoteCreateBottomSheet
|
||||
import com.denizd.qwark.sheet.NoteDisplayBottomSheet
|
||||
import com.denizd.qwark.sheet.NoteOptionsBottomSheet
|
||||
import com.denizd.qwark.sheet.ConfirmDeletionSheet
|
||||
import com.denizd.qwark.sheet.NoteCreateSheet
|
||||
import com.denizd.qwark.sheet.NoteDisplaySheet
|
||||
import com.denizd.qwark.sheet.NoteOptionsSheet
|
||||
import com.denizd.qwark.util.OnBackPressed
|
||||
import com.denizd.qwark.databinding.*
|
||||
import com.denizd.qwark.model.Note
|
||||
import com.denizd.qwark.util.QwarkUtil
|
||||
import com.denizd.qwark.viewmodel.NoteViewModel
|
||||
import com.google.android.material.appbar.AppBarLayout
|
||||
|
||||
@@ -82,7 +81,7 @@ class NoteFragment : QwarkFragment(), NoteAdapter.OnNoteClickListener, OnBackPre
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
binding.recyclerView.applyPadding(verticalPadding = 4)
|
||||
binding.recyclerView.applyPadding(horizontalPadding = 4)
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
@@ -113,8 +112,8 @@ class NoteFragment : QwarkFragment(), NoteAdapter.OnNoteClickListener, OnBackPre
|
||||
}
|
||||
|
||||
override fun onNoteClick(note: Note) {
|
||||
openBottomSheet(NoteDisplayBottomSheet().also { sheet ->
|
||||
QwarkUtil.putNoteInBundle(sheet, note)
|
||||
openBottomSheet(NoteDisplaySheet().also { sheet ->
|
||||
sheet.arguments = Bundle().apply { putInt("noteId", note.noteId) }
|
||||
})
|
||||
}
|
||||
|
||||
@@ -124,7 +123,7 @@ class NoteFragment : QwarkFragment(), NoteAdapter.OnNoteClickListener, OnBackPre
|
||||
}
|
||||
|
||||
fun deleteNote(noteId: Int) {
|
||||
val deletionSheet = ConfirmDeletionBottomSheet(getString(R.string.confirm_note_deletion)) {
|
||||
val deletionSheet = ConfirmDeletionSheet(getString(R.string.confirm_note_deletion)) {
|
||||
scrollPosition = binding.recyclerView.layoutManager?.onSaveInstanceState()
|
||||
viewModel.delete(noteId)
|
||||
binding.recyclerView.scheduleLayoutAnimation()
|
||||
@@ -141,14 +140,14 @@ class NoteFragment : QwarkFragment(), NoteAdapter.OnNoteClickListener, OnBackPre
|
||||
}
|
||||
|
||||
private fun createOptionsSheet(note: Note) {
|
||||
openBottomSheet(NoteOptionsBottomSheet().also { sheet ->
|
||||
QwarkUtil.putNoteInBundle(sheet, note)
|
||||
openBottomSheet(NoteOptionsSheet().also { sheet ->
|
||||
sheet.arguments = Bundle().apply { putInt("noteId", note.noteId) }
|
||||
})
|
||||
}
|
||||
|
||||
fun createNoteDialog(note: Note? = null) {
|
||||
val createSheet = NoteCreateBottomSheet().also { sheet ->
|
||||
if (note != null) QwarkUtil.putNoteInBundle(sheet, note)
|
||||
val createSheet = NoteCreateSheet().also { sheet ->
|
||||
if (note != null) sheet.arguments = Bundle().apply { putInt("noteId", note.noteId) }
|
||||
}
|
||||
openBottomSheet(createSheet)
|
||||
}
|
||||
@@ -165,4 +164,5 @@ class NoteFragment : QwarkFragment(), NoteAdapter.OnNoteClickListener, OnBackPre
|
||||
fun insert(note: Note) { viewModel.insert(note) }
|
||||
fun update(note: Note) { viewModel.update(note) }
|
||||
fun getAllCategories(): List<String> = viewModel.getAllCategories()
|
||||
fun getNote(noteId: Int) = viewModel.getNote(noteId)
|
||||
}
|
||||
@@ -14,9 +14,10 @@ import com.denizd.qwark.adapter.ParticipationAdapter
|
||||
import com.denizd.qwark.databinding.GradeFragmentBinding
|
||||
import com.denizd.qwark.model.Participation
|
||||
import com.denizd.qwark.sheet.ClassSessionSheet
|
||||
import com.denizd.qwark.sheet.ConfirmDeletionBottomSheet
|
||||
import com.denizd.qwark.sheet.ConfirmDeletionSheet
|
||||
import com.denizd.qwark.viewmodel.ParticipationCourseViewModel
|
||||
import com.google.android.material.bottomnavigation.BottomNavigationView
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
|
||||
class ParticipationCourseFragment : QwarkFragment(), ParticipationAdapter.ParticipationClickListener {
|
||||
|
||||
@@ -109,11 +110,24 @@ class ParticipationCourseFragment : QwarkFragment(), ParticipationAdapter.Partic
|
||||
}
|
||||
|
||||
override fun onParticipationClick(participation: Participation) {
|
||||
// do nothing
|
||||
if (participation.time > System.currentTimeMillis() - 1000 * 60 * 90) {
|
||||
openBottomSheet(ClassSessionSheet().also { sheet ->
|
||||
sheet.arguments = Bundle(2).apply {
|
||||
putInt("timesHandRaised", participation.timesHandRaised)
|
||||
putInt("timesSpoken", participation.timesSpoken)
|
||||
putInt("participationId", participation.participationId)
|
||||
}
|
||||
sheet.isCancelable = false
|
||||
})
|
||||
} else {
|
||||
Snackbar
|
||||
.make(snackBarContainer, getString(R.string.participation_too_old), Snackbar.LENGTH_LONG)
|
||||
.show()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onParticipationLongClick(participation: Participation) {
|
||||
openBottomSheet(ConfirmDeletionBottomSheet(
|
||||
openBottomSheet(ConfirmDeletionSheet(
|
||||
getString(R.string.delete_participation_confirmation)
|
||||
) {
|
||||
viewModel.delete(participation)
|
||||
@@ -122,19 +136,30 @@ class ParticipationCourseFragment : QwarkFragment(), ParticipationAdapter.Partic
|
||||
|
||||
private fun openGradeFragment() {
|
||||
appBar.setExpanded(true)
|
||||
val f = GradeFragment()
|
||||
f.arguments = Bundle().apply {
|
||||
putString("schoolYear", viewModel.getSchoolYearName())
|
||||
putInt("courseId", courseId)
|
||||
(context as FragmentActivity).supportFragmentManager.also { fm ->
|
||||
if (fm.getBackStackEntryAt(0).name == "GradeFragment") {
|
||||
fm.popBackStack()
|
||||
} else {
|
||||
val f = GradeFragment()
|
||||
f.arguments = Bundle().apply {
|
||||
putString("schoolYear", viewModel.getSchoolYearName())
|
||||
putInt("courseId", courseId)
|
||||
}
|
||||
fm.beginTransaction()
|
||||
.replace(R.id.fragment_container, f)
|
||||
.addToBackStack("GradeFragment")
|
||||
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
|
||||
.commit()
|
||||
}
|
||||
}
|
||||
(context as FragmentActivity).supportFragmentManager.beginTransaction()
|
||||
.replace(R.id.fragment_container, f)
|
||||
.addToBackStack("GradeFragment")
|
||||
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
|
||||
.commit()
|
||||
}
|
||||
|
||||
fun createParticipation(timesHandRaised: Int, timesSpoken: Int, time: Long) {
|
||||
viewModel.createParticipation(timesHandRaised, timesSpoken, time, courseId)
|
||||
}
|
||||
|
||||
// TODO this function has the same name as another one with a different function signature
|
||||
fun updateParticipation(timesHandRaised: Int, timesSpoken: Int, participationId: Int) {
|
||||
viewModel.updateParticipation(timesHandRaised, timesSpoken, participationId)
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,6 @@ import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.fragment.app.FragmentTransaction
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.recyclerview.widget.StaggeredGridLayoutManager
|
||||
@@ -16,8 +15,8 @@ import com.denizd.qwark.adapter.CourseAdapter
|
||||
import com.denizd.qwark.databinding.PaddedRecyclerViewBinding
|
||||
import com.denizd.qwark.model.CourseExam
|
||||
import com.denizd.qwark.model.Participation
|
||||
import com.denizd.qwark.sheet.ConfirmDeletionBottomSheet
|
||||
import com.denizd.qwark.sheet.ParticipationLinkBottomSheet
|
||||
import com.denizd.qwark.sheet.ConfirmDeletionSheet
|
||||
import com.denizd.qwark.sheet.ParticipationLinkSheet
|
||||
import com.denizd.qwark.viewmodel.ParticipationViewModel
|
||||
|
||||
internal class ParticipationFragment : QwarkFragment(), CourseAdapter.CourseClickListener {
|
||||
@@ -88,7 +87,7 @@ internal class ParticipationFragment : QwarkFragment(), CourseAdapter.CourseClic
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
binding.recyclerView.applyPadding(verticalPadding = 4)
|
||||
binding.recyclerView.applyPadding(horizontalPadding = 4)
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
@@ -118,11 +117,11 @@ internal class ParticipationFragment : QwarkFragment(), CourseAdapter.CourseClic
|
||||
}
|
||||
|
||||
private fun openLinkSheet() {
|
||||
openBottomSheet(ParticipationLinkBottomSheet())
|
||||
openBottomSheet(ParticipationLinkSheet())
|
||||
}
|
||||
|
||||
private fun openRemoveLinkSheet(courseName: String, relationId: Int) {
|
||||
openBottomSheet(ConfirmDeletionBottomSheet(
|
||||
openBottomSheet(ConfirmDeletionSheet(
|
||||
getString(R.string.confirm_remove_participation_link, courseName, getDay())
|
||||
) {
|
||||
viewModel.removeLink(relationId)
|
||||
|
||||
@@ -50,8 +50,8 @@ open class QwarkFragment : Fragment() {
|
||||
* Initialise view resources
|
||||
*/
|
||||
statusBarView = view.rootView.findViewById(R.id.status_bar_view)
|
||||
appBarTitleView = view.rootView.findViewById(R.id.toolbarTxt)
|
||||
superTitleView = view.rootView.findViewById(R.id.text_above)
|
||||
appBarTitleView = view.rootView.findViewById(R.id.app_bar_title)
|
||||
superTitleView = view.rootView.findViewById(R.id.super_title)
|
||||
appBar = view.rootView.findViewById(R.id.app_bar_layout)
|
||||
snackBarContainer = view.rootView.findViewById(R.id.root_view)
|
||||
fab = view.rootView.findViewById(R.id.fab)
|
||||
@@ -93,11 +93,12 @@ open class QwarkFragment : Fragment() {
|
||||
* to its lifecycle owner and therefore cannot calculate the top padding properly. Invoke in
|
||||
* onResume instead.
|
||||
*/
|
||||
protected fun <T : View> T.applyPadding(verticalPadding: Int = 0) {
|
||||
protected fun <T : View> T.applyPadding(horizontalPadding: Int = 0) {
|
||||
val horizontal = horizontalPadding.dpToPx()
|
||||
setPadding(
|
||||
verticalPadding.dpToPx(),
|
||||
horizontal,
|
||||
(statusBarView.height / 1) + appBar.height,
|
||||
verticalPadding.dpToPx(),
|
||||
horizontal,
|
||||
0
|
||||
)
|
||||
}
|
||||
|
||||
@@ -5,15 +5,14 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ArrayAdapter
|
||||
import androidx.fragment.app.viewModels
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import com.denizd.qwark.R
|
||||
import com.denizd.qwark.sheet.ConfirmDeletionBottomSheet
|
||||
import com.denizd.qwark.sheet.CopyCoursesBottomSheet
|
||||
import com.denizd.qwark.sheet.ScoreProfileCreateBottomSheet
|
||||
import com.denizd.qwark.sheet.YearCreateBottomSheet
|
||||
import com.denizd.qwark.sheet.ConfirmDeletionSheet
|
||||
import com.denizd.qwark.sheet.CopyCoursesSheet
|
||||
import com.denizd.qwark.sheet.ScoreProfileCreateSheet
|
||||
import com.denizd.qwark.sheet.YearCreateSheet
|
||||
import com.denizd.qwark.databinding.SettingsFragmentBinding
|
||||
import com.denizd.qwark.model.ScoreProfile
|
||||
import com.denizd.qwark.model.SchoolYear
|
||||
import com.denizd.qwark.viewmodel.SettingsViewModel
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
@@ -22,12 +21,7 @@ class SettingsFragment : QwarkFragment() {
|
||||
|
||||
private var _binding: SettingsFragmentBinding? = null
|
||||
private val binding: SettingsFragmentBinding get() = _binding!!
|
||||
private lateinit var viewModel: SettingsViewModel
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
viewModel = ViewModelProvider(this)[SettingsViewModel::class.java]
|
||||
}
|
||||
private val viewModel: SettingsViewModel by viewModels()
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||
_binding = SettingsFragmentBinding.inflate(inflater, container, false)
|
||||
@@ -120,7 +114,7 @@ class SettingsFragment : QwarkFragment() {
|
||||
if (binding.schoolYearDropdown.text.isNullOrBlank()) {
|
||||
presentErrorSnackBar(getString(R.string.no_school_year_selected))
|
||||
} else {
|
||||
val deleteYearSheet = ConfirmDeletionBottomSheet(getString(R.string.delete_school_year_desc, binding.schoolYearDropdown.text.toString())) {
|
||||
val deleteYearSheet = ConfirmDeletionSheet(getString(R.string.delete_school_year_desc, binding.schoolYearDropdown.text.toString())) {
|
||||
viewModel.deleteSchoolYear()
|
||||
binding.schoolYearDropdown.setText("")
|
||||
}
|
||||
@@ -128,7 +122,7 @@ class SettingsFragment : QwarkFragment() {
|
||||
}
|
||||
}
|
||||
binding.copyCoursesButton.setOnClickListener {
|
||||
openBottomSheet(CopyCoursesBottomSheet())
|
||||
openBottomSheet(CopyCoursesSheet())
|
||||
}
|
||||
// binding.copyCoursesButton.setOnLongClickListener {
|
||||
// // TODO this is currently an experiment
|
||||
@@ -206,7 +200,7 @@ class SettingsFragment : QwarkFragment() {
|
||||
if (binding.scoreProfileDropdown.text.isNullOrBlank()) {
|
||||
presentErrorSnackBar(getString(R.string.no_score_profile_selected))
|
||||
} else {
|
||||
val deleteScoreProfileSheet = ConfirmDeletionBottomSheet(
|
||||
val deleteScoreProfileSheet = ConfirmDeletionSheet(
|
||||
getString(R.string.delete_score_profile_desc,
|
||||
binding.scoreProfileDropdown.text.toString())
|
||||
) {
|
||||
@@ -243,7 +237,7 @@ class SettingsFragment : QwarkFragment() {
|
||||
if (edit && currentYear == "") {
|
||||
presentErrorSnackBar(getString(R.string.no_school_year_selected))
|
||||
} else {
|
||||
val yearCreateSheet = YearCreateBottomSheet().also { sheet ->
|
||||
val yearCreateSheet = YearCreateSheet().also { sheet ->
|
||||
sheet.arguments = Bundle(1).apply {
|
||||
putString("currentYear", if (edit) currentYear else "")
|
||||
}
|
||||
@@ -264,7 +258,7 @@ class SettingsFragment : QwarkFragment() {
|
||||
if (edit && currentScoreProfile == "") {
|
||||
presentErrorSnackBar(getString(R.string.no_score_profile_selected))
|
||||
} else {
|
||||
openBottomSheet(ScoreProfileCreateBottomSheet().also { sheet ->
|
||||
openBottomSheet(ScoreProfileCreateSheet().also { sheet ->
|
||||
sheet.arguments = Bundle(1).apply {
|
||||
putString("currentScoreProfile", if (edit) currentScoreProfile else "")
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.WindowManager
|
||||
import android.widget.Toast
|
||||
import com.denizd.qwark.R
|
||||
import com.denizd.qwark.databinding.ClassSessionSheetBinding
|
||||
@@ -32,6 +33,7 @@ class ClassSessionSheet : BottomSheetDialogFragment() {
|
||||
field = value
|
||||
binding.spokenButton.text = "$value"
|
||||
}
|
||||
private var participationId = -1
|
||||
private val time: Long = System.currentTimeMillis()
|
||||
|
||||
override fun onAttach(context: Context) {
|
||||
@@ -46,12 +48,20 @@ class ClassSessionSheet : BottomSheetDialogFragment() {
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
participationFragment = targetFragment as ParticipationCourseFragment
|
||||
|
||||
arguments?.let { args ->
|
||||
timesHandRaised = args.getInt ("timesHandRaised")
|
||||
timesSpoken = args.getInt("timesSpoken")
|
||||
participationId = args.getInt("participationId")
|
||||
binding.title.text = getString(R.string.class_session_resumed)
|
||||
}
|
||||
|
||||
binding.handRaisedButton.apply {
|
||||
setCompoundDrawables(context.getDrawable(R.drawable.hand).also { drawable ->
|
||||
drawable?.bounds = Rect(0, 0, 256, 256)
|
||||
drawable?.setTint(mContext.getColor(R.color.colorAccent))
|
||||
setCompoundDrawables(context.getDrawable(R.drawable.hand)?.also { drawable ->
|
||||
drawable.bounds = Rect(0, 0, 256, 256)
|
||||
drawable.setTint(mContext.getColor(R.color.colorAccent))
|
||||
}, null, null, null)
|
||||
text = "$timesHandRaised"
|
||||
setOnClickListener {
|
||||
@@ -66,9 +76,9 @@ class ClassSessionSheet : BottomSheetDialogFragment() {
|
||||
}
|
||||
}
|
||||
binding.spokenButton.apply {
|
||||
setCompoundDrawables(context.getDrawable(R.drawable.speech).also { drawable ->
|
||||
drawable?.bounds = Rect(0, 0, 256, 256)
|
||||
drawable?.setTint(mContext.getColor(R.color.colorAccent))
|
||||
setCompoundDrawables(context.getDrawable(R.drawable.speech)?.also { drawable ->
|
||||
drawable.bounds = Rect(0, 0, 256, 256)
|
||||
drawable.setTint(mContext.getColor(R.color.colorAccent))
|
||||
}, null, null, null)
|
||||
text = "$timesSpoken"
|
||||
setOnClickListener {
|
||||
@@ -104,6 +114,16 @@ class ClassSessionSheet : BottomSheetDialogFragment() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
_binding = null
|
||||
@@ -116,8 +136,10 @@ class ClassSessionSheet : BottomSheetDialogFragment() {
|
||||
}
|
||||
|
||||
private fun finish() {
|
||||
participationFragment.createParticipation(
|
||||
timesHandRaised, timesSpoken, time
|
||||
)
|
||||
if (participationId == -1) {
|
||||
participationFragment.createParticipation(timesHandRaised, timesSpoken, time)
|
||||
} else {
|
||||
participationFragment.updateParticipation(timesHandRaised, timesSpoken, participationId)
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -10,7 +10,7 @@ import com.denizd.qwark.databinding.ConfirmationDialogBinding
|
||||
import com.denizd.qwark.viewmodel.ConfirmDeletionViewModel
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
|
||||
class ConfirmDeletionBottomSheet() : BottomSheetDialogFragment() {
|
||||
class ConfirmDeletionSheet() : BottomSheetDialogFragment() {
|
||||
|
||||
constructor(text: String, confirmedAction: () -> Unit) : this() {
|
||||
this.text = text
|
||||
+2
-2
@@ -12,7 +12,7 @@ import com.denizd.qwark.fragment.SettingsFragment
|
||||
import com.denizd.qwark.model.SchoolYear
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
|
||||
internal class CopyCoursesBottomSheet : BottomSheetDialogFragment(), YearAdapter.YearClickListener {
|
||||
class CopyCoursesSheet : BottomSheetDialogFragment(), YearAdapter.YearClickListener {
|
||||
|
||||
private var _binding: RecyclerDialogBinding? = null
|
||||
private val binding: RecyclerDialogBinding get() = _binding!!
|
||||
@@ -41,7 +41,7 @@ internal class CopyCoursesBottomSheet : BottomSheetDialogFragment(), YearAdapter
|
||||
layoutManager = LinearLayoutManager(context)
|
||||
adapter = YearAdapter((settingsTargetFragment.getSchoolYears() ?: ArrayList()).filter { y ->
|
||||
y.yearId != settingsTargetFragment.getCurrentSchoolYearId()
|
||||
}, this@CopyCoursesBottomSheet)
|
||||
}, this@CopyCoursesSheet)
|
||||
scheduleLayoutAnimation()
|
||||
}
|
||||
}
|
||||
+7
-6
@@ -7,6 +7,7 @@ import android.text.TextWatcher
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import com.denizd.qwark.R
|
||||
import com.denizd.qwark.util.QwarkUtil
|
||||
import com.denizd.qwark.databinding.CourseCreateDialogBinding
|
||||
@@ -15,7 +16,7 @@ import com.denizd.qwark.model.Course
|
||||
import com.denizd.qwark.model.CourseExam
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
|
||||
internal class CourseCreateBottomSheet : BottomSheetDialogFragment() {
|
||||
class CourseCreateSheet : BottomSheetDialogFragment() {
|
||||
|
||||
private var _binding: CourseCreateDialogBinding? = null
|
||||
private val binding: CourseCreateDialogBinding get() = _binding!!
|
||||
@@ -25,7 +26,7 @@ internal class CourseCreateBottomSheet : BottomSheetDialogFragment() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
if (arguments?.size() ?: 0 != 0) course = QwarkUtil.getCourseFromBundle(arguments)
|
||||
if (arguments?.size() ?: 0 != 0) course = (targetFragment as CourseFragment).getCourse(arguments?.getInt("courseId") ?: -1) // QwarkUtil.getCourseFromBundle(arguments)
|
||||
}
|
||||
|
||||
override fun onAttach(context: Context) {
|
||||
@@ -121,17 +122,17 @@ internal class CourseCreateBottomSheet : BottomSheetDialogFragment() {
|
||||
_binding = null
|
||||
}
|
||||
|
||||
private fun openIconBottomSheet() = fragmentManager?.let { fm ->
|
||||
val sheet = IconPickerBottomSheet().apply {
|
||||
private fun openIconBottomSheet() {
|
||||
val sheet = IconPickerSheet().apply {
|
||||
arguments = Bundle(1).apply {
|
||||
putString("currentIcon", icon)
|
||||
}
|
||||
}
|
||||
sheet.setTargetFragment(this, 42)
|
||||
sheet.show(fm, sheet.tag)
|
||||
sheet.show((context as FragmentActivity).supportFragmentManager, sheet.tag)
|
||||
}
|
||||
|
||||
internal fun setIcon(icon: String) {
|
||||
fun setIcon(icon: String) {
|
||||
binding.imageView.setImageResource(QwarkUtil.getDrawableIntForString(icon))
|
||||
this.icon = icon
|
||||
}
|
||||
+8
-9
@@ -8,21 +8,20 @@ import android.view.ViewGroup
|
||||
import com.denizd.qwark.R
|
||||
import com.denizd.qwark.databinding.CourseOptionsDialogBinding
|
||||
import com.denizd.qwark.fragment.CourseFragment
|
||||
import com.denizd.qwark.model.Course
|
||||
import com.denizd.qwark.model.CourseExam
|
||||
import com.denizd.qwark.util.QwarkUtil
|
||||
import com.denizd.qwark.util.asCourse
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
|
||||
internal class CourseOptionsBottomSheet : BottomSheetDialogFragment() {
|
||||
class CourseOptionsSheet : BottomSheetDialogFragment() {
|
||||
|
||||
private var _binding: CourseOptionsDialogBinding? = null
|
||||
private val binding: CourseOptionsDialogBinding get() = _binding!!
|
||||
private lateinit var mContext: Context
|
||||
private lateinit var course: CourseExam
|
||||
private lateinit var courseExam: CourseExam
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
course = QwarkUtil.getCourseFromBundle(arguments)
|
||||
courseExam = (targetFragment as CourseFragment).getCourse(arguments?.getInt("courseId") ?: -1)
|
||||
}
|
||||
|
||||
override fun onAttach(context: Context) {
|
||||
@@ -40,18 +39,18 @@ internal class CourseOptionsBottomSheet : BottomSheetDialogFragment() {
|
||||
|
||||
val targetFragment = targetFragment as CourseFragment
|
||||
|
||||
binding.title.text = getString(R.string.options_for_course, course.name)
|
||||
binding.title.text = getString(R.string.options_for_course, courseExam.name)
|
||||
|
||||
binding.viewHistoryButton.setOnClickListener {
|
||||
targetFragment.createHistoryDialog(course.courseId, course.name)
|
||||
targetFragment.createHistoryDialog(courseExam.courseId, courseExam.name)
|
||||
dismiss()
|
||||
}
|
||||
binding.editCourseButton.setOnClickListener {
|
||||
targetFragment.createCourseDialog(course)
|
||||
targetFragment.createCourseDialog(courseExam)
|
||||
dismiss()
|
||||
}
|
||||
binding.deleteCourseButton.setOnClickListener {
|
||||
targetFragment.deleteCourse(QwarkUtil.getCourseExamAsCourse(course))
|
||||
targetFragment.deleteCourse(courseExam.asCourse())
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
+5
-18
@@ -5,24 +5,24 @@ import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ArrayAdapter
|
||||
import com.denizd.qwark.R
|
||||
import com.denizd.qwark.util.QwarkUtil
|
||||
import com.denizd.qwark.databinding.FinalGradeEditDialogBinding
|
||||
import com.denizd.qwark.fragment.FinalsFragment
|
||||
import com.denizd.qwark.model.FinalGrade
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
|
||||
internal class FinalsCreateBottomSheet : BottomSheetDialogFragment() {
|
||||
class FinalsCreateSheet : BottomSheetDialogFragment() {
|
||||
|
||||
private var _binding: FinalGradeEditDialogBinding? = null
|
||||
private val binding: FinalGradeEditDialogBinding get() = _binding!!
|
||||
private lateinit var mContext: Context
|
||||
private lateinit var finalGrade: FinalGrade
|
||||
private lateinit var finalsFragment: FinalsFragment
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
finalGrade = QwarkUtil.getFinalGradeFromBundle(arguments)
|
||||
finalsFragment = targetFragment as FinalsFragment
|
||||
finalGrade = finalsFragment.getFinalGrade(arguments?.getInt("finalGradeId") ?: -1)
|
||||
}
|
||||
|
||||
override fun onAttach(context: Context) {
|
||||
@@ -38,20 +38,7 @@ internal class FinalsCreateBottomSheet : BottomSheetDialogFragment() {
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
val targetFragment = targetFragment as FinalsFragment
|
||||
|
||||
binding.courseEdittext.setText(finalGrade.name)
|
||||
|
||||
// val gradeArray = ArrayAdapter.createFromResource(mContext, R.array.grades_points, R.layout.dropdown_item)
|
||||
// binding.gradePicker.setAdapter(gradeArray)
|
||||
// binding.gradePicker.setText(
|
||||
// if (finalGrade.grade == "-1") {
|
||||
// binding.gradePicker.adapter.getItem(0).toString()
|
||||
// } else {
|
||||
// QwarkUtil.getGradeWithLeadingZero(finalGrade.grade.toInt())
|
||||
// },
|
||||
// false
|
||||
// )
|
||||
binding.gradePicker.value = if (finalGrade.grade == "-1") 0 else finalGrade.grade.toInt()
|
||||
|
||||
binding.cancelButton.setOnClickListener {
|
||||
@@ -71,7 +58,7 @@ internal class FinalsCreateBottomSheet : BottomSheetDialogFragment() {
|
||||
finalGradeId = finalGrade.finalGradeId,
|
||||
scoreProfileId = finalGrade.scoreProfileId
|
||||
)
|
||||
targetFragment.update(newFinalGrade)
|
||||
finalsFragment.update(newFinalGrade)
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
+16
-16
@@ -8,28 +8,28 @@ import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.denizd.qwark.R
|
||||
import com.denizd.qwark.adapter.CourseAdapter
|
||||
import com.denizd.qwark.adapter.YearAdapter
|
||||
import com.denizd.qwark.util.QwarkUtil
|
||||
import com.denizd.qwark.databinding.RecyclerDialogBinding
|
||||
import com.denizd.qwark.fragment.FinalsFragment
|
||||
import com.denizd.qwark.model.Course
|
||||
import com.denizd.qwark.model.CourseExam
|
||||
import com.denizd.qwark.model.FinalGrade
|
||||
import com.denizd.qwark.model.SchoolYear
|
||||
import com.denizd.qwark.util.getSorted
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
import java.math.BigDecimal
|
||||
import java.math.RoundingMode
|
||||
|
||||
internal class FinalsLinkBottomSheet : BottomSheetDialogFragment(), YearAdapter.YearClickListener, CourseAdapter.CourseClickListener {
|
||||
class FinalsLinkSheet : BottomSheetDialogFragment(), YearAdapter.YearClickListener, CourseAdapter.CourseClickListener {
|
||||
|
||||
private lateinit var finalGrade: FinalGrade
|
||||
private lateinit var binding: RecyclerDialogBinding
|
||||
private var advanced = false
|
||||
private var isSelectingCourse = false
|
||||
private lateinit var finalsTargetFragment: FinalsFragment
|
||||
private lateinit var finalsFragment: FinalsFragment
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
finalGrade = QwarkUtil.getFinalGradeFromBundle(arguments)
|
||||
finalsFragment = targetFragment as FinalsFragment
|
||||
finalGrade = finalsFragment.getFinalGrade(arguments?.getInt("finalGradeId") ?: -1)
|
||||
advanced = finalGrade.type == "adv"
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ internal class FinalsLinkBottomSheet : BottomSheetDialogFragment(), YearAdapter.
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
finalsTargetFragment = targetFragment as FinalsFragment
|
||||
finalsFragment = targetFragment as FinalsFragment
|
||||
fillWithYears()
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ internal class FinalsLinkBottomSheet : BottomSheetDialogFragment(), YearAdapter.
|
||||
finalGradeId = finalGrade.finalGradeId,
|
||||
scoreProfileId = finalGrade.scoreProfileId
|
||||
)
|
||||
finalsTargetFragment.update(newFinalGrade)
|
||||
finalsFragment.update(newFinalGrade)
|
||||
dismiss()
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ internal class FinalsLinkBottomSheet : BottomSheetDialogFragment(), YearAdapter.
|
||||
binding.title.text = getString(R.string.pick_a_year)
|
||||
binding.recyclerView.apply {
|
||||
layoutManager = LinearLayoutManager(context)
|
||||
adapter = YearAdapter(finalsTargetFragment.getAllYears(), this@FinalsLinkBottomSheet)
|
||||
adapter = YearAdapter(finalsFragment.getAllYears(), this@FinalsLinkSheet)
|
||||
scheduleLayoutAnimation()
|
||||
}
|
||||
isSelectingCourse = false
|
||||
@@ -77,14 +77,14 @@ internal class FinalsLinkBottomSheet : BottomSheetDialogFragment(), YearAdapter.
|
||||
|
||||
private fun fillWithCourses(schoolYear: SchoolYear) {
|
||||
binding.title.text = getString(R.string.pick_a_course)
|
||||
binding.recyclerView.adapter =
|
||||
CourseAdapter(
|
||||
QwarkUtil.getCoursesSorted(
|
||||
finalsTargetFragment.getAllCourses().filter { c -> c.yearId == schoolYear.yearId && c.advanced == advanced },
|
||||
finalsTargetFragment.getCourseSortType()
|
||||
),
|
||||
this,
|
||||
finalsTargetFragment.getGradeType()
|
||||
binding.recyclerView.adapter = CourseAdapter(
|
||||
finalsFragment.getAllCourses().filter { c ->
|
||||
c.yearId == schoolYear.yearId && c.advanced == advanced
|
||||
}.getSorted(
|
||||
finalsFragment.getCourseSortType()
|
||||
),
|
||||
this,
|
||||
finalsFragment.getGradeType()
|
||||
)
|
||||
binding.recyclerView.scheduleLayoutAnimation()
|
||||
isSelectingCourse = true
|
||||
+9
-9
@@ -12,16 +12,18 @@ import com.denizd.qwark.model.FinalGrade
|
||||
import com.denizd.qwark.util.QwarkUtil
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
|
||||
internal class FinalsOptionsBottomSheet : BottomSheetDialogFragment() {
|
||||
class FinalsOptionsSheet : BottomSheetDialogFragment() {
|
||||
|
||||
private var _binding: FinalGradeOptionsDialogBinding? = null
|
||||
private val binding: FinalGradeOptionsDialogBinding get() = _binding!!
|
||||
private lateinit var mContext: Context
|
||||
private lateinit var finalGrade: FinalGrade
|
||||
private lateinit var finalsFragment: FinalsFragment
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
finalGrade = QwarkUtil.getFinalGradeFromBundle(arguments)
|
||||
finalsFragment = targetFragment as FinalsFragment
|
||||
finalGrade = finalsFragment.getFinalGrade(arguments?.getInt("finalGradeId") ?: -1)
|
||||
}
|
||||
|
||||
override fun onAttach(context: Context) {
|
||||
@@ -36,30 +38,28 @@ internal class FinalsOptionsBottomSheet : BottomSheetDialogFragment() {
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
val targetFragment = targetFragment as FinalsFragment
|
||||
|
||||
binding.title.text = getString(R.string.options_for_final_grade, if (finalGrade.name.isEmpty()) getString(R.string.final_grade) else finalGrade.name)
|
||||
|
||||
if (finalGrade.type == "exam") binding.linkGradeButton.visibility = View.GONE
|
||||
if (finalGrade.courseId == -1) binding.viewLinkedCourseButton.visibility = View.GONE
|
||||
binding.editGradeButton.setOnClickListener {
|
||||
targetFragment.createEditGradeSheet(finalGrade)
|
||||
finalsFragment.createEditGradeSheet(finalGrade)
|
||||
dismiss()
|
||||
}
|
||||
binding.linkGradeButton.setOnClickListener {
|
||||
targetFragment.createLinkGradeSheet(finalGrade)
|
||||
finalsFragment.createLinkGradeSheet(finalGrade)
|
||||
dismiss()
|
||||
}
|
||||
binding.viewLinkedCourseButton.setOnClickListener {
|
||||
targetFragment.viewLinkedCourse(finalGrade.courseId)
|
||||
finalsFragment.viewLinkedCourse(finalGrade.courseId)
|
||||
dismiss()
|
||||
}
|
||||
binding.clearGradeButton.setOnClickListener {
|
||||
if (finalGrade.grade == "-1") {
|
||||
targetFragment.clearFinalGradeError()
|
||||
finalsFragment.clearFinalGradeError()
|
||||
} else {
|
||||
targetFragment.clearFinalGrade(finalGrade)
|
||||
finalsFragment.clearFinalGrade(finalGrade)
|
||||
}
|
||||
dismiss()
|
||||
}
|
||||
+14
-10
@@ -5,10 +5,10 @@ import android.content.Context
|
||||
import android.os.Bundle
|
||||
import android.text.Editable
|
||||
import android.text.TextWatcher
|
||||
import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.LinearLayout
|
||||
import com.denizd.qwark.R
|
||||
import com.denizd.qwark.util.QwarkUtil
|
||||
import com.denizd.qwark.databinding.GradeCreateDialogBinding
|
||||
@@ -18,18 +18,24 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
import java.text.ParseException
|
||||
import java.util.*
|
||||
|
||||
class GradeCreateBottomSheet : BottomSheetDialogFragment() {
|
||||
class GradeCreateSheet : BottomSheetDialogFragment() {
|
||||
|
||||
private var _binding: GradeCreateDialogBinding? = null
|
||||
private val binding: GradeCreateDialogBinding get() = _binding!!
|
||||
private lateinit var mContext: Context
|
||||
private lateinit var grade: Grade
|
||||
private var courseId: Int = 0
|
||||
private lateinit var gradeFragment: GradeFragment
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
if (arguments?.size() ?: 0 > 1) grade = QwarkUtil.getGradeFromBundle(arguments)
|
||||
courseId = arguments?.getInt("courseId") ?: 0
|
||||
gradeFragment = targetFragment as GradeFragment
|
||||
val gradeId = arguments?.getInt("gradeId") ?: -1
|
||||
if (gradeId == 0) { // 0 signifies no value has been set
|
||||
courseId = arguments?.getInt("courseId") ?: -1
|
||||
} else {
|
||||
grade = gradeFragment.getGrade(gradeId)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onAttach(context: Context) {
|
||||
@@ -47,11 +53,9 @@ class GradeCreateBottomSheet : BottomSheetDialogFragment() {
|
||||
|
||||
LayoutTransition().apply {
|
||||
setAnimateParentHierarchy(false)
|
||||
(binding.root as LinearLayout).layoutTransition = this
|
||||
binding.root.layoutTransition = this
|
||||
}
|
||||
|
||||
val targetFragment = targetFragment as GradeFragment
|
||||
|
||||
// initGradeDropdown()
|
||||
|
||||
binding.verbalSwitch.setOnCheckedChangeListener { switch, isChecked ->
|
||||
@@ -79,7 +83,7 @@ class GradeCreateBottomSheet : BottomSheetDialogFragment() {
|
||||
}
|
||||
}
|
||||
|
||||
binding.gradePicker.displayedValues = QwarkUtil.getGradeArray(targetFragment.getGradeType())
|
||||
binding.gradePicker.displayedValues = QwarkUtil.getGradeArray(gradeFragment.getGradeType())
|
||||
|
||||
binding.examSwitch.setOnCheckedChangeListener { _, isChecked ->
|
||||
setGradePickerVisibility(isChecked)
|
||||
@@ -119,9 +123,9 @@ class GradeCreateBottomSheet : BottomSheetDialogFragment() {
|
||||
examTime = if (binding.examSwitch.isChecked) examDate else -1L
|
||||
)
|
||||
if (::grade.isInitialized) {
|
||||
targetFragment.update(newGrade)
|
||||
gradeFragment.update(newGrade)
|
||||
} else {
|
||||
targetFragment.insert(newGrade)
|
||||
gradeFragment.insert(newGrade)
|
||||
}
|
||||
dismiss()
|
||||
} catch (e: ParseException) {
|
||||
+1
-1
@@ -12,7 +12,7 @@ import com.denizd.qwark.databinding.RecyclerDialogBinding
|
||||
import com.denizd.qwark.fragment.CourseFragment
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
|
||||
internal class HistoricalAverageBottomSheet : BottomSheetDialogFragment() {
|
||||
class HistoricalAverageSheet : BottomSheetDialogFragment() {
|
||||
|
||||
private var _binding: RecyclerDialogBinding? = null
|
||||
private val binding: RecyclerDialogBinding get() = _binding!!
|
||||
+2
-2
@@ -12,7 +12,7 @@ import com.denizd.qwark.databinding.IconDialogBinding
|
||||
import com.denizd.qwark.model.CourseIcon
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
|
||||
class IconPickerBottomSheet : BottomSheetDialogFragment(),
|
||||
class IconPickerSheet : BottomSheetDialogFragment(),
|
||||
IconAdapter.IconClickListener {
|
||||
|
||||
private var _binding: IconDialogBinding? = null
|
||||
@@ -39,7 +39,7 @@ class IconPickerBottomSheet : BottomSheetDialogFragment(),
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
val targetFragment = targetFragment as CourseCreateBottomSheet
|
||||
val targetFragment = targetFragment as CourseCreateSheet
|
||||
val icons = QwarkUtil.drawablesList
|
||||
iconAdapter = IconAdapter(icons, this)
|
||||
|
||||
+2
-2
@@ -13,7 +13,7 @@ import com.denizd.qwark.model.Note
|
||||
import com.denizd.qwark.util.QwarkUtil
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
|
||||
internal class NoteCreateBottomSheet : BottomSheetDialogFragment() {
|
||||
class NoteCreateSheet : BottomSheetDialogFragment() {
|
||||
|
||||
private var _binding: NoteCreateDialogBinding? = null
|
||||
private val binding: NoteCreateDialogBinding get() = _binding!!
|
||||
@@ -22,7 +22,7 @@ internal class NoteCreateBottomSheet : BottomSheetDialogFragment() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
if (arguments?.size() ?: 0 != 0) note = QwarkUtil.getNoteFromBundle(arguments)
|
||||
if (arguments?.size() ?: 0 != 0) note = (targetFragment as NoteFragment).getNote(arguments?.getInt("noteId") ?: -1)
|
||||
}
|
||||
|
||||
override fun onAttach(context: Context) {
|
||||
+3
-14
@@ -8,10 +8,11 @@ import android.view.ViewGroup
|
||||
import com.denizd.qwark.R
|
||||
import com.denizd.qwark.util.QwarkUtil
|
||||
import com.denizd.qwark.databinding.NoteBottomSheetBinding
|
||||
import com.denizd.qwark.fragment.NoteFragment
|
||||
import com.denizd.qwark.model.Note
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
|
||||
internal class NoteDisplayBottomSheet : BottomSheetDialogFragment() {
|
||||
class NoteDisplaySheet : BottomSheetDialogFragment() {
|
||||
|
||||
private var _binding: NoteBottomSheetBinding? = null
|
||||
private val binding: NoteBottomSheetBinding get() = _binding!!
|
||||
@@ -20,7 +21,7 @@ internal class NoteDisplayBottomSheet : BottomSheetDialogFragment() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
note = QwarkUtil.getNoteFromBundle(arguments)
|
||||
note = (targetFragment as NoteFragment).getNote(arguments?.getInt("noteId") ?: -1)
|
||||
}
|
||||
|
||||
override fun onAttach(context: Context) {
|
||||
@@ -33,18 +34,6 @@ internal class NoteDisplayBottomSheet : BottomSheetDialogFragment() {
|
||||
return binding.root
|
||||
}
|
||||
|
||||
// override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||
// return super.onCreateDialog(savedInstanceState).also { dialog ->
|
||||
// dialog.setOnShowListener {
|
||||
// BottomSheetBehavior.from(dialog.findViewById<FrameLayout>(
|
||||
// com.google.android.material.R.id.design_bottom_sheet
|
||||
// )).apply {
|
||||
// state = BottomSheetBehavior.STATE_EXPANDED
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ import com.denizd.qwark.model.Note
|
||||
import com.denizd.qwark.util.QwarkUtil
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
|
||||
internal class NoteOptionsBottomSheet : BottomSheetDialogFragment() {
|
||||
class NoteOptionsSheet : BottomSheetDialogFragment() {
|
||||
|
||||
private var _binding: NoteOptionsDialogBinding? = null
|
||||
private val binding: NoteOptionsDialogBinding get() = _binding!!
|
||||
@@ -21,7 +21,7 @@ internal class NoteOptionsBottomSheet : BottomSheetDialogFragment() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
note = QwarkUtil.getNoteFromBundle(arguments)
|
||||
note = (targetFragment as NoteFragment).getNote(arguments?.getInt("noteId") ?: -1)
|
||||
}
|
||||
|
||||
override fun onAttach(context: Context) {
|
||||
+2
-2
@@ -12,7 +12,7 @@ import com.denizd.qwark.fragment.ParticipationFragment
|
||||
import com.denizd.qwark.model.*
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
|
||||
internal class ParticipationLinkBottomSheet : BottomSheetDialogFragment(), CourseAdapter.CourseClickListener {
|
||||
class ParticipationLinkSheet : BottomSheetDialogFragment(), CourseAdapter.CourseClickListener {
|
||||
|
||||
private lateinit var finalGrade: FinalGrade
|
||||
private lateinit var binding: RecyclerDialogBinding
|
||||
@@ -58,7 +58,7 @@ internal class ParticipationLinkBottomSheet : BottomSheetDialogFragment(), Cours
|
||||
0
|
||||
)
|
||||
},
|
||||
this@ParticipationLinkBottomSheet,
|
||||
this@ParticipationLinkSheet,
|
||||
null
|
||||
)
|
||||
layoutManager = LinearLayoutManager(context)
|
||||
+1
-1
@@ -5,7 +5,7 @@ import android.view.View
|
||||
import com.denizd.qwark.R
|
||||
import com.denizd.qwark.fragment.SettingsFragment
|
||||
|
||||
internal class ScoreProfileCreateBottomSheet : TextInputBottomSheet() {
|
||||
class ScoreProfileCreateSheet : TextInputSheet() {
|
||||
|
||||
private lateinit var settingsFragment: SettingsFragment
|
||||
private var currentScoreProfile: String = ""
|
||||
+1
-1
@@ -8,7 +8,7 @@ import android.view.ViewGroup
|
||||
import com.denizd.qwark.databinding.TextInputSheetBinding
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
|
||||
internal open class TextInputBottomSheet : BottomSheetDialogFragment() {
|
||||
open class TextInputSheet : BottomSheetDialogFragment() {
|
||||
|
||||
protected var _binding: TextInputSheetBinding? = null
|
||||
protected val binding: TextInputSheetBinding get() = _binding!!
|
||||
+1
-1
@@ -6,7 +6,7 @@ import com.denizd.qwark.R
|
||||
import com.denizd.qwark.fragment.SettingsFragment
|
||||
import com.denizd.qwark.model.SchoolYear
|
||||
|
||||
internal class YearCreateBottomSheet : TextInputBottomSheet() {
|
||||
class YearCreateSheet : TextInputSheet() {
|
||||
|
||||
private lateinit var settingsFragment: SettingsFragment
|
||||
private var currentYear: String = ""
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.denizd.qwark.util
|
||||
import com.denizd.qwark.model.Course
|
||||
import com.denizd.qwark.model.CourseExam
|
||||
|
||||
fun List<CourseExam>.getSorted(sortType: Int): List<CourseExam> = when (sortType) { // TODO check what ascending and descending really mean lol
|
||||
QwarkUtil.SORT_COURSES_TIME_ASC -> this.asReversed()
|
||||
QwarkUtil.SORT_COURSES_NAME_ASC -> this.sortedBy { c -> c.name }
|
||||
QwarkUtil.SORT_COURSES_NAME_DESC -> this.sortedByDescending { c -> c.name }
|
||||
QwarkUtil.SORT_COURSES_ADV -> this.sortedByDescending { c -> c.advanced }
|
||||
QwarkUtil.SORT_COURSES_BASIC -> this.sortedBy { c -> c.advanced }
|
||||
QwarkUtil.SORT_COURSES_AVG_ASC -> this.sortedBy { c -> c.average.toDouble() }
|
||||
QwarkUtil.SORT_COURSES_AVG_DESC -> this.sortedByDescending { c -> c.average.toDouble() }
|
||||
QwarkUtil.SORT_COURSES_NEXT_EXAM -> this.sortedBy { c -> if (c.examTime > 1L) c.examTime else Long.MAX_VALUE }
|
||||
else -> this // TIME_DESC
|
||||
}
|
||||
|
||||
fun CourseExam.asCourse(): Course = Course(
|
||||
name = name,
|
||||
advanced = advanced,
|
||||
icon = icon,
|
||||
colour = colour,
|
||||
average = average,
|
||||
oralWeighting = oralWeighting,
|
||||
gradeCount = gradeCount,
|
||||
time = time,
|
||||
courseId = courseId,
|
||||
yearId = yearId
|
||||
)
|
||||
@@ -1,5 +1,5 @@
|
||||
package com.denizd.qwark.util
|
||||
|
||||
internal interface OnBackPressed {
|
||||
interface OnBackPressed {
|
||||
fun onBackPressed(): Boolean
|
||||
}
|
||||
@@ -4,14 +4,14 @@ import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import androidx.preference.PreferenceManager
|
||||
|
||||
internal class QwarkPreferences private constructor(context: Context) {
|
||||
class QwarkPreferences private constructor(context: Context) {
|
||||
|
||||
private val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
private val edit: SharedPreferences.Editor = prefs.edit()
|
||||
|
||||
companion object {
|
||||
private var qwarkPrefs: QwarkPreferences? = null
|
||||
internal fun getPrefs(context: Context): QwarkPreferences {
|
||||
fun getPrefs(context: Context): QwarkPreferences {
|
||||
if (qwarkPrefs == null) {
|
||||
synchronized (QwarkPreferences::class) {
|
||||
qwarkPrefs = QwarkPreferences(context)
|
||||
@@ -21,31 +21,31 @@ internal class QwarkPreferences private constructor(context: Context) {
|
||||
}
|
||||
}
|
||||
|
||||
internal fun getString(key: PreferenceKey, default: String = ""): String = prefs.getString(key.value, default) ?: default
|
||||
internal fun getInt(key: PreferenceKey, default: Int = 0): Int = prefs.getInt(key.value, default)
|
||||
internal fun getBool(key: PreferenceKey, default: Boolean = false): Boolean = prefs.getBoolean(key.value, default)
|
||||
fun getString(key: PreferenceKey, default: String = ""): String = prefs.getString(key.value, default) ?: default
|
||||
fun getInt(key: PreferenceKey, default: Int = 0): Int = prefs.getInt(key.value, default)
|
||||
fun getBool(key: PreferenceKey, default: Boolean = false): Boolean = prefs.getBoolean(key.value, default)
|
||||
|
||||
internal fun putString(key: PreferenceKey, value: String): QwarkPreferences {
|
||||
fun putString(key: PreferenceKey, value: String): QwarkPreferences {
|
||||
edit.putString(key.value, value).apply()
|
||||
return this
|
||||
}
|
||||
internal fun putInt(key: PreferenceKey, value: Int): QwarkPreferences {
|
||||
fun putInt(key: PreferenceKey, value: Int): QwarkPreferences {
|
||||
edit.putInt(key.value, value).apply()
|
||||
return this
|
||||
}
|
||||
internal fun putBool(key: PreferenceKey, value: Boolean): QwarkPreferences {
|
||||
fun putBool(key: PreferenceKey, value: Boolean): QwarkPreferences {
|
||||
edit.putBoolean(key.value, value).apply()
|
||||
return this
|
||||
}
|
||||
|
||||
internal fun getShowGradeAverage(): Boolean = getBool(PreferenceKey.SHOW_GRADE_AVERAGE)
|
||||
internal fun getGradeType(): Int = getInt(PreferenceKey.GRADE_TYPE)
|
||||
internal fun getCourseSortType(): Int = getInt(PreferenceKey.COURSE_SORT_TYPE, 1)
|
||||
internal fun setCourseSortType(value: Int) { putInt(PreferenceKey.COURSE_SORT_TYPE, value) }
|
||||
internal fun getSchoolYear(): Int = getInt(PreferenceKey.SCHOOL_YEAR_ID)
|
||||
internal fun getSchoolYearName(): String = getString(PreferenceKey.SCHOOL_YEAR_NAME)
|
||||
internal fun getScoreProfileName(): String = getString(PreferenceKey.SCORE_PROFILE_NAME)
|
||||
internal fun getScoreProfileId(): Int = getInt(PreferenceKey.SCORE_PROFILE_ID)
|
||||
fun getShowGradeAverage(): Boolean = getBool(PreferenceKey.SHOW_GRADE_AVERAGE)
|
||||
fun getGradeType(): Int = getInt(PreferenceKey.GRADE_TYPE)
|
||||
fun getCourseSortType(): Int = getInt(PreferenceKey.COURSE_SORT_TYPE, 1)
|
||||
fun setCourseSortType(value: Int) { putInt(PreferenceKey.COURSE_SORT_TYPE, value) }
|
||||
fun getSchoolYear(): Int = getInt(PreferenceKey.SCHOOL_YEAR_ID)
|
||||
fun getSchoolYearName(): String = getString(PreferenceKey.SCHOOL_YEAR_NAME)
|
||||
fun getScoreProfileName(): String = getString(PreferenceKey.SCORE_PROFILE_NAME)
|
||||
fun getScoreProfileId(): Int = getInt(PreferenceKey.SCORE_PROFILE_ID)
|
||||
fun getParticipationDisplay(): Int = getInt(PreferenceKey.PARTICIPATION_DISPLAY)
|
||||
fun getParticipationDay(): Int = getInt(PreferenceKey.PARTICIPATION_DAY)
|
||||
|
||||
|
||||
@@ -148,16 +148,12 @@ object QwarkUtil {
|
||||
else -> pointGradeArray
|
||||
}
|
||||
|
||||
private fun Double.getGradeType(map: Map<Int, String>): String = map[this.roundToInt()] ?: ""
|
||||
|
||||
fun getNewGradeType(grade: Int, type: Int): String = when (type) {
|
||||
GRADE_NUMBERED -> numberedGrades[grade] ?: "error"
|
||||
GRADE_LETTERED -> letteredGrades[grade] ?: "error"
|
||||
else -> "error"
|
||||
}
|
||||
|
||||
fun getNumberForLetter(grade: String): Int = lettersToPoints[grade] ?: -1
|
||||
|
||||
val timeAtMidnight: Long = GregorianCalendar().apply {
|
||||
set(Calendar.HOUR_OF_DAY, 0)
|
||||
set(Calendar.MINUTE, 0)
|
||||
@@ -170,27 +166,15 @@ object QwarkUtil {
|
||||
const val GRADE_NUMBERED = 2
|
||||
const val GRADE_LETTERED = 3
|
||||
|
||||
private const val SORT_COURSES_TIME_ASC = 0
|
||||
private const val SORT_COURSES_TIME_DESC = 1
|
||||
private const val SORT_COURSES_NAME_ASC = 2
|
||||
private const val SORT_COURSES_NAME_DESC = 3
|
||||
private const val SORT_COURSES_ADV = 4
|
||||
private const val SORT_COURSES_BASIC = 5
|
||||
private const val SORT_COURSES_AVG_ASC = 6
|
||||
private const val SORT_COURSES_AVG_DESC = 7
|
||||
private const val SORT_COURSES_NEXT_EXAM = 8
|
||||
|
||||
fun getCoursesSorted(courses: List<CourseExam>, sortType: Int): List<CourseExam> = when (sortType) { // TODO check what ascending and descending really mean lol
|
||||
SORT_COURSES_TIME_ASC -> courses.asReversed()
|
||||
SORT_COURSES_TIME_DESC -> courses
|
||||
SORT_COURSES_NAME_ASC -> courses.sortedBy { c -> c.name }
|
||||
SORT_COURSES_NAME_DESC -> courses.sortedByDescending { c -> c.name }
|
||||
SORT_COURSES_ADV -> courses.sortedByDescending { c -> c.advanced }
|
||||
SORT_COURSES_BASIC -> courses.sortedBy { c -> c.advanced }
|
||||
SORT_COURSES_AVG_ASC -> courses.sortedBy { c -> c.average.toDouble() }
|
||||
SORT_COURSES_AVG_DESC -> courses.sortedByDescending { c -> c.average.toDouble() }
|
||||
else -> courses.sortedBy { c -> if (c.examTime > 1L) c.examTime else Long.MAX_VALUE } // NEXT_EXAM
|
||||
}
|
||||
const val SORT_COURSES_TIME_ASC = 0
|
||||
const val SORT_COURSES_TIME_DESC = 1
|
||||
const val SORT_COURSES_NAME_ASC = 2
|
||||
const val SORT_COURSES_NAME_DESC = 3
|
||||
const val SORT_COURSES_ADV = 4
|
||||
const val SORT_COURSES_BASIC = 5
|
||||
const val SORT_COURSES_AVG_ASC = 6
|
||||
const val SORT_COURSES_AVG_DESC = 7
|
||||
const val SORT_COURSES_NEXT_EXAM = 8
|
||||
|
||||
fun getGradeAsString(grade: Int, leadingZero: Boolean): String = (if (leadingZero && grade < 10) "0" else "") + grade
|
||||
fun getGradeWithLeadingZero(grade: Int) = "${if (grade < 10) "0" else ""}$grade"
|
||||
@@ -227,115 +211,4 @@ object QwarkUtil {
|
||||
}
|
||||
dialog.show()
|
||||
}
|
||||
|
||||
fun putCourseInBundle(fragment: Fragment, course: CourseExam) {
|
||||
val bundle = Bundle(11).apply {
|
||||
putString("name", course.name)
|
||||
putBoolean("advanced", course.advanced)
|
||||
putString("icon", course.icon)
|
||||
putString("colour", course.colour)
|
||||
putString("average", course.average)
|
||||
putInt("oralWeighting", course.oralWeighting)
|
||||
putInt("gradeCount", course.gradeCount)
|
||||
putLong("time", course.time)
|
||||
putInt("courseId", course.courseId)
|
||||
putInt("yearId", course.yearId)
|
||||
putLong("examTime", course.examTime)
|
||||
}
|
||||
fragment.arguments = bundle
|
||||
}
|
||||
|
||||
fun getCourseFromBundle(bundle: Bundle?) = CourseExam(
|
||||
name = bundle?.getString("name") ?: "",
|
||||
advanced = bundle?.getBoolean("advanced") ?: false,
|
||||
icon = bundle?.getString("icon") ?: "",
|
||||
colour = bundle?.getString("colour") ?: "",
|
||||
average = bundle?.getString("average") ?: "",
|
||||
oralWeighting = bundle?.getInt("oralWeighting") ?: 0,
|
||||
gradeCount = bundle?.getInt("gradeCount") ?: 0,
|
||||
time = bundle?.getLong("time") ?: 0L,
|
||||
courseId = bundle?.getInt("courseId") ?: 0,
|
||||
yearId = bundle?.getInt("yearId") ?: 0,
|
||||
examTime = bundle?.getLong("examTime") ?: 0L
|
||||
)
|
||||
|
||||
fun putFinalGradeInBundle(fragment: Fragment, finalGrade: FinalGrade) {
|
||||
val bundle = Bundle(7).apply {
|
||||
putString("name", finalGrade.name)
|
||||
putInt("courseId", finalGrade.courseId)
|
||||
putString("grade", finalGrade.grade)
|
||||
putString("type", finalGrade.type)
|
||||
putString("note", finalGrade.note)
|
||||
putInt("finalGradeId", finalGrade.finalGradeId)
|
||||
putInt("scoreProfileId", finalGrade.scoreProfileId)
|
||||
}
|
||||
fragment.arguments = bundle
|
||||
}
|
||||
|
||||
fun getFinalGradeFromBundle(bundle: Bundle?) = FinalGrade(
|
||||
name = bundle?.getString("name") ?: "",
|
||||
courseId = bundle?.getInt("courseId") ?: 0,
|
||||
grade = bundle?.getString("grade") ?: "",
|
||||
type = bundle?.getString("type") ?: "",
|
||||
note = bundle?.getString("note") ?: "",
|
||||
finalGradeId = bundle?.getInt("finalGradeId") ?: 0,
|
||||
scoreProfileId = bundle?.getInt("scoreProfileId") ?: 0
|
||||
)
|
||||
|
||||
fun putGradeInBundle(fragment: Fragment, grade: Grade) {
|
||||
val bundle = Bundle(8).apply {
|
||||
putInt("grade", grade.grade)
|
||||
putString("note", grade.note)
|
||||
putBoolean("verbal", grade.verbal)
|
||||
putLong("time", grade.time)
|
||||
putInt("weighting", grade.weighting)
|
||||
putLong("examTime", grade.examTime)
|
||||
putInt("gradeId", grade.gradeId)
|
||||
putInt("courseId", grade.courseId)
|
||||
}
|
||||
fragment.arguments = bundle
|
||||
}
|
||||
|
||||
fun getGradeFromBundle(bundle: Bundle?) = Grade(
|
||||
grade = bundle?.getInt("grade") ?: 0,
|
||||
note = bundle?.getString("note") ?: "",
|
||||
verbal = bundle?.getBoolean("verbal") ?: false,
|
||||
time = bundle?.getLong("time") ?: 0L,
|
||||
weighting = bundle?.getInt("weighting") ?: 0,
|
||||
examTime = bundle?.getLong("examTime") ?: 0L,
|
||||
gradeId = bundle?.getInt("gradeId") ?: 0,
|
||||
courseId = bundle?.getInt("courseId") ?: 0
|
||||
)
|
||||
|
||||
fun putNoteInBundle(fragment: Fragment, note: Note) {
|
||||
val bundle = Bundle(5).apply {
|
||||
putString("content", note.content)
|
||||
putBoolean("dismissed", note.dismissed)
|
||||
putLong("time", note.time)
|
||||
putString("category", note.category)
|
||||
putInt("noteId", note.noteId)
|
||||
}
|
||||
fragment.arguments = bundle
|
||||
}
|
||||
|
||||
fun getNoteFromBundle(bundle: Bundle?) = Note(
|
||||
content = bundle?.getString("content") ?: "",
|
||||
dismissed = bundle?.getBoolean("dismissed") ?: false,
|
||||
time = bundle?.getLong("time") ?: 0L,
|
||||
category = bundle?.getString("category") ?: "",
|
||||
noteId = bundle?.getInt("noteId") ?: 0
|
||||
)
|
||||
|
||||
fun getCourseExamAsCourse(c: CourseExam): Course = Course(
|
||||
name = c.name,
|
||||
advanced = c.advanced,
|
||||
icon = c.icon,
|
||||
colour = c.colour,
|
||||
average = c.average,
|
||||
oralWeighting = c.oralWeighting,
|
||||
gradeCount = c.gradeCount,
|
||||
time = c.time,
|
||||
courseId = c.courseId,
|
||||
yearId = c.yearId
|
||||
)
|
||||
}
|
||||
@@ -29,4 +29,5 @@ class CourseViewModel(application: Application) : QwarkViewModel(application) {
|
||||
fun insert(course: Course) = doAsync { repo.insert(course) }
|
||||
fun update(course: Course) = doAsync { repo.update(course) }
|
||||
fun delete(course: Course) = doAsync { repo.delete(course) }
|
||||
fun getCourse(courseId: Int): CourseExam = returnBlocking { repo.getCourse(courseId) }
|
||||
}
|
||||
@@ -14,7 +14,7 @@ import java.lang.NumberFormatException
|
||||
class FinalsViewModel(app: Application) : QwarkViewModel(app) {
|
||||
|
||||
private val repo = FinalsRepository(app)
|
||||
val allFinalGrades: LiveData<List<FinalGrade>>? = repo.getFinalGrades(repo.getFinalScoreId())
|
||||
val allFinalGrades: LiveData<List<FinalGrade>> = repo.getFinalGrades(repo.getFinalScoreId())
|
||||
|
||||
fun update(finalGrade: FinalGrade) = viewModelScope.launch {
|
||||
withContext(Dispatchers.IO) {
|
||||
@@ -53,7 +53,7 @@ class FinalsViewModel(app: Application) : QwarkViewModel(app) {
|
||||
|
||||
private fun checkGrade(finalGrade: FinalGrade): Int = if (finalGrade.grade.toInt() > -1) finalGrade.grade.toInt() else throw NumberFormatException()
|
||||
|
||||
fun getFinalGrade(points: Int): Double = when (points) {
|
||||
fun getFinalGradeScore(points: Int): Double = when (points) {
|
||||
in 823..900 -> 1.0
|
||||
in 805..822 -> 1.1
|
||||
in 787..804 -> 1.2
|
||||
@@ -107,11 +107,7 @@ class FinalsViewModel(app: Application) : QwarkViewModel(app) {
|
||||
}
|
||||
}
|
||||
|
||||
fun getCourse(courseId: Int) = runBlocking {
|
||||
withContext(Dispatchers.IO) {
|
||||
repo.getCourse(courseId)
|
||||
}
|
||||
}
|
||||
|
||||
fun getCourse(courseId: Int) = returnBlocking { repo.getCourse(courseId) }
|
||||
fun getFinalGrade(finalGradeId: Int) = returnBlocking { repo.getFinalGrade(finalGradeId) }
|
||||
fun getCourseSortType() = repo.getCourseSortType()
|
||||
}
|
||||
@@ -25,4 +25,5 @@ class GradeViewModel(application: Application) : QwarkViewModel(application) {
|
||||
fun delete(gradeId: Int) = doAsync { repo.delete(gradeId) }
|
||||
|
||||
fun insert(avg: HistoricalAvg) = doAsync { repo.insert(avg) }
|
||||
fun getGrade(gradeId: Int) = returnBlocking { repo.getGrade(gradeId) }
|
||||
}
|
||||
@@ -9,7 +9,7 @@ import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
class NoteViewModel(application: Application) : AndroidViewModel(application) {
|
||||
class NoteViewModel(application: Application) : QwarkViewModel(application) {
|
||||
|
||||
private val repo = NoteRepository(application)
|
||||
private val reloadTrigger = MutableLiveData<String>()
|
||||
@@ -75,4 +75,6 @@ class NoteViewModel(application: Application) : AndroidViewModel(application) {
|
||||
repo.getAllCategories()
|
||||
}
|
||||
}
|
||||
|
||||
fun getNote(noteId: Int) = returnBlocking { repo.getNote(noteId) }
|
||||
}
|
||||
@@ -13,7 +13,12 @@ class ParticipationCourseViewModel(app: Application) : QwarkViewModel(app) {
|
||||
repo.getAllParticipationsForCourse(courseId)
|
||||
}
|
||||
fun getParticipationCount(participations: List<Participation>) = repo.getParticipationCount(participations)
|
||||
fun updateParticipation(participation: String, courseId: Int) = doAsync { repo.updateParticipation(participation, courseId) }
|
||||
fun updateParticipation(participation: String, courseId: Int) = doAsync {
|
||||
repo.updateParticipation(participation, courseId)
|
||||
}
|
||||
fun updateParticipation(timesHandRaised: Int, timesSpoken: Int, participationId: Int) = doAsync {
|
||||
repo.updateParticipation(timesHandRaised, timesSpoken, participationId)
|
||||
}
|
||||
fun createParticipation(timesHandRaised: Int, timesSpoken: Int, time: Long, courseId: Int) = doAsync {
|
||||
repo.insert(timesHandRaised, timesSpoken, time, courseId)
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text_above"
|
||||
android:id="@+id/super_title"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="16dp"
|
||||
@@ -78,7 +78,7 @@
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/toolbarTxt"
|
||||
android:id="@+id/app_bar_title"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="start"
|
||||
@@ -91,7 +91,7 @@
|
||||
android:layout_marginBottom="8dp"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="marquee"
|
||||
app:layout_constraintTop_toBottomOf="@+id/text_above"
|
||||
app:layout_constraintTop_toBottomOf="@+id/super_title"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:backgroundTint="@color/colorBackground"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingBottom="8dp">
|
||||
|
||||
<TextView
|
||||
|
||||
@@ -76,6 +76,7 @@
|
||||
<string name="exam_date">Klausurdatum (yyyy-mm-dd)</string>
|
||||
<string name="date_format_issue">Dieses Datum kann nicht verarbeitet werden</string>
|
||||
<string name="exam_past_issue">Vergangene Klausuren müssen benotet werden</string>
|
||||
<string name="open_participation_fragment">Beteiligung einsehen</string>
|
||||
|
||||
<!-- NotesFragment.kt -->
|
||||
<string name="notes">Notizen</string>
|
||||
@@ -104,8 +105,12 @@
|
||||
<string name="participation_ratio_desc">Gemeldet : Gesprochen</string>
|
||||
<string name="delete_participation_confirmation">Bist du dir sicher, dass du diese Beteiligung löschen möchtest?</string>
|
||||
<string name="class_session">Klassenzimmermodus</string>
|
||||
<string name="class_session_resumed">Klassenzimmermodus (fortgesetzt)</string>
|
||||
<string name="long_press_to_cancel">Lange drücken um abzubrechen</string>
|
||||
<string name="long_press_to_finish">Lange drücken um zu beenden</string>
|
||||
<string name="open_grade_fragment">Kurs einsehen</string>
|
||||
<string name="participation_too_old">Beteiligung zu alt, um fortgesetzt zu werden</string>
|
||||
<string name="participation_resumable">" (fortsetzbar)"</string>
|
||||
|
||||
<string-array name="days">
|
||||
<item>Montag</item>
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
<string name="exam_date">Exam date (yyyy-mm-dd)</string>
|
||||
<string name="date_format_issue">This date can\'t be parsed</string>
|
||||
<string name="exam_past_issue">Passed exams must have a grade associated</string>
|
||||
<string name="open_participation_fragment">Open participation</string>
|
||||
<string name="open_participation_fragment">View participation</string>
|
||||
|
||||
<!-- NotesFragment.kt -->
|
||||
<string name="notes">Notes</string>
|
||||
@@ -163,9 +163,12 @@
|
||||
<string name="participation_ratio_desc">Hand raised : Spoken</string>
|
||||
<string name="delete_participation_confirmation">Are you sure you want to delete this participation?</string>
|
||||
<string name="class_session">Class Session</string>
|
||||
<string name="class_session_resumed">Class Session (resumed)</string>
|
||||
<string name="long_press_to_cancel">Long-press to cancel</string>
|
||||
<string name="long_press_to_finish">Long-press to finish</string>
|
||||
<string name="open_grade_fragment">Open course</string>
|
||||
<string name="open_grade_fragment">View course</string>
|
||||
<string name="participation_too_old">Participation too old to be resumed</string>
|
||||
<string name="participation_resumable">" (resumable)"</string>
|
||||
|
||||
<string-array name="days">
|
||||
<item>Monday</item>
|
||||
|
||||
Reference in New Issue
Block a user