diff --git a/app/src/main/java/com/schoolapp/cleverclass/DSBDownloader.kt b/app/src/main/java/com/schoolapp/cleverclass/DSBDownloader.kt index 9a2bd5a..12b4e40 100644 --- a/app/src/main/java/com/schoolapp/cleverclass/DSBDownloader.kt +++ b/app/src/main/java/com/schoolapp/cleverclass/DSBDownloader.kt @@ -201,20 +201,6 @@ private fun createDataFolder(context: Context) : File { return folder } -private fun clearFolder(directory: File) { - if (directory.exists()) { - val files = directory.listFiles() - if (files != null) { - for (file in files) { - if (file.isDirectory) { - clearFolder(file) - } - file.delete() - } - } - } -} - private fun isInternetAvailable(context: Context): Boolean { val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val network = connectivityManager.activeNetwork diff --git a/app/src/main/java/com/schoolapp/cleverclass/SettingsActivity.kt b/app/src/main/java/com/schoolapp/cleverclass/SettingsActivity.kt index 295495e..c97be36 100644 --- a/app/src/main/java/com/schoolapp/cleverclass/SettingsActivity.kt +++ b/app/src/main/java/com/schoolapp/cleverclass/SettingsActivity.kt @@ -24,6 +24,7 @@ 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.AlertDialog import androidx.compose.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon @@ -35,8 +36,10 @@ import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @@ -64,6 +67,10 @@ fun SettingsContent(activity: ComponentActivity) { val sharedPreferences = activity.getSharedPreferences("Settings", Context.MODE_PRIVATE) val editor = sharedPreferences.edit() + var showDeleteConfirmation by remember { + mutableStateOf(false) + } + Column(modifier = Modifier.fillMaxSize()) { // Top AppBar TopAppBar( @@ -94,7 +101,6 @@ fun SettingsContent(activity: ComponentActivity) { .weight(1f) .verticalScroll(rememberScrollState()) .fillMaxWidth() - ) { Setting(text = "Stundenplan", sharedPreferences, editor) Setting(text = "Noten", sharedPreferences, editor) @@ -102,6 +108,7 @@ fun SettingsContent(activity: ComponentActivity) { Setting(text = "Mebis", sharedPreferences, editor) Setting(text = "DSBmobile", sharedPreferences, editor) Spacer(modifier = Modifier.height(16.dp)) + Divider() Box( modifier = Modifier @@ -120,6 +127,19 @@ fun SettingsContent(activity: ComponentActivity) { modifier = Modifier.padding(16.dp) ) } + Divider() + Box( + modifier = Modifier + .fillMaxWidth() + .clickable { showDeleteConfirmation = true } + ) { + Text( + text = "Alle Daten löschen", + color = MaterialTheme.colorScheme.onBackground, + style = MaterialTheme.typography.labelMedium, + modifier = Modifier.padding(16.dp) + ) + } } // About Button @@ -150,6 +170,43 @@ fun SettingsContent(activity: ComponentActivity) { Spacer(modifier = Modifier.height(8.dp)) } } + + if(showDeleteConfirmation){ + AlertDialog( + onDismissRequest = { showDeleteConfirmation = false }, + text = { + Text( + text = "Möchten Sie wirklich alle Daten aus dieser App löschen?\n" + + "Dieser Vorgang kann nicht rückgängig gemacht werden.", + color = MaterialTheme.colorScheme.onPrimaryContainer, + style = MaterialTheme.typography.labelMedium + ) + }, + confirmButton = { + Row(modifier = Modifier.fillMaxWidth()){ + Text( + text = "Löschen", + color = MaterialTheme.colorScheme.secondary, + style = MaterialTheme.typography.labelMedium, + modifier = Modifier.clickable { + deleteAllData(activity) + showDeleteConfirmation = false + } + ) + + Spacer(modifier = Modifier.weight(1f)) + + Text( + text = "Abbrechen", + color = MaterialTheme.colorScheme.secondary, + style = MaterialTheme.typography.labelMedium, + modifier = Modifier.clickable { showDeleteConfirmation = false } + ) + } + }, + containerColor = MaterialTheme.colorScheme.primaryContainer + ) + } } @Composable diff --git a/app/src/main/java/com/schoolapp/cleverclass/Utilities.kt b/app/src/main/java/com/schoolapp/cleverclass/Utilities.kt index c4c8549..faf545d 100644 --- a/app/src/main/java/com/schoolapp/cleverclass/Utilities.kt +++ b/app/src/main/java/com/schoolapp/cleverclass/Utilities.kt @@ -1,5 +1,9 @@ package com.schoolapp.cleverclass +import android.app.Activity +import android.content.Context +import android.content.Intent +import androidx.activity.ComponentActivity import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -17,6 +21,10 @@ import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import java.io.File const val NO_INTERNET_CONNECTION_CODE = -1 @@ -63,4 +71,47 @@ fun StaticLoadingScreen(){ ) } } +} + +fun deleteAllData(activity: ComponentActivity){ + val sharedPrefs = listOf("Settings", "DSBmobile", "gradeAverages", "TimeTable") + for (prefName in sharedPrefs) { + val sharedPreferences = activity.getSharedPreferences(prefName, Context.MODE_PRIVATE) + val editor = sharedPreferences.edit() + editor.clear() + editor.apply() + } + + clearFolder(activity.filesDir) + clearFolder(activity.cacheDir) + + CoroutineScope(Dispatchers.Main).launch { + restartApp(activity) + } +} + +fun clearFolder(directory: File) { + if (directory.exists()) { + val files = directory.listFiles() + if (files != null) { + for (file in files) { + if (file.isDirectory) { + clearFolder(file) + } + file.delete() + } + } + } +} + +fun restartApp(context: Context) { + val packageManager = context.packageManager + val intent = packageManager.getLaunchIntentForPackage(context.packageName) + intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + intent?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + context.startActivity(intent) + if (context is Activity) { + context.finish() + } + Runtime.getRuntime().exit(0) } \ No newline at end of file