diff --git a/.gradle/6.1-rc-1/executionHistory/executionHistory.bin b/.gradle/6.1-rc-1/executionHistory/executionHistory.bin index 8efa01c..735bd36 100644 Binary files a/.gradle/6.1-rc-1/executionHistory/executionHistory.bin and b/.gradle/6.1-rc-1/executionHistory/executionHistory.bin differ diff --git a/.gradle/6.1-rc-1/executionHistory/executionHistory.lock b/.gradle/6.1-rc-1/executionHistory/executionHistory.lock index fe2d54b..5fa889a 100644 Binary files a/.gradle/6.1-rc-1/executionHistory/executionHistory.lock and b/.gradle/6.1-rc-1/executionHistory/executionHistory.lock differ diff --git a/.gradle/6.1-rc-1/fileHashes/fileHashes.bin b/.gradle/6.1-rc-1/fileHashes/fileHashes.bin index 82e0c64..1ee6e9c 100644 Binary files a/.gradle/6.1-rc-1/fileHashes/fileHashes.bin and b/.gradle/6.1-rc-1/fileHashes/fileHashes.bin differ diff --git a/.gradle/6.1-rc-1/fileHashes/fileHashes.lock b/.gradle/6.1-rc-1/fileHashes/fileHashes.lock index 8096c0d..eae7c11 100644 Binary files a/.gradle/6.1-rc-1/fileHashes/fileHashes.lock and b/.gradle/6.1-rc-1/fileHashes/fileHashes.lock differ diff --git a/.gradle/6.1-rc-1/fileHashes/resourceHashesCache.bin b/.gradle/6.1-rc-1/fileHashes/resourceHashesCache.bin index 8e3b9eb..620255f 100644 Binary files a/.gradle/6.1-rc-1/fileHashes/resourceHashesCache.bin and b/.gradle/6.1-rc-1/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/6.1-rc-1/javaCompile/classAnalysis.bin b/.gradle/6.1-rc-1/javaCompile/classAnalysis.bin index 9c51123..a194bba 100644 Binary files a/.gradle/6.1-rc-1/javaCompile/classAnalysis.bin and b/.gradle/6.1-rc-1/javaCompile/classAnalysis.bin differ diff --git a/.gradle/6.1-rc-1/javaCompile/jarAnalysis.bin b/.gradle/6.1-rc-1/javaCompile/jarAnalysis.bin index 69183ff..8ddf025 100644 Binary files a/.gradle/6.1-rc-1/javaCompile/jarAnalysis.bin and b/.gradle/6.1-rc-1/javaCompile/jarAnalysis.bin differ diff --git a/.gradle/6.1-rc-1/javaCompile/javaCompile.lock b/.gradle/6.1-rc-1/javaCompile/javaCompile.lock index 6e40d03..61d7aba 100644 Binary files a/.gradle/6.1-rc-1/javaCompile/javaCompile.lock and b/.gradle/6.1-rc-1/javaCompile/javaCompile.lock differ diff --git a/.gradle/6.1-rc-1/javaCompile/taskHistory.bin b/.gradle/6.1-rc-1/javaCompile/taskHistory.bin index d0975b0..a0dc29f 100644 Binary files a/.gradle/6.1-rc-1/javaCompile/taskHistory.bin and b/.gradle/6.1-rc-1/javaCompile/taskHistory.bin differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index ae3034d..2a0f1e5 100644 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index 983f722..a021720 100644 Binary files a/.gradle/buildOutputCleanup/outputFiles.bin and b/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock index f3ca017..be40e1a 100644 Binary files a/.gradle/checksums/checksums.lock and b/.gradle/checksums/checksums.lock differ diff --git a/.idea/modules/app/app.iml b/.idea/modules/app/app.iml index 491902c..6448b36 100644 --- a/.idea/modules/app/app.iml +++ b/.idea/modules/app/app.iml @@ -70,21 +70,21 @@ - - + - + + + - - + @@ -134,11 +134,11 @@ - - + + diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index a80f982..cdd6d98 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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' diff --git a/app/src/main/java/com/denizd/qwark/activity/MainActivity.kt b/app/src/main/java/com/denizd/qwark/activity/MainActivity.kt index 826511f..8908afd 100644 --- a/app/src/main/java/com/denizd/qwark/activity/MainActivity.kt +++ b/app/src/main/java/com/denizd/qwark/activity/MainActivity.kt @@ -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(R.id.app_bar_layout) - toolbarTitle = findViewById(R.id.toolbarTxt) - bottomNavigationView = findViewById(R.id.bottom_nav) - - findViewById(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(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(R.id.view).visibility = View.VISIBLE + binding.bottomNav.visibility = View.VISIBLE + binding.view.visibility = View.VISIBLE super.onBackPressed() } } diff --git a/app/src/main/java/com/denizd/qwark/adapter/CourseAdapter.kt b/app/src/main/java/com/denizd/qwark/adapter/CourseAdapter.kt index 7a04595..6f86dd0 100644 --- a/app/src/main/java/com/denizd/qwark/adapter/CourseAdapter.kt +++ b/app/src/main/java/com/denizd/qwark/adapter/CourseAdapter.kt @@ -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, @@ -69,14 +70,16 @@ class CourseAdapter(private var courses: List, 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 -> "" diff --git a/app/src/main/java/com/denizd/qwark/adapter/ParticipationAdapter.kt b/app/src/main/java/com/denizd/qwark/adapter/ParticipationAdapter.kt index e082df9..c11dc41 100644 --- a/app/src/main/java/com/denizd/qwark/adapter/ParticipationAdapter.kt +++ b/app/src/main/java/com/denizd/qwark/adapter/ParticipationAdapter.kt @@ -53,7 +53,16 @@ class ParticipationAdapter(private var participations: List, 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(), diff --git a/app/src/main/java/com/denizd/qwark/database/CourseRepository.kt b/app/src/main/java/com/denizd/qwark/database/CourseRepository.kt index b4fb4c7..e9ad0b0 100644 --- a/app/src/main/java/com/denizd/qwark/database/CourseRepository.kt +++ b/app/src/main/java/com/denizd/qwark/database/CourseRepository.kt @@ -21,4 +21,6 @@ internal class CourseRepository(app: Application) { fun getCoursesByYearId(yearId: Int): LiveData> = dao.getCoursesByYearId(yearId) fun getAveragesForCourses(courseId: Int): List = dao.getAveragesForCourses(courseId) + + fun getCourse(courseId: Int): CourseExam = dao.getCourse(courseId)[0] } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/database/FinalsRepository.kt b/app/src/main/java/com/denizd/qwark/database/FinalsRepository.kt index ec8b152..3cff5aa 100644 --- a/app/src/main/java/com/denizd/qwark/database/FinalsRepository.kt +++ b/app/src/main/java/com/denizd/qwark/database/FinalsRepository.kt @@ -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) } } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/database/GradeRepository.kt b/app/src/main/java/com/denizd/qwark/database/GradeRepository.kt index a8cb9c0..216eb32 100644 --- a/app/src/main/java/com/denizd/qwark/database/GradeRepository.kt +++ b/app/src/main/java/com/denizd/qwark/database/GradeRepository.kt @@ -27,4 +27,5 @@ class GradeRepository(app: Application) { } fun getGradesByForeignKey(courseId: Int): LiveData> = dao.getGradesByForeignKey(courseId) + fun getGrade(gradeId: Int) = dao.getGrade(gradeId)[0] } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/database/NoteRepository.kt b/app/src/main/java/com/denizd/qwark/database/NoteRepository.kt index f9f4db9..084c86b 100644 --- a/app/src/main/java/com/denizd/qwark/database/NoteRepository.kt +++ b/app/src/main/java/com/denizd/qwark/database/NoteRepository.kt @@ -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] } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/database/ParticipationRepository.kt b/app/src/main/java/com/denizd/qwark/database/ParticipationRepository.kt index ce6610b..5a7cd2c 100644 --- a/app/src/main/java/com/denizd/qwark/database/ParticipationRepository.kt +++ b/app/src/main/java/com/denizd/qwark/database/ParticipationRepository.kt @@ -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 = dao.getDays(prefs.getSchoolYear()) - fun getCourses(): List = QwarkUtil.getCoursesSorted( - dao.getCoursesByYearIdAsList(prefs.getSchoolYear()), + fun getCourses(): List = 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() } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/database/QwarkDao.kt b/app/src/main/java/com/denizd/qwark/database/QwarkDao.kt index 341a0ad..27fd695 100644 --- a/app/src/main/java/com/denizd/qwark/database/QwarkDao.kt +++ b/app/src/main/java/com/denizd/qwark/database/QwarkDao.kt @@ -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 + // 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 + @Query("SELECT * FROM note WHERE note_id = :noteId") + fun getNote(noteId: Int): List + // historical averages @get:Query("SELECT * FROM historical_avg ORDER BY course_id DESC") @@ -155,6 +164,9 @@ interface QwarkDao { @Insert fun insertAll(finalGrades: Array) + @Query("SELECT * FROM final_grade WHERE final_grade_id = :finalGradeId") + fun getFinalGrade(finalGradeId: Int): List + // 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> @Insert diff --git a/app/src/main/java/com/denizd/qwark/fragment/CourseFragment.kt b/app/src/main/java/com/denizd/qwark/fragment/CourseFragment.kt index 470596c..ae3eea2 100644 --- a/app/src/main/java/com/denizd/qwark/fragment/CourseFragment.kt +++ b/app/src/main/java/com/denizd/qwark/fragment/CourseFragment.kt @@ -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) } diff --git a/app/src/main/java/com/denizd/qwark/fragment/FinalsFragment.kt b/app/src/main/java/com/denizd/qwark/fragment/FinalsFragment.kt index ce62084..df54c61 100644 --- a/app/src/main/java/com/denizd/qwark/fragment/FinalsFragment.kt +++ b/app/src/main/java/com/denizd/qwark/fragment/FinalsFragment.kt @@ -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, 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) } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/fragment/GradeFragment.kt b/app/src/main/java/com/denizd/qwark/fragment/GradeFragment.kt index e769a3f..41ba11c 100644 --- a/app/src/main/java/com/denizd/qwark/fragment/GradeFragment.kt +++ b/app/src/main/java/com/denizd/qwark/fragment/GradeFragment.kt @@ -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(R.id.bottom_nav).visibility = View.GONE findViewById(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) } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/fragment/NoteFragment.kt b/app/src/main/java/com/denizd/qwark/fragment/NoteFragment.kt index 4948db5..d27714e 100644 --- a/app/src/main/java/com/denizd/qwark/fragment/NoteFragment.kt +++ b/app/src/main/java/com/denizd/qwark/fragment/NoteFragment.kt @@ -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 = viewModel.getAllCategories() + fun getNote(noteId: Int) = viewModel.getNote(noteId) } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/fragment/ParticipationCourseFragment.kt b/app/src/main/java/com/denizd/qwark/fragment/ParticipationCourseFragment.kt index 8109c3c..d725921 100644 --- a/app/src/main/java/com/denizd/qwark/fragment/ParticipationCourseFragment.kt +++ b/app/src/main/java/com/denizd/qwark/fragment/ParticipationCourseFragment.kt @@ -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) + } } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/fragment/ParticipationFragment.kt b/app/src/main/java/com/denizd/qwark/fragment/ParticipationFragment.kt index 93b7096..de714e1 100644 --- a/app/src/main/java/com/denizd/qwark/fragment/ParticipationFragment.kt +++ b/app/src/main/java/com/denizd/qwark/fragment/ParticipationFragment.kt @@ -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) diff --git a/app/src/main/java/com/denizd/qwark/fragment/QwarkFragment.kt b/app/src/main/java/com/denizd/qwark/fragment/QwarkFragment.kt index 803f12c..ab5de22 100644 --- a/app/src/main/java/com/denizd/qwark/fragment/QwarkFragment.kt +++ b/app/src/main/java/com/denizd/qwark/fragment/QwarkFragment.kt @@ -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.applyPadding(verticalPadding: Int = 0) { + protected fun T.applyPadding(horizontalPadding: Int = 0) { + val horizontal = horizontalPadding.dpToPx() setPadding( - verticalPadding.dpToPx(), + horizontal, (statusBarView.height / 1) + appBar.height, - verticalPadding.dpToPx(), + horizontal, 0 ) } diff --git a/app/src/main/java/com/denizd/qwark/fragment/SettingsFragment.kt b/app/src/main/java/com/denizd/qwark/fragment/SettingsFragment.kt index e2adf9c..8a61540 100644 --- a/app/src/main/java/com/denizd/qwark/fragment/SettingsFragment.kt +++ b/app/src/main/java/com/denizd/qwark/fragment/SettingsFragment.kt @@ -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 "") } diff --git a/app/src/main/java/com/denizd/qwark/sheet/ClassSessionSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/ClassSessionSheet.kt index b64b2df..b5f9fdf 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/ClassSessionSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/ClassSessionSheet.kt @@ -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) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/sheet/ConfirmDeletionBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/ConfirmDeletionSheet.kt similarity index 96% rename from app/src/main/java/com/denizd/qwark/sheet/ConfirmDeletionBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/ConfirmDeletionSheet.kt index cfc5538..fcd6b6e 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/ConfirmDeletionBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/ConfirmDeletionSheet.kt @@ -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 diff --git a/app/src/main/java/com/denizd/qwark/sheet/CopyCoursesBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/CopyCoursesSheet.kt similarity index 92% rename from app/src/main/java/com/denizd/qwark/sheet/CopyCoursesBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/CopyCoursesSheet.kt index 680b4c6..ee25e4a 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/CopyCoursesBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/CopyCoursesSheet.kt @@ -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() } } diff --git a/app/src/main/java/com/denizd/qwark/sheet/CourseCreateBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/CourseCreateSheet.kt similarity index 92% rename from app/src/main/java/com/denizd/qwark/sheet/CourseCreateBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/CourseCreateSheet.kt index d1d7537..6c2b6ce 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/CourseCreateBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/CourseCreateSheet.kt @@ -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 } diff --git a/app/src/main/java/com/denizd/qwark/sheet/CourseOptionsBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/CourseOptionsSheet.kt similarity index 77% rename from app/src/main/java/com/denizd/qwark/sheet/CourseOptionsBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/CourseOptionsSheet.kt index 2e184c8..dec5167 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/CourseOptionsBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/CourseOptionsSheet.kt @@ -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() } } diff --git a/app/src/main/java/com/denizd/qwark/sheet/FinalsCreateBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/FinalsCreateSheet.kt similarity index 75% rename from app/src/main/java/com/denizd/qwark/sheet/FinalsCreateBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/FinalsCreateSheet.kt index 5fe687b..338df72 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/FinalsCreateBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/FinalsCreateSheet.kt @@ -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() } } diff --git a/app/src/main/java/com/denizd/qwark/sheet/FinalsLinkBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/FinalsLinkSheet.kt similarity index 74% rename from app/src/main/java/com/denizd/qwark/sheet/FinalsLinkBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/FinalsLinkSheet.kt index 870f978..ca5d4bb 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/FinalsLinkBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/FinalsLinkSheet.kt @@ -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 diff --git a/app/src/main/java/com/denizd/qwark/sheet/FinalsOptionsBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/FinalsOptionsSheet.kt similarity index 79% rename from app/src/main/java/com/denizd/qwark/sheet/FinalsOptionsBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/FinalsOptionsSheet.kt index 24b8484..3440933 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/FinalsOptionsBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/FinalsOptionsSheet.kt @@ -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() } diff --git a/app/src/main/java/com/denizd/qwark/sheet/GradeCreateBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/GradeCreateSheet.kt similarity index 91% rename from app/src/main/java/com/denizd/qwark/sheet/GradeCreateBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/GradeCreateSheet.kt index 1be56df..ba4a19b 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/GradeCreateBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/GradeCreateSheet.kt @@ -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) { diff --git a/app/src/main/java/com/denizd/qwark/sheet/HistoricalAverageBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/HistoricalAverageSheet.kt similarity index 95% rename from app/src/main/java/com/denizd/qwark/sheet/HistoricalAverageBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/HistoricalAverageSheet.kt index 077cae6..3682e7e 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/HistoricalAverageBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/HistoricalAverageSheet.kt @@ -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!! diff --git a/app/src/main/java/com/denizd/qwark/sheet/IconPickerBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/IconPickerSheet.kt similarity index 94% rename from app/src/main/java/com/denizd/qwark/sheet/IconPickerBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/IconPickerSheet.kt index 0e10b30..2b38af8 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/IconPickerBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/IconPickerSheet.kt @@ -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) diff --git a/app/src/main/java/com/denizd/qwark/sheet/NoteCreateBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/NoteCreateSheet.kt similarity index 94% rename from app/src/main/java/com/denizd/qwark/sheet/NoteCreateBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/NoteCreateSheet.kt index 00114b2..c5ce9ac 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/NoteCreateBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/NoteCreateSheet.kt @@ -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) { diff --git a/app/src/main/java/com/denizd/qwark/sheet/NoteDisplayBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/NoteDisplaySheet.kt similarity index 71% rename from app/src/main/java/com/denizd/qwark/sheet/NoteDisplayBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/NoteDisplaySheet.kt index 6a059af..f508f65 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/NoteDisplayBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/NoteDisplaySheet.kt @@ -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( -// 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) diff --git a/app/src/main/java/com/denizd/qwark/sheet/NoteOptionsBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/NoteOptionsSheet.kt similarity index 94% rename from app/src/main/java/com/denizd/qwark/sheet/NoteOptionsBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/NoteOptionsSheet.kt index 2b4e122..44a11ad 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/NoteOptionsBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/NoteOptionsSheet.kt @@ -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) { diff --git a/app/src/main/java/com/denizd/qwark/sheet/ParticipationLinkBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/ParticipationLinkSheet.kt similarity index 93% rename from app/src/main/java/com/denizd/qwark/sheet/ParticipationLinkBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/ParticipationLinkSheet.kt index 091b6a4..9c913ff 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/ParticipationLinkBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/ParticipationLinkSheet.kt @@ -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) diff --git a/app/src/main/java/com/denizd/qwark/sheet/ScoreProfileCreateBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/ScoreProfileCreateSheet.kt similarity index 95% rename from app/src/main/java/com/denizd/qwark/sheet/ScoreProfileCreateBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/ScoreProfileCreateSheet.kt index cb81ca1..7104410 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/ScoreProfileCreateBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/ScoreProfileCreateSheet.kt @@ -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 = "" diff --git a/app/src/main/java/com/denizd/qwark/sheet/TextInputBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/TextInputSheet.kt similarity index 94% rename from app/src/main/java/com/denizd/qwark/sheet/TextInputBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/TextInputSheet.kt index cab722c..47e1203 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/TextInputBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/TextInputSheet.kt @@ -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!! diff --git a/app/src/main/java/com/denizd/qwark/sheet/YearCreateBottomSheet.kt b/app/src/main/java/com/denizd/qwark/sheet/YearCreateSheet.kt similarity index 96% rename from app/src/main/java/com/denizd/qwark/sheet/YearCreateBottomSheet.kt rename to app/src/main/java/com/denizd/qwark/sheet/YearCreateSheet.kt index bb7bf34..b17354e 100644 --- a/app/src/main/java/com/denizd/qwark/sheet/YearCreateBottomSheet.kt +++ b/app/src/main/java/com/denizd/qwark/sheet/YearCreateSheet.kt @@ -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 = "" diff --git a/app/src/main/java/com/denizd/qwark/util/CourseFunctions.kt b/app/src/main/java/com/denizd/qwark/util/CourseFunctions.kt new file mode 100644 index 0000000..b9735e1 --- /dev/null +++ b/app/src/main/java/com/denizd/qwark/util/CourseFunctions.kt @@ -0,0 +1,28 @@ +package com.denizd.qwark.util +import com.denizd.qwark.model.Course +import com.denizd.qwark.model.CourseExam + +fun List.getSorted(sortType: Int): List = 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 +) \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/util/GradeCalculations.kt b/app/src/main/java/com/denizd/qwark/util/GradeFunctions.kt similarity index 100% rename from app/src/main/java/com/denizd/qwark/util/GradeCalculations.kt rename to app/src/main/java/com/denizd/qwark/util/GradeFunctions.kt diff --git a/app/src/main/java/com/denizd/qwark/util/OnBackPressed.kt b/app/src/main/java/com/denizd/qwark/util/OnBackPressed.kt index 47d5841..de410c3 100644 --- a/app/src/main/java/com/denizd/qwark/util/OnBackPressed.kt +++ b/app/src/main/java/com/denizd/qwark/util/OnBackPressed.kt @@ -1,5 +1,5 @@ package com.denizd.qwark.util -internal interface OnBackPressed { +interface OnBackPressed { fun onBackPressed(): Boolean } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/util/QwarkPreferences.kt b/app/src/main/java/com/denizd/qwark/util/QwarkPreferences.kt index abcfa45..773f8d7 100644 --- a/app/src/main/java/com/denizd/qwark/util/QwarkPreferences.kt +++ b/app/src/main/java/com/denizd/qwark/util/QwarkPreferences.kt @@ -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) diff --git a/app/src/main/java/com/denizd/qwark/util/QwarkUtil.kt b/app/src/main/java/com/denizd/qwark/util/QwarkUtil.kt index 87b3741..e3311b1 100644 --- a/app/src/main/java/com/denizd/qwark/util/QwarkUtil.kt +++ b/app/src/main/java/com/denizd/qwark/util/QwarkUtil.kt @@ -148,16 +148,12 @@ object QwarkUtil { else -> pointGradeArray } - private fun Double.getGradeType(map: Map): 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, sortType: Int): List = 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 - ) } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/viewmodel/CourseViewModel.kt b/app/src/main/java/com/denizd/qwark/viewmodel/CourseViewModel.kt index 3f0df70..3fac0fc 100644 --- a/app/src/main/java/com/denizd/qwark/viewmodel/CourseViewModel.kt +++ b/app/src/main/java/com/denizd/qwark/viewmodel/CourseViewModel.kt @@ -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) } } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/viewmodel/FinalsViewModel.kt b/app/src/main/java/com/denizd/qwark/viewmodel/FinalsViewModel.kt index 6dcad27..7eeaecc 100644 --- a/app/src/main/java/com/denizd/qwark/viewmodel/FinalsViewModel.kt +++ b/app/src/main/java/com/denizd/qwark/viewmodel/FinalsViewModel.kt @@ -14,7 +14,7 @@ import java.lang.NumberFormatException class FinalsViewModel(app: Application) : QwarkViewModel(app) { private val repo = FinalsRepository(app) - val allFinalGrades: LiveData>? = repo.getFinalGrades(repo.getFinalScoreId()) + val allFinalGrades: LiveData> = 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() } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/viewmodel/GradeViewModel.kt b/app/src/main/java/com/denizd/qwark/viewmodel/GradeViewModel.kt index f6fc4ec..9e4292e 100644 --- a/app/src/main/java/com/denizd/qwark/viewmodel/GradeViewModel.kt +++ b/app/src/main/java/com/denizd/qwark/viewmodel/GradeViewModel.kt @@ -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) } } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/viewmodel/NoteViewModel.kt b/app/src/main/java/com/denizd/qwark/viewmodel/NoteViewModel.kt index 7a9b450..87a23c5 100644 --- a/app/src/main/java/com/denizd/qwark/viewmodel/NoteViewModel.kt +++ b/app/src/main/java/com/denizd/qwark/viewmodel/NoteViewModel.kt @@ -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() @@ -75,4 +75,6 @@ class NoteViewModel(application: Application) : AndroidViewModel(application) { repo.getAllCategories() } } + + fun getNote(noteId: Int) = returnBlocking { repo.getNote(noteId) } } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/qwark/viewmodel/ParticipationCourseViewModel.kt b/app/src/main/java/com/denizd/qwark/viewmodel/ParticipationCourseViewModel.kt index 80716e3..e0179ff 100644 --- a/app/src/main/java/com/denizd/qwark/viewmodel/ParticipationCourseViewModel.kt +++ b/app/src/main/java/com/denizd/qwark/viewmodel/ParticipationCourseViewModel.kt @@ -13,7 +13,12 @@ class ParticipationCourseViewModel(app: Application) : QwarkViewModel(app) { repo.getAllParticipationsForCourse(courseId) } fun getParticipationCount(participations: List) = 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) } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 9a94ad8..5c0603e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -64,7 +64,7 @@ android:layout_height="match_parent"> diff --git a/app/src/main/res/layout/final_grade_options_dialog.xml b/app/src/main/res/layout/final_grade_options_dialog.xml index 3242eae..937ab69 100644 --- a/app/src/main/res/layout/final_grade_options_dialog.xml +++ b/app/src/main/res/layout/final_grade_options_dialog.xml @@ -4,7 +4,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:backgroundTint="@color/colorBackground" - android:paddingTop="8dp" android:paddingBottom="8dp"> Klausurdatum (yyyy-mm-dd) Dieses Datum kann nicht verarbeitet werden Vergangene Klausuren müssen benotet werden + Beteiligung einsehen Notizen @@ -104,8 +105,12 @@ Gemeldet : Gesprochen Bist du dir sicher, dass du diese Beteiligung löschen möchtest? Klassenzimmermodus + Klassenzimmermodus (fortgesetzt) Lange drücken um abzubrechen Lange drücken um zu beenden + Kurs einsehen + Beteiligung zu alt, um fortgesetzt zu werden + " (fortsetzbar)" Montag diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4978376..1fa9041 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -133,7 +133,7 @@ Exam date (yyyy-mm-dd) This date can\'t be parsed Passed exams must have a grade associated - Open participation + View participation Notes @@ -163,9 +163,12 @@ Hand raised : Spoken Are you sure you want to delete this participation? Class Session + Class Session (resumed) Long-press to cancel Long-press to finish - Open course + View course + Participation too old to be resumed + " (resumable)" Monday