ui redesign, marks v1 done, gonna build the next release

This commit is contained in:
Odweta
2024-02-07 21:41:09 +01:00
parent 9ea5758eac
commit 7f7b22029a
25 changed files with 740 additions and 245 deletions
@@ -23,7 +23,7 @@ import androidx.fragment.app.DialogFragment
class AboutFragment : DialogFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NORMAL, R.style.Theme_Solen_PrimaryStatusBar)
setStyle(STYLE_NORMAL, R.style.Theme_Solen)
}
override fun onCreateView(
@@ -5,15 +5,14 @@ import android.content.res.Resources
import android.graphics.Typeface
import android.graphics.drawable.GradientDrawable
import android.os.Bundle
import android.util.Log
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.RelativeLayout
import android.widget.ScrollView
import android.widget.Space
import android.widget.TextView
@@ -40,7 +39,15 @@ class CalWeekFragment : Fragment() {
adapter.addFragment(DayFragment(i))
}
viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
Vars.selectedDay = position
}
})
viewPager.adapter = adapter
viewPager.currentItem = Vars.selectedDay
return view
}
@@ -102,10 +109,41 @@ class DayFragment(private val position: Int) : Fragment(R.layout.fragment_day) {
rootLayout.addView(nameDateTextView)
for (subj in day.subjects) {
var prevSubj = Subject()
prevSubj.name = ""
prevSubj.place = ""
prevSubj.substitute = ""
prevSubj.teacher = ""
prevSubj.number = ""
prevSubj.start = ""
prevSubj.end = ""
prevSubj.free = false
var firstDone = false
for ((i, subj) in day.subjects.withIndex()) {
val subjectBackground = when (subj.substitute) {
"0" -> if (subj.place != "Volno") {
R.color.cal_week_subject
R.color.primary_transparent_bg
} else {
R.color.cal_week_free_transparent_bg
}
"1" -> if (subj.place != "Volno") {
R.color.cal_week_substitute_transparent_bg
} else {
R.color.cal_week_free_transparent_bg
}
"2" -> if (subj.place != "Volno") {
R.color.cal_week_event_transparent_bg
} else {
R.color.cal_week_free_transparent_bg
}
else -> R.color.primary_transparent_bg
}
val subjectStroke = when (subj.substitute) {
"0" -> if (subj.place != "Volno") {
R.color.primary
} else {
R.color.cal_week_free
}
@@ -119,7 +157,7 @@ class DayFragment(private val position: Int) : Fragment(R.layout.fragment_day) {
} else {
R.color.cal_week_free
}
else -> R.color.cal_week_subject
else -> R.color.primary
}
val subjectDrawable = GradientDrawable()
@@ -131,26 +169,34 @@ class DayFragment(private val position: Int) : Fragment(R.layout.fragment_day) {
requireContext(),
subjectBackground
)
) // Use your desired background color
)
subjectDrawable.setStroke(
10,
ContextCompat.getColor(
requireContext(),
subjectStroke
)
)
val subjectLayout = LinearLayout(requireContext())
subjectLayout.orientation = LinearLayout.HORIZONTAL
subjectLayout.gravity = Gravity.CENTER_VERTICAL
subjectLayout.background = subjectDrawable
val subjectRelativeLayout = RelativeLayout(requireContext())
subjectRelativeLayout.layoutParams = RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT
)
val subjectNumberDrawable = GradientDrawable()
subjectNumberDrawable.shape = GradientDrawable.RECTANGLE
subjectNumberDrawable.cornerRadius = resources.getDimension((R.dimen.corner_radius))
subjectNumberDrawable.cornerRadius = resources.getDimension(R.dimen.corner_radius)
subjectNumberDrawable.setColor(
ContextCompat.getColor(
requireContext(),
R.color.cal_week_bg
subjectBackground
)
)
subjectNumberDrawable.setStroke(
10,
ContextCompat.getColor(
requireContext(),
subjectStroke
)
)
@@ -159,7 +205,7 @@ class DayFragment(private val position: Int) : Fragment(R.layout.fragment_day) {
subjectNumberTextView.text = subj.number
subjectNumberTextView.textSize = 30f
subjectNumberTextView.setPadding(20, 20, 20, 20)
subjectNumberTextView.gravity = Gravity.CENTER_VERTICAL // Center text vertically
subjectNumberTextView.gravity = Gravity.CENTER // Center text vertically
subjectNumberTextView.setTextColor(
ContextCompat.getColor(
requireContext(),
@@ -170,9 +216,10 @@ class DayFragment(private val position: Int) : Fragment(R.layout.fragment_day) {
val frameLayout = FrameLayout(requireContext())
val layoutParams = LinearLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
120,
FrameLayout.LayoutParams.MATCH_PARENT,
)
frameLayout.foregroundGravity = Gravity.CENTER
frameLayout.layoutParams = layoutParams
frameLayout.addView(subjectNumberTextView)
@@ -196,7 +243,7 @@ class DayFragment(private val position: Int) : Fragment(R.layout.fragment_day) {
subjectNameTextView.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.black
R.color.white
)
)
@@ -211,17 +258,25 @@ class DayFragment(private val position: Int) : Fragment(R.layout.fragment_day) {
subjectPlaceTextView.text = subj.place
if (subj.free) {
// underline
subjectPlaceTextView.setTypeface(null, Typeface.ITALIC)
subjectPlaceTextView.setTypeface(customFont, Typeface.ITALIC)
}
subjectPlaceTextView.textSize = 22f
subjectPlaceTextView.gravity = Gravity.CENTER_VERTICAL
subjectPlaceTextView.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.black
R.color.white
)
)
if (subj.free) {
subjectPlaceTextView.layoutParams =
LinearLayout.LayoutParams(
220,
LinearLayout.LayoutParams.MATCH_PARENT
)
}
if (day.subjects[0].substitute != "2") {
subjectLayout.addView(subjectPlaceTextView)
}
@@ -242,12 +297,12 @@ class DayFragment(private val position: Int) : Fragment(R.layout.fragment_day) {
subjectTimeTextView.typeface = customFont
subjectTimeTextView.text = subjectTimeString
subjectTimeTextView.textSize = 20f
subjectTimeTextView.setPadding(10, 10, 20, 10)
subjectTimeTextView.setPadding(10, 0, 20, 0)
subjectTimeTextView.textAlignment = View.TEXT_ALIGNMENT_TEXT_END
subjectTimeTextView.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.black
R.color.white
)
)
@@ -255,30 +310,26 @@ class DayFragment(private val position: Int) : Fragment(R.layout.fragment_day) {
subjectTeacherTextView.text = subj.teacher
subjectTeacherTextView.typeface = customFont
subjectTeacherTextView.textSize = 15f
subjectTeacherTextView.setPadding(10, 10, 20, 10)
subjectTeacherTextView.setPadding(10, 0, 20, 10)
subjectTeacherTextView.textAlignment = View.TEXT_ALIGNMENT_TEXT_END
subjectTeacherTextView.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.black
R.color.white
)
)
timeTeacherLayout.addView(subjectTimeTextView)
if (subj.name != "Volno") {
subjectTimeTextView.setPadding(10, 10, 20, 0)
timeTeacherLayout.addView(subjectTeacherTextView)
}
timeTeacherLayout.setPadding(0, 0, 10, 0)
if (day.subjects[0].substitute != "2") {
subjectLayout.addView(timeTeacherLayout)
}
val subjectSeparator = Space(requireContext())
subjectSeparator.layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
resources.getDimensionPixelSize(R.dimen.cal_week_separator_height) // Specify separator height in resources
)
// drawables
val substituteDrawable = GradientDrawable()
substituteDrawable.shape = GradientDrawable.RECTANGLE
@@ -333,20 +384,54 @@ class DayFragment(private val position: Int) : Fragment(R.layout.fragment_day) {
)
subjectLayoutParams.setMargins(20, 0, 20, 0)
subjectLayout.layoutParams = subjectLayoutParams
if (prevSubj.name != subj.name && i != 0) {
val subjectSeparator = Space(requireContext())
subjectSeparator.layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
resources.getDimensionPixelSize(R.dimen.cal_week_separator_height) // Specify separator height in resources
)
dayLayout.addView(subjectSeparator)
} else if (i != 0) {
val subjectSeparator = ImageView(requireContext())
subjectSeparator.setImageResource(R.drawable.squiggly_line_100x100)
subjectSeparator.layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
Util.pixelsToDp(20, resources)
)
dayLayout.addView(subjectSeparator)
}
dayLayout.addView(subjectLayout)
dayLayout.addView(subjectSeparator)
prevSubj = subj
}
val subjectSeparator = Space(requireContext())
subjectSeparator.layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
resources.getDimensionPixelSize(R.dimen.cal_week_separator_height) // Specify separator height in resources
)
dayLayout.addView(subjectSeparator)
val dayEndTextView = TextView(requireContext())
val endTime = day.subjects[day.subjects.size - 1].end
val dayEndString = "Den končí v $endTime"
dayEndTextView.text = dayEndString
Vars.dayEndString = "Den končí v $endTime"
dayEndTextView.text = Vars.dayEndString
dayEndTextView.typeface = customFont
dayEndTextView.textSize = 20f
dayEndTextView.setPadding(0, 30, 0, 30)
dayEndTextView.textAlignment = View.TEXT_ALIGNMENT_CENTER
dayEndTextView.gravity = Gravity.CENTER
dayEndTextView.setTextColor(ContextCompat.getColor(requireContext(), R.color.white))
dayEndTextView.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.white
)
)
val dayEndDrawable = GradientDrawable()
dayEndDrawable.shape = GradientDrawable.RECTANGLE
@@ -354,7 +439,14 @@ class DayFragment(private val position: Int) : Fragment(R.layout.fragment_day) {
dayEndDrawable.setColor(
ContextCompat.getColor(
requireContext(),
R.color.cal_week_bg
R.color.primary_transparent_bg
)
)
dayEndDrawable.setStroke(
10,
ContextCompat.getColor(
requireContext(),
R.color.primary
)
)
dayEndTextView.background = dayEndDrawable
@@ -6,32 +6,6 @@ import android.view.LayoutInflater
import androidx.fragment.app.DialogFragment
class Dialogs {
class SignOut(context: Context) : AlertDialog(context) {
init {
// Initialize your dialog properties
setTitle("Opravdu se chcete odhlásit a ukončit aplikaci?")
//setMessage("Uložené přihlašovací údaje budou vymazány.")
setCancelable(true) // Set whether the dialog can be canceled by tapping outside
// Set positive button (e.g., "OK" button)
setButton(
BUTTON_POSITIVE,
"Ano"
) { _, _ ->
Account.clearAccountFile()
MainActivity.quit(context)
}
// Set negative button (e.g., "Cancel" button)
setButton(
BUTTON_NEGATIVE,
"Ne"
) { _, _ ->
dismiss()
}
}
}
class LanguageChange(context: Context) : AlertDialog(context) {
init {
// Initialize your dialog properties
@@ -3,9 +3,11 @@ package com.odweta.solen
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.EditText
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
@@ -24,7 +26,7 @@ class MainActivity : AppCompatActivity() {
private var toastShown: Boolean = false
private var toast2Shown: Boolean = false
private var done: Boolean = false
private lateinit var toolbar: androidx.appcompat.widget.Toolbar
private lateinit var toolbar: TextView
private var role: String = " - Student"
private lateinit var navbar: BottomNavigationView
@@ -110,7 +112,7 @@ class MainActivity : AppCompatActivity() {
}
} else if (!Vars.internetAvail) {
Vars.internetAvail = Util.internetAvail(applicationContext)
supportActionBar?.title = "Bez připojení k internetu."
toolbar.text = "Bez připojení k internetu."
} else {
Vars.internetAvail = Util.internetAvail(applicationContext)
}
@@ -123,13 +125,13 @@ class MainActivity : AppCompatActivity() {
lifecycleScope.launch {
done = false
while (!done) {
supportActionBar?.title = "Načítání nových dat"
toolbar.text = "Načítání nových dat"
delay(300)
supportActionBar?.title = "Načítání nových dat."
toolbar.text = "Načítání nových dat."
delay(300)
supportActionBar?.title = "Načítání nových dat.."
toolbar.text = "Načítání nových dat.."
delay(300)
supportActionBar?.title = "Načítání nových dat..."
toolbar.text = "Načítání nových dat..."
delay(300)
}
@@ -139,7 +141,7 @@ class MainActivity : AppCompatActivity() {
" - Student"
}
supportActionBar?.title =
toolbar.text =
JSONObject(Util.fileToString(Vars.userDataFilePath)).getString("fullName") +
role
}
@@ -191,9 +193,13 @@ class MainActivity : AppCompatActivity() {
)
lifecycleScope.launch {
// check if the file is available offline, if yes, load the data and don't connect to the internet
// check if the file is available offline,
// if yes, load the data and don't connect to the internet
Vars.internetAvail = Util.internetAvail(applicationContext)
Vars.timeTableAvailOffline = Util.fileExists(Vars.timeTableFilePath) && !Util.fileIsEmpty(Vars.timeTableFilePath)
Vars.timeTableAvailOffline =
Util.fileExists(Vars.timeTableFilePath) && !Util.fileIsEmpty(Vars.timeTableFilePath)
Vars.marksAvailOffline =
Util.fileExists(Vars.marksFilePath) && !Util.fileIsEmpty(Vars.marksFilePath)
if (toastShown && Vars.internetAvail && !toast2Shown) {
toast2Shown = true
@@ -220,6 +226,20 @@ class MainActivity : AppCompatActivity() {
// parse the data
week = Parsing.parseTimeTableJSON(timeTableJSON)
// fetch and parse marks
lifecycleScope.launch {
Vars.marksJSON = """{"message": "Zatím žádné známky, zkuste aktualizovat data."}"""
Vars.marksJSON = Network.getMarksJSON()
//Log.d("MARKS_JSON", JSONObject(Vars.marksJSON).getJSONArray("subjects").toString())
Vars.marksAvailOffline =
Util.saveStringToFile(Vars.marksFilePath, Vars.marksJSON)
Vars.marks = Parsing.parseMarksJSON(Vars.marksJSON)
}
// continue to launch phase 2
launchPhase2()
} else {
@@ -274,6 +294,12 @@ class MainActivity : AppCompatActivity() {
// load the offline data
val timeTableJSON = Util.fileToString(Vars.timeTableFilePath)
Vars.marksJSON = Util.fileToString(Vars.marksFilePath)
if (Vars.marksJSON == "") {
Vars.marksJSON =
"""{"message": "Zatím žádné známky, zkuste aktualizovat data."}"""
}
// parse the data
if (timeTableJSON != "") {
// cancel a toast, if any
@@ -284,6 +310,8 @@ class MainActivity : AppCompatActivity() {
// parse the data
week = Parsing.parseTimeTableJSON(timeTableJSON)
Vars.marks = Parsing.parseMarksJSON(Vars.marksJSON)
// continue launching
launchPhase2()
} else {
@@ -311,12 +339,18 @@ class MainActivity : AppCompatActivity() {
toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
if (
Util.fileToString(Vars.userDataFilePath) != "" &&
JSONObject(Util.fileToString(Vars.userDataFilePath)).has("fullName")
) {
toolbar.text =
JSONObject(Util.fileToString(Vars.userDataFilePath)).getString("fullName") +
role
} else {
toolbar.text = "Přihlašte se, prosím."
}
supportActionBar?.title =
JSONObject(Util.fileToString(Vars.userDataFilePath)).getString("fullName") + role
window.statusBarColor = ContextCompat.getColor(applicationContext, R.color.primary)
//window.statusBarColor = ContextCompat.getColor(applicationContext, R.color.primary)
navbar = findViewById(R.id.bottomNav)
@@ -1,24 +1,281 @@
package com.odweta.solen
import android.app.Dialog
import android.graphics.Typeface
import android.graphics.drawable.GradientDrawable
import android.os.Bundle
import androidx.fragment.app.DialogFragment
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.widget.Button
import android.widget.ImageView
import android.widget.FrameLayout
import android.widget.HorizontalScrollView
import android.widget.LinearLayout
import android.widget.Space
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
// TODO: MARK DETAILS
class MarksFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.activity_marks, container, false)
val root = view.findViewById<LinearLayout>(R.id.root)
if (Vars.marksAvailOffline && !Util.fileIsEmpty(Vars.marksFilePath)) {
Vars.marksJSON = Util.fileToString(Vars.marksFilePath)
Vars.marksAvailOffline = Util.saveStringToFile(Vars.marksFilePath, Vars.marksJSON)
Vars.marks = Parsing.parseMarksJSON(Vars.marksJSON)
} else {
lifecycleScope.launch {
Vars.marksJSON = Network.getMarksJSON()
Vars.marksAvailOffline = Util.saveStringToFile(Vars.marksFilePath, Vars.marksJSON)
Vars.marks = Parsing.parseMarksJSON(Vars.marksJSON)
}
}
root.addView(createSpace())
for (subject in Vars.marks.keys) {
root.addView(Vars.marks[subject]?.let { createMarkView(it) })
root.addView(createSpace())
}
return view
}
private fun createSpace(): Space {
val space = Space(requireContext())
space.layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
resources.getDimensionPixelSize(R.dimen.cal_week_separator_height)
)
return space
}
private fun avg(marks: MutableList<Mark>): String {
var sum = 0f
var len = 0
for (mark in marks) {
len += 1
sum += (mark.grade.toFloat() * mark.weight.toFloat())
}
val weights = mutableListOf<Float>()
for (mark in marks) {
weights.add(mark.weight.toFloat())
}
return String.format("%.2f", (sum / sum(weights))).replace(',', '.')
}
private fun sum(nums: List<Float>): Float {
var sum = 0f
for (num in nums) {
sum += num
}
return sum
}
private fun getAvgBgColor(avg: String): Int {
var color: Int = R.color.pastel_orange_transparent
if (avg.toFloat() in 1f..<2f) {
color = R.color.pastel_green_transparent
} else if (avg.toFloat() in 2f..<3f) {
color = R.color.pastel_yellow_transparent
} else if (avg.toFloat() in 3f..<4f) {
color = R.color.pastel_orange_transparent
} else if (avg.toFloat() in 4f..5f) {
color = R.color.pastel_red_transparent
}
return ContextCompat.getColor(
requireContext(),
color
)
}
private fun getAvgStrokeColor(avg: String): Int {
var color: Int = R.color.pastel_orange
if (avg.toFloat() in 1f..<2f) {
color = R.color.pastel_green
} else if (avg.toFloat() in 2f..<3f) {
color = R.color.pastel_yellow
} else if (avg.toFloat() in 3f..<4f) {
color = R.color.pastel_orange
} else if (avg.toFloat() in 4f..5f) {
color = R.color.pastel_red
}
return ContextCompat.getColor(
requireContext(),
color
)
}
private fun createMarkView(marks: MutableList<Mark>): LinearLayout {
val markRoot = LinearLayout(requireContext())
markRoot.orientation = LinearLayout.HORIZONTAL
val params = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT
)
params.setMargins(20, 0, 20, 0)
params.height = 210
markRoot.layoutParams = params
val customFont = context?.let { ResourcesCompat.getFont(it, R.font.roboto) }
val markDrawable = GradientDrawable()
markDrawable.shape = GradientDrawable.RECTANGLE
markDrawable.cornerRadius = resources.getDimension(R.dimen.corner_radius)
markDrawable.setColor(
ContextCompat.getColor(
requireContext(),
R.color.primary_transparent_bg
)
)
markDrawable.setStroke(
10,
ContextCompat.getColor(
requireContext(),
R.color.primary
)
)
markRoot.background = markDrawable
val avgDrawable = GradientDrawable()
avgDrawable.shape = GradientDrawable.RECTANGLE
avgDrawable.cornerRadius = resources.getDimension(R.dimen.corner_radius)
avgDrawable.setColor(
if (!marks.contains(Mark().none())) {
getAvgBgColor(avg(marks))
} else {
ContextCompat.getColor(
requireContext(),
R.color.pastel_orange_transparent
)
}
)
avgDrawable.setStroke(
10,
if (!marks.contains(Mark().none())) {
getAvgStrokeColor(avg(marks))
} else {
ContextCompat.getColor(
requireContext(),
R.color.pastel_orange
)
}
)
val avgTextView = TextView(requireContext())
avgTextView.typeface = customFont
val text = if (!marks.contains(Mark().none())) {
avg(marks)
} else {
"-"
}
avgTextView.text = text
avgTextView.textSize = 30f
avgTextView.setPadding(20, 20, 20, 20)
avgTextView.gravity = Gravity.CENTER // Center text vertically
avgTextView.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.white
)
)
avgTextView.background = avgDrawable
val frameLayout = FrameLayout(requireContext())
val layoutParams = LinearLayout.LayoutParams(
210,
FrameLayout.LayoutParams.MATCH_PARENT,
)
frameLayout.layoutParams = layoutParams
frameLayout.addView(avgTextView)
markRoot.addView(frameLayout)
val nameAndMarksLayout = LinearLayout(requireContext())
nameAndMarksLayout.orientation = LinearLayout.VERTICAL
nameAndMarksLayout.gravity = Gravity.START
val subjectTextView = TextView(requireContext())
subjectTextView.text = marks[0].subject.uppercase()
subjectTextView.setPadding(20, 15, 20, 0)
subjectTextView.textSize = 30f
subjectTextView.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.white
)
)
subjectTextView.setTypeface(customFont, Typeface.BOLD)
nameAndMarksLayout.addView(subjectTextView)
val marksTextView = TextView(requireContext())
var markString = ""
for ((i, mark) in marks.withIndex()) {
markString += mark.grade
if (i < marks.size - 1) {
markString += ", "
}
}
marksTextView.text = markString
marksTextView.setPadding(20, -15, 20, 0)
marksTextView.textSize = 23f
marksTextView.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.white
)
)
val marksScrollView = HorizontalScrollView(requireContext())
marksScrollView.addView(marksTextView)
nameAndMarksLayout.addView(marksScrollView)
markRoot.addView(nameAndMarksLayout)
return markRoot
}
}
class Mark {
lateinit var grade: String // markText
lateinit var weight: String // weight
lateinit var subject: String // subjectId -> parse that
lateinit var date: String // markDate
lateinit var theme: String // theme
override fun toString(): String {
return "mark: ${this.grade} * ${this.weight}, subject: ${this.subject}, description: ${this.theme}, date: ${this.date}"
}
fun none(): Mark {
val mark = Mark()
mark.subject = "Zatím žádné známky."
mark.grade = "0"
mark.weight = "0"
mark.date = "-"
mark.theme = "-"
return mark
}
}
@@ -19,8 +19,6 @@ class MenuFragment : Fragment() {
): View? {
val view = inflater.inflate(R.layout.activity_menu, container, false)
addCallbacks(view)
return view
@@ -58,14 +58,40 @@ class Network {
Vars.userData = getUserDataJSON()
Util.saveStringToFile(Vars.userDataFilePath, Vars.userData)
Vars.studentId = getStudentId()
Vars.syid = getSYID()
//Log.d("SYID", Vars.syid)
Vars.marksUrl = "${Vars.apiBaseUrl}/v1/students/${Vars.studentId}/marks/list?SemesterId=${Vars.syid}"
Vars.isAPISetUp = true
}
}
fun getSYID(): String {
val syidRoot = JSONObject(Util.fileToString(Vars.userDataFilePath)).getString("schoolYearId")
val toAdd = JSONObject(Util.fileToString(Vars.userDataFilePath)).getString("studyYear")
val syidStart = syidRoot[0]
var syidNum = syidRoot.slice(1..<syidRoot.length).toInt()
for (ch in toAdd) {
syidNum += 1
}
// TODO: REMOVE LATER, JUST FOR DEBUG
syidNum -= 1
return syidStart.toString() + syidNum.toString()
}
private fun getStudentId(): String {
return if (!Parsing.userIsParent()) {
JSONObject(Vars.userData).get("personID").toString()
JSONObject(Vars.userData).getString("personID")
} else {
JSONObject(Vars.userData).getJSONArray("children").getJSONObject(0).get("id").toString()
JSONObject(Vars.userData).getJSONArray("children")
.getJSONObject(0)
.getString("id")
}
}
@@ -111,5 +137,23 @@ class Network {
}
}
}
suspend fun getMarksJSON(): String {
return withContext(Dispatchers.IO) {
val request = Request.Builder()
.url(Vars.marksUrl)
.header("Content-Type", "application/x-www-form-urlencoded")
.header("Authorization", "Bearer ${Vars.token}")
.get()
.build()
try {
val resp = Vars.client.newCall(request).execute()
resp.body?.string().toString()
} catch (e: IOException) {
"""{"error": "network"}"""
}
}
}
}
}
@@ -1,5 +1,6 @@
package com.odweta.solen
import android.util.Log
import org.json.JSONObject
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
@@ -236,5 +237,66 @@ class Parsing {
return week
}
fun parseMarksJSON(jsonString: String): MutableMap<String, MutableList<Mark>> {
if (!JSONObject(jsonString).has("marks")) {
val noMarks = mutableMapOf<String, MutableList<Mark>>()
val list = mutableListOf<Mark>()
list.add(Mark().none())
noMarks["-"] = list
return noMarks
}
val marks = mutableMapOf<String, MutableList<Mark>>()
val marksList = mutableListOf<JSONObject>()
val marksJSONArray = JSONObject(jsonString).getJSONArray("marks")
val subjectsJSONArray = JSONObject(jsonString).getJSONArray("subjects")
val subjectMap = mutableMapOf<String, String>()
for (i in 0..<subjectsJSONArray.length()) {
val subj = subjectsJSONArray.getJSONObject(i)
subjectMap[subj.getString("id")] = subj.getString("abbrev")
}
for (i in 0..<marksJSONArray.length()) {
marksList.add(marksJSONArray.getJSONObject(i))
}
for (subj in subjectMap.values) {
marks[subj] = mutableListOf()
}
/*
* class Mark {
* lateinit var grade: String // markText
* lateinit var weight: String // weight
* lateinit var subject: String // subjectId -> parse that
* lateinit var date: String // markDate
* lateinit var theme: String // theme
* }
*/
for (markJSON in marksList) {
val mark = Mark()
mark.grade = markJSON.getString("markText")
mark.weight = markJSON.getString("weight")
mark.subject = subjectMap[markJSON.getString("subjectId")].toString()
mark.date = markJSON.getString("markDate")
mark.theme = markJSON.getString("theme")
marks[mark.subject]?.add(mark)
}
return marks
}
}
}
@@ -14,7 +14,7 @@ class SettingsFragment : DialogFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen)
setStyle(STYLE_NORMAL, R.style.Theme_Solen)
}
override fun onCreateView(
@@ -1,6 +1,7 @@
package com.odweta.solen
import android.content.Context
import android.content.res.Resources
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.util.DisplayMetrics
@@ -109,5 +110,13 @@ class Util {
return true
}
}
fun pixelsToDp(pixels: Int, resources: Resources): Int {
return (pixels * resources.displayMetrics.density).toInt()
}
fun dpToPixels(dp: Int, resources: Resources): Int {
return (dp / resources.displayMetrics.density).toInt()
}
}
}
@@ -1,5 +1,6 @@
package com.odweta.solen
import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient
import java.io.File
@@ -8,30 +9,39 @@ class Vars {
const val accountDataFilePath: String = "account_data.txt"
const val timeTableFilePath: String = "timetable.json"
const val userDataFilePath: String = "userdata.json"
//const val marksFilePath: String = "marks.json"
lateinit var fileDir: File
const val marksFilePath: String = "marks.json"
var fileDir: File = File("")
var width: Int = 0
var height: Int = 0
var internetAvail: Boolean = false
var timeTableAvailOffline: Boolean = false
//var marksAvailOffline: Boolean = false
var marksAvailOffline: Boolean = false
val dayMap = mutableMapOf<Int, Day>()
var days = listOf<Day>()
lateinit var username: String
lateinit var password: String
var marksJSON: String = ""
var marks: MutableMap<String, MutableList<Mark>> = mutableMapOf()
var username: String = ""
var password: String = ""
val client = OkHttpClient()
private const val apiBaseUrl = "https://aplikace.skolaonline.cz/solapi/api"
var isAPISetUp: Boolean = false
var selectedDay: Int = 0
var dayEndString: String = ""
const val apiBaseUrl = "https://aplikace.skolaonline.cz/solapi/api"
const val tokenUrl = "$apiBaseUrl/connect/token"
lateinit var token: String
var token: String = ""
const val userDataUrl = "$apiBaseUrl/v1/user"
lateinit var userData: String
lateinit var studentId: String
var userData: String = ""
var studentId: String = ""
const val timeTableUrl = "$apiBaseUrl/v1/timeTable"
//val marksUrl = "$apiBaseUrl/v1/students/$studentId/marks/list"
var syid = "" // school year id
var marksUrl = "$apiBaseUrl/v1/students/$studentId/marks/list?SemesterId=$syid"
}
}
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/corner_radius" />
<solid android:color="@color/pastel_orange_transparent" />
<stroke android:width="5dp" android:color="@color/pastel_orange" />
</shape>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

@@ -42,10 +42,10 @@
<TextView
android:id="@+id/textView"
android:layout_width="299dp"
android:layout_height="100dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginBottom="300dp"
android:text="Vylepšená verze školního informačního systému ŠkolaOnLine."
android:text="Vylepšená verze mobilní aplikace ŠkolaOnLine"
android:textAlignment="center"
android:textColor="#FFFFFF"
android:textSize="24sp"
@@ -54,7 +54,23 @@
app:layout_constraintHorizontal_bias="0.416"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView2"
app:layout_constraintVertical_bias="0.804" />
app:layout_constraintVertical_bias="0.658" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="144dp"
android:layout_marginTop="70dp"
android:layout_marginEnd="1dp"
android:text="Vývoj:"
android:textColor="#FFFFFF"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/link"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintVertical_bias="0.106" />
<TextView
android:id="@+id/link"
@@ -64,7 +80,6 @@
android:layout_marginStart="1dp"
android:layout_marginTop="70dp"
android:layout_marginEnd="139dp"
android:layout_marginBottom="188dp"
android:text=" Odweta"
android:textColor="#FFFFFF"
android:textFontWeight="400"
@@ -74,24 +89,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/textView3"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintVertical_bias="1.0" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="144dp"
android:layout_marginTop="70dp"
android:layout_marginEnd="1dp"
android:layout_marginBottom="188dp"
android:text="Vývoj:"
android:textColor="#FFFFFF"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/link"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintVertical_bias="1.0" />
app:layout_constraintVertical_bias="0.106" />
<ImageView
android:id="@+id/imageView7"
@@ -123,4 +121,19 @@
app:layout_constraintStart_toEndOf="@+id/imageView7"
app:layout_constraintTop_toBottomOf="@+id/link"
app:layout_constraintVertical_bias="1.0" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="40dp"
android:fontFamily="monospace"
android:text="Přehlednost je podstata."
android:textAllCaps="false"
android:textColor="#FFFFFF"
android:textSize="20sp"
android:textStyle="italic"
app:layout_constraintBottom_toTopOf="@+id/textView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -12,9 +12,4 @@
android:id="@+id/dayPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -1,51 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/Theme.Solen.AppBarOverlay"
tools:ignore="MissingConstraints">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/Theme.Solen.PopupOverlay"
app:theme="@style/Theme.Solen.AppBarOverlay"/>
<TextView
android:id="@+id/loadingTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="93dp"
android:layout_marginTop="332dp"
android:layout_marginEnd="94dp"
android:layout_marginBottom="332dp"
android:gravity="center"
android:text="Načítání..."
android:textSize="50sp"
android:fontFamily="@font/roboto"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/dayPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.google.android.material.appbar.AppBarLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -8,46 +8,42 @@
tools:context=".MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/roboto_src"
android:theme="@style/Theme.Solen.AppBarOverlay"
app:popupTheme="@style/Theme.Solen.PopupOverlay">
android:id="@+id/toolbarFrame"
android:background="@color/black">
<androidx.appcompat.widget.Toolbar
<TextView
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:subtitle=""
app:title="" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/dayPager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.viewpager2.widget.ViewPager2>
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
android:layout_height="wrap_content"
android:background="@drawable/button_background"
android:gravity="center"
android:layout_marginTop="20dp"
android:layout_marginHorizontal="5dp"
android:padding="10dp"
android:textColor="@color/white"
android:textSize="25dp" />
</com.google.android.material.appbar.AppBarLayout>
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/black"
app:layout_constraintBottom_toTopOf="@+id/bottomNav"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbarFrame"
app:layout_constraintVertical_bias="0.0" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNav"
android:layout_width="match_parent"
android:layout_height="60dp"
android:scrollIndicators="left"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/fragmentContainer"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appBarLayout2"
app:layout_constraintVertical_bias="1.0"
app:menu="@menu/menu_navbar"
tools:layout_editor_absoluteX="0dp" />
app:menu="@menu/menu_navbar" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -6,21 +6,26 @@
android:layout_height="match_parent"
android:background="@color/black">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="146dp"
android:layout_marginTop="262dp"
android:layout_marginEnd="182dp"
android:layout_marginBottom="442dp"
android:text="ZNAMKY"
android:textColor="#FFFFFF"
android:textSize="20sp"
<ScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="1dp"
android:layout_marginTop="1dp"
android:layout_marginEnd="1dp"
android:layout_marginBottom="1dp"
android:orientation="vertical">
</LinearLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -9,52 +9,63 @@
<Button
android:id="@+id/menu_button_settings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="190dp"
android:layout_height="80dp"
android:layout_marginTop="200dp"
android:layout_marginBottom="50dp"
android:text="@string/settings"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@+id/menu_button_sign_out"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent"
android:background="@drawable/button_background"/>
<Button
android:id="@+id/menu_button_sign_out"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="190dp"
android:layout_height="80dp"
android:layout_marginBottom="50dp"
android:text="@string/sign_out"
android:textSize="20sp"
app:cornerRadius="@dimen/corner_radius"
app:layout_constraintBottom_toTopOf="@+id/menu_button_sign_in"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/menu_button_settings" />
app:layout_constraintTop_toBottomOf="@+id/menu_button_settings"
android:background="@drawable/button_background" />
<Button
android:id="@+id/menu_button_sign_in"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="190dp"
android:layout_height="80dp"
android:layout_marginBottom="50dp"
android:text="@string/sign_in"
android:textSize="20sp"
app:cornerRadius="@dimen/corner_radius"
app:layout_constraintBottom_toTopOf="@+id/menu_button_about"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/menu_button_sign_out" />
app:layout_constraintTop_toBottomOf="@+id/menu_button_sign_out"
android:background="@drawable/button_background" />
<Button
android:id="@+id/menu_button_about"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="190dp"
android:layout_height="80dp"
android:layout_marginStart="158dp"
android:layout_marginEnd="159dp"
android:layout_marginBottom="200dp"
android:text="@string/about_app"
android:textSize="20sp"
app:cornerRadius="@dimen/corner_radius"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/menu_button_sign_in" />
app:layout_constraintTop_toBottomOf="@+id/menu_button_sign_in"
android:background="@drawable/button_background" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -49,7 +49,11 @@
android:id="@+id/setting_language"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
android:orientation="horizontal"
android:paddingLeft="20dp"
android:paddingTop="10dp"
android:paddingRight="20dp"
android:paddingBottom="10dp">
<TextView
android:id="@+id/settings_language_text"
@@ -57,6 +61,10 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/lang_change"
android:textColor="#FFFFFF"
android:textColorHighlight="#FFFFFF"
android:textColorHint="#FFFFFF"
android:textColorLink="#FFFFFF"
android:textSize="20sp" />
<Button
@@ -64,7 +72,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/lang_choose" />
android:text="@string/lang_choose"
android:background="@drawable/button_background" />
</LinearLayout>
</LinearLayout>
@@ -9,20 +9,19 @@
android:id="@+id/imageView"
android:layout_width="457dp"
android:layout_height="307dp"
android:layout_marginTop="2dp"
android:layout_marginBottom="17dp"
app:layout_constraintBottom_toTopOf="@+id/usernameField"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.528"
app:srcCompat="@drawable/solen" />
<EditText
android:id="@+id/usernameField"
android:layout_width="237dp"
android:layout_width="240dp"
android:layout_height="50dp"
android:layout_marginTop="292dp"
android:layout_marginBottom="52dp"
android:background="@color/primary"
android:ems="10"
android:hint="Uživatelské jméno"
@@ -30,19 +29,21 @@
android:paddingHorizontal="20dp"
android:textColor="@color/white"
android:textColorHighlight="@color/white"
android:textColorHint="@color/white"
android:textColorHint="#C8FFFFFF"
android:textColorLink="@color/white"
android:theme="@style/sign_in_field"
app:circularflow_radiusInDP="20dp"
app:layout_constraintBottom_toTopOf="@+id/passwordField"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.85" />
<EditText
android:id="@+id/passwordField"
android:layout_width="237dp"
android:layout_width="240dp"
android:layout_height="50dp"
android:layout_marginBottom="288dp"
android:layout_marginBottom="224dp"
android:background="@color/primary"
android:ems="10"
android:hint="Heslo"
@@ -50,8 +51,9 @@
android:paddingHorizontal="20dp"
android:textColor="@color/white"
android:textColorHighlight="@color/white"
android:textColorHint="@color/white"
android:textColorHint="#C8FFFFFF"
android:textColorLink="@color/white"
android:theme="@style/sign_in_field"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
@@ -66,6 +68,7 @@
android:layout_marginBottom="88dp"
android:text="Přihlásit se"
android:textSize="20sp"
app:cornerRadius="@dimen/corner_radius"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

+24 -4
View File
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="primary">#FFED7D31</color>
<color name="old_primary">#FFED7D31</color>
<color name="primary">#FFFF9933</color>
<color name="secondary">#FF000000</color>
<color name="black">#FF000000</color>
@@ -8,9 +9,28 @@
<color name="red">#FFFF0000</color>
<color name="gray_69">#FF696969</color>
<color name="pastel_red">#FFFF6666</color>
<color name="pastel_green">#FF00CC99</color>
<color name="pastel_blue">#FF6699CC</color>
<color name="pastel_orange">#FFFF9933</color>
<color name="pastel_yellow">#FFFFCC33</color>
<color name="pastel_red_transparent">#50FF6666</color>
<color name="pastel_green_transparent">#5000CC99</color>
<color name="pastel_blue_transparent">#506699CC</color>
<color name="pastel_orange_transparent">#50FF9933</color>
<color name="pastel_yellow_transparent">#50FFCC33</color>
<color name="cal_week_bg">#FF696969</color>
<color name="cal_week_subject">#FFF1F1F1</color>
<color name="cal_week_substitute">#FD411E</color>
<color name="cal_week_event">#FFFDAA22</color>
<color name="cal_week_free">#FFAAFF66</color>
<color name="cal_week_substitute">#FFFF6666</color>
<color name="cal_week_substitute_transparent_bg">#50FF6666</color>
<!--<color name="cal_week_event">#FFFDAA22</color>
<color name="cal_week_event_transparent_bg">#50FDAA22</color>-->
<color name="cal_week_event">#FF6699CC</color>
<color name="cal_week_event_transparent_bg">#506699CC</color>
<color name="cal_week_free">#FF00CC99</color>
<color name="cal_week_free_transparent_bg">#5000CC99</color>
<color name="primary_transparent_bg">#50ED7D31</color>
</resources>
@@ -70,4 +70,9 @@
<item name="android:linksClickable">true</item>
</style>
<style name="sign_in_field">
<item name="android:strokeColor">@color/white</item>
<item name="android:strokeWidth">5</item>
<item name="cornerRadius">@dimen/corner_radius</item>
</style>
</resources>