UI update, mark details

This commit is contained in:
Odweta
2024-02-11 20:13:24 +01:00
parent ba787b06fc
commit 91ac67075d
185 changed files with 1116 additions and 669 deletions
+1 -1
View File
@@ -1 +1 @@
Solen Solon
+2 -2
View File
@@ -43,8 +43,8 @@ dependencies {
implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0") implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0") implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0")
implementation("androidx.navigation:navigation-fragment-ktx:2.7.6") implementation("androidx.navigation:navigation-fragment-ktx:2.7.7")
implementation("androidx.navigation:navigation-ui-ktx:2.7.6") implementation("androidx.navigation:navigation-ui-ktx:2.7.7")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0") implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0")
implementation("com.squareup.okhttp3:okhttp:4.12.0") implementation("com.squareup.okhttp3:okhttp:4.12.0")
implementation("androidx.viewpager2:viewpager2:1.0.0") implementation("androidx.viewpager2:viewpager2:1.0.0")
+2 -1
View File
@@ -21,7 +21,8 @@
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"
android:theme="@style/Theme.Solen"> android:theme="@style/Theme.Solen"
android:windowSoftInputMode="adjustResize">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@@ -24,8 +24,8 @@ import kotlin.math.abs
class AboutFragment : DialogFragment() { class AboutFragment : DialogFragment() {
private lateinit var gestureDetector: GestureDetector private lateinit var gestureDetector: GestureDetector
private var initialTouchY: Float = 0f private var initialTouchY: Float = 0f
private val SWIPETHRESHOLD = 100 private val swipeThreshold = 100
private val SWIPEVELOCITYTHRESHOLD = 100 private val swipeVelocityThreshold = 100
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -43,6 +43,7 @@ class AboutFragment : DialogFragment() {
// Attach the gesture detector to the root layout // Attach the gesture detector to the root layout
view.setOnTouchListener { _, event -> view.setOnTouchListener { _, event ->
view.performClick()
handleTouchEvent(event) handleTouchEvent(event)
} }
@@ -59,7 +60,7 @@ class AboutFragment : DialogFragment() {
underlinedText2.setSpan(UnderlineSpan(), 1, srcLink.text.length, 0) underlinedText2.setSpan(UnderlineSpan(), 1, srcLink.text.length, 0)
srcLink.text = underlinedText2 srcLink.text = underlinedText2
makeTextViewClickable(srcLink, "https://gitlab.com/Odweta/solen") makeTextViewClickable(srcLink, "https://gitlab.com/Odweta/solon")
return view return view
} }
@@ -108,7 +109,7 @@ class AboutFragment : DialogFragment() {
velocityY: Float velocityY: Float
): Boolean { ): Boolean {
val diffY = e1?.let { e2.y.minus(it.y) } ?: 0f val diffY = e1?.let { e2.y.minus(it.y) } ?: 0f
if (diffY > SWIPETHRESHOLD && abs(velocityY) > SWIPEVELOCITYTHRESHOLD) { if (diffY > swipeThreshold && abs(velocityY) > swipeVelocityThreshold) {
// Swiped down // Swiped down
dismiss() dismiss()
return true return true
@@ -117,6 +118,7 @@ class AboutFragment : DialogFragment() {
} }
} }
@Suppress("SameReturnValue", "SameReturnValue", "SameReturnValue")
private fun handleTouchEvent(event: MotionEvent): Boolean { private fun handleTouchEvent(event: MotionEvent): Boolean {
when (event.action) { when (event.action) {
MotionEvent.ACTION_DOWN -> { MotionEvent.ACTION_DOWN -> {
@@ -7,6 +7,7 @@ import android.graphics.drawable.GradientDrawable
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.util.Log
import android.view.Gravity import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@@ -41,7 +42,7 @@ class CalWeekFragment : Fragment() {
val adapter = DayPagerAdapter(childFragmentManager, viewLifecycleOwner.lifecycle) val adapter = DayPagerAdapter(childFragmentManager, viewLifecycleOwner.lifecycle)
for (i in 0 until Vars.days.size) { for (i in 0 until Vars.days.size) {
adapter.addFragment(DayFragment(i, view)) adapter.addFragment(DayFragment(i))
} }
viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
@@ -55,8 +56,6 @@ class CalWeekFragment : Fragment() {
viewPager.offscreenPageLimit = adapter.itemCount viewPager.offscreenPageLimit = adapter.itemCount
viewPager.currentItem = Vars.selectedDay viewPager.currentItem = Vars.selectedDay
view.tag = "timetable_root"
return view return view
} }
} }
@@ -79,7 +78,7 @@ class DayPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) :
} }
} }
class DayFragment(private val position: Int, private val rootView: View) : Fragment(R.layout.fragment_day) { class DayFragment(private val i: Int) : Fragment() {
private val handler = Handler(Looper.getMainLooper()) private val handler = Handler(Looper.getMainLooper())
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@@ -89,11 +88,9 @@ class DayFragment(private val position: Int, private val rootView: View) : Fragm
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
val view = inflater.inflate(R.layout.fragment_day, container, false) val view = inflater.inflate(R.layout.fragment_day, container, false)
view.tag = "day_${position}_root"
val dayLayout: LinearLayout = view.findViewById(R.id.layoutDayMain) val dayLayout: LinearLayout = view.findViewById(R.id.layoutDayMain)
dayLayout.tag = "day_${position}_layout" Vars.dayMap[i]?.let { createDayView(it, dayLayout, resources) }
Vars.dayMap[position]?.let { createDayView(it, dayLayout, resources) }
return view return view
} }
@@ -109,11 +106,11 @@ class DayFragment(private val position: Int, private val rootView: View) : Fragm
override fun run() { override fun run() {
subjectDrawable.setStroke(0, 0) subjectDrawable.setStroke(0, 0)
var now = LocalTime.now() val now = LocalTime.now()
var nowD = LocalDate.now().dayOfMonth val nowD = LocalDate.now().dayOfMonth
var nowH = now.hour val nowH = now.hour
var nowM = now.minute val nowM = now.minute
var nowT = LocalTime.of(nowH, nowM) val nowT = LocalTime.of(nowH, nowM)
lateinit var subjST: LocalTime lateinit var subjST: LocalTime
lateinit var subjET: LocalTime lateinit var subjET: LocalTime
@@ -223,7 +220,8 @@ class DayFragment(private val position: Int, private val rootView: View) : Fragm
} }
} }
rootView.postInvalidate() requireView().postInvalidate()
// repeat every 40 seconds
handler.postDelayed(this, 40000L) handler.postDelayed(this, 40000L)
} }
}, 0L) }, 0L)
@@ -245,7 +243,7 @@ class DayFragment(private val position: Int, private val rootView: View) : Fragm
dayLayout.orientation = LinearLayout.VERTICAL dayLayout.orientation = LinearLayout.VERTICAL
val nameDateTextView = TextView(requireContext()) val nameDateTextView = TextView(requireContext())
nameDateTextView.text = "${day.name} ${day.date}" nameDateTextView.text = String.format("%s %s", day.name, day.date)
nameDateTextView.setTypeface(customFont, Typeface.BOLD_ITALIC) nameDateTextView.setTypeface(customFont, Typeface.BOLD_ITALIC)
nameDateTextView.textSize = 27f nameDateTextView.textSize = 27f
nameDateTextView.setTextColor( nameDateTextView.setTextColor(
@@ -254,7 +252,7 @@ class DayFragment(private val position: Int, private val rootView: View) : Fragm
R.color.white R.color.white
) )
) )
nameDateTextView.setPadding(10, 40, 10, 40) nameDateTextView.setPadding(10, 0, 10, 40)
nameDateTextView.gravity = Gravity.CENTER_HORIZONTAL nameDateTextView.gravity = Gravity.CENTER_HORIZONTAL
rootLayout.addView(nameDateTextView) rootLayout.addView(nameDateTextView)
@@ -269,8 +267,6 @@ class DayFragment(private val position: Int, private val rootView: View) : Fragm
prevSubj.end = "" prevSubj.end = ""
prevSubj.free = false prevSubj.free = false
var firstDone = false
for ((i, subj) in day.subjects.withIndex()) { for ((i, subj) in day.subjects.withIndex()) {
val subjectBackground = when (subj.substitute) { val subjectBackground = when (subj.substitute) {
"0" -> if (subj.place != "Volno") { "0" -> if (subj.place != "Volno") {
@@ -329,8 +325,6 @@ class DayFragment(private val position: Int, private val rootView: View) : Fragm
subjectLayout.orientation = LinearLayout.HORIZONTAL subjectLayout.orientation = LinearLayout.HORIZONTAL
subjectLayout.gravity = Gravity.CENTER_VERTICAL subjectLayout.gravity = Gravity.CENTER_VERTICAL
subjectLayout.background = subjectDrawable subjectLayout.background = subjectDrawable
// set the tag for later use (used as an id)
subjectLayout.tag = subj.number
val subjectNumberDrawable = GradientDrawable() val subjectNumberDrawable = GradientDrawable()
subjectNumberDrawable.shape = GradientDrawable.RECTANGLE subjectNumberDrawable.shape = GradientDrawable.RECTANGLE
@@ -341,13 +335,6 @@ class DayFragment(private val position: Int, private val rootView: View) : Fragm
subjectBackground subjectBackground
) )
) )
/*subjectNumberDrawable.setStroke(
10,
ContextCompat.getColor(
requireContext(),
subjectStroke
)
)*/
val subjectNumberTextView = TextView(requireContext()) val subjectNumberTextView = TextView(requireContext())
subjectNumberTextView.typeface = customFont subjectNumberTextView.typeface = customFont
@@ -1,10 +1,16 @@
package com.odweta.solon package com.odweta.solon
import android.annotation.SuppressLint
import android.app.AlertDialog import android.app.AlertDialog
import android.content.Context import android.content.Context
import android.content.res.Resources
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
class Dialogs { class Dialogs {
@SuppressLint("InflateParams")
class LanguageChange(context: Context) : AlertDialog(context) { class LanguageChange(context: Context) : AlertDialog(context) {
init { init {
// Initialize your dialog properties // Initialize your dialog properties
@@ -12,6 +18,7 @@ class Dialogs {
setCancelable(true) setCancelable(true)
// Inflate the layout for the dialog // Inflate the layout for the dialog
val view = LayoutInflater.from(context).inflate(R.layout.radio_group_language, null) val view = LayoutInflater.from(context).inflate(R.layout.radio_group_language, null)
window?.setBackgroundDrawableResource(R.drawable.alert_dialog_background)
setView(view) setView(view)
// Set positive button (e.g., "OK" button) // Set positive button (e.g., "OK" button)
@@ -20,7 +27,6 @@ class Dialogs {
"OK" "OK"
) { _, _ -> ) { _, _ ->
// functionality here // functionality here
dismiss() dismiss()
} }
@@ -32,5 +38,15 @@ class Dialogs {
dismiss() dismiss()
} }
} }
override fun onStart() {
super.onStart()
val okButton = getButton(BUTTON_POSITIVE)
okButton?.setTextColor(ContextCompat.getColor(context, R.color.white))
val cancelButton = getButton(BUTTON_NEGATIVE)
Log.d("debug", "$okButton $cancelButton")
cancelButton?.setTextColor(ContextCompat.getColor(context, R.color.white))
}
} }
} }
@@ -2,7 +2,6 @@ package com.odweta.solon
import android.app.Dialog import android.app.Dialog
import android.content.Context import android.content.Context
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Button import android.widget.Button
@@ -43,21 +42,6 @@ class MainActivity : AppCompatActivity(), MainActivityListener {
fun callLaunchPhase1() { fun callLaunchPhase1() {
intfc?.launchPhase1() intfc?.launchPhase1()
} }
fun quit(context: Context) {
// Create an Intent to launch the home screen
val homeIntent = Intent(Intent.ACTION_MAIN)
homeIntent.addCategory(Intent.CATEGORY_HOME)
homeIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
// Start the home screen activity
context.startActivity(homeIntent)
// If the context is an Activity, finish it to close the current activity
if (context is AppCompatActivity) {
context.finish()
}
}
} }
@@ -92,36 +76,35 @@ class MainActivity : AppCompatActivity(), MainActivityListener {
val btn = view.findViewById<Button>(R.id.signInButton) val btn = view.findViewById<Button>(R.id.signInButton)
while (!checked) { while (!checked) {
delay(300)
btn.text = String.format("%s", "Přihlašování")
if (!checked) { if (!checked) {
delay(300) delay(300)
btn.text = "Přihlašování" btn.text = String.format("%s", "Přihlašování.")
} }
if (!checked) { if (!checked) {
delay(300) delay(300)
btn.text = "Přihlašování." btn.text = String.format("%s", "Přihlašování..")
} }
if (!checked) { if (!checked) {
delay(300) delay(300)
btn.text = "Přihlašování.." btn.text = String.format("%s", "Přihlašování...")
} }
if (!checked) { if (!checked) {
delay(300) delay(300)
btn.text = "Přihlašování..." btn.text = String.format("%s", "Přihlašování..")
} }
if (!checked) { if (!checked) {
delay(300) delay(300)
btn.text = "Přihlašování.." btn.text = String.format("%s", "Přihlašování.")
} }
if (!checked) { if (!checked) {
delay(300) delay(300)
btn.text = "Přihlašování." btn.text = String.format("%s", "Přihlašování")
}
if (!checked) {
delay(300)
btn.text = "Přihlašování"
} }
} }
btn.text = "Přihlásit se" btn.text = String.format("%s", "Přihlásit se")
} }
lifecycleScope.launch { lifecycleScope.launch {
@@ -349,13 +332,4 @@ class MainActivity : AppCompatActivity(), MainActivityListener {
ft.commit() ft.commit()
} }
// without animations
private fun ft(container: Int, frag: Fragment) {
val ft = supportFragmentManager.beginTransaction()
ft.replace(container, frag)
ft.commit()
}
} }
@@ -43,10 +43,16 @@ class MainFragment : Fragment() {
JSONObject(Util.fileToString(Vars.userDataFilePath)).has("fullName") JSONObject(Util.fileToString(Vars.userDataFilePath)).has("fullName")
) { ) {
toolbar.text = toolbar.text =
JSONObject(Util.fileToString(Vars.userDataFilePath)).getString("fullName") + String.format(
role "%s",
"${JSONObject(
Util.fileToString(
Vars.userDataFilePath
)
).getString("fullName")}$role"
)
} else { } else {
toolbar.text = "Přihlašte se, prosím." toolbar.text = String.format("%s", "Přihlašte se, prosím.")
} }
navbar = view.findViewById(R.id.bottomNav) navbar = view.findViewById(R.id.bottomNav)
@@ -125,7 +131,7 @@ class MainFragment : Fragment() {
} }
} else if (!Vars.internetAvail) { } else if (!Vars.internetAvail) {
Vars.internetAvail = Util.internetAvail(requireContext()) Vars.internetAvail = Util.internetAvail(requireContext())
toolbar.text = "Bez připojení k internetu." toolbar.text = String.format("%s", "Bez připojení k internetu.")
} else { } else {
Vars.internetAvail = Util.internetAvail(requireContext()) Vars.internetAvail = Util.internetAvail(requireContext())
} }
@@ -138,19 +144,19 @@ class MainFragment : Fragment() {
lifecycleScope.launch { lifecycleScope.launch {
done = false done = false
while (!done) { while (!done) {
toolbar.text = "Načítání nových dat" toolbar.text = String.format("%s", "Načítání nových dat")
delay(300) delay(300)
toolbar.text = "Načítání nových dat." toolbar.text = String.format("%s", "Načítání nových dat.")
delay(300) delay(300)
toolbar.text = "Načítání nových dat.." toolbar.text = String.format("%s", "Načítání nových dat..")
delay(300) delay(300)
toolbar.text = "Načítání nových dat..." toolbar.text = String.format("%s", "Načítání nových dat...")
delay(300) delay(300)
toolbar.text = "Načítání nových dat.." toolbar.text = String.format("%s", "Načítání nových dat..")
delay(300) delay(300)
toolbar.text = "Načítání nových dat." toolbar.text = String.format("%s", "Načítání nových dat.")
delay(300) delay(300)
toolbar.text = "Načítání nových dat" toolbar.text = String.format("%s", "Načítání nových dat")
delay(300) delay(300)
} }
@@ -161,8 +167,14 @@ class MainFragment : Fragment() {
} }
toolbar.text = toolbar.text =
JSONObject(Util.fileToString(Vars.userDataFilePath)).getString("fullName") + String.format(
role "%s",
"${JSONObject(
Util.fileToString(
Vars.userDataFilePath
)
).getString("fullName")}$role"
)
} }
lifecycleScope.launch { lifecycleScope.launch {
@@ -0,0 +1,286 @@
package com.odweta.solon
import android.annotation.SuppressLint
import android.app.Dialog
import android.graphics.Typeface
import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable
import android.os.Bundle
import android.util.Log
import android.view.GestureDetector
import android.view.Gravity
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.widget.LinearLayout
import android.widget.Space
import android.widget.TableLayout
import android.widget.TableRow
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import androidx.fragment.app.DialogFragment
import java.text.SimpleDateFormat
import kotlin.math.abs
// details for the marks of one subject
class MarkDetailsFragment(private val marks: MutableList<Mark>, private var idx: Int?) : DialogFragment() {
private lateinit var gestureDetector: GestureDetector
private var initialTouchY: Float = 0f
private val swipeThreshold = 100
private val swipeVelocityThreshold = 100
private lateinit var rootLayout: LinearLayout
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// set the style so the dialog is fullscreen
setStyle(STYLE_NORMAL, R.style.Theme_Solen)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// inflate the layout
val view = inflater.inflate(R.layout.activity_mark_details, container, false)
// get the root layout
rootLayout = view.findViewById(R.id.one_mark_root)
if (idx == null) {
return null
}
// set up gestures
gestures(view)
// construct the view
construct()
// return the view
return view
}
private fun gestures(view: View) {
// Set up GestureDetector
gestureDetector = GestureDetector(requireContext(), SwipeGestureListener())
// Attach the gesture detector to the root layout
view.setOnTouchListener { _, event ->
view.performClick()
handleTouchEvent(event)
}
}
// TODO: MAKE CONSTRUCT()
@SuppressLint("SetTextI18n", "ClickableViewAccessibility")
private fun construct() {
/* show all the marks in separate views with yet another onclick listener for even more
* details
*/
// TV == TextView
// LL == LinearLayout
// DR == Drawable
// FL == FrameLayout
// SV == ScrollView
/*val bgColor = if (!marks.contains(Mark().none())) {
Util.getAvgBgColor(requireContext(), Util.avg(marks))
} else {
ContextCompat.getColor(
requireContext(),
R.color.pastel_orange
)
}
val bgStroke = if (!marks.contains(Mark().none())) {
Util.getAvgStrokeColor(requireContext(), Util.avg(marks))
} else {
ContextCompat.getColor(
requireContext(),
R.color.pastel_orange
)
}
val bg = GradientDrawable()
bg.setColor(bgColor)
bg.setStroke(10, bgStroke)
bg.cornerRadius = resources.getDimension(R.dimen.corner_radius)*/
/* subject: <subject>
* desc: <desc>
* date: <date>
* weight: <weight>
*/
val font = context?.let { ResourcesCompat.getFont(it, R.font.roboto) }
val gradeTV = TextView(requireContext())
gradeTV.text = marks[idx!!].grade
gradeTV.textSize = 60f
gradeTV.setTypeface(font, Typeface.BOLD)
gradeTV.background = Util.getAvgDrawable(requireContext(), marks[idx!!].grade)
gradeTV.gravity = Gravity.CENTER
val pr = LinearLayout.LayoutParams(
300,
300
)
pr.setMargins(0, 50, 0, 50)
gradeTV.layoutParams = pr
gradeTV.setPadding(20, 20, 20, 20)
gradeTV.setTextColor(ContextCompat.getColor(requireContext(), R.color.white))
val subjectDesc = makeTV("Předmět: ", Typeface.BOLD, Util.getDisplayWidth(requireContext())/3)
val subjectTV = makeTV(Vars.subjectNameMap[marks[idx!!].subject] ?: marks[idx!!].subject, Typeface.ITALIC, 22f)
val descDesc = makeTV("Popis: ", Typeface.BOLD, Util.getDisplayWidth(requireContext())/3)
val descTV = makeTV(marks[idx!!].theme, Typeface.ITALIC, 22f)
val dateDesc = makeTV("Datum: ", Typeface.BOLD, Util.getDisplayWidth(requireContext())/3)
val dateTV = makeTV(getDate(marks[idx!!].date), Typeface.ITALIC, 22f)
val weightDesc = makeTV("Váha: ", Typeface.BOLD, Util.getDisplayWidth(requireContext())/3)
val weightTV = makeTV(marks[idx!!].weight, Typeface.ITALIC, 22f)
val subjectRow = makeRow(subjectDesc, subjectTV)
val descRow = makeRow(descDesc, descTV)
val dateRow = makeRow(dateDesc, dateTV)
val weightRow = makeRow(weightDesc, weightTV)
rootLayout.addView(gradeTV)
rootLayout.addView(subjectRow)
rootLayout.addView(descRow)
rootLayout.addView(dateRow)
rootLayout.addView(weightRow)
}
private fun getDate(dateIn: String): String {
val dateList = dateIn
.split("T")[0]
.split("-")
return "${dateList[2]}. ${dateList[1]}. ${dateList[0]}"
}
private fun makeTV(text: String, typeface: Int, width: Int): TextView {
val font = context?.let { ResourcesCompat.getFont(it, R.font.roboto) }
val tv = TextView(requireContext())
tv.text = text
tv.textSize = 25f
tv.setPadding(40, 20, 20, 20)
tv.setTypeface(font, typeface)
tv.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.white
)
)
val p = LinearLayout.LayoutParams(
width,
LinearLayout.LayoutParams.MATCH_PARENT
)
p.setMargins(20, 60, 20, 20)
tv.layoutParams = p
tv.background = ResourcesCompat.getDrawable(resources, R.drawable.button_background, null)!!
tv.gravity = Gravity.CENTER_VERTICAL
tv.ellipsize = null
tv.setHorizontallyScrolling(false)
return tv
}
private fun makeTV(text: String, typeface: Int, size: Float): TextView {
val font = context?.let { ResourcesCompat.getFont(it, R.font.roboto) }
val tv = TextView(requireContext())
tv.text = text
tv.textSize = size
tv.setPadding(40, 20, 20, 20)
tv.background = ResourcesCompat.getDrawable(resources, R.drawable.pastel_yellow_no_stroke, null)!!
val p = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
)
p.setMargins(20, 0, 20, 0)
tv.layoutParams = p
tv.setTypeface(font, typeface)
tv.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.white
)
)
tv.gravity = Gravity.CENTER_VERTICAL
tv.ellipsize = null
tv.setHorizontallyScrolling(false)
return tv
}
private fun makeRow(left: TextView, right: TextView): LinearLayout {
val ll = LinearLayout(requireContext())
ll.orientation = LinearLayout.VERTICAL
ll.addView(left)
ll.addView(right)
return ll
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = super.onCreateDialog(savedInstanceState)
dialog.window?.attributes?.windowAnimations = R.style.Theme_Solen_DialogAnimation
dialog.window?.requestFeature(Window.FEATURE_NO_TITLE)
dialog.setCancelable(true)
return dialog
}
inner class SwipeGestureListener : GestureDetector.SimpleOnGestureListener() {
override fun onDown(e: MotionEvent): Boolean {
return true
}
override fun onFling(
e1: MotionEvent?,
e2: MotionEvent,
velocityX: Float,
velocityY: Float
): Boolean {
val diffY = e1?.let { e2.y.minus(it.y) } ?: 0f
if (diffY > swipeThreshold && abs(velocityY) > swipeVelocityThreshold) {
// Swiped down
dismiss()
return true
}
return false
}
}
@Suppress("SameReturnValue")
private fun handleTouchEvent(event: MotionEvent): Boolean {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
initialTouchY = event.rawY
}
MotionEvent.ACTION_MOVE -> {
val deltaY = event.rawY - initialTouchY
dialog?.window?.attributes?.y = deltaY.toInt()
dialog?.window?.attributes?.windowAnimations = 0
dialog?.show()
// Check if the dialog has been dragged beyond a threshold and dismiss if necessary
if (deltaY > 200) {
dismiss()
}
}
MotionEvent.ACTION_UP -> {
initialTouchY = 0f
}
}
return true
}
}
@@ -3,12 +3,12 @@ package com.odweta.solon
import android.graphics.Typeface import android.graphics.Typeface
import android.graphics.drawable.GradientDrawable import android.graphics.drawable.GradientDrawable
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.Gravity import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.HorizontalScrollView
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.Space import android.widget.Space
import android.widget.TextView import android.widget.TextView
@@ -18,13 +18,20 @@ import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
// TODO: MARK DETAILS @Suppress("DEPRECATION")
class MarksFragment : Fragment() { class MarksFragment : Fragment() {
private lateinit var inflater: LayoutInflater
private var container: ViewGroup? = null
private var savedInstanceState: Bundle? = null
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
this.inflater = inflater
this.container = container
this.savedInstanceState = savedInstanceState
if (Vars.marksAvailOffline && !Util.fileIsEmpty(Vars.marksFilePath)) { if (Vars.marksAvailOffline && !Util.fileIsEmpty(Vars.marksFilePath)) {
Vars.marksJSON = Util.fileToString(Vars.marksFilePath) Vars.marksJSON = Util.fileToString(Vars.marksFilePath)
Vars.marksAvailOffline = Util.saveStringToFile(Vars.marksFilePath, Vars.marksJSON) Vars.marksAvailOffline = Util.saveStringToFile(Vars.marksFilePath, Vars.marksJSON)
@@ -55,10 +62,11 @@ class MarksFragment : Fragment() {
val root = view.findViewById<LinearLayout>(R.id.root) val root = view.findViewById<LinearLayout>(R.id.root)
root.addView(createSpace()) for ((i, subject) in Vars.marks.keys.withIndex()) {
for (subject in Vars.marks.keys) {
root.addView(Vars.marks[subject]?.let { createMarkView(it) }) root.addView(Vars.marks[subject]?.let { createMarkView(it) })
root.addView(createSpace()) if (i < Vars.marks.keys.size-1) {
root.addView(createSpace())
}
} }
return view return view
@@ -75,68 +83,33 @@ class MarksFragment : Fragment() {
return space return space
} }
private fun avg(marks: MutableList<Mark>): String { private fun makeDR(marks: MutableList<Mark>): GradientDrawable {
var sum = 0f val avgDrawable = GradientDrawable()
var len = 0 avgDrawable.shape = GradientDrawable.RECTANGLE
avgDrawable.cornerRadius = resources.getDimension(R.dimen.corner_radius)
for (mark in marks) { avgDrawable.setColor(
len += 1 if (!marks.contains(Mark().none())) {
sum += (mark.grade.toFloat() * mark.weight.toFloat()) Util.getAvgBgColor(requireContext(), Util.avg(marks))
} } else {
ContextCompat.getColor(
val weights = mutableListOf<Float>() requireContext(),
R.color.pastel_orange_transparent
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
) )
} avgDrawable.setStroke(
private fun getAvgStrokeColor(avg: String): Int { 10,
var color: Int = R.color.pastel_orange if (!marks.contains(Mark().none())) {
Util.getAvgStrokeColor(requireContext(), Util.avg(marks))
if (avg.toFloat() in 1f..<2f) { } else {
color = R.color.pastel_green ContextCompat.getColor(
} else if (avg.toFloat() in 2f..<3f) { requireContext(),
color = R.color.pastel_yellow R.color.pastel_orange
} 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
) )
return avgDrawable
} }
private fun createMarkView(marks: MutableList<Mark>): LinearLayout { private fun createMarkView(marks: MutableList<Mark>): LinearLayout {
@@ -144,36 +117,25 @@ class MarksFragment : Fragment() {
markRoot.orientation = LinearLayout.HORIZONTAL markRoot.orientation = LinearLayout.HORIZONTAL
val params = LinearLayout.LayoutParams( val params = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT LinearLayout.LayoutParams.WRAP_CONTENT
) )
params.setMargins(20, 0, 20, 0) params.setMargins(20, 0, 20, 0)
params.height = 210 params.height = 210
markRoot.layoutParams = params markRoot.layoutParams = params
markRoot.gravity = Gravity.CENTER_VERTICAL
val customFont = context?.let { ResourcesCompat.getFont(it, R.font.roboto) } val customFont = context?.let { ResourcesCompat.getFont(it, R.font.roboto) }
val markDrawable = GradientDrawable() val rootDR = makeDR(marks)
markDrawable.shape = GradientDrawable.RECTANGLE val flDR = makeDR(marks)
markDrawable.cornerRadius = resources.getDimension(R.dimen.corner_radius) val separatorDR = makeDR(marks)
markDrawable.setColor(
ContextCompat.getColor( markRoot.background = rootDR
requireContext(),
R.color.primary_transparent_bg
)
)
markDrawable.setStroke(
10,
ContextCompat.getColor(
requireContext(),
R.color.primary
)
)
markRoot.background = markDrawable
if (marks[0].subject == "Zatím žádné známky.") { if (marks[0].subject == "Zatím žádné známky.") {
markRoot.gravity = Gravity.CENTER markRoot.gravity = Gravity.CENTER
val tv = TextView(requireContext()) val tv = TextView(requireContext())
tv.text = "Zatím žádné známky." tv.text = String.format("%s", "Zatím žádné známky.")
tv.textSize = 30f tv.textSize = 30f
tv.setTextColor( tv.setTextColor(
ContextCompat.getColor( ContextCompat.getColor(
@@ -189,68 +151,10 @@ class MarksFragment : Fragment() {
return markRoot return markRoot
} }
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()) val subjectTextView = TextView(requireContext())
subjectTextView.text = marks[0].subject.uppercase() subjectTextView.text = marks[0].subject.uppercase()
subjectTextView.setPadding(20, 15, 20, 0) subjectTextView.setPadding(20, 20, 20, 20)
subjectTextView.textSize = 30f subjectTextView.textSize = 30f
subjectTextView.setTextColor( subjectTextView.setTextColor(
ContextCompat.getColor( ContextCompat.getColor(
@@ -258,9 +162,86 @@ class MarksFragment : Fragment() {
R.color.white R.color.white
) )
) )
subjectTextView.gravity = Gravity.CENTER
subjectTextView.setTypeface(customFont, Typeface.BOLD) subjectTextView.setTypeface(customFont, Typeface.BOLD)
nameAndMarksLayout.addView(subjectTextView) val fl2 = FrameLayout(requireContext())
fl2.layoutParams = LinearLayout.LayoutParams(
210,
FrameLayout.LayoutParams.MATCH_PARENT,
)
fl2.addView(subjectTextView)
val avgTextView = TextView(requireContext())
avgTextView.typeface = customFont
val text = if (!marks.contains(Mark().none())) {
Util.avg(marks)
} else {
"-"
}
avgTextView.text = text
avgTextView.textSize = 30f
avgTextView.setPadding(0, 20, 30, 20)
avgTextView.gravity = Gravity.CENTER // Center text vertically
avgTextView.setTypeface(customFont, Typeface.ITALIC)
avgTextView.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.white
)
)
val frameLayout = FrameLayout(requireContext())
frameLayout.layoutParams = LinearLayout.LayoutParams(
210,
FrameLayout.LayoutParams.MATCH_PARENT,
)
frameLayout.addView(avgTextView)
val flLL = LinearLayout(requireContext())
flLL.layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT
)
flLL.orientation = LinearLayout.HORIZONTAL
flLL.background = flDR
val separator = LinearLayout(requireContext())
separator.layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT
)
separator.gravity = Gravity.CENTER_VERTICAL
separator.background = separatorDR
val space = TextView(requireContext())
space.setPadding(0, 40, 0, 40)
space.gravity = Gravity.CENTER_VERTICAL
space.text = " "
space.textSize = 22f
space.setTextColor(
if (!marks.contains(Mark().none())) {
Util.getAvgBgColor(requireContext(), Util.avg(marks))
} else {
ContextCompat.getColor(
requireContext(),
R.color.pastel_orange_transparent
)
}
)
space.layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT
)
separator.addView(space)
flLL.addView(fl2)
flLL.addView(separator)
flLL.addView(frameLayout)
markRoot.addView(flLL)
val marksTextView = TextView(requireContext()) val marksTextView = TextView(requireContext())
var markString = "" var markString = ""
@@ -271,7 +252,7 @@ class MarksFragment : Fragment() {
} }
} }
marksTextView.text = markString marksTextView.text = markString
marksTextView.setPadding(20, -15, 20, 0) marksTextView.setPadding(20, 20, 20, 20)
marksTextView.textSize = 23f marksTextView.textSize = 23f
marksTextView.setTextColor( marksTextView.setTextColor(
ContextCompat.getColor( ContextCompat.getColor(
@@ -279,13 +260,19 @@ class MarksFragment : Fragment() {
R.color.white R.color.white
) )
) )
marksTextView.gravity = Gravity.CENTER_VERTICAL
marksTextView.ellipsize = null
marksTextView.setHorizontallyScrolling(false)
val marksScrollView = HorizontalScrollView(requireContext()) markRoot.addView(marksTextView)
marksScrollView.addView(marksTextView)
nameAndMarksLayout.addView(marksScrollView) // add an onclick event listener for mark details
markRoot.setOnClickListener {
markRoot.addView(nameAndMarksLayout) /* mark details will be a DialogFragment
* and will slide up from the bottom
*/
MarksOneSubjectFragment(marks).show(requireFragmentManager(), "fragment_mark_details")
}
return markRoot return markRoot
} }
@@ -0,0 +1,249 @@
package com.odweta.solon
import android.annotation.SuppressLint
import android.app.Dialog
import android.graphics.Typeface
import android.graphics.drawable.GradientDrawable
import android.os.Bundle
import android.util.Log
import android.view.GestureDetector
import android.view.Gravity
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import androidx.fragment.app.DialogFragment
import kotlin.math.abs
// details for the marks of one subject
@Suppress("DEPRECATION")
class MarksOneSubjectFragment(private val marks: MutableList<Mark>) : DialogFragment() {
private var initialTouchY: Float = 0f
private lateinit var rootLayout: LinearLayout
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// set the style so the dialog is fullscreen
setStyle(STYLE_NORMAL, R.style.Theme_Solen)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// inflate the layout
val view = inflater.inflate(R.layout.activity_marks_one_subject, container, false)
// get the root layout
rootLayout = view.findViewById(R.id.mark_details_root)
// set up gestures
gestures(view)
// construct the view
construct()
// return the view
return view
}
private fun gestures(view: View) {
// Attach the gesture detector to the root layout
view.setOnTouchListener { _, event ->
view.performClick()
handleTouchEvent(event, null)
}
}
@SuppressLint("SetTextI18n", "ClickableViewAccessibility")
private fun construct() {
/* show all the marks in separate views with yet another onclick listener for even more
* details
*/
// TV == TextView
// LL == LinearLayout
// DR == Drawable
// FL == FrameLayout
// SV == ScrollView
val customFont = context?.let { ResourcesCompat.getFont(it, R.font.roboto) }
val bgColor = if (!marks.contains(Mark().none())) {
Util.getAvgBgColor(requireContext(), Util.avg(marks))
} else {
ContextCompat.getColor(
requireContext(),
R.color.pastel_orange
)
}
val bgStroke = if (!marks.contains(Mark().none())) {
Util.getAvgStrokeColor(requireContext(), Util.avg(marks))
} else {
ContextCompat.getColor(
requireContext(),
R.color.pastel_orange
)
}
val bg = GradientDrawable()
bg.setColor(bgColor)
bg.setStroke(10, bgStroke)
bg.cornerRadius = resources.getDimension(R.dimen.corner_radius)
// the view for all the details of one subject (not the marks)
// e.g. average in that subject, hours per week maybe idk
val subjectDetailsLL = LinearLayout(requireContext())
subjectDetailsLL.orientation = LinearLayout.HORIZONTAL
subjectDetailsLL.setPadding(20, 20, 20, 20)
subjectDetailsLL.background = bg
val params = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
)
params.setMargins(0, 40, 0, 40)
subjectDetailsLL.layoutParams = params
/* items:
* - whole name of the subject
* - avg
* - maybe more idk
*/
val wholeNameTV = TextView(requireContext())
// index by the abbrev and get the name (if null just fallback to the abbrev)
wholeNameTV.text = Vars.subjectNameMap[marks[0].subject] ?: marks[0].subject
wholeNameTV.textSize = 28f
wholeNameTV.gravity = Gravity.CENTER
wholeNameTV.setPadding(20, 30, 10, 30)
wholeNameTV.setTypeface(customFont, Typeface.BOLD)
wholeNameTV.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.white
)
)
wholeNameTV.ellipsize = null
wholeNameTV.setHorizontallyScrolling(false)
subjectDetailsLL.addView(wholeNameTV)
val avgTV = TextView(requireContext())
avgTV.text = "${Util.avg(marks)} " // plus a space for the italic stuff
avgTV.textSize = 28f
avgTV.setTypeface(customFont, Typeface.BOLD_ITALIC)
avgTV.textAlignment = View.TEXT_ALIGNMENT_TEXT_END
avgTV.layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT
)
avgTV.setPadding(30, 30, 30, 30)
avgTV.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.white
)
)
subjectDetailsLL.addView(avgTV)
// a vertical LL for individual marks
val marksLL = LinearLayout(requireContext())
marksLL.orientation = LinearLayout.VERTICAL
for ((i, mark) in marks.withIndex()) {
val markLL = LinearLayout(requireContext())
markLL.orientation = LinearLayout.HORIZONTAL
markLL.gravity = Gravity.CENTER_VERTICAL
val markTV = TextView(requireContext())
markTV.text = mark.grade
markTV.setPadding(20, 20, 20, 20)
markTV.textSize = 30f
markTV.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.white
)
)
val descTV = TextView(requireContext())
descTV.text = "${mark.theme} "
descTV.setPadding(20, 20, 20, 20)
descTV.textSize = 20f
descTV.setTextColor(
ContextCompat.getColor(
requireContext(),
R.color.white
)
)
descTV.setOnTouchListener { _, event ->
handleTouchEvent(event, i)
}
descTV.setTypeface(customFont, Typeface.ITALIC)
descTV.ellipsize = null
descTV.setHorizontallyScrolling(false)
markLL.setOnTouchListener { _, event ->
handleTouchEvent(event, i)
}
markLL.addView(markTV)
markLL.addView(descTV)
marksLL.addView(markLL)
}
// add everything to the root layout
rootLayout.addView(subjectDetailsLL)
rootLayout.addView(marksLL)
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = super.onCreateDialog(savedInstanceState)
dialog.window?.attributes?.windowAnimations = R.style.Theme_Solen_DialogAnimation
dialog.window?.requestFeature(Window.FEATURE_NO_TITLE)
dialog.setCancelable(true)
return dialog
}
@Suppress("SameReturnValue", "DEPRECATION")
private fun handleTouchEvent(event: MotionEvent, i: Int? = null): Boolean {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
initialTouchY = event.rawY
}
MotionEvent.ACTION_MOVE -> {
val deltaY = event.rawY - initialTouchY
dialog?.window?.attributes?.y = deltaY.toInt()
dialog?.window?.attributes?.windowAnimations = 0
dialog?.show()
// Check if the dialog has been dragged beyond a threshold and dismiss if necessary
if (deltaY > 200) {
dismiss()
}
}
MotionEvent.ACTION_UP -> {
if (dialog?.isShowing == true) {
i?.let {
MarkDetailsFragment(marks, i).show(
requireFragmentManager(),
"fragment_mark_details"
)
}
}
initialTouchY = 0f
}
}
return true
}
}
@@ -1,5 +1,6 @@
package com.odweta.solon package com.odweta.solon
import android.annotation.SuppressLint
import android.app.AlertDialog import android.app.AlertDialog
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@@ -21,6 +22,7 @@ class MenuFragment : Fragment() {
return view return view
} }
@SuppressLint("InflateParams")
private fun addCallbacks(view: View) { private fun addCallbacks(view: View) {
val settings = view.findViewById<Button>(R.id.menu_button_settings) val settings = view.findViewById<Button>(R.id.menu_button_settings)
val signOut = view.findViewById<Button>(R.id.menu_button_sign_out) val signOut = view.findViewById<Button>(R.id.menu_button_sign_out)
@@ -67,7 +67,7 @@ class Network {
} }
} }
fun getSYID(): String { private fun getSYID(): String {
val syidRoot = JSONObject(Util.fileToString(Vars.userDataFilePath)).getString("schoolYearId") val syidRoot = JSONObject(Util.fileToString(Vars.userDataFilePath)).getString("schoolYearId")
val toAdd = JSONObject(Util.fileToString(Vars.userDataFilePath)).getString("studyYear") val toAdd = JSONObject(Util.fileToString(Vars.userDataFilePath)).getString("studyYear")
@@ -261,6 +261,9 @@ class Parsing {
for (i in 0..<subjectsJSONArray.length()) { for (i in 0..<subjectsJSONArray.length()) {
val subj = subjectsJSONArray.getJSONObject(i) val subj = subjectsJSONArray.getJSONObject(i)
subjectMap[subj.getString("id")] = subj.getString("abbrev") subjectMap[subj.getString("id")] = subj.getString("abbrev")
// map names to abbrevs
Vars.subjectNameMap[subj.getString("abbrev")] = subj.getString("name")
} }
for (i in 0..<marksJSONArray.length()) { for (i in 0..<marksJSONArray.length()) {
@@ -1,5 +1,6 @@
package com.odweta.solon package com.odweta.solon
import android.annotation.SuppressLint
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.view.GestureDetector import android.view.GestureDetector
@@ -12,6 +13,8 @@ import android.view.ViewGroup
import android.view.Window import android.view.Window
import android.widget.Button import android.widget.Button
import android.widget.ScrollView import android.widget.ScrollView
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
class SettingsFragment : DialogFragment() { class SettingsFragment : DialogFragment() {
private lateinit var scrollView: ScrollView private lateinit var scrollView: ScrollView
@@ -53,6 +56,7 @@ class SettingsFragment : DialogFragment() {
} }
} }
@SuppressLint("ClickableViewAccessibility")
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
@@ -63,6 +67,7 @@ class SettingsFragment : DialogFragment() {
scrollView.scrollY = 0 scrollView.scrollY = 0
scrollView.setOnTouchListener { _, event -> scrollView.setOnTouchListener { _, event ->
scrollView.performClick()
gestureDetector.onTouchEvent(event) gestureDetector.onTouchEvent(event)
// Return false to allow normal scrolling // Return false to allow normal scrolling
false false
@@ -15,8 +15,8 @@ import kotlin.math.abs
class SignInFragment : DialogFragment() { class SignInFragment : DialogFragment() {
private lateinit var gestureDetector: GestureDetector private lateinit var gestureDetector: GestureDetector
private var initialTouchY: Float = 0f private var initialTouchY: Float = 0f
private val SWIPETHRESHOLD = 100 private val swipeThreshold = 100
private val SWIPEVELOCITYTHRESHOLD = 100 private val swipeVelocityThreshold = 100
private lateinit var dialog: Dialog private lateinit var dialog: Dialog
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@@ -34,6 +34,7 @@ class SignInFragment : DialogFragment() {
MainActivity.setListener(requireContext()) MainActivity.setListener(requireContext())
view.setOnTouchListener { _, event -> view.setOnTouchListener { _, event ->
view.performClick()
handleTouchEvent(event) handleTouchEvent(event)
} }
@@ -69,7 +70,7 @@ class SignInFragment : DialogFragment() {
velocityY: Float velocityY: Float
): Boolean { ): Boolean {
val diffY = e1?.let { e2.y.minus(it.y) } ?: 0f val diffY = e1?.let { e2.y.minus(it.y) } ?: 0f
if (diffY > SWIPETHRESHOLD && abs(velocityY) > SWIPEVELOCITYTHRESHOLD) { if (diffY > swipeThreshold && abs(velocityY) > swipeVelocityThreshold) {
// Swiped down // Swiped down
dismiss() dismiss()
return true return true
@@ -78,6 +79,7 @@ class SignInFragment : DialogFragment() {
} }
} }
@Suppress("SameReturnValue")
private fun handleTouchEvent(event: MotionEvent): Boolean { private fun handleTouchEvent(event: MotionEvent): Boolean {
when (event.action) { when (event.action) {
MotionEvent.ACTION_DOWN -> { MotionEvent.ACTION_DOWN -> {
@@ -85,9 +87,9 @@ class SignInFragment : DialogFragment() {
} }
MotionEvent.ACTION_MOVE -> { MotionEvent.ACTION_MOVE -> {
val deltaY = event.rawY - initialTouchY val deltaY = event.rawY - initialTouchY
dialog?.window?.attributes?.y = deltaY.toInt() dialog.window?.attributes?.y = deltaY.toInt()
dialog?.window?.attributes?.windowAnimations = 0 dialog.window?.attributes?.windowAnimations = 0
dialog?.show() dialog.show()
// Check if the dialog has been dragged beyond a threshold and dismiss if necessary // Check if the dialog has been dragged beyond a threshold and dismiss if necessary
if (deltaY > 200) { if (deltaY > 200) {
@@ -1,11 +1,24 @@
package com.odweta.solon package com.odweta.solon
import android.animation.Animator
import android.animation.AnimatorInflater
import android.animation.AnimatorListenerAdapter
import android.animation.ArgbEvaluator
import android.animation.ValueAnimator
import android.content.Context import android.content.Context
import android.content.res.ColorStateList
import android.content.res.Resources import android.content.res.Resources
import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.net.NetworkCapabilities import android.net.NetworkCapabilities
import android.os.Handler
import android.util.DisplayMetrics import android.util.DisplayMetrics
import android.view.WindowManager import android.view.WindowManager
import android.view.animation.AnimationUtils
import android.widget.Button
import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.nio.charset.Charset import java.nio.charset.Charset
@@ -114,8 +127,81 @@ class Util {
return (pixels * resources.displayMetrics.density).toInt() return (pixels * resources.displayMetrics.density).toInt()
} }
fun dpToPixels(dp: Int, resources: Resources): Int { /*fun dpToPixels(dp: Int, resources: Resources): Int {
return (dp / resources.displayMetrics.density).toInt() return (dp / resources.displayMetrics.density).toInt()
}*/
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
}
fun getAvgBgColor(ctx: Context, 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(
ctx,
color
)
}
fun getAvgStrokeColor(ctx: Context, 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(
ctx,
color
)
}
fun getAvgDrawable(ctx: Context, avg: String): Drawable {
val d = GradientDrawable()
d.setColor(getAvgBgColor(ctx, avg))
d.setStroke(10, getAvgStrokeColor(ctx, avg))
d.cornerRadius = 8f
return d
} }
} }
} }
@@ -17,6 +17,8 @@ class Vars {
var timeTableAvailOffline: Boolean = false var timeTableAvailOffline: Boolean = false
var marksAvailOffline: Boolean = false var marksAvailOffline: Boolean = false
val subjectNameMap = mutableMapOf<String, String>()
val dayMap = mutableMapOf<Int, Day>() val dayMap = mutableMapOf<Int, Day>()
var days = listOf<Day>() var days = listOf<Day>()
-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- fade_in.xml -->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="200" />
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- fade_in.xml -->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="200" />
@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="100%p"
android:toXDelta="0"
android:duration="250" />
</set>
@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="-100%p"
android:duration="250" />
</set>
@@ -1,11 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<path
android:fillColor="@android:color/white"
android:pathData="M17.77,3.77l-1.77,-1.77l-10,10l10,10l1.77,-1.77l-8.23,-8.23z"/>
</vector>
@@ -1,11 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#FFFFFF"
android:alpha="0.8">
<path
android:fillColor="@android:color/white"
android:pathData="M17.77,3.77l-1.77,-1.77l-10,10l10,10l1.77,-1.77l-8.23,-8.23z"/>
</vector>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 312 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 479 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 447 B

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/button_clicked_background" android:state_pressed="true" />
<item android:drawable="@drawable/button_background" />
</selector>
@@ -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="#90FFCC33" />
<stroke android:width="5dp" android:color="@color/pastel_yellow" />
</shape>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size android:width="2dp" /> <!-- Adjust width as needed -->
<solid android:color="@color/white" /> <!-- Set desired color -->
</shape>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/pastel_yellow_transparent" />
<corners android:radius="@dimen/corner_radius" />
</shape>
@@ -1,5 +0,0 @@
<!-- res/drawable/rounded_corner_background.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="20dp" /> <!-- Adjust the radius as needed -->
<solid android:color="#696969" /> <!-- Set the background color -->
</shape>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 292 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

@@ -9,21 +9,25 @@
android:id="@+id/appBarLayout" android:id="@+id/appBarLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/black"> android:layout_marginTop="0dp"
android:background="@color/black"
app:layout_constraintBottom_toTopOf="@+id/imageView2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView <TextView
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:fontFamily="@font/roboto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp" android:layout_marginHorizontal="20dp"
android:layout_marginTop="20dp"
android:text="@string/about_app"
android:background="@drawable/toolbar_background" android:background="@drawable/toolbar_background"
android:fontFamily="@font/roboto"
android:gravity="center" android:gravity="center"
android:padding="10dp" android:padding="10dp"
android:text="@string/about_app"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="25dp" /> android:textSize="25sp" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
@@ -31,6 +35,7 @@
android:id="@+id/imageView2" android:id="@+id/imageView2"
android:layout_width="300dp" android:layout_width="300dp"
android:layout_height="300dp" android:layout_height="300dp"
android:contentDescription="@string/solon_logo"
app:layout_constraintBottom_toTopOf="@+id/podstata" app:layout_constraintBottom_toTopOf="@+id/podstata"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@@ -44,7 +49,7 @@
android:layout_marginTop="6dp" android:layout_marginTop="6dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:fontFamily="monospace" android:fontFamily="monospace"
android:text="Přehlednost je podstata." android:text="@string/slogan"
android:textAllCaps="false" android:textAllCaps="false"
android:textColor="#FFFFFF" android:textColor="#FFFFFF"
android:textSize="20sp" android:textSize="20sp"
@@ -60,7 +65,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:layout_marginBottom="250dp" android:layout_marginBottom="250dp"
android:text="Vylepšená verze mobilní aplikace ŠkolaOnLine" android:text="@string/desc_about"
android:textAlignment="center" android:textAlignment="center"
android:textColor="#FFFFFF" android:textColor="#FFFFFF"
android:textSize="24sp" android:textSize="24sp"
@@ -69,7 +74,8 @@
app:layout_constraintHorizontal_bias="0.416" app:layout_constraintHorizontal_bias="0.416"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView2" app:layout_constraintTop_toBottomOf="@+id/imageView2"
app:layout_constraintVertical_bias="1.0" /> app:layout_constraintVertical_bias="1.0"
tools:ignore="TextSizeCheck" />
<TextView <TextView
android:id="@+id/link" android:id="@+id/link"
@@ -78,7 +84,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="1dp" android:layout_marginStart="1dp"
android:layout_marginEnd="139dp" android:layout_marginEnd="139dp"
android:text=" Odweta" android:text="@string/odweta"
android:textColor="#FFFFFF" android:textColor="#FFFFFF"
android:textFontWeight="400" android:textFontWeight="400"
android:textSize="20sp" android:textSize="20sp"
@@ -95,7 +101,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="144dp" android:layout_marginStart="144dp"
android:layout_marginEnd="1dp" android:layout_marginEnd="1dp"
android:text="voj:" android:text="@string/development_vyvoj"
android:textColor="#FFFFFF" android:textColor="#FFFFFF"
android:textSize="20sp" android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
@@ -109,11 +115,11 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="61dp" android:layout_marginBottom="61dp"
android:contentDescription="@string/gitlab_logo"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.303" app:layout_constraintHorizontal_bias="0.303"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintVertical_bias="0.54"
app:srcCompat="@mipmap/gitlab_logo_foreground" /> app:srcCompat="@mipmap/gitlab_logo_foreground" />
<TextView <TextView
@@ -123,7 +129,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="96dp" android:layout_marginEnd="96dp"
android:layout_marginBottom="100dp" android:layout_marginBottom="100dp"
android:text="Zdrojový kód" android:text="@string/source_code"
android:textColor="#FFFFFF" android:textColor="#FFFFFF"
android:textSize="20sp" android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
@@ -1,8 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <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" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/cal_week_root"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".MainActivity" tools:context=".MainActivity"
@@ -2,6 +2,4 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:id="@+id/app_root"> android:id="@+id/app_root" />
</FrameLayout>
@@ -2,29 +2,31 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_roott"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".MainActivity"> tools:context=".MainActivity">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:id="@+id/toolbarFrame"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/toolbarFrame" android:background="@color/black"
android:background="@color/black"> app:layout_constraintBottom_toTopOf="@+id/fragmentContainer"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView <TextView
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp" android:layout_margin="20dp"
android:layout_marginTop="20dp"
android:background="@drawable/toolbar_background" android:background="@drawable/toolbar_background"
android:gravity="center"
android:fontFamily="@font/roboto" android:fontFamily="@font/roboto"
android:padding="10dp" android:gravity="center"
android:padding="15dp"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="25dp" /> android:textSize="25sp" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<FrameLayout <FrameLayout
@@ -44,10 +46,10 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/toolbar_background" android:background="@drawable/toolbar_background"
android:layout_marginHorizontal="20dp" android:layout_margin="20dp"
android:layout_marginVertical="20dp"
android:fontFamily="@font/roboto" android:fontFamily="@font/roboto"
app:itemTextColor="@color/white" app:itemTextColor="@color/white"
android:padding="5dp"
app:layout_constraintTop_toBottomOf="@+id/fragmentContainer" app:layout_constraintTop_toBottomOf="@+id/fragmentContainer"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
@@ -0,0 +1,19 @@
<?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">
<LinearLayout
android:id="@+id/one_mark_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:layout_marginTop="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -1,13 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:background="@color/black">
<ScrollView <ScrollView
android:id="@+id/scroll"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
@@ -18,7 +15,7 @@
<LinearLayout <LinearLayout
android:id="@+id/root" android:id="@+id/root"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_marginStart="1dp" android:layout_marginStart="1dp"
android:layout_marginTop="1dp" android:layout_marginTop="1dp"
android:layout_marginEnd="1dp" android:layout_marginEnd="1dp"
@@ -0,0 +1,17 @@
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/mark_details_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_marginTop="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -1,11 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/menu_layout_root"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:background="@color/black">
<Button <Button
android:id="@+id/menu_button_settings" android:id="@+id/menu_button_settings"
@@ -13,44 +10,46 @@
android:layout_height="80dp" android:layout_height="80dp"
android:layout_marginTop="200dp" android:layout_marginTop="200dp"
android:layout_marginBottom="50dp" android:layout_marginBottom="50dp"
android:background="@drawable/button_background_selector"
android:text="@string/settings" android:text="@string/settings"
android:textSize="20sp" android:textSize="22sp"
app:layout_constraintBottom_toTopOf="@+id/menu_button_sign_out" app:layout_constraintBottom_toTopOf="@+id/menu_button_sign_out"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497" app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent" />
android:background="@drawable/button_background"/>
<Button <Button
android:id="@+id/menu_button_sign_out" android:id="@+id/menu_button_sign_out"
android:layout_width="190dp" android:layout_width="190dp"
android:layout_height="80dp" android:layout_height="80dp"
android:layout_marginBottom="50dp" android:layout_marginBottom="50dp"
android:background="@drawable/button_background_selector"
android:text="@string/sign_out" android:text="@string/sign_out"
android:textSize="20sp" android:textSize="22sp"
app:cornerRadius="@dimen/corner_radius" app:cornerRadius="@dimen/corner_radius"
app:layout_constraintBottom_toTopOf="@+id/menu_button_sign_in" app:layout_constraintBottom_toTopOf="@+id/menu_button_sign_in"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498" app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent" 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 <Button
android:id="@+id/menu_button_sign_in" android:id="@+id/menu_button_sign_in"
android:layout_width="190dp" android:layout_width="190dp"
android:layout_height="80dp" android:layout_height="80dp"
android:layout_marginBottom="50dp" android:layout_marginBottom="50dp"
android:background="@drawable/button_background_selector"
android:ellipsize="none"
android:scrollHorizontally="false"
android:text="@string/sign_in" android:text="@string/sign_in"
android:textSize="20sp" android:textSize="22sp"
app:cornerRadius="@dimen/corner_radius" app:cornerRadius="@dimen/corner_radius"
app:layout_constraintBottom_toTopOf="@+id/menu_button_about" app:layout_constraintBottom_toTopOf="@+id/menu_button_about"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497" app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent" 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 <Button
android:id="@+id/menu_button_about" android:id="@+id/menu_button_about"
@@ -59,13 +58,13 @@
android:layout_marginStart="158dp" android:layout_marginStart="158dp"
android:layout_marginEnd="159dp" android:layout_marginEnd="159dp"
android:layout_marginBottom="200dp" android:layout_marginBottom="200dp"
android:background="@drawable/button_background_selector"
android:text="@string/about_app" android:text="@string/about_app"
android:textSize="20sp" android:textSize="22sp"
app:cornerRadius="@dimen/corner_radius" app:cornerRadius="@dimen/corner_radius"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="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> </androidx.constraintlayout.widget.ConstraintLayout>
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <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_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:background="@color/black"
android:id="@+id/no_mark_root">
<LinearLayout <LinearLayout
android:id="@+id/no_mark_container" android:id="@+id/no_mark_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:foregroundGravity="center"
android:gravity="center" android:gravity="center"
android:foregroundGravity="center" /> android:orientation="vertical" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
@@ -1,30 +1,33 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout" android:id="@+id/appBarLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/black"> android:layout_marginTop="0dp"
android:background="@color/black"
app:layout_constraintBottom_toTopOf="@+id/scrollViewSettings"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView <TextView
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:fontFamily="@font/roboto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp" android:layout_marginHorizontal="20dp"
android:layout_marginTop="20dp"
android:text="@string/settings"
android:background="@drawable/toolbar_background" android:background="@drawable/toolbar_background"
android:fontFamily="@font/roboto"
android:gravity="center" android:gravity="center"
android:padding="10dp" android:padding="10dp"
android:text="@string/settings"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="25dp" /> android:textSize="25sp" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
@@ -42,23 +45,21 @@
app:layout_constraintTop_toBottomOf="@+id/appBarLayout"> app:layout_constraintTop_toBottomOf="@+id/appBarLayout">
<LinearLayout <LinearLayout
android:id="@+id/scrollViewLinear"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout <LinearLayout
android:id="@+id/setting_language" android:layout_width="match_parent"
android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="horizontal" android:orientation="horizontal"
android:paddingLeft="20dp" android:paddingLeft="20dp"
android:paddingTop="10dp" android:paddingTop="10dp"
android:paddingRight="20dp" android:paddingRight="20dp"
android:paddingBottom="10dp"> android:paddingBottom="10dp"
tools:ignore="UselessParent">
<TextView <TextView
android:id="@+id/settings_language_text"
android:layout_width="180dp" android:layout_width="180dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
@@ -74,7 +75,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:background="@drawable/button_background" android:background="@drawable/button_background_selector"
android:text="@string/lang_choose" /> android:text="@string/lang_choose" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
@@ -1,78 +1,91 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:fillViewport="true">
<ImageView <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/imageView" android:layout_width="match_parent"
android:layout_width="457dp" android:layout_height="wrap_content">
android:layout_height="307dp"
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/solon_500_yellow" />
<EditText <ImageView
android:id="@+id/usernameField" android:id="@+id/logo"
android:layout_width="240dp" android:layout_width="286dp"
android:layout_height="50dp" android:layout_height="96dp"
android:layout_marginTop="292dp" android:layout_marginTop="120dp"
android:background="@drawable/button_background" android:contentDescription="@string/solon_logo"
android:ems="10" app:layout_constraintBottom_toTopOf="@+id/usernameField"
android:hint="Uživatelské jméno" app:layout_constraintEnd_toEndOf="parent"
android:inputType="text" app:layout_constraintHorizontal_bias="0.496"
android:paddingHorizontal="20dp" app:layout_constraintStart_toStartOf="parent"
android:textColor="@color/white" app:layout_constraintTop_toTopOf="parent"
android:textColorHighlight="@color/white" app:layout_constraintVertical_bias="0.0"
android:textColorHint="#C8FFFFFF" app:srcCompat="@drawable/solon_just_yellow" />
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_constraintVertical_bias="0.85" />
<EditText <LinearLayout
android:id="@+id/passwordField" android:id="@+id/frame"
android:layout_width="240dp" android:layout_width="wrap_content"
android:layout_height="50dp" android:layout_height="wrap_content"
android:layout_marginBottom="224dp" android:layout_marginTop="50dp"
android:background="@drawable/button_background" android:orientation="vertical"
android:ems="10" app:layout_constraintBottom_toTopOf="@+id/signInButton"
android:hint="Heslo" app:layout_constraintEnd_toEndOf="parent"
android:inputType="textPassword" app:layout_constraintStart_toStartOf="parent"
android:paddingHorizontal="20dp" app:layout_constraintTop_toBottomOf="@+id/logo">
android:textColor="@color/white"
android:textColorHighlight="@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" />
<Button <EditText
android:id="@+id/signInButton" android:id="@+id/usernameField"
android:layout_width="240dp" android:layout_width="240dp"
android:layout_height="80dp" android:layout_height="50dp"
android:layout_marginStart="137dp" android:layout_marginBottom="10dp"
android:layout_marginTop="72dp" android:background="@drawable/button_background"
android:layout_marginEnd="137dp" android:ems="10"
android:layout_marginBottom="88dp" android:hint="@string/username"
android:text="Přihlásit se" android:importantForAutofill="no"
android:fontFamily="@font/roboto" android:inputType="text"
android:textSize="20sp" android:paddingHorizontal="20dp"
android:background="@drawable/button_background" android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent" android:textColorHighlight="@color/white"
app:layout_constraintEnd_toEndOf="parent" android:textColorHint="#C8FFFFFF"
app:layout_constraintStart_toStartOf="parent" android:textColorLink="@color/white"
app:layout_constraintTop_toBottomOf="@+id/passwordField" /> android:textCursorDrawable="@drawable/cursor"
android:theme="@style/sign_in_field"
app:circularflow_radiusInDP="20dp" />
</androidx.constraintlayout.widget.ConstraintLayout> <EditText
android:id="@+id/passwordField"
android:layout_width="240dp"
android:layout_height="50dp"
android:background="@drawable/button_background"
android:ems="10"
android:hint="@string/password"
android:importantForAutofill="no"
android:inputType="textPassword"
android:paddingHorizontal="20dp"
android:textColor="@color/white"
android:textColorHighlight="@color/white"
android:textColorHint="#C8FFFFFF"
android:textColorLink="@color/white"
android:textCursorDrawable="@drawable/cursor"
android:theme="@style/sign_in_field" />
</LinearLayout>
<Button
android:id="@+id/signInButton"
android:layout_width="240dp"
android:layout_height="80dp"
android:background="@drawable/button_background_selector"
android:fontFamily="@font/roboto"
android:text="@string/sign_in_"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/frame"
app:layout_constraintVertical_bias="0.056" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
@@ -1,10 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:id="@+id/splash_root">
<ImageView <ImageView
android:id="@+id/imageView3" android:id="@+id/imageView3"
@@ -25,6 +23,7 @@
android:id="@+id/loading_gif" android:id="@+id/loading_gif"
android:layout_width="200dp" android:layout_width="200dp"
android:layout_height="200dp" android:layout_height="200dp"
android:contentDescription="@string/loading_gif"
android:src="@drawable/loading3" android:src="@drawable/loading3"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
@@ -2,11 +2,9 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:gravity="center"> android:gravity="center">
<TextView <TextView
android:id="@+id/heading"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
@@ -11,5 +11,5 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/black" android:background="@color/black"
android:fontFamily="@font/roboto" android:fontFamily="@font/roboto"
android:orientation="vertical"></LinearLayout> android:orientation="vertical" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
@@ -1,18 +1,15 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
xmlns:app="http://schemas.android.com/apk/res-auto">
<RadioGroup <RadioGroup
android:id="@+id/settings_language_choice"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:padding="20dp"> android:padding="20dp">
<RadioButton <RadioButton
android:id="@+id/radio_button_language_cz"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/lang_cz" android:text="@string/lang_cz"
@@ -21,7 +18,6 @@
android:theme="@style/Theme.Solen.RadioButton" /> android:theme="@style/Theme.Solen.RadioButton" />
<RadioButton <RadioButton
android:id="@+id/radio_button_language_en"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/lang_en" android:text="@string/lang_en"
+3 -3
View File
@@ -6,19 +6,19 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:icon="@android:drawable/ic_dialog_dialer" android:icon="@android:drawable/ic_dialog_dialer"
android:title="Rozvrh" /> android:title="@string/timetable" />
<item <item
android:id="@+id/nav_marks" android:id="@+id/nav_marks"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:icon="@mipmap/grade2_foreground" android:icon="@mipmap/grade2_foreground"
android:title="Známky" /> android:title="@string/marks" />
<item <item
android:id="@+id/nav_menu" android:id="@+id/nav_menu"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:icon="@drawable/menu_240" android:icon="@drawable/menu_240"
android:title="Menu" /> android:title="@string/menu" />
</menu> </menu>
<!-- <!--
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/gitlab_logo_background"/>
<foreground android:drawable="@mipmap/gitlab_logo_foreground"/>
</adaptive-icon>
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/gitlab_logo_background"/>
<foreground android:drawable="@mipmap/gitlab_logo_foreground"/>
</adaptive-icon>
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/grade_background"/>
<foreground android:drawable="@mipmap/grade_foreground"/>
</adaptive-icon>
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/grade2_background"/>
<foreground android:drawable="@mipmap/grade2_foreground"/>
</adaptive-icon>
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/grade2_background"/>
<foreground android:drawable="@mipmap/grade2_foreground"/>
</adaptive-icon>
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/grade_background"/>
<foreground android:drawable="@mipmap/grade_foreground"/>
</adaptive-icon>
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/left_arrow_background"/>
<foreground android:drawable="@mipmap/left_arrow_foreground"/>
</adaptive-icon>
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/left_arrow_background"/>
<foreground android:drawable="@mipmap/left_arrow_foreground"/>
</adaptive-icon>
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/menu_background"/>
<foreground android:drawable="@mipmap/menu_foreground"/>
</adaptive-icon>
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/menu_background"/>
<foreground android:drawable="@mipmap/menu_foreground"/>
</adaptive-icon>
@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
tools:ignore="MonochromeLauncherIcon">
<background android:drawable="@color/ic_launcher_background"/> <background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/> <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon> </adaptive-icon>
@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
tools:ignore="MonochromeLauncherIcon">
<background android:drawable="@color/ic_launcher_background"/> <background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/> <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon> </adaptive-icon>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 470 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 B

Some files were not shown because too many files have changed in this diff Show More