Skip to content
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ kotlin {
implementation(compose.components.uiToolingPreview)
implementation(libs.findLibrary("coil").get())
implementation(libs.findLibrary("coil.network.ktor").get())
api(libs.findLibrary("calf-ui").get())
}

androidMain.dependencies {
Expand Down
5 changes: 0 additions & 5 deletions clients/tablet/composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ kotlin {
it.binaries.framework {
baseName = "ComposeApp"
isStatic = true

export(libs.calf.ui)
}
}

Expand All @@ -35,7 +33,6 @@ kotlin {
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview)

api(libs.calf.ui)
api(libs.kotlinx.datetime)

implementation(libs.jetbrains.navigation.compose)
Expand All @@ -48,8 +45,6 @@ kotlin {

implementation(libs.napier)

implementation(libs.settings)

implementation(project(":clients:tablet:core:ui"))
implementation(project(":clients:tablet:feature:main"))
implementation(project(":clients:tablet:feature:settings"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ package band.effective.office.tablet

import android.app.Application
import band.effective.office.tablet.core.domain.manager.DateResetManager
import band.effective.office.tablet.core.domain.model.SettingsManager
import band.effective.office.tablet.core.ui.inactivity.InactivityLifecycleCallbacks
import band.effective.office.tablet.di.KoinInitializer
import band.effective.office.tablet.di.firebaseTopicsModule
import com.google.firebase.messaging.FirebaseMessaging
import com.russhwolf.settings.SharedPreferencesSettings
import org.koin.android.ext.android.get
import org.koin.android.ext.koin.androidContext
import org.koin.core.qualifier.named
import kotlin.time.Duration.Companion.minutes

Expand All @@ -16,15 +16,10 @@ class App : Application() {
override fun onCreate() {
super.onCreate()
LoggerInitializer().init()
KoinInitializer().init()
SettingsManager.init(
SharedPreferencesSettings(
this.getSharedPreferences(
"settings",
MODE_PRIVATE
)
)
)
KoinInitializer().init {
androidContext(applicationContext)
modules(firebaseTopicsModule)
}
subscribeOnFirebaseTopics()
initializeInactivitySystem()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ import band.effective.office.tablet.feature.main.di.mainScreenModule
import band.effective.office.tablet.feature.settings.di.settingsModule
import band.effective.office.tablet.feature.slot.di.slotDiModule
import org.koin.core.context.startKoin
import org.koin.dsl.KoinAppDeclaration

class KoinInitializer {
fun init() {
fun init(koinConfig: KoinAppDeclaration = {}) {
startKoin {
modules(
appModule,
firebaseTopicsModule,
dataModule,
domainModule,
mainScreenModule,
Expand All @@ -23,6 +23,7 @@ class KoinInitializer {
fastBookingModule,
slotDiModule,
)
koinConfig()
}
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
package band.effective.office.tablet

import band.effective.office.tablet.core.domain.model.SettingsManager
import band.effective.office.tablet.di.KoinInitializer
import com.russhwolf.settings.KeychainSettings

class Initializers {

fun init() {
LoggerInitializer().init()
KoinInitializer().init()
SettingsManager.init(KeychainSettings("effectiveOffice"))
}
}
5 changes: 4 additions & 1 deletion clients/tablet/core/domain/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,15 @@ kotlin {
api(project(":clients:shared:core"))
api(libs.kotlinx.datetime)
implementation(libs.kotlin.coroutines.core)
implementation(libs.settings)
implementation(libs.bundles.koin)
}
androidMain.dependencies {
implementation(libs.coroutines.android)
implementation(libs.koin.android)
implementation(libs.settings)
}
iosMain.dependencies {
implementation(libs.settings)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package band.effective.office.tablet.core.domain.di

import android.content.Context
import band.effective.office.tablet.core.domain.model.SettingsStore
import com.russhwolf.settings.SharedPreferencesSettings
import org.koin.dsl.module

actual fun settingsStoreModule() = module {
single<SettingsStore> {
val settings = SharedPreferencesSettings(
get<Context>().getSharedPreferences("settings", Context.MODE_PRIVATE)
)
object : SettingsStore {
override fun getString(key: String, defaultValue: String) = settings.getString(key, defaultValue)
override fun putString(key: String, value: String) = settings.putString(key, value)
override fun remove(key: String) = settings.remove(key)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package band.effective.office.tablet.core.domain.di

import band.effective.office.tablet.core.domain.model.SettingsManager
import band.effective.office.tablet.core.domain.useCase.CheckBookingUseCase
import band.effective.office.tablet.core.domain.useCase.CheckSettingsUseCase
import band.effective.office.tablet.core.domain.useCase.CreateBookingUseCase
Expand All @@ -19,9 +20,17 @@ import band.effective.office.tablet.core.domain.useCase.SlotUseCase
import band.effective.office.tablet.core.domain.useCase.TimerUseCase
import band.effective.office.tablet.core.domain.useCase.UpdateBookingUseCase
import band.effective.office.tablet.core.domain.useCase.UpdateUseCase
import org.koin.core.module.Module
import org.koin.dsl.module

expect fun settingsStoreModule(): Module

val domainModule = module {

includes(settingsStoreModule())

single { SettingsManager(settings = get()) }

// Booking use cases
single {
CreateBookingUseCase(
Expand Down Expand Up @@ -68,9 +77,9 @@ val domainModule = module {
// Other use cases
single { OrganizersInfoUseCase(repository = get()) }
single { CheckBookingUseCase(roomInfoUseCase = get()) }
single { CheckSettingsUseCase() }
single { CheckSettingsUseCase(settingsManager = get()) }
single { SelectRoomUseCase() }
single { SetRoomUseCase() }
single { SetRoomUseCase(settingsManager = get()) }
single { SlotUseCase() }
single { TimerUseCase() }
single { UpdateUseCase(roomInfoUseCase = get(), timerUseCase = get()) }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,6 @@
package band.effective.office.tablet.core.domain.model
import com.russhwolf.settings.*

class SettingsManager(private val settings: Settings) {

companion object {
private const val KEY_NAME_ROOM = "nameRoom"

// Singleton-like instance
private var currentInstance: SettingsManager? = null

fun init(settings: Settings) {
if(currentInstance == null) {
currentInstance = SettingsManager(settings)
}
}

fun current(): SettingsManager {
return currentInstance
?: error("SettingsManager not initialized. Call SettingsManager.init(settings) first.")
}
}
class SettingsManager(private val settings: SettingsStore) {

var currentRoomName: String
get() = settings.getString(KEY_NAME_ROOM, "")
Expand All @@ -36,5 +17,9 @@ class SettingsManager(private val settings: Settings) {
fun removeRoomName() {
settings.remove(KEY_NAME_ROOM)
}

private companion object {
const val KEY_NAME_ROOM = "nameRoom"
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package band.effective.office.tablet.core.domain.model

interface SettingsStore {
fun getString(key: String, defaultValue: String): String
fun putString(key: String, value: String)
fun remove(key: String)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package band.effective.office.tablet.core.domain.useCase
import band.effective.office.tablet.core.domain.model.SettingsManager

/**use case for get settings values*/
class CheckSettingsUseCase {
class CheckSettingsUseCase(private val settingsManager: SettingsManager) {
/**Get current room from settings*/
operator fun invoke() =
SettingsManager.current().checkCurrentRoom()
settingsManager.checkCurrentRoom()
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package band.effective.office.tablet.core.domain.useCase
import band.effective.office.tablet.core.domain.model.SettingsManager

/**Use case for set settings*/
class SetRoomUseCase {
class SetRoomUseCase(private val settingsManager: SettingsManager) {
/**save current room name*/
operator fun invoke(nameRoom: String) =
SettingsManager.current().updateSettings(nameRoom)
settingsManager.updateSettings(nameRoom)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package band.effective.office.tablet.core.domain.di

import band.effective.office.tablet.core.domain.model.SettingsStore
import com.russhwolf.settings.ExperimentalSettingsImplementation
import com.russhwolf.settings.KeychainSettings
import org.koin.dsl.module

@OptIn(ExperimentalSettingsImplementation::class)
actual fun settingsStoreModule() = module {
single<SettingsStore> {
val settings = KeychainSettings("effectiveOffice")
object : SettingsStore {
override fun getString(key: String, defaultValue: String) = settings.getString(key, defaultValue)
override fun putString(key: String, value: String) = settings.putString(key, value)
override fun remove(key: String) = settings.remove(key)
}
}
}
11 changes: 11 additions & 0 deletions clients/tablet/feature/bookingEditor/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@ plugins {
id("band.effective.office.client.kmp.feature")
}

kotlin {
sourceSets {
androidMain.dependencies {
implementation(libs.calf.ui)
}
iosMain.dependencies {
implementation(libs.calf.ui)
}
}
}

compose.resources {
publicResClass = false
packageOfResClass = "band.effective.office.tablet.feature.bookingEditor"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package band.effective.office.tablet.feature.bookingEditor.presentation.datetimepicker.components

import androidx.compose.foundation.layout.Column
import androidx.compose.material3.DatePickerDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import band.effective.office.shared.core.utils.asInstant
import band.effective.office.shared.core.utils.asLocalDateTime
import band.effective.office.tablet.core.ui.theme.LocalCustomColorsPalette
import com.mohamedrejeb.calf.ui.datepicker.AdaptiveDatePicker
import com.mohamedrejeb.calf.ui.datepicker.rememberAdaptiveDatePickerState
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalDateTime

@OptIn(ExperimentalMaterial3Api::class)
@Composable
actual fun DatePickerView(
modifier: Modifier,
currentDate: LocalDateTime,
onChangeDate: (LocalDate) -> Unit,
) {
// Create and remember the date picker state
val state = rememberAdaptiveDatePickerState(
initialSelectedDateMillis = currentDate.asInstant.toEpochMilliseconds(),
)

// React to date changes
LaunchedEffect(state.selectedDateMillis) {
val selectedDate = state.selectedDateMillis?.let { millis ->
Instant.fromEpochMilliseconds(millis).asLocalDateTime.date
}

selectedDate?.let {
val year = it.year
val month = it.month
val day = it.dayOfMonth
onChangeDate(LocalDate(year, month, day))
}
}

val palette = LocalCustomColorsPalette.current
val accent = MaterialTheme.colorScheme.primary
val onAccent = MaterialTheme.colorScheme.onPrimary

Column {
AdaptiveDatePicker(
state = state,
modifier = modifier,
colors = DatePickerDefaults.colors(
containerColor = palette.elevationBackground,
titleContentColor = palette.primaryTextAndIcon,
headlineContentColor = palette.primaryTextAndIcon,
weekdayContentColor = palette.secondaryTextAndIcon,
subheadContentColor = palette.primaryTextAndIcon,
navigationContentColor = accent,
yearContentColor = palette.primaryTextAndIcon,
currentYearContentColor = accent,
selectedYearContentColor = onAccent,
selectedYearContainerColor = accent,
dayContentColor = palette.primaryTextAndIcon,
selectedDayContentColor = onAccent,
selectedDayContainerColor = accent,
todayContentColor = accent,
todayDateBorderColor = accent,
),
)
}
}
Loading