diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 35827e30..4725ed8b 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -6,8 +6,6 @@
-
-
diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/Navigation.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/Navigation.kt
index 41f9144c..e56e76c0 100644
--- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/Navigation.kt
+++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/Navigation.kt
@@ -8,6 +8,7 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import co.electriccoin.zcash.ui.NavigationTargets.ABOUT
+import co.electriccoin.zcash.ui.NavigationTargets.HISTORY
import co.electriccoin.zcash.ui.NavigationTargets.HOME
import co.electriccoin.zcash.ui.NavigationTargets.PROFILE
import co.electriccoin.zcash.ui.NavigationTargets.REQUEST
@@ -17,6 +18,7 @@ import co.electriccoin.zcash.ui.NavigationTargets.SEND
import co.electriccoin.zcash.ui.NavigationTargets.SETTINGS
import co.electriccoin.zcash.ui.NavigationTargets.SUPPORT
import co.electriccoin.zcash.ui.NavigationTargets.WALLET_ADDRESS_DETAILS
+import co.electriccoin.zcash.ui.history.WrapHistory
import co.electriccoin.zcash.ui.screen.about.WrapAbout
import co.electriccoin.zcash.ui.screen.address.WrapWalletAddresses
import co.electriccoin.zcash.ui.screen.home.WrapHome
@@ -44,7 +46,8 @@ internal fun MainActivity.Navigation() {
goScan = { navController.navigateJustOnce(SCAN) },
goProfile = { navController.navigateJustOnce(PROFILE) },
goSend = { navController.navigateJustOnce(SEND) },
- goRequest = { navController.navigateJustOnce(REQUEST) }
+ goRequest = { navController.navigateJustOnce(REQUEST) },
+ goHistory = { navController.navigateJustOnce(HISTORY) }
)
WrapCheckForUpdate()
@@ -108,6 +111,10 @@ internal fun MainActivity.Navigation() {
goBack = { navController.popBackStackJustOnce(SCAN) }
)
}
+
+ composable(HISTORY) {
+ WrapHistory(goBack = { navController.navigateUp() })
+ }
}
}
@@ -152,6 +159,8 @@ object NavigationTargets {
const val REQUEST = "request"
+ const val HISTORY = "history"
+
const val SEND = "send"
const val SUPPORT = "support"
diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/history/AndroidHistory.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/history/AndroidHistory.kt
new file mode 100644
index 00000000..8e086d91
--- /dev/null
+++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/history/AndroidHistory.kt
@@ -0,0 +1,35 @@
+package co.electriccoin.zcash.ui.history
+
+import androidx.activity.ComponentActivity
+import androidx.activity.viewModels
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import co.electriccoin.zcash.ui.MainActivity
+import co.electriccoin.zcash.ui.history.view.History
+import co.electriccoin.zcash.ui.screen.home.viewmodel.WalletViewModel
+
+@Composable
+internal fun MainActivity.WrapHistory(
+ goBack: () -> Unit
+) {
+ WrapHistory(
+ activity = this,
+ goBack = goBack
+ )
+}
+
+@Composable
+internal fun WrapHistory(
+ activity: ComponentActivity,
+ goBack: () -> Unit
+) {
+ val walletViewModel by activity.viewModels()
+
+ val transactionHistory by walletViewModel.transactionHistory.collectAsState()
+
+ History(
+ transactions = transactionHistory,
+ goBack = goBack
+ )
+}
\ No newline at end of file
diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/history/view/HistoryView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/history/view/HistoryView.kt
new file mode 100644
index 00000000..679d6e18
--- /dev/null
+++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/history/view/HistoryView.kt
@@ -0,0 +1,99 @@
+package co.electriccoin.zcash.ui.history.view
+
+import android.annotation.SuppressLint
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.ArrowBack
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Icon
+import androidx.compose.material3.IconButton
+import androidx.compose.material3.Scaffold
+import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.sp
+import cash.z.ecc.android.sdk.internal.twig
+import cash.z.ecc.android.sdk.model.TransactionOverview
+import cash.z.ecc.sdk.ext.ui.model.toZecString
+import cash.z.ecc.sdk.ext.ui.toFiatString
+import cash.z.ecc.sdk.model.CurrencyConversion
+import co.electriccoin.zcash.ui.R
+import co.electriccoin.zcash.ui.design.component.Body
+import co.electriccoin.zcash.ui.design.component.GradientSurface
+import co.electriccoin.zcash.ui.design.component.Small
+import co.electriccoin.zcash.ui.design.theme.ZcashTheme
+
+@Composable
+fun ComposablePreview() {
+ ZcashTheme(darkTheme = true) {
+ GradientSurface {
+ History(transactions = listOf(), goBack = {})
+ }
+ }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun History(
+ transactions: List,
+ goBack: () -> Unit
+) {
+ Scaffold(topBar = {
+ HistoryTopBar(onBack = goBack)
+ }) { paddingValues ->
+ LazyColumn(Modifier.padding(paddingValues)) {
+ items(transactions) {
+ TransactionHistoryItem(it)
+ }
+ }
+ }
+}
+
+@Composable
+fun TransactionHistoryItem(transaction: TransactionOverview) {
+ Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) {
+ Image(
+ painter = painterResource(id = co.electriccoin.zcash.ui.design.R.drawable.ic_dollar_currency_symbol),
+ contentDescription = "")
+ Column {
+ Body(text = "sent tx")
+ Small(text = "description", textAlign = TextAlign.Start)
+ }
+ Spacer(modifier = Modifier.weight(0.2f))
+ Column(horizontalAlignment = Alignment.End) {
+ Text(text = transaction.netValue.toZecString(), fontSize = 18.sp)
+ Body(text = transaction.feePaid.toZecString())
+ }
+ }
+}
+
+@Composable
+@OptIn(ExperimentalMaterial3Api::class)
+private fun HistoryTopBar(onBack: () -> Unit) {
+ TopAppBar(
+ title = { Text(text = stringResource(id = R.string.about_title)) },
+ navigationIcon = {
+ IconButton(
+ onClick = onBack
+ ) {
+ Icon(
+ imageVector = Icons.Filled.ArrowBack,
+ contentDescription = stringResource(R.string.about_back_content_description)
+ )
+ }
+ }
+ )
+}
\ No newline at end of file
diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/AndroidHome.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/AndroidHome.kt
index 210cd202..f25b6ca5 100644
--- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/AndroidHome.kt
+++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/AndroidHome.kt
@@ -24,14 +24,16 @@ internal fun MainActivity.WrapHome(
goScan: () -> Unit,
goProfile: () -> Unit,
goSend: () -> Unit,
- goRequest: () -> Unit
+ goRequest: () -> Unit,
+ goHistory: () -> Unit,
) {
WrapHome(
this,
goScan = goScan,
goProfile = goProfile,
goSend = goSend,
- goRequest = goRequest
+ goRequest = goRequest,
+ goHistory = goHistory
)
}
@@ -42,7 +44,8 @@ internal fun WrapHome(
goScan: () -> Unit,
goProfile: () -> Unit,
goSend: () -> Unit,
- goRequest: () -> Unit
+ goRequest: () -> Unit,
+ goHistory: () -> Unit,
) {
// we want to show information about app update, if available
val checkUpdateViewModel by activity.viewModels {
@@ -77,6 +80,7 @@ internal fun WrapHome(
transactionSnapshot,
goScan = goScan,
goRequest = goRequest,
+ goHistory = goHistory,
goSend = goSend,
goProfile = goProfile,
isDebugMenuEnabled = isDebugMenuEnabled,
diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/view/HomeView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/view/HomeView.kt
index dfefd22d..7371f974 100644
--- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/view/HomeView.kt
+++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/view/HomeView.kt
@@ -72,6 +72,7 @@ fun ComposablePreview() {
goProfile = {},
goSend = {},
goRequest = {},
+ goHistory = {},
resetSdk = {},
wipeEntireWallet = {},
isDebugMenuEnabled = false,
@@ -91,6 +92,7 @@ fun Home(
goProfile: () -> Unit,
goSend: () -> Unit,
goRequest: () -> Unit,
+ goHistory: () -> Unit,
resetSdk: () -> Unit,
wipeEntireWallet: () -> Unit,
isDebugMenuEnabled: Boolean,
@@ -107,6 +109,7 @@ fun Home(
goProfile = goProfile,
goSend = goSend,
goRequest = goRequest,
+ goHistory = goHistory,
updateAvailable = updateAvailable
)
}
@@ -184,6 +187,7 @@ private fun HomeMainContent(
goProfile: () -> Unit,
goSend: () -> Unit,
goRequest: () -> Unit,
+ goHistory: () -> Unit,
updateAvailable: Boolean
) {
Column(Modifier.verticalScroll(rememberScrollState())) {
@@ -219,6 +223,8 @@ private fun HomeMainContent(
TertiaryButton(onClick = goRequest, text = stringResource(R.string.home_button_request))
+ TertiaryButton(onClick = goHistory, text = stringResource(R.string.home_button_history))
+
History(transactionHistory)
}
}
@@ -295,12 +301,14 @@ private fun Status(
amount = walletDisplayValues.fiatCurrencyAmountText
)
}
+
is FiatCurrencyConversionRateState.Stale -> {
// Note: we should show information about staleness too
BodyWithFiatCurrencySymbol(
amount = walletDisplayValues.fiatCurrencyAmountText
)
}
+
is FiatCurrencyConversionRateState.Unavailable -> {
Body(text = walletDisplayValues.fiatCurrencyAmountText)
}
diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/viewmodel/WalletViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/viewmodel/WalletViewModel.kt
index 05c8df12..b74a4acb 100644
--- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/viewmodel/WalletViewModel.kt
+++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/home/viewmodel/WalletViewModel.kt
@@ -172,6 +172,20 @@ class WalletViewModel(application: Application) : AndroidViewModel(application)
null
)
+ @OptIn(ExperimentalCoroutinesApi::class)
+ val transactionHistory = synchronizer
+ .flatMapLatest {
+ if (null == it) {
+ flowOf(emptyList())
+ } else {
+ it.toTransactionHistory()
+ }
+ }.stateIn(
+ viewModelScope,
+ SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT),
+ emptyList()
+ )
+
/**
* Creates a wallet asynchronously and then persists it. Clients observe
* [secretState] to see the side effects. This would be used for a user creating a new wallet.
@@ -387,3 +401,6 @@ private fun Synchronizer.toTransactions() =
addAll(pending.map { CommonTransaction.Pending(it) })
}
}
+
+private fun Synchronizer.toTransactionHistory() = clearedTransactions.distinctUntilChanged()
+
diff --git a/ui-lib/src/main/res/ui/home/values/strings.xml b/ui-lib/src/main/res/ui/home/values/strings.xml
index 9730192c..7424ff15 100644
--- a/ui-lib/src/main/res/ui/home/values/strings.xml
+++ b/ui-lib/src/main/res/ui/home/values/strings.xml
@@ -3,6 +3,7 @@
Profile
Send
Request ZEC
+ Transaction History
Syncing - %1$d%%
Syncing