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 @@ - - - - - - -