From cd9e26fbe52652b2c0cc1f6011a447ec510a464e Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 21 Apr 2024 20:24:22 +0200 Subject: [PATCH] Update DSBmobile --- app/build.gradle.kts | 3 - app/src/main/AndroidManifest.xml | 6 + .../com/schoolapp/cleverclass/DSBActivity.kt | 145 ++++++++++++++++-- .../cleverclass/DSBDayViewActivity.kt | 107 +++++++++++++ .../schoolapp/cleverclass/DSBDownloader.kt | 33 +++- .../schoolapp/cleverclass/ui/theme/Color.kt | 3 +- .../schoolapp/cleverclass/ui/theme/Theme.kt | 2 + app/src/main/res/values/strings.xml | 1 + 8 files changed, 277 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/com/schoolapp/cleverclass/DSBDayViewActivity.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4cbe039..f0fdb85 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -61,14 +61,11 @@ dependencies { implementation("androidx.datastore:datastore-preferences:1.0.0") implementation("com.google.code.gson:gson:2.9.0") implementation(platform("androidx.compose:compose-bom:2023.03.00")) - implementation(platform("androidx.compose:compose-bom:2023.03.00")) testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") androidTestImplementation("androidx.compose.ui:ui-test-junit4") androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) - androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) - androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-test-manifest") } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2c4e7f..5bee986 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> + + { + DSBLoading() + } + -1 -> { + DSBNoInternet() + } + else -> { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .verticalScroll(rememberScrollState()) + .fillMaxWidth() + ) { + Spacer(modifier = Modifier.height(32.dp)) - mainFolder.listFiles()?.forEach { folder -> - DayPrefab(folder = folder) - Spacer(modifier = Modifier.height(48.dp)) + val mainFolder = File(activity.filesDir, "dataDSB") + + mainFolder.listFiles()?.forEach { folder -> + DayPrefab(folder, activity) + Spacer(modifier = Modifier.height(32.dp)) + Divider() + Spacer(modifier = Modifier.height(32.dp)) + } + } } } } } @Composable -fun DayPrefab(folder: File){ - val imageFiles = folder.listFiles { file -> file.extension == "jpg" }?.toList() +fun DSBLoading(){ + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ){ + CircularProgressIndicator() + } +} - Column { - imageFiles?.forEach { - val imageBitmap = BitmapFactory.decodeFile(it.absolutePath) +@Composable +fun DSBNoInternet(){ + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ){ + Text( + text = "Keine Internetverbindung", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onBackground + ) + } +} + +@Composable +fun DayPrefab(folder: File, activity: Context){ + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .fillMaxWidth() + .height(300.dp) + .clickable { + val intent = Intent(activity, DSBDayViewActivity::class.java).apply { + putExtra(DSBDayViewActivity.FOLDER_KEY, folder.absolutePath) + } + activity.startActivity(intent) + } + ) { + val information = JSONObject(File(folder, "info.json").readText()) + val previewImageBitmap = BitmapFactory.decodeFile(File(folder, "0.jpg").absolutePath) + + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Text( + text = "${information.get("FormatInfo")} - ${information.get("PlanInfo").toString().removeSuffix(".pdf")}", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onBackground + ) - Image(bitmap = imageBitmap.asImageBitmap(), contentDescription = null) Spacer(modifier = Modifier.height(8.dp)) + + Text( + text = information.get("Date").toString(), + style = MaterialTheme.typography.bodySmall, + color = MiddleColor + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Image( + bitmap = previewImageBitmap.asImageBitmap(), + contentDescription = null + ) } } } diff --git a/app/src/main/java/com/schoolapp/cleverclass/DSBDayViewActivity.kt b/app/src/main/java/com/schoolapp/cleverclass/DSBDayViewActivity.kt new file mode 100644 index 0000000..9e1d0db --- /dev/null +++ b/app/src/main/java/com/schoolapp/cleverclass/DSBDayViewActivity.kt @@ -0,0 +1,107 @@ +package com.schoolapp.cleverclass + +import android.graphics.BitmapFactory +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.unit.dp +import com.schoolapp.cleverclass.ui.theme.CleverClassTheme +import org.json.JSONObject +import java.io.File + +private lateinit var folder : File +private lateinit var information : JSONObject + +class DSBDayViewActivity : ComponentActivity() { + companion object{ + const val FOLDER_KEY = "folder_key" + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + folder = File(intent.getStringExtra(FOLDER_KEY) ?: "") + information = JSONObject(File(folder, "info.json").readText()) + + setContent { + CleverClassTheme { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + DSBDayViewContent(activity = this) + } + } + } + } +} + +// Content of DSBDayView +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DSBDayViewContent(activity: ComponentActivity){ + Column{ + TopAppBar( + colors = TopAppBarDefaults.centerAlignedTopAppBarColors(MaterialTheme.colorScheme.primaryContainer), + title = { + Text( + text = information.get("PlanInfo").toString(), + style = MaterialTheme.typography.headlineSmall, + color = MaterialTheme.colorScheme.onPrimaryContainer + )}, + navigationIcon = { + IconButton(onClick = { activity.finish() }) { + Icon( + imageVector = Icons.Filled.ArrowBack, + contentDescription = null, + modifier = Modifier.size(28.dp), + tint = MaterialTheme.colorScheme.onPrimaryContainer + ) + } + }, + modifier = Modifier.fillMaxWidth() + ) + + val imageFiles = folder.listFiles { file -> file.extension == "jpg" }?.toList() + + Column( + modifier = Modifier + .padding(8.dp) + .verticalScroll(rememberScrollState()) + ) { + imageFiles?.forEach { + Image( + bitmap = BitmapFactory.decodeFile(it.absolutePath).asImageBitmap(), + contentDescription = null, + contentScale = ContentScale.FillWidth, + modifier = Modifier.fillMaxWidth() + ) + Spacer(modifier = Modifier.height(8.dp)) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/schoolapp/cleverclass/DSBDownloader.kt b/app/src/main/java/com/schoolapp/cleverclass/DSBDownloader.kt index f7089e1..7e2d571 100644 --- a/app/src/main/java/com/schoolapp/cleverclass/DSBDownloader.kt +++ b/app/src/main/java/com/schoolapp/cleverclass/DSBDownloader.kt @@ -1,6 +1,8 @@ package com.schoolapp.cleverclass import android.content.Context +import android.net.ConnectivityManager +import android.net.NetworkCapabilities import android.util.Base64 import android.util.Log import org.json.JSONObject @@ -16,12 +18,17 @@ import java.time.LocalDateTime import java.util.UUID -suspend fun downloadDSB(context: Context){ +suspend fun downloadDSB(context: Context): Int{ + if(!isInternetAvailable(context)) + return -1 + val mainDir = createDataFolder(context) val jsonResponse = downloadDataTask() downloadImagesTask(jsonResponse, mainDir) + + return 0 } private fun downloadDataTask() : String { @@ -123,6 +130,7 @@ private fun downloadImagesTask(jsonResponse: String, mainDir : File){ val day = File(mainDir, dayID.toString()) day.mkdir() + createDayInformationJson(day, jsonDayObject) val jsonPagesObject = jsonDayObject.getJSONArray("Childs") @@ -136,6 +144,20 @@ private fun downloadImagesTask(jsonResponse: String, mainDir : File){ } } +private fun createDayInformationJson(folder: File, jsonDayObject: JSONObject){ + val infoFile = File(folder, "info.json") + val date = jsonDayObject.get("Date") + val formatInfo = jsonDayObject.get("Title") + val planInfo = jsonDayObject.getJSONArray("Childs").getJSONObject(0).get("Title") + + val infoJson = JSONObject() + infoJson.put("Date", date) + infoJson.put("FormatInfo", formatInfo) + infoJson.put("PlanInfo", planInfo) + + infoFile.writeText(infoJson.toString()) +} + private fun downloadImage(folder: File, url: URL, fileName: String){ val file = File(folder, fileName) @@ -176,4 +198,11 @@ private fun clearFolder(directory: File) { } } } -} \ No newline at end of file +} + +private fun isInternetAvailable(context: Context): Boolean { + val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val network = connectivityManager.activeNetwork + val networkCapabilities = connectivityManager.getNetworkCapabilities(network) + return networkCapabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) ?: false +} diff --git a/app/src/main/java/com/schoolapp/cleverclass/ui/theme/Color.kt b/app/src/main/java/com/schoolapp/cleverclass/ui/theme/Color.kt index 925099a..37c1510 100644 --- a/app/src/main/java/com/schoolapp/cleverclass/ui/theme/Color.kt +++ b/app/src/main/java/com/schoolapp/cleverclass/ui/theme/Color.kt @@ -11,8 +11,9 @@ val White90 = Color(0xFFEBEBEB) val White70 = Color(0xFFD3D3D3) val TextOnColouredButton = Color(0xFF121212) +val MiddleColor = Color(0xFF808080) val dismissLight = Color(0xFF536DFE) val dismissDark = Color(0xFF448AFF) -val testColor = Color(0xFF00FF00) \ No newline at end of file +val testColor = Color(0xFF00FF00) diff --git a/app/src/main/java/com/schoolapp/cleverclass/ui/theme/Theme.kt b/app/src/main/java/com/schoolapp/cleverclass/ui/theme/Theme.kt index eb1585b..d3a55b0 100644 --- a/app/src/main/java/com/schoolapp/cleverclass/ui/theme/Theme.kt +++ b/app/src/main/java/com/schoolapp/cleverclass/ui/theme/Theme.kt @@ -22,6 +22,7 @@ private val DarkColorScheme = darkColorScheme( onPrimaryContainer = White100, secondary = dismissDark, onBackground = White100, + outlineVariant = Black70, primary = Color(0xFF536DFE) ) @@ -31,6 +32,7 @@ private val LightColorScheme = lightColorScheme( onPrimaryContainer = Black100, secondary = dismissLight, onBackground = Black100, + outlineVariant = White70, primary = Color(0xFF8396FF) ) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e992e50..b0f873a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,4 +9,5 @@ Schließen DSBActivity MebisActivity + DSBDayViewActivity \ No newline at end of file