Skip to content

Commit

Permalink
Merge category
Browse files Browse the repository at this point in the history
Category Weights & Charts & Calculations
  • Loading branch information
harrynull authored Oct 18, 2018
2 parents 0538f87 + 79255e3 commit 45893e2
Show file tree
Hide file tree
Showing 22 changed files with 2,424 additions and 137 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ captures/
.idea/gradle.xml
.idea/dictionaries
.idea/libraries
.idea/caches/build_file_checksums.ser

# Keystore files
*.jks
Expand Down
2 changes: 1 addition & 1 deletion .idea/assetWizardSettings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 0 additions & 6 deletions .idea/inspectionProfiles/Project_Default.xml

This file was deleted.

7 changes: 6 additions & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,73 +1,183 @@
package com.carbonylgroup.schoolpower.activities

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.text.Editable
import android.text.TextWatcher
import android.widget.EditText
import android.widget.TextView
import android.graphics.Color
import android.support.v7.widget.LinearLayoutManager
import com.carbonylgroup.schoolpower.R
import com.carbonylgroup.schoolpower.adapter.CourseDetailAdapter
import com.carbonylgroup.schoolpower.data.AssignmentItem
import com.carbonylgroup.schoolpower.data.CategoryWeightData
import com.carbonylgroup.schoolpower.data.Subject
import com.carbonylgroup.schoolpower.utils.CategorySettingsDialog
import com.carbonylgroup.schoolpower.utils.Utils
import com.github.mikephil.charting.animation.Easing
import com.github.mikephil.charting.data.PieData
import com.github.mikephil.charting.data.PieDataSet
import com.github.mikephil.charting.data.PieEntry
import com.github.mikephil.charting.formatter.PercentFormatter
import kotlinx.android.synthetic.main.activity_category.*
import kotlinx.android.synthetic.main.content_category.*
import java.util.*

class CategoryActivity : AppCompatActivity() {
class CategoryActivity : BaseActivity() {

lateinit var categoriesWeights: CategoryWeightData
private lateinit var categoriesWeights: CategoryWeightData
private lateinit var utils : Utils

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
override fun initActivity() {
super.initActivity()
setContentView(R.layout.activity_category)
setSupportActionBar(toolbar)

val utils = Utils(this)
utils = Utils(this)
categoriesWeights = CategoryWeightData(utils)

val subject = intent.getSerializableExtra("subject") as Subject
subject.recalculateGrades(categoriesWeights)
initChart(subject)
initRecycler(subject)

fab.setOnClickListener {
CategorySettingsDialog(this, categoriesWeights, subject,
subject.grades[subject.getLatestTermName(utils)]!!) {
categoriesWeights = CategoryWeightData(utils)
subject.recalculateGrades(categoriesWeights)
initChart(subject)
}.show()
}
}

private fun initRecycler(subject: Subject) {

assignmentsRecycler.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)

val categories = subject.grades[subject.getLatestTermName(utils)]!!.calculatedGrade.categories.keys.toList()

assignmentsRecycler.adapter = CourseDetailAdapter(this, subject, false, categories,
fun(assignments:List<AssignmentItem>, filter:String):List<AssignmentItem> {
return assignments.filter { it.category == filter }
}
)
}

private fun initChart(subject: Subject) {

val name = subject.getLatestTermName(utils)
val grade = subject.grades[name]!!

if(name!=null) {
supportActionBar!!.title = "$name %.2f%%".format(
toolbar_layout.title = "$name %.2f%%".format(
grade.calculatedGrade.getEstimatedPercentageGrade()*100)
}

/*
var text = ""
for ((cname, cate) in grade.calculatedGrade.categories){
text += "\n$cname ${cate.score}/${cate.maxScore} (%.2f%%) weight ${cate.weight}"
.format(cate.getPercentage()*100)
text += ("\n$cname ${cate.score}/${cate.maxScore} (%.2f%%) weight ${cate.weight} " +
"Contributing a loss of %.2f%%")
.format(cate.getPercentage()*100, cate.weight*(1-cate.getPercentage()))
}
cates.text = text
*/

val categories = grade.calculatedGrade.categories
val weightLabel = arrayOfNulls<TextView>(categories.size)
val weightEdit = arrayOfNulls<EditText>(categories.size)
val entries = ArrayList<PieEntry>()
val percentages = ArrayList<android.util.Pair<Float, Float>>()
val colors = ArrayList<Int>()
var count = 0
for ((cname, cate) in grade.calculatedGrade.categories){
entries.add(PieEntry(cate.weight.toFloat(), cname))
percentages.add(android.util.Pair(cate.score.toFloat(), cate.maxScore.toFloat()))
colors.add(Color.parseColor(Utils.chartColorList[count++]))
}
setRadarPieChartData(entries, percentages, colors)

val entries2 = ArrayList<PieEntry>()
for ((cname, cate) in grade.calculatedGrade.categories){
val label = TextView(this)
val edit = EditText(this)

label.text = cname
edit.setText(cate.weight.toString())
edit.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable) {
categoriesWeights.setWeight(cname, subject, s.toString().toDoubleOrNull()?:return)
categoriesWeights.flush()
subject.recalculateGrades(categoriesWeights)
}
entries2.add(PieEntry((cate.weight * (1.0f - cate.getPercentage())).toFloat(), cname))
}
setPieChartData(entries2, colors)
}

override fun beforeTextChanged(s: CharSequence, start: Int,
count: Int, after: Int) {}
private fun setRadarPieChartData(entries: ArrayList<PieEntry>,
percentages: ArrayList<android.util.Pair<Float, Float>>,
colors: ArrayList<Int>) {

override fun onTextChanged(s: CharSequence, start: Int,
before: Int, count: Int) {}
})
val primaryColor = utils.getPrimaryTextColor()
pieRadarChart.rotationAngle = 0f
pieRadarChart.isRotationEnabled = true
pieRadarChart.isDrawHoleEnabled = false
pieRadarChart.description.isEnabled = false
pieRadarChart.transparentCircleRadius = 61f
pieRadarChart.isHighlightPerTapEnabled = false
pieRadarChart.dragDecelerationFrictionCoef = 0.95f
pieRadarChart.setUsePercentValues(true)
pieRadarChart.setEntryLabelTextSize(11f)
pieRadarChart.setTransparentCircleAlpha(110)
pieRadarChart.setEntryLabelColor(primaryColor)
pieRadarChart.setEntryInnerLabelColor(Color.WHITE)
pieRadarChart.setTransparentCircleColor(Color.WHITE)
pieRadarChart.setExtraOffsets(15f, 0f, 15f, 0f)

categoryContainer.addView(label)
categoryContainer.addView(edit)
val dataSet = PieDataSet(entries, "Categories")
dataSet.colors = colors
dataSet.sliceSpace = 3f
dataSet.selectionShift = 5f
dataSet.valueLinePart1Length = .4f
dataSet.valueLinePart2Length = .7f
dataSet.valueLineColor = primaryColor
dataSet.valueTextColor = primaryColor
dataSet.valueLinePart1OffsetPercentage = 80f
dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE
dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE

}
val data = PieData(dataSet)
data.setValueFormatter(PercentFormatter())
data.setValueTextSize(11f)
pieRadarChart.data = data
pieRadarChart.legend.isEnabled = false
pieRadarChart.invalidate()
pieRadarChart.highlightValues(null)
pieRadarChart.setDrawRadiiPairs(percentages)
pieRadarChart.animateY(1200, Easing.EasingOption.EaseInOutCubic)
}


private fun setPieChartData(entries: ArrayList<PieEntry>,
colors: ArrayList<Int>) {

val primaryColor = utils.getPrimaryTextColor()
pieChart.rotationAngle = 0f
pieChart.isRotationEnabled = true
pieChart.isDrawHoleEnabled = false
pieChart.description.isEnabled = false
pieChart.transparentCircleRadius = 61f
pieChart.isHighlightPerTapEnabled = false
pieChart.dragDecelerationFrictionCoef = 0.95f
pieChart.setUsePercentValues(true)
pieChart.setEntryLabelTextSize(11f)
pieChart.setTransparentCircleAlpha(110)
pieChart.setEntryLabelColor(primaryColor)
pieChart.setTransparentCircleColor(Color.WHITE)
pieChart.setExtraOffsets(5f, 5f, 5f, 5f)

val dataSet = PieDataSet(entries, "Categories")
dataSet.colors = colors
dataSet.sliceSpace = 3f
dataSet.selectionShift = 5f
dataSet.valueLinePart1Length = .4f
dataSet.valueLinePart2Length = .7f
dataSet.valueLineColor = primaryColor
dataSet.valueTextColor = primaryColor
dataSet.valueLinePart1OffsetPercentage = 80f
dataSet.xValuePosition = PieDataSet.ValuePosition.INSIDE_SLICE
dataSet.yValuePosition = PieDataSet.ValuePosition.INSIDE_SLICE

val data = PieData(dataSet)
data.setValueFormatter(PercentFormatter())
data.setValueTextSize(11f)
pieChart.data = data
pieChart.legend.isEnabled = false
pieChart.invalidate()
pieChart.highlightValues(null)
pieChart.animateY(1200, Easing.EasingOption.EaseInOutCubic)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -141,25 +141,20 @@ class MainActivity : TransitionHelper.MainActivity(), NavigationView.OnNavigatio
startActivity(intent)
}
R.id.action_gpa -> {

if (subjects == null || !GPADialog(this, subjects!!,
studentInformation!!.GPA).show()) {

val builder = AlertDialog.Builder(this)
builder.setMessage(getString(R.string.gpa_not_available_because))
builder.setTitle(getString(R.string.gpa_not_available))
builder.setPositiveButton(getString(R.string.alright), null)
builder.create().show()

}
}
R.id.action_category -> {

if (presentFragment != 1 || subjectTransporter == null) return false
val intent = Intent(application, CategoryActivity::class.java)
intent.putExtra("subject", subjectTransporter)
startActivity(intent)

}
}
return super.onOptionsItemSelected(item)
Expand Down
Loading

0 comments on commit 45893e2

Please sign in to comment.