forked from firka/firka
chore: dos2unix
This commit is contained in:
2
firka/android/app/proguard-rules.pro
vendored
2
firka/android/app/proguard-rules.pro
vendored
@@ -1,2 +1,2 @@
|
||||
-keep class org.brotli.** { *; }
|
||||
-keep class org.brotli.** { *; }
|
||||
-keep class app.firka.naplo.glance.** { *; }
|
||||
@@ -1,99 +1,99 @@
|
||||
package app.firka.naplo
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Application
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import org.brotli.dec.BrotliInputStream
|
||||
import org.json.JSONObject
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
import java.security.MessageDigest
|
||||
import java.util.zip.ZipFile
|
||||
|
||||
class AppMain : Application() {
|
||||
|
||||
private fun File.sha256(): String {
|
||||
if (!exists()) return "0000000000000000000000000000000000000000000000000000000000000000"
|
||||
|
||||
val md = MessageDigest.getInstance("SHA-256")
|
||||
val digest = md.digest(this.readBytes())
|
||||
return digest.fold("") { str, it -> str + "%02x".format(it) }
|
||||
}
|
||||
|
||||
@SuppressLint("UnsafeDynamicallyLoadedCode")
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
|
||||
var useUncompressedLibs = false
|
||||
|
||||
val abi = Build.SUPPORTED_ABIS[0]
|
||||
|
||||
val apks = File(applicationInfo.nativeLibraryDir, "../..").absoluteFile
|
||||
.listFiles()!!
|
||||
.filter { file -> file.name.endsWith(".apk") }
|
||||
.toList()
|
||||
|
||||
var nativesApkN: ZipFile? = null
|
||||
for (apk in apks) {
|
||||
if (nativesApkN != null) break
|
||||
|
||||
val zip = ZipFile(apk)
|
||||
val entries = zip.entries()
|
||||
|
||||
while (entries.hasMoreElements()) {
|
||||
val entry = entries.nextElement()
|
||||
|
||||
if (entry.name.endsWith("$abi/index.so")) {
|
||||
zip.close()
|
||||
nativesApkN = ZipFile(apk)
|
||||
break
|
||||
}
|
||||
if (entry.name.endsWith("$abi/libflutter.so")) {
|
||||
useUncompressedLibs = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
zip.close()
|
||||
}
|
||||
|
||||
if (useUncompressedLibs) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (nativesApkN == null) {
|
||||
throw Exception("Can't find native libraries")
|
||||
}
|
||||
val nativesApk: ZipFile = nativesApkN
|
||||
|
||||
val compressedLibsIndex = nativesApk.getInputStream(
|
||||
nativesApk.getEntry("lib/$abi/index.so")
|
||||
)
|
||||
val compressedLibs = JSONObject(compressedLibsIndex.readBytes().toString(Charsets.UTF_8))
|
||||
|
||||
for (so in compressedLibs.keys()) {
|
||||
val soFile = File(cacheDir, so)
|
||||
|
||||
if (soFile.sha256() == compressedLibs.getString(so)) {
|
||||
System.load(soFile.absolutePath)
|
||||
return
|
||||
}
|
||||
|
||||
Log.d("AppMain", "Decompressing: $so")
|
||||
val brInput = nativesApk.getInputStream(
|
||||
nativesApk.getEntry("lib/$abi/${so.replace(".so", "-br.so")}")
|
||||
)
|
||||
val soOutput = FileOutputStream(soFile)
|
||||
|
||||
val brIn = BrotliInputStream(brInput)
|
||||
brIn.copyTo(soOutput)
|
||||
|
||||
brInput.close()
|
||||
soOutput.close()
|
||||
|
||||
System.load(soFile.absolutePath)
|
||||
}
|
||||
}
|
||||
|
||||
package app.firka.naplo
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Application
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import org.brotli.dec.BrotliInputStream
|
||||
import org.json.JSONObject
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
import java.security.MessageDigest
|
||||
import java.util.zip.ZipFile
|
||||
|
||||
class AppMain : Application() {
|
||||
|
||||
private fun File.sha256(): String {
|
||||
if (!exists()) return "0000000000000000000000000000000000000000000000000000000000000000"
|
||||
|
||||
val md = MessageDigest.getInstance("SHA-256")
|
||||
val digest = md.digest(this.readBytes())
|
||||
return digest.fold("") { str, it -> str + "%02x".format(it) }
|
||||
}
|
||||
|
||||
@SuppressLint("UnsafeDynamicallyLoadedCode")
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
|
||||
var useUncompressedLibs = false
|
||||
|
||||
val abi = Build.SUPPORTED_ABIS[0]
|
||||
|
||||
val apks = File(applicationInfo.nativeLibraryDir, "../..").absoluteFile
|
||||
.listFiles()!!
|
||||
.filter { file -> file.name.endsWith(".apk") }
|
||||
.toList()
|
||||
|
||||
var nativesApkN: ZipFile? = null
|
||||
for (apk in apks) {
|
||||
if (nativesApkN != null) break
|
||||
|
||||
val zip = ZipFile(apk)
|
||||
val entries = zip.entries()
|
||||
|
||||
while (entries.hasMoreElements()) {
|
||||
val entry = entries.nextElement()
|
||||
|
||||
if (entry.name.endsWith("$abi/index.so")) {
|
||||
zip.close()
|
||||
nativesApkN = ZipFile(apk)
|
||||
break
|
||||
}
|
||||
if (entry.name.endsWith("$abi/libflutter.so")) {
|
||||
useUncompressedLibs = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
zip.close()
|
||||
}
|
||||
|
||||
if (useUncompressedLibs) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (nativesApkN == null) {
|
||||
throw Exception("Can't find native libraries")
|
||||
}
|
||||
val nativesApk: ZipFile = nativesApkN
|
||||
|
||||
val compressedLibsIndex = nativesApk.getInputStream(
|
||||
nativesApk.getEntry("lib/$abi/index.so")
|
||||
)
|
||||
val compressedLibs = JSONObject(compressedLibsIndex.readBytes().toString(Charsets.UTF_8))
|
||||
|
||||
for (so in compressedLibs.keys()) {
|
||||
val soFile = File(cacheDir, so)
|
||||
|
||||
if (soFile.sha256() == compressedLibs.getString(so)) {
|
||||
System.load(soFile.absolutePath)
|
||||
return
|
||||
}
|
||||
|
||||
Log.d("AppMain", "Decompressing: $so")
|
||||
val brInput = nativesApk.getInputStream(
|
||||
nativesApk.getEntry("lib/$abi/${so.replace(".so", "-br.so")}")
|
||||
)
|
||||
val soOutput = FileOutputStream(soFile)
|
||||
|
||||
val brIn = BrotliInputStream(brInput)
|
||||
brIn.copyTo(soOutput)
|
||||
|
||||
brInput.close()
|
||||
soOutput.close()
|
||||
|
||||
System.load(soFile.absolutePath)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,66 +1,66 @@
|
||||
package app.firka.naplo
|
||||
|
||||
import app.firka.naplo.model.NameUid
|
||||
import app.firka.naplo.model.NameUidDesc
|
||||
import app.firka.naplo.model.Subject
|
||||
import org.json.JSONObject
|
||||
|
||||
fun JSONObject.getStringOrNull(key: String): String? {
|
||||
return try {
|
||||
if (has(key)) {
|
||||
getString(key)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
fun JSONObject.getIntOrNull(key: String): Int? {
|
||||
return try {
|
||||
if (has(key)) {
|
||||
getInt(key)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
fun JSONObject.getNameUidDescOrNull(key: String): NameUidDesc? {
|
||||
try {
|
||||
return if (has(key)) {
|
||||
NameUidDesc(getJSONObject(key))
|
||||
} else {
|
||||
null
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
fun JSONObject.getNameUidOrNull(key: String): NameUid? {
|
||||
try {
|
||||
return if (has(key)) {
|
||||
NameUid(getJSONObject(key))
|
||||
} else {
|
||||
null
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
fun JSONObject.getSubjectOrNull(key: String): Subject? {
|
||||
return try {
|
||||
if (has(key)) {
|
||||
Subject(getJSONObject(key))
|
||||
} else {
|
||||
null
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
null
|
||||
}
|
||||
package app.firka.naplo
|
||||
|
||||
import app.firka.naplo.model.NameUid
|
||||
import app.firka.naplo.model.NameUidDesc
|
||||
import app.firka.naplo.model.Subject
|
||||
import org.json.JSONObject
|
||||
|
||||
fun JSONObject.getStringOrNull(key: String): String? {
|
||||
return try {
|
||||
if (has(key)) {
|
||||
getString(key)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
fun JSONObject.getIntOrNull(key: String): Int? {
|
||||
return try {
|
||||
if (has(key)) {
|
||||
getInt(key)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
fun JSONObject.getNameUidDescOrNull(key: String): NameUidDesc? {
|
||||
try {
|
||||
return if (has(key)) {
|
||||
NameUidDesc(getJSONObject(key))
|
||||
} else {
|
||||
null
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
fun JSONObject.getNameUidOrNull(key: String): NameUid? {
|
||||
try {
|
||||
return if (has(key)) {
|
||||
NameUid(getJSONObject(key))
|
||||
} else {
|
||||
null
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
fun JSONObject.getSubjectOrNull(key: String): Subject? {
|
||||
return try {
|
||||
if (has(key)) {
|
||||
Subject(getJSONObject(key))
|
||||
} else {
|
||||
null
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
null
|
||||
}
|
||||
}
|
||||
@@ -1,111 +1,111 @@
|
||||
package app.firka.naplo.glance
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.glance.GlanceModifier
|
||||
import androidx.glance.appwidget.cornerRadius
|
||||
import androidx.glance.background
|
||||
import androidx.glance.color.ColorProvider
|
||||
import androidx.glance.layout.Alignment
|
||||
import androidx.glance.layout.Box
|
||||
import androidx.glance.layout.Row
|
||||
import androidx.glance.layout.Spacer
|
||||
import androidx.glance.layout.fillMaxWidth
|
||||
import androidx.glance.layout.padding
|
||||
import androidx.glance.layout.width
|
||||
import androidx.glance.text.FontWeight
|
||||
import androidx.glance.text.Text
|
||||
import androidx.glance.text.TextStyle
|
||||
import app.firka.naplo.model.Colors
|
||||
import app.firka.naplo.model.Lesson
|
||||
import java.time.format.DateTimeFormatterBuilder
|
||||
|
||||
val hhmm = DateTimeFormatterBuilder()
|
||||
.appendPattern("HH:mm")
|
||||
.toFormatter()
|
||||
|
||||
@Composable
|
||||
fun LessonCard(lesson: Lesson, colors: Colors,
|
||||
modifier: GlanceModifier = GlanceModifier) {
|
||||
Box(modifier =
|
||||
modifier
|
||||
.fillMaxWidth()
|
||||
.padding(4.dp, 0.dp)
|
||||
.cornerRadius(16.dp)
|
||||
.background(colors.card)
|
||||
) {
|
||||
var bgColor = colors.a15p
|
||||
var fgColor = colors.textSecondary
|
||||
|
||||
if (lesson.substituteTeacher == null) {
|
||||
bgColor = colors.warning15p
|
||||
fgColor = colors.warningText
|
||||
}
|
||||
|
||||
|
||||
Box(modifier = GlanceModifier.padding(12.dp)) {
|
||||
Row {
|
||||
Row(modifier = GlanceModifier.width(226.dp), verticalAlignment = Alignment.CenterVertically) {
|
||||
if (lesson.lessonNumber != null) {
|
||||
Box(modifier = GlanceModifier.cornerRadius(16.dp).background(bgColor)) {
|
||||
Text(
|
||||
lesson.lessonNumber.toString(),
|
||||
style = TextStyle(
|
||||
color = ColorProvider(fgColor, fgColor),
|
||||
fontSize = 14.sp,
|
||||
fontWeight = FontWeight.Bold
|
||||
),
|
||||
modifier = GlanceModifier.padding(8.dp, 4.dp),
|
||||
)
|
||||
}
|
||||
Spacer(modifier = GlanceModifier.width(4.dp))
|
||||
}
|
||||
// TODO: Add subject icons
|
||||
Text(
|
||||
lesson.name,
|
||||
style = TextStyle(
|
||||
color = ColorProvider(colors.textPrimary, colors.textPrimary),
|
||||
fontSize = 14.sp,
|
||||
fontWeight = FontWeight.Bold
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
// Spacer(modifier = GlanceModifier.width(10.dp))
|
||||
|
||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||
Text(
|
||||
lesson.start.format(hhmm),
|
||||
style = TextStyle(
|
||||
color = ColorProvider(colors.textPrimary, colors.textPrimary),
|
||||
fontSize = 14.sp,
|
||||
fontWeight = FontWeight.Bold
|
||||
),
|
||||
)
|
||||
Spacer(modifier = GlanceModifier.width(8.dp))
|
||||
Box(modifier = GlanceModifier.cornerRadius(16.dp).background(colors.a15p)) {
|
||||
var roomName = "N/A";
|
||||
if (lesson.roomName != null) {
|
||||
roomName = lesson.roomName!!;
|
||||
}
|
||||
|
||||
if (roomName.length < 2) {
|
||||
roomName = " $roomName"
|
||||
}
|
||||
|
||||
Text(
|
||||
roomName,
|
||||
style = TextStyle(
|
||||
color = ColorProvider(colors.textSecondary, colors.textSecondary),
|
||||
fontSize = 14.sp,
|
||||
fontWeight = FontWeight.Bold
|
||||
),
|
||||
modifier = GlanceModifier.padding(8.dp, 4.dp),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
package app.firka.naplo.glance
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.glance.GlanceModifier
|
||||
import androidx.glance.appwidget.cornerRadius
|
||||
import androidx.glance.background
|
||||
import androidx.glance.color.ColorProvider
|
||||
import androidx.glance.layout.Alignment
|
||||
import androidx.glance.layout.Box
|
||||
import androidx.glance.layout.Row
|
||||
import androidx.glance.layout.Spacer
|
||||
import androidx.glance.layout.fillMaxWidth
|
||||
import androidx.glance.layout.padding
|
||||
import androidx.glance.layout.width
|
||||
import androidx.glance.text.FontWeight
|
||||
import androidx.glance.text.Text
|
||||
import androidx.glance.text.TextStyle
|
||||
import app.firka.naplo.model.Colors
|
||||
import app.firka.naplo.model.Lesson
|
||||
import java.time.format.DateTimeFormatterBuilder
|
||||
|
||||
val hhmm = DateTimeFormatterBuilder()
|
||||
.appendPattern("HH:mm")
|
||||
.toFormatter()
|
||||
|
||||
@Composable
|
||||
fun LessonCard(lesson: Lesson, colors: Colors,
|
||||
modifier: GlanceModifier = GlanceModifier) {
|
||||
Box(modifier =
|
||||
modifier
|
||||
.fillMaxWidth()
|
||||
.padding(4.dp, 0.dp)
|
||||
.cornerRadius(16.dp)
|
||||
.background(colors.card)
|
||||
) {
|
||||
var bgColor = colors.a15p
|
||||
var fgColor = colors.textSecondary
|
||||
|
||||
if (lesson.substituteTeacher == null) {
|
||||
bgColor = colors.warning15p
|
||||
fgColor = colors.warningText
|
||||
}
|
||||
|
||||
|
||||
Box(modifier = GlanceModifier.padding(12.dp)) {
|
||||
Row {
|
||||
Row(modifier = GlanceModifier.width(226.dp), verticalAlignment = Alignment.CenterVertically) {
|
||||
if (lesson.lessonNumber != null) {
|
||||
Box(modifier = GlanceModifier.cornerRadius(16.dp).background(bgColor)) {
|
||||
Text(
|
||||
lesson.lessonNumber.toString(),
|
||||
style = TextStyle(
|
||||
color = ColorProvider(fgColor, fgColor),
|
||||
fontSize = 14.sp,
|
||||
fontWeight = FontWeight.Bold
|
||||
),
|
||||
modifier = GlanceModifier.padding(8.dp, 4.dp),
|
||||
)
|
||||
}
|
||||
Spacer(modifier = GlanceModifier.width(4.dp))
|
||||
}
|
||||
// TODO: Add subject icons
|
||||
Text(
|
||||
lesson.name,
|
||||
style = TextStyle(
|
||||
color = ColorProvider(colors.textPrimary, colors.textPrimary),
|
||||
fontSize = 14.sp,
|
||||
fontWeight = FontWeight.Bold
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
// Spacer(modifier = GlanceModifier.width(10.dp))
|
||||
|
||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||
Text(
|
||||
lesson.start.format(hhmm),
|
||||
style = TextStyle(
|
||||
color = ColorProvider(colors.textPrimary, colors.textPrimary),
|
||||
fontSize = 14.sp,
|
||||
fontWeight = FontWeight.Bold
|
||||
),
|
||||
)
|
||||
Spacer(modifier = GlanceModifier.width(8.dp))
|
||||
Box(modifier = GlanceModifier.cornerRadius(16.dp).background(colors.a15p)) {
|
||||
var roomName = "N/A";
|
||||
if (lesson.roomName != null) {
|
||||
roomName = lesson.roomName!!;
|
||||
}
|
||||
|
||||
if (roomName.length < 2) {
|
||||
roomName = " $roomName"
|
||||
}
|
||||
|
||||
Text(
|
||||
roomName,
|
||||
style = TextStyle(
|
||||
color = ColorProvider(colors.textSecondary, colors.textSecondary),
|
||||
fontSize = 14.sp,
|
||||
fontWeight = FontWeight.Bold
|
||||
),
|
||||
modifier = GlanceModifier.padding(8.dp, 4.dp),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,111 +1,111 @@
|
||||
package app.firka.naplo.glance
|
||||
|
||||
import HomeWidgetGlanceState
|
||||
import HomeWidgetGlanceStateDefinition
|
||||
import android.content.Context
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.glance.GlanceId
|
||||
import androidx.glance.GlanceModifier
|
||||
import androidx.glance.appwidget.GlanceAppWidget
|
||||
import androidx.glance.appwidget.provideContent
|
||||
import androidx.glance.background
|
||||
import androidx.glance.color.ColorProvider
|
||||
import androidx.glance.currentState
|
||||
import androidx.glance.layout.Alignment
|
||||
import androidx.glance.layout.Box
|
||||
import androidx.glance.layout.Column
|
||||
import androidx.glance.layout.Spacer
|
||||
import androidx.glance.layout.fillMaxSize
|
||||
import androidx.glance.layout.height
|
||||
import androidx.glance.layout.padding
|
||||
import androidx.glance.state.GlanceStateDefinition
|
||||
import androidx.glance.text.FontWeight
|
||||
import androidx.glance.text.Text
|
||||
import androidx.glance.text.TextStyle
|
||||
import app.firka.naplo.model.Colors
|
||||
import app.firka.naplo.model.Lesson
|
||||
import org.json.JSONObject
|
||||
import java.io.File
|
||||
import java.time.LocalDate
|
||||
import java.time.LocalDateTime
|
||||
|
||||
class TimetableWidget : GlanceAppWidget() {
|
||||
|
||||
override val stateDefinition: GlanceStateDefinition<*>?
|
||||
get() = HomeWidgetGlanceStateDefinition()
|
||||
|
||||
override suspend fun provideGlance(context: Context, id: GlanceId) {
|
||||
provideContent {
|
||||
GlanceContent(context, currentState())
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun GlanceContent(context: Context, currentState: HomeWidgetGlanceState) {
|
||||
val appFlutter = File(context.applicationContext.dataDir, "app_flutter")
|
||||
val widgetStateFile = File(appFlutter, "widget_state.json")
|
||||
|
||||
if (!widgetStateFile.exists()) {
|
||||
Box(modifier =
|
||||
GlanceModifier
|
||||
.background(Color(0xFFFAFFF0))
|
||||
.padding(16.dp)
|
||||
.fillMaxSize(),
|
||||
contentAlignment = Alignment.Center,
|
||||
) {
|
||||
Text(
|
||||
"Widget használata előtt jelentkezz be",
|
||||
style = TextStyle(
|
||||
color = ColorProvider(Color(0xFF394C0A), Color(0xFF394C0A)),
|
||||
fontSize = 12.sp,
|
||||
fontWeight = FontWeight.Medium
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
val widgetState = JSONObject(widgetStateFile.readText(Charsets.UTF_8))
|
||||
val colors = Colors(widgetState)
|
||||
|
||||
val tt = widgetState.getJSONArray("timetable")
|
||||
var lessons = mutableListOf<Lesson>()
|
||||
|
||||
for (i in 0..<tt.length()) {
|
||||
lessons.add(Lesson(tt.getJSONObject(i)))
|
||||
}
|
||||
|
||||
val now = LocalDate.now()
|
||||
val start = LocalDateTime.of(now.year, now.month, now.dayOfMonth, 0, 0)
|
||||
val end = start.plusHours(23)
|
||||
lessons = lessons.filter { lesson -> lesson.start.isAfter(start) && lesson.end.isBefore(end) }.toMutableList()
|
||||
|
||||
Box(modifier =
|
||||
GlanceModifier
|
||||
.background(colors.background)
|
||||
.padding(16.dp)
|
||||
.fillMaxSize()
|
||||
) {
|
||||
Column {
|
||||
Text(
|
||||
"Mai órarend",
|
||||
style = TextStyle(
|
||||
color = ColorProvider(colors.textSecondary, colors.textSecondary),
|
||||
fontSize = 12.sp,
|
||||
fontWeight = FontWeight.Medium
|
||||
)
|
||||
)
|
||||
Spacer(modifier = GlanceModifier.height(4.dp))
|
||||
for (lesson in lessons) {
|
||||
LessonCard(lesson, colors)
|
||||
Spacer(modifier = GlanceModifier.height(4.dp))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
package app.firka.naplo.glance
|
||||
|
||||
import HomeWidgetGlanceState
|
||||
import HomeWidgetGlanceStateDefinition
|
||||
import android.content.Context
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.glance.GlanceId
|
||||
import androidx.glance.GlanceModifier
|
||||
import androidx.glance.appwidget.GlanceAppWidget
|
||||
import androidx.glance.appwidget.provideContent
|
||||
import androidx.glance.background
|
||||
import androidx.glance.color.ColorProvider
|
||||
import androidx.glance.currentState
|
||||
import androidx.glance.layout.Alignment
|
||||
import androidx.glance.layout.Box
|
||||
import androidx.glance.layout.Column
|
||||
import androidx.glance.layout.Spacer
|
||||
import androidx.glance.layout.fillMaxSize
|
||||
import androidx.glance.layout.height
|
||||
import androidx.glance.layout.padding
|
||||
import androidx.glance.state.GlanceStateDefinition
|
||||
import androidx.glance.text.FontWeight
|
||||
import androidx.glance.text.Text
|
||||
import androidx.glance.text.TextStyle
|
||||
import app.firka.naplo.model.Colors
|
||||
import app.firka.naplo.model.Lesson
|
||||
import org.json.JSONObject
|
||||
import java.io.File
|
||||
import java.time.LocalDate
|
||||
import java.time.LocalDateTime
|
||||
|
||||
class TimetableWidget : GlanceAppWidget() {
|
||||
|
||||
override val stateDefinition: GlanceStateDefinition<*>?
|
||||
get() = HomeWidgetGlanceStateDefinition()
|
||||
|
||||
override suspend fun provideGlance(context: Context, id: GlanceId) {
|
||||
provideContent {
|
||||
GlanceContent(context, currentState())
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun GlanceContent(context: Context, currentState: HomeWidgetGlanceState) {
|
||||
val appFlutter = File(context.applicationContext.dataDir, "app_flutter")
|
||||
val widgetStateFile = File(appFlutter, "widget_state.json")
|
||||
|
||||
if (!widgetStateFile.exists()) {
|
||||
Box(modifier =
|
||||
GlanceModifier
|
||||
.background(Color(0xFFFAFFF0))
|
||||
.padding(16.dp)
|
||||
.fillMaxSize(),
|
||||
contentAlignment = Alignment.Center,
|
||||
) {
|
||||
Text(
|
||||
"Widget használata előtt jelentkezz be",
|
||||
style = TextStyle(
|
||||
color = ColorProvider(Color(0xFF394C0A), Color(0xFF394C0A)),
|
||||
fontSize = 12.sp,
|
||||
fontWeight = FontWeight.Medium
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
val widgetState = JSONObject(widgetStateFile.readText(Charsets.UTF_8))
|
||||
val colors = Colors(widgetState)
|
||||
|
||||
val tt = widgetState.getJSONArray("timetable")
|
||||
var lessons = mutableListOf<Lesson>()
|
||||
|
||||
for (i in 0..<tt.length()) {
|
||||
lessons.add(Lesson(tt.getJSONObject(i)))
|
||||
}
|
||||
|
||||
val now = LocalDate.now()
|
||||
val start = LocalDateTime.of(now.year, now.month, now.dayOfMonth, 0, 0)
|
||||
val end = start.plusHours(23)
|
||||
lessons = lessons.filter { lesson -> lesson.start.isAfter(start) && lesson.end.isBefore(end) }.toMutableList()
|
||||
|
||||
Box(modifier =
|
||||
GlanceModifier
|
||||
.background(colors.background)
|
||||
.padding(16.dp)
|
||||
.fillMaxSize()
|
||||
) {
|
||||
Column {
|
||||
Text(
|
||||
"Mai órarend",
|
||||
style = TextStyle(
|
||||
color = ColorProvider(colors.textSecondary, colors.textSecondary),
|
||||
fontSize = 12.sp,
|
||||
fontWeight = FontWeight.Medium
|
||||
)
|
||||
)
|
||||
Spacer(modifier = GlanceModifier.height(4.dp))
|
||||
for (lesson in lessons) {
|
||||
LessonCard(lesson, colors)
|
||||
Spacer(modifier = GlanceModifier.height(4.dp))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package app.firka.naplo.glance
|
||||
|
||||
import HomeWidgetGlanceWidgetReceiver
|
||||
|
||||
class TimetableWidgetReceiver : HomeWidgetGlanceWidgetReceiver<TimetableWidget>() {
|
||||
override val glanceAppWidget = TimetableWidget()
|
||||
package app.firka.naplo.glance
|
||||
|
||||
import HomeWidgetGlanceWidgetReceiver
|
||||
|
||||
class TimetableWidgetReceiver : HomeWidgetGlanceWidgetReceiver<TimetableWidget>() {
|
||||
override val glanceAppWidget = TimetableWidget()
|
||||
}
|
||||
@@ -1,37 +1,37 @@
|
||||
package app.firka.naplo.model
|
||||
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import org.json.JSONObject
|
||||
|
||||
class Colors(widgetState: JSONObject) {
|
||||
var background: Color = Color(widgetState.getJSONObject("colors").getInt("background"))
|
||||
var backgroundAmoled: Color =
|
||||
Color(widgetState.getJSONObject("colors").getInt("backgroundAmoled"))
|
||||
var background0p: Color = Color(widgetState.getJSONObject("colors").getInt("background0p"))
|
||||
var success: Color = Color(widgetState.getJSONObject("colors").getInt("success"))
|
||||
var textPrimary: Color = Color(widgetState.getJSONObject("colors").getInt("textPrimary"))
|
||||
var textSecondary: Color = Color(widgetState.getJSONObject("colors").getInt("textSecondary"))
|
||||
var textTertiary: Color = Color(widgetState.getJSONObject("colors").getInt("textTertiary"))
|
||||
var card: Color = Color(widgetState.getJSONObject("colors").getInt("card"))
|
||||
var cardTranslucent: Color =
|
||||
Color(widgetState.getJSONObject("colors").getInt("cardTranslucent"))
|
||||
var buttonSecondaryFill: Color =
|
||||
Color(widgetState.getJSONObject("colors").getInt("buttonSecondaryFill"))
|
||||
var accent: Color = Color(widgetState.getJSONObject("colors").getInt("accent"))
|
||||
var secondary: Color = Color(widgetState.getJSONObject("colors").getInt("secondary"))
|
||||
var shadowColor: Color = Color(widgetState.getJSONObject("colors").getInt("shadowColor"))
|
||||
var a15p: Color = Color(widgetState.getJSONObject("colors").getInt("a15p"))
|
||||
var warningAccent: Color = Color(widgetState.getJSONObject("colors").getInt("warningAccent"))
|
||||
var warningText: Color = Color(widgetState.getJSONObject("colors").getInt("warningText"))
|
||||
var warning15p: Color = Color(widgetState.getJSONObject("colors").getInt("warning15p"))
|
||||
var warningCard: Color = Color(widgetState.getJSONObject("colors").getInt("warningCard"))
|
||||
var errorAccent: Color = Color(widgetState.getJSONObject("colors").getInt("errorAccent"))
|
||||
var errorText: Color = Color(widgetState.getJSONObject("colors").getInt("errorText"))
|
||||
var error15p: Color = Color(widgetState.getJSONObject("colors").getInt("error15p"))
|
||||
var errorCard: Color = Color(widgetState.getJSONObject("colors").getInt("errorCard"))
|
||||
var grade5: Color = Color(widgetState.getJSONObject("colors").getInt("grade5"))
|
||||
var grade4: Color = Color(widgetState.getJSONObject("colors").getInt("grade4"))
|
||||
var grade3: Color = Color(widgetState.getJSONObject("colors").getInt("grade3"))
|
||||
var grade2: Color = Color(widgetState.getJSONObject("colors").getInt("grade2"))
|
||||
var grade1: Color = Color(widgetState.getJSONObject("colors").getInt("grade1"))
|
||||
package app.firka.naplo.model
|
||||
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import org.json.JSONObject
|
||||
|
||||
class Colors(widgetState: JSONObject) {
|
||||
var background: Color = Color(widgetState.getJSONObject("colors").getInt("background"))
|
||||
var backgroundAmoled: Color =
|
||||
Color(widgetState.getJSONObject("colors").getInt("backgroundAmoled"))
|
||||
var background0p: Color = Color(widgetState.getJSONObject("colors").getInt("background0p"))
|
||||
var success: Color = Color(widgetState.getJSONObject("colors").getInt("success"))
|
||||
var textPrimary: Color = Color(widgetState.getJSONObject("colors").getInt("textPrimary"))
|
||||
var textSecondary: Color = Color(widgetState.getJSONObject("colors").getInt("textSecondary"))
|
||||
var textTertiary: Color = Color(widgetState.getJSONObject("colors").getInt("textTertiary"))
|
||||
var card: Color = Color(widgetState.getJSONObject("colors").getInt("card"))
|
||||
var cardTranslucent: Color =
|
||||
Color(widgetState.getJSONObject("colors").getInt("cardTranslucent"))
|
||||
var buttonSecondaryFill: Color =
|
||||
Color(widgetState.getJSONObject("colors").getInt("buttonSecondaryFill"))
|
||||
var accent: Color = Color(widgetState.getJSONObject("colors").getInt("accent"))
|
||||
var secondary: Color = Color(widgetState.getJSONObject("colors").getInt("secondary"))
|
||||
var shadowColor: Color = Color(widgetState.getJSONObject("colors").getInt("shadowColor"))
|
||||
var a15p: Color = Color(widgetState.getJSONObject("colors").getInt("a15p"))
|
||||
var warningAccent: Color = Color(widgetState.getJSONObject("colors").getInt("warningAccent"))
|
||||
var warningText: Color = Color(widgetState.getJSONObject("colors").getInt("warningText"))
|
||||
var warning15p: Color = Color(widgetState.getJSONObject("colors").getInt("warning15p"))
|
||||
var warningCard: Color = Color(widgetState.getJSONObject("colors").getInt("warningCard"))
|
||||
var errorAccent: Color = Color(widgetState.getJSONObject("colors").getInt("errorAccent"))
|
||||
var errorText: Color = Color(widgetState.getJSONObject("colors").getInt("errorText"))
|
||||
var error15p: Color = Color(widgetState.getJSONObject("colors").getInt("error15p"))
|
||||
var errorCard: Color = Color(widgetState.getJSONObject("colors").getInt("errorCard"))
|
||||
var grade5: Color = Color(widgetState.getJSONObject("colors").getInt("grade5"))
|
||||
var grade4: Color = Color(widgetState.getJSONObject("colors").getInt("grade4"))
|
||||
var grade3: Color = Color(widgetState.getJSONObject("colors").getInt("grade3"))
|
||||
var grade2: Color = Color(widgetState.getJSONObject("colors").getInt("grade2"))
|
||||
var grade1: Color = Color(widgetState.getJSONObject("colors").getInt("grade1"))
|
||||
}
|
||||
@@ -1,94 +1,94 @@
|
||||
package app.firka.naplo.model
|
||||
|
||||
import app.firka.naplo.getIntOrNull
|
||||
import app.firka.naplo.getNameUidDescOrNull
|
||||
import app.firka.naplo.getNameUidOrNull
|
||||
import app.firka.naplo.getStringOrNull
|
||||
import app.firka.naplo.getSubjectOrNull
|
||||
import org.json.JSONObject
|
||||
import java.time.LocalDateTime
|
||||
import java.time.format.DateTimeFormatterBuilder
|
||||
|
||||
class Lesson {
|
||||
val formatter = DateTimeFormatterBuilder()
|
||||
.appendPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")
|
||||
.optionalStart()
|
||||
.appendLiteral('Z')
|
||||
.optionalEnd()
|
||||
.toFormatter()
|
||||
|
||||
constructor(data: JSONObject) {
|
||||
uid = data.getString("Uid")
|
||||
date = data.getString("Datum")
|
||||
start = LocalDateTime.parse(data.getString("KezdetIdopont"), formatter)
|
||||
end = LocalDateTime.parse(data.getString("VegIdopont"), formatter)
|
||||
name = data.getString("Nev")
|
||||
lessonNumber = data.getIntOrNull("Oraszam")
|
||||
lessonSeqNumber = data.getIntOrNull("OraEvesSorszama")
|
||||
classGroup = data.getNameUidOrNull("OsztalyCsoport")
|
||||
teacher = data.getStringOrNull("TanarNeve")
|
||||
subject = data.getSubjectOrNull("Tantargy")
|
||||
theme = data.getStringOrNull("Tema")
|
||||
roomName = data.getStringOrNull("TeremNeve")
|
||||
type = NameUidDesc(data.getJSONObject("Tipus"))
|
||||
studentPresence = data.getNameUidDescOrNull("TanuloJelenlet")
|
||||
state = NameUidDesc(data.getJSONObject("Allapot"))
|
||||
substituteTeacher = data.getStringOrNull("HelyettesTanarNeve")
|
||||
homeworkUid = data.getStringOrNull("HaziFeladatUid")
|
||||
taskGroupUid = data.getStringOrNull("FeladatGroupUid")
|
||||
languageTaskGroupUid = data.getStringOrNull("NyelviFeladatGroupUid")
|
||||
assessmentUid = data.getStringOrNull("BejelentettSzamonkeresUid")
|
||||
canStudentEditHomework = data.getBoolean("IsTanuloHaziFeladatEnabled")
|
||||
isHomeworkComplete = data.getBoolean("IsHaziFeladatMegoldva")
|
||||
if (data.has("Csatolmanyok")) {
|
||||
val rawAttachments = data.getJSONArray("Csatolmanyok")
|
||||
|
||||
for (i in 0..<rawAttachments.length()) {
|
||||
attachments.add(NameUid(rawAttachments.getJSONObject(i)))
|
||||
}
|
||||
}
|
||||
isDigitalLesson = data.getBoolean("IsDigitalisOra")
|
||||
digitalDeviceList = data.getStringOrNull("DigitalisEszkozTipus")
|
||||
digitalPlatformType = data.getStringOrNull("DigitalisPlatformTipus")
|
||||
if (data.has("DigitalisTamogatoEszkozTipusList")) {
|
||||
val rawDigitalSupportDeviceTypeList =
|
||||
data.getJSONArray("DigitalisTamogatoEszkozTipusList")
|
||||
|
||||
for (i in 0..<rawDigitalSupportDeviceTypeList.length()) {
|
||||
digitalSupportDeviceTypeList.add(rawDigitalSupportDeviceTypeList.getString(i))
|
||||
}
|
||||
}
|
||||
createdAt = LocalDateTime.parse(data.getString("Letrehozas"), formatter)
|
||||
lastModifiedAt = LocalDateTime.parse(data.getString("UtolsoModositas"), formatter)
|
||||
}
|
||||
|
||||
var uid: String;
|
||||
var date: String;
|
||||
var start: LocalDateTime;
|
||||
var end: LocalDateTime;
|
||||
var name: String;
|
||||
var lessonNumber: Int?;
|
||||
var lessonSeqNumber: Int?;
|
||||
var classGroup: NameUid?;
|
||||
var teacher: String?;
|
||||
var subject: Subject?;
|
||||
var theme: String?;
|
||||
var roomName: String?;
|
||||
var type: NameUidDesc;
|
||||
var studentPresence: NameUidDesc?;
|
||||
var state: NameUidDesc;
|
||||
var substituteTeacher: String?;
|
||||
var homeworkUid: String?;
|
||||
var taskGroupUid: String?;
|
||||
var languageTaskGroupUid: String?;
|
||||
var assessmentUid: String?;
|
||||
var canStudentEditHomework: Boolean;
|
||||
var isHomeworkComplete: Boolean;
|
||||
var attachments = mutableListOf<NameUid>()
|
||||
var isDigitalLesson: Boolean
|
||||
var digitalDeviceList: String?
|
||||
var digitalPlatformType: String?
|
||||
var digitalSupportDeviceTypeList = mutableListOf<String>()
|
||||
var createdAt: LocalDateTime
|
||||
var lastModifiedAt: LocalDateTime
|
||||
package app.firka.naplo.model
|
||||
|
||||
import app.firka.naplo.getIntOrNull
|
||||
import app.firka.naplo.getNameUidDescOrNull
|
||||
import app.firka.naplo.getNameUidOrNull
|
||||
import app.firka.naplo.getStringOrNull
|
||||
import app.firka.naplo.getSubjectOrNull
|
||||
import org.json.JSONObject
|
||||
import java.time.LocalDateTime
|
||||
import java.time.format.DateTimeFormatterBuilder
|
||||
|
||||
class Lesson {
|
||||
val formatter = DateTimeFormatterBuilder()
|
||||
.appendPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")
|
||||
.optionalStart()
|
||||
.appendLiteral('Z')
|
||||
.optionalEnd()
|
||||
.toFormatter()
|
||||
|
||||
constructor(data: JSONObject) {
|
||||
uid = data.getString("Uid")
|
||||
date = data.getString("Datum")
|
||||
start = LocalDateTime.parse(data.getString("KezdetIdopont"), formatter)
|
||||
end = LocalDateTime.parse(data.getString("VegIdopont"), formatter)
|
||||
name = data.getString("Nev")
|
||||
lessonNumber = data.getIntOrNull("Oraszam")
|
||||
lessonSeqNumber = data.getIntOrNull("OraEvesSorszama")
|
||||
classGroup = data.getNameUidOrNull("OsztalyCsoport")
|
||||
teacher = data.getStringOrNull("TanarNeve")
|
||||
subject = data.getSubjectOrNull("Tantargy")
|
||||
theme = data.getStringOrNull("Tema")
|
||||
roomName = data.getStringOrNull("TeremNeve")
|
||||
type = NameUidDesc(data.getJSONObject("Tipus"))
|
||||
studentPresence = data.getNameUidDescOrNull("TanuloJelenlet")
|
||||
state = NameUidDesc(data.getJSONObject("Allapot"))
|
||||
substituteTeacher = data.getStringOrNull("HelyettesTanarNeve")
|
||||
homeworkUid = data.getStringOrNull("HaziFeladatUid")
|
||||
taskGroupUid = data.getStringOrNull("FeladatGroupUid")
|
||||
languageTaskGroupUid = data.getStringOrNull("NyelviFeladatGroupUid")
|
||||
assessmentUid = data.getStringOrNull("BejelentettSzamonkeresUid")
|
||||
canStudentEditHomework = data.getBoolean("IsTanuloHaziFeladatEnabled")
|
||||
isHomeworkComplete = data.getBoolean("IsHaziFeladatMegoldva")
|
||||
if (data.has("Csatolmanyok")) {
|
||||
val rawAttachments = data.getJSONArray("Csatolmanyok")
|
||||
|
||||
for (i in 0..<rawAttachments.length()) {
|
||||
attachments.add(NameUid(rawAttachments.getJSONObject(i)))
|
||||
}
|
||||
}
|
||||
isDigitalLesson = data.getBoolean("IsDigitalisOra")
|
||||
digitalDeviceList = data.getStringOrNull("DigitalisEszkozTipus")
|
||||
digitalPlatformType = data.getStringOrNull("DigitalisPlatformTipus")
|
||||
if (data.has("DigitalisTamogatoEszkozTipusList")) {
|
||||
val rawDigitalSupportDeviceTypeList =
|
||||
data.getJSONArray("DigitalisTamogatoEszkozTipusList")
|
||||
|
||||
for (i in 0..<rawDigitalSupportDeviceTypeList.length()) {
|
||||
digitalSupportDeviceTypeList.add(rawDigitalSupportDeviceTypeList.getString(i))
|
||||
}
|
||||
}
|
||||
createdAt = LocalDateTime.parse(data.getString("Letrehozas"), formatter)
|
||||
lastModifiedAt = LocalDateTime.parse(data.getString("UtolsoModositas"), formatter)
|
||||
}
|
||||
|
||||
var uid: String;
|
||||
var date: String;
|
||||
var start: LocalDateTime;
|
||||
var end: LocalDateTime;
|
||||
var name: String;
|
||||
var lessonNumber: Int?;
|
||||
var lessonSeqNumber: Int?;
|
||||
var classGroup: NameUid?;
|
||||
var teacher: String?;
|
||||
var subject: Subject?;
|
||||
var theme: String?;
|
||||
var roomName: String?;
|
||||
var type: NameUidDesc;
|
||||
var studentPresence: NameUidDesc?;
|
||||
var state: NameUidDesc;
|
||||
var substituteTeacher: String?;
|
||||
var homeworkUid: String?;
|
||||
var taskGroupUid: String?;
|
||||
var languageTaskGroupUid: String?;
|
||||
var assessmentUid: String?;
|
||||
var canStudentEditHomework: Boolean;
|
||||
var isHomeworkComplete: Boolean;
|
||||
var attachments = mutableListOf<NameUid>()
|
||||
var isDigitalLesson: Boolean
|
||||
var digitalDeviceList: String?
|
||||
var digitalPlatformType: String?
|
||||
var digitalSupportDeviceTypeList = mutableListOf<String>()
|
||||
var createdAt: LocalDateTime
|
||||
var lastModifiedAt: LocalDateTime
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
package app.firka.naplo.model
|
||||
|
||||
import app.firka.naplo.getStringOrNull
|
||||
import org.json.JSONObject
|
||||
|
||||
class NameUid(data: JSONObject) {
|
||||
var uid: String = data.getString("Uid")
|
||||
var name: String? = data.getStringOrNull("Nev")
|
||||
}
|
||||
package app.firka.naplo.model
|
||||
|
||||
import app.firka.naplo.getStringOrNull
|
||||
import org.json.JSONObject
|
||||
|
||||
class NameUid(data: JSONObject) {
|
||||
var uid: String = data.getString("Uid")
|
||||
var name: String? = data.getStringOrNull("Nev")
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package app.firka.naplo.model
|
||||
|
||||
import app.firka.naplo.getStringOrNull
|
||||
import org.json.JSONObject
|
||||
|
||||
class NameUidDesc(data: JSONObject) {
|
||||
var uid: String = data.getString("Uid")
|
||||
var name: String? = data.getStringOrNull("Nev")
|
||||
var description: String? = data.getStringOrNull("Leiras")
|
||||
}
|
||||
package app.firka.naplo.model
|
||||
|
||||
import app.firka.naplo.getStringOrNull
|
||||
import org.json.JSONObject
|
||||
|
||||
class NameUidDesc(data: JSONObject) {
|
||||
var uid: String = data.getString("Uid")
|
||||
var name: String? = data.getStringOrNull("Nev")
|
||||
var description: String? = data.getStringOrNull("Leiras")
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package app.firka.naplo.model
|
||||
|
||||
import app.firka.naplo.getNameUidDescOrNull
|
||||
import app.firka.naplo.getStringOrNull
|
||||
import org.json.JSONObject
|
||||
|
||||
class Subject(data: JSONObject) {
|
||||
var uid: String? = data.getStringOrNull("Uid")
|
||||
var name: String? = data.getStringOrNull("Nev")
|
||||
var category: NameUidDesc? = data.getNameUidDescOrNull("Kategoria")
|
||||
var sortIndex: Int = data.getInt("SortIndex")
|
||||
package app.firka.naplo.model
|
||||
|
||||
import app.firka.naplo.getNameUidDescOrNull
|
||||
import app.firka.naplo.getStringOrNull
|
||||
import org.json.JSONObject
|
||||
|
||||
class Subject(data: JSONObject) {
|
||||
var uid: String? = data.getStringOrNull("Uid")
|
||||
var name: String? = data.getStringOrNull("Nev")
|
||||
var category: NameUidDesc? = data.getNameUidDescOrNull("Kategoria")
|
||||
var sortIndex: Int = data.getInt("SortIndex")
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_ace_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_ace_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_ace_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_ace_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_ace_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_ace_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_ace_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_ace_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_ace_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_ace_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_ace_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_ace_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_ace_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_ace_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_ace_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_ace_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_bi_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_bi_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_bi_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_bi_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_bi_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_bi_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_bi_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_bi_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_bi_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_bi_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_bi_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_bi_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_bi_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_bi_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_bi_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_bi_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_cactus_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_cactus_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_cactus_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_cactus_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_cactus_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_cactus_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_cactus_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_cactus_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_cc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_cc_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_cc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_cc_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_cc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_cc_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_cc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_cc_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_enby_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_enby_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_enby_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_enby_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_enby_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_enby_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_enby_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_enby_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_enby_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_enby_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_enby_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_enby_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_enby_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_enby_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_enby_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_enby_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_fidesz_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_fidesz_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_fidesz_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_fidesz_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_fidesz_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_fidesz_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_fidesz_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_fidesz_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_filc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_filc_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_filc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_filc_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_filc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_filc_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_filc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_filc_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_filco_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_filco_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_filco_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_filco_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_filco_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_filco_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_filco_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_filco_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_galaxy_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_galaxy_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_galaxy_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_galaxy_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_galaxy_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_galaxy_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_galaxy_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_galaxy_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_gay_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_gay_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_gay_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_gay_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_gay_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_gay_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_gay_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_gay_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_gay_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_gay_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_gay_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_gay_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_gay_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_gay_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_gay_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_gay_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_kreta_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_kreta_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_kreta_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_kreta_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_kreta_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_kreta_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_kreta_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_kreta_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lesb_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lesb_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lesb_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lesb_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lesb_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lesb_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lesb_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lesb_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lesb_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lesb_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lesb_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lesb_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lesb_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lesb_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lesb_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lesb_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtq_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtq_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtq_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtq_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtq_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtq_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtq_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtq_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtq_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtq_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtq_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtq_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtq_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtq_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtq_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtq_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtqp_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtqp_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtqp_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtqp_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtqp_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtqp_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtqp_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtqp_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtqp_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtqp_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtqp_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtqp_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtqp_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtqp_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_lgbtqp_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_lgbtqp_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_mkkp_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_mkkp_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_mkkp_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_mkkp_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_mkkp_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_mkkp_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_mkkp_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_mkkp_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_modern_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_modern_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_modern_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_modern_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_modern_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_modern_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_modern_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_modern_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_o1g_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_o1g_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_o1g_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_o1g_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_o1g_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_o1g_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_o1g_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_o1g_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_paper_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_paper_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_paper_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_paper_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_paper_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_paper_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_paper_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_paper_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_pixel_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_pixel_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_pixel_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_pixel_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_pixel_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_pixel_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_pixel_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_pixel_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_pixelized_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_pixelized_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_pixelized_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_pixelized_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_pixelized_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_pixelized_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_pixelized_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_pixelized_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_refilc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_refilc_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_refilc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_refilc_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_refilc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_refilc_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_refilc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_refilc_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_refulc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_refulc_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_refulc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_refulc_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_refulc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_refulc_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_refulc_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_refulc_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_repont_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_repont_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_repont_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_repont_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_repont_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_repont_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_repont_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_repont_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_trans_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_trans_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_trans_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_trans_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_trans_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_trans_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_trans_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_trans_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_trans_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_trans_f_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_trans_f_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_trans_f_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_trans_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_trans_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_trans_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_trans_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_void_icon_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_void_icon_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_void_icon_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_void_icon_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_void_icon_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_void_icon_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_void_icon_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_void_icon_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_xmas1_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_xmas1_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_xmas1_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_xmas1_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_xmas1_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_xmas1_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_xmas1_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_xmas1_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_xmas2_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_xmas2_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_xmas2_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_xmas2_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_xmas2_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_xmas2_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_xmas2_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_xmas2_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_xmas3_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_xmas3_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_xmas3_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_xmas3_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_xmas3_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_xmas3_foreground"/>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_xmas3_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_xmas3_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -1,7 +1,7 @@
|
||||
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:initialLayout="@layout/glance_default_loading_layout"
|
||||
android:minWidth="300dp"
|
||||
android:minHeight="100dp"
|
||||
android:resizeMode="horizontal|vertical"
|
||||
android:updatePeriodMillis="10000">
|
||||
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:initialLayout="@layout/glance_default_loading_layout"
|
||||
android:minWidth="300dp"
|
||||
android:minHeight="100dp"
|
||||
android:resizeMode="horizontal|vertical"
|
||||
android:updatePeriodMillis="10000">
|
||||
</appwidget-provider>
|
||||
@@ -1,86 +1,86 @@
|
||||
import 'dart:ui';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
// Taken from https://gist.github.com/darmawan01/9be266df44594ea59f07032e325ffa3b
|
||||
// and adapted to use assets
|
||||
|
||||
final _globalImageCache = <String, Uint8List>{};
|
||||
|
||||
Future<void> precacheAsset(AssetBundle bundle, String asset) async {
|
||||
if (!_globalImageCache.containsKey(asset)) {
|
||||
final data = await bundle.load(asset);
|
||||
_globalImageCache[asset] = data.buffer.asUint8List();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> precacheAssets(AssetBundle bundle, List<String> assets) async {
|
||||
for (final asset in assets) {
|
||||
await precacheAsset(bundle, asset);
|
||||
}
|
||||
}
|
||||
|
||||
Future<Uint8List> _cacheLoad(AssetBundle bundle, String asset) async {
|
||||
if (!_globalImageCache.containsKey(asset)) {
|
||||
final data = await bundle.load(asset);
|
||||
_globalImageCache[asset] = data.buffer.asUint8List();
|
||||
}
|
||||
|
||||
return Future.value(_globalImageCache[asset]!);
|
||||
}
|
||||
|
||||
class CacheMemoryImageProvider extends ImageProvider<CacheMemoryImageProvider> {
|
||||
final AssetBundle bundle;
|
||||
final String path;
|
||||
Uint8List? _img;
|
||||
|
||||
CacheMemoryImageProvider(this.bundle, this.path);
|
||||
|
||||
@override
|
||||
ImageStreamCompleter loadImage(
|
||||
CacheMemoryImageProvider key, ImageDecoderCallback decode) {
|
||||
return MultiFrameImageStreamCompleter(
|
||||
codec: _loadAsync(decode),
|
||||
scale: 1.0,
|
||||
debugLabel: path,
|
||||
informationCollector: () sync* {
|
||||
yield ErrorDescription('Tag: $path');
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Future<Codec> _loadAsync(ImageDecoderCallback decode) async {
|
||||
_img ??= await _cacheLoad(bundle, path);
|
||||
|
||||
// the DefaultCacheManager() encapsulation, it get cache from local storage.
|
||||
final Uint8List bytes = _img!;
|
||||
|
||||
if (bytes.lengthInBytes == 0) {
|
||||
// The file may become available later.
|
||||
PaintingBinding.instance.imageCache.evict(this);
|
||||
throw StateError('$path is empty and cannot be loaded as an image.');
|
||||
}
|
||||
final buffer = await ImmutableBuffer.fromUint8List(bytes);
|
||||
|
||||
return await decode(buffer);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<CacheMemoryImageProvider> obtainKey(ImageConfiguration configuration) {
|
||||
return SynchronousFuture<CacheMemoryImageProvider>(this);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
if (other.runtimeType != runtimeType) return false;
|
||||
bool res = other is CacheMemoryImageProvider && other.path == path;
|
||||
return res;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => path.hashCode;
|
||||
|
||||
@override
|
||||
String toString() =>
|
||||
'${objectRuntimeType(this, 'CacheImageProvider')}("$path")';
|
||||
}
|
||||
import 'dart:ui';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
// Taken from https://gist.github.com/darmawan01/9be266df44594ea59f07032e325ffa3b
|
||||
// and adapted to use assets
|
||||
|
||||
final _globalImageCache = <String, Uint8List>{};
|
||||
|
||||
Future<void> precacheAsset(AssetBundle bundle, String asset) async {
|
||||
if (!_globalImageCache.containsKey(asset)) {
|
||||
final data = await bundle.load(asset);
|
||||
_globalImageCache[asset] = data.buffer.asUint8List();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> precacheAssets(AssetBundle bundle, List<String> assets) async {
|
||||
for (final asset in assets) {
|
||||
await precacheAsset(bundle, asset);
|
||||
}
|
||||
}
|
||||
|
||||
Future<Uint8List> _cacheLoad(AssetBundle bundle, String asset) async {
|
||||
if (!_globalImageCache.containsKey(asset)) {
|
||||
final data = await bundle.load(asset);
|
||||
_globalImageCache[asset] = data.buffer.asUint8List();
|
||||
}
|
||||
|
||||
return Future.value(_globalImageCache[asset]!);
|
||||
}
|
||||
|
||||
class CacheMemoryImageProvider extends ImageProvider<CacheMemoryImageProvider> {
|
||||
final AssetBundle bundle;
|
||||
final String path;
|
||||
Uint8List? _img;
|
||||
|
||||
CacheMemoryImageProvider(this.bundle, this.path);
|
||||
|
||||
@override
|
||||
ImageStreamCompleter loadImage(
|
||||
CacheMemoryImageProvider key, ImageDecoderCallback decode) {
|
||||
return MultiFrameImageStreamCompleter(
|
||||
codec: _loadAsync(decode),
|
||||
scale: 1.0,
|
||||
debugLabel: path,
|
||||
informationCollector: () sync* {
|
||||
yield ErrorDescription('Tag: $path');
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Future<Codec> _loadAsync(ImageDecoderCallback decode) async {
|
||||
_img ??= await _cacheLoad(bundle, path);
|
||||
|
||||
// the DefaultCacheManager() encapsulation, it get cache from local storage.
|
||||
final Uint8List bytes = _img!;
|
||||
|
||||
if (bytes.lengthInBytes == 0) {
|
||||
// The file may become available later.
|
||||
PaintingBinding.instance.imageCache.evict(this);
|
||||
throw StateError('$path is empty and cannot be loaded as an image.');
|
||||
}
|
||||
final buffer = await ImmutableBuffer.fromUint8List(bytes);
|
||||
|
||||
return await decode(buffer);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<CacheMemoryImageProvider> obtainKey(ImageConfiguration configuration) {
|
||||
return SynchronousFuture<CacheMemoryImageProvider>(this);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
if (other.runtimeType != runtimeType) return false;
|
||||
bool res = other is CacheMemoryImageProvider && other.path == path;
|
||||
return res;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => path.hashCode;
|
||||
|
||||
@override
|
||||
String toString() =>
|
||||
'${objectRuntimeType(this, 'CacheImageProvider')}("$path")';
|
||||
}
|
||||
|
||||
@@ -1,71 +1,71 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:firka/helpers/api/client/kreta_client.dart';
|
||||
import 'package:firka/helpers/api/model/timetable.dart';
|
||||
import 'package:firka/helpers/debug_helper.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
import '../../ui/model/style.dart';
|
||||
|
||||
class WidgetCacheHelper {
|
||||
static Map<String, dynamic> toJson(FirkaStyle style, List<Lesson> timetable) {
|
||||
List<Map<String, dynamic>> timetableJson = [];
|
||||
|
||||
for (var lesson in timetable) {
|
||||
timetableJson.add(lesson.toJson());
|
||||
}
|
||||
|
||||
return {
|
||||
'colors': {
|
||||
'background': style.colors.background.toARGB32(),
|
||||
'backgroundAmoled': style.colors.backgroundAmoled.toARGB32(),
|
||||
'background0p': style.colors.background0p.toARGB32(),
|
||||
'success': style.colors.success.toARGB32(),
|
||||
'textPrimary': style.colors.textPrimary.toARGB32(),
|
||||
'textSecondary': style.colors.textSecondary.toARGB32(),
|
||||
'textTertiary': style.colors.textTertiary.toARGB32(),
|
||||
'card': style.colors.card.toARGB32(),
|
||||
'cardTranslucent': style.colors.cardTranslucent.toARGB32(),
|
||||
'buttonSecondaryFill': style.colors.buttonSecondaryFill.toARGB32(),
|
||||
'accent': style.colors.accent.toARGB32(),
|
||||
'secondary': style.colors.secondary.toARGB32(),
|
||||
'shadowColor': style.colors.shadowColor.toARGB32(),
|
||||
'a15p': style.colors.a15p.toARGB32(),
|
||||
'warningAccent': style.colors.warningAccent.toARGB32(),
|
||||
'warningText': style.colors.warningText.toARGB32(),
|
||||
'warning15p': style.colors.warning15p.toARGB32(),
|
||||
'warningCard': style.colors.warningCard.toARGB32(),
|
||||
'errorAccent': style.colors.errorAccent.toARGB32(),
|
||||
'errorText': style.colors.errorText.toARGB32(),
|
||||
'error15p': style.colors.error15p.toARGB32(),
|
||||
'errorCard': style.colors.errorCard.toARGB32(),
|
||||
'grade5': style.colors.grade5.toARGB32(),
|
||||
'grade4': style.colors.grade4.toARGB32(),
|
||||
'grade3': style.colors.grade3.toARGB32(),
|
||||
'grade2': style.colors.grade2.toARGB32(),
|
||||
'grade1': style.colors.grade1.toARGB32(),
|
||||
},
|
||||
'timetable': timetableJson,
|
||||
};
|
||||
}
|
||||
|
||||
static Future<void> updateWidgetCache(
|
||||
FirkaStyle style, KretaClient client) async {
|
||||
final dataDir = await getApplicationDocumentsDirectory();
|
||||
|
||||
final now = timeNow();
|
||||
|
||||
final start = now.subtract(Duration(days: 7));
|
||||
final end = now.add(Duration(days: 14));
|
||||
final lessons = await client.getTimeTable(start, end);
|
||||
|
||||
final widgetFile = File(p.join(dataDir.path, "widget_state.json"));
|
||||
|
||||
if (lessons.response != null) {
|
||||
widgetFile.writeAsString(
|
||||
jsonEncode(WidgetCacheHelper.toJson(style, lessons.response!)));
|
||||
}
|
||||
}
|
||||
}
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:firka/helpers/api/client/kreta_client.dart';
|
||||
import 'package:firka/helpers/api/model/timetable.dart';
|
||||
import 'package:firka/helpers/debug_helper.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
import '../../ui/model/style.dart';
|
||||
|
||||
class WidgetCacheHelper {
|
||||
static Map<String, dynamic> toJson(FirkaStyle style, List<Lesson> timetable) {
|
||||
List<Map<String, dynamic>> timetableJson = [];
|
||||
|
||||
for (var lesson in timetable) {
|
||||
timetableJson.add(lesson.toJson());
|
||||
}
|
||||
|
||||
return {
|
||||
'colors': {
|
||||
'background': style.colors.background.toARGB32(),
|
||||
'backgroundAmoled': style.colors.backgroundAmoled.toARGB32(),
|
||||
'background0p': style.colors.background0p.toARGB32(),
|
||||
'success': style.colors.success.toARGB32(),
|
||||
'textPrimary': style.colors.textPrimary.toARGB32(),
|
||||
'textSecondary': style.colors.textSecondary.toARGB32(),
|
||||
'textTertiary': style.colors.textTertiary.toARGB32(),
|
||||
'card': style.colors.card.toARGB32(),
|
||||
'cardTranslucent': style.colors.cardTranslucent.toARGB32(),
|
||||
'buttonSecondaryFill': style.colors.buttonSecondaryFill.toARGB32(),
|
||||
'accent': style.colors.accent.toARGB32(),
|
||||
'secondary': style.colors.secondary.toARGB32(),
|
||||
'shadowColor': style.colors.shadowColor.toARGB32(),
|
||||
'a15p': style.colors.a15p.toARGB32(),
|
||||
'warningAccent': style.colors.warningAccent.toARGB32(),
|
||||
'warningText': style.colors.warningText.toARGB32(),
|
||||
'warning15p': style.colors.warning15p.toARGB32(),
|
||||
'warningCard': style.colors.warningCard.toARGB32(),
|
||||
'errorAccent': style.colors.errorAccent.toARGB32(),
|
||||
'errorText': style.colors.errorText.toARGB32(),
|
||||
'error15p': style.colors.error15p.toARGB32(),
|
||||
'errorCard': style.colors.errorCard.toARGB32(),
|
||||
'grade5': style.colors.grade5.toARGB32(),
|
||||
'grade4': style.colors.grade4.toARGB32(),
|
||||
'grade3': style.colors.grade3.toARGB32(),
|
||||
'grade2': style.colors.grade2.toARGB32(),
|
||||
'grade1': style.colors.grade1.toARGB32(),
|
||||
},
|
||||
'timetable': timetableJson,
|
||||
};
|
||||
}
|
||||
|
||||
static Future<void> updateWidgetCache(
|
||||
FirkaStyle style, KretaClient client) async {
|
||||
final dataDir = await getApplicationDocumentsDirectory();
|
||||
|
||||
final now = timeNow();
|
||||
|
||||
final start = now.subtract(Duration(days: 7));
|
||||
final end = now.add(Duration(days: 14));
|
||||
final lessons = await client.getTimeTable(start, end);
|
||||
|
||||
final widgetFile = File(p.join(dataDir.path, "widget_state.json"));
|
||||
|
||||
if (lessons.response != null) {
|
||||
widgetFile.writeAsString(
|
||||
jsonEncode(WidgetCacheHelper.toJson(style, lessons.response!)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
DateTime? debugFakeTime;
|
||||
DateTime? debugSetAt;
|
||||
var debugTimeAdvance = false;
|
||||
|
||||
DateTime timeNow() {
|
||||
if (debugFakeTime != null) {
|
||||
if (debugTimeAdvance && debugSetAt != null) {
|
||||
var diff = DateTime.now().difference(debugSetAt!);
|
||||
|
||||
return debugFakeTime!.add(diff);
|
||||
} else {
|
||||
return debugFakeTime!;
|
||||
}
|
||||
} else {
|
||||
return DateTime.now();
|
||||
}
|
||||
}
|
||||
DateTime? debugFakeTime;
|
||||
DateTime? debugSetAt;
|
||||
var debugTimeAdvance = false;
|
||||
|
||||
DateTime timeNow() {
|
||||
if (debugFakeTime != null) {
|
||||
if (debugTimeAdvance && debugSetAt != null) {
|
||||
var diff = DateTime.now().difference(debugSetAt!);
|
||||
|
||||
return debugFakeTime!.add(diff);
|
||||
} else {
|
||||
return debugFakeTime!;
|
||||
}
|
||||
} else {
|
||||
return DateTime.now();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,56 +1,56 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:brotli/brotli.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
class FirkaBundle extends CachingAssetBundle {
|
||||
// final bool _compressedBundle = !kDebugMode && Platform.isAndroid;
|
||||
final bool _compressedBundle = false;
|
||||
|
||||
Map<String, dynamic>? index;
|
||||
|
||||
Future<Map<String, dynamic>> loadIndex() async {
|
||||
var indexBrotli = await rootBundle.load("assets/firka.i");
|
||||
var indexStr = brotli.decodeToString(indexBrotli.buffer.asInt8List());
|
||||
|
||||
return Future.value(jsonDecode(indexStr));
|
||||
}
|
||||
|
||||
ByteData decode(Codec<List<int>, List<int>> codec, ByteData data) {
|
||||
var dec = codec.decode(data.buffer.asInt8List());
|
||||
var b = ByteData(dec.length);
|
||||
var l = b.buffer.asInt8List();
|
||||
|
||||
for (var i = 0; i < dec.length; i++) {
|
||||
l[i] = dec[i];
|
||||
}
|
||||
|
||||
return b;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<ByteData> load(String key) async {
|
||||
if (!_compressedBundle) {
|
||||
return rootBundle.load(key);
|
||||
} else {
|
||||
index ??= await loadIndex();
|
||||
|
||||
final gzip = GZipCodec();
|
||||
|
||||
debugPrint("assets/flutter_assets/$key");
|
||||
switch (index!["assets/flutter_assets/$key"]!) {
|
||||
case "b": // brotli
|
||||
return decode(brotli, await rootBundle.load(key));
|
||||
case "g": // gzip
|
||||
return decode(gzip, await rootBundle.load(key));
|
||||
case "r": // raw
|
||||
return rootBundle.load(key);
|
||||
default:
|
||||
throw "Unknown file format: ${index![key]!}";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:brotli/brotli.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
class FirkaBundle extends CachingAssetBundle {
|
||||
// final bool _compressedBundle = !kDebugMode && Platform.isAndroid;
|
||||
final bool _compressedBundle = false;
|
||||
|
||||
Map<String, dynamic>? index;
|
||||
|
||||
Future<Map<String, dynamic>> loadIndex() async {
|
||||
var indexBrotli = await rootBundle.load("assets/firka.i");
|
||||
var indexStr = brotli.decodeToString(indexBrotli.buffer.asInt8List());
|
||||
|
||||
return Future.value(jsonDecode(indexStr));
|
||||
}
|
||||
|
||||
ByteData decode(Codec<List<int>, List<int>> codec, ByteData data) {
|
||||
var dec = codec.decode(data.buffer.asInt8List());
|
||||
var b = ByteData(dec.length);
|
||||
var l = b.buffer.asInt8List();
|
||||
|
||||
for (var i = 0; i < dec.length; i++) {
|
||||
l[i] = dec[i];
|
||||
}
|
||||
|
||||
return b;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<ByteData> load(String key) async {
|
||||
if (!_compressedBundle) {
|
||||
return rootBundle.load(key);
|
||||
} else {
|
||||
index ??= await loadIndex();
|
||||
|
||||
final gzip = GZipCodec();
|
||||
|
||||
debugPrint("assets/flutter_assets/$key");
|
||||
switch (index!["assets/flutter_assets/$key"]!) {
|
||||
case "b": // brotli
|
||||
return decode(brotli, await rootBundle.load(key));
|
||||
case "g": // gzip
|
||||
return decode(gzip, await rootBundle.load(key));
|
||||
case "r": // raw
|
||||
return rootBundle.load(key);
|
||||
default:
|
||||
throw "Unknown file format: ${index![key]!}";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,24 +1,24 @@
|
||||
import 'package:firka/ui/model/style.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class CounterDigitWidget extends StatelessWidget {
|
||||
final String c;
|
||||
final TextStyle? style;
|
||||
|
||||
const CounterDigitWidget(this.c, this.style, {super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Card(
|
||||
shadowColor: Colors.transparent,
|
||||
color: appStyle.colors.buttonSecondaryFill,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(left: 8, right: 8, top: 4, bottom: 4),
|
||||
child: Text(
|
||||
c,
|
||||
style: style,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
import 'package:firka/ui/model/style.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class CounterDigitWidget extends StatelessWidget {
|
||||
final String c;
|
||||
final TextStyle? style;
|
||||
|
||||
const CounterDigitWidget(this.c, this.style, {super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Card(
|
||||
shadowColor: Colors.transparent,
|
||||
color: appStyle.colors.buttonSecondaryFill,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(left: 8, right: 8, top: 4, bottom: 4),
|
||||
child: Text(
|
||||
c,
|
||||
style: style,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,46 +1,46 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../model/style.dart';
|
||||
|
||||
class DelayedSpinnerWidget extends StatefulWidget {
|
||||
const DelayedSpinnerWidget({super.key});
|
||||
|
||||
@override
|
||||
State<DelayedSpinnerWidget> createState() => _DelayedSpinner();
|
||||
}
|
||||
|
||||
class _DelayedSpinner extends State<DelayedSpinnerWidget> {
|
||||
Timer? timer;
|
||||
bool showSpinner = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
timer = Timer(Duration(milliseconds: 50), () {
|
||||
setState(() {
|
||||
showSpinner = true;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (showSpinner) {
|
||||
return CircularProgressIndicator(
|
||||
color: appStyle.colors.accent,
|
||||
);
|
||||
} else {
|
||||
return SizedBox();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
|
||||
timer?.cancel();
|
||||
}
|
||||
}
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../model/style.dart';
|
||||
|
||||
class DelayedSpinnerWidget extends StatefulWidget {
|
||||
const DelayedSpinnerWidget({super.key});
|
||||
|
||||
@override
|
||||
State<DelayedSpinnerWidget> createState() => _DelayedSpinner();
|
||||
}
|
||||
|
||||
class _DelayedSpinner extends State<DelayedSpinnerWidget> {
|
||||
Timer? timer;
|
||||
bool showSpinner = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
timer = Timer(Duration(milliseconds: 50), () {
|
||||
setState(() {
|
||||
showSpinner = true;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (showSpinner) {
|
||||
return CircularProgressIndicator(
|
||||
color: appStyle.colors.accent,
|
||||
);
|
||||
} else {
|
||||
return SizedBox();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
|
||||
timer?.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,41 +1,41 @@
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:majesticons_flutter/majesticons_flutter.dart';
|
||||
|
||||
enum FirkaIconType {
|
||||
icons,
|
||||
majesticons,
|
||||
majesticonsLocal,
|
||||
}
|
||||
|
||||
class FirkaIconWidget extends StatelessWidget {
|
||||
final FirkaIconType iconType;
|
||||
final Object iconData;
|
||||
final Color color;
|
||||
final double? size;
|
||||
|
||||
const FirkaIconWidget(this.iconType, this.iconData,
|
||||
{super.key, this.color = Colors.white, this.size});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
switch (iconType) {
|
||||
case FirkaIconType.icons:
|
||||
return SvgPicture.asset(
|
||||
'assets/icons/${iconData as String}.svg',
|
||||
color: color,
|
||||
height: size,
|
||||
);
|
||||
case FirkaIconType.majesticons:
|
||||
return Majesticon(iconData as Uint8List, color: color, size: size);
|
||||
case FirkaIconType.majesticonsLocal:
|
||||
return SvgPicture.asset(
|
||||
'assets/majesticons/${iconData as String}.svg',
|
||||
color: color,
|
||||
height: size,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:majesticons_flutter/majesticons_flutter.dart';
|
||||
|
||||
enum FirkaIconType {
|
||||
icons,
|
||||
majesticons,
|
||||
majesticonsLocal,
|
||||
}
|
||||
|
||||
class FirkaIconWidget extends StatelessWidget {
|
||||
final FirkaIconType iconType;
|
||||
final Object iconData;
|
||||
final Color color;
|
||||
final double? size;
|
||||
|
||||
const FirkaIconWidget(this.iconType, this.iconData,
|
||||
{super.key, this.color = Colors.white, this.size});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
switch (iconType) {
|
||||
case FirkaIconType.icons:
|
||||
return SvgPicture.asset(
|
||||
'assets/icons/${iconData as String}.svg',
|
||||
color: color,
|
||||
height: size,
|
||||
);
|
||||
case FirkaIconType.majesticons:
|
||||
return Majesticon(iconData as Uint8List, color: color, size: size);
|
||||
case FirkaIconType.majesticonsLocal:
|
||||
return SvgPicture.asset(
|
||||
'assets/majesticons/${iconData as String}.svg',
|
||||
color: color,
|
||||
height: size,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user