Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ android {
applicationId = "com.flux"
minSdk = 29
targetSdk = 37
versionCode = 20
versionName = "3.2.3"
versionCode = 21
versionName = "3.2.4"
}

dependenciesInfo {
Expand Down Expand Up @@ -89,7 +89,6 @@ dependencies {
implementation(libs.androidx.compose.ui.text)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.glance.appwidget)
implementation(libs.androidx.hilt.common)
implementation(libs.androidx.material3)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.activity.compose)
Expand All @@ -109,9 +108,12 @@ dependencies {

// Hilt
ksp(libs.hilt.android.compiler)
ksp(libs.androidx.hilt.compiler)
ksp(libs.kotlinMetadataWorkaround)
implementation(libs.hilt.android)
implementation(libs.hilt.navigation.compose)
implementation(libs.androidx.hilt.common)
implementation(libs.androidx.hilt.work)

// Room
ksp(libs.androidx.room.compiler)
Expand Down
11 changes: 11 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,17 @@
</intent-filter>
</activity>

<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>

</application>

</manifest>
3 changes: 3 additions & 0 deletions app/src/main/java/com/flux/data/dao/EventDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ interface EventDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun upsertEvent(task: EventModel): Long

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun upsertEvents(tasks: List<EventModel>)

@Delete
suspend fun deleteEvent(task: EventModel)

Expand Down
13 changes: 12 additions & 1 deletion app/src/main/java/com/flux/data/database/FluxDatabase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import java.util.UUID

@Database(
entities = [EventModel::class, LabelModel::class, EventInstanceModel::class, SettingsModel::class, NotesModel::class, HabitModel::class, HabitInstanceModel::class, WorkspaceModel::class, TodoModel::class, JournalModel::class, ProgressBoardModel::class, TodoInstance::class],
version = 13,
version = 14,
exportSchema = false
)
@TypeConverters(Converter::class)
Expand Down Expand Up @@ -585,4 +585,15 @@ val MIGRATION_12_13 = object : Migration(12, 13) {
}
}
}
}

val MIGRATION_13_14 = object : Migration(13, 14) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL(
"""
ALTER TABLE SettingsModel
ADD COLUMN defaultWorkspace TEXT DEFAULT NULL
""".trimIndent()
)
}
}
4 changes: 2 additions & 2 deletions app/src/main/java/com/flux/data/model/EventModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ data class EventModel(
@PrimaryKey val id: String = UUID.randomUUID().toString(),
val title: String = "",
val description: String = "",
val recurrence: RecurrenceRule = RecurrenceRule.Custom(),
val recurrence: RecurrenceRule = RecurrenceRule.Once,
val startDateTime: Long = System.currentTimeMillis(),
val endDateTime: Long = -1L,
val notificationOffset: Long = 0L,
Expand Down Expand Up @@ -74,6 +74,6 @@ fun EventModel.occursOn(date: LocalDate): Boolean {
date.month == eventStart.month
}

else -> return false
else -> false
}
}
3 changes: 2 additions & 1 deletion app/src/main/java/com/flux/data/model/SettingsModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,6 @@ data class SettingsModel(
val startWithReadView: Boolean = false,
val storageRootUri: String? = null,
val backupFrequency: Int = 0,
val notesPreviewMode: Int = 1
val notesPreviewMode: Int = 1,
val defaultWorkspace: String? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import kotlinx.coroutines.flow.Flow

interface EventRepository {
suspend fun upsertEvent(event: EventModel)
suspend fun upsertEvents(events: List<EventModel>)
suspend fun deleteEvent(event: EventModel)
suspend fun deleteAllWorkspaceEvent(workspaceId: String)
suspend fun deleteEventInstance(eventInstanceModel: EventInstanceModel)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ class EventRepositoryImpl @Inject constructor(
return withContext(Dispatchers.IO) { eventDao.upsertEvent(event) }
}

override suspend fun upsertEvents(events: List<EventModel>) {
withContext(Dispatchers.IO) { eventDao.upsertEvents(events) }
}

override suspend fun upsertEventInstance(eventInstanceModel: EventInstanceModel) {
return withContext(Dispatchers.IO) { eventInstanceDao.upsertEventInstance(eventInstanceModel) }
}
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/java/com/flux/di/DataModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import com.flux.data.database.FluxDatabase
import com.flux.data.database.MIGRATION_10_11
import com.flux.data.database.MIGRATION_11_12
import com.flux.data.database.MIGRATION_12_13
import com.flux.data.database.MIGRATION_13_14
import com.flux.data.database.MIGRATION_1_2
import com.flux.data.database.MIGRATION_2_3
import com.flux.data.database.MIGRATION_3_4
Expand Down Expand Up @@ -59,7 +60,8 @@ object DataModule {
MIGRATION_9_10,
MIGRATION_10_11,
MIGRATION_11_12,
MIGRATION_12_13
MIGRATION_12_13,
MIGRATION_13_14
)
.build()

Expand Down
14 changes: 13 additions & 1 deletion app/src/main/java/com/flux/di/Flux.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
package com.flux.di

import android.app.Application
import androidx.hilt.work.HiltWorkerFactory
import androidx.work.Configuration
import dagger.hilt.android.HiltAndroidApp
import javax.inject.Inject

@HiltAndroidApp
class Flux : Application()
class Flux : Application(), Configuration.Provider {

@Inject
lateinit var workerFactory: HiltWorkerFactory

override val workManagerConfiguration: Configuration
get() = Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}
47 changes: 40 additions & 7 deletions app/src/main/java/com/flux/navigation/NavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,37 @@ fun AppNavHost(navController: NavHostController, snackbarHostState: SnackbarHost
}
}

ProgressBoardScreens.forEach { (route, screen) ->
val arguments = mutableListOf<NamedNavArgument>()

if (route.contains("{itemId}")) {
arguments.add(navArgument("itemId") {
type = NavType.StringType
nullable = false
})
}

if (route.contains("{workspaceId}")) {
arguments.add(navArgument("workspaceId") {
type = NavType.StringType
nullable = false
})
}

bottomSlideComposable(route, arguments) { entry ->
val itemId = entry.arguments?.getString("itemId") ?: ""
val workspaceId = entry.arguments?.getString("workspaceId") ?: ""

screen(
navController,
itemId,
workspaceId,
states,
viewModels
)
}
}

StorageSelectionScreen.forEach { (route, screen) ->
animatedComposable(route) {
screen(
Expand Down Expand Up @@ -258,15 +289,17 @@ fun AppNavHost(navController: NavHostController, snackbarHostState: SnackbarHost
})
}

if (route.contains("{spaceId}")) {
arguments.add(navArgument("spaceId") {
type = NavType.IntType
defaultValue = -1
})
}

animatedComposable(route, arguments) { entry ->
val id = entry.arguments?.getString("workspaceId") ?: ""
screen(
navController,
snackbarHostState,
states,
viewModels,
id
)
val spaceId = entry.arguments?.getInt("spaceId") ?: -1
screen(navController, snackbarHostState, states, viewModels, id, spaceId)
}
}

Expand Down
47 changes: 31 additions & 16 deletions app/src/main/java/com/flux/navigation/NavRoutes.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.flux.data.model.EventModel
import com.flux.data.model.HabitModel
import com.flux.data.model.JournalModel
import com.flux.data.model.NotesModel
import com.flux.data.model.ProgressBoardModel
import com.flux.data.model.TodoModel
import com.flux.data.model.WorkspaceModel
import com.flux.ui.screens.auth.AuthScreen
Expand All @@ -19,12 +20,14 @@ import com.flux.ui.screens.habits.NewHabit
import com.flux.ui.screens.journal.EditJournal
import com.flux.ui.screens.labels.EditLabels
import com.flux.ui.screens.notes.NoteDetails
import com.flux.ui.screens.progressBoard.NewProgressItem
import com.flux.ui.screens.search.SearchScreen
import com.flux.ui.screens.settings.About
import com.flux.ui.screens.settings.Changelog
import com.flux.ui.screens.settings.Contact
import com.flux.ui.screens.settings.Customize
import com.flux.ui.screens.settings.Data
import com.flux.ui.screens.settings.DefaultWorkspace
import com.flux.ui.screens.settings.Editor
import com.flux.ui.screens.settings.Languages
import com.flux.ui.screens.settings.Mode
Expand Down Expand Up @@ -58,6 +61,7 @@ sealed class NavRoutes(val route: String) {
data object NewEvent : NavRoutes("workspace/event/edit") // new event
data object Analytics : NavRoutes("Analytics")
data object Search : NavRoutes("workspace/search")
data object NewProgressItem : NavRoutes("workspace/progress/new") // new habit

// Settings
data object Settings : NavRoutes("settings")
Expand All @@ -71,6 +75,7 @@ sealed class NavRoutes(val route: String) {
data object Backup : NavRoutes("setting/backup")
data object Editor : NavRoutes("setting/editor")
data object Mode : NavRoutes("setting/mode")
data object DefaultWorkspace : NavRoutes("setting/defaultWorkspace")
data object NotesPreview : NavRoutes("setting/editor/notesPreview")

fun withArgs(vararg args: Any): String {
Expand All @@ -86,13 +91,13 @@ sealed class NavRoutes(val route: String) {
val AuthScreen =
mapOf<String, @Composable (navController: NavController, states: States) -> Unit>(
NavRoutes.AuthScreen.route to { navController, states ->
AuthScreen(navController, states.settings.data.isBiometricEnabled)
AuthScreen(navController, states.settings.data, states.settings.data.isBiometricEnabled)
}
)

val StorageSelectionScreen = mapOf<String, @Composable (navController: NavController, states: States, viewModels: ViewModels) -> Unit>(
NavRoutes.StorageSelection.route to { navController, states, viewModels ->
StorageSelectionScreen(navController, viewModels.settingsViewModel, states.settings.data.storageRootUri!=null)
StorageSelectionScreen(navController, states.settings.data, viewModels.settingsViewModel, states.settings.data.storageRootUri!=null)
}
)

Expand Down Expand Up @@ -180,6 +185,17 @@ val TodoScreens =
}
)

val ProgressBoardScreens =
mapOf<String, @Composable (navController: NavController, itemId: String, workspaceId: String, states: States, viewModels: ViewModels) -> Unit>(
NavRoutes.NewProgressItem.route + "/{workspaceId}" + "/{itemId}" to { navController, itemId, workspaceId, states, viewModel ->
NewProgressItem(
navController,
states.progressBoardState.allItems.find { it.itemId == itemId } ?: ProgressBoardModel(workspaceId = workspaceId, itemId = itemId),
viewModel.progressBoardViewModel::onEvent
)
}
)

val JournalScreens =
mapOf<String, @Composable (navController: NavController, journalId: String, journalDateTime: Long, workspaceId: String, states: States, viewModels: ViewModels) -> Unit>(
NavRoutes.EditJournal.route + "/{workspaceId}" + "/{journalId}" + "/{journalDateTime}" to { navController, journalId, journalDateTime, workspaceId, states, viewModel ->
Expand Down Expand Up @@ -245,6 +261,9 @@ val SettingsScreens =
},
NavRoutes.Changelog.route to { navController, _, _, _ ->
Changelog(navController)
},
NavRoutes.DefaultWorkspace.route to { navController, _, states, viewModels ->
DefaultWorkspace(navController, states.settings, states.workspaceState.allWorkspaces, viewModels.settingsViewModel::onEvent)
}
)

Expand Down Expand Up @@ -275,31 +294,27 @@ val EventScreens =

@RequiresApi(Build.VERSION_CODES.TIRAMISU)
val WorkspaceScreens =
mapOf<String, @Composable (navController: NavController, snackbarHostState: SnackbarHostState, states: States, viewModels: ViewModels, workspaceId: String) -> Unit>(
NavRoutes.Workspace.route to { navController, snackbarHostState, states, viewModels, _ ->
WorkspaceHomeScreen(
snackbarHostState,
navController,
states,
viewModels
)
mapOf<String, @Composable (navController: NavController, snackbarHostState: SnackbarHostState, states: States, viewModels: ViewModels, workspaceId: String, spaceId: Int) -> Unit>(
NavRoutes.Workspace.route to { navController, snackbarHostState, states, viewModels, _, _ ->
WorkspaceHomeScreen(snackbarHostState, navController, states, viewModels)
},

NavRoutes.NewWorkspace.route + "/{workspaceId}" to { navController, _, states, viewModels, workspaceId ->
NewWorkspaceScreen (
NavRoutes.NewWorkspace.route + "/{workspaceId}" to { navController, _, states, viewModels, workspaceId, _ ->
NewWorkspaceScreen(
navController,
states.workspaceState.allWorkspaces.find { it.workspaceId==workspaceId }?: WorkspaceModel(),
states.workspaceState.allWorkspaces.find { it.workspaceId == workspaceId } ?: WorkspaceModel(),
viewModels,
viewModels.workspaceViewModel::onEvent
)
},

NavRoutes.WorkspaceHome.route + "/{workspaceId}" to { navController, _, states, viewModels, workspaceId ->
NavRoutes.WorkspaceHome.route + "/{workspaceId}?spaceId={spaceId}" to { navController, _, states, viewModels, workspaceId, spaceId ->
WorkspaceDetails(
navController,
states,
states.workspaceState.allWorkspaces.find { it.workspaceId==workspaceId }?: WorkspaceModel(workspaceId=workspaceId),
viewModels
states.workspaceState.allWorkspaces.find { it.workspaceId == workspaceId } ?: WorkspaceModel(workspaceId = workspaceId),
viewModels,
spaceId
)
}
)
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/java/com/flux/other/BackupWorker.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.flux.other

import android.content.Context
import android.util.Log
import androidx.core.net.toUri
import androidx.hilt.work.HiltWorker
import androidx.work.CoroutineWorker
Expand Down Expand Up @@ -101,7 +102,8 @@ class BackupWorker @AssistedInject constructor(
}

Result.success()
} catch (_: Exception) {
} catch (e: Exception) {
Log.e("BackupWorker", "Backup failed", e)
Result.failure()
}
}
Expand Down
Loading
Loading