Skip to content
This repository was archived by the owner on Mar 26, 2026. It is now read-only.

Commit b081132

Browse files
committed
Reorganize wallet details screen code
1 parent 5a9d54f commit b081132

21 files changed

Lines changed: 413 additions & 214 deletions

File tree

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,21 @@
11
package com.gemwallet.android.data.coordinates.di
22

3+
import com.gemwallet.android.application.PasswordStore
4+
import com.gemwallet.android.application.wallet.coordinators.DeleteWallet
5+
import com.gemwallet.android.application.wallet.coordinators.GetWalletDetails
6+
import com.gemwallet.android.application.wallet.coordinators.GetWalletSecretData
7+
import com.gemwallet.android.application.wallet.coordinators.SetWalletName
38
import com.gemwallet.android.application.wallet.coordinators.WalletIdGenerator
9+
import com.gemwallet.android.blockchain.operators.DeleteKeyStoreOperator
10+
import com.gemwallet.android.blockchain.operators.LoadPrivateDataOperator
11+
import com.gemwallet.android.cases.device.SyncSubscription
12+
import com.gemwallet.android.data.coordinates.wallet.DeleteWalletImpl
13+
import com.gemwallet.android.data.coordinates.wallet.GetWalletDetailsImpl
14+
import com.gemwallet.android.data.coordinates.wallet.GetWalletSecretDataImpl
15+
import com.gemwallet.android.data.coordinates.wallet.SetWalletNameImpl
416
import com.gemwallet.android.data.coordinates.wallet.WalletIdGeneratorImpl
5-
import com.gemwallet.android.data.repositoreis.transactions.TransactionRepository
17+
import com.gemwallet.android.data.repositoreis.session.SessionRepository
18+
import com.gemwallet.android.data.repositoreis.wallets.WalletsRepository
619
import dagger.Module
720
import dagger.Provides
821
import dagger.hilt.InstallIn
@@ -14,9 +27,47 @@ import javax.inject.Singleton
1427
object WalletModule {
1528
@Provides
1629
@Singleton
17-
fun provideWalletIdGenerator(
18-
transactionRepository: TransactionRepository,
19-
): WalletIdGenerator {
30+
fun provideWalletIdGenerator(): WalletIdGenerator {
2031
return WalletIdGeneratorImpl()
2132
}
33+
34+
@Provides
35+
@Singleton
36+
fun provideGetWalletDetails(
37+
walletsRepository: WalletsRepository
38+
): GetWalletDetails {
39+
return GetWalletDetailsImpl(walletsRepository)
40+
}
41+
42+
@Provides
43+
@Singleton
44+
fun provideSetWalletName(
45+
walletsRepository: WalletsRepository
46+
): SetWalletName {
47+
return SetWalletNameImpl(walletsRepository)
48+
}
49+
50+
@Provides
51+
@Singleton
52+
fun provideGetWalletSecretData(
53+
walletsRepository: WalletsRepository,
54+
passwordStore: PasswordStore,
55+
loadPrivateDataOperator: LoadPrivateDataOperator,
56+
): GetWalletSecretData {
57+
return GetWalletSecretDataImpl(
58+
walletsRepository = walletsRepository,
59+
passwordStore = passwordStore,
60+
loadPrivateDataOperator = loadPrivateDataOperator,
61+
)
62+
}
63+
64+
@Provides
65+
fun provideDeleteWallet(
66+
sessionRepository: SessionRepository,
67+
walletsRepository: WalletsRepository,
68+
deleteKeyStoreOperator: DeleteKeyStoreOperator,
69+
syncSubscription: SyncSubscription,
70+
): DeleteWallet {
71+
return DeleteWalletImpl(sessionRepository, walletsRepository, deleteKeyStoreOperator, syncSubscription)
72+
}
2273
}

data/repositories/src/main/kotlin/com/gemwallet/android/data/repositoreis/wallets/DeleteWalletOperator.kt renamed to data/coordinators/src/main/kotlin/com/gemwallet/android/data/coordinates/wallet/DeleteWalletImpl.kt

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
package com.gemwallet.android.data.repositoreis.wallets
1+
package com.gemwallet.android.data.coordinates.wallet
22

3+
import com.gemwallet.android.application.wallet.coordinators.DeleteWallet
34
import com.gemwallet.android.blockchain.operators.DeleteKeyStoreOperator
45
import com.gemwallet.android.cases.device.SyncSubscription
5-
import com.gemwallet.android.cases.wallet.DeleteWallet
66
import com.gemwallet.android.data.repositoreis.session.SessionRepository
7+
import com.gemwallet.android.data.repositoreis.wallets.WalletsRepository
78
import com.wallet.core.primitives.WalletType
89
import kotlinx.coroutines.Dispatchers
910
import kotlinx.coroutines.async
@@ -13,40 +14,44 @@ import javax.inject.Inject
1314
import javax.inject.Singleton
1415

1516
@Singleton
16-
class DeleteWalletOperator @Inject constructor(
17+
class DeleteWalletImpl @Inject constructor(
1718
private val sessionRepository: SessionRepository,
1819
private val walletsRepository: WalletsRepository,
1920
private val deleteKeyStoreOperator: DeleteKeyStoreOperator,
2021
private val syncSubscription: SyncSubscription,
2122
) : DeleteWallet {
2223

2324
override suspend fun deleteWallet(
24-
currentWalletId: String?,
2525
walletId: String,
2626
onBoard: () -> Unit,
2727
onComplete: () -> Unit
28-
) = withContext(Dispatchers.IO) {
29-
val wallets = walletsRepository.getAll().firstOrNull()?.filter { it.id != walletId } ?: emptyList()
30-
async { walletsRepository.getAll().firstOrNull()?.let { syncSubscription.syncSubscription(it) } }
31-
28+
) = withContext(Dispatchers.IO) { // TODO: Switch context to sync device state and doesn't wait it. Find more correct solution
3229
val wallet = walletsRepository.getWallet(walletId).firstOrNull() ?: return@withContext
30+
val currentWalletId = sessionRepository.session().firstOrNull()?.wallet?.id
31+
3332
if (!walletsRepository.removeWallet(walletId = walletId)) {
3433
return@withContext
3534
}
3635
if (wallet.type != WalletType.View) {
37-
if (!deleteKeyStoreOperator(walletId)) {
38-
return@withContext
39-
}
36+
if (!deleteKeyStoreOperator(walletId)) return@withContext
37+
}
38+
39+
async {
40+
walletsRepository.getAll().firstOrNull()
41+
?.let { syncSubscription.syncSubscription(it) }
4042
}
4143

4244
val callback: () -> Unit = if (currentWalletId == walletId) {
43-
val wallet = wallets.sortedBy { it.type }.minByOrNull { it.index }
45+
val nextWallet = walletsRepository.getAll().firstOrNull()
46+
?.filter { it.id != walletId }
47+
?.sortedBy { it.type }
48+
?.minByOrNull { it.index }
4449

45-
if (wallet == null) {
50+
if (nextWallet == null) {
4651
sessionRepository.reset()
4752
onBoard
4853
} else {
49-
sessionRepository.setWallet(wallet)
54+
sessionRepository.setWallet(nextWallet)
5055
onComplete
5156
}
5257
} else {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.gemwallet.android.data.coordinates.wallet
2+
3+
import androidx.compose.runtime.Stable
4+
import com.gemwallet.android.application.wallet.coordinators.GetWalletDetails
5+
import com.gemwallet.android.data.repositoreis.wallets.WalletsRepository
6+
import com.gemwallet.android.domains.wallet.aggregates.WalletDetailsAggregate
7+
import com.wallet.core.primitives.Wallet
8+
import com.wallet.core.primitives.WalletType
9+
import kotlinx.coroutines.ExperimentalCoroutinesApi
10+
import kotlinx.coroutines.flow.Flow
11+
import kotlinx.coroutines.flow.mapLatest
12+
13+
@OptIn(ExperimentalCoroutinesApi::class)
14+
class GetWalletDetailsImpl(
15+
private val walletsRepository: WalletsRepository
16+
) : GetWalletDetails {
17+
18+
override fun getWallet(walletId: String): Flow<WalletDetailsAggregate?> {
19+
return walletsRepository.getWallet(walletId)
20+
.mapLatest { dto -> dto?.let { WalletDetailsAggregateImpl(it) } }
21+
}
22+
}
23+
24+
@Stable
25+
class WalletDetailsAggregateImpl(wallet: Wallet) : WalletDetailsAggregate {
26+
override val id: String = wallet.id
27+
override val name: String = wallet.name
28+
override val type: WalletType = wallet.type
29+
override val addresses: List<String> = wallet.accounts.map { it.address }
30+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.gemwallet.android.data.coordinates.wallet
2+
3+
import androidx.compose.runtime.Stable
4+
import com.gemwallet.android.application.PasswordStore
5+
import com.gemwallet.android.application.wallet.coordinators.GetWalletSecretData
6+
import com.gemwallet.android.blockchain.operators.LoadPrivateDataOperator
7+
import com.gemwallet.android.data.repositoreis.wallets.WalletsRepository
8+
import com.gemwallet.android.domains.wallet.values.WalletSecretDataValue
9+
import kotlinx.coroutines.ExperimentalCoroutinesApi
10+
import kotlinx.coroutines.flow.Flow
11+
import kotlinx.coroutines.flow.mapLatest
12+
13+
@OptIn(ExperimentalCoroutinesApi::class)
14+
class GetWalletSecretDataImpl(
15+
private val walletsRepository: WalletsRepository,
16+
private val passwordStore: PasswordStore,
17+
private val loadPrivateDataOperator: LoadPrivateDataOperator,
18+
) : GetWalletSecretData {
19+
20+
override fun getSecretData(walletId: String): Flow<WalletSecretDataValue> {
21+
return walletsRepository.getWallet(walletId).mapLatest { wallet ->
22+
val data = try {
23+
wallet?.let {
24+
val password = passwordStore.getPassword(wallet.id)
25+
val phrase = loadPrivateDataOperator(wallet, password)
26+
phrase
27+
}
28+
} catch (_: Throwable) {
29+
null
30+
}?.split(" ") ?: emptyList()
31+
WalletSecretDataValueImpl(data)
32+
}
33+
}
34+
}
35+
36+
@Stable
37+
class WalletSecretDataValueImpl(override val data: List<String>) : WalletSecretDataValue {
38+
override fun phrase(): List<String> {
39+
return data.takeIf { data.size >= 12 } ?: emptyList()
40+
}
41+
42+
override fun privateKey(): String? {
43+
return data.takeIf { data.size == 1 }?.firstOrNull()
44+
}
45+
46+
override fun toString(): String = data.joinToString(" ")
47+
48+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.gemwallet.android.data.coordinates.wallet
2+
3+
import com.gemwallet.android.application.wallet.coordinators.SetWalletName
4+
import com.gemwallet.android.data.repositoreis.wallets.WalletsRepository
5+
import kotlinx.coroutines.flow.firstOrNull
6+
7+
class SetWalletNameImpl(
8+
private val walletsRepository: WalletsRepository
9+
) : SetWalletName {
10+
11+
override suspend fun setWalletName(walletId: String, name: String) {
12+
val wallet = walletsRepository.getWallet(walletId).firstOrNull() ?: return
13+
walletsRepository.updateWallet(wallet.copy(name = name))
14+
}
15+
16+
}

data/repositories/src/main/kotlin/com/gemwallet/android/data/repositoreis/assets/PriceWebSocketClient.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ import io.ktor.client.plugins.websocket.WebSockets
2525
import io.ktor.client.plugins.websocket.receiveDeserialized
2626
import io.ktor.client.plugins.websocket.sendSerialized
2727
import io.ktor.client.plugins.websocket.wss
28-
import io.ktor.client.request.request
2928
import io.ktor.http.HttpMethod
30-
import io.ktor.http.headers
3129
import io.ktor.serialization.kotlinx.KotlinxWebsocketSerializationConverter
3230
import kotlinx.coroutines.CoroutineScope
3331
import kotlinx.coroutines.Dispatchers

data/repositories/src/main/kotlin/com/gemwallet/android/data/repositoreis/di/WalletsModule.kt

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.gemwallet.android.data.repositoreis.di
22

3-
import com.gemwallet.android.blockchain.operators.DeleteKeyStoreOperator
4-
import com.gemwallet.android.cases.device.SyncSubscription
5-
import com.gemwallet.android.cases.wallet.DeleteWallet
6-
import com.gemwallet.android.data.repositoreis.session.SessionRepository
7-
import com.gemwallet.android.data.repositoreis.wallets.DeleteWalletOperator
3+
import com.gemwallet.android.application.wallet.coordinators.WalletIdGenerator
4+
import com.gemwallet.android.blockchain.operators.CreateAccountOperator
85
import com.gemwallet.android.data.repositoreis.wallets.WalletsRepository
6+
import com.gemwallet.android.data.repositoreis.wallets.WalletsRepositoryImpl
7+
import com.gemwallet.android.data.service.store.database.AccountsDao
8+
import com.gemwallet.android.data.service.store.database.WalletsDao
99
import dagger.Module
1010
import dagger.Provides
1111
import dagger.hilt.InstallIn
@@ -16,13 +16,18 @@ import dagger.hilt.components.SingletonComponent
1616
object WalletsModule {
1717

1818
@Provides
19-
fun provideDeleteWallet(
20-
sessionRepository: SessionRepository,
21-
walletsRepository: WalletsRepository,
22-
deleteKeyStoreOperator: DeleteKeyStoreOperator,
23-
syncSubscription: SyncSubscription,
24-
): DeleteWallet {
25-
return DeleteWalletOperator(sessionRepository, walletsRepository, deleteKeyStoreOperator, syncSubscription)
19+
fun provideWalletsRepository(
20+
walletsDao: WalletsDao,
21+
accountsDao: AccountsDao,
22+
createAccountOperator: CreateAccountOperator,
23+
walletIdGenerator: WalletIdGenerator,
24+
): WalletsRepository {
25+
return WalletsRepositoryImpl(
26+
walletsDao = walletsDao,
27+
accountsDao = accountsDao,
28+
createAccount = createAccountOperator,
29+
walletIdGenerator = walletIdGenerator,
30+
)
2631
}
2732

2833
}

0 commit comments

Comments
 (0)