From 142bcbdd113e5270da4052e77a3feddab9505d03 Mon Sep 17 00:00:00 2001 From: Evgenii Kozlov Date: Thu, 24 Oct 2019 15:35:12 +0000 Subject: [PATCH] Feature/show user name on desktop screen --- .../anytype/di/common/ComponentManager.kt | 7 ++ .../agileburo/anytype/di/feature/DesktopDi.kt | 46 +++++++++++++ .../anytype/di/main/MainComponent.kt | 2 + .../anytype/ui/desktop/DesktopFragment.kt | 23 +++++-- app/src/main/res/layout/fragment_desktop.xml | 1 - app/src/main/res/values/strings.xml | 2 + .../anytype/data/auth/repo/AuthCache.kt | 1 + .../data/auth/repo/AuthCacheDataStore.kt | 2 + .../data/auth/repo/AuthDataRepository.kt | 2 + .../anytype/data/auth/repo/AuthDataStore.kt | 2 + .../data/auth/repo/AuthRemoteDataStore.kt | 4 ++ dependencies.gradle | 2 +- .../domain/auth/repo/AuthRepository.kt | 2 + .../domain/desktop/interactor/GetAccount.kt | 22 ++++++ gradle.properties | 1 + persistence/build.gradle | 2 + .../com/agileburo/anytype/common/Config.kt | 6 +- .../com/agileburo/anytype/dao/AccountDao.kt | 2 + .../anytype/mapper/MapperExtension.kt | 11 +++ .../agileburo/anytype/model/AccountTable.kt | 3 +- .../anytype/repo/DefaultAuthCache.kt | 11 ++- .../com/agileburo/anytype/AccountDaoTest.kt | 68 +++++++++++++++++++ .../com/agileburo/anytype/MockDataFactory.kt | 64 +++++++++++++++++ presentation/build.gradle | 5 ++ .../presentation/desktop/DesktopViewModel.kt | 27 +++++++- .../desktop/DesktopViewModelFactory.kt | 16 ++++- 26 files changed, 323 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/com/agileburo/anytype/di/feature/DesktopDi.kt create mode 100644 domain/src/main/java/com/agileburo/anytype/domain/desktop/interactor/GetAccount.kt create mode 100644 persistence/src/main/java/com/agileburo/anytype/mapper/MapperExtension.kt create mode 100644 persistence/src/test/java/com/agileburo/anytype/AccountDaoTest.kt create mode 100644 persistence/src/test/java/com/agileburo/anytype/MockDataFactory.kt diff --git a/app/src/main/java/com/agileburo/anytype/di/common/ComponentManager.kt b/app/src/main/java/com/agileburo/anytype/di/common/ComponentManager.kt index 258ed0498f..d1c4cb51f9 100644 --- a/app/src/main/java/com/agileburo/anytype/di/common/ComponentManager.kt +++ b/app/src/main/java/com/agileburo/anytype/di/common/ComponentManager.kt @@ -71,6 +71,13 @@ class ComponentManager(private val main: MainComponent) { .build() } + val desktopComponent = Component { + main + .desktopComponentBuilder() + .desktopModule(DesktopModule()) + .build() + } + class Component(private val builder: () -> T) { private var instance: T? = null diff --git a/app/src/main/java/com/agileburo/anytype/di/feature/DesktopDi.kt b/app/src/main/java/com/agileburo/anytype/di/feature/DesktopDi.kt new file mode 100644 index 0000000000..da5e1b1da4 --- /dev/null +++ b/app/src/main/java/com/agileburo/anytype/di/feature/DesktopDi.kt @@ -0,0 +1,46 @@ +package com.agileburo.anytype.di.feature + +import com.agileburo.anytype.core_utils.di.scope.PerScreen +import com.agileburo.anytype.domain.auth.repo.AuthRepository +import com.agileburo.anytype.domain.desktop.interactor.GetAccount +import com.agileburo.anytype.presentation.desktop.DesktopViewModelFactory +import com.agileburo.anytype.ui.desktop.DesktopFragment +import dagger.Module +import dagger.Provides +import dagger.Subcomponent + + +@Subcomponent( + modules = [DesktopModule::class] +) +@PerScreen +interface DesktopSubComponent { + + @Subcomponent.Builder + interface Builder { + fun desktopModule(module: DesktopModule): Builder + fun build(): DesktopSubComponent + } + + fun inject(fragment: DesktopFragment) +} + +@Module +class DesktopModule { + + @Provides + @PerScreen + fun provideDesktopViewModelFactory( + getAccount: GetAccount + ): DesktopViewModelFactory = DesktopViewModelFactory( + getAccount = getAccount + ) + + @Provides + @PerScreen + fun provideGetAccountUseCase( + repository: AuthRepository + ): GetAccount = GetAccount( + repository = repository + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/agileburo/anytype/di/main/MainComponent.kt b/app/src/main/java/com/agileburo/anytype/di/main/MainComponent.kt index 3b84f73775..a47404d3a4 100644 --- a/app/src/main/java/com/agileburo/anytype/di/main/MainComponent.kt +++ b/app/src/main/java/com/agileburo/anytype/di/main/MainComponent.kt @@ -1,6 +1,7 @@ package com.agileburo.anytype.di.main import com.agileburo.anytype.di.feature.AuthSubComponent +import com.agileburo.anytype.di.feature.DesktopSubComponent import com.agileburo.anytype.di.feature.KeychainPhraseSubComponent import com.agileburo.anytype.di.feature.ProfileSubComponent import dagger.Component @@ -17,4 +18,5 @@ interface MainComponent { fun authComponentBuilder(): AuthSubComponent.Builder fun profileComponentBuilder(): ProfileSubComponent.Builder fun keychainPhraseComponentBuilder(): KeychainPhraseSubComponent.Builder + fun desktopComponentBuilder(): DesktopSubComponent.Builder } \ No newline at end of file diff --git a/app/src/main/java/com/agileburo/anytype/ui/desktop/DesktopFragment.kt b/app/src/main/java/com/agileburo/anytype/ui/desktop/DesktopFragment.kt index 54e49d5c16..877f478477 100644 --- a/app/src/main/java/com/agileburo/anytype/ui/desktop/DesktopFragment.kt +++ b/app/src/main/java/com/agileburo/anytype/ui/desktop/DesktopFragment.kt @@ -2,21 +2,35 @@ package com.agileburo.anytype.ui.desktop import android.os.Bundle import android.view.View +import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.GridLayoutManager import com.agileburo.anytype.R import com.agileburo.anytype.core_utils.ui.ViewState +import com.agileburo.anytype.di.common.componentManager import com.agileburo.anytype.presentation.desktop.DesktopView import com.agileburo.anytype.presentation.desktop.DesktopViewModel +import com.agileburo.anytype.presentation.desktop.DesktopViewModelFactory +import com.agileburo.anytype.presentation.profile.ProfileView import com.agileburo.anytype.ui.base.ViewStateFragment import kotlinx.android.synthetic.main.fragment_desktop.* +import javax.inject.Inject class DesktopFragment : ViewStateFragment>>(R.layout.fragment_desktop) { - private val vm by lazy { - ViewModelProviders.of(this).get(DesktopViewModel::class.java) + private val profileObserver = Observer { profile -> + desktopTitle.text = getString(R.string.greet, profile.name) } + private val vm by lazy { + ViewModelProviders + .of(this, factory) + .get(DesktopViewModel::class.java) + } + + @Inject + lateinit var factory: DesktopViewModelFactory + private val desktopAdapter by lazy { DesktopAdapter( data = mutableListOf(), @@ -28,6 +42,7 @@ class DesktopFragment : ViewStateFragment>>(R.layout super.onViewCreated(view, savedInstanceState) vm.state.observe(this, this) vm.navigation.observe(this, navObserver) + vm.profile.observe(this, profileObserver) vm.onViewCreated() } @@ -48,10 +63,10 @@ class DesktopFragment : ViewStateFragment>>(R.layout } override fun injectDependencies() { - // TODO + componentManager().desktopComponent.get().inject(this) } override fun releaseDependencies() { - // TODO + componentManager().desktopComponent.release() } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_desktop.xml b/app/src/main/res/layout/fragment_desktop.xml index e1458550c2..586ccce763 100644 --- a/app/src/main/res/layout/fragment_desktop.xml +++ b/app/src/main/res/layout/fragment_desktop.xml @@ -46,7 +46,6 @@ android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginTop="48dp" - android:text="Hi, Konstantin" android:textColor="@color/white" android:textSize="36sp" android:textStyle="bold" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 170937dd1b..7b576b39c6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -79,4 +79,6 @@ Do the computation of an expensive paragraph of text on a background thread: i\'ve written it down witch collapse practice feed shame open despair creek road again ice least lake tree young address brain envelope + Hi, %1$s! + diff --git a/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthCache.kt b/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthCache.kt index 3a88bceaf3..d8891e9d61 100644 --- a/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthCache.kt +++ b/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthCache.kt @@ -6,5 +6,6 @@ interface AuthCache { suspend fun saveAccount(account: AccountEntity) suspend fun saveMnemonic(mnemonic: String) suspend fun getMnemonic(): String + suspend fun getAccount(): AccountEntity suspend fun logout() } \ No newline at end of file diff --git a/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthCacheDataStore.kt b/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthCacheDataStore.kt index cf19674197..597f4635a4 100644 --- a/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthCacheDataStore.kt +++ b/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthCacheDataStore.kt @@ -47,4 +47,6 @@ class AuthCacheDataStore(private val cache: AuthCache) : AuthDataStore { override suspend fun logout() { cache.logout() } + + override suspend fun getAccount() = cache.getAccount() } \ No newline at end of file diff --git a/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthDataRepository.kt b/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthDataRepository.kt index c3ba7a6a05..2b6a6e094c 100644 --- a/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthDataRepository.kt +++ b/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthDataRepository.kt @@ -41,6 +41,8 @@ class AuthDataRepository( TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } + override suspend fun getAccount() = factory.cache.getAccount().toDomain() + override suspend fun saveMnemonic( mnemonic: String ) = factory.cache.saveMnemonic(mnemonic) diff --git a/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthDataStore.kt b/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthDataStore.kt index c97e140e6c..1e86634393 100644 --- a/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthDataStore.kt +++ b/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthDataStore.kt @@ -11,6 +11,8 @@ interface AuthDataStore { suspend fun saveAccount(account: AccountEntity) fun observeAccounts(): Flow + suspend fun getAccount(): AccountEntity + suspend fun createWallet(path: String): WalletEntity suspend fun recoverWallet(path: String, mnemonic: String) suspend fun isSignedIn(): Boolean diff --git a/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthRemoteDataStore.kt b/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthRemoteDataStore.kt index c72b0d8ce4..5ce5f34ee0 100644 --- a/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthRemoteDataStore.kt +++ b/data/src/main/java/com/agileburo/anytype/data/auth/repo/AuthRemoteDataStore.kt @@ -48,4 +48,8 @@ class AuthRemoteDataStore( override suspend fun logout() { throw UnsupportedOperationException() } + + override suspend fun getAccount(): AccountEntity { + throw UnsupportedOperationException() + } } \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle index 3ed0c8b564..5efde9cf8d 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -35,7 +35,7 @@ ext { better_link_method_version = '2.2.0' // Unit Testing - robolectric_version = '3.8' + robolectric_version = '4.3.1' junit_version = '4.12' mockito_version = '1.4.0' kluent_version = '1.14' diff --git a/domain/src/main/java/com/agileburo/anytype/domain/auth/repo/AuthRepository.kt b/domain/src/main/java/com/agileburo/anytype/domain/auth/repo/AuthRepository.kt index 013821ad9b..e6e5fe984b 100644 --- a/domain/src/main/java/com/agileburo/anytype/domain/auth/repo/AuthRepository.kt +++ b/domain/src/main/java/com/agileburo/anytype/domain/auth/repo/AuthRepository.kt @@ -11,6 +11,8 @@ interface AuthRepository { suspend fun saveAccount(account: Account) fun observeAccounts(): Flow + suspend fun getAccount(): Account + suspend fun createWallet(path: String): Wallet suspend fun recoverWallet(path: String, mnemonic: String) suspend fun isSignedIn(): Boolean diff --git a/domain/src/main/java/com/agileburo/anytype/domain/desktop/interactor/GetAccount.kt b/domain/src/main/java/com/agileburo/anytype/domain/desktop/interactor/GetAccount.kt new file mode 100644 index 0000000000..722d259928 --- /dev/null +++ b/domain/src/main/java/com/agileburo/anytype/domain/desktop/interactor/GetAccount.kt @@ -0,0 +1,22 @@ +package com.agileburo.anytype.domain.desktop.interactor + +import com.agileburo.anytype.domain.auth.model.Account +import com.agileburo.anytype.domain.auth.repo.AuthRepository +import com.agileburo.anytype.domain.base.BaseUseCase +import com.agileburo.anytype.domain.base.Either + +/** Use case for getting currently selected user account. + * @property repository repository containing user account + */ +class GetAccount( + private val repository: AuthRepository +) : BaseUseCase() { + + override suspend fun run(params: None) = try { + repository.getAccount().let { + Either.Right(it) + } + } catch (t: Throwable) { + Either.Left(t) + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 23339e0df6..81062b246d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,3 +19,4 @@ android.useAndroidX=true android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official +android.enableUnitTestBinaryResources=true \ No newline at end of file diff --git a/persistence/build.gradle b/persistence/build.gradle index 659133e4fa..21c74835e6 100644 --- a/persistence/build.gradle +++ b/persistence/build.gradle @@ -44,4 +44,6 @@ dependencies { testImplementation unitTestDependencies.junit testImplementation unitTestDependencies.kotlinTest testImplementation unitTestDependencies.mockito + testImplementation unitTestDependencies.robolectric + testImplementation unitTestDependencies.archCoreTesting } \ No newline at end of file diff --git a/persistence/src/main/java/com/agileburo/anytype/common/Config.kt b/persistence/src/main/java/com/agileburo/anytype/common/Config.kt index bc37b212cb..deb7f8dec6 100644 --- a/persistence/src/main/java/com/agileburo/anytype/common/Config.kt +++ b/persistence/src/main/java/com/agileburo/anytype/common/Config.kt @@ -4,5 +4,9 @@ object Config { const val DATABASE_NAME = "AnytypeDatabase" const val ACCOUNT_TABLE_NAME = "Accounts" - const val CLEAR_ACCOUNT_TABLE = "DELETE FROM $ACCOUNT_TABLE_NAME" + const val CLEAR_ACCOUNT_TABLE = + "DELETE FROM $ACCOUNT_TABLE_NAME" + + const val QUERY_LAST_ACCOUNT = + "SELECT * FROM $ACCOUNT_TABLE_NAME ORDER BY timestamp DESC LIMIT 1" } \ No newline at end of file diff --git a/persistence/src/main/java/com/agileburo/anytype/dao/AccountDao.kt b/persistence/src/main/java/com/agileburo/anytype/dao/AccountDao.kt index 26cef0bb9c..a3466d3c52 100644 --- a/persistence/src/main/java/com/agileburo/anytype/dao/AccountDao.kt +++ b/persistence/src/main/java/com/agileburo/anytype/dao/AccountDao.kt @@ -11,4 +11,6 @@ abstract class AccountDao : BaseDao { @Query(Config.CLEAR_ACCOUNT_TABLE) abstract suspend fun clear() + @Query(Config.QUERY_LAST_ACCOUNT) + abstract suspend fun lastAccount(): List } \ No newline at end of file diff --git a/persistence/src/main/java/com/agileburo/anytype/mapper/MapperExtension.kt b/persistence/src/main/java/com/agileburo/anytype/mapper/MapperExtension.kt new file mode 100644 index 0000000000..e10e8ab8ce --- /dev/null +++ b/persistence/src/main/java/com/agileburo/anytype/mapper/MapperExtension.kt @@ -0,0 +1,11 @@ +package com.agileburo.anytype.mapper + +import com.agileburo.anytype.data.auth.model.AccountEntity +import com.agileburo.anytype.model.AccountTable + +fun AccountTable.toEntity(): AccountEntity { + return AccountEntity( + id = id, + name = name + ) +} \ No newline at end of file diff --git a/persistence/src/main/java/com/agileburo/anytype/model/AccountTable.kt b/persistence/src/main/java/com/agileburo/anytype/model/AccountTable.kt index 0b2bba8de5..8ede474c2a 100644 --- a/persistence/src/main/java/com/agileburo/anytype/model/AccountTable.kt +++ b/persistence/src/main/java/com/agileburo/anytype/model/AccountTable.kt @@ -7,5 +7,6 @@ import com.agileburo.anytype.common.Config @Entity(tableName = Config.ACCOUNT_TABLE_NAME) data class AccountTable( @PrimaryKey val id: String, - val name: String + val name: String, + val timestamp: Long ) \ No newline at end of file diff --git a/persistence/src/main/java/com/agileburo/anytype/repo/DefaultAuthCache.kt b/persistence/src/main/java/com/agileburo/anytype/repo/DefaultAuthCache.kt index 856b4ced59..1b38163cae 100644 --- a/persistence/src/main/java/com/agileburo/anytype/repo/DefaultAuthCache.kt +++ b/persistence/src/main/java/com/agileburo/anytype/repo/DefaultAuthCache.kt @@ -4,6 +4,7 @@ import android.content.SharedPreferences import com.agileburo.anytype.data.auth.model.AccountEntity import com.agileburo.anytype.data.auth.repo.AuthCache import com.agileburo.anytype.db.AnytypeDatabase +import com.agileburo.anytype.mapper.toEntity import com.agileburo.anytype.model.AccountTable import timber.log.Timber @@ -16,11 +17,19 @@ class DefaultAuthCache( db.accountDao().insert( AccountTable( id = account.id, - name = account.name + name = account.name, + timestamp = System.currentTimeMillis() ) ) } + override suspend fun getAccount() = db.accountDao().lastAccount().let { list -> + if (list.isEmpty()) + throw IllegalStateException("Could not found user account") + else + list.first().toEntity() + } + override suspend fun saveMnemonic(mnemonic: String) { Timber.d("Saving mnemonic: $mnemonic") prefs.edit().putString(MNEMONIC_KEY, mnemonic).apply() diff --git a/persistence/src/test/java/com/agileburo/anytype/AccountDaoTest.kt b/persistence/src/test/java/com/agileburo/anytype/AccountDaoTest.kt new file mode 100644 index 0000000000..235d45e36d --- /dev/null +++ b/persistence/src/test/java/com/agileburo/anytype/AccountDaoTest.kt @@ -0,0 +1,68 @@ +package com.agileburo.anytype + +import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import androidx.room.Room +import androidx.test.platform.app.InstrumentationRegistry +import com.agileburo.anytype.db.AnytypeDatabase +import com.agileburo.anytype.model.AccountTable +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking +import org.junit.After +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +import kotlin.test.assertTrue + +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE) +class AccountDaoTest { + + @get:Rule + val instantTaskExecutorRule = InstantTaskExecutorRule() + + private val database = Room.inMemoryDatabaseBuilder( + InstrumentationRegistry.getInstrumentation().context, + AnytypeDatabase::class.java + ).allowMainThreadQueries().build() + + @After + fun after() { + database.close() + } + + @Test + fun `should return empty list if there are no last account in db`() { + runBlocking { + val accounts = database.accountDao().lastAccount() + assertTrue { accounts.isEmpty() } + } + } + + @Test + fun `should return last account`() = runBlocking { + + val firstAccount = AccountTable( + id = MockDataFactory.randomString(), + name = MockDataFactory.randomString(), + timestamp = System.currentTimeMillis() + ) + + delay(1) + + val secondAccount = AccountTable( + id = MockDataFactory.randomString(), + name = MockDataFactory.randomString(), + timestamp = System.currentTimeMillis() + ) + + database.accountDao().insert(firstAccount) + database.accountDao().insert(secondAccount) + + val result = database.accountDao().lastAccount() + + assertTrue { result.size == 1 } + assertTrue { result.first() == secondAccount } + } +} \ No newline at end of file diff --git a/persistence/src/test/java/com/agileburo/anytype/MockDataFactory.kt b/persistence/src/test/java/com/agileburo/anytype/MockDataFactory.kt new file mode 100644 index 0000000000..4e797d66d1 --- /dev/null +++ b/persistence/src/test/java/com/agileburo/anytype/MockDataFactory.kt @@ -0,0 +1,64 @@ +package com.agileburo.anytype + +import java.util.* +import java.util.concurrent.ThreadLocalRandom + +object MockDataFactory { + + fun randomUuid(): String { + return UUID.randomUUID().toString() + } + + fun randomString(): String { + return randomUuid() + } + + + fun randomInt(): Int { + return ThreadLocalRandom.current().nextInt(0, 1000 + 1) + } + + fun randomInt(max: Int): Int { + return ThreadLocalRandom.current().nextInt(0, max) + } + + fun randomLong(): Long { + return randomInt().toLong() + } + + fun randomFloat(): Float { + return randomInt().toFloat() + } + + fun randomDouble(): Double { + return randomInt().toDouble() + } + + fun randomBoolean(): Boolean { + return Math.random() < 0.5 + } + + fun makeIntList(count: Int): List { + val items = mutableListOf() + repeat(count) { + items.add(randomInt()) + } + return items + } + + fun makeStringList(count: Int): List { + val items = mutableListOf() + repeat(count) { + items.add(randomUuid()) + } + return items + } + + fun makeDoubleList(count: Int): List { + val items = mutableListOf() + repeat(count) { + items.add(randomDouble()) + } + return items + } +} \ No newline at end of file diff --git a/presentation/build.gradle b/presentation/build.gradle index 6d0bd28e6d..dbf987c39f 100644 --- a/presentation/build.gradle +++ b/presentation/build.gradle @@ -12,6 +12,8 @@ android { targetSdkVersion config["target_sdk"] testInstrumentationRunner config["test_runner"] } + + testOptions.unitTests.includeAndroidResources = true } dependencies { @@ -38,4 +40,7 @@ dependencies { testImplementation unitTestDependencies.coroutineTesting testImplementation unitTestDependencies.liveDataTesting testImplementation unitTestDependencies.archCoreTesting + + androidTestImplementation 'androidx.test:core:1.2.0' + } diff --git a/presentation/src/main/java/com/agileburo/anytype/presentation/desktop/DesktopViewModel.kt b/presentation/src/main/java/com/agileburo/anytype/presentation/desktop/DesktopViewModel.kt index 912d6e1232..d7e7918fc7 100644 --- a/presentation/src/main/java/com/agileburo/anytype/presentation/desktop/DesktopViewModel.kt +++ b/presentation/src/main/java/com/agileburo/anytype/presentation/desktop/DesktopViewModel.kt @@ -1,17 +1,42 @@ package com.agileburo.anytype.presentation.desktop +import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope import com.agileburo.anytype.core_utils.common.Event import com.agileburo.anytype.core_utils.ui.ViewState import com.agileburo.anytype.core_utils.ui.ViewStateViewModel +import com.agileburo.anytype.domain.base.BaseUseCase +import com.agileburo.anytype.domain.desktop.interactor.GetAccount import com.agileburo.anytype.presentation.navigation.AppNavigation import com.agileburo.anytype.presentation.navigation.SupportNavigation +import com.agileburo.anytype.presentation.profile.ProfileView +import timber.log.Timber -class DesktopViewModel : ViewStateViewModel>>(), +class DesktopViewModel( + private val getAccount: GetAccount +) : ViewStateViewModel>>(), SupportNavigation> { + private val _profile = MutableLiveData() + val profile: LiveData + get() = _profile + + init { + proceedWithGettingAccount() + } + override val navigation = MutableLiveData>() + private fun proceedWithGettingAccount() { + getAccount.invoke(viewModelScope, BaseUseCase.None) { result -> + result.either( + fnL = { e -> Timber.e(e, "Error while getting account") }, + fnR = { account -> _profile.postValue(ProfileView(name = account.name)) } + ) + } + } + fun onViewCreated() { stateData.postValue(ViewState.Init) } diff --git a/presentation/src/main/java/com/agileburo/anytype/presentation/desktop/DesktopViewModelFactory.kt b/presentation/src/main/java/com/agileburo/anytype/presentation/desktop/DesktopViewModelFactory.kt index 91c92f64c1..307f8f7b32 100644 --- a/presentation/src/main/java/com/agileburo/anytype/presentation/desktop/DesktopViewModelFactory.kt +++ b/presentation/src/main/java/com/agileburo/anytype/presentation/desktop/DesktopViewModelFactory.kt @@ -1,3 +1,17 @@ package com.agileburo.anytype.presentation.desktop -class DesktopViewModelFactory \ No newline at end of file +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.agileburo.anytype.domain.desktop.interactor.GetAccount + +class DesktopViewModelFactory( + private val getAccount: GetAccount +) : ViewModelProvider.Factory { + + @Suppress("UNCHECKED_CAST") + override fun create(modelClass: Class): T { + return DesktopViewModel( + getAccount = getAccount + ) as T + } +} \ No newline at end of file