Skip to content
Snippets Groups Projects
Commit 6f1d9ccf authored by Emirhan Gürkan's avatar Emirhan Gürkan
Browse files

AVVM

parent 5e8ac588
Branches
Tags
1 merge request!6Architecture/mvvm
Showing
with 275 additions and 238 deletions
......@@ -6,7 +6,7 @@
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:name=".MyAppChannel"
android:name=".MyApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
......
package com.example.myapplication.Helpers
import android.Manifest
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
import com.example.myapplication.R
private const val channelId = "POMODORO_CHANNEL_ID"
const val channelName = "Pomodoro_Notifications"
const val channelDescription = "Channel for Pomodoro notifications"
fun createNotificationChannel(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // API-Level 26
val channel = NotificationChannel(
channelId,
channelName,
NotificationManager.IMPORTANCE_DEFAULT
).apply {
description = channelDescription
enableVibration(true)
vibrationPattern = longArrayOf(0, 500, 1000, 500) // Vibration: Start sofort, 500ms Vibration, 1000ms Pause
}
val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
manager.createNotificationChannel(channel)
}
}
fun hasNotificationPermission(context: Context): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
return ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
}
return true
}
fun showNotification(hasPermission: Boolean, title: String, text: String, context: Context) {
if (hasPermission) {
val notification = NotificationCompat.Builder(context.applicationContext, channelId)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle(title)
.setContentText(text)
.build()
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(1, notification)
}
}
\ No newline at end of file
package com.example.myapplication.Helpers
import androidx.compose.runtime.Composable
import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.myapplication.Room.AppViewModel
import com.example.myapplication.Room.SettingsViewModel
import com.example.myapplication.Room.TaskViewModel
object ViewModelProvider {
private var settingsViewModel: SettingsViewModel? = null
private var taskViewModel: TaskViewModel? = null
private var appViewModel: AppViewModel? = null
@Composable
fun initViewModels() {
settingsViewModel = viewModel()
taskViewModel = viewModel()
appViewModel = viewModel()
}
fun getSettingsViewModel() = settingsViewModel ?: throw Error("ERROR")
fun getTaskViewModel() = taskViewModel ?: throw Error("ERROR")
fun getAppViewModel() = appViewModel ?: throw Error("ERROR")
}
\ No newline at end of file
......@@ -12,57 +12,44 @@ import androidx.compose.ui.unit.dp
import com.example.myapplication.UI_Components.main_app
import com.example.myapplication.ui.theme.MyApplicationTheme
import android.Manifest
import android.app.NotificationManager
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
import com.example.myapplication.Room.MyDatabase
import com.example.myapplication.background.createNotificationChannel
import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.myapplication.Helpers.ViewModelProvider
import com.example.myapplication.Helpers.createNotificationChannel
import com.example.myapplication.Helpers.hasNotificationPermission
import com.example.myapplication.Helpers.showNotification
import com.example.myapplication.Room.AppViewModel
import com.example.myapplication.Room.SettingsViewModel
import com.example.myapplication.Room.TaskViewModel
import com.example.myapplication.Types.NavigationType
class MainActivity : ComponentActivity() {
companion object {
var database: MyDatabase? = null
}
private val settingsViewModel :SettingsViewModel by viewModels()
private val taskViewModel :TaskViewModel by viewModels()
private val appViewModel :AppViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
database = MyDatabase.getDatabase(this)
// Timer Notification Channel
createNotificationChannel(this)
setContent {
MyApplicationTheme {
Surface(
modifier = Modifier
.fillMaxSize()
.padding(8.dp),
color = MaterialTheme.colorScheme.background
) {
ViewModelProvider.initViewModels()
settingsViewModel.updateSettingByEmpty()
val context = LocalContext.current
var hasPermission by remember { mutableStateOf(hasNotificationPermission(context)) }
val permissionLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestPermission(),
onResult = { isGranted ->
hasPermission = isGranted
showNotification(
hasPermission,
"Success Notification",
"You have successfully enabled notifications. Stay tuned for updates and alerts!"
)
showNotification(hasPermission,"Success Notification", "You have successfully enabled notifications. Stay tuned for updates and alerts!", context)
}
)
......@@ -72,75 +59,47 @@ class MainActivity : ComponentActivity() {
}
}
MyApplicationTheme {
Surface(
modifier = Modifier
.fillMaxSize()
.padding(8.dp),
color = MaterialTheme.colorScheme.background
) {
main_app() { title, text ->
showNotification(hasPermission, title, text)
showNotification(hasPermission, title, text, context)
}
}
}
}
var protected = null
protected void onStart()
super.onStart();
//Code, der ausgeführt wird, wenn die Aktivität sichtbar wird
var statusTextView = null
statusTextView.setText("Acitivity is now visible");
protected void onStop()
super.onStop();
//Code, der ausgeführt wird, wenn die Aktivität nicht mehr sichtbar ist
protected void onResume()
super.onResume();
//Code, der ausgeführt wird, wenn die Aktivität den Fokus erhälrt und interaktiv wird
protected void onPause()
super.onPause()
//Coder, der ausgeführt wird, wenn die Akitvität den Fokus verliert, aber noch sichtbar ist
protected void onRestart()
super.onRestart()
//Code, der ausgeführt wird, wenn eine gestoppte Aktivität erneut gestartet wird.
protected void onDestroy()
super.onDestroy()
//Code, der ausgeführt wird, bevor die Aktivität gelöscht wird.
}
}
private fun Nothing?.setText(s: String) {
override fun onStart() {
super.onStart()
taskViewModel.getAllSortedByDate()
settingsViewModel.getAllSettings()
}
private infix fun Nothing?.void(onStart: Unit) {
override fun onResume() {
super.onResume()
appViewModel.runTimer()
}
fun hasNotificationPermission(context: Context): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
return ContextCompat.checkSelfPermission(
context,
Manifest.permission.POST_NOTIFICATIONS
) == PackageManager.PERMISSION_GRANTED
override fun onPause() {
super.onPause()
appViewModel.stopTimer()
}
return true
override fun onStop() {
super.onStop()
appViewModel.stopTimer()
}
fun showNotification(hasPermission: Boolean, title: String, text: String) {
if (hasPermission) {
val notification = NotificationCompat.Builder(applicationContext, "channel_id")
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle(title)
.setContentText(text)
.build()
val notificationManager =
getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(1, notification)
override fun onDestroy() {
super.onDestroy()
appViewModel.setSelectedNavigation(NavigationType.Home)
appViewModel.destroyMediaPlayer()
}
}
package com.example.myapplication
import android.app.Application
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.os.Build
class MyAppChannel: Application() {
override fun onCreate() {
super.onCreate()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
val channel = NotificationChannel(
"channel_id", "myChannel", NotificationManager.IMPORTANCE_DEFAULT
).apply {
enableVibration(true)
vibrationPattern = longArrayOf(0, 500, 1000, 500) // Vibration: Start sofort, 500ms Vibration, 1000ms Pause
}
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
manager.createNotificationChannel(channel)
}
}
}
\ No newline at end of file
package com.example.myapplication
import android.app.Application
import android.util.Log
import com.example.myapplication.Helpers.createNotificationChannel
import com.example.myapplication.Room.MyDatabase
class MyApplication : Application() {
companion object{
var database: MyDatabase? = null
}
override fun onCreate() {
super.onCreate()
//Initialisierung der Anwendung
createNotificationChannel(this)
database = MyDatabase.getDatabase(this)
}
override fun onTerminate() {
super.onTerminate()
// Bereinigen der Ressourcen
}
override fun onLowMemory() {
super.onLowMemory()
// Ressourcen freigeben
}
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
// Reagieren auf verschieden Speicherknappheitensstufen
database?.close()
}
}
\ No newline at end of file
package com.example.myapplication.Room
import android.content.Context
import android.media.MediaPlayer
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.example.myapplication.R
import com.example.myapplication.Types.NavigationType
class AppViewModel: ViewModel() {
var isRunning = MutableLiveData(false)
var pauseText = MutableLiveData("Start")
var selectedNavigation = MutableLiveData(NavigationType.Home)
var musicPlayer: MutableLiveData<MediaPlayer?> = MutableLiveData(null)
fun runTimer() {
isRunning.setValue(true)
pauseText.setValue("Pause")
musicPlayer.value?.apply {
start()
}
}
fun stopTimer() {
isRunning.setValue(false)
pauseText.setValue("Start")
musicPlayer.value?.apply {
stop()
}
}
fun setSelectedNavigation(navigationType: NavigationType) {
selectedNavigation.setValue(navigationType)
}
fun createMediaPlayer(context: Context, music: String) {
if(music != "---") {
musicPlayer = MutableLiveData(
MediaPlayer.create(context, getMusic(music)).apply {
setVolume(1.0f, 1.0f)
isLooping = true
}
)
}
}
fun destroyMediaPlayer() {
musicPlayer.value?.apply {
stop()
release()
}
musicPlayer.setValue(null)
}
private fun getMusic(music:String):Int {
return when(music) {
"day" -> R.raw.day
"farm" -> R.raw.farm
"fire" -> R.raw.fire
"night" -> R.raw.night
"storm" -> R.raw.storm
else -> throw Error("ERROR")
}
}
}
\ No newline at end of file
package com.example.myapplication.Room
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.myapplication.MainActivity
import com.example.myapplication.MyApplication
import com.example.myapplication.Room.DAO.SettingsDAO
import kotlinx.coroutines.launch
class SettingsViewModel() : ViewModel() {
private val SettingsDAO: SettingsDAO = getSettingsDAO()
private val SettingsDAO: SettingsDAO = MyApplication.database?.settingsDAO() ?: throw Error("Error")
var settingsDataList: LiveData<SettingsTimer> = getAllSettings()
fun insert(settingsTimer: SettingsTimer) {
viewModelScope.launch {
SettingsDAO.insert(settingsTimer)
}
}
fun getAllSettings(): LiveData<SettingsTimer> = SettingsDAO.getAllSettings()
fun update(settingsTimer: SettingsTimer) {
viewModelScope.launch {
......@@ -23,8 +22,6 @@ class SettingsViewModel() : ViewModel() {
}
}
fun getAllSettings(): LiveData<SettingsTimer> = SettingsDAO.getAllSettings()
suspend fun getSettingsIsEmpty(): Boolean {
val count = SettingsDAO.getCount()
return count == 0
......@@ -37,10 +34,4 @@ class SettingsViewModel() : ViewModel() {
}
}
}
private fun getSettingsDAO(): SettingsDAO {
val settingsDAO: SettingsDAO = MainActivity.database?.settingsDAO() ?: throw Error("FEHLER")
return settingsDAO
}
}
\ No newline at end of file
package com.example.myapplication.Room
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.myapplication.Helpers.StringToDate
import com.example.myapplication.MainActivity
import com.example.myapplication.MyApplication
import com.example.myapplication.Room.DAO.TaskDAO
import kotlinx.coroutines.launch
class TaskViewModel(): ViewModel() {
private val taskDAO: TaskDAO = MyApplication.database?.taskDAO() ?: throw Error("Error")
var taskDataList: LiveData<List<Task>> = getAllSortedByDate()
private val taskDAO: TaskDAO = getTaskDAO()
fun getAllSortedByDate(): LiveData<List<Task>> {
return taskDAO.getAllSortedByDate()
}
fun getAllSortedByDate() = taskDAO.getAllSortedByDate()
fun insert(taskName: String, taskDate:String) {
viewModelScope.launch {
......@@ -52,10 +51,4 @@ class TaskViewModel(): ViewModel() {
deletedTasks.forEach { taskDAO.delete(it) }
}
}
private fun getTaskDAO(): TaskDAO {
val taskDAO: TaskDAO = MainActivity.database?.taskDAO() ?: throw Error("FEHLER")
return taskDAO
}
}
\ No newline at end of file
......@@ -22,13 +22,13 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.myapplication.Helpers.ViewModelProvider
import com.example.myapplication.Helpers.isValidDate
import com.example.myapplication.Room.TaskViewModel
import com.example.myapplication.MainActivity
import com.example.myapplication.ui.theme.color_FFFFFF
@Composable
fun TaskDialog(currentTaskId: Int, currentTaskDate: String, currentTaskName: String, taskViewModel: TaskViewModel = viewModel(), showDialogDissmis: () -> Unit) {
fun TaskDialog(currentTaskId: Int, currentTaskDate: String, currentTaskName: String, showDialogDissmis: () -> Unit) {
var taskDate by remember { mutableStateOf(currentTaskDate) }
var taskName by remember { mutableStateOf(currentTaskName) }
var taskFormularError by remember { mutableStateOf(false) }
......@@ -79,11 +79,11 @@ fun TaskDialog(currentTaskId: Int, currentTaskDate: String, currentTaskName: Str
confirmButton = { Button(modifier = Modifier.padding(0.dp,0.dp, 20.dp, 0.dp).width(90.dp),onClick = {
if (isValidDate(taskDate) && taskName.isNotEmpty() && currentTaskName.isNotEmpty()) {
taskViewModel.updateTaskById(currentTaskId, taskDate, taskName)
ViewModelProvider.getTaskViewModel().updateTaskById(currentTaskId, taskDate, taskName)
showDialogDissmis()
} else if(isValidDate(taskDate) && taskName.isNotEmpty() && currentTaskName.isEmpty()) {
taskViewModel.insert(taskName, taskDate)
ViewModelProvider.getTaskViewModel().insert(taskName, taskDate)
showDialogDissmis()
} else {
......
......@@ -22,19 +22,21 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.myapplication.Helpers.ViewModelProvider
import com.example.myapplication.Room.Task
import com.example.myapplication.UI_Components.Dialogs.TaskDialog
import com.example.myapplication.UI_Components.Dialogs.TaskInfoDialog
import com.example.myapplication.UI_Components.Title
import java.util.Date
import com.example.myapplication.Helpers.dateToString
import com.example.myapplication.MainActivity
import com.example.myapplication.Room.TaskViewModel
import com.example.myapplication.UI_Components.Dialogs.MyAlertDialog
// Home-Screen mit Listen für offene und erledigte Aufgaben
@Composable
fun HomeScreen(currentOpenTask: List<Task>, currentCompletedTask: List<Task>, taskViewModel: TaskViewModel = viewModel(), onClickStartSession: () -> Unit) {
fun HomeScreen(currentOpenTask: List<Task>, currentCompletedTask: List<Task>, onClickStartSession: () -> Unit) {
var openTask by remember(currentOpenTask) { mutableStateOf(currentOpenTask.map { it.copy() }) }
var completedTask by remember(currentCompletedTask) { mutableStateOf(currentCompletedTask.map { it.copy() }) }
var changesEnabled by remember { mutableStateOf(false) }
......@@ -124,10 +126,10 @@ fun HomeScreen(currentOpenTask: List<Task>, currentCompletedTask: List<Task>, ta
if (currentAllTask.count() > allList.count()) {
val deletedTasks: List<Task> = currentAllTask.filter { !allList.contains(it) }
taskViewModel.delete(deletedTasks)
ViewModelProvider.getTaskViewModel().delete(deletedTasks)
}
taskViewModel.update(allList)
ViewModelProvider.getTaskViewModel().update(allList)
changesEnabled = false
}, enabled = changesEnabled) {
......
......@@ -18,6 +18,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.myapplication.Helpers.ViewModelProvider
import com.example.myapplication.MainActivity
import com.example.myapplication.Room.SettingsTimer
import com.example.myapplication.Room.SettingsViewModel
import com.example.myapplication.Types.SettingsDropdownType
......@@ -25,7 +27,7 @@ import com.example.myapplication.UI_Components.Title
import com.example.myapplication.ui.theme.color_0066FF
@Composable
fun Settings(appSettings: SettingsTimer, settingsViewModel: SettingsViewModel = viewModel()) {
fun Settings(appSettings: SettingsTimer) {
val initialSettingsTimerState: SettingsTimer = appSettings
var newSettingsTimerState by remember { mutableStateOf(initialSettingsTimerState) }
var changesEnabled by remember { mutableStateOf(false) }
......@@ -111,7 +113,7 @@ fun Settings(appSettings: SettingsTimer, settingsViewModel: SettingsViewModel =
}
Button(
onClick = {
settingsViewModel.update(newSettingsTimerState)
ViewModelProvider.getSettingsViewModel().update(newSettingsTimerState)
changesEnabled = false
},
enabled = changesEnabled)
......
......@@ -7,6 +7,7 @@ import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
......@@ -19,6 +20,8 @@ import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.myapplication.Helpers.ViewModelProvider
import com.example.myapplication.MainActivity
import com.example.myapplication.R
import com.example.myapplication.Room.SettingsTimer
import com.example.myapplication.Room.Task
......@@ -33,54 +36,41 @@ fun TimerScreen(todayTasks: List<Task>, settingsTimer: SettingsTimer, notificati
var showInfoDialog by remember { mutableStateOf(true) }
val tasks by remember(todayTasks) { mutableStateOf(todayTasks) }
val appSettings by remember(settingsTimer) { mutableStateOf(settingsTimer) }
var mediaPlayer by remember { mutableStateOf<MediaPlayer?>(null) }
val isRunning by ViewModelProvider.getAppViewModel().isRunning.observeAsState(initial = false)
val pauseText by ViewModelProvider.getAppViewModel().pauseText.observeAsState(initial = "Start")
var timeLeft by remember { mutableStateOf(appSettings.dauer * 60) }
var round by remember { mutableStateOf(1) }
var isRunning by remember { mutableStateOf(false) }
var isInPause by remember { mutableStateOf(false) }
var pauseText by remember { mutableStateOf("Start") }
val context = LocalContext.current
LaunchedEffect(Unit) {
if(appSettings.musik != "---"){
mediaPlayer = MediaPlayer.create(context, getMusik(appSettings.musik)).apply{
setVolume(1.0f, 1.0f)
isLooping = true
}
}
ViewModelProvider.getAppViewModel().createMediaPlayer(context, appSettings.musik)
}
LaunchedEffect(isRunning, isInPause) {
LaunchedEffect(isRunning) {
while (round <= appSettings.langePauseNachEinheiten) {
if (isRunning) {
while (timeLeft > 0) {
delay(1000)
timeLeft -= 1
}
isInPause = true
isRunning = false
ViewModelProvider.getAppViewModel().stopTimer()
timeLeft = if(round == 4) appSettings.langePause * 60 else appSettings.kurzePause * 60
}
if (isInPause) {
if (!isRunning) {
notificationCallback("Congratulation", "Nice you have ${appSettings.dauer * round} minutes worked :).")
while (timeLeft > 0) {
delay(1000)
timeLeft -= 1
}
isInPause = false
isRunning = true
ViewModelProvider.getAppViewModel().runTimer()
timeLeft = appSettings.dauer * 60
round += 1
}
if (!isRunning && !isInPause) {
delay(1000)
}
}
round = 1
isRunning = false
isInPause = false
ViewModelProvider.getAppViewModel().stopTimer()
timeLeft = appSettings.dauer * 60
}
......@@ -105,7 +95,7 @@ fun TimerScreen(todayTasks: List<Task>, settingsTimer: SettingsTimer, notificati
.padding(vertical = 16.dp),
contentAlignment = Alignment.Center
) {
val text = if(isInPause) "Pause" else "$round.Arbeitsphase"
val text = if(!isRunning) "Pause" else "$round.Arbeitsphase"
TimerDisplay(text ,timeLeft = timeLeft)
}
......@@ -128,12 +118,9 @@ fun TimerScreen(todayTasks: List<Task>, settingsTimer: SettingsTimer, notificati
) {
Button(
onClick = {
isRunning = !isRunning
pauseText = if (pauseText == "Pause") "Start" else "Pause"
if(isRunning) ViewModelProvider.getAppViewModel().stopTimer() else ViewModelProvider.getAppViewModel().runTimer()
if(mediaPlayer != null) if(isRunning) mediaPlayer?.start() else mediaPlayer?.pause()
if (pauseText=="Pause") startPomodoro(context)
// if (pauseText=="Pause") startPomodoro(context)
},
modifier = Modifier.weight(1f),
colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF7F56D9))
......@@ -175,7 +162,7 @@ fun TimerDisplay(text: String, timeLeft: Int) {
}
@Composable
fun TaskList(tasks: List<Task>, taskViewModel: TaskViewModel = viewModel()) {
fun TaskList(tasks: List<Task>) {
var timerState by remember { mutableStateOf(tasks) }
Column {
timerState.forEachIndexed() { index, task ->
......@@ -200,21 +187,10 @@ fun TaskList(tasks: List<Task>, taskViewModel: TaskViewModel = viewModel()) {
this[index] = this[index].copy(isCompleted = !this[index].isCompleted)
}
taskViewModel.updateTask(timerState[index])
ViewModelProvider.getTaskViewModel().updateTask(timerState[index])
}
)
}
}
}
}
fun getMusik(music:String):Int {
return when(music) {
"day" -> R.raw.day
"farm" -> R.raw.farm
"fire" -> R.raw.fire
"night" -> R.raw.night
"storm" -> R.raw.storm
else -> throw Error("ERROR")
}
}
......@@ -13,12 +13,11 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.myapplication.Helpers.ViewModelProvider
import com.example.myapplication.Helpers.dateAreEqual
import com.example.myapplication.MainActivity
import com.example.myapplication.Room.SettingsTimer
import com.example.myapplication.Room.SettingsViewModel
import com.example.myapplication.Room.Task
import com.example.myapplication.Room.TaskViewModel
import com.example.myapplication.Types.NavigationType
import com.example.myapplication.UI_Components.Home.HomeScreen
import com.example.myapplication.UI_Components.Settings.Settings
......@@ -26,22 +25,18 @@ import com.example.myapplication.ui.theme.color_F5F5F5
import java.util.Date
@Composable
fun main_app(settingsViewModel: SettingsViewModel = viewModel(), taskViewModel: TaskViewModel = viewModel(), notificationCallback: (titel: String, text: String) -> Unit) {
val appSettings by settingsViewModel.getAllSettings().observeAsState(initial = SettingsTimer())
settingsViewModel.updateSettingByEmpty()
val allTaskList by taskViewModel.getAllSortedByDate().observeAsState(initial = emptyList())
val currentOpenTask: List<Task> = allTaskList.filter { !it.isCompleted }
val currentCompletedTask: List<Task> = allTaskList.filter { it.isCompleted }
val todaysTask:List<Task> = allTaskList.filter { dateAreEqual(it.date, Date().time) }
var selectedNavigation by rememberSaveable { mutableStateOf(NavigationType.Home) }
fun main_app(notificationCallback: (titel: String, text: String) -> Unit) {
val selectedNavigation by ViewModelProvider.getAppViewModel().selectedNavigation.observeAsState(initial = NavigationType.Home)
val appSettings by ViewModelProvider.getSettingsViewModel().settingsDataList.observeAsState(initial = SettingsTimer())
val currentTasks by ViewModelProvider.getTaskViewModel().taskDataList.observeAsState(initial = emptyList())
val openTask: List<Task> = currentTasks.filter { !it.isCompleted }
val completedTask: List<Task> = currentTasks.filter { it.isCompleted }
val todaysTask:List<Task> = currentTasks.filter { dateAreEqual(it.date, Date().time) }
Scaffold(
bottomBar = {
if (selectedNavigation != NavigationType.Timer) {
BottomNavigationBar(selectedNavigation) { selectedNavigation = it }
BottomNavigationBar(selectedNavigation) { ViewModelProvider.getAppViewModel().setSelectedNavigation(it) }
}
}
) { paddingValues ->
......@@ -53,9 +48,11 @@ fun main_app(settingsViewModel: SettingsViewModel = viewModel(), taskViewModel:
{
when(selectedNavigation) {
NavigationType.Settings -> Settings(appSettings)
NavigationType.Timer -> TimerScreen(todaysTask, appSettings, notificationCallback) { selectedNavigation = NavigationType.Home }
NavigationType.Home -> HomeScreen(currentOpenTask, currentCompletedTask) {
selectedNavigation = NavigationType.Timer
NavigationType.Timer -> TimerScreen(todaysTask, appSettings, notificationCallback) {
ViewModelProvider.getAppViewModel().setSelectedNavigation(NavigationType.Home)
}
NavigationType.Home -> HomeScreen(openTask, completedTask) {
ViewModelProvider.getAppViewModel().setSelectedNavigation(NavigationType.Timer)
}
}
......
package com.example.myapplication.background
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.os.Build
fun createNotificationChannel(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channelId = "POMODORO_CHANNEL"
val channelName = "Pomodoro Notifications"
val channelDescription = "Channel for Pomodoro notifications"
val notificationChannel = NotificationChannel(
channelId,
channelName,
NotificationManager.IMPORTANCE_HIGH
).apply {
description = channelDescription
}
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(notificationChannel)
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment