Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 75 additions & 10 deletions app/src/main/java/jakubweg/mobishit/activity/DoublePanelActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,20 @@ import android.os.Build
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.util.Log
import android.view.View
import jakubweg.mobishit.R
import java.util.*

@SuppressLint("Registered")
abstract class DoublePanelActivity : FragmentActivity() {

abstract val mainFragmentContainerId: Int

open val secondFragmentContainerId: Int get() = mainFragmentContainerId

abstract val quitOnBackButton: Boolean
private var mainFragmentBackStack = ArrayList<String>()

private var isVisibleActivity = false
override fun onResume() {
super.onResume()
Expand Down Expand Up @@ -44,16 +48,45 @@ abstract class DoublePanelActivity : FragmentActivity() {
return
}

supportFragmentManager
.clearStack()
.beginTransaction()
.setCustomAnimations(R.anim.fragment_enter, R.anim.fade_out, R.anim.fade_in, R.anim.fragment_exit)
.replace(mainFragmentContainerId, fragment)
.commitAllowingStateLoss()
supportFragmentManager.clearStack()
val trans = supportFragmentManager.beginTransaction()
val newFragmentTag = UUID.randomUUID().toString()
trans.apply {
setCustomAnimations(R.anim.fragment_enter, R.anim.fade_out, R.anim.fade_in, R.anim.fragment_exit)
mainFragmentBackStack.lastOrNull()?.also { prevFragmentTag ->
supportFragmentManager.findFragmentByTag(prevFragmentTag)?.also { prevFragment ->
detach(prevFragment)
}
}
add(mainFragmentContainerId, fragment, newFragmentTag)
}

mainFragmentBackStack
.map { tag -> Pair(tag, supportFragmentManager.findFragmentByTag(tag)) }
.filter { it.second != null }
.firstOrNull { it.second!!::class == fragment::class }
?.also {
mainFragmentBackStack.remove(it.first)
trans.remove(it.second!!)
}

trans.commitAllowingStateLoss()
mainFragmentBackStack.add(newFragmentTag)
}

private fun restoreMainFragment(fragment: Fragment){
supportFragmentManager.beginTransaction().apply {
setCustomAnimations(R.anim.fragment_enter, R.anim.fade_out, R.anim.fade_in, R.anim.fragment_exit)
attach(fragment)
commitAllowingStateLoss()
}
onMainFragmentRestored(fragment)
}

abstract fun onMainFragmentRestored(fragment: Fragment)

fun requestNewMainFragment() {
getCurrentMainFragment()?.also { applyNewMainFragment(it) }
createCurrentMainFragment()?.also { applyNewMainFragment(it) }
}

fun applyNewDetailsFragment(fragment: Fragment) {
Expand Down Expand Up @@ -89,6 +122,34 @@ abstract class DoublePanelActivity : FragmentActivity() {
}
}

override fun onBackPressed() {
if(quitOnBackButton)
super.onBackPressed()
else {
if (supportFragmentManager.backStackEntryCount != 0)
super.onBackPressed()
else {
if (mainFragmentBackStack.size >= 2) {
val oldMainFragmentTag = mainFragmentBackStack[mainFragmentBackStack.size - 1]

if(supportFragmentManager.findFragmentByTag(oldMainFragmentTag) == null)
Log.e("BackStack", "Didn't find old fragment. Stack size: ${mainFragmentBackStack.size}, tag: $oldMainFragmentTag")
supportFragmentManager.findFragmentByTag(oldMainFragmentTag)?.also{ oldFrag ->
supportFragmentManager.beginTransaction().remove(oldFrag).commit()
}

val newMainFragmentTag = mainFragmentBackStack[mainFragmentBackStack.size - 2]
mainFragmentBackStack.removeAt(mainFragmentBackStack.size - 1)
if(supportFragmentManager.findFragmentByTag(newMainFragmentTag) == null)
Log.e("BackStack", "Didn't find new fragment. Stack size: ${mainFragmentBackStack.size}, tag: $newMainFragmentTag")
supportFragmentManager.findFragmentByTag(newMainFragmentTag)?.also{ frag ->
restoreMainFragment(frag)
}
}
}
}
}

private fun FragmentManager.clearStack() = this.apply {
try {
while (popBackStackImmediate()) {
Expand All @@ -98,13 +159,17 @@ abstract class DoublePanelActivity : FragmentActivity() {
}
}


private var hasSavedInstance = false
override fun onSaveInstanceState(outState: Bundle?) {
super.onSaveInstanceState(outState)
outState?.putStringArrayList("mainFragmentBackStack", mainFragmentBackStack)
}

override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
super.onRestoreInstanceState(savedInstanceState)
hasSavedInstance = false
savedInstanceState?.getStringArrayList("mainFragmentBackStack")?.also{ mainFragmentBackStack = it}
}

abstract fun getCurrentMainFragment(): Fragment?
abstract fun createCurrentMainFragment(): Fragment?
}
58 changes: 41 additions & 17 deletions app/src/main/java/jakubweg/mobishit/activity/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import android.net.Uri
import android.os.Bundle
import android.support.design.widget.NavigationView
import android.support.v4.app.Fragment
import android.support.v4.view.GravityCompat
import android.support.v4.widget.DrawerLayout
import android.support.v7.widget.Toolbar
import android.view.View
Expand Down Expand Up @@ -38,6 +39,18 @@ class MainActivity : DoublePanelActivity() {
const val FRAGMENT_TIMETABLE = "tt"
const val FRAGMENT_MESSAGES = "mm"

val ITEM_ID_TO_MAIN_FRAGMENT = mapOf(
R.id.nav_marks to SubjectListFragment::class,
R.id.nav_timetable to TimetableFragment::class,
R.id.nav_tests to TestsFragment::class,
R.id.nav_attendances to AttendancesSummaryFragment::class,
R.id.nav_comparisons to ComparisonsFragment::class,
R.id.nav_messages to MessagesListFragment::class,
R.id.nav_about to AboutFragment::class,
R.id.nav_settings to GeneralPreferenceFragment::class,
R.id.nav_calculate_average to AboutVirtualMarksFragment::class)
val MAIN_FRAGMENT_TO_ITEM_ID = ITEM_ID_TO_MAIN_FRAGMENT.entries.associateBy({it.value}){it.key}

private var isInForeground = false
val isMainActivityInForeground get() = isInForeground
}
Expand All @@ -47,6 +60,9 @@ class MainActivity : DoublePanelActivity() {
override val mainFragmentContainerId: Int
get() = R.id.fragment_container

override val quitOnBackButton
get() = preferences.quitOnBackButton

val navigationView get() = findViewById<NavigationView?>(R.id.nav_view)!!
val toolbar get() = findViewById<Toolbar>(R.id.toolbar)!!
val drawerLayout get() = findViewById<DrawerLayout>(R.id.drawer_layout)!!
Expand Down Expand Up @@ -75,7 +91,6 @@ class MainActivity : DoublePanelActivity() {
preferences.runCountdownService && savedInstanceState == null)

handleIntent(intent, savedInstanceState)

}

@SuppressLint("SetTextI18n")
Expand Down Expand Up @@ -108,10 +123,7 @@ class MainActivity : DoublePanelActivity() {

fun onNavigationItemSelected(itemId: Int, requestNewLayout: Boolean) {
when (itemId) {
R.id.nav_force_refresh -> {
tryToRefresh()
}

R.id.nav_force_refresh -> tryToRefresh()
R.id.nav_app_update ->
startActivity(Intent(Intent.ACTION_VIEW,
Uri.parse(preferences.getAppUpdateLink() ?: return)))
Expand All @@ -123,17 +135,17 @@ class MainActivity : DoublePanelActivity() {
}
}

override fun getCurrentMainFragment(): Fragment? {
return when (currentSelectedItemId) {
R.id.nav_marks -> SubjectListFragment.newInstance()
R.id.nav_timetable -> TimetableFragment.newInstance()
R.id.nav_tests -> TestsFragment.newInstance()
R.id.nav_attendances -> AttendancesSummaryFragment.newInstance()
R.id.nav_comparisons -> ComparisonsFragment.newInstance()
R.id.nav_messages -> MessagesListFragment.newInstance()
R.id.nav_about -> AboutFragment.newInstance()
R.id.nav_settings -> GeneralPreferenceFragment.newInstance()
R.id.nav_calculate_average -> AboutVirtualMarksFragment.newInstance()
override fun createCurrentMainFragment(): Fragment? {
return when (ITEM_ID_TO_MAIN_FRAGMENT[currentSelectedItemId] ?: return null) {
SubjectListFragment::class -> SubjectListFragment.newInstance()
TimetableFragment::class -> TimetableFragment.newInstance()
TestsFragment::class -> TestsFragment.newInstance()
AttendancesSummaryFragment::class -> AttendancesSummaryFragment.newInstance()
ComparisonsFragment::class -> ComparisonsFragment.newInstance()
MessagesListFragment::class -> MessagesListFragment.newInstance()
AboutFragment::class -> AboutFragment.newInstance()
GeneralPreferenceFragment::class -> GeneralPreferenceFragment.newInstance()
AboutVirtualMarksFragment::class -> AboutVirtualMarksFragment.newInstance()
else -> null
}
}
Expand Down Expand Up @@ -167,14 +179,26 @@ class MainActivity : DoublePanelActivity() {
}
}

override fun onBackPressed() {
if (drawerLayout.isDrawerOpen(GravityCompat.START) && !preferences.quitOnBackButton)
drawerLayout.closeDrawer(GravityCompat.START)
super.onBackPressed()
}

override fun onMainFragmentRestored(fragment: Fragment) {
MAIN_FRAGMENT_TO_ITEM_ID[fragment::class]?.also {
currentSelectedItemId = it
navigationUtils.setCurrentItem(currentSelectedItemId)
}
}

fun tryToRefresh() {
if ((getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager)
?.activeNetworkInfo?.isConnected != true)
snackbar.show(SnackbarController.ShowRequest("Aktualnie nie masz połączenia z internetem", 5000))
UpdateWorker.requestUpdates(this)
}


@Throws(ClassCastException::class)
private inline fun <reified T : View> NavigationView.getHeaderViewById(id: Int): T {
val found = findViewInHeaderById(id)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,7 @@ class MainActivityNavigationLayoutUtils(activity: MainActivity)
notifyActivityAboutNewSelectedItem(it)
}
weakActivity.get()?.also { act ->
act.findViewById<DrawerLayout>(R.id.drawer_layout)
?.closeDrawer(GravityCompat.START)
act.drawerLayout.closeDrawer(GravityCompat.START)
if (it.isCheckable) {
adjustToSelectedItem(act, it.itemId)
if (notifyActivityInstant) {
Expand Down Expand Up @@ -131,6 +130,13 @@ class MainActivityNavigationLayoutUtils(activity: MainActivity)
tellActivityToRequestNewFragment = true
}

fun setCurrentItem(itemId: Int){
weakActivity.get()?.also { activity ->
activity.navigationView.setCheckedItem(itemId)
adjustToSelectedItem(activity, itemId)
}
}

init {
lifecycle.addObserver(this)
val navigationView = activity.navigationView
Expand Down
49 changes: 3 additions & 46 deletions app/src/main/java/jakubweg/mobishit/db/Entities.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package jakubweg.mobishit.db
import android.arch.persistence.room.Entity
import android.arch.persistence.room.Ignore
import android.arch.persistence.room.PrimaryKey
import android.support.v4.content.res.ResourcesCompat
import android.text.SpannableString
import com.google.gson.JsonObject
import com.google.gson.annotations.SerializedName

Expand Down Expand Up @@ -112,52 +114,6 @@ class AverageCacheData(@PrimaryKey(autoGenerate = true) val id: Int,
}
}
}

private fun buildAverageText(): String {
val hasPoints = gotPointsSum > 0f || baseSum > 0f
val hasWeightedAverage = weightedAverage > 0f
return when {
hasPoints && hasWeightedAverage ->
String.format("Średnia: %.2f\nZdobyte punkty: %.1f na %.1f czyli %.1f%%",
weightedAverage, gotPointsSum, baseSum, gotPointsSum / baseSum * 100f)

hasPoints ->
String.format("Zdobyte punkty: %.1f na %.1f czyli %.1f%%",
gotPointsSum, baseSum, gotPointsSum / baseSum * 100f)

hasWeightedAverage ->
String.format("Twoja średnia ważona wynosi %.2f", weightedAverage)

else -> "Brak danych"
}.also { _averageText = it }
}

@Ignore
private var _averageText: String? = null
val averageText get() = _averageText ?: buildAverageText()


private fun buildShortAverageText(): String {
val hasPoints = gotPointsSum > 0f || baseSum > 0f
val hasWeightedAverage = weightedAverage > 0f
return when {
hasPoints && hasWeightedAverage ->
String.format("%.2f\n%.1f/%.1f %.1f%%",
weightedAverage, gotPointsSum, baseSum, gotPointsSum / baseSum * 100f)

hasPoints ->
String.format("%.1f/%.1f\n%.1f%%",
gotPointsSum, baseSum, gotPointsSum / baseSum * 100f)

hasWeightedAverage -> String.format("%.2f", weightedAverage)

else -> ""
}.also { _shortAverageText = it }
}

@Ignore
private var _shortAverageText: String? = null
val shortAverageText get() = _shortAverageText ?: buildShortAverageText()
}


Expand Down Expand Up @@ -208,6 +164,7 @@ class LastMarkCacheData(@PrimaryKey(autoGenerate = false) val id: Int,

@Entity(tableName = "SavedVirtualMarks")
class VirtualMarkEntity(@PrimaryKey(autoGenerate = true) val id: Int,
val originalMarkId: Int?,
val type: Int,
val value: Float,
val weight: Float)
35 changes: 33 additions & 2 deletions app/src/main/java/jakubweg/mobishit/db/MarkDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,25 @@ WHERE Marks.id IN (:markIds) AND visibility = 0""")
fun getMarkShortInfo(markIds: IntArray): List<MarkShortInfoWithSubject>


class MarkOverviewInfo(val description: String, val abbreviation: String?, val weight: Float, val noCountToAverage: Boolean?,
val markPointsValue: Float, val countPointsWithoutBase: Boolean?, val markValueMax: Float, val markScaleValue: Float)

@Query("""SELECT MarkGroups.description,
MarkScales.abbreviation,
IFNULL(MarkScales.markValue, -1) AS 'markScaleValue',
IFNULL(weight, IFNULL(MarkKinds.defaultWeight, -1)) as 'weight',
MarkScales.noCountToAverage,
IFNULL(Marks.markValue, -1) AS 'markPointsValue',
MarkGroups.countPointsWithoutBase,
IFNULL(MarkGroups.markValueMax, -1) as 'markValueMax'
FROM Marks
LEFT OUTER JOIN MarkScales ON MarkScales.id = Marks.markScaleId
INNER JOIN MarkGroups ON MarkGroups.id = Marks.markGroupId
INNER JOIN MarkKinds ON MarkGroups.markKindId = MarkKinds.id
WHERE Marks.id = :markId LIMIT 1""")
fun getMarkOverviewInfo(markId: Int): MarkOverviewInfo?


/// used in MarkDetailsFragment
class MarkDetails(val description: String, val markName: String?, val abbreviation: String?, val markPointsValue: Float,
val columnName: String, val defaultWeight: Float?, val noCountToAverage: Boolean?, val countPointsWithoutBase: Boolean?,
Expand Down Expand Up @@ -117,6 +136,17 @@ INNER JOIN Teachers ON Teachers.id = Marks.teacherId
WHERE Marks.id = :markId LIMIT 1""")
fun getMarkDetails(markId: Int): MarkDetails?

class MarkValueInfo(val markValue: Float, val scaleId: Int?, val weight: Float)

@Query("""SELECT IFNULL(Marks.markValue, MarkScales.markValue) as markValue,
MarkScales.id as scaleId,
IFNULL(MarkGroups.markValueMax * NOT MarkGroups.countPointsWithoutBase, IFNULL(MarkGroups.weight,MarkKinds.defaultWeight)) as weight
FROM Marks
INNER JOIN MarkGroups ON Marks.markGroupId = MarkGroups.id
LEFT OUTER JOIN MarkScales ON MarkScales.id = Marks.markScaleId
INNER JOIN MarkKinds ON MarkKinds.id = MarkGroups.markKindId
WHERE Marks.id = :markId LIMIT 1""")
fun getMarkValueInfo(markId: Int): MarkValueInfo?

class DeletedMarkData(val description: String?, val abbreviation: String?, val subjectName: String)

Expand Down Expand Up @@ -212,10 +242,11 @@ ORDER BY MarkScaleGroups.id DESC""")
fun getSubjectsWithCountedUsersMarks(): List<SubjectShortInfo>


class MarkToImport(val markValue: Float, val scaleId: Int?,
class MarkToImport(val id: Int, val markValue: Float, val scaleId: Int?,
val weight: Float, val parentType: Int?, val parentId: Int)

@Query("""SELECT IFNULL(Marks.markValue, MarkScales.markValue) as markValue,
@Query("""SELECT Marks.id,
IFNULL(Marks.markValue, MarkScales.markValue) as markValue,
MarkScales.id as scaleId,
IFNULL(MarkGroups.markValueMax * NOT MarkGroups.countPointsWithoutBase,
IFNULL(MarkGroups.weight,MarkKinds.defaultWeight)) as weight,
Expand Down
Loading