diff --git a/.gitignore b/.gitignore
index 73874176..0fd2c046 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,5 @@ local.properties
/.idea/deploymentTargetDropDown.xml
*.hprof
/.idea/artifacts
+/.idea/assetWizardSettings.xml
+/.idea/inspectionProfiles/Project_Default.xml
diff --git a/README.md b/README.md
index c09ddb41..9ae80de7 100644
--- a/README.md
+++ b/README.md
@@ -34,4 +34,5 @@ If you plan to fork the project to create a new app of your own, please make the
1. During builds, a warning will be printed that says "Unable to detect AGP versions for included builds. All projects in the build should use the same AGP version." This can be safely ignored. The version under build-conventions is the same as the version used elsewhere in the application.
1. When the code coverage Gradle property `IS_COVERAGE_ENABLED` is enabled, the debug app APK cannot be run. The coverage flag should therefore only be set when running automated tests.
1. Test coverage for Compose code will be low, due to [known limitations](https://github.com/jacoco/jacoco/issues/1208) in the interaction between Compose and Jacoco.
-1. Adding the `espresso-contrib` dependency will cause builds to fail, due to conflicting classes. This is a [known issue](https://github.com/zcash/zcash-android-wallet-sdk/issues/306) with the Zcash Android SDK.
\ No newline at end of file
+1. Adding the `espresso-contrib` dependency will cause builds to fail, due to conflicting classes. This is a [known issue](https://github.com/zcash/zcash-android-wallet-sdk/issues/306) with the Zcash Android SDK.
+1. Android Studio will warn about the Gradle checksum. This is a [known issue](https://github.com/gradle/gradle/issues/9361) and can be safely ignored.
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
index 2ac7aa61..2a94ff34 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -124,4 +124,4 @@ fun com.android.build.gradle.BaseExtension.configureBaseExtension() {
execution = "ANDROIDX_TEST_ORCHESTRATOR"
}
}
-}
\ No newline at end of file
+}
diff --git a/docs/Third party licenses.md b/docs/Third party licenses.md
new file mode 100644
index 00000000..41839c0e
--- /dev/null
+++ b/docs/Third party licenses.md
@@ -0,0 +1,9 @@
+# Third Party Licenses
+
+The majority of the contents of this Git repository are covered under the [LICENSE](../LICENSE). However certain items, as described below, are under different license.
+
+## Electric Coin Company copyrights trademarks
+
+
+## Rubik Font
+The fonts under the [font](../ui-lib/src/main/res/ui/common/font) directory are downloaded from [Google Fonts](https://fonts.google.com/specimen/Rubik) and are licensed under the [Open Font License](https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL).
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 8704e500..c0b8ea19 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -78,6 +78,7 @@ dependencyResolutionManagement {
alias("androidx-compose-foundation").to("androidx.compose.foundation:foundation:$androidxComposeVersion")
alias("androidx-compose-material").to("androidx.compose.material:material:$androidxComposeVersion")
alias("androidx-compose-material-icons-core").to("androidx.compose.material:material-icons-core:$androidxComposeVersion")
+ alias("androidx-compose-material-icons-extended").to("androidx.compose.material:material-icons-extended:$androidxComposeVersion")
alias("androidx-compose-tooling").to("androidx.compose.ui:ui-tooling:$androidxComposeVersion")
alias("androidx-compose-ui").to("androidx.compose.ui:ui:$androidxComposeVersion")
alias("androidx-compose-compiler").to("androidx.compose.compiler:compiler:$androidxComposeCompilerVersion")
@@ -113,6 +114,7 @@ dependencyResolutionManagement {
"androidx-compose-foundation",
"androidx-compose-material",
"androidx-compose-material-icons-core",
+ "androidx-compose-material-icons-extended",
"androidx-compose-tooling",
"androidx-compose-ui",
"androidx-viewmodel-compose"
diff --git a/ui-lib/build.gradle.kts b/ui-lib/build.gradle.kts
index a141c1bd..3ae14a24 100644
--- a/ui-lib/build.gradle.kts
+++ b/ui-lib/build.gradle.kts
@@ -20,6 +20,18 @@ android {
kotlinOptions {
jvmTarget = libs.versions.java.get()
allWarningsAsErrors = project.property("IS_TREAT_WARNINGS_AS_ERRORS").toString().toBoolean()
+ freeCompilerArgs = freeCompilerArgs.plus("-Xopt-in=kotlin.RequiresOptIn")
+ }
+
+ sourceSets {
+ getByName("main").apply {
+ res.setSrcDirs(
+ setOf(
+ "src/main/res/ui/common",
+ "src/main/res/ui/onboarding"
+ )
+ )
+ }
}
}
diff --git a/ui-lib/src/androidTest/java/cash/z/ecc/ui/screen/onboarding/view/OnboardingViewTest.kt b/ui-lib/src/androidTest/java/cash/z/ecc/ui/screen/onboarding/view/OnboardingViewTest.kt
index bcddd5a5..8510745b 100644
--- a/ui-lib/src/androidTest/java/cash/z/ecc/ui/screen/onboarding/view/OnboardingViewTest.kt
+++ b/ui-lib/src/androidTest/java/cash/z/ecc/ui/screen/onboarding/view/OnboardingViewTest.kt
@@ -11,7 +11,7 @@ import cash.z.ecc.ui.R
import cash.z.ecc.ui.screen.onboarding.model.OnboardingStage
import cash.z.ecc.ui.screen.onboarding.state.OnboardingState
import cash.z.ecc.ui.screen.onboarding.test.getStringResource
-import cash.z.ecc.ui.theme.MyApplicationTheme
+import cash.z.ecc.ui.theme.ZcashTheme
import org.junit.Assert.assertEquals
import org.junit.Rule
import org.junit.Test
@@ -263,7 +263,7 @@ class OnboardingViewTest {
init {
composeTestRule.setContent {
- MyApplicationTheme {
+ ZcashTheme {
Onboarding(
onboardingState,
onCreateWallet = { onCreateWalletCallbackCount++ },
diff --git a/ui-lib/src/main/AndroidManifest.xml b/ui-lib/src/main/AndroidManifest.xml
index b3f96e15..20056383 100644
--- a/ui-lib/src/main/AndroidManifest.xml
+++ b/ui-lib/src/main/AndroidManifest.xml
@@ -8,7 +8,6 @@
diff --git a/ui-lib/src/main/java/cash/z/ecc/ui/MainActivity.kt b/ui-lib/src/main/java/cash/z/ecc/ui/MainActivity.kt
index 663d6184..0488bf2a 100644
--- a/ui-lib/src/main/java/cash/z/ecc/ui/MainActivity.kt
+++ b/ui-lib/src/main/java/cash/z/ecc/ui/MainActivity.kt
@@ -6,7 +6,7 @@ import androidx.activity.compose.setContent
import androidx.activity.viewModels
import cash.z.ecc.ui.screen.onboarding.view.Onboarding
import cash.z.ecc.ui.screen.onboarding.viewmodel.OnboardingViewModel
-import cash.z.ecc.ui.theme.MyApplicationTheme
+import cash.z.ecc.ui.theme.ZcashTheme
class MainActivity : ComponentActivity() {
@@ -15,7 +15,7 @@ class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
- MyApplicationTheme {
+ ZcashTheme {
Onboarding(
onboardingState = onboardingViewModel.onboardingState,
onImportWallet = { TODO("Implement wallet import") },
diff --git a/ui-lib/src/main/java/cash/z/ecc/ui/screen/common/Button.kt b/ui-lib/src/main/java/cash/z/ecc/ui/screen/common/Button.kt
new file mode 100644
index 00000000..c46878eb
--- /dev/null
+++ b/ui-lib/src/main/java/cash/z/ecc/ui/screen/common/Button.kt
@@ -0,0 +1,89 @@
+package cash.z.ecc.ui.screen.common
+
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material.Button
+import androidx.compose.material.ButtonDefaults
+import androidx.compose.material.ButtonDefaults.buttonColors
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import cash.z.ecc.ui.theme.ZcashTheme
+
+@Composable
+fun PrimaryButton(
+ onClick: () -> Unit,
+ text: String,
+ modifier: Modifier = Modifier
+) {
+ Button(
+ onClick = onClick,
+ modifier = modifier.then(
+ Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 16.dp, vertical = 8.dp)
+ ),
+ colors = buttonColors(backgroundColor = MaterialTheme.colors.primary)
+ ) {
+ Text(style = MaterialTheme.typography.button, text = text, color = MaterialTheme.colors.onPrimary)
+ }
+}
+
+@Composable
+fun SecondaryButton(
+ onClick: () -> Unit,
+ text: String,
+ modifier: Modifier = Modifier
+) {
+ Button(
+ onClick = onClick,
+ modifier = modifier.then(
+ Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 16.dp, vertical = 8.dp)
+ ),
+ colors = buttonColors(backgroundColor = MaterialTheme.colors.secondary)
+ ) {
+ Text(style = MaterialTheme.typography.button, text = text, color = MaterialTheme.colors.onSecondary)
+ }
+}
+
+@Composable
+fun NavigationButton(
+ onClick: () -> Unit,
+ text: String,
+ modifier: Modifier = Modifier
+) {
+ Button(
+ onClick = onClick,
+ modifier = modifier.then(
+ Modifier
+ .padding(horizontal = 16.dp, vertical = 8.dp)
+ ),
+ colors = buttonColors(backgroundColor = MaterialTheme.colors.secondary)
+ ) {
+ Text(style = MaterialTheme.typography.button, text = text, color = MaterialTheme.colors.onSecondary)
+ }
+}
+
+@Composable
+fun TertiaryButton(
+ onClick: () -> Unit,
+ text: String,
+ modifier: Modifier = Modifier
+) {
+ Button(
+ onClick = onClick,
+ modifier = modifier.then(
+ Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 16.dp, vertical = 8.dp)
+ ),
+ elevation = ButtonDefaults.elevation(0.dp, 0.dp, 0.dp),
+ colors = buttonColors(backgroundColor = ZcashTheme.colors.tertiary)
+ ) {
+ Text(style = MaterialTheme.typography.button, text = text, color = ZcashTheme.colors.onTertiary)
+ }
+}
diff --git a/ui-lib/src/main/java/cash/z/ecc/ui/screen/common/Progress.kt b/ui-lib/src/main/java/cash/z/ecc/ui/screen/common/Progress.kt
new file mode 100644
index 00000000..dc9b1ca2
--- /dev/null
+++ b/ui-lib/src/main/java/cash/z/ecc/ui/screen/common/Progress.kt
@@ -0,0 +1,17 @@
+package cash.z.ecc.ui.screen.common
+
+import androidx.compose.material.LinearProgressIndicator
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import cash.z.ecc.ui.screen.onboarding.model.Progress
+import cash.z.ecc.ui.theme.ZcashTheme
+
+// Eventually rename to GradientLinearProgressIndicator
+@Composable
+fun PinkProgress(progress: Progress, modifier: Modifier = Modifier) {
+ // Needs custom implementation to apply gradient
+ LinearProgressIndicator(
+ progress = progress.percent().decimal, modifier,
+ ZcashTheme.colors.progressStart, ZcashTheme.colors.progressBackground
+ )
+}
diff --git a/ui-lib/src/main/java/cash/z/ecc/ui/screen/common/Text.kt b/ui-lib/src/main/java/cash/z/ecc/ui/screen/common/Text.kt
new file mode 100644
index 00000000..efc026a8
--- /dev/null
+++ b/ui-lib/src/main/java/cash/z/ecc/ui/screen/common/Text.kt
@@ -0,0 +1,33 @@
+package cash.z.ecc.ui.screen.common
+
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import cash.z.ecc.ui.theme.ZcashTheme
+
+@Composable
+fun Header(
+ text: String,
+ modifier: Modifier = Modifier
+) {
+ Text(
+ text = text,
+ style = MaterialTheme.typography.h1,
+ color = ZcashTheme.colors.onBackgroundHeader,
+ modifier = modifier
+ )
+}
+
+@Composable
+fun Body(
+ text: String,
+ modifier: Modifier = Modifier
+) {
+ Text(
+ text = text,
+ style = MaterialTheme.typography.body1,
+ color = MaterialTheme.colors.onBackground,
+ modifier = modifier
+ )
+}
diff --git a/ui-lib/src/main/java/cash/z/ecc/ui/screen/debug/view/DesignGuide.kt b/ui-lib/src/main/java/cash/z/ecc/ui/screen/debug/view/DesignGuide.kt
new file mode 100644
index 00000000..e4ce0766
--- /dev/null
+++ b/ui-lib/src/main/java/cash/z/ecc/ui/screen/debug/view/DesignGuide.kt
@@ -0,0 +1,52 @@
+package cash.z.ecc.ui.screen.debug.view
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.material.Surface
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.List
+import androidx.compose.material.icons.filled.Person
+import androidx.compose.material.icons.filled.Shield
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.tooling.preview.Preview
+import cash.z.ecc.ui.screen.common.Body
+import cash.z.ecc.ui.screen.common.Header
+import cash.z.ecc.ui.screen.common.NavigationButton
+import cash.z.ecc.ui.screen.common.PinkProgress
+import cash.z.ecc.ui.screen.common.PrimaryButton
+import cash.z.ecc.ui.screen.common.SecondaryButton
+import cash.z.ecc.ui.screen.common.TertiaryButton
+import cash.z.ecc.ui.screen.onboarding.model.Index
+import cash.z.ecc.ui.screen.onboarding.model.Progress
+import cash.z.ecc.ui.screen.onboarding.view.Callout
+import cash.z.ecc.ui.theme.ZcashTheme
+
+@Preview
+@Composable
+fun ComposablePreview() {
+ ZcashTheme(darkTheme = false) {
+ DesignGuide()
+ }
+}
+
+@Composable
+// Allowing magic numbers since this is debug-only
+@Suppress("MagicNumber")
+fun DesignGuide() {
+ Surface {
+ Column {
+ Header(text = "H1")
+ Body(text = "body")
+ NavigationButton(onClick = { }, text = "Back")
+ NavigationButton(onClick = { }, text = "Next")
+ PrimaryButton(onClick = { }, text = "Primary button")
+ SecondaryButton(onClick = { }, text = "Secondary button")
+ TertiaryButton(onClick = { }, text = "Tertiary button")
+ Callout(Icons.Filled.Shield, contentDescription = "Shield")
+ Callout(Icons.Filled.Person, contentDescription = "Person")
+ Callout(Icons.Filled.List, contentDescription = "List")
+ PinkProgress(progress = Progress(Index(1), Index(4)), Modifier.fillMaxWidth())
+ }
+ }
+}
diff --git a/ui-lib/src/main/java/cash/z/ecc/ui/screen/onboarding/view/OnboardingView.kt b/ui-lib/src/main/java/cash/z/ecc/ui/screen/onboarding/view/OnboardingView.kt
index 288966cd..afc8dd2c 100644
--- a/ui-lib/src/main/java/cash/z/ecc/ui/screen/onboarding/view/OnboardingView.kt
+++ b/ui-lib/src/main/java/cash/z/ecc/ui/screen/onboarding/view/OnboardingView.kt
@@ -1,37 +1,49 @@
package cash.z.ecc.ui.screen.onboarding.view
import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.material.Button
-import androidx.compose.material.LinearProgressIndicator
-import androidx.compose.material.Text
+import androidx.compose.material.Icon
+import androidx.compose.material.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.ColorPainter
import androidx.compose.ui.graphics.painter.Painter
+import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import cash.z.ecc.ui.R
+import cash.z.ecc.ui.screen.common.Body
+import cash.z.ecc.ui.screen.common.Header
+import cash.z.ecc.ui.screen.common.NavigationButton
+import cash.z.ecc.ui.screen.common.PinkProgress
+import cash.z.ecc.ui.screen.common.PrimaryButton
+import cash.z.ecc.ui.screen.common.SecondaryButton
+import cash.z.ecc.ui.screen.common.TertiaryButton
import cash.z.ecc.ui.screen.onboarding.model.OnboardingStage
import cash.z.ecc.ui.screen.onboarding.model.Progress
import cash.z.ecc.ui.screen.onboarding.state.OnboardingState
import cash.z.ecc.ui.theme.MINIMAL_WEIGHT
+import cash.z.ecc.ui.theme.ZcashTheme
@Preview
@Composable
fun ComposablePreview() {
- Onboarding(
- OnboardingState(OnboardingStage.UnifiedAddresses),
- onImportWallet = {},
- onCreateWallet = {}
- )
+ ZcashTheme(darkTheme = true) {
+ Onboarding(
+ OnboardingState(OnboardingStage.UnifiedAddresses),
+ onImportWallet = {},
+ onCreateWallet = {}
+ )
+ }
}
/**
@@ -44,22 +56,24 @@ fun Onboarding(
onImportWallet: () -> Unit,
onCreateWallet: () -> Unit
) {
- Column {
- TopNavButtons(onboardingState)
+ Surface {
+ Column {
+ TopNavButtons(onboardingState)
- val onboardingStage = onboardingState.current.collectAsState().value
+ val onboardingStage = onboardingState.current.collectAsState().value
- when (onboardingStage) {
- OnboardingStage.ShieldedByDefault -> ShieldedByDefault()
- OnboardingStage.UnifiedAddresses -> UnifiedAddresses()
- OnboardingStage.More -> More()
- OnboardingStage.Wallet -> Wallet(
- onCreateWallet = onCreateWallet,
- onImportWallet = onImportWallet
- )
+ when (onboardingStage) {
+ OnboardingStage.ShieldedByDefault -> ShieldedByDefault()
+ OnboardingStage.UnifiedAddresses -> UnifiedAddresses()
+ OnboardingStage.More -> More()
+ OnboardingStage.Wallet -> Wallet(
+ onCreateWallet = onCreateWallet,
+ onImportWallet = onImportWallet
+ )
+ }
+
+ BottomNav(onboardingStage.getProgress(), onboardingState::goNext)
}
-
- BottomNav(onboardingStage.getProgress(), onboardingState::goNext)
}
}
@@ -67,17 +81,17 @@ fun Onboarding(
private fun TopNavButtons(onboardingState: OnboardingState) {
Row {
if (onboardingState.hasPrevious()) {
- Button(onboardingState::goPrevious) {
- Text(stringResource(R.string.onboarding_back))
- }
+ NavigationButton(onboardingState::goPrevious, stringResource(R.string.onboarding_back))
}
- Spacer(Modifier.fillMaxWidth().weight(MINIMAL_WEIGHT, true))
+ Spacer(
+ Modifier
+ .fillMaxWidth()
+ .weight(MINIMAL_WEIGHT, true)
+ )
if (onboardingState.hasNext()) {
- Button(onboardingState::goToEnd) {
- Text(stringResource(R.string.onboarding_skip))
- }
+ NavigationButton(onboardingState::goToEnd, stringResource(R.string.onboarding_skip))
}
}
}
@@ -86,14 +100,12 @@ private fun TopNavButtons(onboardingState: OnboardingState) {
private fun BottomNav(progress: Progress, onNext: () -> Unit) {
if (progress.current != progress.last) {
Column {
- Button(onNext, Modifier.fillMaxWidth()) {
- Text(stringResource(R.string.onboarding_next))
- }
+ SecondaryButton(onNext, stringResource(R.string.onboarding_next), Modifier.fillMaxWidth())
// Converts from index to human numbering
- Text((progress.current.value + 1).toString())
+ Body((progress.current.value + 1).toString())
- LinearProgressIndicator(progress = progress.percent().decimal, Modifier.fillMaxWidth())
+ PinkProgress(progress, Modifier.fillMaxWidth())
}
}
}
@@ -137,12 +149,11 @@ private fun More() {
@Composable
private fun Wallet(onCreateWallet: () -> Unit, onImportWallet: () -> Unit) {
Column {
- Button(onCreateWallet, Modifier.fillMaxWidth()) {
- Text(stringResource(R.string.onboarding_4_create_new_wallet))
- }
- Button(onImportWallet, Modifier.fillMaxWidth()) {
- Text(stringResource(R.string.onboarding_4_import_existing_wallet))
- }
+ PrimaryButton(onCreateWallet, stringResource(R.string.onboarding_4_create_new_wallet), Modifier.fillMaxWidth())
+ TertiaryButton(
+ onImportWallet, stringResource(R.string.onboarding_4_import_existing_wallet),
+ Modifier.fillMaxWidth()
+ )
}
}
@@ -159,7 +170,14 @@ private fun Content(
@Suppress("MagicNumber")
Image(image, imageContentDescription, Modifier.fillMaxSize(0.50f))
}
- Text(headline)
- Text(body)
+ Header(headline)
+ Body(body)
+ }
+}
+
+@Composable
+fun Callout(imageVector: ImageVector, contentDescription: String) {
+ Box(modifier = Modifier.background(ZcashTheme.colors.callout)) {
+ Icon(imageVector, contentDescription, tint = ZcashTheme.colors.onCallout)
}
}
diff --git a/ui-lib/src/main/java/cash/z/ecc/ui/theme/Color.kt b/ui-lib/src/main/java/cash/z/ecc/ui/theme/Color.kt
index 392fbacf..f3b96241 100644
--- a/ui-lib/src/main/java/cash/z/ecc/ui/theme/Color.kt
+++ b/ui-lib/src/main/java/cash/z/ecc/ui/theme/Color.kt
@@ -1,15 +1,75 @@
+@file:Suppress("MagicNumber")
+
package cash.z.ecc.ui.theme
import androidx.compose.ui.graphics.Color
-@Suppress("MagicNumber")
-val Purple200 = Color(0xFFBB86FC)
+object Dark {
+ val backgroundStart = Color(0xff243155)
+ val backgroundEnd = Color(0xff29365A)
-@Suppress("MagicNumber")
-val Purple500 = Color(0xFF6200EE)
+ val textHeaderOnBackground = Color(0xffCBDCF2)
+ val textBodyOnBackground = Color(0xFF93A4BE)
+ val textPrimaryButton = Color(0xFF0F2341)
+ val textSecondaryButton = Color(0xFF0F2341)
+ val textTertiaryButton = Color.White
+ val textNavigationButton = Color.Black
+ val textCaption = Color(0xFF68728B)
-@Suppress("MagicNumber")
-val Purple700 = Color(0xFF3700B3)
+ val primaryButton = Color(0xFFFFB900)
+ val primaryButtonPressed = Color(0xFFFFD800)
+ val primaryButtonDisabled = Color(0x33F4B728)
-@Suppress("MagicNumber")
-val Teal200 = Color(0xFF03DAC5)
+ val secondaryButton = Color(0xFFA7C0D9)
+ val secondaryButtonPressed = Color(0xFFC8DCEF)
+ val secondaryButtonDisabled = Color(0x33C8DCEF)
+
+ val tertiaryButton = Color.Transparent
+ val tertiaryButtonPressed = Color(0xB0C3D2BA)
+ // TODO how does the invisible button show a disabled state?
+
+ val navigationButton = Color(0xFFA7C0D9)
+ val navigationButtonPressed = Color(0xFFC8DCEF)
+
+ val progressStart = Color(0xFFF364CE)
+ val progressEnd = Color(0xFFF8964F)
+ val progressBackground = Color(0xFF929bb3)
+
+ val callout = Color(0xFFa7bed8)
+ val onCallout = Color(0xFF3d698f)
+}
+
+object Light {
+ val backgroundStart = Color(0xFFE3EFF9)
+ val backgroundEnd = Color(0xFFD2E4F3)
+
+ val textHeaderOnBackground = Color(0xff2D3747)
+ val textBodyOnBackground = Color(0xFF7B8897)
+ val textNavigationButton = Color(0xFF7B8897)
+ val textPrimaryButton = Color(0xFFF2F7FC)
+ val textSecondaryButton = Color(0xFF2E476E)
+ val textTertiaryButton = Color(0xFF283559)
+ val textCaption = Color(0xFF2D3747)
+
+ // TODO The button colors are wrong for light
+ val primaryButton = Color(0xFF263357)
+ val primaryButtonPressed = Color(0xFFFFD800)
+ val primaryButtonDisabled = Color(0x33F4B728)
+
+ val secondaryButton = Color(0xFFE8F3FA)
+ val secondaryButtonPressed = Color(0xFFFAFBFD)
+ val secondaryButtonDisabled = Color(0xFFE6EFF8)
+
+ val tertiaryButton = Color.Transparent
+ val tertiaryButtonPressed = Color(0xFFFFFFFF)
+
+ val navigationButton = Color(0xFFE3EDF7)
+ val navigationButtonPressed = Color(0xFFE3EDF7)
+
+ val progressStart = Color(0xFFF364CE)
+ val progressEnd = Color(0xFFF8964F)
+ val progressBackground = Color(0xFFbeccdf)
+
+ val callout = Color(0xFFe6f0f9)
+ val onCallout = Color(0xFFa1b8d0)
+}
diff --git a/ui-lib/src/main/java/cash/z/ecc/ui/theme/Theme.kt b/ui-lib/src/main/java/cash/z/ecc/ui/theme/Theme.kt
index 7ee19955..26185972 100644
--- a/ui-lib/src/main/java/cash/z/ecc/ui/theme/Theme.kt
+++ b/ui-lib/src/main/java/cash/z/ecc/ui/theme/Theme.kt
@@ -5,43 +5,110 @@ import androidx.compose.material.MaterialTheme
import androidx.compose.material.darkColors
import androidx.compose.material.lightColors
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.staticCompositionLocalOf
+import androidx.compose.ui.graphics.Color
private val DarkColorPalette = darkColors(
- primary = Purple200,
- primaryVariant = Purple700,
- secondary = Teal200
+ primary = Dark.primaryButton,
+ secondary = Dark.secondaryButton,
+ onPrimary = Dark.textPrimaryButton,
+ onSecondary = Dark.textSecondaryButton,
+ surface = Dark.backgroundStart,
+ onSurface = Dark.textBodyOnBackground,
+ background = Dark.backgroundStart,
+ onBackground = Dark.textBodyOnBackground
)
private val LightColorPalette = lightColors(
- primary = Purple500,
- primaryVariant = Purple700,
- secondary = Teal200
-
- /* Other default colors to override
- background = Color.White,
- surface = Color.White,
- onPrimary = Color.White,
- onSecondary = Color.Black,
- onBackground = Color.Black,
- onSurface = Color.Black,
- */
+ primary = Light.primaryButton,
+ secondary = Light.secondaryButton,
+ onPrimary = Light.textPrimaryButton,
+ onSecondary = Light.textSecondaryButton,
+ surface = Light.backgroundStart,
+ onSurface = Light.textBodyOnBackground,
+ background = Light.backgroundStart,
+ onBackground = Light.textBodyOnBackground
)
+@Immutable
+data class ExtendedColors(
+ val onBackgroundHeader: Color,
+ val tertiary: Color,
+ val onTertiary: Color,
+ val callout: Color,
+ val onCallout: Color,
+ val progressStart: Color,
+ val progressEnd: Color,
+ val progressBackground: Color
+)
+
+val DarkExtendedColorPalette = ExtendedColors(
+ onBackgroundHeader = Dark.textHeaderOnBackground,
+ tertiary = Dark.tertiaryButton,
+ onTertiary = Dark.textTertiaryButton,
+ callout = Dark.callout,
+ onCallout = Dark.onCallout,
+ progressStart = Dark.progressStart,
+ progressEnd = Dark.progressEnd,
+ progressBackground = Dark.progressBackground
+)
+
+val LightExtendedColorPalette = ExtendedColors(
+ onBackgroundHeader = Light.textHeaderOnBackground,
+ tertiary = Light.tertiaryButton,
+ onTertiary = Light.textTertiaryButton,
+ callout = Light.callout,
+ onCallout = Light.onCallout,
+ progressStart = Light.progressStart,
+ progressEnd = Light.progressEnd,
+ progressBackground = Light.progressBackground
+)
+
+val LocalExtendedColors = staticCompositionLocalOf {
+ ExtendedColors(
+ onBackgroundHeader = Color.Unspecified,
+ tertiary = Color.Unspecified,
+ onTertiary = Color.Unspecified,
+ callout = Color.Unspecified,
+ onCallout = Color.Unspecified,
+ progressStart = Color.Unspecified,
+ progressEnd = Color.Unspecified,
+ progressBackground = Color.Unspecified
+ )
+}
+
@Composable
-fun MyApplicationTheme(
+fun ZcashTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
content: @Composable () -> Unit
) {
- val colors = if (darkTheme) {
+ val baseColors = if (darkTheme) {
DarkColorPalette
} else {
LightColorPalette
}
- MaterialTheme(
- colors = colors,
- typography = Typography,
- shapes = Shapes,
- content = content
- )
+ val extendedColors = if (darkTheme) {
+ DarkExtendedColorPalette
+ } else {
+ LightExtendedColorPalette
+ }
+
+ CompositionLocalProvider(LocalExtendedColors provides extendedColors) {
+ MaterialTheme(
+ colors = baseColors,
+ typography = Typography,
+ shapes = Shapes,
+ content = content
+ )
+ }
+}
+
+// Use with eg. ZcashTheme.colors.tertiary
+object ZcashTheme {
+ val colors: ExtendedColors
+ @Composable
+ get() = LocalExtendedColors.current
}
diff --git a/ui-lib/src/main/java/cash/z/ecc/ui/theme/Type.kt b/ui-lib/src/main/java/cash/z/ecc/ui/theme/Type.kt
deleted file mode 100644
index e13c581a..00000000
--- a/ui-lib/src/main/java/cash/z/ecc/ui/theme/Type.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package cash.z.ecc.ui.theme
-
-import androidx.compose.material.Typography
-import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.FontFamily
-import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.unit.sp
-
-// Set of Material typography styles to start with
-val Typography = Typography(
- body1 = TextStyle(
- fontFamily = FontFamily.Default,
- fontWeight = FontWeight.Normal,
- fontSize = 16.sp
- )
- /* Other default text styles to override
- button = TextStyle(
- fontFamily = FontFamily.Default,
- fontWeight = FontWeight.W500,
- fontSize = 14.sp
- ),
- caption = TextStyle(
- fontFamily = FontFamily.Default,
- fontWeight = FontWeight.Normal,
- fontSize = 12.sp
- )
- */
-)
diff --git a/ui-lib/src/main/java/cash/z/ecc/ui/theme/Typography.kt b/ui-lib/src/main/java/cash/z/ecc/ui/theme/Typography.kt
new file mode 100644
index 00000000..6b2cc97c
--- /dev/null
+++ b/ui-lib/src/main/java/cash/z/ecc/ui/theme/Typography.kt
@@ -0,0 +1,39 @@
+package cash.z.ecc.ui.theme
+
+import androidx.compose.material.Typography
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.ExperimentalUnitApi
+import androidx.compose.ui.unit.sp
+import cash.z.ecc.ui.R
+
+private val Rubik = FontFamily(
+ Font(R.font.rubik_regular, FontWeight.W400),
+ Font(R.font.rubik_medium, FontWeight.W500)
+)
+
+@OptIn(ExperimentalUnitApi::class)
+val Typography = Typography(
+ h1 = TextStyle(
+ fontFamily = Rubik,
+ fontWeight = FontWeight.W600,
+ fontSize = 30.sp,
+ ),
+ body1 = TextStyle(
+ fontFamily = Rubik,
+ fontWeight = FontWeight.Normal,
+ fontSize = 16.sp
+ ),
+ caption = TextStyle(
+ fontFamily = Rubik,
+ fontWeight = FontWeight.Medium,
+ fontSize = 16.sp
+ ),
+ button = TextStyle(
+ fontFamily = Rubik,
+ fontWeight = FontWeight.Normal,
+ fontSize = 16.sp
+ ),
+)
diff --git a/ui-lib/src/main/res/ui/common/font/rubik_medium.ttf b/ui-lib/src/main/res/ui/common/font/rubik_medium.ttf
new file mode 100644
index 00000000..a4008b72
Binary files /dev/null and b/ui-lib/src/main/res/ui/common/font/rubik_medium.ttf differ
diff --git a/ui-lib/src/main/res/ui/common/font/rubik_regular.ttf b/ui-lib/src/main/res/ui/common/font/rubik_regular.ttf
new file mode 100644
index 00000000..dc90ef05
Binary files /dev/null and b/ui-lib/src/main/res/ui/common/font/rubik_regular.ttf differ
diff --git a/ui-lib/src/main/res/values/strings.xml b/ui-lib/src/main/res/ui/onboarding/values/strings.xml
similarity index 100%
rename from ui-lib/src/main/res/values/strings.xml
rename to ui-lib/src/main/res/ui/onboarding/values/strings.xml
diff --git a/ui-lib/src/main/res/values/colors.xml b/ui-lib/src/main/res/values/colors.xml
deleted file mode 100644
index b17f0a12..00000000
--- a/ui-lib/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
- #FFBB86FC
- #FF6200EE
- #FF3700B3
- #FF03DAC5
- #FF018786
- #FF000000
- #FFFFFFFF
-
-
diff --git a/ui-lib/src/main/res/values/themes.xml b/ui-lib/src/main/res/values/themes.xml
deleted file mode 100644
index 65789b57..00000000
--- a/ui-lib/src/main/res/values/themes.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file