Skip to content

Commit d8a49ec

Browse files
committed
Merge branch 'multisig/07-creation-flow' into multisig/08-inbox-pages
* multisig/07-creation-flow: fix: Remove unused companion object from InboxLastOpenedTimeLocalSource fix: Address remaining PR #516 review comments fix: Address PR #516 review comments fix: Address PR #515 review comments fix: Remove redundant methods and use injected use cases
2 parents 816af45 + ec4acfc commit d8a49ec

File tree

21 files changed

+148
-266
lines changed

21 files changed

+148
-266
lines changed

app/src/main/kotlin/com/algorand/android/core/transaction/JointAccountTransactionSignHelper.kt

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -138,20 +138,16 @@ class JointAccountTransactionSignHelper @Inject constructor(
138138
): ByteArray? {
139139
val signerAccount = getLocalAccount(signerAddress) ?: return null
140140
return when (signerAccount) {
141-
is LocalAccount.Algo25 -> signWithAlgo25Account(transactionBytes, signerAddress)
142-
is LocalAccount.HdKey -> signWithHdKeyAccount(transactionBytes, signerAccount)
141+
is LocalAccount.Algo25 -> {
142+
localAccountSigningHelper.signWithAlgo25AccountReturnSignature(transactionBytes, signerAddress)
143+
}
144+
is LocalAccount.HdKey -> {
145+
localAccountSigningHelper.signWithHdKeyAccountReturnSignature(transactionBytes, signerAccount)
146+
}
143147
else -> null
144148
}
145149
}
146150

147-
private suspend fun signWithAlgo25Account(transactionBytes: ByteArray, signerAddress: String): ByteArray? {
148-
return localAccountSigningHelper.signWithAlgo25AccountReturnSignature(transactionBytes, signerAddress)
149-
}
150-
151-
private suspend fun signWithHdKeyAccount(transactionBytes: ByteArray, hdKey: LocalAccount.HdKey): ByteArray? {
152-
return localAccountSigningHelper.signWithHdKeyAccountReturnSignature(transactionBytes, hdKey)
153-
}
154-
155151
private data class PreparedJointAccountData(
156152
val jointAccount: LocalAccount.Joint,
157153
val proposerAddress: String,

app/src/main/kotlin/com/algorand/android/modules/accountdetail/jointaccountdetail/domain/usecase/CreateJointAccountParticipantItem.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ package com.algorand.android.modules.accountdetail.jointaccountdetail.domain.use
1515
import com.algorand.android.modules.accountdetail.jointaccountdetail.ui.model.JointAccountParticipantItem
1616

1717
interface CreateJointAccountParticipantItem {
18-
suspend operator fun invoke(address: String, localAccountAddresses: List<String>): JointAccountParticipantItem
18+
suspend operator fun invoke(address: String): JointAccountParticipantItem
1919
}

app/src/main/kotlin/com/algorand/android/modules/accountdetail/jointaccountdetail/domain/usecase/CreateJointAccountParticipantItemUseCase.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,20 @@ import com.algorand.android.modules.accountcore.ui.usecase.GetAccountDisplayName
1717
import com.algorand.android.modules.accountcore.ui.usecase.GetAccountIconDrawablePreview
1818
import com.algorand.android.modules.accountdetail.jointaccountdetail.ui.model.JointAccountParticipantItem
1919
import com.algorand.android.repository.ContactRepository
20+
import com.algorand.wallet.account.local.domain.usecase.GetLocalAccountsAddresses
2021
import javax.inject.Inject
2122

2223
internal class CreateJointAccountParticipantItemUseCase @Inject constructor(
2324
private val getAccountDisplayName: GetAccountDisplayName,
2425
private val getAccountIconDrawablePreview: GetAccountIconDrawablePreview,
25-
private val contactRepository: ContactRepository
26+
private val contactRepository: ContactRepository,
27+
private val getLocalAccountsAddresses: GetLocalAccountsAddresses
2628
) : CreateJointAccountParticipantItem {
2729

28-
override suspend operator fun invoke(
29-
address: String,
30-
localAccountAddresses: List<String>
31-
): JointAccountParticipantItem {
30+
override suspend operator fun invoke(address: String): JointAccountParticipantItem {
3231
val displayName = getAccountDisplayName(address)
3332
val iconDrawablePreview = getAccountIconDrawablePreview(address)
33+
val localAccountAddresses = getLocalAccountsAddresses()
3434
val isLocalAccount = address in localAccountAddresses
3535
val contact = contactRepository.getContactByAddress(address)
3636
val imageUri = contact?.imageUriAsString?.let { Uri.parse(it) }

app/src/main/kotlin/com/algorand/android/modules/accountdetail/jointaccountdetail/ui/JointAccountDetailFragment.kt

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import com.algorand.android.utils.extensions.collectLatestOnLifecycle
2929
import dagger.hilt.android.AndroidEntryPoint
3030

3131
@AndroidEntryPoint
32-
class JointAccountDetailFragment : DaggerBaseFragment(0) {
32+
class JointAccountDetailFragment : DaggerBaseFragment(0), JointAccountDetailListener {
3333

3434
private val viewModel: JointAccountDetailViewModel by viewModels()
3535

@@ -46,19 +46,29 @@ class JointAccountDetailFragment : DaggerBaseFragment(0) {
4646
JointAccountDetailScreen(
4747
viewState = viewState,
4848
accountAddress = viewModel.accountAddress,
49-
onEvent = ::handleEvent
49+
listener = this@JointAccountDetailFragment
5050
)
5151
}
5252
}
5353

54-
private fun handleEvent(event: JointAccountDetailEvent) {
55-
when (event) {
56-
is JointAccountDetailEvent.BackClick -> navBack()
57-
is JointAccountDetailEvent.EditAddressClick -> viewModel.onEditContactClick(event.address)
58-
is JointAccountDetailEvent.CopyAddressClick -> onAccountAddressCopied(event.address)
59-
is JointAccountDetailEvent.IgnoreClick -> viewModel.onIgnoreClick()
60-
is JointAccountDetailEvent.AddClick -> viewModel.onAddClick()
61-
}
54+
override fun onBackClick() {
55+
navBack()
56+
}
57+
58+
override fun onEditAddressClick(address: String) {
59+
viewModel.onEditContactClick(address)
60+
}
61+
62+
override fun onCopyAddressClick(address: String) {
63+
onAccountAddressCopied(address)
64+
}
65+
66+
override fun onIgnoreClick() {
67+
viewModel.onIgnoreClick()
68+
}
69+
70+
override fun onAddClick() {
71+
viewModel.onAddClick()
6272
}
6373

6474
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

app/src/main/kotlin/com/algorand/android/modules/accountdetail/jointaccountdetail/ui/JointAccountDetailEvent.kt renamed to app/src/main/kotlin/com/algorand/android/modules/accountdetail/jointaccountdetail/ui/JointAccountDetailListener.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212

1313
package com.algorand.android.modules.accountdetail.jointaccountdetail.ui
1414

15-
sealed interface JointAccountDetailEvent {
16-
data object BackClick : JointAccountDetailEvent
17-
data class EditAddressClick(val address: String) : JointAccountDetailEvent
18-
data class CopyAddressClick(val address: String) : JointAccountDetailEvent
19-
data object IgnoreClick : JointAccountDetailEvent
20-
data object AddClick : JointAccountDetailEvent
15+
interface JointAccountDetailListener {
16+
fun onBackClick()
17+
fun onEditAddressClick(address: String)
18+
fun onCopyAddressClick(address: String)
19+
fun onIgnoreClick()
20+
fun onAddClick()
2121
}

app/src/main/kotlin/com/algorand/android/modules/accountdetail/jointaccountdetail/ui/JointAccountDetailScreen.kt

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ import com.algorand.android.utils.toShortenedAddress
5858
fun JointAccountDetailScreen(
5959
viewState: ViewState,
6060
accountAddress: String,
61-
onEvent: (JointAccountDetailEvent) -> Unit
61+
listener: JointAccountDetailListener
6262
) {
6363
Column(
6464
modifier = Modifier
@@ -68,17 +68,17 @@ fun JointAccountDetailScreen(
6868
ScreenHeader(
6969
viewState = viewState,
7070
accountAddress = accountAddress,
71-
onEvent = onEvent
71+
listener = listener
7272
)
73-
ScreenContent(viewState = viewState, onEvent = onEvent)
73+
ScreenContent(viewState = viewState, listener = listener)
7474
}
7575
}
7676

7777
@Composable
7878
private fun ScreenHeader(
7979
viewState: ViewState,
8080
accountAddress: String,
81-
onEvent: (JointAccountDetailEvent) -> Unit
81+
listener: JointAccountDetailListener
8282
) {
8383
val displayName = when (viewState) {
8484
is ViewState.Content -> viewState.accountDisplayName.ifBlank {
@@ -101,7 +101,7 @@ private fun ScreenHeader(
101101
startContainer = {
102102
PeraToolbarIcon(
103103
iconResId = R.drawable.ic_left_arrow,
104-
modifier = Modifier.clickableNoRipple(onClick = { onEvent(JointAccountDetailEvent.BackClick) })
104+
modifier = Modifier.clickableNoRipple(onClick = { listener.onBackClick() })
105105
)
106106
}
107107
)
@@ -110,11 +110,11 @@ private fun ScreenHeader(
110110
@Composable
111111
private fun ColumnScope.ScreenContent(
112112
viewState: ViewState,
113-
onEvent: (JointAccountDetailEvent) -> Unit
113+
listener: JointAccountDetailListener
114114
) {
115115
when (viewState) {
116116
is ViewState.Loading -> LoadingState()
117-
is ViewState.Content -> ContentState(contentState = viewState, onEvent = onEvent)
117+
is ViewState.Content -> ContentState(contentState = viewState, listener = listener)
118118
is ViewState.Error -> ErrorState(errorType = viewState.type)
119119
}
120120
}
@@ -154,7 +154,7 @@ private fun ColumnScope.ErrorState(errorType: ErrorType) {
154154
@Composable
155155
private fun ColumnScope.ContentState(
156156
contentState: ViewState.Content,
157-
onEvent: (JointAccountDetailEvent) -> Unit
157+
listener: JointAccountDetailListener
158158
) {
159159
Column(
160160
modifier = Modifier
@@ -166,16 +166,16 @@ private fun ColumnScope.ContentState(
166166
Spacer(modifier = Modifier.height(12.dp))
167167
InformationCard(numberOfAccounts = contentState.numberOfAccounts, threshold = contentState.threshold)
168168
Spacer(modifier = Modifier.height(32.dp))
169-
AccountsSection(accounts = contentState.participants, onEvent = onEvent)
169+
AccountsSection(accounts = contentState.participants, listener = listener)
170170
Spacer(modifier = Modifier.height(24.dp))
171171
}
172172
if (contentState.showActions) {
173-
ActionFooter(onEvent = onEvent)
173+
ActionFooter(listener = listener)
174174
}
175175
}
176176

177177
@Composable
178-
private fun ActionFooter(onEvent: (JointAccountDetailEvent) -> Unit) {
178+
private fun ActionFooter(listener: JointAccountDetailListener) {
179179
Row(
180180
modifier = Modifier
181181
.fillMaxWidth()
@@ -186,13 +186,13 @@ private fun ActionFooter(onEvent: (JointAccountDetailEvent) -> Unit) {
186186
PeraSecondaryButton(
187187
modifier = Modifier.weight(1f),
188188
text = stringResource(R.string.ignore),
189-
onClick = { onEvent(JointAccountDetailEvent.IgnoreClick) }
189+
onClick = { listener.onIgnoreClick() }
190190
)
191191

192192
PeraPrimaryButton(
193193
modifier = Modifier.weight(2f),
194194
text = stringResource(R.string.add_to_accounts),
195-
onClick = { onEvent(JointAccountDetailEvent.AddClick) }
195+
onClick = { listener.onAddClick() }
196196
)
197197
}
198198
}
@@ -279,7 +279,7 @@ private fun ThresholdRow(threshold: Int) {
279279
@Composable
280280
private fun AccountsSection(
281281
accounts: List<JointAccountParticipantItem>,
282-
onEvent: (JointAccountDetailEvent) -> Unit
282+
listener: JointAccountDetailListener
283283
) {
284284
Text(
285285
text = stringResource(R.string.accounts_with_count, accounts.size),
@@ -293,8 +293,8 @@ private fun AccountsSection(
293293
accounts.forEachIndexed { index, account ->
294294
ParticipantAccountItem(
295295
account = account,
296-
onEditClick = { onEvent(JointAccountDetailEvent.EditAddressClick(account.address)) },
297-
onCopyAddressClick = { onEvent(JointAccountDetailEvent.CopyAddressClick(account.address)) }
296+
onEditClick = { listener.onEditAddressClick(account.address) },
297+
onCopyAddressClick = { listener.onCopyAddressClick(account.address) }
298298
)
299299
if (index < accounts.size - 1) {
300300
ParticipantDivider()

app/src/main/kotlin/com/algorand/android/modules/accountdetail/jointaccountdetail/viewmodel/DefaultJointAccountDetailProcessor.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,20 @@ import com.algorand.android.modules.accountdetail.jointaccountdetail.ui.model.Jo
1818
import com.algorand.android.repository.ContactRepository
1919
import com.algorand.android.utils.toShortenedAddress
2020
import com.algorand.wallet.account.local.domain.model.LocalAccount
21-
import com.algorand.wallet.account.local.domain.usecase.GetLocalAccountsAddresses
2221
import com.algorand.wallet.deviceregistration.domain.usecase.GetSelectedNodeDeviceId
2322
import com.algorand.wallet.inbox.domain.model.InboxMessages
2423
import com.algorand.wallet.inbox.domain.repository.InboxApiRepository
2524
import com.algorand.wallet.inbox.domain.usecase.GetInboxMessages
2625
import com.algorand.wallet.jointaccount.domain.usecase.GetJointAccount
2726
import javax.inject.Inject
28-
import javax.inject.Named
2927

3028
internal class DefaultJointAccountDetailProcessor @Inject constructor(
3129
private val getJointAccount: GetJointAccount,
3230
private val getAccountDisplayName: GetAccountDisplayName,
3331
private val contactRepository: ContactRepository,
3432
private val createJointAccountParticipantItem: CreateJointAccountParticipantItem,
35-
private val getLocalAccountsAddresses: GetLocalAccountsAddresses,
3633
private val getInboxMessages: GetInboxMessages,
3734
private val getSelectedNodeDeviceId: GetSelectedNodeDeviceId,
38-
@param:Named(InboxApiRepository.INJECTION_NAME)
3935
private val inboxApiRepository: InboxApiRepository
4036
) : JointAccountDetailProcessor {
4137

@@ -84,9 +80,8 @@ internal class DefaultJointAccountDetailProcessor @Inject constructor(
8480
override suspend fun createParticipantItems(
8581
participantAddresses: List<String>
8682
): List<JointAccountParticipantItem> {
87-
val localAccountAddresses = getLocalAccountsAddresses()
8883
return participantAddresses.map { address ->
89-
createJointAccountParticipantItem(address, localAccountAddresses)
84+
createJointAccountParticipantItem(address)
9085
}
9186
}
9287

app/src/main/kotlin/com/algorand/android/modules/accountdetail/jointaccountdetail/viewmodel/JointAccountDetailViewModel.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ class JointAccountDetailViewModel @Inject constructor(
5050
}
5151

5252
fun refreshParticipants() {
53-
viewModelScope.launch {
54-
stateDelegate.onState<ViewState.Content> { contentState ->
55-
if (contentState.participants.isNotEmpty()) {
53+
stateDelegate.onState<ViewState.Content> { contentState ->
54+
if (contentState.participants.isNotEmpty()) {
55+
viewModelScope.launch {
5656
val participantAddresses = contentState.participants.map { it.address }
5757
val updatedParticipants = processor.createParticipantItems(participantAddresses)
5858
stateDelegate.updateState {

app/src/main/kotlin/com/algorand/android/modules/accounts/ui/viewmodel/AccountPreviewProcessor.kt

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import com.algorand.wallet.account.custom.domain.usecase.GetAccountsCustomInfo
3232
import com.algorand.wallet.account.detail.domain.model.AccountRegistrationType
3333
import com.algorand.wallet.account.detail.domain.model.AccountType
3434
import com.algorand.wallet.account.detail.domain.usecase.GetAccountRegistrationType
35+
import com.algorand.wallet.account.detail.domain.usecase.GetAccountType
3536
import com.algorand.wallet.account.local.domain.model.LocalAccount
3637
import com.algorand.wallet.account.local.domain.usecase.GetLocalAccount
3738
import com.algorand.wallet.account.local.domain.usecase.GetLocalAccounts
@@ -56,6 +57,7 @@ class AccountPreviewProcessor @Inject constructor(
5657
private val getLocalAccounts: GetLocalAccounts,
5758
private val getAccountsCustomInfo: GetAccountsCustomInfo,
5859
private val getAccountRegistrationType: GetAccountRegistrationType,
60+
private val getAccountType: GetAccountType,
5961
private val sortAccountsBySortingPreference: SortAccountsBySortingPreference,
6062
private val amountRendererTypeMapper: AmountRendererTypeMapper,
6163
private val getCompactPrimaryAmountRenderer: GetCompactPrimaryAmountRenderer,
@@ -121,8 +123,8 @@ class AccountPreviewProcessor @Inject constructor(
121123
val localAccounts = getLocalAccounts()
122124
val customInfos = getAccountsCustomInfo(localAccounts.map { it.algoAddress })
123125
val accountErrorItems = localAccounts
124-
.map { localAccount ->
125-
val accountType = getLocalAccountType(localAccount)
126+
.mapNotNull { localAccount ->
127+
val accountType = getAccountType(localAccount.algoAddress) ?: return@mapNotNull null
126128
val registrationType = getAccountRegistrationType(localAccount)
127129
val customInfo = customInfos[localAccount.algoAddress]
128130
val displayName = getAccountDisplayName(
@@ -202,14 +204,4 @@ class AccountPreviewProcessor @Inject constructor(
202204
)
203205
)
204206
}
205-
206-
private fun getLocalAccountType(localAccount: LocalAccount): AccountType {
207-
return when (localAccount) {
208-
is LocalAccount.Algo25 -> AccountType.Algo25
209-
is LocalAccount.LedgerBle -> AccountType.LedgerBle
210-
is LocalAccount.NoAuth -> AccountType.NoAuth
211-
is LocalAccount.HdKey -> AccountType.HdKey
212-
is LocalAccount.Joint -> AccountType.Joint
213-
}
214-
}
215207
}

app/src/main/kotlin/com/algorand/android/sharedpref/InboxLastOpenedTimeLocalSource.kt

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,14 @@
1212

1313
package com.algorand.android.sharedpref
1414

15-
import com.algorand.wallet.foundation.cache.PersistentCacheProvider
15+
import com.algorand.wallet.foundation.cache.PersistentCache
1616
import javax.inject.Inject
1717

1818
// ISO-8601 ISO_DATE_TIME
1919
class InboxLastOpenedTimeLocalSource @Inject constructor(
20-
persistentCacheProvider: PersistentCacheProvider
20+
private val cache: PersistentCache<String>
2121
) {
2222

23-
private val cache = persistentCacheProvider.getPersistentCache<String>(
24-
String::class.java,
25-
INBOX_LAST_OPENED_TIME_KEY
26-
)
27-
2823
fun getData(defaultValue: String?): String? {
2924
return cache.get() ?: defaultValue
3025
}
@@ -36,8 +31,4 @@ class InboxLastOpenedTimeLocalSource @Inject constructor(
3631
fun saveData(data: String) {
3732
cache.put(data)
3833
}
39-
40-
companion object {
41-
private const val INBOX_LAST_OPENED_TIME_KEY = "inbox_last_opened_time_key"
42-
}
4334
}

0 commit comments

Comments
 (0)