From 576fc4020c1b3be9e7103d4ec217a087faa05495 Mon Sep 17 00:00:00 2001 From: Roman Pytkov Date: Tue, 17 Dec 2024 23:41:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D1=82=20LocalStorage,?= =?UTF-8?q?=20=D0=B2=D1=8B=D0=BA=D0=B8=D0=BD=D1=83=D1=82=20=D0=BC=D1=83?= =?UTF-8?q?=D1=81=D0=BE=D1=80=20=D0=B8=D0=B7=20UiState?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 5 +- app/release/baselineProfiles/0/app-release.dm | Bin 0 -> 10969 bytes app/release/baselineProfiles/1/app-release.dm | Bin 0 -> 10919 bytes app/release/output-metadata.json | 37 +++++++++ .../nullptroma/wallenc/app/MainActivity.kt | 7 +- .../app/di/modules/app/DispatchersModule.kt | 29 +++++++ .../app/di/modules/data/SingletonModule.kt | 31 +++++++ .../app/di/modules/domain/UseCasesModule.kt | 10 +-- data/build.gradle.kts | 3 + .../nullptroma/wallenc/data/MockStorage.kt | 23 ++++++ .../wallenc/data/vaults/VaultsManager.kt | 13 ++- .../data/vaults/local/LocalStorageAccessor.kt | 77 ++++++++++++++++++ .../data/vaults/{ => local}/LocalVault.kt | 20 ++++- .../wallenc/domain/models/IVaultsManager.kt | 2 +- .../usecases/GetAllRawStoragesUseCase.kt | 18 ++-- gradle/libs.versions.toml | 2 + .../screens/main/MainScreenState.kt | 2 +- .../screens/main/MainViewModel.kt | 2 +- .../screens/local/vault/LocalVaultScreen.kt | 7 +- .../local/vault/LocalVaultScreenState.kt | 4 +- .../local/vault/LocalVaultViewModel.kt | 17 +++- .../remotes/RemoteVaultsScreenState.kt | 2 +- .../screens/remotes/RemoteVaultsViewModel.kt | 2 +- .../screens/settings/SettingsScreenState.kt | 2 +- .../screens/settings/SettingsViewModel.kt | 2 +- wallenc-uml.gaphor | 2 +- 26 files changed, 284 insertions(+), 35 deletions(-) create mode 100644 app/release/baselineProfiles/0/app-release.dm create mode 100644 app/release/baselineProfiles/1/app-release.dm create mode 100644 app/release/output-metadata.json create mode 100644 app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/DispatchersModule.kt create mode 100644 app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/SingletonModule.kt create mode 100644 data/src/main/java/com/github/nullptroma/wallenc/data/MockStorage.kt create mode 100644 data/src/main/java/com/github/nullptroma/wallenc/data/vaults/local/LocalStorageAccessor.kt rename data/src/main/java/com/github/nullptroma/wallenc/data/vaults/{ => local}/LocalVault.kt (66%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8e34666..08963e3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -53,6 +53,9 @@ android { } dependencies { + // Timber + implementation(libs.timber) + // Yandex implementation(libs.yandex.oauth) @@ -76,6 +79,6 @@ dependencies { //androidTestImplementation(libs.androidx.ui.test.junit4) implementation(project(":domain")) + implementation(project(":data")) implementation(project(":presentation")) - runtimeOnly(project(":data")) } \ No newline at end of file diff --git a/app/release/baselineProfiles/0/app-release.dm b/app/release/baselineProfiles/0/app-release.dm new file mode 100644 index 0000000000000000000000000000000000000000..9811576ebc6bc8982fa8bc60a92684b076c21a7f GIT binary patch literal 10969 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 literal 0 HcmV?d00001 diff --git a/app/release/baselineProfiles/1/app-release.dm b/app/release/baselineProfiles/1/app-release.dm new file mode 100644 index 0000000000000000000000000000000000000000..a9809b330e95e4ba9e84f4f207bedb943841c951 GIT binary patch literal 10919 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 F0RVFp`Jn&+ literal 0 HcmV?d00001 diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 0000000..54665c7 --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,37 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.github.nullptroma.wallenc.app", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "1.0", + "outputFile": "app-release.apk" + } + ], + "elementType": "File", + "baselineProfiles": [ + { + "minApi": 28, + "maxApi": 30, + "baselineProfiles": [ + "baselineProfiles/1/app-release.dm" + ] + }, + { + "minApi": 31, + "maxApi": 2147483647, + "baselineProfiles": [ + "baselineProfiles/0/app-release.dm" + ] + } + ], + "minSdkVersionForDexing": 24 +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/MainActivity.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/MainActivity.kt index ada67d6..c74bbc6 100644 --- a/app/src/main/java/com/github/nullptroma/wallenc/app/MainActivity.kt +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/MainActivity.kt @@ -6,8 +6,8 @@ import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import com.github.nullptroma.wallenc.presentation.WallencUi import dagger.hilt.android.AndroidEntryPoint +import timber.log.Timber -class Container(val value: T) @AndroidEntryPoint class MainActivity : ComponentActivity() { @@ -15,12 +15,13 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() + + Timber.plant(Timber.DebugTree()) // val sdk = YandexAuthSdk.create(YandexAuthOptions(applicationContext, true)) // val launcher = // registerForActivityResult(sdk.contract) { result -> handleResult(result) } // val loginOptions = YandexAuthLoginOptions(LoginType.CHROME_TAB) - val cont1 = Container(true) - var cont2 = Container(true) + setContent { WallencUi() } diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/DispatchersModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/DispatchersModule.kt new file mode 100644 index 0000000..34a187f --- /dev/null +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/app/DispatchersModule.kt @@ -0,0 +1,29 @@ +package com.github.nullptroma.wallenc.app.di.modules.app + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class MainDispatcher + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class IoDispatcher + +@Module +@InstallIn(SingletonComponent::class) +class DispatchersModule { + @MainDispatcher + @Provides + fun providesMainDispatcher(): CoroutineDispatcher = Dispatchers.Main + + @IoDispatcher + @Provides + fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/SingletonModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/SingletonModule.kt new file mode 100644 index 0000000..46fcf31 --- /dev/null +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/SingletonModule.kt @@ -0,0 +1,31 @@ +package com.github.nullptroma.wallenc.app.di.modules.data + +import android.content.Context +import com.github.nullptroma.wallenc.app.di.modules.app.IoDispatcher +import com.github.nullptroma.wallenc.data.vaults.local.LocalVault +import com.github.nullptroma.wallenc.data.vaults.VaultsManager +import com.github.nullptroma.wallenc.domain.models.IVaultsManager +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineDispatcher +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class SingletonModule { + @Provides + @Singleton + fun provideLocalVault(@IoDispatcher ioDispatcher: CoroutineDispatcher, + @ApplicationContext context: Context): LocalVault { + return LocalVault(ioDispatcher, context) + } + + @Provides + @Singleton + fun provideVaultsManager(localVault: LocalVault): IVaultsManager { + return VaultsManager(localVault) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt index 2bea31f..d3e21ff 100644 --- a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt @@ -1,7 +1,7 @@ package com.github.nullptroma.wallenc.app.di.modules.domain -import com.github.nullptroma.wallenc.domain.models.IMetaInfo -import com.github.nullptroma.wallenc.domain.usecases.TestUseCase +import com.github.nullptroma.wallenc.domain.models.IVaultsManager +import com.github.nullptroma.wallenc.domain.usecases.GetAllRawStoragesUseCase import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -11,11 +11,9 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) class UseCasesModule { - var count = 0 - @Provides @Singleton - fun provideTestUseCase(meta: IMetaInfo): TestUseCase { - return TestUseCase(meta, count++) + fun provideGetAllRawStoragesUseCase(vaultsManager: IVaultsManager): GetAllRawStoragesUseCase { + return GetAllRawStoragesUseCase(vaultsManager) } } \ No newline at end of file diff --git a/data/build.gradle.kts b/data/build.gradle.kts index e42304b..1b70c8d 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -34,6 +34,9 @@ android { } dependencies { + // Timber + implementation(libs.timber) + // Room implementation(libs.room.ktx) implementation(libs.room.runtime) diff --git a/data/src/main/java/com/github/nullptroma/wallenc/data/MockStorage.kt b/data/src/main/java/com/github/nullptroma/wallenc/data/MockStorage.kt new file mode 100644 index 0000000..ee54b41 --- /dev/null +++ b/data/src/main/java/com/github/nullptroma/wallenc/data/MockStorage.kt @@ -0,0 +1,23 @@ +package com.github.nullptroma.wallenc.data + +import com.github.nullptroma.wallenc.domain.models.IStorage +import com.github.nullptroma.wallenc.domain.models.IStorageAccessor +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import java.util.UUID + +class MockStorage( + override val size: StateFlow = MutableStateFlow(null), + override val numberOfFiles: StateFlow = MutableStateFlow(null), + override val uuid: UUID, + override val name: StateFlow = MutableStateFlow(""), + override val totalSpace: StateFlow = MutableStateFlow(null), + override val availableSpace: StateFlow = MutableStateFlow(null), + override val isAvailable: StateFlow = MutableStateFlow(false), + override val accessor: IStorageAccessor +) : IStorage { + + override suspend fun rename(newName: String) { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/VaultsManager.kt b/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/VaultsManager.kt index 260d2e6..857b27d 100644 --- a/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/VaultsManager.kt +++ b/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/VaultsManager.kt @@ -1,5 +1,16 @@ package com.github.nullptroma.wallenc.data.vaults -class VaultsManager { +import com.github.nullptroma.wallenc.data.vaults.local.LocalVault +import com.github.nullptroma.wallenc.domain.models.IVault +import com.github.nullptroma.wallenc.domain.models.IVaultsManager +import kotlinx.coroutines.flow.StateFlow + +class VaultsManager(override val localVault: LocalVault) : IVaultsManager { + override val remoteVaults: StateFlow> + get() = TODO("Not yet implemented") + + override fun addYandexVault(email: String, token: String) { + TODO("Not yet implemented") + } } \ No newline at end of file diff --git a/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/local/LocalStorageAccessor.kt b/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/local/LocalStorageAccessor.kt new file mode 100644 index 0000000..7199324 --- /dev/null +++ b/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/local/LocalStorageAccessor.kt @@ -0,0 +1,77 @@ +package com.github.nullptroma.wallenc.data.vaults.local + +import com.github.nullptroma.wallenc.domain.datatypes.DataPackage +import com.github.nullptroma.wallenc.domain.models.IDirectory +import com.github.nullptroma.wallenc.domain.models.IFile +import com.github.nullptroma.wallenc.domain.models.IStorageAccessor +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.StateFlow +import java.io.InputStream +import java.io.OutputStream +import java.net.URI + +class LocalStorageAccessor : IStorageAccessor { + override val isAvailable: StateFlow + get() = TODO("Not yet implemented") + override val filesUpdates: SharedFlow> + get() = TODO("Not yet implemented") + override val dirsUpdates: SharedFlow> + get() = TODO("Not yet implemented") + + override suspend fun getAllFiles(): List { + TODO("Not yet implemented") + } + + override suspend fun getFiles(path: URI): List { + TODO("Not yet implemented") + } + + override fun getFilesFlow(path: URI): Flow> { + TODO("Not yet implemented") + } + + override suspend fun getAllDirs(): List { + TODO("Not yet implemented") + } + + override suspend fun getDirs(path: URI): List { + TODO("Not yet implemented") + } + + override fun getDirsFlow(path: URI): Flow> { + TODO("Not yet implemented") + } + + override suspend fun touchFile(path: URI) { + TODO("Not yet implemented") + } + + override suspend fun touchDir(path: URI) { + TODO("Not yet implemented") + } + + override suspend fun delete(path: URI) { + TODO("Not yet implemented") + } + + override suspend fun getFileInfo(path: URI) { + TODO("Not yet implemented") + } + + override suspend fun getDirInfo(path: URI) { + TODO("Not yet implemented") + } + + override suspend fun openWrite(path: URI): InputStream { + TODO("Not yet implemented") + } + + override suspend fun openRead(path: URI): OutputStream { + TODO("Not yet implemented") + } + + override suspend fun moveToTrash(path: URI) { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/LocalVault.kt b/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/local/LocalVault.kt similarity index 66% rename from data/src/main/java/com/github/nullptroma/wallenc/data/vaults/LocalVault.kt rename to data/src/main/java/com/github/nullptroma/wallenc/data/vaults/local/LocalVault.kt index e1a5aaf..98b9c85 100644 --- a/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/LocalVault.kt +++ b/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/local/LocalVault.kt @@ -1,21 +1,37 @@ -package com.github.nullptroma.wallenc.data.vaults +package com.github.nullptroma.wallenc.data.vaults.local import android.content.Context +import com.github.nullptroma.wallenc.data.MockStorage import com.github.nullptroma.wallenc.domain.datatypes.EncryptKey import com.github.nullptroma.wallenc.domain.enums.VaultType import com.github.nullptroma.wallenc.domain.models.IStorage import com.github.nullptroma.wallenc.domain.models.IVault import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.UUID +import kotlin.io.path.Path +import kotlin.io.path.createDirectory class LocalVault(private val ioDispatcher: CoroutineDispatcher, context: Context) : IVault { + private val path = context.getExternalFilesDir("LocalVault") + private val _storages = MutableStateFlow(listOf()) + init { CoroutineScope(ioDispatcher).launch { + if(path == null) + return@launch + val dirs = path.listFiles()?.filter { it.isDirectory } + if(dirs != null) + _storages.value = dirs.map { + MockStorage(uuid = UUID.fromString(it.name), accessor = LocalStorageAccessor()) + } + val next = Path(path.path, UUID.randomUUID().toString()) + next.createDirectory() } } @@ -46,7 +62,7 @@ class LocalVault(private val ioDispatcher: CoroutineDispatcher, context: Context override val uuid: UUID get() = TODO("Not yet implemented") override val storages: StateFlow> - get() = TODO("Not yet implemented") + get() = _storages override val isAvailable: StateFlow get() = TODO("Not yet implemented") diff --git a/domain/src/main/java/com/github/nullptroma/wallenc/domain/models/IVaultsManager.kt b/domain/src/main/java/com/github/nullptroma/wallenc/domain/models/IVaultsManager.kt index 3232e15..950f2bb 100644 --- a/domain/src/main/java/com/github/nullptroma/wallenc/domain/models/IVaultsManager.kt +++ b/domain/src/main/java/com/github/nullptroma/wallenc/domain/models/IVaultsManager.kt @@ -3,7 +3,7 @@ package com.github.nullptroma.wallenc.domain.models import kotlinx.coroutines.flow.StateFlow interface IVaultsManager { - val localVault: StateFlow + val localVault: IVault val remoteVaults: StateFlow> fun addYandexVault(email: String, token: String) diff --git a/domain/src/main/java/com/github/nullptroma/wallenc/domain/usecases/GetAllRawStoragesUseCase.kt b/domain/src/main/java/com/github/nullptroma/wallenc/domain/usecases/GetAllRawStoragesUseCase.kt index c90aa9d..c82552f 100644 --- a/domain/src/main/java/com/github/nullptroma/wallenc/domain/usecases/GetAllRawStoragesUseCase.kt +++ b/domain/src/main/java/com/github/nullptroma/wallenc/domain/usecases/GetAllRawStoragesUseCase.kt @@ -1,14 +1,14 @@ package com.github.nullptroma.wallenc.domain.usecases -import com.github.nullptroma.wallenc.domain.models.IVault import com.github.nullptroma.wallenc.domain.models.IVaultsManager -import kotlinx.coroutines.flow.combine -class GetAllRawStoragesUseCase(val manager: IVaultsManager) { - fun getStoragesFlow() = manager.remoteVaults.combine(manager.localVault) { remote, local -> - mutableListOf().apply { - addAll(remote) - add(local) - } - } +class GetAllRawStoragesUseCase(private val manager: IVaultsManager) { + // fun getStoragesFlow() = manager.remoteVaults.combine(manager.localVault) { remote, local -> +// mutableListOf().apply { +// addAll(remote) +// add(local) +// } +// } + val localStorage + get() = manager.localVault } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d2782bb..835efd9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,6 +13,7 @@ activityCompose = "1.9.3" composeBom = "2024.10.01" navigation = "2.8.3" hiltNavigation = "1.2.0" +timber = "5.0.1" yandexAuthSdk = "3.1.2" daggerHilt = "2.52" ksp = "2.0.10-1.0.24" @@ -29,6 +30,7 @@ kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-c kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } navigation = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigation" } navigation-hilt-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "hiltNavigation" } +timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" } # Yandex yandex-oauth = { group = "com.yandex.android", name = "authsdk", version.ref = "yandexAuthSdk" } diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/MainScreenState.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/MainScreenState.kt index 8e4e246..b51acdb 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/MainScreenState.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/MainScreenState.kt @@ -1,3 +1,3 @@ package com.github.nullptroma.wallenc.presentation.screens.main -data class MainScreenState(val value: String) \ No newline at end of file +class MainScreenState \ No newline at end of file diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/MainViewModel.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/MainViewModel.kt index 40a82df..e76f001 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/MainViewModel.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/MainViewModel.kt @@ -12,7 +12,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel @HiltViewModel class MainViewModel @javax.inject.Inject constructor(savedStateHandle: SavedStateHandle) : - ViewModelBase(MainScreenState("default string")) { + ViewModelBase(MainScreenState()) { @OptIn(SavedStateHandleSaveableApi::class) var routes by savedStateHandle.saveable { diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultScreen.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultScreen.kt index cc12692..1dfc394 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultScreen.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultScreen.kt @@ -1,5 +1,6 @@ package com.github.nullptroma.wallenc.presentation.screens.main.screens.local.vault +import androidx.compose.foundation.layout.Column import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -15,5 +16,9 @@ fun LocalVaultScreen(modifier: Modifier = Modifier, viewModel: LocalVaultViewModel = hiltViewModel()) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() - Text(uiState.value) + Column { + for(storage in uiState.storagesList) { + Text(storage.uuid.toString()) + } + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultScreenState.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultScreenState.kt index 6bd8433..cabc6c8 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultScreenState.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultScreenState.kt @@ -1,3 +1,5 @@ package com.github.nullptroma.wallenc.presentation.screens.main.screens.local.vault -data class LocalVaultScreenState(val value: String) \ No newline at end of file +import com.github.nullptroma.wallenc.domain.models.IStorage + +data class LocalVaultScreenState(val storagesList: List) \ No newline at end of file diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultViewModel.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultViewModel.kt index d8f7c1b..61f2510 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultViewModel.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultViewModel.kt @@ -1,11 +1,22 @@ package com.github.nullptroma.wallenc.presentation.screens.main.screens.local.vault +import androidx.lifecycle.viewModelScope +import com.github.nullptroma.wallenc.domain.usecases.GetAllRawStoragesUseCase import com.github.nullptroma.wallenc.presentation.viewmodel.ViewModelBase import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -class LocalVaultViewModel @Inject constructor() - : ViewModelBase(LocalVaultScreenState("default")) { - +class LocalVaultViewModel @Inject constructor(private val getAllRawStoragesUseCase: GetAllRawStoragesUseCase) : + ViewModelBase(LocalVaultScreenState(listOf())) { + init { + viewModelScope.launch { + getAllRawStoragesUseCase.localStorage.storages.collect { + mutableUiState.value = mutableUiState.value.copy( + storagesList = it + ) + } + } + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/remotes/RemoteVaultsScreenState.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/remotes/RemoteVaultsScreenState.kt index 77ca567..3794eb6 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/remotes/RemoteVaultsScreenState.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/remotes/RemoteVaultsScreenState.kt @@ -1,3 +1,3 @@ package com.github.nullptroma.wallenc.presentation.screens.main.screens.remotes -data class RemoteVaultsScreenState(val value: String) \ No newline at end of file +class RemoteVaultsScreenState \ No newline at end of file diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/remotes/RemoteVaultsViewModel.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/remotes/RemoteVaultsViewModel.kt index abbe5bf..e556f69 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/remotes/RemoteVaultsViewModel.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/remotes/RemoteVaultsViewModel.kt @@ -6,6 +6,6 @@ import javax.inject.Inject @HiltViewModel class RemoteVaultsViewModel @Inject constructor() : - ViewModelBase(RemoteVaultsScreenState("")) { + ViewModelBase(RemoteVaultsScreenState()) { } \ No newline at end of file diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/settings/SettingsScreenState.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/settings/SettingsScreenState.kt index 38832d1..8c4b244 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/settings/SettingsScreenState.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/settings/SettingsScreenState.kt @@ -1,3 +1,3 @@ package com.github.nullptroma.wallenc.presentation.screens.settings -data class SettingsScreenState(val value: String) \ No newline at end of file +class SettingsScreenState \ No newline at end of file diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/settings/SettingsViewModel.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/settings/SettingsViewModel.kt index 0cdc3bb..658e01c 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/settings/SettingsViewModel.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/settings/SettingsViewModel.kt @@ -5,5 +5,5 @@ import dagger.hilt.android.lifecycle.HiltViewModel @HiltViewModel class SettingsViewModel @javax.inject.Inject constructor() : - ViewModelBase(SettingsScreenState("default string")) { + ViewModelBase(SettingsScreenState()) { } \ No newline at end of file diff --git a/wallenc-uml.gaphor b/wallenc-uml.gaphor index 1d955c1..d76cc4b 100644 --- a/wallenc-uml.gaphor +++ b/wallenc-uml.gaphor @@ -2492,7 +2492,7 @@ existing classes or even new classes with specific responsibilities. localVault -StateFlow<IVault> +IVault